From c54497483bbe82af3a7183d34225aab5e1a36989 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Mon, 19 Jul 2021 20:53:37 -0400 Subject: [PATCH 01/86] Merge pull request #11159 from VOREStation/Fixes/11156 Fix some uses of tgui_input_list with bad calls --- code/modules/admin/verbs/randomverbs.dm | 4 ++-- code/modules/admin/verbs/striketeam.dm | 2 +- code/modules/library/lib_machines.dm | 4 ++-- code/modules/mob/living/carbon/human/emote_vr.dm | 2 +- code/modules/mob/living/silicon/robot/robot_items.dm | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e903df406a..754b650332 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -892,13 +892,13 @@ Traitors and the like can also be revived with the previous role mostly intact. var/choice if(ticker.mode.auto_recall_shuttle) - choice = tgui_input_list(usr, "The shuttle will just return if you call it. Call anyway?", list("Confirm", "Cancel")) + choice = tgui_input_list(usr, "The shuttle will just return if you call it. Call anyway?", "Shuttle Call", list("Confirm", "Cancel")) if(choice == "Confirm") emergency_shuttle.auto_recall = 1 //enable auto-recall else return - choice = tgui_input_list(usr, "Is this an emergency evacuation or a crew transfer?", list("Emergency", "Crew Transfer")) + choice = tgui_input_list(usr, "Is this an emergency evacuation or a crew transfer?", "Shuttle Call", list("Emergency", "Crew Transfer")) if (choice == "Emergency") emergency_shuttle.call_evac() else diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 1a27de10c4..d7b2c1ffff 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -20,7 +20,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future var/datum/antagonist/deathsquad/team - var/choice = tgui_input_list(usr, "Select type of strike team:", list("Heavy Asset Protection", "Mercenaries")) + var/choice = tgui_input_list(usr, "Select type of strike team:", "Strike Team", list("Heavy Asset Protection", "Mercenaries")) if(!choice) return diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 50980217a3..adec042a0f 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -82,7 +82,7 @@ title = null title = sanitizeSQL(title) if(href_list["setcategory"]) - var/newcategory = tgui_input_list(usr, "Choose a category to search for:", list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) + var/newcategory = tgui_input_list(usr, "Choose a category to search for:", "Category", list("Any", "Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) if(newcategory) category = sanitize(newcategory) else @@ -397,7 +397,7 @@ if(newauthor) scanner.cache.author = newauthor if(href_list["setcategory"]) - var/newcategory = tgui_input_list(usr, "Choose a category: ", list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) + var/newcategory = tgui_input_list(usr, "Choose a category: ", "Category", list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion")) if(newcategory) upload_category = newcategory diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index 0b73e71514..9ba2ca4ad5 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -36,7 +36,7 @@ set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." set category = "IC" - var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity.", list(FEMALE, MALE, NEUTER, PLURAL, HERM)) + var/new_gender_identity = tgui_input_list(usr, "Please select a gender Identity:", "Set Gender Identity", list(FEMALE, MALE, NEUTER, PLURAL, HERM)) if(!new_gender_identity) return 0 change_gender_identity(new_gender_identity) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index d8212d2904..9636f2da51 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -282,7 +282,7 @@ switch(choice) if("Colour") - var/newcolour = tgui_input_list(usr, "Which colour would you like to use?", list("black","blue","red","green","yellow")) + var/newcolour = tgui_input_list(usr, "Which colour would you like to use?", "Color Choice", list("black","blue","red","green","yellow")) if(newcolour) colour = newcolour if("Mode") @@ -401,7 +401,7 @@ set category = "Object" set src in range(0) - var/N = tgui_input_list(usr, "How much damage should the shield absorb?", list("5","10","25","50","75","100")) + var/N = tgui_input_list(usr, "How much damage should the shield absorb?", "Shield Level", list("5","10","25","50","75","100")) if (N) shield_level = text2num(N)/100 From 0dfa34c5787578a8374b6d15d582cdbb29b3a920 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Mon, 19 Jul 2021 20:58:42 -0400 Subject: [PATCH 03/86] Merge pull request #11160 from VOREStation/Arokha/accessfinder Gives pathfinder an actual access level --- code/game/jobs/access_datum.dm | 4 ++-- code/game/jobs/access_datum_vr.dm | 6 ++++++ code/game/jobs/job/exploration_vr.dm | 4 ++-- maps/tether/tether-05-station1.dmm | 4 ++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 5a2e3bd0cf..53dfb77b5a 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -262,8 +262,8 @@ desc = "Station Network" region = ACCESS_REGION_RESEARCH -// /var/const/free_access_id = 43 -// /var/const/free_access_id = 44 +// /var/const/free_access_id = 43 // taken in VR +// /var/const/free_access_id = 44 // taken in VR /var/const/access_surgery = 45 /datum/access/surgery diff --git a/code/game/jobs/access_datum_vr.dm b/code/game/jobs/access_datum_vr.dm index bd3906f16c..bdfef8a12b 100644 --- a/code/game/jobs/access_datum_vr.dm +++ b/code/game/jobs/access_datum_vr.dm @@ -5,6 +5,12 @@ var/const/access_explorer = 43 desc = "Explorer" region = ACCESS_REGION_GENERAL +/var/const/access_pathfinder = 44 +/datum/access/pathfinder + id = access_pathfinder + desc = "Pathfinder" + region = ACCESS_REGION_GENERAL + var/const/access_pilot = 67 /datum/access/pilot id = access_pilot diff --git a/code/game/jobs/job/exploration_vr.dm b/code/game/jobs/job/exploration_vr.dm index 4b3227c38e..2a6649543b 100644 --- a/code/game/jobs/job/exploration_vr.dm +++ b/code/game/jobs/job/exploration_vr.dm @@ -43,8 +43,8 @@ pto_type = PTO_EXPLORATION dept_time_required = 20 - access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway) - minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway) + access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder) + minimal_access = list(access_eva, access_maint_tunnels, access_external_airlocks, access_pilot, access_explorer, access_gateway, access_pathfinder) outfit_type = /decl/hierarchy/outfit/job/pathfinder job_description = "The Pathfinder's job is to lead and manage expeditions, and is the primary authority on all off-station expeditions." alt_titles = list("Expedition Lead" = /datum/alt_title/expedition_lead, "Exploration Manager" = /datum/alt_title/exploration_manager) diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 9e54c7210b..62a7debfd9 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -34249,8 +34249,8 @@ }, /obj/machinery/door/airlock/science{ name = "Pathfinder"; - req_access = list(62,43,67); - req_one_access = newlist() + req_access = null; + req_one_access = list(44) }, /turf/simulated/floor/tiled/steel_grid, /area/tether/exploration/pathfinder_office) From b85c5de1375fadd2eff4de1a69f098354b584b1e Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 01:06:44 +0000 Subject: [PATCH 05/86] Xenomorph Overhaul and fixes from Gurgstation --- code/controllers/configuration.dm | 2290 +++++ code/game/machinery/doors/airlock.dm | 3072 +++++++ code/game/objects/effects/alien/aliens.dm | 132 + .../objects/structures/alien/alien egg.dm | 96 + code/game/objects/structures/alien/alien.dm | 62 + code/modules/mob/living/carbon/alien/alien.dm | 8 + .../living/carbon/alien/diona/progression.dm | 5 + .../mob/living/carbon/alien/larva/larva.dm | 13 + .../living/carbon/alien/larva/progression.dm | 9 + code/modules/mob/living/carbon/alien/life.dm | 6 + .../carbon/human/species/species_attack.dm | 6 +- .../human/species/xenomorphs/alien_embryo.dm | 161 - .../human/species/xenomorphs/alien_powers.dm | 40 +- .../human/species/xenomorphs/alien_species.dm | 86 +- .../human/species/xenomorphs/xenomorphs.dm | 36 + code/modules/projectiles/projectile/energy.dm | 6 +- code/modules/surgery/organs_internal.dm | 5 + .../submaps/pois_vr/debris_field/derelict.dmm | 1 - .../debris_field/new_escapepod_xeno.dmm | 1 - .../mountains/crashed_ufo_frigate.dmm | 312 + .../surface_submaps/mountains/vault4.dmm | 48 + .../surface_submaps/mountains/vault5.dmm | 50 + sound/machines/door/airlock_tear_apart.ogg | Bin 0 -> 272254 bytes sound/weapons/alien_spitacid.ogg | Bin 0 -> 48062 bytes sound/weapons/effects/alien_spit_wall.ogg | Bin 0 -> 12731 bytes vorestation.dme | 8116 +++++++++++++++++ 26 files changed, 14391 insertions(+), 170 deletions(-) create mode 100644 code/game/objects/structures/alien/alien egg.dm create mode 100644 code/game/objects/structures/alien/alien.dm delete mode 100644 code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm create mode 100644 sound/machines/door/airlock_tear_apart.ogg create mode 100644 sound/weapons/alien_spitacid.ogg create mode 100644 sound/weapons/effects/alien_spit_wall.ogg diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 037664027a..7e81359cb8 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD var/list/gamemode_cache = list() /datum/configuration @@ -1149,3 +1150,2292 @@ var/list/gamemode_cache = list() config.python_path = "/usr/bin/env python2" else //probably windows, if not this should work anyway config.python_path = "python" +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +var/list/gamemode_cache = list() + +/datum/configuration + var/static/server_name = null // server name (for world name / status) + var/static/server_suffix = 0 // generate numeric suffix based on server port + + var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located + + var/static/log_ooc = 0 // log OOC channel + var/static/log_access = 0 // log login/logout + var/static/log_say = 0 // log client say + var/static/log_admin = 0 // log admin actions + var/static/log_debug = 1 // log debug output + var/static/log_game = 0 // log game events + var/static/log_vote = 0 // log voting + var/static/log_whisper = 0 // log client whisper + var/static/log_emote = 0 // log emotes + var/static/log_attack = 0 // log attack messages + var/static/log_adminchat = 0 // log admin chat messages + var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such + var/static/log_pda = 0 // log pda messages + var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits + var/static/log_runtime = 0 // logs world.log to a file + var/static/log_world_output = 0 // log to_world_log(messages) + var/static/log_graffiti = 0 // logs graffiti + var/static/sql_enabled = 0 // for sql switching + var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour + var/static/allow_vote_restart = 0 // allow votes to restart + var/static/ert_admin_call_only = 0 + var/static/allow_vote_mode = 0 // allow votes to change mode + var/static/allow_admin_jump = 1 // allows admin jumping + var/static/allow_admin_spawning = 1 // allows admin item spawning + var/static/allow_admin_rev = 1 // allows admin revives + var/static/pregame_time = 180 // pregame time in seconds + var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) + var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) + var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called + var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote + var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). + var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) + var/static/vote_no_dead = 0 // dead people can't vote (tbi) +// var/static/enable_authentication = 0 // goon authentication + var/static/del_new_on_log = 1 // del's new players if they log before they spawn in + var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard + var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/static/objectives_disabled = 0 //if objectives are disabled or not + var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other + var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/static/allow_Metadata = 0 // Metadata is supported. + var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/static/fps = 20 + var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling + var/static/Tickcomp = 0 + var/static/socket_talk = 0 // use socket_talk to communicate with other processes + var/static/list/resource_urls = null + var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/static/list/mode_names = list() + var/static/list/modes = list() // allowed modes + var/static/list/votable_modes = list() // votable modes + var/static/list/probabilities = list() // relative probability of each mode + var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. + var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. + var/static/humans_need_surnames = 0 + var/static/allow_random_events = 0 // enables random events mid-round when set to 1 + var/static/enable_game_master = 0 // enables the 'smart' event system. + var/static/allow_ai = 1 // allow ai job + var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. + var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell + var/static/hostedby = null + + var/static/respawn = 1 + var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) + var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" + + var/static/guest_jobban = 1 + var/static/usewhitelist = 0 + var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 + var/static/show_mods = 0 + var/static/show_devs = 0 + var/static/show_event_managers = 0 + var/static/mods_can_tempban = 0 + var/static/mods_can_job_tempban = 0 + var/static/mod_tempban_max = 1440 + var/static/mod_job_tempban_max = 1440 + var/static/load_jobs_from_txt = 0 + var/static/ToRban = 0 + var/static/automute_on = 0 //enables automuting/spam prevention + var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + + var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... + var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. + + var/static/character_slots = 10 // The number of available character slots + var/static/loadout_slots = 3 // The number of loadout slots per character + + var/static/max_maint_drones = 5 //This many drones can spawn, + var/static/allow_drone_spawn = 1 //assuming the admin allow them to. + var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. + + var/static/disable_player_mice = 0 + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech + + var/static/usealienwhitelist = 0 + var/static/limitalienplayers = 0 + var/static/alien_to_human_ratio = 0.5 + var/static/allow_extra_antags = 0 + var/static/guests_allowed = 1 + var/static/debugparanoid = 0 + var/static/panic_bunker = 0 + var/static/paranoia_logging = 0 + + var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. + var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. + var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). + var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. + var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. + var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. + + var/static/serverurl + var/static/server + var/static/banappeals + var/static/wikiurl + var/static/wikisearchurl + var/static/forumurl + var/static/githuburl + var/static/discordurl + var/static/rulesurl + var/static/mapurl + + //Alert level description + var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." + var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." + var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + + var/static/forbid_singulo_possession = 0 + + //game_options.txt configs + + var/static/health_threshold_softcrit = 0 + var/static/health_threshold_crit = 0 + var/static/health_threshold_dead = -100 + + var/static/organ_health_multiplier = 1 + var/static/organ_regeneration_multiplier = 1 + var/static/organs_decay + var/static/default_brain_health = 400 + var/static/allow_headgibs = FALSE + + //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, + //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. + var/static/organ_damage_spillover_multiplier = 0.5 + + var/static/bones_can_break = 0 + var/static/limbs_can_break = 0 + + var/static/revival_pod_plants = 1 + var/static/revival_cloning = 1 + var/static/revival_brain_life = -1 + + var/static/use_loyalty_implants = 0 + + var/static/welder_vision = 1 + var/static/generate_map = 0 + var/static/no_click_cooldown = 0 + + //Used for modifying movement speed for mobs. + //Unversal modifiers + var/static/run_speed = 0 + var/static/walk_speed = 0 + + //Mob specific modifiers. NOTE: These will affect different mob types in different ways + var/static/human_delay = 0 + var/static/robot_delay = 0 + var/static/monkey_delay = 0 + var/static/alien_delay = 0 + var/static/slime_delay = 0 + var/static/animal_delay = 0 + + var/static/footstep_volume = 0 + + var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt + var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt + var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database + + var/static/simultaneous_pm_warning_timeout = 100 + + var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. + var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. + + var/static/assistant_maint = 0 //Do assistants get maint access? + var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. + var/static/ghost_interaction = 0 + + var/static/comms_password = "" + + var/static/enter_allowed = 1 + + var/use_irc_bot = 0 + var/use_node_bot = 0 + var/irc_bot_port = 0 + var/irc_bot_host = "" + var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge + var/main_irc = "" + var/admin_irc = "" + var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix + var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. + var/use_overmap = 0 + + var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. + + // Event settings + var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours + // If the first delay has a custom start time + // No custom time, no custom time, between 80 to 100 minutes respectively. + var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) + // The lowest delay until next event + // 10, 30, 50 minutes respectively + var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) + // The upper delay until next event + // 15, 45, 70 minutes respectively + var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) + + var/static/aliens_allowed = 0 + var/static/ninjas_allowed = 0 + var/static/abandon_allowed = 1 + var/static/ooc_allowed = 1 + var/static/looc_allowed = 1 + var/static/dooc_allowed = 1 + var/static/dsay_allowed = 1 + + var/persistence_disabled = FALSE + var/persistence_ignore_mapload = FALSE + + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + + var/starlight = 0 // Whether space turfs have ambient light or not + + var/static/list/ert_species = list(SPECIES_HUMAN) + + var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + + var/static/aggressive_changelog = 0 + + var/static/list/language_prefixes = list(",","#")//Default language prefixes + + var/static/show_human_death_message = 1 + + var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf + var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/static/radiation_material_resistance_divisor = 1 + var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + + var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. + var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. + + // New shiny SQLite stuff. + // The basics. + var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. + + // In-Game Feedback. + var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. + var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. + var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. + var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. + var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + + var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/static/disable_cid_warn_popup = FALSE + + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + + // How strictly the loadout enforces object species whitelists + var/loadout_whitelist = LOADOUT_WHITELIST_LAX + + var/static/vgs_access_identifier = null // VOREStation Edit - VGS + var/static/vgs_server_port = null // VOREStation Edit - VGS + + var/disable_webhook_embeds = FALSE + + var/static/list/jukebox_track_files + +/datum/configuration/New() + var/list/L = typesof(/datum/game_mode) - /datum/game_mode + for (var/T in L) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + var/datum/game_mode/M = new T() + if (M.config_tag) + gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. + if(!(M.config_tag in modes)) // ensure each mode is added only once + log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") + modes += M.config_tag + mode_names[M.config_tag] = M.name + probabilities[M.config_tag] = M.probability + player_requirements[M.config_tag] = M.required_players + player_requirements_secret[M.config_tag] = M.required_players_secret + if (M.votable) + src.votable_modes += M.config_tag + src.votable_modes += "secret" + +/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist + var/list/Lines = file2list(filename) + + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + if(type == "config") + switch (name) + if ("resource_urls") + config.resource_urls = splittext(value, " ") + + if ("admin_legacy_system") + config.admin_legacy_system = 1 + + if ("ban_legacy_system") + config.ban_legacy_system = 1 + + if ("use_age_restriction_for_jobs") + config.use_age_restriction_for_jobs = 1 + + if ("use_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + + if ("jobs_have_minimal_access") + config.jobs_have_minimal_access = 1 + + if ("use_recursive_explosions") + use_recursive_explosions = 1 + + if ("multi_z_explosion_scalar") + multi_z_explosion_scalar = text2num(value) + + if ("log_ooc") + config.log_ooc = 1 + + if ("log_access") + config.log_access = 1 + + if ("sql_enabled") + config.sql_enabled = 1 + + if ("log_say") + config.log_say = 1 + + if ("debug_paranoid") + config.debugparanoid = 1 + + if ("log_admin") + config.log_admin = 1 + + if ("log_debug") + config.log_debug = text2num(value) + + if ("log_game") + config.log_game = 1 + + if ("log_vote") + config.log_vote = 1 + + if ("log_whisper") + config.log_whisper = 1 + + if ("log_attack") + config.log_attack = 1 + + if ("log_emote") + config.log_emote = 1 + + if ("log_adminchat") + config.log_adminchat = 1 + + if ("log_adminwarn") + config.log_adminwarn = 1 + + if ("log_pda") + config.log_pda = 1 + + if ("log_world_output") + config.log_world_output = 1 + + if ("log_hrefs") + config.log_hrefs = 1 + + if ("log_runtime") + config.log_runtime = 1 + + if ("log_graffiti") + config.log_graffiti = 1 + + if ("generate_map") + config.generate_map = 1 + + if ("no_click_cooldown") + config.no_click_cooldown = 1 + + if("allow_admin_ooccolor") + config.allow_admin_ooccolor = 1 + + if ("allow_vote_restart") + config.allow_vote_restart = 1 + + if ("allow_vote_mode") + config.allow_vote_mode = 1 + + if ("allow_admin_jump") + config.allow_admin_jump = 1 + + if("allow_admin_rev") + config.allow_admin_rev = 1 + + if ("allow_admin_spawning") + config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 + + if ("no_dead_vote") + config.vote_no_dead = 1 + + if ("default_no_vote") + config.vote_no_default = 1 + + if ("pregame_time") + config.pregame_time = text2num(value) + + if ("vote_delay") + config.vote_delay = text2num(value) + + if ("vote_period") + config.vote_period = text2num(value) + + if ("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if ("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + + if ("vote_autogamemode_timeleft") + config.vote_autogamemode_timeleft = text2num(value) + + if("ert_admin_only") + config.ert_admin_call_only = 1 + + if ("allow_ai") + config.allow_ai = 1 + + if ("allow_ai_shells") + config.allow_ai_shells = TRUE + + if("give_free_ai_shell") + config.give_free_ai_shell = TRUE + +// if ("authentication") +// config.enable_authentication = 1 + + if ("norespawn") + config.respawn = 0 + + if ("respawn_time") + var/raw_minutes = text2num(value) + config.respawn_time = raw_minutes MINUTES + + if ("respawn_message") + config.respawn_message = "[value]" + + if ("servername") + config.server_name = value + + if ("serversuffix") + config.server_suffix = 1 + + if ("nudge_script_path") + config.nudge_script_path = value + + if ("hostedby") + config.hostedby = value + + if ("serverurl") + config.serverurl = value + + if ("server") + config.server = value + + if ("banappeals") + config.banappeals = value + + if ("wikiurl") + config.wikiurl = value + + if ("wikisearchurl") + config.wikisearchurl = value + + if ("forumurl") + config.forumurl = value + + if ("rulesurl") + config.rulesurl = value + + if ("mapurl") + config.mapurl = value + + if ("githuburl") + config.githuburl = value + + if ("discordurl") + config.discordurl = value + + if ("guest_jobban") + config.guest_jobban = 1 + + if ("guest_ban") + config.guests_allowed = 0 + + if ("disable_ooc") + config.ooc_allowed = 0 + config.looc_allowed = 0 + + if ("disable_entry") + config.enter_allowed = 0 + + if ("disable_dead_ooc") + config.dooc_allowed = 0 + + if ("disable_dsay") + config.dsay_allowed = 0 + + if ("disable_respawn") + config.abandon_allowed = 0 + + if ("usewhitelist") + config.usewhitelist = 1 + + if ("feature_object_spell_system") + config.feature_object_spell_system = 1 + + if ("allow_metadata") + config.allow_Metadata = 1 + + if ("traitor_scaling") + config.traitor_scaling = 1 + + if ("aliens_allowed") + config.aliens_allowed = 1 + + if ("ninjas_allowed") + config.ninjas_allowed = 1 + + if ("objectives_disabled") + config.objectives_disabled = 1 + + if("protect_roles_from_antagonist") + config.protect_roles_from_antagonist = 1 + + if("persistence_disabled") + config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. + + if("persistence_ignore_mapload") + config.persistence_ignore_mapload = TRUE + + if ("probability") + var/prob_pos = findtext(value, " ") + var/prob_name = null + var/prob_value = null + + if (prob_pos) + prob_name = lowertext(copytext(value, 1, prob_pos)) + prob_value = copytext(value, prob_pos + 1) + if (prob_name in config.modes) + config.probabilities[prob_name] = text2num(prob_value) + else + log_misc("Unknown game mode probability configuration definition: [prob_name].") + else + log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") + + if ("required_players", "required_players_secret") + var/req_pos = findtext(value, " ") + var/req_name = null + var/req_value = null + var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. + + if(req_pos) + req_name = lowertext(copytext(value, 1, req_pos)) + req_value = copytext(value, req_pos + 1) + if(req_name in config.modes) + if(is_secret_override) + config.player_requirements_secret[req_name] = text2num(req_value) + else + config.player_requirements[req_name] = text2num(req_value) + else + log_misc("Unknown game mode player requirement configuration definition: [req_name].") + else + log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") + + if("allow_random_events") + config.allow_random_events = 1 + + if("enable_game_master") + config.enable_game_master = 1 + + if("kick_inactive") + config.kick_inactive = text2num(value) + + if("show_mods") + config.show_mods = 1 + + if("show_devs") + config.show_devs = 1 + + if("show_event_managers") + config.show_event_managers = 1 + + if("mods_can_tempban") + config.mods_can_tempban = 1 + + if("mods_can_job_tempban") + config.mods_can_job_tempban = 1 + + if("mod_tempban_max") + config.mod_tempban_max = text2num(value) + + if("mod_job_tempban_max") + config.mod_job_tempban_max = text2num(value) + + if("load_jobs_from_txt") + load_jobs_from_txt = 1 + + if("alert_red_upto") + config.alert_desc_red_upto = value + + if("alert_red_downto") + config.alert_desc_red_downto = value + + if("alert_blue_downto") + config.alert_desc_blue_downto = value + + if("alert_blue_upto") + config.alert_desc_blue_upto = value + + if("alert_green") + config.alert_desc_green = value + + if("alert_delta") + config.alert_desc_delta = value + + if("forbid_singulo_possession") + forbid_singulo_possession = 1 + + if("popup_admin_pm") + config.popup_admin_pm = 1 + + if("allow_holidays") + Holiday = 1 + + if("use_irc_bot") + use_irc_bot = 1 + + if("use_node_bot") + use_node_bot = 1 + + if("irc_bot_port") + config.irc_bot_port = value + + if("irc_bot_export") + irc_bot_export = 1 + + if("ticklag") + var/ticklag = text2num(value) + if(ticklag > 0) + fps = 10 / ticklag + + if("tick_limit_mc_init") + tick_limit_mc_init = text2num(value) + + if("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + + if("socket_talk") + socket_talk = text2num(value) + + if("tickcomp") + Tickcomp = 1 + + if("humans_need_surnames") + humans_need_surnames = 1 + + if("tor_ban") + ToRban = 1 + + if("automute_on") + automute_on = 1 + + if("usealienwhitelist") + usealienwhitelist = 1 + + if("alien_player_ratio") + limitalienplayers = 1 + alien_to_human_ratio = text2num(value) + + if("assistant_maint") + config.assistant_maint = 1 + + if("gateway_delay") + config.gateway_delay = text2num(value) + + if("continuous_rounds") + config.continous_rounds = 1 + + if("ghost_interaction") + config.ghost_interaction = 1 + + if("disable_player_mice") + config.disable_player_mice = 1 + + if("uneducated_mice") + config.uneducated_mice = 1 + + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + + if("main_irc") + config.main_irc = value + + if("admin_irc") + config.admin_irc = value + + if("python_path") + if(value) + config.python_path = value + + if("use_lib_nudge") + config.use_lib_nudge = 1 + + if("allow_cult_ghostwriter") + config.cult_ghostwriter = 1 + + if("req_cult_ghostwriter") + config.cult_ghostwriter_req_cultists = text2num(value) + + if("character_slots") + config.character_slots = text2num(value) + + if("loadout_slots") + config.loadout_slots = text2num(value) + + if("allow_drone_spawn") + config.allow_drone_spawn = text2num(value) + + if("drone_build_time") + config.drone_build_time = text2num(value) + + if("max_maint_drones") + config.max_maint_drones = text2num(value) + + if("use_overmap") + config.use_overmap = 1 + + if("engine_map") + config.engine_map = splittext(value, ",") +/* + if("station_levels") + using_map.station_levels = text2numlist(value, ";") + + if("admin_levels") + using_map.admin_levels = text2numlist(value, ";") + + if("contact_levels") + using_map.contact_levels = text2numlist(value, ";") + + if("player_levels") + using_map.player_levels = text2numlist(value, ";") +*/ + if("expected_round_length") + config.expected_round_length = MinutesToTicks(text2num(value)) + + if("disable_welder_vision") + config.welder_vision = 0 + + if("allow_extra_antags") + config.allow_extra_antags = 1 + + if("event_custom_start_mundane") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_moderate") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_major") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_delay_lower") + var/values = text2numlist(value, ";") + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("event_delay_upper") + var/values = text2numlist(value, ";") + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("starlight") + value = text2num(value) + config.starlight = value >= 0 ? value : 0 + + if("ert_species") + config.ert_species = splittext(value, ";") + if(!config.ert_species.len) + config.ert_species += SPECIES_HUMAN + + if("law_zero") + law_zero = value + + if("aggressive_changelog") + config.aggressive_changelog = 1 + + if("default_language_prefixes") + var/list/values = splittext(value, " ") + if(values.len > 0) + language_prefixes = values + + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + + if("radiation_resistance_calc_divide") + radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV + + if("radiation_resistance_calc_subtract") + radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB + + if("radiation_resistance_multiplier") + radiation_resistance_multiplier = text2num(value) + + if("radiation_material_resistance_divisor") + radiation_material_resistance_divisor = text2num(value) + + if("radiation_decay_rate") + radiation_decay_rate = text2num(value) + + if ("panic_bunker") + config.panic_bunker = 1 + + if ("paranoia_logging") + config.paranoia_logging = 1 + + if("ip_reputation") + config.ip_reputation = 1 + + if("ipr_email") + config.ipr_email = value + + if("ipr_block_bad_ips") + config.ipr_block_bad_ips = 1 + + if("ipr_bad_score") + config.ipr_bad_score = text2num(value) + + if("ipr_allow_existing") + config.ipr_allow_existing = 1 + + if("ipr_minimum_age") + config.ipr_minimum_age = text2num(value) + + if("random_submap_orientation") + config.random_submap_orientation = 1 + + if("autostart_solars") + config.autostart_solars = TRUE + + if("sqlite_enabled") + config.sqlite_enabled = TRUE + + if("sqlite_feedback") + config.sqlite_feedback = TRUE + + if("sqlite_feedback_topics") + config.sqlite_feedback_topics = splittext(value, ";") + if(!config.sqlite_feedback_topics.len) + config.sqlite_feedback_topics += "General" + + if("sqlite_feedback_privacy") + config.sqlite_feedback_privacy = TRUE + + if("sqlite_feedback_cooldown") + config.sqlite_feedback_cooldown = text2num(value) + + if("defib_timer") + config.defib_timer = text2num(value) + + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE + + if("enable_night_shifts") + config.enable_night_shifts = TRUE + + if("jukebox_track_files") + config.jukebox_track_files = splittext(value, ";") + + // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. + if("vgs_access_identifier") + config.vgs_access_identifier = value + if("vgs_server_port") + config.vgs_server_port = text2num(value) + // VOREStation Edit End + + else + log_misc("Unknown setting in configuration: '[name]'") + + else if(type == "game_options") + if(!value) + log_misc("Unknown value for setting [name] in [filename].") + value = text2num(value) + + switch(name) + if("health_threshold_crit") + config.health_threshold_crit = value + if("health_threshold_softcrit") + config.health_threshold_softcrit = value + if("health_threshold_dead") + config.health_threshold_dead = value + if("show_human_death_message") + config.show_human_death_message = 1 + if("revival_pod_plants") + config.revival_pod_plants = value + if("revival_cloning") + config.revival_cloning = value + if("revival_brain_life") + config.revival_brain_life = value + if("organ_health_multiplier") + config.organ_health_multiplier = value / 100 + if("organ_regeneration_multiplier") + config.organ_regeneration_multiplier = value / 100 + if("organ_damage_spillover_multiplier") + config.organ_damage_spillover_multiplier = value / 100 + if("organs_can_decay") + config.organs_decay = 1 + if("default_brain_health") + config.default_brain_health = text2num(value) + if(!config.default_brain_health || config.default_brain_health < 1) + config.default_brain_health = initial(config.default_brain_health) + if("bones_can_break") + config.bones_can_break = value + if("limbs_can_break") + config.limbs_can_break = value + if("allow_headgibs") + config.allow_headgibs = TRUE + + if("run_speed") + config.run_speed = value + if("walk_speed") + config.walk_speed = value + + if("human_delay") + config.human_delay = value + if("robot_delay") + config.robot_delay = value + if("monkey_delay") + config.monkey_delay = value + if("alien_delay") + config.alien_delay = value + if("slime_delay") + config.slime_delay = value + if("animal_delay") + config.animal_delay = value + + if("footstep_volume") + config.footstep_volume = text2num(value) + + if("use_loyalty_implants") + config.use_loyalty_implants = 1 + + if("loadout_whitelist") + config.loadout_whitelist = text2num(value) + + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + if ("feedback_database") + sqlfdbkdb = value + if ("feedback_login") + sqlfdbklogin = value + if ("feedback_password") + sqlfdbkpass = value + if ("enable_stat_tracking") + sqllogging = 1 + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadforumsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + forumsqladdress = value + if ("port") + forumsqlport = value + if ("database") + forumsqldb = value + if ("login") + forumsqllogin = value + if ("password") + forumsqlpass = value + if ("activatedgroup") + forum_activated_group = value + if ("authenticatedgroup") + forum_authenticated_group = value + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/pick_mode(mode_name) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + for (var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if (M.config_tag && M.config_tag == mode_name) + return M + return gamemode_cache["extended"] + +/datum/configuration/proc/get_runnable_modes() + var/list/runnable_modes = list() + for(var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) + runnable_modes |= M + return runnable_modes + +/datum/configuration/proc/post_load() + //apply a default value to config.python_path, if needed + if (!config.python_path) + if(world.system_type == UNIX) + config.python_path = "/usr/bin/env python2" + else //probably windows, if not this should work anyway + config.python_path = "python" +======= +var/list/gamemode_cache = list() + +/datum/configuration + var/static/server_name = null // server name (for world name / status) + var/static/server_suffix = 0 // generate numeric suffix based on server port + + var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located + + var/static/log_ooc = 0 // log OOC channel + var/static/log_access = 0 // log login/logout + var/static/log_say = 0 // log client say + var/static/log_admin = 0 // log admin actions + var/static/log_debug = 1 // log debug output + var/static/log_game = 0 // log game events + var/static/log_vote = 0 // log voting + var/static/log_whisper = 0 // log client whisper + var/static/log_emote = 0 // log emotes + var/static/log_attack = 0 // log attack messages + var/static/log_adminchat = 0 // log admin chat messages + var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such + var/static/log_pda = 0 // log pda messages + var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits + var/static/log_runtime = 0 // logs world.log to a file + var/static/log_world_output = 0 // log to_world_log(messages) + var/static/log_graffiti = 0 // logs graffiti + var/static/sql_enabled = 0 // for sql switching + var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour + var/static/allow_vote_restart = 0 // allow votes to restart + var/static/ert_admin_call_only = 0 + var/static/allow_vote_mode = 0 // allow votes to change mode + var/static/allow_admin_jump = 1 // allows admin jumping + var/static/allow_admin_spawning = 1 // allows admin item spawning + var/static/allow_admin_rev = 1 // allows admin revives + var/static/pregame_time = 180 // pregame time in seconds + var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) + var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) + var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called + var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote + var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). + var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) + var/static/vote_no_dead = 0 // dead people can't vote (tbi) +// var/static/enable_authentication = 0 // goon authentication + var/static/del_new_on_log = 1 // del's new players if they log before they spawn in + var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard + var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/static/objectives_disabled = 0 //if objectives are disabled or not + var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other + var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/static/allow_Metadata = 0 // Metadata is supported. + var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/static/fps = 20 + var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling + var/static/Tickcomp = 0 + var/static/socket_talk = 0 // use socket_talk to communicate with other processes + var/static/list/resource_urls = null + var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/static/list/mode_names = list() + var/static/list/modes = list() // allowed modes + var/static/list/votable_modes = list() // votable modes + var/static/list/probabilities = list() // relative probability of each mode + var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. + var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. + var/static/humans_need_surnames = 0 + var/static/allow_random_events = 0 // enables random events mid-round when set to 1 + var/static/enable_game_master = 0 // enables the 'smart' event system. + var/static/allow_ai = 1 // allow ai job + var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. + var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell + var/static/hostedby = null + + var/static/respawn = 1 + var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) + var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" + + var/static/guest_jobban = 1 + var/static/usewhitelist = 0 + var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 + var/static/show_mods = 0 + var/static/show_devs = 0 + var/static/show_event_managers = 0 + var/static/mods_can_tempban = 0 + var/static/mods_can_job_tempban = 0 + var/static/mod_tempban_max = 1440 + var/static/mod_job_tempban_max = 1440 + var/static/load_jobs_from_txt = 0 + var/static/ToRban = 0 + var/static/automute_on = 0 //enables automuting/spam prevention + var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + + var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... + var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. + + var/static/character_slots = 10 // The number of available character slots + var/static/loadout_slots = 3 // The number of loadout slots per character + + var/static/max_maint_drones = 5 //This many drones can spawn, + var/static/allow_drone_spawn = 1 //assuming the admin allow them to. + var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. + + var/static/disable_player_mice = 0 + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech + + var/static/usealienwhitelist = 0 + var/static/limitalienplayers = 0 + var/static/alien_to_human_ratio = 0.5 + var/static/allow_extra_antags = 0 + var/static/guests_allowed = 1 + var/static/debugparanoid = 0 + var/static/panic_bunker = 0 + var/static/paranoia_logging = 0 + + var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. + var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. + var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). + var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. + var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. + var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. + + var/static/serverurl + var/static/server + var/static/banappeals + var/static/wikiurl + var/static/wikisearchurl + var/static/forumurl + var/static/githuburl + var/static/discordurl + var/static/rulesurl + var/static/mapurl + + //Alert level description + var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." + var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." + var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + + var/static/forbid_singulo_possession = 0 + + //game_options.txt configs + + var/static/health_threshold_softcrit = 0 + var/static/health_threshold_crit = 0 + var/static/health_threshold_dead = -100 + + var/static/organ_health_multiplier = 1 + var/static/organ_regeneration_multiplier = 1 + var/static/organs_decay + var/static/default_brain_health = 400 + var/static/allow_headgibs = FALSE + + //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, + //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. + var/static/organ_damage_spillover_multiplier = 0.5 + + var/static/bones_can_break = 0 + var/static/limbs_can_break = 0 + + var/static/revival_pod_plants = 1 + var/static/revival_cloning = 1 + var/static/revival_brain_life = -1 + + var/static/use_loyalty_implants = 0 + + var/static/welder_vision = 1 + var/static/generate_map = 0 + var/static/no_click_cooldown = 0 + + //Used for modifying movement speed for mobs. + //Unversal modifiers + var/static/run_speed = 0 + var/static/walk_speed = 0 + + //Mob specific modifiers. NOTE: These will affect different mob types in different ways + var/static/human_delay = 0 + var/static/robot_delay = 0 + var/static/monkey_delay = 0 + var/static/alien_delay = 0 + var/static/slime_delay = 0 + var/static/animal_delay = 0 + + var/static/footstep_volume = 0 + + var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt + var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt + var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database + + var/static/simultaneous_pm_warning_timeout = 100 + + var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. + var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. + + var/static/assistant_maint = 0 //Do assistants get maint access? + var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. + var/static/ghost_interaction = 0 + + var/static/comms_password = "" + + var/static/enter_allowed = 1 + + var/use_irc_bot = 0 + var/use_node_bot = 0 + var/irc_bot_port = 0 + var/irc_bot_host = "" + var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge + var/main_irc = "" + var/admin_irc = "" + var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix + var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. + var/use_overmap = 0 + + var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. + + // Event settings + var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours + // If the first delay has a custom start time + // No custom time, no custom time, between 80 to 100 minutes respectively. + var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) + // The lowest delay until next event + // 10, 30, 50 minutes respectively + var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) + // The upper delay until next event + // 15, 45, 70 minutes respectively + var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) + + var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. + var/static/ninjas_allowed = 0 + var/static/abandon_allowed = 1 + var/static/ooc_allowed = 1 + var/static/looc_allowed = 1 + var/static/dooc_allowed = 1 + var/static/dsay_allowed = 1 + + var/persistence_disabled = FALSE + var/persistence_ignore_mapload = FALSE + + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + + var/starlight = 0 // Whether space turfs have ambient light or not + + var/static/list/ert_species = list(SPECIES_HUMAN) + + var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + + var/static/aggressive_changelog = 0 + + var/static/list/language_prefixes = list(",","#")//Default language prefixes + + var/static/show_human_death_message = 1 + + var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf + var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/static/radiation_material_resistance_divisor = 1 + var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + + var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. + var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. + + // New shiny SQLite stuff. + // The basics. + var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. + + // In-Game Feedback. + var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. + var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. + var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. + var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. + var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + + var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/static/disable_cid_warn_popup = FALSE + + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + + // How strictly the loadout enforces object species whitelists + var/loadout_whitelist = LOADOUT_WHITELIST_LAX + + var/static/vgs_access_identifier = null // VOREStation Edit - VGS + var/static/vgs_server_port = null // VOREStation Edit - VGS + + var/disable_webhook_embeds = FALSE + + var/static/list/jukebox_track_files + +/datum/configuration/New() + var/list/L = typesof(/datum/game_mode) - /datum/game_mode + for (var/T in L) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + var/datum/game_mode/M = new T() + if (M.config_tag) + gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. + if(!(M.config_tag in modes)) // ensure each mode is added only once + log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") + modes += M.config_tag + mode_names[M.config_tag] = M.name + probabilities[M.config_tag] = M.probability + player_requirements[M.config_tag] = M.required_players + player_requirements_secret[M.config_tag] = M.required_players_secret + if (M.votable) + src.votable_modes += M.config_tag + src.votable_modes += "secret" + +/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist + var/list/Lines = file2list(filename) + + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + if(type == "config") + switch (name) + if ("resource_urls") + config.resource_urls = splittext(value, " ") + + if ("admin_legacy_system") + config.admin_legacy_system = 1 + + if ("ban_legacy_system") + config.ban_legacy_system = 1 + + if ("use_age_restriction_for_jobs") + config.use_age_restriction_for_jobs = 1 + + if ("use_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + + if ("jobs_have_minimal_access") + config.jobs_have_minimal_access = 1 + + if ("use_recursive_explosions") + use_recursive_explosions = 1 + + if ("multi_z_explosion_scalar") + multi_z_explosion_scalar = text2num(value) + + if ("log_ooc") + config.log_ooc = 1 + + if ("log_access") + config.log_access = 1 + + if ("sql_enabled") + config.sql_enabled = 1 + + if ("log_say") + config.log_say = 1 + + if ("debug_paranoid") + config.debugparanoid = 1 + + if ("log_admin") + config.log_admin = 1 + + if ("log_debug") + config.log_debug = text2num(value) + + if ("log_game") + config.log_game = 1 + + if ("log_vote") + config.log_vote = 1 + + if ("log_whisper") + config.log_whisper = 1 + + if ("log_attack") + config.log_attack = 1 + + if ("log_emote") + config.log_emote = 1 + + if ("log_adminchat") + config.log_adminchat = 1 + + if ("log_adminwarn") + config.log_adminwarn = 1 + + if ("log_pda") + config.log_pda = 1 + + if ("log_world_output") + config.log_world_output = 1 + + if ("log_hrefs") + config.log_hrefs = 1 + + if ("log_runtime") + config.log_runtime = 1 + + if ("log_graffiti") + config.log_graffiti = 1 + + if ("generate_map") + config.generate_map = 1 + + if ("no_click_cooldown") + config.no_click_cooldown = 1 + + if("allow_admin_ooccolor") + config.allow_admin_ooccolor = 1 + + if ("allow_vote_restart") + config.allow_vote_restart = 1 + + if ("allow_vote_mode") + config.allow_vote_mode = 1 + + if ("allow_admin_jump") + config.allow_admin_jump = 1 + + if("allow_admin_rev") + config.allow_admin_rev = 1 + + if ("allow_admin_spawning") + config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 + + if ("no_dead_vote") + config.vote_no_dead = 1 + + if ("default_no_vote") + config.vote_no_default = 1 + + if ("pregame_time") + config.pregame_time = text2num(value) + + if ("vote_delay") + config.vote_delay = text2num(value) + + if ("vote_period") + config.vote_period = text2num(value) + + if ("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if ("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + + if ("vote_autogamemode_timeleft") + config.vote_autogamemode_timeleft = text2num(value) + + if("ert_admin_only") + config.ert_admin_call_only = 1 + + if ("allow_ai") + config.allow_ai = 1 + + if ("allow_ai_shells") + config.allow_ai_shells = TRUE + + if("give_free_ai_shell") + config.give_free_ai_shell = TRUE + +// if ("authentication") +// config.enable_authentication = 1 + + if ("norespawn") + config.respawn = 0 + + if ("respawn_time") + var/raw_minutes = text2num(value) + config.respawn_time = raw_minutes MINUTES + + if ("respawn_message") + config.respawn_message = "[value]" + + if ("servername") + config.server_name = value + + if ("serversuffix") + config.server_suffix = 1 + + if ("nudge_script_path") + config.nudge_script_path = value + + if ("hostedby") + config.hostedby = value + + if ("serverurl") + config.serverurl = value + + if ("server") + config.server = value + + if ("banappeals") + config.banappeals = value + + if ("wikiurl") + config.wikiurl = value + + if ("wikisearchurl") + config.wikisearchurl = value + + if ("forumurl") + config.forumurl = value + + if ("rulesurl") + config.rulesurl = value + + if ("mapurl") + config.mapurl = value + + if ("githuburl") + config.githuburl = value + + if ("discordurl") + config.discordurl = value + + if ("guest_jobban") + config.guest_jobban = 1 + + if ("guest_ban") + config.guests_allowed = 0 + + if ("disable_ooc") + config.ooc_allowed = 0 + config.looc_allowed = 0 + + if ("disable_entry") + config.enter_allowed = 0 + + if ("disable_dead_ooc") + config.dooc_allowed = 0 + + if ("disable_dsay") + config.dsay_allowed = 0 + + if ("disable_respawn") + config.abandon_allowed = 0 + + if ("usewhitelist") + config.usewhitelist = 1 + + if ("feature_object_spell_system") + config.feature_object_spell_system = 1 + + if ("allow_metadata") + config.allow_Metadata = 1 + + if ("traitor_scaling") + config.traitor_scaling = 1 + + if ("aliens_allowed") + config.aliens_allowed = 1 + + if ("ninjas_allowed") + config.ninjas_allowed = 1 + + if ("objectives_disabled") + config.objectives_disabled = 1 + + if("protect_roles_from_antagonist") + config.protect_roles_from_antagonist = 1 + + if("persistence_disabled") + config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. + + if("persistence_ignore_mapload") + config.persistence_ignore_mapload = TRUE + + if ("probability") + var/prob_pos = findtext(value, " ") + var/prob_name = null + var/prob_value = null + + if (prob_pos) + prob_name = lowertext(copytext(value, 1, prob_pos)) + prob_value = copytext(value, prob_pos + 1) + if (prob_name in config.modes) + config.probabilities[prob_name] = text2num(prob_value) + else + log_misc("Unknown game mode probability configuration definition: [prob_name].") + else + log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") + + if ("required_players", "required_players_secret") + var/req_pos = findtext(value, " ") + var/req_name = null + var/req_value = null + var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. + + if(req_pos) + req_name = lowertext(copytext(value, 1, req_pos)) + req_value = copytext(value, req_pos + 1) + if(req_name in config.modes) + if(is_secret_override) + config.player_requirements_secret[req_name] = text2num(req_value) + else + config.player_requirements[req_name] = text2num(req_value) + else + log_misc("Unknown game mode player requirement configuration definition: [req_name].") + else + log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") + + if("allow_random_events") + config.allow_random_events = 1 + + if("enable_game_master") + config.enable_game_master = 1 + + if("kick_inactive") + config.kick_inactive = text2num(value) + + if("show_mods") + config.show_mods = 1 + + if("show_devs") + config.show_devs = 1 + + if("show_event_managers") + config.show_event_managers = 1 + + if("mods_can_tempban") + config.mods_can_tempban = 1 + + if("mods_can_job_tempban") + config.mods_can_job_tempban = 1 + + if("mod_tempban_max") + config.mod_tempban_max = text2num(value) + + if("mod_job_tempban_max") + config.mod_job_tempban_max = text2num(value) + + if("load_jobs_from_txt") + load_jobs_from_txt = 1 + + if("alert_red_upto") + config.alert_desc_red_upto = value + + if("alert_red_downto") + config.alert_desc_red_downto = value + + if("alert_blue_downto") + config.alert_desc_blue_downto = value + + if("alert_blue_upto") + config.alert_desc_blue_upto = value + + if("alert_green") + config.alert_desc_green = value + + if("alert_delta") + config.alert_desc_delta = value + + if("forbid_singulo_possession") + forbid_singulo_possession = 1 + + if("popup_admin_pm") + config.popup_admin_pm = 1 + + if("allow_holidays") + Holiday = 1 + + if("use_irc_bot") + use_irc_bot = 1 + + if("use_node_bot") + use_node_bot = 1 + + if("irc_bot_port") + config.irc_bot_port = value + + if("irc_bot_export") + irc_bot_export = 1 + + if("ticklag") + var/ticklag = text2num(value) + if(ticklag > 0) + fps = 10 / ticklag + + if("tick_limit_mc_init") + tick_limit_mc_init = text2num(value) + + if("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + + if("socket_talk") + socket_talk = text2num(value) + + if("tickcomp") + Tickcomp = 1 + + if("humans_need_surnames") + humans_need_surnames = 1 + + if("tor_ban") + ToRban = 1 + + if("automute_on") + automute_on = 1 + + if("usealienwhitelist") + usealienwhitelist = 1 + + if("alien_player_ratio") + limitalienplayers = 1 + alien_to_human_ratio = text2num(value) + + if("assistant_maint") + config.assistant_maint = 1 + + if("gateway_delay") + config.gateway_delay = text2num(value) + + if("continuous_rounds") + config.continous_rounds = 1 + + if("ghost_interaction") + config.ghost_interaction = 1 + + if("disable_player_mice") + config.disable_player_mice = 1 + + if("uneducated_mice") + config.uneducated_mice = 1 + + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + + if("main_irc") + config.main_irc = value + + if("admin_irc") + config.admin_irc = value + + if("python_path") + if(value) + config.python_path = value + + if("use_lib_nudge") + config.use_lib_nudge = 1 + + if("allow_cult_ghostwriter") + config.cult_ghostwriter = 1 + + if("req_cult_ghostwriter") + config.cult_ghostwriter_req_cultists = text2num(value) + + if("character_slots") + config.character_slots = text2num(value) + + if("loadout_slots") + config.loadout_slots = text2num(value) + + if("allow_drone_spawn") + config.allow_drone_spawn = text2num(value) + + if("drone_build_time") + config.drone_build_time = text2num(value) + + if("max_maint_drones") + config.max_maint_drones = text2num(value) + + if("use_overmap") + config.use_overmap = 1 + + if("engine_map") + config.engine_map = splittext(value, ",") +/* + if("station_levels") + using_map.station_levels = text2numlist(value, ";") + + if("admin_levels") + using_map.admin_levels = text2numlist(value, ";") + + if("contact_levels") + using_map.contact_levels = text2numlist(value, ";") + + if("player_levels") + using_map.player_levels = text2numlist(value, ";") +*/ + if("expected_round_length") + config.expected_round_length = MinutesToTicks(text2num(value)) + + if("disable_welder_vision") + config.welder_vision = 0 + + if("allow_extra_antags") + config.allow_extra_antags = 1 + + if("event_custom_start_mundane") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_moderate") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_major") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_delay_lower") + var/values = text2numlist(value, ";") + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("event_delay_upper") + var/values = text2numlist(value, ";") + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("starlight") + value = text2num(value) + config.starlight = value >= 0 ? value : 0 + + if("ert_species") + config.ert_species = splittext(value, ";") + if(!config.ert_species.len) + config.ert_species += SPECIES_HUMAN + + if("law_zero") + law_zero = value + + if("aggressive_changelog") + config.aggressive_changelog = 1 + + if("default_language_prefixes") + var/list/values = splittext(value, " ") + if(values.len > 0) + language_prefixes = values + + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + + if("radiation_resistance_calc_divide") + radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV + + if("radiation_resistance_calc_subtract") + radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB + + if("radiation_resistance_multiplier") + radiation_resistance_multiplier = text2num(value) + + if("radiation_material_resistance_divisor") + radiation_material_resistance_divisor = text2num(value) + + if("radiation_decay_rate") + radiation_decay_rate = text2num(value) + + if ("panic_bunker") + config.panic_bunker = 1 + + if ("paranoia_logging") + config.paranoia_logging = 1 + + if("ip_reputation") + config.ip_reputation = 1 + + if("ipr_email") + config.ipr_email = value + + if("ipr_block_bad_ips") + config.ipr_block_bad_ips = 1 + + if("ipr_bad_score") + config.ipr_bad_score = text2num(value) + + if("ipr_allow_existing") + config.ipr_allow_existing = 1 + + if("ipr_minimum_age") + config.ipr_minimum_age = text2num(value) + + if("random_submap_orientation") + config.random_submap_orientation = 1 + + if("autostart_solars") + config.autostart_solars = TRUE + + if("sqlite_enabled") + config.sqlite_enabled = TRUE + + if("sqlite_feedback") + config.sqlite_feedback = TRUE + + if("sqlite_feedback_topics") + config.sqlite_feedback_topics = splittext(value, ";") + if(!config.sqlite_feedback_topics.len) + config.sqlite_feedback_topics += "General" + + if("sqlite_feedback_privacy") + config.sqlite_feedback_privacy = TRUE + + if("sqlite_feedback_cooldown") + config.sqlite_feedback_cooldown = text2num(value) + + if("defib_timer") + config.defib_timer = text2num(value) + + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE + + if("enable_night_shifts") + config.enable_night_shifts = TRUE + + if("jukebox_track_files") + config.jukebox_track_files = splittext(value, ";") + + // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. + if("vgs_access_identifier") + config.vgs_access_identifier = value + if("vgs_server_port") + config.vgs_server_port = text2num(value) + // VOREStation Edit End + + else + log_misc("Unknown setting in configuration: '[name]'") + + else if(type == "game_options") + if(!value) + log_misc("Unknown value for setting [name] in [filename].") + value = text2num(value) + + switch(name) + if("health_threshold_crit") + config.health_threshold_crit = value + if("health_threshold_softcrit") + config.health_threshold_softcrit = value + if("health_threshold_dead") + config.health_threshold_dead = value + if("show_human_death_message") + config.show_human_death_message = 1 + if("revival_pod_plants") + config.revival_pod_plants = value + if("revival_cloning") + config.revival_cloning = value + if("revival_brain_life") + config.revival_brain_life = value + if("organ_health_multiplier") + config.organ_health_multiplier = value / 100 + if("organ_regeneration_multiplier") + config.organ_regeneration_multiplier = value / 100 + if("organ_damage_spillover_multiplier") + config.organ_damage_spillover_multiplier = value / 100 + if("organs_can_decay") + config.organs_decay = 1 + if("default_brain_health") + config.default_brain_health = text2num(value) + if(!config.default_brain_health || config.default_brain_health < 1) + config.default_brain_health = initial(config.default_brain_health) + if("bones_can_break") + config.bones_can_break = value + if("limbs_can_break") + config.limbs_can_break = value + if("allow_headgibs") + config.allow_headgibs = TRUE + + if("run_speed") + config.run_speed = value + if("walk_speed") + config.walk_speed = value + + if("human_delay") + config.human_delay = value + if("robot_delay") + config.robot_delay = value + if("monkey_delay") + config.monkey_delay = value + if("alien_delay") + config.alien_delay = value + if("slime_delay") + config.slime_delay = value + if("animal_delay") + config.animal_delay = value + + if("footstep_volume") + config.footstep_volume = text2num(value) + + if("use_loyalty_implants") + config.use_loyalty_implants = 1 + + if("loadout_whitelist") + config.loadout_whitelist = text2num(value) + + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + if ("feedback_database") + sqlfdbkdb = value + if ("feedback_login") + sqlfdbklogin = value + if ("feedback_password") + sqlfdbkpass = value + if ("enable_stat_tracking") + sqllogging = 1 + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadforumsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + forumsqladdress = value + if ("port") + forumsqlport = value + if ("database") + forumsqldb = value + if ("login") + forumsqllogin = value + if ("password") + forumsqlpass = value + if ("activatedgroup") + forum_activated_group = value + if ("authenticatedgroup") + forum_authenticated_group = value + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/pick_mode(mode_name) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + for (var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if (M.config_tag && M.config_tag == mode_name) + return M + return gamemode_cache["extended"] + +/datum/configuration/proc/get_runnable_modes() + var/list/runnable_modes = list() + for(var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) + runnable_modes |= M + return runnable_modes + +/datum/configuration/proc/post_load() + //apply a default value to config.python_path, if needed + if (!config.python_path) + if(world.system_type == UNIX) + config.python_path = "/usr/bin/env python2" + else //probably windows, if not this should work anyway + config.python_path = "python" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 02f80de642..a44d8f32ec 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //VOREStation Edit - Redone a lot of airlock things: /* - Specific department maintenance doors @@ -1534,3 +1535,3074 @@ About the new airlock wires panel: qdel(src) return TRUE return FALSE +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +//VOREStation Edit - Redone a lot of airlock things: +/* +- Specific department maintenance doors +- Named doors properly according to type +- Gave them default access levels with the access constants +- Improper'd all of the names in the new() +*/ + +/obj/machinery/door/airlock + name = "Airlock" + icon = 'icons/obj/doors/Doorint.dmi' + icon_state = "door_closed" + power_channel = ENVIRON + + explosion_resistance = 10 + + // Doors do their own stuff + bullet_vulnerability = 0 + + blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime + + var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + var/hackProof = 0 // if 1, this door can't be hacked by the AI + var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. + var/main_power_lost_until = 0 //World time when main power is restored. + var/backup_power_lost_until = -1 //World time when backup power is restored. + var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. + var/spawnPowerRestoreRunning = 0 + var/welded = null + var/locked = 0 + var/lights = 1 // bolt lights show by default + var/aiDisabledIdScanner = 0 + var/aiHacking = 0 + var/obj/machinery/door/airlock/closeOther = null + var/closeOtherId = null + var/lockdownbyai = 0 + autoclose = 1 + var/assembly_type = /obj/structure/door_assembly + var/mineral = null + var/justzap = 0 + var/safe = 1 + normalspeed = 1 + var/obj/item/weapon/airlock_electronics/electronics = null + var/hasShocked = 0 //Prevents multiple shocks from happening + var/secured_wires = 0 + var/datum/wires/airlock/wires = null + + var/open_sound_powered = 'sound/machines/door/covert1o.ogg' + var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' + var/close_sound_powered = 'sound/machines/door/covert1c.ogg' + var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' + var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' + var/department_open_powered = null + var/department_close_powered = null + var/denied_sound = 'sound/machines/deniedbeep.ogg' + var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' + var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' + +/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) + if(src.locked || src.welded) + visible_message("\The [user] begins breaking into \the [src] internals!") + user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. + if(do_after(user,10 SECONDS,src)) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + if(prob(25)) + src.shock(user, 100) + user.set_AI_busy(FALSE) + else if(src.density) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.locked || src.welded) + visible_message("\The [user] begins digging into \the [src] internals!") + src.do_animate("deny") + if(do_after(user,5 SECONDS,src)) + visible_message("\The [user] forces \the [src] open, sparks flying from its electronics!") + src.do_animate("spark") + playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + src.emag_act() + else if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 5 SECONDS,src)) + playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + src.do_animate("deny") + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/get_material() + if(mineral) + return get_material_by_name(mineral) + return get_material_by_name(MAT_STEEL) + +/obj/machinery/door/airlock/command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcom.dmi' + req_one_access = list(access_heads) + assembly_type = /obj/structure/door_assembly/door_assembly_com + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd3o.ogg' + department_close_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsec.dmi' + req_one_access = list(access_security) + assembly_type = /obj/structure/door_assembly/door_assembly_sec + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Dooreng.dmi' + req_one_access = list(access_engine) + assembly_type = /obj/structure/door_assembly/door_assembly_eng + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmos.dmi' + req_one_access = list(access_atmospherics) + assembly_type = /obj/structure/door_assembly/door_assembly_eat + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormed.dmi' + req_one_access = list(access_medical) + assembly_type = /obj/structure/door_assembly/door_assembly_med + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/maintenance + name = "Maintenance Access" + icon = 'icons/obj/doors/Doormaint.dmi' + //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access + assembly_type = /obj/structure/door_assembly/door_assembly_mai + open_sound_powered = 'sound/machines/door/door2o.ogg' + close_sound_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/cargo + icon = 'icons/obj/doors/Doormaint_cargo.dmi' + req_one_access = list(access_cargo) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/door2o.ogg' + department_close_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/command + icon = 'icons/obj/doors/Doormaint_command.dmi' + req_one_access = list(access_heads) + +/obj/machinery/door/airlock/maintenance/common + icon = 'icons/obj/doors/Doormaint_common.dmi' + open_sound_powered = 'sound/machines/door/hall3o.ogg' + close_sound_powered = 'sound/machines/door/hall3c.ogg' + +/obj/machinery/door/airlock/maintenance/engi + icon = 'icons/obj/doors/Doormaint_engi.dmi' + req_one_access = list(access_engine) + +/obj/machinery/door/airlock/maintenance/int + icon = 'icons/obj/doors/Doormaint_int.dmi' + +/obj/machinery/door/airlock/maintenance/medical + icon = 'icons/obj/doors/Doormaint_med.dmi' + req_one_access = list(access_medical) + +/obj/machinery/door/airlock/maintenance/rnd + icon = 'icons/obj/doors/Doormaint_rnd.dmi' + req_one_access = list(access_research) + +/obj/machinery/door/airlock/maintenance/sec + icon = 'icons/obj/doors/Doormaint_sec.dmi' + req_one_access = list(access_security) + +/obj/machinery/door/airlock/external + name = "External Airlock" + icon = 'icons/obj/doors/Doorext.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/external/bolted + icon_state = "door_locked" // So it looks visibly bolted in map editor + locked = 1 + +// For convenience in making docking ports: one that is pre-bolted with frequency set! +/obj/machinery/door/airlock/external/bolted/cycling + frequency = 1379 + +/obj/machinery/door/airlock/glass_external + name = "External Airlock" + icon = 'icons/obj/doors/Doorextglass.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + opacity = 0 + glass = 1 + req_one_access = list(access_external_airlocks) + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/glass + name = "Glass Airlock" + icon = 'icons/obj/doors/Doorglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + open_sound_powered = 'sound/machines/door/hall1o.ogg' + close_sound_powered = 'sound/machines/door/hall1c.ogg' + legacy_open_powered = 'sound/machines/door/windowdoor.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + glass = 1 + +/obj/machinery/door/airlock/centcom + name = "Centcom Airlock" + icon = 'icons/obj/doors/Doorele.dmi' + req_one_access = list(access_cent_general) + opacity = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/glass_centcom + name = "Airlock" + icon = 'icons/obj/doors/Dooreleglass.dmi' + opacity = 0 + glass = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/vault + name = "Vault" + icon = 'icons/obj/doors/vault.dmi' + explosion_resistance = 20 + opacity = 1 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/vault1o.ogg' + close_sound_powered = 'sound/machines/door/vault1c.ogg' + +/obj/machinery/door/airlock/vault/bolted + icon_state = "door_locked" + locked = 1 + +/obj/machinery/door/airlock/freezer + name = "Freezer Airlock" + icon = 'icons/obj/doors/Doorfreezer.dmi' + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/hatch + name = "Airtight Hatch" + icon = 'icons/obj/doors/Doorhatchele.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_hatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/maintenance_hatch + name = "Maintenance Hatch" + icon = 'icons/obj/doors/Doorhatchmaint2.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_mhatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/glass_command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcomglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_com + glass = 1 + req_one_access = list(access_heads) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd1o.ogg' + department_close_powered = 'sound/machines/door/cmd1c.ogg' + +/obj/machinery/door/airlock/glass_engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Doorengglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eng + glass = 1 + req_one_access = list(access_engine) + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eat + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsecglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_sec + glass = 1 + req_one_access = list(access_security) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/glass_medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormedglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_med + glass = 1 + req_one_access = list(access_medical) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doormining.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_min + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmo.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearch.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_research + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearchglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_research + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doorminingglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_min + glass = 1 + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/glass_atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/gold + name = "Gold Airlock" + icon = 'icons/obj/doors/Doorgold.dmi' + mineral = "gold" + +/obj/machinery/door/airlock/silver + name = "Silver Airlock" + icon = 'icons/obj/doors/Doorsilver.dmi' + mineral = "silver" + +/obj/machinery/door/airlock/diamond + name = "Diamond Airlock" + icon = 'icons/obj/doors/Doordiamond.dmi' + mineral = "diamond" + +/obj/machinery/door/airlock/uranium + name = "Uranium Airlock" + desc = "And they said I was crazy." + icon = 'icons/obj/doors/Dooruranium.dmi' + mineral = "uranium" + var/last_event = 0 + var/rad_power = 7.5 + +/obj/machinery/door/airlock/process() + // Deliberate no call to parent. + if(main_power_lost_until > 0 && world.time >= main_power_lost_until) + regainMainPower() + + if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) + regainBackupPower() + + else if(electrified_until > 0 && world.time >= electrified_until) + electrify(0) + + if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) + . = PROCESS_KILL + +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + SSradiation.radiate(src, rad_power) + last_event = world.time + ..() + +/obj/machinery/door/airlock/phoron + name = "Phoron Airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/Doorphoron.dmi' + mineral = "phoron" + +/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) + for(var/turf/simulated/floor/target_tile in range(2,loc)) + target_tile.assume_gas("phoron", 35, 400+T0C) + spawn (0) target_tile.hotspot_expose(temperature, 400) + for(var/turf/simulated/wall/W in range(3,src)) + W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame + for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) + D.ignite(temperature/4) + new/obj/structure/door_assembly( src.loc ) + qdel(src) + +/obj/machinery/door/airlock/sandstone + name = "Sandstone Airlock" + icon = 'icons/obj/doors/Doorsand.dmi' + mineral = "sandstone" + +/obj/machinery/door/airlock/science + name = "Research Airlock" + icon = 'icons/obj/doors/Doorsci.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_science + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_science + name = "Glass Airlocks" + icon = 'icons/obj/doors/Doorsciglass.dmi' + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_science + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/highsecurity + name = "Secure Airlock" + icon = 'icons/obj/doors/hightechsecurity.dmi' + explosion_resistance = 20 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/secure1o.ogg' + close_sound_powered = 'sound/machines/door/secure1c.ogg' + +/obj/machinery/door/airlock/voidcraft + name = "voidcraft hatch" + desc = "It's an extra resilient airlock intended for spacefaring vessels." + icon = 'icons/obj/doors/shuttledoors.dmi' + explosion_resistance = 20 + opacity = 0 + glass = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + +// Airlock opens from top-bottom instead of left-right. +/obj/machinery/door/airlock/voidcraft/vertical + icon = 'icons/obj/doors/shuttledoors_vertical.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + + +/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock + name = "Precursor Alpha Object - Doors" + desc = "This object appears to be used in order to restrict or allow access to \ + rooms based on its physical state. In other words, a door. \ + Despite being designed and created by unknown ancient alien hands, this door has \ + a large number of similarities to the conventional airlock, such as being driven by \ + electricity, opening and closing by physically moving, and being air tight. \ + It also operates by responding to signals through internal electrical conduits. \ + These characteristics make it possible for one with experience with a multitool \ + to manipulate the door.\ +

\ + The symbol on the door does not match any living species' patterns, giving further \ + implications that this door is very old, and yet it remains operational after \ + thousands of years. It is unknown if that is due to superb construction, or \ + unseen autonomous maintenance having been performed." + value = CATALOGUER_REWARD_EASY + +/obj/machinery/door/airlock/alien + name = "alien airlock" + desc = "You're fairly sure this is a door." + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) + icon = 'icons/obj/doors/Dooralien.dmi' + explosion_resistance = 20 + secured_wires = TRUE + hackProof = TRUE + assembly_type = /obj/structure/door_assembly/door_assembly_alien + req_one_access = list(access_alien) + +/obj/machinery/door/airlock/alien/locked + icon_state = "door_locked" + locked = TRUE + +/obj/machinery/door/airlock/alien/public // Entry to UFO. + req_one_access = list() + normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. + hackProof = TRUE //VOREStation Edit - No borgos + +/* +About the new airlock wires panel: +* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. +* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) +* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. +* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. +* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. +* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. +* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. +* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) +* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. +* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. +*/ + + + +/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite + if(!issilicon(usr)) + if(src.isElectrified()) + if(!src.justzap) + if(src.shock(user, 100)) + src.justzap = 1 + spawn (10) + src.justzap = 0 + return + else /*if(src.justzap)*/ + return + else if(user.hallucination > 50 && prob(10) && src.operating == 0) + to_chat(user, "You feel a powerful shock course through your body!") + user.halloss += 10 + user.stunned += 10 + return + ..(user) + +/obj/machinery/door/airlock/proc/isElectrified() + if(src.electrified_until != 0) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/canAIControl() + return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/canAIHack() + return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/arePowerSystemsOn() + if (stat & (NOPOWER|BROKEN)) + return 0 + return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) + +/obj/machinery/door/airlock/requiresID() + return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) + +/obj/machinery/door/airlock/proc/isAllPowerLoss() + if(stat & (NOPOWER|BROKEN)) + return 1 + if(mainPowerCablesCut() && backupPowerCablesCut()) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/mainPowerCablesCut() + return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) + +/obj/machinery/door/airlock/proc/backupPowerCablesCut() + return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) + +/obj/machinery/door/airlock/proc/loseMainPower() + main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running + if(backup_power_lost_until == -1 && !backupPowerCablesCut()) + backup_power_lost_until = world.time + SecondsToTicks(10) + + if(main_power_lost_until > 0 || backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/loseBackupPower() + backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + if(backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/regainMainPower() + if(!mainPowerCablesCut()) + main_power_lost_until = 0 + // If backup power is currently active then disable, otherwise let it count down and disable itself later + if(!backup_power_lost_until) + backup_power_lost_until = -1 + + update_icon() + +/obj/machinery/door/airlock/proc/regainBackupPower() + if(!backupPowerCablesCut()) + // Restore backup power only if main power is offline, otherwise permanently disable + backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 + + update_icon() + +/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) + message = text("The electrification wire is cut - Door permanently electrified.") + src.electrified_until = -1 + else if(duration && !arePowerSystemsOn()) + message = text("The door is unpowered - Cannot electrify the door.") + src.electrified_until = 0 + else if(!duration && electrified_until != 0) + message = "The door is now un-electrified." + src.electrified_until = 0 + else if(duration) //electrify door for the given duration seconds + if(usr) + shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") + add_attack_logs(usr,name,"Electrified a door") + else + shockedby += text("\[[time_stamp()]\] - EMP)") + message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." + src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + + if(electrified_until > 0) + START_MACHINE_PROCESSING(src) + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_IDSCAN)) + message = "The IdScan wire is cut - IdScan feature permanently disabled." + else if(activate && src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 0 + message = "IdScan feature has been enabled." + else if(!activate && !src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 1 + message = "IdScan feature has been disabled." + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) + var/message = "" + // Safeties! We don't need no stinking safeties! + if (wires.is_cut(WIRE_SAFETY)) + message = text("The safety wire is cut - Cannot enable safeties.") + else if (!activate && src.safe) + safe = 0 + else if (activate && !src.safe) + safe = 1 + + if(feedback && message) + to_chat(usr,message) + +// shock user with probability prb (if all connections & power are working) +// returns 1 if shocked, 0 otherwise +// The preceding comment was borrowed from the grille's shock script +/obj/machinery/door/airlock/shock(mob/user, prb) + if(!arePowerSystemsOn()) + return 0 + if(hasShocked) + return 0 //Already shocked someone recently? + if(..()) + hasShocked = 1 + sleep(10) + hasShocked = 0 + return 1 + else + return 0 + + +/obj/machinery/door/airlock/update_icon() + cut_overlays() + if(density) + if(locked && lights && src.arePowerSystemsOn()) + icon_state = "door_locked" + else + icon_state = "door_closed" + if(p_open || welded) + if(p_open) + add_overlay("panel_open") + if (!(stat & NOPOWER)) + if(stat & BROKEN) + add_overlay("sparks_broken") + else if (health < maxhealth * 3/4) + add_overlay("sparks_damaged") + if(welded) + add_overlay("welded") + else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) + add_overlay("sparks_damaged") + else + icon_state = "door_open" + if((stat & BROKEN) && !(stat & NOPOWER)) + add_overlay("sparks_open") + return + +/obj/machinery/door/airlock/do_animate(animation) + switch(animation) + if("opening") + cut_overlay() + if(p_open) + spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. + flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking + update_icon() + else + flick("door_opening", src)//[stat ? "_stat":] + update_icon() + if("closing") + cut_overlay() + if(p_open) + spawn(2) + flick("o_door_closing", src) + update_icon() + else + flick("door_closing", src) + update_icon() + if("spark") + if(density) + flick("door_spark", src) + if("deny") + if(density && src.arePowerSystemsOn()) + flick("door_deny", src) + playsound(src, denied_sound, 50, 0, 3) + return + +/obj/machinery/door/airlock/attack_ai(mob/user as mob) + tgui_interact(user) + +/obj/machinery/door/airlock/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiAirlock", name) + ui.open() + if(custom_state) + ui.set_state(custom_state) + return TRUE + +/obj/machinery/door/airlock/tgui_data(mob/user) + var/list/data = list() + + var/list/power = list() + power["main"] = main_power_lost_until > 0 ? 0 : 2 + power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) + power["backup"] = backup_power_lost_until > 0 ? 0 : 2 + power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) + data["power"] = power + + data["shock"] = (electrified_until == 0) ? 2 : 0 + data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) + data["id_scanner"] = !aiDisabledIdScanner + data["locked"] = locked // bolted + data["lights"] = lights // bolt lights + data["safe"] = safe // safeties + data["speed"] = normalspeed // safe speed + data["welded"] = welded // welded + data["opened"] = !density // opened + + var/list/wire = list() + wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) + wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) + wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) + wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) + wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) + wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) + wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) + wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) + wire["safe"] = !wires.is_cut(WIRE_SAFETY) + wire["timing"] = !wires.is_cut(WIRE_SPEED) + + data["wires"] = wire + return data + +/obj/machinery/door/airlock/proc/hack(mob/user as mob) + if(src.aiHacking==0) + src.aiHacking=1 + spawn(20) + //TODO: Make this take a minute + to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") + sleep(50) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") + sleep(20) + to_chat(user, "Attempting to hack into airlock. This may take some time.") + sleep(200) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Upload access confirmed. Loading control program into airlock software.") + sleep(170) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Transfer complete. Forcing airlock to execute program.") + sleep(50) + //disable blocked control + src.aiControlDisabled = 2 + to_chat(user, "Receiving control information from airlock.") + sleep(10) + //bring up airlock dialog + src.aiHacking = 0 + if (user) + src.attack_ai(user) + +/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) + if (src.isElectrified()) + if (istype(mover, /obj/item)) + var/obj/item/i = mover + if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return ..() + +/obj/machinery/door/airlock/attack_hand(mob/user as mob) + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 100)) + return + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + + if(src.p_open) + user.set_machine(src) + wires.Interact(user) + else + ..(user) + return + +/obj/machinery/door/airlock/tgui_act(action, params) + if(..()) + return TRUE + if(!user_allowed(usr)) + return TRUE + + switch(action) + if("disrupt-main") + if(!main_power_lost_until) + loseMainPower() + update_icon() + else + to_chat(usr, "Main power is already offline.") + . = TRUE + if("disrupt-backup") + if(!backup_power_lost_until) + loseBackupPower() + update_icon() + else + to_chat(usr, "Backup power is already offline.") + . = TRUE + if("shock-restore") + electrify(0, 1) + . = TRUE + if("shock-temp") + electrify(30, 1) + . = TRUE + if("shock-perm") + electrify(-1, 1) + . = TRUE + if("idscan-toggle") + set_idscan(aiDisabledIdScanner, 1) + . = TRUE + // if("emergency-toggle") + // toggle_emergency(usr) + // . = TRUE + if("bolt-toggle") + toggle_bolt(usr) + . = TRUE + if("light-toggle") + if(wires.is_cut(WIRE_BOLT_LIGHT)) + to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") + return + lights = !lights + update_icon() + . = TRUE + if("safe-toggle") + set_safeties(!safe, 1) + . = TRUE + if("speed-toggle") + if(wires.is_cut(WIRE_SPEED)) + to_chat(usr, "The timing wire is cut - Cannot alter timing.") + return + normalspeed = !normalspeed + . = TRUE + if("open-close") + user_toggle_open(usr) + . = TRUE + + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/user_allowed(mob/user) + var/allowed = (issilicon(user) && canAIControl(user)) + if(!allowed && isobserver(user)) + var/mob/observer/dead/D = user + if(D.can_admin_interact()) + allowed = TRUE + return allowed + +/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) + if(!user_allowed(user)) + return + if(wires.is_cut(WIRE_DOOR_BOLTS)) + to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") + return + if(locked) + if(!arePowerSystemsOn()) + to_chat(user, "The door has no power - you can't raise the door bolts.") + else + unlock() + to_chat(user, "The door bolts have been raised.") + // log_combat(user, src, "unbolted") + else + lock() + to_chat(user, "The door bolts have been dropped.") + // log_combat(user, src, "bolted") + +/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) + if(!user_allowed(user)) + return + if(welded) + to_chat(user, text("The airlock has been welded shut!")) + else if(locked) + to_chat(user, text("The door bolts are down!")) + else if(!density) + close() + else + open() + +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + +/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) + //to_world("airlock attackby src [src] obj [C] mob [user]") + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 75)) + return + if(istype(C, /obj/item/taperoll)) + return + + src.add_fingerprint(user) + if (attempt_vr(src,"attackby_vr",list(C, user))) return + if(istype(C, /mob/living)) + ..() + return + if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(0,user)) + if(!src.welded) + src.welded = 1 + else + src.welded = null + playsound(src, C.usesound, 75, 1) + src.update_icon() + return + else + return + else if(C.is_screwdriver()) + if (src.p_open) + if (stat & BROKEN) + to_chat(usr, "The panel is broken and cannot be closed.") + else + src.p_open = 0 + playsound(src, C.usesound, 50, 1) + else + src.p_open = 1 + playsound(src, C.usesound, 50, 1) + src.update_icon() + else if(C.is_wirecutter()) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/multitool)) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/assembly/signaler)) + return src.attack_hand(user) + else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE + var/obj/item/weapon/pai_cable/cable = C + cable.plugin(src, user) + else if(!repairing && C.is_crowbar()) + if(can_remove_electronics()) + playsound(src, C.usesound, 75, 1) + user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") + if(do_after(user,40 * C.toolspeed)) + to_chat(user, "You removed the airlock electronics!") + + var/obj/structure/door_assembly/da = new assembly_type(src.loc) + if (istype(da, /obj/structure/door_assembly/multi_tile)) + da.set_dir(src.dir) + + da.anchored = TRUE + if(mineral) + da.glass = mineral + //else if(glass) + else if(glass && !da.glass) + da.glass = 1 + da.state = 1 + da.created_name = src.name + da.update_state() + + if(operating == -1 || (stat & BROKEN)) + new /obj/item/weapon/circuitboard/broken(src.loc) + operating = 0 + else + if (!electronics) create_electronics() + + electronics.loc = src.loc + electronics = null + + qdel(src) + return + else if(arePowerSystemsOn()) + to_chat(user, "The airlock's motors resist your efforts to force it.") + else if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else + if(density) + spawn(0) open(1) + else + spawn(0) close(1) + + // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). + else if(istype(C, /obj/item/weapon)) + var/obj/item/weapon/W = C + if((W.pry == 1) && !arePowerSystemsOn()) + if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else if( !welded && !operating ) + if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + to_chat(user, "You need to be wielding \the [F] to do that.") + return + // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. + if(density) + spawn(0) + open(1) + else + spawn(0) + close(1) + else + ..() + else + ..() + return + +/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) + if(C) + ignite(is_hot(C)) + ..() + +/obj/machinery/door/airlock/set_broken() + src.p_open = 1 + stat |= BROKEN + if (secured_wires) + lock() + for (var/mob/O in viewers(src, null)) + if ((O.client && !( O.blinded ))) + O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + + update_icon() + return + +/obj/machinery/door/airlock/open(var/forced=0) + if(!can_open(forced)) + return 0 + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + + //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator + for(var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. + if(arePowerSystemsOn()) + sound = legacy_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else // Else, play these. + if(arePowerSystemsOn()) + sound = open_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + + if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) + src.closeOther.close() + return ..() + +/obj/machinery/door/airlock/can_open(var/forced=0) + if(!forced) + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + if(locked || welded) + return 0 + return ..() + +/obj/machinery/door/airlock/can_close(var/forced=0) + if(locked || welded) + return 0 + + if(!forced) + //despite the name, this wire is for general door control. + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + return ..() + +/atom/movable/proc/blocks_airlock() + return density + +/obj/machinery/door/blocks_airlock() + return 0 + +/obj/machinery/mech_sensor/blocks_airlock() + return 0 + +/mob/living/blocks_airlock() + return 1 + +/atom/movable/proc/airlock_crush(var/crush_damage) + return 0 + +/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) + . = ..() + health -= crush_damage + healthcheck() + +/obj/effect/energy_field/airlock_crush(var/crush_damage) + adjust_strength(crush_damage) + +/obj/structure/closet/airlock_crush(var/crush_damage) + ..() + damage(crush_damage) + for(var/atom/movable/AM in src) + AM.airlock_crush() + return 1 + +/mob/living/airlock_crush(var/crush_damage) + . = ..() + adjustBruteLoss(crush_damage) + SetStunned(5) + SetWeakened(5) + var/turf/T = get_turf(src) + T.add_blood(src) + return 1 + +/mob/living/carbon/airlock_crush(var/crush_damage) + . = ..() + if(can_feel_pain()) + emote("scream") + +/mob/living/silicon/robot/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + return 0 + +/obj/machinery/door/airlock/close(var/forced=0) + if(!can_close(forced)) + return 0 + + if(safe) + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.blocks_airlock()) + if(!has_beeped) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) + has_beeped = 1 + autoclose_in(6) + return + + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) + take_damage(DOOR_CRUSH_DAMAGE) + + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + has_beeped = 0 + for(var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) + if(arePowerSystemsOn()) + sound = legacy_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else + if(arePowerSystemsOn()) + sound = close_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + for(var/turf/turf in locs) + var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) + if(killthis) + killthis.ex_act(2)//Smashin windows + return ..() + +/obj/machinery/door/airlock/proc/lock(var/forced=0) + if(locked) + return 0 + + if (operating && !forced) return 0 + + src.locked = 1 + playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/unlock(var/forced=0) + if(!src.locked) + return + + if (!forced) + if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return + + src.locked = 0 + playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/allowed(mob/M) + if(locked) + return 0 + return ..(M) + +/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) + ..() + + //if assembly is given, create the new door from the assembly + if (assembly && istype(assembly)) + assembly_type = assembly.type + + electronics = assembly.electronics + electronics.loc = src + + //update the door's access to match the electronics' + secured_wires = electronics.secure + if(electronics.one_access) + LAZYCLEARLIST(req_access) + req_one_access = src.electronics.conf_access + else + LAZYCLEARLIST(req_one_access) + req_access = src.electronics.conf_access + + //get the name from the assembly + if(assembly.created_name) + name = assembly.created_name + else + name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + + //get the dir from the assembly + set_dir(assembly.dir) + + //wires + var/turf/T = get_turf(newloc) + if(T && (T.z in using_map.admin_levels)) + secured_wires = 1 + if (secured_wires) + wires = new/datum/wires/airlock/secure(src) + else + wires = new/datum/wires/airlock(src) + +/obj/machinery/door/airlock/Initialize() + if(src.closeOtherId != null) + for (var/obj/machinery/door/airlock/A in machines) + if(A.closeOtherId == src.closeOtherId && A != src) + src.closeOther = A + break + name = "\improper [name]" + . = ..() + +/obj/machinery/door/airlock/Destroy() + qdel(wires) + wires = null + return ..() + +// Most doors will never be deconstructed over the course of a round, +// so as an optimization defer the creation of electronics until +// the airlock is deconstructed +/obj/machinery/door/airlock/proc/create_electronics() + //create new electronics + if (secured_wires) + src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) + else + src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) + + //update the electronics to match the door's access + if(LAZYLEN(req_access)) + electronics.conf_access = req_access + else if (LAZYLEN(req_one_access)) + electronics.conf_access = req_one_access + electronics.one_access = 1 + +/obj/machinery/door/airlock/emp_act(var/severity) + if(prob(40/severity)) + var/duration = world.time + SecondsToTicks(30 / severity) + if(duration > electrified_until) + electrify(duration) + ..() + +/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason + ..() + if(stat & NOPOWER) + // If we lost power, disable electrification + // Keeping door lights on, runs on internal battery or something. + electrified_until = 0 + update_icon() + +/obj/machinery/door/airlock/proc/prison_open() + if(arePowerSystemsOn()) + src.unlock() + src.open() + src.lock() + return + + +/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + // Old RCD code made it cost 10 units to decon an airlock. + // Now the new one costs ten "sheets". + return list( + RCD_VALUE_MODE = RCD_DECONSTRUCT, + RCD_VALUE_DELAY = 5 SECONDS, + RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 + ) + return FALSE + +/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, span("notice", "You deconstruct \the [src].")) + qdel(src) + return TRUE + return FALSE +======= +//VOREStation Edit - Redone a lot of airlock things: +/* +- Specific department maintenance doors +- Named doors properly according to type +- Gave them default access levels with the access constants +- Improper'd all of the names in the new() +*/ + +/obj/machinery/door/airlock + name = "Airlock" + icon = 'icons/obj/doors/Doorint.dmi' + icon_state = "door_closed" + power_channel = ENVIRON + + explosion_resistance = 10 + + // Doors do their own stuff + bullet_vulnerability = 0 + + blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime + + var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + var/hackProof = 0 // if 1, this door can't be hacked by the AI + var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. + var/main_power_lost_until = 0 //World time when main power is restored. + var/backup_power_lost_until = -1 //World time when backup power is restored. + var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. + var/spawnPowerRestoreRunning = 0 + var/welded = null + var/locked = 0 + var/lights = 1 // bolt lights show by default + var/aiDisabledIdScanner = 0 + var/aiHacking = 0 + var/obj/machinery/door/airlock/closeOther = null + var/closeOtherId = null + var/lockdownbyai = 0 + autoclose = 1 + var/assembly_type = /obj/structure/door_assembly + var/mineral = null + var/justzap = 0 + var/safe = 1 + normalspeed = 1 + var/obj/item/weapon/airlock_electronics/electronics = null + var/hasShocked = 0 //Prevents multiple shocks from happening + var/secured_wires = 0 + var/datum/wires/airlock/wires = null + + var/open_sound_powered = 'sound/machines/door/covert1o.ogg' + var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' + var/close_sound_powered = 'sound/machines/door/covert1c.ogg' + var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' + var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' + var/department_open_powered = null + var/department_close_powered = null + var/denied_sound = 'sound/machines/deniedbeep.ogg' + var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' + var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' + +/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) + if(src.locked || src.welded) + visible_message("\The [user] begins breaking into \the [src] internals!") + user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. + if(do_after(user,10 SECONDS,src)) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + if(prob(25)) + src.shock(user, 100) + user.set_AI_busy(FALSE) + else if(src.density) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.locked || src.welded) + visible_message("\The [user] begins tearing into \the [src] internals!") + src.do_animate("deny") + if(do_after(user,15 SECONDS,src)) + visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") + src.do_animate("spark") + playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + src.set_broken() //These aren't emags, these be CLAWS + else if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 5 SECONDS,src)) + playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + src.do_animate("deny") + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/get_material() + if(mineral) + return get_material_by_name(mineral) + return get_material_by_name(MAT_STEEL) + +/obj/machinery/door/airlock/command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcom.dmi' + req_one_access = list(access_heads) + assembly_type = /obj/structure/door_assembly/door_assembly_com + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd3o.ogg' + department_close_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsec.dmi' + req_one_access = list(access_security) + assembly_type = /obj/structure/door_assembly/door_assembly_sec + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Dooreng.dmi' + req_one_access = list(access_engine) + assembly_type = /obj/structure/door_assembly/door_assembly_eng + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmos.dmi' + req_one_access = list(access_atmospherics) + assembly_type = /obj/structure/door_assembly/door_assembly_eat + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormed.dmi' + req_one_access = list(access_medical) + assembly_type = /obj/structure/door_assembly/door_assembly_med + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/maintenance + name = "Maintenance Access" + icon = 'icons/obj/doors/Doormaint.dmi' + //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access + assembly_type = /obj/structure/door_assembly/door_assembly_mai + open_sound_powered = 'sound/machines/door/door2o.ogg' + close_sound_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/cargo + icon = 'icons/obj/doors/Doormaint_cargo.dmi' + req_one_access = list(access_cargo) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/door2o.ogg' + department_close_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/command + icon = 'icons/obj/doors/Doormaint_command.dmi' + req_one_access = list(access_heads) + +/obj/machinery/door/airlock/maintenance/common + icon = 'icons/obj/doors/Doormaint_common.dmi' + open_sound_powered = 'sound/machines/door/hall3o.ogg' + close_sound_powered = 'sound/machines/door/hall3c.ogg' + +/obj/machinery/door/airlock/maintenance/engi + icon = 'icons/obj/doors/Doormaint_engi.dmi' + req_one_access = list(access_engine) + +/obj/machinery/door/airlock/maintenance/int + icon = 'icons/obj/doors/Doormaint_int.dmi' + +/obj/machinery/door/airlock/maintenance/medical + icon = 'icons/obj/doors/Doormaint_med.dmi' + req_one_access = list(access_medical) + +/obj/machinery/door/airlock/maintenance/rnd + icon = 'icons/obj/doors/Doormaint_rnd.dmi' + req_one_access = list(access_research) + +/obj/machinery/door/airlock/maintenance/sec + icon = 'icons/obj/doors/Doormaint_sec.dmi' + req_one_access = list(access_security) + +/obj/machinery/door/airlock/external + name = "External Airlock" + icon = 'icons/obj/doors/Doorext.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/external/bolted + icon_state = "door_locked" // So it looks visibly bolted in map editor + locked = 1 + +// For convenience in making docking ports: one that is pre-bolted with frequency set! +/obj/machinery/door/airlock/external/bolted/cycling + frequency = 1379 + +/obj/machinery/door/airlock/glass_external + name = "External Airlock" + icon = 'icons/obj/doors/Doorextglass.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + opacity = 0 + glass = 1 + req_one_access = list(access_external_airlocks) + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/glass + name = "Glass Airlock" + icon = 'icons/obj/doors/Doorglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + open_sound_powered = 'sound/machines/door/hall1o.ogg' + close_sound_powered = 'sound/machines/door/hall1c.ogg' + legacy_open_powered = 'sound/machines/door/windowdoor.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + glass = 1 + +/obj/machinery/door/airlock/centcom + name = "Centcom Airlock" + icon = 'icons/obj/doors/Doorele.dmi' + req_one_access = list(access_cent_general) + opacity = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/glass_centcom + name = "Airlock" + icon = 'icons/obj/doors/Dooreleglass.dmi' + opacity = 0 + glass = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/vault + name = "Vault" + icon = 'icons/obj/doors/vault.dmi' + explosion_resistance = 20 + opacity = 1 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/vault1o.ogg' + close_sound_powered = 'sound/machines/door/vault1c.ogg' + +/obj/machinery/door/airlock/vault/bolted + icon_state = "door_locked" + locked = 1 + +/obj/machinery/door/airlock/freezer + name = "Freezer Airlock" + icon = 'icons/obj/doors/Doorfreezer.dmi' + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/hatch + name = "Airtight Hatch" + icon = 'icons/obj/doors/Doorhatchele.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_hatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/maintenance_hatch + name = "Maintenance Hatch" + icon = 'icons/obj/doors/Doorhatchmaint2.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_mhatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/glass_command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcomglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_com + glass = 1 + req_one_access = list(access_heads) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd1o.ogg' + department_close_powered = 'sound/machines/door/cmd1c.ogg' + +/obj/machinery/door/airlock/glass_engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Doorengglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eng + glass = 1 + req_one_access = list(access_engine) + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eat + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsecglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_sec + glass = 1 + req_one_access = list(access_security) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/glass_medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormedglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_med + glass = 1 + req_one_access = list(access_medical) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doormining.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_min + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmo.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearch.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_research + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearchglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_research + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doorminingglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_min + glass = 1 + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/glass_atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/gold + name = "Gold Airlock" + icon = 'icons/obj/doors/Doorgold.dmi' + mineral = "gold" + +/obj/machinery/door/airlock/silver + name = "Silver Airlock" + icon = 'icons/obj/doors/Doorsilver.dmi' + mineral = "silver" + +/obj/machinery/door/airlock/diamond + name = "Diamond Airlock" + icon = 'icons/obj/doors/Doordiamond.dmi' + mineral = "diamond" + +/obj/machinery/door/airlock/uranium + name = "Uranium Airlock" + desc = "And they said I was crazy." + icon = 'icons/obj/doors/Dooruranium.dmi' + mineral = "uranium" + var/last_event = 0 + var/rad_power = 7.5 + +/obj/machinery/door/airlock/process() + // Deliberate no call to parent. + if(main_power_lost_until > 0 && world.time >= main_power_lost_until) + regainMainPower() + + if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) + regainBackupPower() + + else if(electrified_until > 0 && world.time >= electrified_until) + electrify(0) + + if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) + . = PROCESS_KILL + +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + SSradiation.radiate(src, rad_power) + last_event = world.time + ..() + +/obj/machinery/door/airlock/phoron + name = "Phoron Airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/Doorphoron.dmi' + mineral = "phoron" + +/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) + for(var/turf/simulated/floor/target_tile in range(2,loc)) + target_tile.assume_gas("phoron", 35, 400+T0C) + spawn (0) target_tile.hotspot_expose(temperature, 400) + for(var/turf/simulated/wall/W in range(3,src)) + W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame + for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) + D.ignite(temperature/4) + new/obj/structure/door_assembly( src.loc ) + qdel(src) + +/obj/machinery/door/airlock/sandstone + name = "Sandstone Airlock" + icon = 'icons/obj/doors/Doorsand.dmi' + mineral = "sandstone" + +/obj/machinery/door/airlock/science + name = "Research Airlock" + icon = 'icons/obj/doors/Doorsci.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_science + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_science + name = "Glass Airlocks" + icon = 'icons/obj/doors/Doorsciglass.dmi' + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_science + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/highsecurity + name = "Secure Airlock" + icon = 'icons/obj/doors/hightechsecurity.dmi' + explosion_resistance = 20 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/secure1o.ogg' + close_sound_powered = 'sound/machines/door/secure1c.ogg' + +/obj/machinery/door/airlock/voidcraft + name = "voidcraft hatch" + desc = "It's an extra resilient airlock intended for spacefaring vessels." + icon = 'icons/obj/doors/shuttledoors.dmi' + explosion_resistance = 20 + opacity = 0 + glass = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + +// Airlock opens from top-bottom instead of left-right. +/obj/machinery/door/airlock/voidcraft/vertical + icon = 'icons/obj/doors/shuttledoors_vertical.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + + +/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock + name = "Precursor Alpha Object - Doors" + desc = "This object appears to be used in order to restrict or allow access to \ + rooms based on its physical state. In other words, a door. \ + Despite being designed and created by unknown ancient alien hands, this door has \ + a large number of similarities to the conventional airlock, such as being driven by \ + electricity, opening and closing by physically moving, and being air tight. \ + It also operates by responding to signals through internal electrical conduits. \ + These characteristics make it possible for one with experience with a multitool \ + to manipulate the door.\ +

\ + The symbol on the door does not match any living species' patterns, giving further \ + implications that this door is very old, and yet it remains operational after \ + thousands of years. It is unknown if that is due to superb construction, or \ + unseen autonomous maintenance having been performed." + value = CATALOGUER_REWARD_EASY + +/obj/machinery/door/airlock/alien + name = "alien airlock" + desc = "You're fairly sure this is a door." + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) + icon = 'icons/obj/doors/Dooralien.dmi' + explosion_resistance = 20 + secured_wires = TRUE + hackProof = TRUE + assembly_type = /obj/structure/door_assembly/door_assembly_alien + req_one_access = list(access_alien) + +/obj/machinery/door/airlock/alien/locked + icon_state = "door_locked" + locked = TRUE + +/obj/machinery/door/airlock/alien/public // Entry to UFO. + req_one_access = list() + normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. + hackProof = TRUE //VOREStation Edit - No borgos + +/* +About the new airlock wires panel: +* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. +* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) +* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. +* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. +* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. +* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. +* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. +* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) +* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. +* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. +*/ + + + +/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite + if(!issilicon(usr)) + if(src.isElectrified()) + if(!src.justzap) + if(src.shock(user, 100)) + src.justzap = 1 + spawn (10) + src.justzap = 0 + return + else /*if(src.justzap)*/ + return + else if(user.hallucination > 50 && prob(10) && src.operating == 0) + to_chat(user, "You feel a powerful shock course through your body!") + user.halloss += 10 + user.stunned += 10 + return + ..(user) + +/obj/machinery/door/airlock/proc/isElectrified() + if(src.electrified_until != 0) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/canAIControl() + return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/canAIHack() + return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/arePowerSystemsOn() + if (stat & (NOPOWER|BROKEN)) + return 0 + return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) + +/obj/machinery/door/airlock/requiresID() + return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) + +/obj/machinery/door/airlock/proc/isAllPowerLoss() + if(stat & (NOPOWER|BROKEN)) + return 1 + if(mainPowerCablesCut() && backupPowerCablesCut()) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/mainPowerCablesCut() + return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) + +/obj/machinery/door/airlock/proc/backupPowerCablesCut() + return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) + +/obj/machinery/door/airlock/proc/loseMainPower() + main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running + if(backup_power_lost_until == -1 && !backupPowerCablesCut()) + backup_power_lost_until = world.time + SecondsToTicks(10) + + if(main_power_lost_until > 0 || backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/loseBackupPower() + backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + if(backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/regainMainPower() + if(!mainPowerCablesCut()) + main_power_lost_until = 0 + // If backup power is currently active then disable, otherwise let it count down and disable itself later + if(!backup_power_lost_until) + backup_power_lost_until = -1 + + update_icon() + +/obj/machinery/door/airlock/proc/regainBackupPower() + if(!backupPowerCablesCut()) + // Restore backup power only if main power is offline, otherwise permanently disable + backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 + + update_icon() + +/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) + message = text("The electrification wire is cut - Door permanently electrified.") + src.electrified_until = -1 + else if(duration && !arePowerSystemsOn()) + message = text("The door is unpowered - Cannot electrify the door.") + src.electrified_until = 0 + else if(!duration && electrified_until != 0) + message = "The door is now un-electrified." + src.electrified_until = 0 + else if(duration) //electrify door for the given duration seconds + if(usr) + shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") + add_attack_logs(usr,name,"Electrified a door") + else + shockedby += text("\[[time_stamp()]\] - EMP)") + message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." + src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + + if(electrified_until > 0) + START_MACHINE_PROCESSING(src) + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_IDSCAN)) + message = "The IdScan wire is cut - IdScan feature permanently disabled." + else if(activate && src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 0 + message = "IdScan feature has been enabled." + else if(!activate && !src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 1 + message = "IdScan feature has been disabled." + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) + var/message = "" + // Safeties! We don't need no stinking safeties! + if (wires.is_cut(WIRE_SAFETY)) + message = text("The safety wire is cut - Cannot enable safeties.") + else if (!activate && src.safe) + safe = 0 + else if (activate && !src.safe) + safe = 1 + + if(feedback && message) + to_chat(usr,message) + +// shock user with probability prb (if all connections & power are working) +// returns 1 if shocked, 0 otherwise +// The preceding comment was borrowed from the grille's shock script +/obj/machinery/door/airlock/shock(mob/user, prb) + if(!arePowerSystemsOn()) + return 0 + if(hasShocked) + return 0 //Already shocked someone recently? + if(..()) + hasShocked = 1 + sleep(10) + hasShocked = 0 + return 1 + else + return 0 + + +/obj/machinery/door/airlock/update_icon() + cut_overlays() + if(density) + if(locked && lights && src.arePowerSystemsOn()) + icon_state = "door_locked" + else + icon_state = "door_closed" + if(p_open || welded) + if(p_open) + add_overlay("panel_open") + if (!(stat & NOPOWER)) + if(stat & BROKEN) + add_overlay("sparks_broken") + else if (health < maxhealth * 3/4) + add_overlay("sparks_damaged") + if(welded) + add_overlay("welded") + else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) + add_overlay("sparks_damaged") + else + icon_state = "door_open" + if((stat & BROKEN) && !(stat & NOPOWER)) + add_overlay("sparks_open") + return + +/obj/machinery/door/airlock/do_animate(animation) + switch(animation) + if("opening") + cut_overlay() + if(p_open) + spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. + flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking + update_icon() + else + flick("door_opening", src)//[stat ? "_stat":] + update_icon() + if("closing") + cut_overlay() + if(p_open) + spawn(2) + flick("o_door_closing", src) + update_icon() + else + flick("door_closing", src) + update_icon() + if("spark") + if(density) + flick("door_spark", src) + if("deny") + if(density && src.arePowerSystemsOn()) + flick("door_deny", src) + playsound(src, denied_sound, 50, 0, 3) + return + +/obj/machinery/door/airlock/attack_ai(mob/user as mob) + tgui_interact(user) + +/obj/machinery/door/airlock/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiAirlock", name) + ui.open() + if(custom_state) + ui.set_state(custom_state) + return TRUE + +/obj/machinery/door/airlock/tgui_data(mob/user) + var/list/data = list() + + var/list/power = list() + power["main"] = main_power_lost_until > 0 ? 0 : 2 + power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) + power["backup"] = backup_power_lost_until > 0 ? 0 : 2 + power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) + data["power"] = power + + data["shock"] = (electrified_until == 0) ? 2 : 0 + data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) + data["id_scanner"] = !aiDisabledIdScanner + data["locked"] = locked // bolted + data["lights"] = lights // bolt lights + data["safe"] = safe // safeties + data["speed"] = normalspeed // safe speed + data["welded"] = welded // welded + data["opened"] = !density // opened + + var/list/wire = list() + wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) + wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) + wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) + wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) + wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) + wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) + wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) + wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) + wire["safe"] = !wires.is_cut(WIRE_SAFETY) + wire["timing"] = !wires.is_cut(WIRE_SPEED) + + data["wires"] = wire + return data + +/obj/machinery/door/airlock/proc/hack(mob/user as mob) + if(src.aiHacking==0) + src.aiHacking=1 + spawn(20) + //TODO: Make this take a minute + to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") + sleep(50) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") + sleep(20) + to_chat(user, "Attempting to hack into airlock. This may take some time.") + sleep(200) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Upload access confirmed. Loading control program into airlock software.") + sleep(170) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Transfer complete. Forcing airlock to execute program.") + sleep(50) + //disable blocked control + src.aiControlDisabled = 2 + to_chat(user, "Receiving control information from airlock.") + sleep(10) + //bring up airlock dialog + src.aiHacking = 0 + if (user) + src.attack_ai(user) + +/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) + if (src.isElectrified()) + if (istype(mover, /obj/item)) + var/obj/item/i = mover + if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return ..() + +/obj/machinery/door/airlock/attack_hand(mob/user as mob) + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 100)) + return + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + + if(src.p_open) + user.set_machine(src) + wires.Interact(user) + else + ..(user) + return + +/obj/machinery/door/airlock/tgui_act(action, params) + if(..()) + return TRUE + if(!user_allowed(usr)) + return TRUE + + switch(action) + if("disrupt-main") + if(!main_power_lost_until) + loseMainPower() + update_icon() + else + to_chat(usr, "Main power is already offline.") + . = TRUE + if("disrupt-backup") + if(!backup_power_lost_until) + loseBackupPower() + update_icon() + else + to_chat(usr, "Backup power is already offline.") + . = TRUE + if("shock-restore") + electrify(0, 1) + . = TRUE + if("shock-temp") + electrify(30, 1) + . = TRUE + if("shock-perm") + electrify(-1, 1) + . = TRUE + if("idscan-toggle") + set_idscan(aiDisabledIdScanner, 1) + . = TRUE + // if("emergency-toggle") + // toggle_emergency(usr) + // . = TRUE + if("bolt-toggle") + toggle_bolt(usr) + . = TRUE + if("light-toggle") + if(wires.is_cut(WIRE_BOLT_LIGHT)) + to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") + return + lights = !lights + update_icon() + . = TRUE + if("safe-toggle") + set_safeties(!safe, 1) + . = TRUE + if("speed-toggle") + if(wires.is_cut(WIRE_SPEED)) + to_chat(usr, "The timing wire is cut - Cannot alter timing.") + return + normalspeed = !normalspeed + . = TRUE + if("open-close") + user_toggle_open(usr) + . = TRUE + + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/user_allowed(mob/user) + var/allowed = (issilicon(user) && canAIControl(user)) + if(!allowed && isobserver(user)) + var/mob/observer/dead/D = user + if(D.can_admin_interact()) + allowed = TRUE + return allowed + +/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) + if(!user_allowed(user)) + return + if(wires.is_cut(WIRE_DOOR_BOLTS)) + to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") + return + if(locked) + if(!arePowerSystemsOn()) + to_chat(user, "The door has no power - you can't raise the door bolts.") + else + unlock() + to_chat(user, "The door bolts have been raised.") + // log_combat(user, src, "unbolted") + else + lock() + to_chat(user, "The door bolts have been dropped.") + // log_combat(user, src, "bolted") + +/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) + if(!user_allowed(user)) + return + if(welded) + to_chat(user, text("The airlock has been welded shut!")) + else if(locked) + to_chat(user, text("The door bolts are down!")) + else if(!density) + close() + else + open() + +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + +/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) + //to_world("airlock attackby src [src] obj [C] mob [user]") + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 75)) + return + if(istype(C, /obj/item/taperoll)) + return + + src.add_fingerprint(user) + if (attempt_vr(src,"attackby_vr",list(C, user))) return + if(istype(C, /mob/living)) + ..() + return + if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(0,user)) + if(!src.welded) + src.welded = 1 + else + src.welded = null + playsound(src, C.usesound, 75, 1) + src.update_icon() + return + else + return + else if(C.is_screwdriver()) + if (src.p_open) + if (stat & BROKEN) + to_chat(usr, "The panel is broken and cannot be closed.") + else + src.p_open = 0 + playsound(src, C.usesound, 50, 1) + else + src.p_open = 1 + playsound(src, C.usesound, 50, 1) + src.update_icon() + else if(C.is_wirecutter()) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/multitool)) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/assembly/signaler)) + return src.attack_hand(user) + else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE + var/obj/item/weapon/pai_cable/cable = C + cable.plugin(src, user) + else if(!repairing && C.is_crowbar()) + if(can_remove_electronics()) + playsound(src, C.usesound, 75, 1) + user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") + if(do_after(user,40 * C.toolspeed)) + to_chat(user, "You removed the airlock electronics!") + + var/obj/structure/door_assembly/da = new assembly_type(src.loc) + if (istype(da, /obj/structure/door_assembly/multi_tile)) + da.set_dir(src.dir) + + da.anchored = TRUE + if(mineral) + da.glass = mineral + //else if(glass) + else if(glass && !da.glass) + da.glass = 1 + da.state = 1 + da.created_name = src.name + da.update_state() + + if(operating == -1 || (stat & BROKEN)) + new /obj/item/weapon/circuitboard/broken(src.loc) + operating = 0 + else + if (!electronics) create_electronics() + + electronics.loc = src.loc + electronics = null + + qdel(src) + return + else if(arePowerSystemsOn()) + to_chat(user, "The airlock's motors resist your efforts to force it.") + else if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else + if(density) + spawn(0) open(1) + else + spawn(0) close(1) + + // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). + else if(istype(C, /obj/item/weapon)) + var/obj/item/weapon/W = C + if((W.pry == 1) && !arePowerSystemsOn()) + if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else if( !welded && !operating ) + if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + to_chat(user, "You need to be wielding \the [F] to do that.") + return + // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. + if(density) + spawn(0) + open(1) + else + spawn(0) + close(1) + else + ..() + else + ..() + return + +/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) + if(C) + ignite(is_hot(C)) + ..() + +/obj/machinery/door/airlock/set_broken() + src.p_open = 1 + stat |= BROKEN + if (secured_wires) + lock() + for (var/mob/O in viewers(src, null)) + if ((O.client && !( O.blinded ))) + O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + + update_icon() + return + +/obj/machinery/door/airlock/open(var/forced=0) + if(!can_open(forced)) + return 0 + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + + //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator + for(var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. + if(arePowerSystemsOn()) + sound = legacy_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else // Else, play these. + if(arePowerSystemsOn()) + sound = open_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + + if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) + src.closeOther.close() + return ..() + +/obj/machinery/door/airlock/can_open(var/forced=0) + if(!forced) + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + if(locked || welded) + return 0 + return ..() + +/obj/machinery/door/airlock/can_close(var/forced=0) + if(locked || welded) + return 0 + + if(!forced) + //despite the name, this wire is for general door control. + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + return ..() + +/atom/movable/proc/blocks_airlock() + return density + +/obj/machinery/door/blocks_airlock() + return 0 + +/obj/machinery/mech_sensor/blocks_airlock() + return 0 + +/mob/living/blocks_airlock() + return 1 + +/atom/movable/proc/airlock_crush(var/crush_damage) + return 0 + +/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) + . = ..() + health -= crush_damage + healthcheck() + +/obj/effect/energy_field/airlock_crush(var/crush_damage) + adjust_strength(crush_damage) + +/obj/structure/closet/airlock_crush(var/crush_damage) + ..() + damage(crush_damage) + for(var/atom/movable/AM in src) + AM.airlock_crush() + return 1 + +/mob/living/airlock_crush(var/crush_damage) + . = ..() + adjustBruteLoss(crush_damage) + SetStunned(5) + SetWeakened(5) + var/turf/T = get_turf(src) + T.add_blood(src) + return 1 + +/mob/living/carbon/airlock_crush(var/crush_damage) + . = ..() + if(can_feel_pain()) + emote("scream") + +/mob/living/silicon/robot/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + return 0 + +/obj/machinery/door/airlock/close(var/forced=0) + if(!can_close(forced)) + return 0 + + if(safe) + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.blocks_airlock()) + if(!has_beeped) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) + has_beeped = 1 + autoclose_in(6) + return + + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) + take_damage(DOOR_CRUSH_DAMAGE) + + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + has_beeped = 0 + for(var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) + if(arePowerSystemsOn()) + sound = legacy_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else + if(arePowerSystemsOn()) + sound = close_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + for(var/turf/turf in locs) + var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) + if(killthis) + killthis.ex_act(2)//Smashin windows + return ..() + +/obj/machinery/door/airlock/proc/lock(var/forced=0) + if(locked) + return 0 + + if (operating && !forced) return 0 + + src.locked = 1 + playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/unlock(var/forced=0) + if(!src.locked) + return + + if (!forced) + if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return + + src.locked = 0 + playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/allowed(mob/M) + if(locked) + return 0 + return ..(M) + +/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) + ..() + + //if assembly is given, create the new door from the assembly + if (assembly && istype(assembly)) + assembly_type = assembly.type + + electronics = assembly.electronics + electronics.loc = src + + //update the door's access to match the electronics' + secured_wires = electronics.secure + if(electronics.one_access) + LAZYCLEARLIST(req_access) + req_one_access = src.electronics.conf_access + else + LAZYCLEARLIST(req_one_access) + req_access = src.electronics.conf_access + + //get the name from the assembly + if(assembly.created_name) + name = assembly.created_name + else + name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + + //get the dir from the assembly + set_dir(assembly.dir) + + //wires + var/turf/T = get_turf(newloc) + if(T && (T.z in using_map.admin_levels)) + secured_wires = 1 + if (secured_wires) + wires = new/datum/wires/airlock/secure(src) + else + wires = new/datum/wires/airlock(src) + +/obj/machinery/door/airlock/Initialize() + if(src.closeOtherId != null) + for (var/obj/machinery/door/airlock/A in machines) + if(A.closeOtherId == src.closeOtherId && A != src) + src.closeOther = A + break + name = "\improper [name]" + . = ..() + +/obj/machinery/door/airlock/Destroy() + qdel(wires) + wires = null + return ..() + +// Most doors will never be deconstructed over the course of a round, +// so as an optimization defer the creation of electronics until +// the airlock is deconstructed +/obj/machinery/door/airlock/proc/create_electronics() + //create new electronics + if (secured_wires) + src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) + else + src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) + + //update the electronics to match the door's access + if(LAZYLEN(req_access)) + electronics.conf_access = req_access + else if (LAZYLEN(req_one_access)) + electronics.conf_access = req_one_access + electronics.one_access = 1 + +/obj/machinery/door/airlock/emp_act(var/severity) + if(prob(40/severity)) + var/duration = world.time + SecondsToTicks(30 / severity) + if(duration > electrified_until) + electrify(duration) + ..() + +/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason + ..() + if(stat & NOPOWER) + // If we lost power, disable electrification + // Keeping door lights on, runs on internal battery or something. + electrified_until = 0 + update_icon() + +/obj/machinery/door/airlock/proc/prison_open() + if(arePowerSystemsOn()) + src.unlock() + src.open() + src.lock() + return + + +/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + // Old RCD code made it cost 10 units to decon an airlock. + // Now the new one costs ten "sheets". + return list( + RCD_VALUE_MODE = RCD_DECONSTRUCT, + RCD_VALUE_DELAY = 5 SECONDS, + RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 + ) + return FALSE + +/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, span("notice", "You deconstruct \the [src].")) + qdel(src) + return TRUE + return FALSE +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 0cc5868762..b42de46ee4 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -203,6 +203,7 @@ layer = ABOVE_TURF_LAYER+0.01 light_range = NODERANGE light_on = TRUE + light_color = "#673972" var/node_range = NODERANGE var/set_color = "#321D37" @@ -421,4 +422,135 @@ visible_message("[src.target] begins to crumble under the acid!") spawn(rand(150, 200)) tick() +<<<<<<< HEAD //CHOMPedit old eggs removed +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +/* + * Egg + */ +/var/const //for the status var + BURST = 0 + BURSTING = 1 + GROWING = 2 + GROWN = 3 + + MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger + MAX_GROWTH_TIME = 3000 + +/obj/effect/alien/egg + desc = "It looks like a weird egg" + name = "egg" +// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not. + icon_state = "egg" + density = FALSE + anchored = TRUE + + var/health = 100 + var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive + +/obj/effect/alien/egg/New() +/* + if(config.aliens_allowed) + ..() + spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) + Grow() + else + qdel(src) +*/ +/obj/effect/alien/egg/attack_hand(user as mob) + + var/mob/living/carbon/M = user + if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) + return attack_hand(user) + + switch(status) + if(BURST) + to_chat(user, "You clear the hatched egg.") + qdel(src) + return +/* if(GROWING) + to_chat(user, "The child is not developed yet.") + return + if(GROWN) + to_chat(user, "You retrieve the child.") + Burst(0) + return + +/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit. + return locate(/obj/item/clothing/mask/facehugger) in contents + +/obj/effect/alien/egg/proc/Grow() + icon_state = "egg" +// status = GROWN + status = BURST +// new /obj/item/clothing/mask/facehugger(src) + return +*/ +/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining + if(status == GROWN || status == GROWING) +// var/obj/item/clothing/mask/facehugger/child = GetFacehugger() + icon_state = "egg_hatched" +/* flick("egg_opening", src) + status = BURSTING + spawn(15) + status = BURST + child.loc = get_turf(src) + + if(kill && istype(child)) + child.Die() + else + for(var/mob/M in range(1,src)) + if(CanHug(M)) + child.Attach(M) + break +*/ +/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + user.do_attack_animation(src) + health -= damage + healthcheck() + return + +/obj/effect/alien/egg/take_damage(var/damage) + health -= damage + healthcheck() + return + + +/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) + if(health <= 0) + return + if(LAZYLEN(W.attack_verb)) + src.visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + else + src.visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") + var/damage = W.force / 4.0 + + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + + if(WT.remove_fuel(0, user)) + damage = 15 + playsound(src, 'sound/items/Welder.ogg', 100, 1) + + src.health -= damage + src.healthcheck() + + +/obj/effect/alien/egg/proc/healthcheck() + if(health <= 0) + Burst() + +/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 500 + T0C) + health -= 5 + healthcheck() +======= +//Xenomorph Effect egg removed, replaced with Structure Egg. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/code/game/objects/structures/alien/alien egg.dm b/code/game/objects/structures/alien/alien egg.dm new file mode 100644 index 0000000000..90319e8a83 --- /dev/null +++ b/code/game/objects/structures/alien/alien egg.dm @@ -0,0 +1,96 @@ +#define MAX_PROGRESS 100 + +/obj/structure/alien/egg //Gurg Addition, working alien egg structure. + desc = "It looks like a weird egg." + name = "egg" + icon_state = "egg_growing" + density = 0 + anchored = 1 + var/progress = 0 + +/obj/structure/alien/egg/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + +/obj/structure/alien/egg/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/obj/structure/alien/egg/CanUseTopic(var/mob/user) + return isobserver(user) ? STATUS_INTERACTIVE : STATUS_CLOSE + +/obj/structure/alien/egg/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["spawn"]) + attack_ghost(usr) + +/obj/structure/alien/egg/process() + progress++ + if(progress >= MAX_PROGRESS) + for(var/mob/observer/dead/O in observer_mob_list) + if(O.client) + to_chat(O, "An alien is ready to hatch at [get_area(src.loc)]! (spawn)") + STOP_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/alien/egg/update_icon() + if(progress == -1) + icon_state = "egg_hatched" + else if(progress < MAX_PROGRESS) + icon_state = "egg_growing" + else + icon_state = "egg" + +/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user) + if(progress == -1) //Egg has been hatched. + return + + if(progress < MAX_PROGRESS) + to_chat(user, "\The [src] has not yet matured.") + return + + if(!user.MayRespawn(1)) + return + + // Check for bans properly. + if(jobban_isbanned(user, "Xenomorph")) + to_chat(user, "You are banned from playing a Xenomorph.") + return + + var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") + + if(!src || confirm != "Yes") + return + + if(!user || !user.ckey) + return + + if(progress == -1) //Egg has been hatched. + to_chat(user, "Too slow...") + return + + flick("egg_opening",src) + progress = -1 // No harvesting pls. + sleep(5) + + if(!src || !user) + visible_message("\The [src] writhes with internal motion, but nothing comes out.") + progress = MAX_PROGRESS // Someone else can have a go. + return // What a pain. + + // Create the mob, transfer over key. + var/mob/living/carbon/alien/larva/larva = new(get_turf(src)) + larva.ckey = user.ckey + spawn(-1) + if(user) qdel(user) // Remove the keyless ghost if it exists. + + visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!") + + // Turn us into a hatched egg. + name = "hatched alien egg" + desc += " This one has hatched." + update_icon() + +#undef MAX_PROGRESS diff --git a/code/game/objects/structures/alien/alien.dm b/code/game/objects/structures/alien/alien.dm new file mode 100644 index 0000000000..31a609e5a5 --- /dev/null +++ b/code/game/objects/structures/alien/alien.dm @@ -0,0 +1,62 @@ +/obj/structure/alien //Gurg Addition, framework for alien eggs. + name = "alien thing" + desc = "There's something alien about this." + icon = 'icons/mob/alien.dmi' + layer = ABOVE_JUNK_LAYER + var/health = 50 + +/obj/structure/alien/proc/healthcheck() + if(health <=0) + set_density(0) + qdel(src) + return + +/obj/structure/alien/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + ..() + healthcheck() + return + +/obj/structure/alien/ex_act(severity) + switch(severity) + if(1.0) + health-=50 + if(2.0) + health-=50 + if(3.0) + if (prob(50)) + health-=50 + else + health-=25 + healthcheck() + return + +/obj/structure/alien/hitby(AM as mob|obj) + ..() + visible_message("\The [src] was hit by \the [AM].") + var/tforce = 0 + if(ismob(AM)) + tforce = 10 + else + tforce = AM:throwforce + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + health = max(0, health - tforce) + healthcheck() + ..() + return + +/obj/structure/alien/attack_generic() + attack_hand(usr) + +/obj/structure/alien/attackby(var/obj/item/weapon/W, var/mob/user) + health = max(0, health - W.force) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + healthcheck() + ..() + return + +/obj/structure/alien/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 0 + if(istype(mover) && mover.checkpass(PASSGLASS)) + return !opacity + return !density diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index a90553b2e5..3bd95ddf7f 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -43,10 +43,18 @@ /mob/living/carbon/alien/u_equip(obj/item/W as obj) return +<<<<<<< HEAD /*/mob/living/carbon/alien/Stat() //CHOMPedit. Commented out because this doesn't work properly for larva, when it should. Will probably give Diona their own kind of they don't have one ..() stat(null, "Progress: [amount_grown]/[max_grown]") */ +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +/mob/living/carbon/alien/Stat() + ..() + stat(null, "Progress: [amount_grown]/[max_grown]") + +======= +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /mob/living/carbon/alien/restrained() return 0 diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index 1fd40b4311..6a8d0864f4 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -1,3 +1,8 @@ +/mob/living/carbon/alien/diona/Stat() //Specified where progression is at, doesn't work right for some things in carbon/alien + . = ..() + if(. && statpanel("Status")) + stat("Growth", "[round(amount_grown)]/[max_grown]") + /mob/living/carbon/alien/diona/confirm_evolution() if(!is_alien_whitelisted(src, GLOB.all_species[SPECIES_DIONA])) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 6582b5f6a8..18c5c34c7f 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -5,10 +5,23 @@ speak_emote = list("hisses") icon_state = "larva" language = "Hivemind" +<<<<<<< HEAD maxHealth = 50 //CHOMPedit. Larva can gain a little more health on weeds/phoron to make them just a little harder to kill health = 25 +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + maxHealth = 25 + health = 25 +======= + maxHealth = 50 + health = 50 +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul faction = "xeno" +<<<<<<< HEAD max_grown = 325 //CHOMPedit. Since xenos can reproduce without people now I decided to drastically increase the growth time +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +======= + max_grown = 325 //Increase larva growth time due to not needing hosts. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /mob/living/carbon/alien/larva/Initialize() . = ..() diff --git a/code/modules/mob/living/carbon/alien/larva/progression.dm b/code/modules/mob/living/carbon/alien/larva/progression.dm index 21cd101f50..9be7ef6b9e 100644 --- a/code/modules/mob/living/carbon/alien/larva/progression.dm +++ b/code/modules/mob/living/carbon/alien/larva/progression.dm @@ -1,8 +1,17 @@ +<<<<<<< HEAD /mob/living/carbon/alien/larva/Stat() //CHOMPedit. Oh thank god we can see how close we are to full grown now . = ..() if(. && statpanel("Status")) stat("Growth", "[round(amount_grown)]/[max_grown]") +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +======= +/mob/living/carbon/alien/larva/Stat() //Specified where progression stats come from, because for some reason it doesn't work right in carbon/alien + . = ..() + if(. && statpanel("Status")) + stat("Growth", "[round(amount_grown)]/[max_grown]") + +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /mob/living/carbon/alien/larva/confirm_evolution() to_chat(src, "You are growing into a beautiful alien! It is time to choose a caste.") diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 7eee938239..acc045e9e4 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -28,7 +28,13 @@ var/rads = radiation/25 radiation -= rads +<<<<<<< HEAD /*adjust_nutrition(rads)*/ //CHOMPedit. Commented out to prevent xeno/diona obesity, it was a real problem +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + adjust_nutrition(rads) +======= + //adjust_nutrition(rads) //Commented out to prevent alien obesity. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul heal_overall_damage(rads,rads) adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 3b38201206..5e2aaafb8e 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -64,11 +64,11 @@ /datum/unarmed_attack/claws/strong/xeno attack_verb = list("slashed", "gouged", "stabbed") - damage = 10 + damage = 15 /datum/unarmed_attack/claws/strong/xeno/queen attack_verb = list("slashed", "gouged", "stabbed", "gored") - damage = 15 + damage = 20 /datum/unarmed_attack/bite/strong attack_name = "strong bite" @@ -77,7 +77,7 @@ shredding = 1 /datum/unarmed_attack/bite/strong/xeno - damage = 10 + damage = 15 /datum/unarmed_attack/slime_glomp attack_name = "glomp" diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm deleted file mode 100644 index 88efb6d355..0000000000 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_embryo.dm +++ /dev/null @@ -1,161 +0,0 @@ -// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability -// It functions almost identically (see code/datums/diseases/alien_embryo.dm) - -/* -/obj/item/alien_embryo //Commented out as reference for future reproduction methods, or addition later. - name = "alien embryo" - desc = "All slimy and yuck." - icon = 'icons/mob/alien.dmi' - icon_state = "larva0_dead" - var/mob/living/affected_mob - var/stage = 0 - -/obj/item/alien_embryo/New() - if(istype(loc, /mob/living)) - affected_mob = loc - START_PROCESSING(SSobj, src) - spawn(0) - AddInfectionImages(affected_mob) - else - qdel(src) - -/obj/item/alien_embryo/Destroy() - if(affected_mob) - affected_mob.status_flags &= ~(XENO_HOST) - spawn(0) - RemoveInfectionImages(affected_mob) - ..() - -/obj/item/alien_embryo/process() - if(!affected_mob) return - if(loc != affected_mob) - affected_mob.status_flags &= ~(XENO_HOST) - STOP_PROCESSING(SSobj, src) - spawn(0) - RemoveInfectionImages(affected_mob) - affected_mob = null - return - - if(stage < 5 && prob(3)) - stage++ - spawn(0) - RefreshInfectionImage(affected_mob) - - switch(stage) - if(2, 3) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(1)) - to_chat(affected_mob, "Your throat feels sore.") - if(prob(1)) - to_chat(affected_mob, "Mucous runs down the back of your throat.") - if(4) - if(prob(1)) - affected_mob.emote("sneeze") - if(prob(1)) - affected_mob.emote("cough") - if(prob(2)) - to_chat(affected_mob, " Your muscles ache.") - if(prob(20)) - affected_mob.take_organ_damage(1) - if(prob(2)) - to_chat(affected_mob, "Your stomach hurts.") - if(prob(20)) - affected_mob.adjustToxLoss(1) - affected_mob.updatehealth() - if(5) - to_chat(affected_mob, "You feel something tearing its way out of your stomach...") - affected_mob.adjustToxLoss(10) - affected_mob.updatehealth() - if(prob(50)) - AttemptGrow() - -/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1) - var/list/candidates = get_alien_candidates() - var/picked = null - - // To stop clientless larva, we will check that our host has a client - // if we find no ghosts to become the alien. If the host has a client - // he will become the alien but if he doesn't then we will set the stage - // to 2, so we don't do a process heavy check everytime. - - if(candidates.len) - picked = pick(candidates) - else if(affected_mob.client) - picked = affected_mob.key - else - stage = 4 // Let's try again later. - return - - if(affected_mob.lying) - affected_mob.add_overlay("burst_lie") - else - affected_mob.add_overlay("burst_stand") - spawn(6) - var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc) - new_xeno.key = picked - new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention - if(gib_on_success) - affected_mob.gib() - qdel(src) - -/*---------------------------------------- -Proc: RefreshInfectionImage() -Des: Removes all infection images from aliens and places an infection image on all infected mobs for aliens. -----------------------------------------*/ -/obj/item/alien_embryo/proc/RefreshInfectionImage() - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - for(var/image/I in alien.client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - for(var/mob/living/L in mob_list) - if(iscorgi(L) || iscarbon(L)) - if(L.status_flags & XENO_HOST) - var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[stage]") - alien.client.images += I - -/*---------------------------------------- -Proc: AddInfectionImages(C) -Des: Checks if the passed mob (C) is infected with the alien egg, then gives each alien client an infected image at C. -----------------------------------------*/ -/obj/item/alien_embryo/proc/AddInfectionImages(var/mob/living/C) - if(C) - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - if(C.status_flags & XENO_HOST) - var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[stage]") - alien.client.images += I - -/*---------------------------------------- -Proc: RemoveInfectionImage(C) -Des: Removes the alien infection image from all aliens in the world located in passed mob (C). -----------------------------------------*/ - -/obj/item/alien_embryo/proc/RemoveInfectionImages(var/mob/living/C) - - if(C) - - for(var/mob/living/carbon/alien in player_list) - - if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs) - continue - - if(alien.client) - for(var/image/I in alien.client.images) - if(I.loc == C) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) -*/ diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 262c5bd732..142d91fb13 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -79,8 +79,16 @@ // Queen verbs. /mob/living/carbon/human/proc/lay_egg() +<<<<<<< HEAD set name = "Lay Egg (200)" //CHOMPedit changed number value set desc = "Lay an egg that hatch into larva." //CHOMPedit +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + set name = "Lay Egg (75)" + set desc = "Lay an egg to produce huggers to impregnate prey with." +======= + set name = "Lay Egg (200)" + set desc = "Lay an egg to produce huggers to impregnate prey with." +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul set category = "Abilities" if(!config.aliens_allowed) @@ -88,13 +96,31 @@ verbs -= /mob/living/carbon/human/proc/lay_egg return +<<<<<<< HEAD if(locate(/obj/structure/alien/egg) in get_turf(src)) //CHOMPedit. Changed from obj/effect to obj/structure +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + if(locate(/obj/effect/alien/egg) in get_turf(src)) +======= + if(locate(/obj/structure/alien/egg) in get_turf(src)) +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul to_chat(src, "There's already an egg here.") return +<<<<<<< HEAD if(check_alien_ability(200,1,O_EGG)) //CHOMPedit changed plasma cost from 75 to 200 +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + if(check_alien_ability(75,1,O_EGG)) +======= + if(check_alien_ability(200,1,O_EGG)) +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul visible_message("[src] has laid an egg!") +<<<<<<< HEAD new /obj/structure/alien/egg(loc) //CHOMPedit. Changed from obj/effect to obj/structure +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + new /obj/effect/alien/egg(loc) +======= + new /obj/structure/alien/egg(loc) +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul return @@ -144,7 +170,7 @@ P.firer = src P.old_style_target(A) P.fire() - playsound(src, 'sound/weapons/pierce.ogg', 25, 0) + playsound(src, 'sound/weapons/alien_spitacid.ogg', 25, 0) /mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N set name = "Corrosive Acid (200)" @@ -329,7 +355,13 @@ /mob/living/carbon/human/proc/gut() set category = "Abilities" +<<<<<<< HEAD set name = "Slaughter" //CHOMPedit renamed Gut to Slaughter so its more obvious what it does +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + set name = "Gut" +======= + set name = "Slaughter" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul set desc = "While grabbing someone aggressively, rip their guts out or tear them apart." if(last_special > world.time) @@ -345,7 +377,13 @@ return if(G.state < GRAB_AGGRESSIVE) +<<<<<<< HEAD to_chat(src, "You must have an aggressive grab to slaughter your prey!") //CHOMPedit +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + to_chat(src, "You must have an aggressive grab to gut your prey!") +======= + to_chat(src, "You must have an aggressive grab to slaughter your prey!") +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul return last_special = world.time + 50 diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index b01849f4db..9f50a7177f 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -25,8 +25,16 @@ siemens_coefficient = 0 gluttonous = 2 +<<<<<<< HEAD brute_mod = 0.65 //CHOMPedit. Edited brute vulnerability burn_mod = 1.50 //CHOMPedit. Edited burn vulnerability +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + brute_mod = 0.5 // Hardened carapace. + burn_mod = 2 // Weak to fire. +======= + brute_mod = 0.6 // Hardened carapace. + burn_mod = 1.75 // Weak to fire. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul warning_low_pressure = 50 hazard_low_pressure = -1 @@ -44,7 +52,13 @@ flesh_color = "#282846" gibbed_anim = "gibbed-a" dusted_anim = "dust-a" +<<<<<<< HEAD death_message = "lets out a piercing multi-toned screech, green blood bubbling from its maw as it ceases." //CHOMPedit. Changed message. +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + death_message = "lets out a waning guttural screech, green blood bubbling from its maw." +======= + death_message = "lets out a guttural screech, green blood bubbling from its maw." +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul death_sound = 'sound/voice/hiss6.ogg' damage_overlays = null //CHOMPedit. They don't have overlays yet, if someone wants to add some then be my guest @@ -52,13 +66,22 @@ blood_mask = null //CHOMPedit. speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') - speech_chance = 100 + speech_chance = 75 virus_immune = 1 breath_type = null poison_type = null +<<<<<<< HEAD +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + vision_flags = SEE_SELF|SEE_MOBS + +======= + vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS + darksight = 10 + +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul has_organ = list( O_HEART = /obj/item/organ/internal/heart, O_BRAIN = /obj/item/organ/internal/brain/xeno, @@ -96,7 +119,13 @@ return SPECIES_GENA //CHOMPedit /datum/species/xenos/get_random_name() +<<<<<<< HEAD return "Genaprawn [caste_name] ([alien_number])" //CHOMPedit +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + return "alien [caste_name] ([alien_number])" +======= + return "xenomorph [caste_name] ([alien_number])" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /datum/species/xenos/can_understand(var/mob/other) if(istype(other, /mob/living/carbon/alien/larva)) @@ -114,7 +143,13 @@ H.mind.special_role = "Alien" alien_number++ //Keep track of how many aliens we've had so far. +<<<<<<< HEAD H.real_name = "Genaprawn [caste_name] ([alien_number])" //CHOMPedit +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + H.real_name = "alien [caste_name] ([alien_number])" +======= + H.real_name = "xenomorph [caste_name] ([alien_number])" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul H.name = H.real_name ..() @@ -167,7 +202,20 @@ return 1 return 0 +<<<<<<< HEAD //CHOMPedit removed infection images, since they do not exist anymore. +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +/* +/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H) + H.AddInfectionImages() + ..() + +/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H) + H.RemoveInfectionImages() + ..() +*/ +======= +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /datum/species/xenos/drone name = SPECIES_GENA_DRONE //CHOMPedit @@ -213,7 +261,7 @@ name = SPECIES_GENA_HUNTER //CHOMPedit weeds_plasma_rate = 5 caste_name = "hunter" - slowdown = -2 + slowdown = -1 total_health = 150 tail = null //CHOMPedit. Set to null @@ -273,13 +321,29 @@ /datum/species/xenos/queen +<<<<<<< HEAD name = SPECIES_GENA_QUEEN //CHOMPedit total_health = 300 //CHOMPedit. Queen is chonk +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + name = SPECIES_XENO_QUEEN + total_health = 250 +======= + name = SPECIES_XENO_QUEEN + total_health = 300 +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul weeds_heal_rate = 5 weeds_plasma_rate = 20 caste_name = "queen" +<<<<<<< HEAD slowdown = 4 tail = null //CHOMPedit. Set to null +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + slowdown = 4 + tail = "xenos_queen_tail" +======= + slowdown = 3 + tail = "xenos_queen_tail" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul rarity_value = 10 icobase = 'icons/mob/human_races/xenos/r_xenos_queen.dmi' @@ -317,10 +381,22 @@ ..() // Make sure only one official queen exists at any point. if(!alien_queen_exists(1,H)) +<<<<<<< HEAD H.real_name = "Genaprawn queen ([alien_number])" //CHOMPedit +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + H.real_name = "alien queen ([alien_number])" +======= + H.real_name = "xenomorph queen ([alien_number])" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul H.name = H.real_name else +<<<<<<< HEAD H.real_name = "Genaprawn princess ([alien_number])" //CHOMPedit +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + H.real_name = "alien princess ([alien_number])" +======= + H.real_name = "xenomorph princess ([alien_number])" +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul H.name = H.real_name /datum/hud_data/alien @@ -341,4 +417,10 @@ gear = list( "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), +<<<<<<< HEAD ) //CHOMPedit removed head and outer layer item slots, since they caused a slew of problems with xenomorphs +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + ) +======= + ) //Removed hat and outer slots, it caused too many problems that required admin intervention. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index 7330c80c38..be18629fa0 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -25,7 +25,43 @@ /mob/living/carbon/human/xqueen/New(var/new_loc) h_style = "Bald" faction = "xeno" +<<<<<<< HEAD ..(new_loc, SPECIES_GENA_QUEEN) //CHOMPedit //CHOMPedit. Removed AddInfectionImages code, due to it being commented out and not used +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul + ..(new_loc, SPECIES_XENO_QUEEN) + +// I feel like we should generalize/condense down all the various icon-rendering antag procs. +/*---------------------------------------- +Proc: AddInfectionImages() +Des: Gives the client of the alien an image on each infected mob. +----------------------------------------*/ +/* +/mob/living/carbon/human/proc/AddInfectionImages() + if (client) + for (var/mob/living/C in mob_list) + if(C.status_flags & XENO_HOST) + var/obj/item/alien_embryo/A = locate() in C + var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]") + client.images += I + return +*/ +/*---------------------------------------- +Proc: RemoveInfectionImages() +Des: Removes all infected images from the alien. +----------------------------------------*/ +/* +/mob/living/carbon/human/proc/RemoveInfectionImages() + if (client) + for(var/image/I in client.images) + if(dd_hasprefix_case(I.icon_state, "infected")) + qdel(I) + return +*/ +======= + ..(new_loc, SPECIES_XENO_QUEEN) + +//Removed AddInfectionImages, no longer required. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 91896ed393..bb05ff47cb 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -144,17 +144,21 @@ agony = 10 check_armour = "bio" armor_penetration = 25 // It's acid + hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg' + hitsound = 'sound/weapons/effects/alien_spit_wall.ogg' combustion = FALSE /obj/item/projectile/energy/neurotoxin name = "neurotoxic spit" icon_state = "neurotoxin" - damage = 5 + damage = 0 damage_type = BIOACID agony = 60 //CHOMPedit lowered agony damage check_armour = "bio" armor_penetration = 25 // It's acid-based + hitsound_wall = 'sound/weapons/effects/alien_spit_wall.ogg' + hitsound = 'sound/weapons/effects/alien_spit_wall.ogg' combustion = FALSE diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 063a313b5b..62d39f3c48 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -14,7 +14,12 @@ return 0 return affected && affected.open == (affected.encased ? 3 : 2) +<<<<<<< HEAD //CHOMPedit. Removed unused embryo surgery +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +======= +//Removed unused Embryo Surgery, derelict and broken. +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul ////////////////////////////////////////////////////////////////// // CHEST INTERNAL ORGAN SURGERY // diff --git a/maps/submaps/pois_vr/debris_field/derelict.dmm b/maps/submaps/pois_vr/debris_field/derelict.dmm index c1dcd09022..cbc325c351 100644 --- a/maps/submaps/pois_vr/debris_field/derelict.dmm +++ b/maps/submaps/pois_vr/debris_field/derelict.dmm @@ -870,7 +870,6 @@ /turf/simulated/floor/tiled/dark, /area/submap/debrisfield/derelict/interior) "cF" = ( -/obj/effect/alien/egg, /obj/effect/alien/weeds, /turf/simulated/floor/tiled/dark, /area/submap/debrisfield/derelict/interior) diff --git a/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm b/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm index ed2b127f4f..5042974f3c 100644 --- a/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm +++ b/maps/submaps/pois_vr/debris_field/new_escapepod_xeno.dmm @@ -66,7 +66,6 @@ /area/submap/debrisfield/misc_debris) "W" = ( /obj/effect/alien/weeds, -/obj/effect/alien/egg, /turf/simulated/floor/airless, /area/submap/debrisfield/misc_debris) "X" = ( diff --git a/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm b/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm index 5e8267e0fe..151f08fc28 100644 --- a/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm +++ b/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm @@ -1,3 +1,4 @@ +<<<<<<< HEAD "aa" = (/turf/template_noop,/area/template_noop) "ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) "ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) @@ -152,3 +153,314 @@ aaaaaabGaxaxadbGaaaaabababacapapapcgapcgapalalalabababaaaaaaadadadadadaxbGaaaa aaaaaaaaaaaxaxadadaaaaaaababababakchaHchakababababaaaaaaadadaxaxbGaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaabGadaaaaaaaaaaaaaaaaaaaa "} +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +"aa" = (/turf/template_noop,/area/template_noop) +"ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) +"ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) +"ae" = (/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ai" = (/obj/machinery/artifact,/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aj" = (/obj/random/outcrop,/turf/simulated/floor/outdoors/ice,/area/template_noop) +"ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"an" = (/obj/structure/window/phoronreinforced,/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"ar" = (/obj/effect/alien/weeds/node,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"as" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"at" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"au" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"av" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aw" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ax" = (/turf/simulated/floor/outdoors/ice,/area/template_noop) +"ay" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"az" = (/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aA" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aB" = (/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aC" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aD" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aE" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aF" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aG" = (/obj/machinery/vr_sleeper/alien/random_replicant,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aH" = (/obj/structure/prop/alien/pod,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aI" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aJ" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aK" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aL" = (/obj/structure/table/alien,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aM" = (/obj/structure/prop/alien/computer/camera,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aN" = (/obj/structure/prop/alien/computer/camera/flipped,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aO" = (/obj/structure/simple_door/resin,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aP" = (/obj/structure/prop/alien/power,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aQ" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aR" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aS" = (/obj/structure/table/alien,/obj/random/tool/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aT" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aU" = (/obj/machinery/replicator,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aV" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/drug_den,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aW" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aX" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aY" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aZ" = (/obj/machinery/porta_turret/alien/destroyed,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ba" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/scientific,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bb" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/nanites,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bc" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/fresh_medicine,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bd" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/viral,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"be" = (/obj/machinery/door/blast/puzzle,/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bf" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bg" = (/obj/structure/prop/lock/projectile,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bh" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/old_medicine,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bi" = (/obj/structure/prop/alien/dispenser,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bj" = (/obj/effect/decal/remains/xeno,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bk" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bl" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bm" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bn" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bo" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bp" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bq" = (/obj/machinery/implantchair,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"br" = (/obj/structure/prop/alien/computer{icon_state = "console-c"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bs" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bt" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bu" = (/obj/structure/loot_pile/surface/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bv" = (/obj/item/weapon/surgical/bone_clamp/alien,/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bw" = (/obj/structure/prop/alien/computer,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bx" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/accessory/medal/dungeon/alien_ufo{desc = "It vaguely like a star. It looks like something an alien admiral might've worn. Probably."; name = "alien admiral's medal"},/obj/item/weapon/telecube/precursor/mated/zone,/obj/item/clothing/head/helmet/alien/tank,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"by" = (/obj/structure/loot_pile/mecha/gygax/dark,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bz" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bA" = (/obj/item/brokenbug,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) +"bB" = (/mob/living/simple_mob/animal/space/alien/sentinel,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bC" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bD" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bE" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bF" = (/obj/structure/prop/blackbox/xenofrigate,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bG" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) +"bH" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bI" = (/obj/structure/table/alien,/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bJ" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bK" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bL" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bM" = (/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bN" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bO" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bP" = (/obj/structure/table/alien,/obj/item/weapon/weldingtool/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bQ" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bR" = (/obj/structure/table/alien,/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bS" = (/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bT" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bU" = (/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bV" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bW" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bX" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bY" = (/obj/structure/foamedmetal,/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bZ" = (/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ca" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cb" = (/obj/structure/prop/alien/power,/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cc" = (/obj/structure/loot_pile/surface/alien/end,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cd" = (/obj/item/prop/alien/junk,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ce" = (/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"cf" = (/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cg" = (/obj/machinery/door/airlock/alien/public,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"ch" = (/turf/simulated/shuttle/wall/alien/hard_corner,/area/submap/cave/crashed_ufo_frigate) + +(1,1,1) = {" +aaaaaaaxbGaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaxaxadaxaxbGaaaaaaaaababababacaeacafaeababababaaaaaaajaxadaaaaadaxajaaaaaa +adbGadadadadaxaxaaaaabababagahababacaiacababacakabababaaaaadaxadadaxaxaaaaaaaa +aaaxaxadadadadaaaaababacalalahahabamamanabacacacacaoababaaaaadbGadadaaaaaaaaaa +aaaaaaadbGadaaaaababaoacacalapapchalalalchapapaqaracasababaaaaaaadadadaxaxadaa +aaaaadadadaaaaababaoacacapapapapatalapapauapapapavalacawababaaaaaaadadadaxajaa +aaadadaxaaaaababaoacayapapapalalchazacaAchaAaBapapaCacacawababaaaaaxadadadaaaa +aaaxaxaaaaababaoacalalapapahaDabababazababababawapapaEacacaBababaaaxadaaaaaaaa +adbGaxaaaaabacacalalapapacaFababaGabababaHabababaIapapaqaAacakabaaajaxaaaaaaaa +aaadaaaaababacacaFapapacacaFabaGacaGabaHalalaJacacacapapacacabababaaaxaaaaaaaa +aaadaaaaabakacacaKapapacacacababaJababawacacchabacaAapapacababaIabaaaaaaaaaaaa +aaaaaaababababaFaFapalalacacaJacacakabaLacaLabababacapapababaIacababaaaaaaaaaa +aaaaaaabaMaNabababalalacacacababaOababaLacaLababababchatchaFalacaPabaaaaaaaaaa +aaaaaaabaFacakacchauchaoacacabaeaQaeabaLacaLabababakapaRabaSalacaPabadaxaaaaaa +aaaaaaabaFacalalapalababaTalababaeabababawababaMaFacapapabahalacaPabadadaaaaaa +aaaaababaFalalapapapacababalaTabababakabababaUacaFacapapatacacababababadaxaaaa +aaaaabaVacapapapapacacakababababacacaWaAacababacacapapapabavababacacabadaxaaaa +aaaaabacapapapapacacacacabababaXacaFaFahalaYababchaRapacabababaZacacabadadadaa +adaaabbaapapacalbbalbcacbdabacacapalalalapapapapbeapacacaIabalalacapchaZadadaa +adaaabalapabababababababababapapapapapapapapapapchaFacbfababbgacapapatacadbAaa +adaaabbhalabbiawabbiapaFabapapaRbjbkacacacaparblabbmacaFabacacapapapchaZadadaa +axaaabalbnbobpacabbiapbqchapalalalaFaFaFacacapalabbfacbmabacapapapalabadadaxaa +axaaabalbnbnbnbrabbibsapatapalagabababababakapapabbtaAbuabalapapalalabadadaxaa +aaadababaFbnapbvababaFaFchapalababbwbxbwababapapabbyacbzabalalapacababadadaaaa +aaaaaaabaFapbBacaYababababapapabbCapapapbDabapapabbEbFbHabalalapacabadaxaaaaaa +aaaaaaabaFapapalalalalababapapabapapaRapapabapapabababababalapapalabadaaaaaaaa +axaaaaabbIaFapapbpalalabacalapbJapbKbLbfapbMapapacabacakbNapapalalabaaaaaaaaaa +axadaaababaFapbnbnacacabagalapbJbOaFapbPbObMapapakabacacbQapapalababaaaaaaaaaa +adbGadaaabbIbRbnapapbSabalalapbTapaRapapalbUapapacabacbVbWapacalabaaaaaaaaaaaa +aaaxaxaaababaFacapapbSababalaRapapapbXalalalaRacababacapapacakababaaaaaaaaaaaa +aaaaaxaaaaabbIaFapapapbSabalapapapapapapapapapacabacapapapacacabaaaaaaaaadadaa +aaaaaaaaaaabababchbYchabababbfbOapapapapapbObfabababchatchabababaaaaaaadbGadaa +aaadaaaaaaaaababbZbZbnapacababaFahalagarcaaFababacapapapacababaaaaaaadadadadaa +aaadaxajaaaaaaababcbbZapapalabababccabccabababacapapapaPababaaaaaaadadadadaaaa +aaadadaxaxbGaaaaababbZapapcdalalabababababacapapapapacababaaaaaaaxaxadadadadaa +aaaaadadadadadaaaaababaPacapapalalchapchceapapalcfaPababaaaaaabGadadadaxaxadaa +aaaaaabGaxaxadbGaaaaabababacapapapcgapcgapalalalabababaaaaaaadadadadadaxbGaaaa +aaaaaaaaaaaxaxadadaaaaaaababababakchaHchakababababaaaaaaadadaxaxbGaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaabGadaaaaaaaaaaaaaaaaaaaa +"} +======= +"aa" = (/turf/template_noop,/area/template_noop) +"ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) +"ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) +"ae" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ai" = (/obj/machinery/artifact,/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aj" = (/obj/random/outcrop,/turf/simulated/floor/outdoors/ice,/area/template_noop) +"ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"an" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"ar" = (/obj/effect/alien/weeds/node,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"as" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"at" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"au" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"av" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aw" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ax" = (/turf/simulated/floor/outdoors/ice,/area/template_noop) +"ay" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"az" = (/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aA" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aB" = (/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aC" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aD" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aE" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aF" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aG" = (/obj/machinery/vr_sleeper/alien/random_replicant,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aH" = (/obj/structure/prop/alien/pod,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aI" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aJ" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aK" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aL" = (/obj/structure/table/alien,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aM" = (/obj/structure/prop/alien/computer/camera,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aN" = (/obj/structure/prop/alien/computer/camera/flipped,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aO" = (/obj/structure/simple_door/resin,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aP" = (/obj/structure/prop/alien/power,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aQ" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aR" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"aS" = (/obj/structure/table/alien,/obj/random/tool/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aT" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"aU" = (/obj/machinery/replicator,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aV" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/drug_den,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aW" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aX" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aY" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aZ" = (/obj/machinery/porta_turret/alien/destroyed,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ba" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/scientific,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bb" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/nanites,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bc" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/fresh_medicine,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bd" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/viral,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"be" = (/obj/machinery/door/blast/puzzle,/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bf" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bg" = (/obj/structure/prop/lock/projectile,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bh" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/old_medicine,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bi" = (/obj/structure/prop/alien/dispenser,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bj" = (/obj/effect/decal/remains/xeno,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bk" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bl" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bm" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bn" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bo" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bp" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bq" = (/obj/machinery/implantchair,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"br" = (/obj/structure/prop/alien/computer{icon_state = "console-c"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bs" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bt" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bu" = (/obj/structure/loot_pile/surface/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bv" = (/obj/item/weapon/surgical/bone_clamp/alien,/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bw" = (/obj/structure/prop/alien/computer,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bx" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/accessory/medal/dungeon/alien_ufo{desc = "It vaguely like a star. It looks like something an alien admiral might've worn. Probably."; name = "alien admiral's medal"},/obj/item/weapon/telecube/precursor/mated/zone,/obj/item/clothing/head/helmet/alien/tank,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"by" = (/obj/structure/loot_pile/mecha/gygax/dark,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bz" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bA" = (/obj/item/brokenbug,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) +"bB" = (/mob/living/simple_mob/animal/space/alien/sentinel,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bC" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bD" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bE" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bF" = (/obj/structure/prop/blackbox/xenofrigate,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bG" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) +"bH" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bI" = (/obj/structure/table/alien,/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bJ" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bK" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bL" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bM" = (/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bN" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bO" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bP" = (/obj/structure/table/alien,/obj/item/weapon/weldingtool/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bQ" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bR" = (/obj/structure/table/alien,/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bS" = (/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bT" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bU" = (/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bV" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bW" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bX" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bY" = (/obj/structure/foamedmetal,/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"bZ" = (/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ca" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cb" = (/obj/structure/prop/alien/power,/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cc" = (/obj/structure/loot_pile/surface/alien/end,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cd" = (/obj/item/prop/alien/junk,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"ce" = (/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"cf" = (/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) +"cg" = (/obj/machinery/door/airlock/alien/public,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"ch" = (/turf/simulated/shuttle/wall/alien/hard_corner,/area/submap/cave/crashed_ufo_frigate) + +(1,1,1) = {" +aaaaaaaxbGaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaxaxadaxaxbGaaaaaaaaababababacaeacafaeababababaaaaaaajaxadaaaaadaxajaaaaaa +adbGadadadadaxaxaaaaabababagahababacaiacababacakabababaaaaadaxadadaxaxaaaaaaaa +aaaxaxadadadadaaaaababacalalahahabamamanabacacacacaoababaaaaadbGadadaaaaaaaaaa +aaaaaaadbGadaaaaababaoacacalapapchalalalchapapaqaracasababaaaaaaadadadaxaxadaa +aaaaadadadaaaaababaoacacapapapapatalapapauapapapavalacawababaaaaaaadadadaxajaa +aaadadaxaaaaababaoacayapapapalalchazacaAchaAaBapapaCacacawababaaaaaxadadadaaaa +aaaxaxaaaaababaoacalalapapahaDabababazababababawapapaEacacaBababaaaxadaaaaaaaa +adbGaxaaaaabacacalalapapacaFababaGabababaHabababaIapapaqaAacakabaaajaxaaaaaaaa +aaadaaaaababacacaFapapacacaFabaGacaGabaHalalaJacacacapapacacabababaaaxaaaaaaaa +aaadaaaaabakacacaKapapacacacababaJababawacacchabacaAapapacababaIabaaaaaaaaaaaa +aaaaaaababababaFaFapalalacacaJacacakabaLacaLabababacapapababaIacababaaaaaaaaaa +aaaaaaabaMaNabababalalacacacababaOababaLacaLababababchatchaFalacaPabaaaaaaaaaa +aaaaaaabaFacakacchauchaoacacabaeaQaeabaLacaLabababakapaRabaSalacaPabadaxaaaaaa +aaaaaaabaFacalalapalababaTalababaeabababawababaMaFacapapabahalacaPabadadaaaaaa +aaaaababaFalalapapapacababalaTabababakabababaUacaFacapapatacacababababadaxaaaa +aaaaabaVacapapapapacacakababababacacaWaAacababacacapapapabavababacacabadaxaaaa +aaaaabacapapapapacacacacabababaXacaFaFahalaYababchaRapacabababaZacacabadadadaa +adaaabbaapapacalbbalbcacbdabacacapalalalapapapapbeapacacaIabalalacapchaZadadaa +adaaabalapabababababababababapapapapapapapapapapchaFacbfababbgacapapatacadbAaa +adaaabbhalabbiawabbiapaFabapapaRbjbkacacacaparblabbmacaFabacacapapapchaZadadaa +axaaabalbnbobpacabbiapbqchapalalalaFaFaFacacapalabbfacbmabacapapapalabadadaxaa +axaaabalbnbnbnbrabbibsapatapalagabababababakapapabbtaAbuabalapapalalabadadaxaa +aaadababaFbnapbvababaFaFchapalababbwbxbwababapapabbyacbzabalalapacababadadaaaa +aaaaaaabaFapbBacaYababababapapabbCapapapbDabapapabbEbFbHabalalapacabadaxaaaaaa +aaaaaaabaFapapalalalalababapapabapapaRapapabapapabababababalapapalabadaaaaaaaa +axaaaaabbIaFapapbpalalabacalapbJapbKbLbfapbMapapacabacakbNapapalalabaaaaaaaaaa +axadaaababaFapbnbnacacabagalapbJbOaFapbPbObMapapakabacacbQapapalababaaaaaaaaaa +adbGadaaabbIbRbnapapbSabalalapbTapaRapapalbUapapacabacbVbWapacalabaaaaaaaaaaaa +aaaxaxaaababaFacapapbSababalaRapapapbXalalalaRacababacapapacakababaaaaaaaaaaaa +aaaaaxaaaaabbIaFapapapbSabalapapapapapapapapapacabacapapapacacabaaaaaaaaadadaa +aaaaaaaaaaabababchbYchabababbfbOapapapapapbObfabababchatchabababaaaaaaadbGadaa +aaadaaaaaaaaababbZbZbnapacababaFahalagarcaaFababacapapapacababaaaaaaadadadadaa +aaadaxajaaaaaaababcbbZapapalabababccabccabababacapapapaPababaaaaaaadadadadaaaa +aaadadaxaxbGaaaaababbZapapcdalalabababababacapapapapacababaaaaaaaxaxadadadadaa +aaaaadadadadadaaaaababaPacapapalalchapchceapapalcfaPababaaaaaabGadadadaxaxadaa +aaaaaabGaxaxadbGaaaaabababacapapapcgapcgapalalalabababaaaaaaadadadadadaxbGaaaa +aaaaaaaaaaaxaxadadaaaaaaababababakchaHchakababababaaaaaaadadaxaxbGaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaabGadaaaaaaaaaaaaaaaaaaaa +"} +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/maps/submaps/surface_submaps/mountains/vault4.dmm b/maps/submaps/surface_submaps/mountains/vault4.dmm index 6ea85a27e9..bbd4824422 100644 --- a/maps/submaps/surface_submaps/mountains/vault4.dmm +++ b/maps/submaps/surface_submaps/mountains/vault4.dmm @@ -1,3 +1,4 @@ +<<<<<<< HEAD "a" = (/turf/template_noop,/area/template_noop) "b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) "c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) @@ -20,3 +21,50 @@ abbfedbba aabbcbbaa aaaaaaaaa "} +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"f" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"j" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) + +(1,1,1) = {" +aaaaaaaaa +aabbcbbaa +abbdefbba +abdeeghba +aciejeica +abhgeedba +abbfedbba +aabbcbbaa +aaaaaaaaa +"} +======= +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"f" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"j" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) + +(1,1,1) = {" +aaaaaaaaa +aabbcbbaa +abbdefbba +abdeeghba +aciejeica +abhgeedba +abbfedbba +aabbcbbaa +aaaaaaaaa +"} +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/maps/submaps/surface_submaps/mountains/vault5.dmm b/maps/submaps/surface_submaps/mountains/vault5.dmm index 8daebc236f..a98b97c720 100644 --- a/maps/submaps/surface_submaps/mountains/vault5.dmm +++ b/maps/submaps/surface_submaps/mountains/vault5.dmm @@ -1,3 +1,4 @@ +<<<<<<< HEAD "a" = (/turf/template_noop,/area/template_noop) "b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) @@ -21,3 +22,52 @@ abbkegbba aabbcbbaa aaaaaaaaa "} +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/obj/item/weapon/gun/projectile/p92x/large,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"i" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) + +(1,1,1) = {" +aaaaaaaaa +aabbcbbaa +abbdefbba +abgeeehba +abiejeiba +abheeegba +abbkegbba +aabbcbbaa +aaaaaaaaa +"} +======= +"a" = (/turf/template_noop,/area/template_noop) +"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/obj/item/weapon/gun/projectile/p92x/large,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"i" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) + +(1,1,1) = {" +aaaaaaaaa +aabbcbbaa +abbdefbba +abgeeehba +abiejeiba +abheeegba +abbkegbba +aabbcbbaa +aaaaaaaaa +"} +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul diff --git a/sound/machines/door/airlock_tear_apart.ogg b/sound/machines/door/airlock_tear_apart.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aba517475f18983da9d6370779da412d2560616d GIT binary patch literal 272254 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

i=)N5{? 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

    cFh*R_mX$iYhina1$T7# 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

    *8@- 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 literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index a0685571f0..e2ecc486f8 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1,3 +1,4 @@ +<<<<<<< HEAD // DM Environment file for baystation12.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. @@ -4359,3 +4360,8118 @@ #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE +||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul +// DM Environment file for baystation12.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. + // New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES +// BEGIN_INCLUDE +#include "code\_away_mission_tests.dm" +#include "code\_macros.dm" +#include "code\_macros_vr.dm" +#include "code\_map_tests.dm" +#include "code\_unit_tests.dm" +#include "code\global.dm" +#include "code\global_init.dm" +#include "code\global_vr.dm" +#include "code\hub.dm" +#include "code\names.dm" +#include "code\stylesheet.dm" +#include "code\world.dm" +#include "code\__datastructures\globals.dm" +#include "code\__defines\__513_compatibility.dm" +#include "code\__defines\_compile_options.dm" +#include "code\__defines\_lists.dm" +#include "code\__defines\_planes+layers.dm" +#include "code\__defines\_planes+layers_vr.dm" +#include "code\__defines\_protect.dm" +#include "code\__defines\_tick.dm" +#include "code\__defines\admin.dm" +#include "code\__defines\admin_vr.dm" +#include "code\__defines\appearance.dm" +#include "code\__defines\atmos.dm" +#include "code\__defines\belly_modes_vr.dm" +#include "code\__defines\callbacks.dm" +#include "code\__defines\chemistry.dm" +#include "code\__defines\chemistry_vr.dm" +#include "code\__defines\color.dm" +#include "code\__defines\construction.dm" +#include "code\__defines\crafting.dm" +#include "code\__defines\damage_organs.dm" +#include "code\__defines\dna.dm" +#include "code\__defines\exosuit_fab.dm" +#include "code\__defines\flags.dm" +#include "code\__defines\gamemode.dm" +#include "code\__defines\holomap.dm" +#include "code\__defines\hoses.dm" +#include "code\__defines\input.dm" +#include "code\__defines\instruments.dm" +#include "code\__defines\integrated_circuits.dm" +#include "code\__defines\inventory_sizes.dm" +#include "code\__defines\is_helpers.dm" +#include "code\__defines\items_clothing.dm" +#include "code\__defines\lighting.dm" +#include "code\__defines\lighting_vr.dm" +#include "code\__defines\machinery.dm" +#include "code\__defines\map.dm" +#include "code\__defines\materials.dm" +#include "code\__defines\math.dm" +#include "code\__defines\math_physics.dm" +#include "code\__defines\MC.dm" +#include "code\__defines\misc.dm" +#include "code\__defines\misc_vr.dm" +#include "code\__defines\mobs.dm" +#include "code\__defines\mobs_vr.dm" +#include "code\__defines\nifsoft.dm" +#include "code\__defines\objects.dm" +#include "code\__defines\overmap.dm" +#include "code\__defines\pda.dm" +#include "code\__defines\planets.dm" +#include "code\__defines\planets_vr.dm" +#include "code\__defines\plants.dm" +#include "code\__defines\preferences.dm" +#include "code\__defines\process_scheduler.dm" +#include "code\__defines\qdel.dm" +#include "code\__defines\research.dm" +#include "code\__defines\roguemining_vr.dm" +#include "code\__defines\rust_g.dm" +#include "code\__defines\shields.dm" +#include "code\__defines\shuttle.dm" +#include "code\__defines\sound.dm" +#include "code\__defines\spaceman_dmm.dm" +#include "code\__defines\species_languages.dm" +#include "code\__defines\species_languages_vr.dm" +#include "code\__defines\sprite_sheets.dm" +#include "code\__defines\sqlite_defines.dm" +#include "code\__defines\stat_tracking.dm" +#include "code\__defines\subsystems.dm" +#include "code\__defines\supply.dm" +#include "code\__defines\targeting.dm" +#include "code\__defines\tgs.config.dm" +#include "code\__defines\tgs.dm" +#include "code\__defines\tgui.dm" +#include "code\__defines\tools.dm" +#include "code\__defines\turfs.dm" +#include "code\__defines\typeids.dm" +#include "code\__defines\unit_tests.dm" +#include "code\__defines\vote.dm" +#include "code\__defines\vv.dm" +#include "code\__defines\webhooks.dm" +#include "code\__defines\wires.dm" +#include "code\__defines\xenoarcheaology.dm" +#include "code\__defines\ZAS.dm" +#include "code\__defines\dcs\flags.dm" +#include "code\__defines\dcs\helpers.dm" +#include "code\__defines\dcs\signals.dm" +#include "code\_global_vars\bitfields.dm" +#include "code\_global_vars\misc.dm" +#include "code\_global_vars\mobs.dm" +#include "code\_global_vars\religion.dm" +#include "code\_global_vars\sensitive.dm" +#include "code\_global_vars\typecache.dm" +#include "code\_global_vars\lists\mapping.dm" +#include "code\_global_vars\lists\misc.dm" +#include "code\_global_vars\lists\species.dm" +#include "code\_helpers\_global_objects.dm" +#include "code\_helpers\_global_objects_vr.dm" +#include "code\_helpers\_lists.dm" +#include "code\_helpers\atmospherics.dm" +#include "code\_helpers\atom_movables.dm" +#include "code\_helpers\events.dm" +#include "code\_helpers\files.dm" +#include "code\_helpers\game.dm" +#include "code\_helpers\global_lists.dm" +#include "code\_helpers\global_lists_vr.dm" +#include "code\_helpers\icons.dm" +#include "code\_helpers\icons_vr.dm" +#include "code\_helpers\lighting.dm" +#include "code\_helpers\logging.dm" +#include "code\_helpers\logging_vr.dm" +#include "code\_helpers\matrices.dm" +#include "code\_helpers\mobs.dm" +#include "code\_helpers\names.dm" +#include "code\_helpers\sanitize_values.dm" +#include "code\_helpers\storage.dm" +#include "code\_helpers\string_lists.dm" +#include "code\_helpers\text.dm" +#include "code\_helpers\time.dm" +#include "code\_helpers\turfs.dm" +#include "code\_helpers\type2type.dm" +#include "code\_helpers\unsorted.dm" +#include "code\_helpers\unsorted_vr.dm" +#include "code\_helpers\view.dm" +#include "code\_helpers\visual_filters.dm" +#include "code\_helpers\sorts\__main.dm" +#include "code\_helpers\sorts\comparators.dm" +#include "code\_helpers\sorts\TimSort.dm" +#include "code\_onclick\_defines.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\rig.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\_defines_vr.dm" +#include "code\_onclick\hud\ability_screen_objects.dm" +#include "code\_onclick\hud\action.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alert_vr.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\gun_mode.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\map_popups.dm" +#include "code\_onclick\hud\minihud.dm" +#include "code\_onclick\hud\minihud_mapper.dm" +#include "code\_onclick\hud\minihud_rigmech.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\robot_vr.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\screen_objects_vr.dm" +#include "code\_onclick\hud\skybox.dm" +#include "code\_onclick\hud\soulcatcher_guest.dm" +#include "code\_onclick\hud\spell_screen_objects.dm" +#include "code\ATMOSPHERICS\_atmos_setup.dm" +#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" +#include "code\ATMOSPHERICS\atmospherics.dm" +#include "code\ATMOSPHERICS\datum_pipe_network.dm" +#include "code\ATMOSPHERICS\datum_pipeline.dm" +#include "code\ATMOSPHERICS\components\portables_connector.dm" +#include "code\ATMOSPHERICS\components\shutoff.dm" +#include "code\ATMOSPHERICS\components\tvalve.dm" +#include "code\ATMOSPHERICS\components\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\algae_generator_vr.dm" +#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" +#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" +#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" +#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" +#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" +#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" +#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" +#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" +#include "code\ATMOSPHERICS\components\unary\heat_source.dm" +#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" +#include "code\ATMOSPHERICS\components\unary\unary_base.dm" +#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber_vr.dm" +#include "code\ATMOSPHERICS\pipes\cap.dm" +#include "code\ATMOSPHERICS\pipes\he_pipes.dm" +#include "code\ATMOSPHERICS\pipes\he_pipes_vr.dm" +#include "code\ATMOSPHERICS\pipes\manifold.dm" +#include "code\ATMOSPHERICS\pipes\manifold4w.dm" +#include "code\ATMOSPHERICS\pipes\pipe_base.dm" +#include "code\ATMOSPHERICS\pipes\pipe_base_vr.dm" +#include "code\ATMOSPHERICS\pipes\simple.dm" +#include "code\ATMOSPHERICS\pipes\tank.dm" +#include "code\ATMOSPHERICS\pipes\tank_vr.dm" +#include "code\ATMOSPHERICS\pipes\universal.dm" +#include "code\ATMOSPHERICS\pipes\vent.dm" +#include "code\controllers\autotransfer.dm" +#include "code\controllers\communications.dm" +#include "code\controllers\configuration.dm" +#include "code\controllers\configuration_vr.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\emergency_shuttle_controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks-defs.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\master_controller.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\verbs.dm" +#include "code\controllers\observer_listener\atom\observer.dm" +#include "code\controllers\subsystems\ai.dm" +#include "code\controllers\subsystems\aifast.dm" +#include "code\controllers\subsystems\air.dm" +#include "code\controllers\subsystems\airflow.dm" +#include "code\controllers\subsystems\alarm.dm" +#include "code\controllers\subsystems\assets.dm" +#include "code\controllers\subsystems\atoms.dm" +#include "code\controllers\subsystems\character_setup.dm" +#include "code\controllers\subsystems\chat.dm" +#include "code\controllers\subsystems\chemistry.dm" +#include "code\controllers\subsystems\circuits.dm" +#include "code\controllers\subsystems\dcs.dm" +#include "code\controllers\subsystems\events.dm" +#include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\holomaps.dm" +#include "code\controllers\subsystems\inactivity.dm" +#include "code\controllers\subsystems\input.dm" +#include "code\controllers\subsystems\job.dm" +#include "code\controllers\subsystems\lighting.dm" +#include "code\controllers\subsystems\machines.dm" +#include "code\controllers\subsystems\mapping.dm" +#include "code\controllers\subsystems\media_tracks.dm" +#include "code\controllers\subsystems\mobs.dm" +#include "code\controllers\subsystems\nightshift.dm" +#include "code\controllers\subsystems\orbits.dm" +#include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\persist_vr.dm" +#include "code\controllers\subsystems\persistence.dm" +#include "code\controllers\subsystems\planets.dm" +#include "code\controllers\subsystems\plants.dm" +#include "code\controllers\subsystems\radiation.dm" +#include "code\controllers\subsystems\shuttles.dm" +#include "code\controllers\subsystems\skybox.dm" +#include "code\controllers\subsystems\sounds.dm" +#include "code\controllers\subsystems\sqlite.dm" +#include "code\controllers\subsystems\sun.dm" +#include "code\controllers\subsystems\supply.dm" +#include "code\controllers\subsystems\tgui.dm" +#include "code\controllers\subsystems\ticker.dm" +#include "code\controllers\subsystems\time_track.dm" +#include "code\controllers\subsystems\timer.dm" +#include "code\controllers\subsystems\transcore_vr.dm" +#include "code\controllers\subsystems\vis_overlays.dm" +#include "code\controllers\subsystems\vote.dm" +#include "code\controllers\subsystems\webhooks.dm" +#include "code\controllers\subsystems\xenoarch.dm" +#include "code\controllers\subsystems\processing\bellies_vr.dm" +#include "code\controllers\subsystems\processing\fastprocess.dm" +#include "code\controllers\subsystems\processing\instruments.dm" +#include "code\controllers\subsystems\processing\obj.dm" +#include "code\controllers\subsystems\processing\processing.dm" +#include "code\controllers\subsystems\processing\projectiles.dm" +#include "code\controllers\subsystems\processing\turfs.dm" +#include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_law_sets_vr.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\category.dm" +#include "code\datums\chat_message.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\EPv2.dm" +#include "code\datums\ghost_query.dm" +#include "code\datums\ghost_query_vr.dm" +#include "code\datums\hierarchy.dm" +#include "code\datums\mind.dm" +#include "code\datums\mind_vr.dm" +#include "code\datums\mixed.dm" +#include "code\datums\modules.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\orbit.dm" +#include "code\datums\organs.dm" +#include "code\datums\position_point_vector.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\reference_tracking.dm" +#include "code\datums\riding.dm" +#include "code\datums\soul_link.dm" +#include "code\datums\sun.dm" +#include "code\datums\weakref.dm" +#include "code\datums\autolathe\arms.dm" +#include "code\datums\autolathe\arms_vr.dm" +#include "code\datums\autolathe\autolathe.dm" +#include "code\datums\autolathe\devices.dm" +#include "code\datums\autolathe\devices_vr.dm" +#include "code\datums\autolathe\engineering.dm" +#include "code\datums\autolathe\engineering_vr.dm" +#include "code\datums\autolathe\general.dm" +#include "code\datums\autolathe\general_vr.dm" +#include "code\datums\autolathe\materials.dm" +#include "code\datums\autolathe\medical.dm" +#include "code\datums\autolathe\medical_vr.dm" +#include "code\datums\autolathe\tools.dm" +#include "code\datums\autolathe\tools_vr.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\overlay_lighting.dm" +#include "code\datums\components\resize_guard.dm" +#include "code\datums\components\crafting\crafting.dm" +#include "code\datums\components\crafting\crafting_external.dm" +#include "code\datums\components\crafting\recipes.dm" +#include "code\datums\components\crafting\tool_quality.dm" +#include "code\datums\components\crafting\recipes\primitive.dm" +#include "code\datums\components\crafting\recipes\weapons.dm" +#include "code\datums\elements\_element.dm" +#include "code\datums\elements\light_blocking.dm" +#include "code\datums\elements\turf_transparency.dm" +#include "code\datums\game_masters\_common.dm" +#include "code\datums\helper_datums\construction_datum.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\getrev.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\teleport_vr.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\locations\locations.dm" +#include "code\datums\locations\nyx.dm" +#include "code\datums\locations\qerrvallis.dm" +#include "code\datums\locations\s_randarr.dm" +#include "code\datums\locations\sol.dm" +#include "code\datums\locations\tau_ceti.dm" +#include "code\datums\locations\uueoa_esa.dm" +#include "code\datums\locations\vir.dm" +#include "code\datums\looping_sounds\_looping_sound.dm" +#include "code\datums\looping_sounds\item_sounds.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\sequence.dm" +#include "code\datums\looping_sounds\weather_sounds.dm" +#include "code\datums\managed_browsers\_managed_browser.dm" +#include "code\datums\managed_browsers\feedback_form.dm" +#include "code\datums\managed_browsers\feedback_viewer.dm" +#include "code\datums\observation\_debug.dm" +#include "code\datums\observation\_defines.dm" +#include "code\datums\observation\destroyed.dm" +#include "code\datums\observation\dir_set.dm" +#include "code\datums\observation\equipped.dm" +#include "code\datums\observation\helpers.dm" +#include "code\datums\observation\logged_in.dm" +#include "code\datums\observation\moved.dm" +#include "code\datums\observation\observation.dm" +#include "code\datums\observation\power_change.dm" +#include "code\datums\observation\shuttle_added.dm" +#include "code\datums\observation\shuttle_moved.dm" +#include "code\datums\observation\stat_set.dm" +#include "code\datums\observation\turf_changed.dm" +#include "code\datums\observation\turf_enterexit.dm" +#include "code\datums\observation\unequipped.dm" +#include "code\datums\observation\z_moved.dm" +#include "code\datums\observation\~cleanup.dm" +#include "code\datums\outfits\_defines.dm" +#include "code\datums\outfits\horror_killers.dm" +#include "code\datums\outfits\misc.dm" +#include "code\datums\outfits\nanotrasen.dm" +#include "code\datums\outfits\outfit.dm" +#include "code\datums\outfits\outfit_vr.dm" +#include "code\datums\outfits\pirates.dm" +#include "code\datums\outfits\spec_op.dm" +#include "code\datums\outfits\tournament.dm" +#include "code\datums\outfits\wizardry.dm" +#include "code\datums\outfits\costumes\costume.dm" +#include "code\datums\outfits\costumes\halloween.dm" +#include "code\datums\outfits\jobs\cargo.dm" +#include "code\datums\outfits\jobs\civilian.dm" +#include "code\datums\outfits\jobs\civilian_vr.dm" +#include "code\datums\outfits\jobs\command.dm" +#include "code\datums\outfits\jobs\command_vr.dm" +#include "code\datums\outfits\jobs\engineering.dm" +#include "code\datums\outfits\jobs\job.dm" +#include "code\datums\outfits\jobs\medical.dm" +#include "code\datums\outfits\jobs\medical_vr.dm" +#include "code\datums\outfits\jobs\misc.dm" +#include "code\datums\outfits\jobs\science.dm" +#include "code\datums\outfits\jobs\science_vr.dm" +#include "code\datums\outfits\jobs\security.dm" +#include "code\datums\outfits\jobs\special_vr.dm" +#include "code\datums\outfits\military\fleet.dm" +#include "code\datums\outfits\military\marines.dm" +#include "code\datums\outfits\military\military.dm" +#include "code\datums\outfits\military\sifguard.dm" +#include "code\datums\repositories\ammomaterial.dm" +#include "code\datums\repositories\cameras.dm" +#include "code\datums\repositories\crew.dm" +#include "code\datums\repositories\decls.dm" +#include "code\datums\repositories\repository.dm" +#include "code\datums\repositories\unique.dm" +#include "code\datums\roundstats\_defines_local.dm" +#include "code\datums\roundstats\departmentgoal.dm" +#include "code\datums\roundstats\roundstats.dm" +#include "code\datums\supplypacks\atmospherics.dm" +#include "code\datums\supplypacks\contraband.dm" +#include "code\datums\supplypacks\contraband_vr.dm" +#include "code\datums\supplypacks\costumes.dm" +#include "code\datums\supplypacks\costumes_vr.dm" +#include "code\datums\supplypacks\engineering.dm" +#include "code\datums\supplypacks\engineering_vr.dm" +#include "code\datums\supplypacks\hospitality.dm" +#include "code\datums\supplypacks\hospitality_vr.dm" +#include "code\datums\supplypacks\hydroponics.dm" +#include "code\datums\supplypacks\hydroponics_vr.dm" +#include "code\datums\supplypacks\materials.dm" +#include "code\datums\supplypacks\medical.dm" +#include "code\datums\supplypacks\medical_vr.dm" +#include "code\datums\supplypacks\misc.dm" +#include "code\datums\supplypacks\misc_vr.dm" +#include "code\datums\supplypacks\munitions.dm" +#include "code\datums\supplypacks\munitions_vr.dm" +#include "code\datums\supplypacks\musical.dm" +#include "code\datums\supplypacks\recreation.dm" +#include "code\datums\supplypacks\recreation_vr.dm" +#include "code\datums\supplypacks\robotics.dm" +#include "code\datums\supplypacks\robotics_vr.dm" +#include "code\datums\supplypacks\science.dm" +#include "code\datums\supplypacks\science_vr.dm" +#include "code\datums\supplypacks\security.dm" +#include "code\datums\supplypacks\security_vr.dm" +#include "code\datums\supplypacks\supply.dm" +#include "code\datums\supplypacks\supply_vr.dm" +#include "code\datums\supplypacks\supplypacks.dm" +#include "code\datums\supplypacks\voidsuits.dm" +#include "code\datums\supplypacks\voidsuits_vr.dm" +#include "code\datums\underwear\bottom.dm" +#include "code\datums\underwear\socks.dm" +#include "code\datums\underwear\top.dm" +#include "code\datums\underwear\undershirts.dm" +#include "code\datums\underwear\underwear.dm" +#include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\ammunition_vr.dm" +#include "code\datums\uplink\announcements.dm" +#include "code\datums\uplink\armor.dm" +#include "code\datums\uplink\backup.dm" +#include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\grenades.dm" +#include "code\datums\uplink\hardsuit_modules.dm" +#include "code\datums\uplink\implants.dm" +#include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\medical_vr.dm" +#include "code\datums\uplink\resources.dm" +#include "code\datums\uplink\stealth_items.dm" +#include "code\datums\uplink\stealthy_weapons.dm" +#include "code\datums\uplink\telecrystals.dm" +#include "code\datums\uplink\tools.dm" +#include "code\datums\uplink\tools_vr.dm" +#include "code\datums\uplink\uplink_categories.dm" +#include "code\datums\uplink\uplink_items.dm" +#include "code\datums\uplink\visible_weapons.dm" +#include "code\datums\uplink\visible_weapons_vr.dm" +#include "code\datums\vending\stored_item.dm" +#include "code\datums\vending\vending.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\grid_checker.dm" +#include "code\datums\wires\jukebox.dm" +#include "code\datums\wires\mines.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\seedstorage.dm" +#include "code\datums\wires\shield_generator.dm" +#include "code\datums\wires\smartfridge.dm" +#include "code\datums\wires\smes.dm" +#include "code\datums\wires\suit_storage_unit.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\datums\wires\wires.dm" +#include "code\defines\gases.dm" +#include "code\defines\obj.dm" +#include "code\defines\obj\weapon.dm" +#include "code\defines\procs\announce.dm" +#include "code\defines\procs\AStar.dm" +#include "code\defines\procs\dbcore.dm" +#include "code\defines\procs\radio.dm" +#include "code\defines\procs\statistics.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\atoms_movable_vr.dm" +#include "code\game\base_turf.dm" +#include "code\game\periodic_news.dm" +#include "code\game\response_team.dm" +#include "code\game\response_team_vr.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\skincmd.dm" +#include "code\game\sound.dm" +#include "code\game\trader_visit.dm" +#include "code\game\trader_visit_vr.dm" +#include "code\game\world.dm" +#include "code\game\antagonist\_antagonist_setup.dm" +#include "code\game\antagonist\antagonist.dm" +#include "code\game\antagonist\antagonist_add.dm" +#include "code\game\antagonist\antagonist_create.dm" +#include "code\game\antagonist\antagonist_equip.dm" +#include "code\game\antagonist\antagonist_factions.dm" +#include "code\game\antagonist\antagonist_helpers.dm" +#include "code\game\antagonist\antagonist_objectives.dm" +#include "code\game\antagonist\antagonist_panel.dm" +#include "code\game\antagonist\antagonist_place.dm" +#include "code\game\antagonist\antagonist_print.dm" +#include "code\game\antagonist\antagonist_update.dm" +#include "code\game\antagonist\alien\borer.dm" +#include "code\game\antagonist\alien\xenomorph.dm" +#include "code\game\antagonist\outsider\commando.dm" +#include "code\game\antagonist\outsider\deathsquad.dm" +#include "code\game\antagonist\outsider\ert.dm" +#include "code\game\antagonist\outsider\ert_vr.dm" +#include "code\game\antagonist\outsider\mercenary.dm" +#include "code\game\antagonist\outsider\ninja.dm" +#include "code\game\antagonist\outsider\raider.dm" +#include "code\game\antagonist\outsider\technomancer.dm" +#include "code\game\antagonist\outsider\trader.dm" +#include "code\game\antagonist\outsider\wizard.dm" +#include "code\game\antagonist\station\changeling.dm" +#include "code\game\antagonist\station\cultist.dm" +#include "code\game\antagonist\station\highlander.dm" +#include "code\game\antagonist\station\infiltrator.dm" +#include "code\game\antagonist\station\loyalist.dm" +#include "code\game\antagonist\station\renegade.dm" +#include "code\game\antagonist\station\revolutionary.dm" +#include "code\game\antagonist\station\rogue_ai.dm" +#include "code\game\antagonist\station\stowaway.dm" +#include "code\game\antagonist\station\thug.dm" +#include "code\game\antagonist\station\traitor.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\areas_vr.dm" +#include "code\game\area\asteroid_areas.dm" +#include "code\game\area\Away Mission areas.dm" +#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\Space Station 13 areas_vr.dm" +#include "code\game\area\ss13_deprecated_areas.dm" +#include "code\game\dna\dna2.dm" +#include "code\game\dna\dna2_domutcheck.dm" +#include "code\game\dna\dna2_helpers.dm" +#include "code\game\dna\dna_modifier.dm" +#include "code\game\dna\genes\disabilities.dm" +#include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\powers.dm" +#include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\game_mode_latespawn.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\calamity\calamity.dm" +#include "code\game\gamemodes\changeling\absorbed_dna.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_powers.dm" +#include "code\game\gamemodes\changeling\generic_equip_procs.dm" +#include "code\game\gamemodes\changeling\modularchangling.dm" +#include "code\game\gamemodes\changeling\powers\absorb.dm" +#include "code\game\gamemodes\changeling\powers\armblade.dm" +#include "code\game\gamemodes\changeling\powers\armor.dm" +#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" +#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" +#include "code\game\gamemodes\changeling\powers\blind_sting.dm" +#include "code\game\gamemodes\changeling\powers\boost_range.dm" +#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" +#include "code\game\gamemodes\changeling\powers\darkvision.dm" +#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" +#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" +#include "code\game\gamemodes\changeling\powers\digital_camo.dm" +#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" +#include "code\game\gamemodes\changeling\powers\endoarmor.dm" +#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" +#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" +#include "code\game\gamemodes\changeling\powers\enrage.dm" +#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" +#include "code\game\gamemodes\changeling\powers\escape_restraints.dm" +#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" +#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" +#include "code\game\gamemodes\changeling\powers\fake_death.dm" +#include "code\game\gamemodes\changeling\powers\fleshmend.dm" +#include "code\game\gamemodes\changeling\powers\hivemind.dm" +#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" +#include "code\game\gamemodes\changeling\powers\panacea.dm" +#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" +#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" +#include "code\game\gamemodes\changeling\powers\respec.dm" +#include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\self_respiration.dm" +#include "code\game\gamemodes\changeling\powers\shriek.dm" +#include "code\game\gamemodes\changeling\powers\silence_sting.dm" +#include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" +#include "code\game\gamemodes\cult\construct_spells.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_items.dm" +#include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\hell_universe.dm" +#include "code\game\gamemodes\cult\narsie.dm" +#include "code\game\gamemodes\cult\ritual.dm" +#include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\cult\soulstone.dm" +#include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\cult\cultify\mob.dm" +#include "code\game\gamemodes\cult\cultify\obj.dm" +#include "code\game\gamemodes\cult\cultify\turf.dm" +#include "code\game\gamemodes\endgame\endgame.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" +#include "code\game\gamemodes\events\black_hole.dm" +#include "code\game\gamemodes\events\clang.dm" +#include "code\game\gamemodes\events\dust.dm" +#include "code\game\gamemodes\events\power_failure.dm" +#include "code\game\gamemodes\events\wormholes.dm" +#include "code\game\gamemodes\events\holidays\Christmas.dm" +#include "code\game\gamemodes\events\holidays\Holidays.dm" +#include "code\game\gamemodes\events\holidays\Other.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\heist\heist.dm" +#include "code\game\gamemodes\infiltrator\infiltrator.dm" +#include "code\game\gamemodes\malfunction\malf_hardware.dm" +#include "code\game\gamemodes\malfunction\malf_research.dm" +#include "code\game\gamemodes\malfunction\malf_research_ability.dm" +#include "code\game\gamemodes\malfunction\malfunction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\meteor\meteors_vr.dm" +#include "code\game\gamemodes\mixed\conflux.dm" +#include "code\game\gamemodes\mixed\infestation.dm" +#include "code\game\gamemodes\mixed\intrigue.dm" +#include "code\game\gamemodes\mixed\lizard.dm" +#include "code\game\gamemodes\mixed\mercrenegade.dm" +#include "code\game\gamemodes\mixed\mercwiz.dm" +#include "code\game\gamemodes\mixed\paranoia.dm" +#include "code\game\gamemodes\mixed\traitorling.dm" +#include "code\game\gamemodes\mixed\traitorrenegade.dm" +#include "code\game\gamemodes\mixed\uprising.dm" +#include "code\game\gamemodes\mixed\visitors.dm" +#include "code\game\gamemodes\ninja\ninja.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\pinpointer.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\technomancer\catalog.dm" +#include "code\game\gamemodes\technomancer\clothing.dm" +#include "code\game\gamemodes\technomancer\core_obj.dm" +#include "code\game\gamemodes\technomancer\equipment.dm" +#include "code\game\gamemodes\technomancer\instability.dm" +#include "code\game\gamemodes\technomancer\spell_objs.dm" +#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" +#include "code\game\gamemodes\technomancer\technomancer.dm" +#include "code\game\gamemodes\technomancer\assistance\assistance.dm" +#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" +#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" +#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" +#include "code\game\gamemodes\technomancer\devices\hypos.dm" +#include "code\game\gamemodes\technomancer\devices\implants.dm" +#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" +#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" +#include "code\game\gamemodes\technomancer\spells\abjuration.dm" +#include "code\game\gamemodes\technomancer\spells\apportation.dm" +#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" +#include "code\game\gamemodes\technomancer\spells\blink.dm" +#include "code\game\gamemodes\technomancer\spells\chroma.dm" +#include "code\game\gamemodes\technomancer\spells\condensation.dm" +#include "code\game\gamemodes\technomancer\spells\control.dm" +#include "code\game\gamemodes\technomancer\spells\dispel.dm" +#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" +#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" +#include "code\game\gamemodes\technomancer\spells\gambit.dm" +#include "code\game\gamemodes\technomancer\spells\illusion.dm" +#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" +#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" +#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" +#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" +#include "code\game\gamemodes\technomancer\spells\passwall.dm" +#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" +#include "code\game\gamemodes\technomancer\spells\radiance.dm" +#include "code\game\gamemodes\technomancer\spells\reflect.dm" +#include "code\game\gamemodes\technomancer\spells\resurrect.dm" +#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" +#include "code\game\gamemodes\technomancer\spells\shield.dm" +#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" +#include "code\game\gamemodes\technomancer\spells\track.dm" +#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" +#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_all.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\purify.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lesser_chain_lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_ward.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\jobs\_access_defs.dm" +#include "code\game\jobs\access.dm" +#include "code\game\jobs\access_datum.dm" +#include "code\game\jobs\access_datum_vr.dm" +#include "code\game\jobs\job_controller.dm" +#include "code\game\jobs\jobs.dm" +#include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\whitelist_vr.dm" +#include "code\game\jobs\job\_alt_title.dm" +#include "code\game\jobs\job\assistant.dm" +#include "code\game\jobs\job\assistant_vr.dm" +#include "code\game\jobs\job\captain.dm" +#include "code\game\jobs\job\captain_vr.dm" +#include "code\game\jobs\job\civilian.dm" +#include "code\game\jobs\job\civilian_chaplain.dm" +#include "code\game\jobs\job\civilian_vr.dm" +#include "code\game\jobs\job\department.dm" +#include "code\game\jobs\job\department_vr.dm" +#include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\engineering_vr.dm" +#include "code\game\jobs\job\exploration_vr.dm" +#include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\job_vr.dm" +#include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\medical_vr.dm" +#include "code\game\jobs\job\offduty_vr.dm" +#include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\science_vr.dm" +#include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\security_vr.dm" +#include "code\game\jobs\job\silicon.dm" +#include "code\game\jobs\job\silicon_vr.dm" +#include "code\game\jobs\job\special_vr.dm" +#include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\adv_med_vr.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\air_alarm.dm" +#include "code\game\machinery\airconditioner_vr.dm" +#include "code\game\machinery\atmo_control.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\biogenerator.dm" +#include "code\game\machinery\bioprinter.dm" +#include "code\game\machinery\bomb_tester_vr.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\buttons_vr.dm" +#include "code\game\machinery\CableLayer.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\cryopod_vr.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\deployable_vr.dm" +#include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doorbell_vr.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\exonet_node.dm" +#include "code\game\machinery\fire_alarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\floor_light.dm" +#include "code\game\machinery\floorlayer.dm" +#include "code\game\machinery\frame.dm" +#include "code\game\machinery\gear_dispenser.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holoposter.dm" +#include "code\game\machinery\holosign.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\jukebox.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\machinery.dm" +#include "code\game\machinery\machinery_power.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\neonsign.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\nuclear_bomb.dm" +#include "code\game\machinery\OpTable.dm" +#include "code\game\machinery\overview.dm" +#include "code\game\machinery\oxygen_pump.dm" +#include "code\game\machinery\painter_vr.dm" +#include "code\game\machinery\partslathe_vr.dm" +#include "code\game\machinery\pda_multicaster.dm" +#include "code\game\machinery\pointdefense.dm" +#include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\portable_turret_vr.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\requests_console_vr.dm" +#include "code\game\machinery\robot_fabricator.dm" +#include "code\game\machinery\seed_extractor.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\status_display_ai.dm" +#include "code\game\machinery\suit_cycler_datums.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\suit_storage_unit_vr.dm" +#include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\supplybeacon.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebeacon_vr.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transportpod.dm" +#include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\vending_machines_vr.dm" +#include "code\game\machinery\vitals_monitor.dm" +#include "code\game\machinery\wall_frames.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer_vr.dm" +#include "code\game\machinery\atmoalter\canister.dm" +#include "code\game\machinery\atmoalter\clamp.dm" +#include "code\game\machinery\atmoalter\meter.dm" +#include "code\game\machinery\atmoalter\portable_atmospherics.dm" +#include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\pump_vr.dm" +#include "code\game\machinery\atmoalter\scrubber.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\camera_vr.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\ai_core.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\arcade_vr.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_vr.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\computer.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\guestpass.dm" +#include "code\game\machinery\computer\id_restorer_vr.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\message.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\prisoner.dm" +#include "code\game\machinery\computer\prisonshuttle.dm" +#include "code\game\machinery\computer\RCON_Console.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\shutoff_monitor.dm" +#include "code\game\machinery\computer\shuttle.dm" +#include "code\game\machinery\computer\skills.dm" +#include "code\game\machinery\computer\specops_shuttle.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\supply.dm" +#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer\timeclock_vr.dm" +#include "code\game\machinery\computer\~computer_vr.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_control.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_vr.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\blast_door.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\door_vr.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\firedoor_assembly.dm" +#include "code\game\machinery\doors\firedoor_vr.dm" +#include "code\game\machinery\doors\multi_tile.dm" +#include "code\game\machinery\doors\multi_tile_vr.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\airlock_controllers.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" +#include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\docking_program.dm" +#include "code\game\machinery\embedded_controller\docking_program_multi.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\embedded_program_base.dm" +#include "code\game\machinery\embedded_controller\mapping_helpers.dm" +#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" +#include "code\game\machinery\event\stage_vr.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\pipe\pipe_recipes.dm" +#include "code\game\machinery\pipe\pipelayer.dm" +#include "code\game\machinery\reagents\pump.dm" +#include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\broadcaster_vr.dm" +#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\presets_vr.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\telemonitor.dm" +#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\machinery\virtual_reality\ar_console.dm" +#include "code\game\machinery\virtual_reality\vr_console.dm" +#include "code\game\magic\Uristrunes.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mech_prosthetics.dm" +#include "code\game\mecha\mech_sensor.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_appearance.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_helpers.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_vr.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\fighter.dm" +#include "code\game\mecha\combat\gorilla.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\components\_component.dm" +#include "code\game\mecha\components\actuators.dm" +#include "code\game\mecha\components\armor.dm" +#include "code\game\mecha\components\electrical.dm" +#include "code\game\mecha\components\hull.dm" +#include "code\game\mecha\components\lifesupport.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm" +#include "code\game\mecha\equipment\tools\armor_melee.dm" +#include "code\game\mecha\equipment\tools\armor_ranged.dm" +#include "code\game\mecha\equipment\tools\cable_layer.dm" +#include "code\game\mecha\equipment\tools\catapult.dm" +#include "code\game\mecha\equipment\tools\clamp.dm" +#include "code\game\mecha\equipment\tools\cloak.dm" +#include "code\game\mecha\equipment\tools\drill.dm" +#include "code\game\mecha\equipment\tools\energy_relay.dm" +#include "code\game\mecha\equipment\tools\extinguisher.dm" +#include "code\game\mecha\equipment\tools\generator.dm" +#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" +#include "code\game\mecha\equipment\tools\inflatables.dm" +#include "code\game\mecha\equipment\tools\jetpack.dm" +#include "code\game\mecha\equipment\tools\medigun_vr.dm" +#include "code\game\mecha\equipment\tools\orescanner.dm" +#include "code\game\mecha\equipment\tools\passenger.dm" +#include "code\game\mecha\equipment\tools\powertool.dm" +#include "code\game\mecha\equipment\tools\rcd.dm" +#include "code\game\mecha\equipment\tools\repair_droid.dm" +#include "code\game\mecha\equipment\tools\running_board.dm" +#include "code\game\mecha\equipment\tools\shield.dm" +#include "code\game\mecha\equipment\tools\shield_omni.dm" +#include "code\game\mecha\equipment\tools\sleeper.dm" +#include "code\game\mecha\equipment\tools\speedboost.dm" +#include "code\game\mecha\equipment\tools\syringe_gun.dm" +#include "code\game\mecha\equipment\tools\teleporter.dm" +#include "code\game\mecha\equipment\tools\tools.dm" +#include "code\game\mecha\equipment\tools\weldinglaser.dm" +#include "code\game\mecha\equipment\tools\wormhole.dm" +#include "code\game\mecha\equipment\weapons\honk.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm" +#include "code\game\mecha\equipment\weapons\ballistic\ballistic.dm" +#include "code\game\mecha\equipment\weapons\ballistic\mortar.dm" +#include "code\game\mecha\equipment\weapons\ballistic\shotgun.dm" +#include "code\game\mecha\equipment\weapons\defense\shocker.dm" +#include "code\game\mecha\equipment\weapons\energy\energy.dm" +#include "code\game\mecha\equipment\weapons\energy\ion.dm" +#include "code\game\mecha\equipment\weapons\energy\laser.dm" +#include "code\game\mecha\equipment\weapons\energy\phased.dm" +#include "code\game\mecha\equipment\weapons\energy\pulse.dm" +#include "code\game\mecha\equipment\weapons\energy\stun.dm" +#include "code\game\mecha\equipment\weapons\explosive\grenade.dm" +#include "code\game\mecha\equipment\weapons\explosive\missile.dm" +#include "code\game\mecha\equipment\weapons\fire\flamethrower.dm" +#include "code\game\mecha\equipment\weapons\fire\incendiary.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\medical\odysseus_vr.dm" +#include "code\game\mecha\micro\mecha_construction_paths_vr.dm" +#include "code\game\mecha\micro\mecha_parts_vr.dm" +#include "code\game\mecha\micro\mecha_vr.dm" +#include "code\game\mecha\micro\mechfab_designs_vr.dm" +#include "code\game\mecha\micro\micro.dm" +#include "code\game\mecha\micro\micro_equipment.dm" +#include "code\game\mecha\micro\security.dm" +#include "code\game\mecha\micro\utility.dm" +#include "code\game\mecha\space\hoverpod.dm" +#include "code\game\mecha\space\shuttle.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\ripley_vr.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\banners.dm" +#include "code\game\objects\banners_vr.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\explosion.dm" +#include "code\game\objects\explosion_recursive.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\mob_spawner_vr.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\stumble_into_vr.dm" +#include "code\game\objects\weapons.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\confetti_vr.dm" +#include "code\game\objects\effects\effect_system.dm" +#include "code\game\objects\effects\explosion_particles.dm" +#include "code\game\objects\effects\gibs.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\item_pickup_ghost.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\landmarks_vr.dm" +#include "code\game\objects\effects\manifest.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\semirandom_mobs_vr.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\spiders_vr.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\zone_divider.dm" +#include "code\game\objects\effects\alien\aliens.dm" +#include "code\game\objects\effects\chem\chemsmoke.dm" +#include "code\game\objects\effects\chem\coating.dm" +#include "code\game\objects\effects\chem\foam.dm" +#include "code\game\objects\effects\chem\foam_vr.dm" +#include "code\game\objects\effects\chem\water.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\warning_stripes.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\fuel.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" +#include "code\game\objects\effects\decals\posters\bs12.dm" +#include "code\game\objects\effects\decals\posters\polarisposters.dm" +#include "code\game\objects\effects\decals\posters\polarisposters_vr.dm" +#include "code\game\objects\effects\decals\posters\posters.dm" +#include "code\game\objects\effects\decals\posters\tgposters.dm" +#include "code\game\objects\effects\decals\posters\voreposters_vr.dm" +#include "code\game\objects\effects\map_effects\beam_point.dm" +#include "code\game\objects\effects\map_effects\effect_emitter.dm" +#include "code\game\objects\effects\map_effects\map_effects.dm" +#include "code\game\objects\effects\map_effects\perma_light.dm" +#include "code\game\objects\effects\map_effects\portal.dm" +#include "code\game\objects\effects\map_effects\radiation_emitter.dm" +#include "code\game\objects\effects\map_effects\screen_shaker.dm" +#include "code\game\objects\effects\map_effects\sound_emitter.dm" +#include "code\game\objects\effects\prop\columnblast.dm" +#include "code\game\objects\effects\prop\snake.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\graffiti.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "code\game\objects\items\antag_spawners.dm" +#include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\bells.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\contraband_vr.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\falling_object_vr.dm" +#include "code\game\objects\items\glassjar.dm" +#include "code\game\objects\items\gunbox.dm" +#include "code\game\objects\items\gunbox_vr.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\paintkit.dm" +#include "code\game\objects\items\pizza_voucher_vr.dm" +#include "code\game\objects\items\poi_items.dm" +#include "code\game\objects\items\robobag.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\tailoring.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\trash_material.dm" +#include "code\game\objects\items\trash_vr.dm" +#include "code\game\objects\items\uav.dm" +#include "code\game\objects\items\devices\advnifrepair.dm" +#include "code\game\objects\items\devices\ai_detector.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\binoculars.dm" +#include "code\game\objects\items\devices\body_snatcher_vr.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\debugger.dm" +#include "code\game\objects\items\devices\defib.dm" +#include "code\game\objects\items\devices\denecrotizer_vr.dm" +#include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flash_vr.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\flashlight_vr.dm" +#include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\geiger.dm" +#include "code\game\objects\items\devices\gps.dm" +#include "code\game\objects\items\devices\hacktool.dm" +#include "code\game\objects\items\devices\holowarrant.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\modkit.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\scanners_vr.dm" +#include "code\game\objects\items\devices\spy_bug.dm" +#include "code\game\objects\items\devices\suit_cooling.dm" +#include "code\game\objects\items\devices\t_scanner.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\text_to_speech.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\translator.dm" +#include "code\game\objects\items\devices\translocator_vr.dm" +#include "code\game\objects\items\devices\tvcamera.dm" +#include "code\game\objects\items\devices\uplink.dm" +#include "code\game\objects\items\devices\uplink_random_lists.dm" +#include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\communicator\communicator.dm" +#include "code\game\objects\items\devices\communicator\helper.dm" +#include "code\game\objects\items\devices\communicator\integrated.dm" +#include "code\game\objects\items\devices\communicator\messaging.dm" +#include "code\game\objects\items\devices\communicator\phone.dm" +#include "code\game\objects\items\devices\communicator\UI_tgui.dm" +#include "code\game\objects\items\devices\radio\beacon.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\headset_vr.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\jammer.dm" +#include "code\game\objects\items\devices\radio\jammer_vr.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\devices\radio\radio_vr.dm" +#include "code\game\objects\items\devices\radio\radiopack.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\robot\robot_upgrades_vr.dm" +#include "code\game\objects\items\stacks\marker_beacons.dm" +#include "code\game\objects\items\stacks\matter_synth.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\medical_vr.dm" +#include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\nanopaste_vr.dm" +#include "code\game\objects\items\stacks\sandbags.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\tickets.dm" +#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\toys\balls_vr.dm" +#include "code\game\objects\items\toys\godfigures.dm" +#include "code\game\objects\items\toys\mech_toys.dm" +#include "code\game\objects\items\toys\toys.dm" +#include "code\game\objects\items\toys\toys_vr.dm" +#include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\AI_modules_vr.dm" +#include "code\game\objects\items\weapons\augment_items.dm" +#include "code\game\objects\items\weapons\autopsy.dm" +#include "code\game\objects\items\weapons\bones.dm" +#include "code\game\objects\items\weapons\candle.dm" +#include "code\game\objects\items\weapons\canes.dm" +#include "code\game\objects\items\weapons\cards_ids_vr.dm" +#include "code\game\objects\items\weapons\chewables.dm" +#include "code\game\objects\items\weapons\cigs_lighters.dm" +#include "code\game\objects\items\weapons\clown_items.dm" +#include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\dna_injector.dm" +#include "code\game\objects\items\weapons\ecigs.dm" +#include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\explosives_vr.dm" +#include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\flamethrower.dm" +#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\handcuffs_vr.dm" +#include "code\game\objects\items\weapons\improvised_components.dm" +#include "code\game\objects\items\weapons\inducer_vr.dm" +#include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\manuals_vr.dm" +#include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\mop_deploy.dm" +#include "code\game\objects\items\weapons\paint.dm" +#include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\policetape.dm" +#include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RCD_vr.dm" +#include "code\game\objects\items\weapons\RMS_vr.dm" +#include "code\game\objects\items\weapons\RPD_vr.dm" +#include "code\game\objects\items\weapons\RSF.dm" +#include "code\game\objects\items\weapons\scrolls.dm" +#include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\shields_vr.dm" +#include "code\game\objects\items\weapons\stunbaton.dm" +#include "code\game\objects\items\weapons\surgery_tools.dm" +#include "code\game\objects\items\weapons\swords_axes_etc.dm" +#include "code\game\objects\items\weapons\syndie.dm" +#include "code\game\objects\items\weapons\tape.dm" +#include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\towels.dm" +#include "code\game\objects\items\weapons\traps.dm" +#include "code\game\objects\items\weapons\traps_vr.dm" +#include "code\game\objects\items\weapons\trays.dm" +#include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\weldbackpack.dm" +#include "code\game\objects\items\weapons\circuitboards\broken.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" +#include "code\game\objects\items\weapons\circuitboards\frame.dm" +#include "code\game\objects\items\weapons\circuitboards\mecha.dm" +#include "code\game\objects\items\weapons\circuitboards\other.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\fluidpump.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" +#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" +#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\concussion.dm" +#include "code\game\objects\items\weapons\grenades\emgrenade.dm" +#include "code\game\objects\items\weapons\grenades\explosive.dm" +#include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\projectile.dm" +#include "code\game\objects\items\weapons\grenades\smokebomb.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade_vr.dm" +#include "code\game\objects\items\weapons\grenades\supermatter.dm" +#include "code\game\objects\items\weapons\id cards\cards.dm" +#include "code\game\objects\items\weapons\id cards\cards_vr.dm" +#include "code\game\objects\items\weapons\id cards\id_stacks.dm" +#include "code\game\objects\items\weapons\id cards\id_stacks_vr.dm" +#include "code\game\objects\items\weapons\id cards\station_ids.dm" +#include "code\game\objects\items\weapons\id cards\station_ids_vr.dm" +#include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" +#include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implant_vr.dm" +#include "code\game\objects\items\weapons\implants\implantaugment.dm" +#include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantcase_vr.dm" +#include "code\game\objects\items\weapons\implants\implantchair.dm" +#include "code\game\objects\items\weapons\implants\implantcircuits.dm" +#include "code\game\objects\items\weapons\implants\implantdud.dm" +#include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implanter_vr.dm" +#include "code\game\objects\items\weapons\implants\implantfreedom.dm" +#include "code\game\objects\items\weapons\implants\implantlanguage.dm" +#include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" +#include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" +#include "code\game\objects\items\weapons\implants\neuralbasic.dm" +#include "code\game\objects\items\weapons\material\ashtray.dm" +#include "code\game\objects\items\weapons\material\bats.dm" +#include "code\game\objects\items\weapons\material\chainsaw.dm" +#include "code\game\objects\items\weapons\material\foam.dm" +#include "code\game\objects\items\weapons\material\gravemarker.dm" +#include "code\game\objects\items\weapons\material\kitchen.dm" +#include "code\game\objects\items\weapons\material\knives.dm" +#include "code\game\objects\items\weapons\material\knives_vr.dm" +#include "code\game\objects\items\weapons\material\material_armor.dm" +#include "code\game\objects\items\weapons\material\material_weapons.dm" +#include "code\game\objects\items\weapons\material\misc.dm" +#include "code\game\objects\items\weapons\material\shards.dm" +#include "code\game\objects\items\weapons\material\shards_vr.dm" +#include "code\game\objects\items\weapons\material\swords.dm" +#include "code\game\objects\items\weapons\material\thrown.dm" +#include "code\game\objects\items\weapons\material\twohanded.dm" +#include "code\game\objects\items\weapons\material\twohanded_vr.dm" +#include "code\game\objects\items\weapons\material\whetstone.dm" +#include "code\game\objects\items\weapons\melee\deflect.dm" +#include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\energy_vr.dm" +#include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\melee\misc_vr.dm" +#include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\backpack_vr.dm" +#include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\bags_vr.dm" +#include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\belt_vr.dm" +#include "code\game\objects\items\weapons\storage\bible.dm" +#include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\boxes_vr.dm" +#include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\egg_vr.dm" +#include "code\game\objects\items\weapons\storage\fancy.dm" +#include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\firstaid_vr.dm" +#include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\laundry_basket.dm" +#include "code\game\objects\items\weapons\storage\lockbox.dm" +#include "code\game\objects\items\weapons\storage\misc.dm" +#include "code\game\objects\items\weapons\storage\mre.dm" +#include "code\game\objects\items\weapons\storage\pouches.dm" +#include "code\game\objects\items\weapons\storage\quickdraw.dm" +#include "code\game\objects\items\weapons\storage\secure.dm" +#include "code\game\objects\items\weapons\storage\storage.dm" +#include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\toolbox_vr.dm" +#include "code\game\objects\items\weapons\storage\uplink_kits.dm" +#include "code\game\objects\items\weapons\storage\wallets.dm" +#include "code\game\objects\items\weapons\tanks\jetpack.dm" +#include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" +#include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\items\weapons\tools\crowbar.dm" +#include "code\game\objects\items\weapons\tools\crowbar_vr.dm" +#include "code\game\objects\items\weapons\tools\screwdriver.dm" +#include "code\game\objects\items\weapons\tools\weldingtool.dm" +#include "code\game\objects\items\weapons\tools\wirecutters.dm" +#include "code\game\objects\items\weapons\tools\wrench.dm" +#include "code\game\objects\random\_random.dm" +#include "code\game\objects\random\guns_and_ammo.dm" +#include "code\game\objects\random\maintenance.dm" +#include "code\game\objects\random\mapping.dm" +#include "code\game\objects\random\mapping_vr.dm" +#include "code\game\objects\random\mechs.dm" +#include "code\game\objects\random\misc.dm" +#include "code\game\objects\random\misc_vr.dm" +#include "code\game\objects\random\mob.dm" +#include "code\game\objects\random\mob_vr.dm" +#include "code\game\objects\random\spacesuits.dm" +#include "code\game\objects\random\unidentified\medicine.dm" +#include "code\game\objects\structures\artstuff.dm" +#include "code\game\objects\structures\barricades.dm" +#include "code\game\objects\structures\barsign.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\bedsheet_bin_vr.dm" +#include "code\game\objects\structures\bonfire.dm" +#include "code\game\objects\structures\catwalk.dm" +#include "code\game\objects\structures\cliff.dm" +#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\dancepole_vr.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\dogbed.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fence.dm" +#include "code\game\objects\structures\fireaxe.dm" +#include "code\game\objects\structures\fitness.dm" +#include "code\game\objects\structures\fitness_vr.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\gravemarker.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\handrail.dm" +#include "code\game\objects\structures\holoplant.dm" +#include "code\game\objects\structures\inflatable.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_foodcart_vr.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\ledges.dm" +#include "code\game\objects\structures\lightpost.dm" +#include "code\game\objects\structures\loot_piles.dm" +#include "code\game\objects\structures\map_blocker_vr.dm" +#include "code\game\objects\structures\medical_stand_vr.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\morgue_vr.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\railing.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\salvageable.dm" +#include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\signs_vr.dm" +#include "code\game\objects\structures\simple_doors.dm" +#include "code\game\objects\structures\simple_doors_vr.dm" +#include "code\game\objects\structures\snowman.dm" +#include "code\game\objects\structures\stasis_cage.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\transit_tubes.dm" +#include "code\game\objects\structures\trash_pile_vr.dm" +#include "code\game\objects\structures\under_wardrobe.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\watercloset_vr.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\window_vr.dm" +#include "code\game\objects\structures\crates_lockers\__closets.dm" +#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" +#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\crates_vr.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\largecrate_vr.dm" +#include "code\game\objects\structures\crates_lockers\vehiclecage.dm" +#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" +#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\egg_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\misc_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" +#include "code\game\objects\structures\flora\flora.dm" +#include "code\game\objects\structures\flora\flora_vr.dm" +#include "code\game\objects\structures\flora\grass.dm" +#include "code\game\objects\structures\flora\moretrees_vr.dm" +#include "code\game\objects\structures\flora\trees.dm" +#include "code\game\objects\structures\ghost_pods\event_vr.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" +#include "code\game\objects\structures\ghost_pods\human.dm" +#include "code\game\objects\structures\ghost_pods\mysterious.dm" +#include "code\game\objects\structures\ghost_pods\silicon.dm" +#include "code\game\objects\structures\ghost_pods\silicon_vr.dm" +#include "code\game\objects\structures\props\alien_props.dm" +#include "code\game\objects\structures\props\alien_props_vr.dm" +#include "code\game\objects\structures\props\beam_prism.dm" +#include "code\game\objects\structures\props\blackbox.dm" +#include "code\game\objects\structures\props\fake_ai.dm" +#include "code\game\objects\structures\props\nest.dm" +#include "code\game\objects\structures\props\projectile_lock.dm" +#include "code\game\objects\structures\props\prop.dm" +#include "code\game\objects\structures\props\puzzledoor.dm" +#include "code\game\objects\structures\props\rocks.dm" +#include "code\game\objects\structures\props\swarm.dm" +#include "code\game\objects\structures\props\transmitter.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs_vr.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" +#include "code\game\turfs\simulated.dm" +#include "code\game\turfs\simulated_vr.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\turf_changing.dm" +#include "code\game\turfs\turf_flick_animations.dm" +#include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\flooring\flooring.dm" +#include "code\game\turfs\flooring\flooring_decals.dm" +#include "code\game\turfs\flooring\flooring_decals_vr.dm" +#include "code\game\turfs\flooring\flooring_premade.dm" +#include "code\game\turfs\flooring\flooring_vr.dm" +#include "code\game\turfs\flooring\shuttle_vr.dm" +#include "code\game\turfs\initialization\init.dm" +#include "code\game\turfs\initialization\maintenance.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\floor_acts.dm" +#include "code\game\turfs\simulated\floor_attackby.dm" +#include "code\game\turfs\simulated\floor_damage.dm" +#include "code\game\turfs\simulated\floor_icon.dm" +#include "code\game\turfs\simulated\floor_static.dm" +#include "code\game\turfs\simulated\floor_types.dm" +#include "code\game\turfs\simulated\floor_types_eris.dm" +#include "code\game\turfs\simulated\floor_types_vr.dm" +#include "code\game\turfs\simulated\lava.dm" +#include "code\game\turfs\simulated\wall_attacks.dm" +#include "code\game\turfs\simulated\wall_icon.dm" +#include "code\game\turfs\simulated\wall_types.dm" +#include "code\game\turfs\simulated\wall_types_vr.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\water_vr.dm" +#include "code\game\turfs\simulated\dungeon\floor.dm" +#include "code\game\turfs\simulated\dungeon\wall.dm" +#include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" +#include "code\game\turfs\simulated\outdoors\dirt.dm" +#include "code\game\turfs\simulated\outdoors\grass.dm" +#include "code\game\turfs\simulated\outdoors\ironsand_vr.dm" +#include "code\game\turfs\simulated\outdoors\outdoors.dm" +#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" +#include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" +#include "code\game\turfs\simulated\outdoors\sky.dm" +#include "code\game\turfs\simulated\outdoors\snow.dm" +#include "code\game\turfs\snow\snow.dm" +#include "code\game\turfs\space\cracked_asteroid.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\beach_vr.dm" +#include "code\game\turfs\unsimulated\floor.dm" +#include "code\game\turfs\unsimulated\planetary.dm" +#include "code\game\turfs\unsimulated\planetary_vr.dm" +#include "code\game\turfs\unsimulated\shuttle.dm" +#include "code\game\turfs\unsimulated\sky_vr.dm" +#include "code\game\turfs\unsimulated\walls.dm" +#include "code\js\byjax.dm" +#include "code\js\menus.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_attack_log.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_memo.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_secrets.dm" +#include "code\modules\admin\admin_tools.dm" +#include "code\modules\admin\admin_verb_lists_vr.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\admin_vr.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\ckey_vr.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\map_capture.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\news.dm" +#include "code\modules\admin\persistence.dm" +#include "code\modules\admin\player_notes.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\callproc\callproc.dm" +#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" +#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" +#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" +#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" +#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" +#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" +#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" +#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" +#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" +#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" +#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" +#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" +#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" +#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" +#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" +#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\only_one.dm" +#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" +#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm" +#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" +#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" +#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" +#include "code\modules\admin\secrets\random_events\gravity_vr.dm" +#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" +#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminhelp_vr.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\antag-ooc.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\buildmode.dm" +#include "code\modules\admin\verbs\change_appearance.dm" +#include "code\modules\admin\verbs\check_customitem_activity.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\custom_event.dm" +#include "code\modules\admin\verbs\dbcon_fix.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\debug_vr.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\fps.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\grief_fixers.dm" +#include "code\modules\admin\verbs\lightning_strike.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\panicbunker.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\randomverbs_vr.dm" +#include "code\modules\admin\verbs\resize.dm" +#include "code\modules\admin\verbs\smite.dm" +#include "code\modules\admin\verbs\smite_vr.dm" +#include "code\modules\admin\verbs\striketeam.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\admin\view_variables\admin_delete.dm" +#include "code\modules\admin\view_variables\debug_variables.dm" +#include "code\modules\admin\view_variables\get_variables.dm" +#include "code\modules\admin\view_variables\helpers.dm" +#include "code\modules\admin\view_variables\mass_edit_variables.dm" +#include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\topic_list.dm" +#include "code\modules\admin\view_variables\view_variables.dm" +#include "code\modules\admin\view_variables\view_variables_global.dm" +#include "code\modules\ai\_defines.dm" +#include "code\modules\ai\ai_holder.dm" +#include "code\modules\ai\ai_holder_combat.dm" +#include "code\modules\ai\ai_holder_combat_unseen.dm" +#include "code\modules\ai\ai_holder_communication.dm" +#include "code\modules\ai\ai_holder_cooperation.dm" +#include "code\modules\ai\ai_holder_debug.dm" +#include "code\modules\ai\ai_holder_disabled.dm" +#include "code\modules\ai\ai_holder_fleeing.dm" +#include "code\modules\ai\ai_holder_follow.dm" +#include "code\modules\ai\ai_holder_movement.dm" +#include "code\modules\ai\ai_holder_pathfinding.dm" +#include "code\modules\ai\ai_holder_targeting.dm" +#include "code\modules\ai\ai_holder_targeting_vr.dm" +#include "code\modules\ai\interfaces.dm" +#include "code\modules\ai\say_list.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" +#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" +#include "code\modules\alarm\alarm.dm" +#include "code\modules\alarm\alarm_handler.dm" +#include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\camera_alarm.dm" +#include "code\modules\alarm\fire_alarm.dm" +#include "code\modules\alarm\motion_alarm.dm" +#include "code\modules\alarm\power_alarm.dm" +#include "code\modules\artifice\cursedform.dm" +#include "code\modules\artifice\deadringer.dm" +#include "code\modules\artifice\telecube.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\asset_cache\asset_cache.dm" +#include "code\modules\asset_cache\asset_cache_client.dm" +#include "code\modules\asset_cache\asset_cache_item.dm" +#include "code\modules\asset_cache\asset_list.dm" +#include "code\modules\asset_cache\asset_list_items.dm" +#include "code\modules\awaymissions\bluespaceartillery.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\gateway_vr.dm" +#include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\loot_vr.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\trigger.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\blob\blob.dm" +#include "code\modules\blob2\_defines.dm" +#include "code\modules\blob2\core_chunk.dm" +#include "code\modules\blob2\blobs\base_blob.dm" +#include "code\modules\blob2\blobs\core.dm" +#include "code\modules\blob2\blobs\factory.dm" +#include "code\modules\blob2\blobs\node.dm" +#include "code\modules\blob2\blobs\normal.dm" +#include "code\modules\blob2\blobs\resource.dm" +#include "code\modules\blob2\blobs\shield.dm" +#include "code\modules\blob2\overmind\overmind.dm" +#include "code\modules\blob2\overmind\powers.dm" +#include "code\modules\blob2\overmind\types.dm" +#include "code\modules\blob2\overmind\types\blazing_oil.dm" +#include "code\modules\blob2\overmind\types\classic.dm" +#include "code\modules\blob2\overmind\types\cryogenic_goo.dm" +#include "code\modules\blob2\overmind\types\ectoplasmic_horror.dm" +#include "code\modules\blob2\overmind\types\electromagnetic_web.dm" +#include "code\modules\blob2\overmind\types\energized_jelly.dm" +#include "code\modules\blob2\overmind\types\explosive_lattice.dm" +#include "code\modules\blob2\overmind\types\fabrication_swarm.dm" +#include "code\modules\blob2\overmind\types\fulminant_organism.dm" +#include "code\modules\blob2\overmind\types\fungal_bloom.dm" +#include "code\modules\blob2\overmind\types\grey_goo.dm" +#include "code\modules\blob2\overmind\types\pressurized_slime.dm" +#include "code\modules\blob2\overmind\types\radioactive_ooze.dm" +#include "code\modules\blob2\overmind\types\ravenous_macrophage.dm" +#include "code\modules\blob2\overmind\types\reactive_spines.dm" +#include "code\modules\blob2\overmind\types\roiling_mold.dm" +#include "code\modules\blob2\overmind\types\shifting_fragments.dm" +#include "code\modules\blob2\overmind\types\synchronous_mesh.dm" +#include "code\modules\blob2\overmind\types\volatile_alluvium.dm" +#include "code\modules\busy_space_vr\air_traffic.dm" +#include "code\modules\busy_space_vr\loremaster.dm" +#include "code\modules\busy_space_vr\organizations.dm" +#include "code\modules\catalogue\atoms.dm" +#include "code\modules\catalogue\catalogue_data.dm" +#include "code\modules\catalogue\catalogue_data_vr.dm" +#include "code\modules\catalogue\cataloguer.dm" +#include "code\modules\catalogue\cataloguer_visuals.dm" +#include "code\modules\catalogue\cataloguer_vr.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" +#include "code\modules\client\client procs_vr.dm" +#include "code\modules\client\movement.dm" +#include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_factions.dm" +#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_spawnpoints.dm" +#include "code\modules\client\preferences_toggle_procs.dm" +#include "code\modules\client\preferences_vr.dm" +#include "code\modules\client\spam_prevention.dm" +#include "code\modules\client\ui_style.dm" +#include "code\modules\client\preference_setup\_defines.dm" +#include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\preference_setup_vr.dm" +#include "code\modules\client\preference_setup\antagonism\01_basic.dm" +#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" +#include "code\modules\client\preference_setup\general\01_basic.dm" +#include "code\modules\client\preference_setup\general\02_language.dm" +#include "code\modules\client\preference_setup\general\03_body.dm" +#include "code\modules\client\preference_setup\general\04_equipment.dm" +#include "code\modules\client\preference_setup\general\05_background.dm" +#include "code\modules\client\preference_setup\general\06_flavor.dm" +#include "code\modules\client\preference_setup\global\01_ui.dm" +#include "code\modules\client\preference_setup\global\02_settings.dm" +#include "code\modules\client\preference_setup\global\03_pai.dm" +#include "code\modules\client\preference_setup\global\04_ooc.dm" +#include "code\modules\client\preference_setup\global\setting_datums.dm" +#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" +#include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout.dm" +#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" +#include "code\modules\client\preference_setup\loadout\loadout_accessories_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cosmetics_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" +#include "code\modules\client\preference_setup\loadout\loadout_ears.dm" +#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_eyes_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" +#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_head.dm" +#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_mask.dm" +#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" +#include "code\modules\client\preference_setup\loadout\loadout_suit.dm" +#include "code\modules\client\preference_setup\loadout\loadout_suit_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" +#include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_utility.dm" +#include "code\modules\client\preference_setup\loadout\loadout_utility_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" +#include "code\modules\client\preference_setup\occupation\occupation.dm" +#include "code\modules\client\preference_setup\skills\skills.dm" +#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" +#include "code\modules\client\preference_setup\volume_sliders\02_media.dm" +#include "code\modules\client\preference_setup\vore\01_ears.dm" +#include "code\modules\client\preference_setup\vore\02_size.dm" +#include "code\modules\client\preference_setup\vore\03_egg.dm" +#include "code\modules\client\preference_setup\vore\04_resleeving.dm" +#include "code\modules\client\preference_setup\vore\05_persistence.dm" +#include "code\modules\client\preference_setup\vore\06_vantag.dm" +#include "code\modules\client\preference_setup\vore\07_traits.dm" +#include "code\modules\client\preference_setup\vore\08_nif.dm" +#include "code\modules\client\preference_setup\vore\09_misc.dm" +#include "code\modules\client\verbs\advanced_who.dm" +#include "code\modules\client\verbs\character_directory.dm" +#include "code\modules\client\verbs\ignore.dm" +#include "code\modules\client\verbs\ooc.dm" +#include "code\modules\client\verbs\ping.dm" +#include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\who.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\clothing_accessories.dm" +#include "code\modules\clothing\clothing_icons.dm" +#include "code\modules\clothing\clothing_vr.dm" +#include "code\modules\clothing\ears\earrings.dm" +#include "code\modules\clothing\ears\ears.dm" +#include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\glasses_vr.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\hud_vr.dm" +#include "code\modules\clothing\gloves\antagonist.dm" +#include "code\modules\clothing\gloves\arm_guards.dm" +#include "code\modules\clothing\gloves\arm_guards_vr.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\gauntlets.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\miscellaneous_vr.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\flowercrowns.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\helmet_vr.dm" +#include "code\modules\clothing\head\hood.dm" +#include "code\modules\clothing\head\hood_vr.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\jobs_vr.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\misc_vr.dm" +#include "code\modules\clothing\head\pilot_helmet.dm" +#include "code\modules\clothing\head\pilot_helmet_vr.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\solgov.dm" +#include "code\modules\clothing\head\solgov_vr.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\breath_vr.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\gasmask_vr.dm" +#include "code\modules\clothing\masks\hailer.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\shiny_vr.dm" +#include "code\modules\clothing\masks\voice.dm" +#include "code\modules\clothing\rings\material.dm" +#include "code\modules\clothing\rings\rings.dm" +#include "code\modules\clothing\rings\rings_vr.dm" +#include "code\modules\clothing\shoes\boots.dm" +#include "code\modules\clothing\shoes\boots_vr.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\leg_guards.dm" +#include "code\modules\clothing\shoes\leg_guards_vr.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\shoes\miscellaneous_vr.dm" +#include "code\modules\clothing\spacesuits\alien.dm" +#include "code\modules\clothing\spacesuits\breaches.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\spacesuits.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\rig\rig.dm" +#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" +#include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" +#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" +#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" +#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm" +#include "code\modules\clothing\spacesuits\rig\suits\light.dm" +#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" +#include "code\modules\clothing\spacesuits\void\ert_vr.dm" +#include "code\modules\clothing\spacesuits\void\event.dm" +#include "code\modules\clothing\spacesuits\void\event_vr.dm" +#include "code\modules\clothing\spacesuits\void\merc.dm" +#include "code\modules\clothing\spacesuits\void\military_vr.dm" +#include "code\modules\clothing\spacesuits\void\station.dm" +#include "code\modules\clothing\spacesuits\void\station_vr.dm" +#include "code\modules\clothing\spacesuits\void\void.dm" +#include "code\modules\clothing\spacesuits\void\void_vr.dm" +#include "code\modules\clothing\spacesuits\void\wizard.dm" +#include "code\modules\clothing\spacesuits\void\zaddat.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\armor_vr.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\bio_vr.dm" +#include "code\modules\clothing\suits\hooded.dm" +#include "code\modules\clothing\suits\hooded_vr.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\jobs_vr.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\labcoat_vr.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\miscellaneous_vr.dm" +#include "code\modules\clothing\suits\solgov.dm" +#include "code\modules\clothing\suits\solgov_vr.dm" +#include "code\modules\clothing\suits\storage.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\utility_vr.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\suits\aliens\tajara.dm" +#include "code\modules\clothing\suits\aliens\teshari.dm" +#include "code\modules\clothing\suits\aliens\unathi.dm" +#include "code\modules\clothing\suits\aliens\vox.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\imperial_vr.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\miscellaneous_vr.dm" +#include "code\modules\clothing\under\nanotrasen_vr.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shiny_vr.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\solgov.dm" +#include "code\modules\clothing\under\solgov_vr.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\accessory_vr.dm" +#include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\armor.dm" +#include "code\modules\clothing\under\accessories\badges.dm" +#include "code\modules\clothing\under\accessories\clothing.dm" +#include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\holster_vr.dm" +#include "code\modules\clothing\under\accessories\lockets.dm" +#include "code\modules\clothing\under\accessories\permits.dm" +#include "code\modules\clothing\under\accessories\permits_vr.dm" +#include "code\modules\clothing\under\accessories\shiny_vr.dm" +#include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\accessories\storage_vr.dm" +#include "code\modules\clothing\under\accessories\torch.dm" +#include "code\modules\clothing\under\accessories\torch_vr.dm" +#include "code\modules\clothing\under\accessories\temperature\poncho.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\xenos\teshari.dm" +#include "code\modules\clothing\under\xenos\vox.dm" +#include "code\modules\compass\_compass.dm" +#include "code\modules\compass\compass_holder.dm" +#include "code\modules\compass\compass_waypoint.dm" +#include "code\modules\compass\~compass.dm" +#include "code\modules\customitems\item_spawning.dm" +#include "code\modules\detectivework\footprints.dm" +#include "code\modules\detectivework\forensics.dm" +#include "code\modules\detectivework\microscope\dnascanner.dm" +#include "code\modules\detectivework\microscope\microscope.dm" +#include "code\modules\detectivework\tools\crimekit.dm" +#include "code\modules\detectivework\tools\evidencebag.dm" +#include "code\modules\detectivework\tools\luminol.dm" +#include "code\modules\detectivework\tools\rag.dm" +#include "code\modules\detectivework\tools\sample_kits.dm" +#include "code\modules\detectivework\tools\scanner.dm" +#include "code\modules\detectivework\tools\storage.dm" +#include "code\modules\detectivework\tools\swabs.dm" +#include "code\modules\detectivework\tools\uvlight.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\cash.dm" +#include "code\modules\economy\cash_register.dm" +#include "code\modules\economy\coins.dm" +#include "code\modules\economy\coins_vr.dm" +#include "code\modules\economy\economy_misc.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Events.dm" +#include "code\modules\economy\Events_Mundane.dm" +#include "code\modules\economy\lorenews.dm" +#include "code\modules\economy\mint.dm" +#include "code\modules\economy\money_bag.dm" +#include "code\modules\economy\price_list.dm" +#include "code\modules\economy\retail_scanner.dm" +#include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\economy\vending.dm" +#include "code\modules\economy\vending_machines.dm" +#include "code\modules\emotes\emote_define.dm" +#include "code\modules\emotes\emote_mob.dm" +#include "code\modules\emotes\definitions\_mob.dm" +#include "code\modules\emotes\definitions\_species.dm" +#include "code\modules\emotes\definitions\audible.dm" +#include "code\modules\emotes\definitions\audible_cough.dm" +#include "code\modules\emotes\definitions\audible_furry_vr.dm" +#include "code\modules\emotes\definitions\audible_scream.dm" +#include "code\modules\emotes\definitions\audible_scream_vr.dm" +#include "code\modules\emotes\definitions\audible_slap.dm" +#include "code\modules\emotes\definitions\audible_snap.dm" +#include "code\modules\emotes\definitions\audible_sneeze.dm" +#include "code\modules\emotes\definitions\audible_whistle.dm" +#include "code\modules\emotes\definitions\exertion.dm" +#include "code\modules\emotes\definitions\helpers_vr.dm" +#include "code\modules\emotes\definitions\human.dm" +#include "code\modules\emotes\definitions\slimes.dm" +#include "code\modules\emotes\definitions\synthetics.dm" +#include "code\modules\emotes\definitions\visible.dm" +#include "code\modules\emotes\definitions\visible_animated.dm" +#include "code\modules\emotes\definitions\visible_vomit.dm" +#include "code\modules\emotes\definitions\visible_vr.dm" +#include "code\modules\entopics_vr\alternate_appearance.dm" +#include "code\modules\entopics_vr\entopics.dm" +#include "code\modules\error_handler\_defines.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\error_handler\~defines.dm" +#include "code\modules\events\apc_damage.dm" +#include "code\modules\events\atmos_leak.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\camera_damage.dm" +#include "code\modules\events\canister_leak.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\comms_blackout.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\drone_pod_vr.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\event.dm" +#include "code\modules\events\event_container.dm" +#include "code\modules\events\event_container_vr.dm" +#include "code\modules\events\event_dynamic.dm" +#include "code\modules\events\event_manager.dm" +#include "code\modules\events\gravity_vr.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\grubinfestation_vr.dm" +#include "code\modules\events\ian_storm_vr.dm" +#include "code\modules\events\infestation.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\maintenance_predator_vr.dm" +#include "code\modules\events\meteor_strike_vr.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\money_hacker.dm" +#include "code\modules\events\money_lotto.dm" +#include "code\modules\events\money_spam.dm" +#include "code\modules\events\morph_spawn_vr.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\random_antagonist.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\shipping_error.dm" +#include "code\modules\events\solar_storm.dm" +#include "code\modules\events\space_ninja.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\spontaneous_appendicitis_vr.dm" +#include "code\modules\events\supply_demand_vr.dm" +#include "code\modules\events\wallrot.dm" +#include "code\modules\examine\examine.dm" +#include "code\modules\examine\stat_icons.dm" +#include "code\modules\examine\descriptions\armor.dm" +#include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\containers.dm" +#include "code\modules\examine\descriptions\devices.dm" +#include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\machines.dm" +#include "code\modules\examine\descriptions\medical.dm" +#include "code\modules\examine\descriptions\mobs.dm" +#include "code\modules\examine\descriptions\paperwork.dm" +#include "code\modules\examine\descriptions\stacks.dm" +#include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\telecomms.dm" +#include "code\modules\examine\descriptions\turfs.dm" +#include "code\modules\examine\descriptions\weapons.dm" +#include "code\modules\ext_scripts\irc.dm" +#include "code\modules\ext_scripts\python.dm" +#include "code\modules\fishing\fishing.dm" +#include "code\modules\fishing\fishing_net.dm" +#include "code\modules\fishing\fishing_rod.dm" +#include "code\modules\fishing\fishing_rod_vr.dm" +#include "code\modules\fishing\fishing_vr.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\flufftext\look_up.dm" +#include "code\modules\flufftext\TextFilters.dm" +#include "code\modules\food\food.dm" +#include "code\modules\food\recipe.dm" +#include "code\modules\food\recipe_dump.dm" +#include "code\modules\food\recipes_fryer.dm" +#include "code\modules\food\recipes_fryer_vr.dm" +#include "code\modules\food\recipes_grill.dm" +#include "code\modules\food\recipes_microwave.dm" +#include "code\modules\food\recipes_microwave_vr.dm" +#include "code\modules\food\recipes_oven.dm" +#include "code\modules\food\recipes_oven_vr.dm" +#include "code\modules\food\drinkingglass\drinkingglass.dm" +#include "code\modules\food\drinkingglass\extras.dm" +#include "code\modules\food\drinkingglass\glass_boxes.dm" +#include "code\modules\food\drinkingglass\glass_types.dm" +#include "code\modules\food\drinkingglass\metaglass.dm" +#include "code\modules\food\drinkingglass\metaglass_vr.dm" +#include "code\modules\food\drinkingglass\serving_glasses.dm" +#include "code\modules\food\drinkingglass\shaker.dm" +#include "code\modules\food\drinkingglass\shaker_vr.dm" +#include "code\modules\food\food\cans.dm" +#include "code\modules\food\food\cans_vr.dm" +#include "code\modules\food\food\condiment.dm" +#include "code\modules\food\food\drinks.dm" +#include "code\modules\food\food\drinks_vr.dm" +#include "code\modules\food\food\lunch.dm" +#include "code\modules\food\food\sandwich.dm" +#include "code\modules\food\food\snacks.dm" +#include "code\modules\food\food\snacks_vr.dm" +#include "code\modules\food\food\thecake.dm" +#include "code\modules\food\food\z_custom_food_vr.dm" +#include "code\modules\food\food\drinks\bottle.dm" +#include "code\modules\food\food\drinks\cup.dm" +#include "code\modules\food\food\drinks\drinkingglass.dm" +#include "code\modules\food\food\drinks\jar.dm" +#include "code\modules\food\food\drinks\bottle\robot.dm" +#include "code\modules\food\food\snacks\meat.dm" +#include "code\modules\food\glass\bottle.dm" +#include "code\modules\food\glass\bottle_vr.dm" +#include "code\modules\food\glass\bottle\robot.dm" +#include "code\modules\food\kitchen\gibber.dm" +#include "code\modules\food\kitchen\icecream.dm" +#include "code\modules\food\kitchen\microwave.dm" +#include "code\modules\food\kitchen\cooking_machines\_appliance.dm" +#include "code\modules\food\kitchen\cooking_machines\_cooker.dm" +#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm" +#include "code\modules\food\kitchen\cooking_machines\_mixer.dm" +#include "code\modules\food\kitchen\cooking_machines\candy.dm" +#include "code\modules\food\kitchen\cooking_machines\cereal.dm" +#include "code\modules\food\kitchen\cooking_machines\container.dm" +#include "code\modules\food\kitchen\cooking_machines\fryer.dm" +#include "code\modules\food\kitchen\cooking_machines\grill.dm" +#include "code\modules\food\kitchen\cooking_machines\oven.dm" +#include "code\modules\food\kitchen\smartfridge\drying_rack.dm" +#include "code\modules\food\kitchen\smartfridge\engineering.dm" +#include "code\modules\food\kitchen\smartfridge\hydroponics.dm" +#include "code\modules\food\kitchen\smartfridge\medical.dm" +#include "code\modules\food\kitchen\smartfridge\smartfridge.dm" +#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm" +#include "code\modules\gamemaster\defines.dm" +#include "code\modules\gamemaster\event2\event.dm" +#include "code\modules\gamemaster\event2\meta.dm" +#include "code\modules\gamemaster\event2\events\ghost_pod_spawner.dm" +#include "code\modules\gamemaster\event2\events\mob_spawning.dm" +#include "code\modules\gamemaster\event2\events\cargo\shipping_error.dm" +#include "code\modules\gamemaster\event2\events\command\manifest_malfunction.dm" +#include "code\modules\gamemaster\event2\events\command\money_hacker.dm" +#include "code\modules\gamemaster\event2\events\command\raise_funds.dm" +#include "code\modules\gamemaster\event2\events\engineering\airlock_failure.dm" +#include "code\modules\gamemaster\event2\events\engineering\blob.dm" +#include "code\modules\gamemaster\event2\events\engineering\brand_intelligence.dm" +#include "code\modules\gamemaster\event2\events\engineering\camera_damage.dm" +#include "code\modules\gamemaster\event2\events\engineering\canister_leak.dm" +#include "code\modules\gamemaster\event2\events\engineering\dust.dm" +#include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" +#include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" +#include "code\modules\gamemaster\event2\events\engineering\meteor_defense.dm" +#include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" +#include "code\modules\gamemaster\event2\events\engineering\wallrot.dm" +#include "code\modules\gamemaster\event2\events\engineering\window_break.dm" +#include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" +#include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" +#include "code\modules\gamemaster\event2\events\everyone\gravity_vr.dm" +#include "code\modules\gamemaster\event2\events\everyone\infestation.dm" +#include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" +#include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" +#include "code\modules\gamemaster\event2\events\everyone\random_antag.dm" +#include "code\modules\gamemaster\event2\events\everyone\solar_storm.dm" +#include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" +#include "code\modules\gamemaster\event2\events\legacy\legacy.dm" +#include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" +#include "code\modules\gamemaster\event2\events\medical\virus.dm" +#include "code\modules\gamemaster\event2\events\security\carp_migration.dm" +#include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" +#include "code\modules\gamemaster\event2\events\security\prison_break.dm" +#include "code\modules\gamemaster\event2\events\security\rogue_drones.dm" +#include "code\modules\gamemaster\event2\events\security\security_advisement.dm" +#include "code\modules\gamemaster\event2\events\security\spider_infestation.dm" +#include "code\modules\gamemaster\event2\events\security\stowaway.dm" +#include "code\modules\gamemaster\event2\events\security\surprise_carp.dm" +#include "code\modules\gamemaster\event2\events\security\swarm_boarder.dm" +#include "code\modules\gamemaster\event2\events\synthetic\ion_storm.dm" +#include "code\modules\games\cah.dm" +#include "code\modules\games\cah_black_cards.dm" +#include "code\modules\games\cah_white_cards.dm" +#include "code\modules\games\cardemon.dm" +#include "code\modules\games\cards.dm" +#include "code\modules\games\dice.dm" +#include "code\modules\games\spaceball_cards.dm" +#include "code\modules\games\tarot.dm" +#include "code\modules\genetics\side_effects.dm" +#include "code\modules\ghosttrap\trap.dm" +#include "code\modules\holodeck\HolodeckControl.dm" +#include "code\modules\holodeck\HolodeckObjects.dm" +#include "code\modules\holodeck\HolodeckPrograms.dm" +#include "code\modules\holomap\generate_holomap.dm" +#include "code\modules\holomap\holomap_area.dm" +#include "code\modules\holomap\holomap_datum.dm" +#include "code\modules\holomap\mapper.dm" +#include "code\modules\holomap\station_holomap.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\grown_inedible.dm" +#include "code\modules\hydroponics\grown_predefined.dm" +#include "code\modules\hydroponics\seed.dm" +#include "code\modules\hydroponics\seed_datums_vr.dm" +#include "code\modules\hydroponics\seed_gene_mut.dm" +#include "code\modules\hydroponics\seed_machines.dm" +#include "code\modules\hydroponics\seed_mobs.dm" +#include "code\modules\hydroponics\seed_packets.dm" +#include "code\modules\hydroponics\seed_packets_vr.dm" +#include "code\modules\hydroponics\seed_storage.dm" +#include "code\modules\hydroponics\seed_storage_vr.dm" +#include "code\modules\hydroponics\beekeeping\beehive.dm" +#include "code\modules\hydroponics\seedtypes\amauri.dm" +#include "code\modules\hydroponics\seedtypes\ambrosia.dm" +#include "code\modules\hydroponics\seedtypes\apples.dm" +#include "code\modules\hydroponics\seedtypes\banana.dm" +#include "code\modules\hydroponics\seedtypes\berries.dm" +#include "code\modules\hydroponics\seedtypes\cabbage.dm" +#include "code\modules\hydroponics\seedtypes\carrots.dm" +#include "code\modules\hydroponics\seedtypes\celery.dm" +#include "code\modules\hydroponics\seedtypes\cherries.dm" +#include "code\modules\hydroponics\seedtypes\chili.dm" +#include "code\modules\hydroponics\seedtypes\citrus.dm" +#include "code\modules\hydroponics\seedtypes\cocoa.dm" +#include "code\modules\hydroponics\seedtypes\corn.dm" +#include "code\modules\hydroponics\seedtypes\diona.dm" +#include "code\modules\hydroponics\seedtypes\durian.dm" +#include "code\modules\hydroponics\seedtypes\eggplant.dm" +#include "code\modules\hydroponics\seedtypes\flowers.dm" +#include "code\modules\hydroponics\seedtypes\gelthi.dm" +#include "code\modules\hydroponics\seedtypes\gnomes.dm" +#include "code\modules\hydroponics\seedtypes\grapes.dm" +#include "code\modules\hydroponics\seedtypes\grass.dm" +#include "code\modules\hydroponics\seedtypes\jurlmah.dm" +#include "code\modules\hydroponics\seedtypes\kudzu.dm" +#include "code\modules\hydroponics\seedtypes\lettuce.dm" +#include "code\modules\hydroponics\seedtypes\malanitear.dm" +#include "code\modules\hydroponics\seedtypes\mushrooms.dm" +#include "code\modules\hydroponics\seedtypes\nettles.dm" +#include "code\modules\hydroponics\seedtypes\onion.dm" +#include "code\modules\hydroponics\seedtypes\peanuts.dm" +#include "code\modules\hydroponics\seedtypes\pineapple.dm" +#include "code\modules\hydroponics\seedtypes\potato.dm" +#include "code\modules\hydroponics\seedtypes\pumpkin.dm" +#include "code\modules\hydroponics\seedtypes\rhubarb.dm" +#include "code\modules\hydroponics\seedtypes\rice.dm" +#include "code\modules\hydroponics\seedtypes\selemhand.dm" +#include "code\modules\hydroponics\seedtypes\soybean.dm" +#include "code\modules\hydroponics\seedtypes\sugarcane.dm" +#include "code\modules\hydroponics\seedtypes\surik.dm" +#include "code\modules\hydroponics\seedtypes\telriis.dm" +#include "code\modules\hydroponics\seedtypes\thaadra.dm" +#include "code\modules\hydroponics\seedtypes\tobacco.dm" +#include "code\modules\hydroponics\seedtypes\tomatoes.dm" +#include "code\modules\hydroponics\seedtypes\vale.dm" +#include "code\modules\hydroponics\seedtypes\vanilla.dm" +#include "code\modules\hydroponics\seedtypes\wabback.dm" +#include "code\modules\hydroponics\seedtypes\watermelon.dm" +#include "code\modules\hydroponics\seedtypes\weeds.dm" +#include "code\modules\hydroponics\seedtypes\wheat.dm" +#include "code\modules\hydroponics\seedtypes\whitebeets.dm" +#include "code\modules\hydroponics\seedtypes\wurmwoad.dm" +#include "code\modules\hydroponics\seedtypes\xeno.dm" +#include "code\modules\hydroponics\spreading\spreading.dm" +#include "code\modules\hydroponics\spreading\spreading_growth.dm" +#include "code\modules\hydroponics\spreading\spreading_response.dm" +#include "code\modules\hydroponics\trays\tray.dm" +#include "code\modules\hydroponics\trays\tray_process.dm" +#include "code\modules\hydroponics\trays\tray_reagents.dm" +#include "code\modules\hydroponics\trays\tray_soil.dm" +#include "code\modules\hydroponics\trays\tray_tools.dm" +#include "code\modules\hydroponics\trays\tray_update_icons.dm" +#include "code\modules\identification\identification.dm" +#include "code\modules\identification\item_procs.dm" +#include "code\modules\instruments\items.dm" +#include "code\modules\instruments\stationary.dm" +#include "code\modules\instruments\instrument_data\_instrument_data.dm" +#include "code\modules\instruments\instrument_data\_instrument_key.dm" +#include "code\modules\instruments\instrument_data\brass.dm" +#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" +#include "code\modules\instruments\instrument_data\fun.dm" +#include "code\modules\instruments\instrument_data\guitar.dm" +#include "code\modules\instruments\instrument_data\hardcoded.dm" +#include "code\modules\instruments\instrument_data\organ.dm" +#include "code\modules\instruments\instrument_data\piano.dm" +#include "code\modules\instruments\instrument_data\synth_tones.dm" +#include "code\modules\instruments\songs\_song.dm" +#include "code\modules\instruments\songs\editor.dm" +#include "code\modules\instruments\songs\play_legacy.dm" +#include "code\modules\instruments\songs\play_synthesized.dm" +#include "code\modules\integrated_electronics\_defines.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\detailer.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\printer.dm" +#include "code\modules\integrated_electronics\core\tools.dm" +#include "code\modules\integrated_electronics\core\assemblies\clothing.dm" +#include "code\modules\integrated_electronics\core\assemblies\device.dm" +#include "code\modules\integrated_electronics\core\assemblies\generic.dm" +#include "code\modules\integrated_electronics\core\assemblies\implant.dm" +#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\built_in.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input.dm" +#include "code\modules\integrated_electronics\subtypes\lists.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\output.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_movekeys.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\lib_readme.dm" +#include "code\modules\library\hardcode_library\_library.dm" +#include "code\modules\library\hardcode_library\fiction\APsychonaut.dm" +#include "code\modules\library\hardcode_library\fiction\battlefieldcommander.dm" +#include "code\modules\library\hardcode_library\fiction\PortedBooks.dm" +#include "code\modules\library\hardcode_library\fiction\schnayy.dm" +#include "code\modules\library\hardcode_library\non-fiction\PortedBooks.dm" +#include "code\modules\library\hardcode_library\reference\PortedBooks.dm" +#include "code\modules\library\hardcode_library\reference\Schnayy.dm" +#include "code\modules\library\hardcode_library\religious\PortedBooks.dm" +#include "code\modules\lighting\emissive_blocker.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_fake_sun_vr.dm" +#include "code\modules\lighting\lighting_overlay.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\looking_glass\lg_area.dm" +#include "code\modules\looking_glass\lg_console.dm" +#include "code\modules\looking_glass\lg_imageholder.dm" +#include "code\modules\looking_glass\lg_turfs.dm" +#include "code\modules\lore_codex\codex.dm" +#include "code\modules\lore_codex\codex_tree.dm" +#include "code\modules\lore_codex\pages.dm" +#include "code\modules\lore_codex\lore_data_vr\important_locations.dm" +#include "code\modules\lore_codex\lore_data_vr\main.dm" +#include "code\modules\lore_codex\lore_data_vr\orgs.dm" +#include "code\modules\lore_codex\lore_data_vr\political_parties.dm" +#include "code\modules\lore_codex\lore_data_vr\species.dm" +#include "code\modules\lore_codex\news_data\main.dm" +#include "code\modules\lore_codex\robutt_data\bybrand.dm" +#include "code\modules\lore_codex\robutt_data\main_robutts.dm" +#include "code\modules\lore_codex\robutt_data\more.dm" +#include "code\modules\makeup\nailpolish.dm" +#include "code\modules\maps\tg\dmm_suite.dm" +#include "code\modules\maps\tg\map_template.dm" +#include "code\modules\maps\tg\map_template_vr.dm" +#include "code\modules\maps\tg\reader.dm" +#include "code\modules\materials\fifty_spawner.dm" +#include "code\modules\materials\fifty_spawner_mats.dm" +#include "code\modules\materials\fifty_spawner_mats_vr.dm" +#include "code\modules\materials\material_synth.dm" +#include "code\modules\materials\materials\_materials.dm" +#include "code\modules\materials\materials\_materials_vr.dm" +#include "code\modules\materials\materials\alien_alloy.dm" +#include "code\modules\materials\materials\cult.dm" +#include "code\modules\materials\materials\gems.dm" +#include "code\modules\materials\materials\glass.dm" +#include "code\modules\materials\materials\glass_vr.dm" +#include "code\modules\materials\materials\holographic.dm" +#include "code\modules\materials\materials\other_vr.dm" +#include "code\modules\materials\materials\plastic.dm" +#include "code\modules\materials\materials\snow.dm" +#include "code\modules\materials\materials\stone.dm" +#include "code\modules\materials\materials\supermatter.dm" +#include "code\modules\materials\materials\metals\hull.dm" +#include "code\modules\materials\materials\metals\hull_vr.dm" +#include "code\modules\materials\materials\metals\metals.dm" +#include "code\modules\materials\materials\metals\metals_vr.dm" +#include "code\modules\materials\materials\metals\plasteel.dm" +#include "code\modules\materials\materials\metals\plasteel_vr.dm" +#include "code\modules\materials\materials\metals\steel.dm" +#include "code\modules\materials\materials\metals\steel_vr.dm" +#include "code\modules\materials\materials\organic\animal_products.dm" +#include "code\modules\materials\materials\organic\cloth.dm" +#include "code\modules\materials\materials\organic\leather.dm" +#include "code\modules\materials\materials\organic\resin.dm" +#include "code\modules\materials\materials\organic\wood.dm" +#include "code\modules\materials\sheets\_sheets.dm" +#include "code\modules\materials\sheets\gems.dm" +#include "code\modules\materials\sheets\glass.dm" +#include "code\modules\materials\sheets\glass_vr.dm" +#include "code\modules\materials\sheets\plastic.dm" +#include "code\modules\materials\sheets\snow.dm" +#include "code\modules\materials\sheets\stone.dm" +#include "code\modules\materials\sheets\supermatter.dm" +#include "code\modules\materials\sheets\metals\hull.dm" +#include "code\modules\materials\sheets\metals\hull_vr.dm" +#include "code\modules\materials\sheets\metals\metal.dm" +#include "code\modules\materials\sheets\metals\metal_vr.dm" +#include "code\modules\materials\sheets\metals\rods.dm" +#include "code\modules\materials\sheets\organic\animal_products.dm" +#include "code\modules\materials\sheets\organic\resin.dm" +#include "code\modules\materials\sheets\organic\textiles.dm" +#include "code\modules\materials\sheets\organic\wood.dm" +#include "code\modules\materials\sheets\organic\tanning\hide.dm" +#include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" +#include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" +#include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" +#include "code\modules\media\juke_remote.dm" +#include "code\modules\media\media_machinery.dm" +#include "code\modules\media\media_player_html5.dm" +#include "code\modules\media\media_player_vlc.dm" +#include "code\modules\media\media_player_wmp.dm" +#include "code\modules\media\media_tracks.dm" +#include "code\modules\media\mediamanager.dm" +#include "code\modules\media\walkpod.dm" +#include "code\modules\metric\activity.dm" +#include "code\modules\metric\count.dm" +#include "code\modules\metric\department.dm" +#include "code\modules\metric\metric.dm" +#include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\abandonedcrates_vr.dm" +#include "code\modules\mining\alloys.dm" +#include "code\modules\mining\alloys_vr.dm" +#include "code\modules\mining\fulton.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\mine_items_vr.dm" +#include "code\modules\mining\mine_outcrops.dm" +#include "code\modules\mining\mine_turfs.dm" +#include "code\modules\mining\mine_turfs_vr.dm" +#include "code\modules\mining\mineral_effect.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\ore_box.dm" +#include "code\modules\mining\ore_datum.dm" +#include "code\modules\mining\resonator_vr.dm" +#include "code\modules\mining\shelter_atoms_vr.dm" +#include "code\modules\mining\shelters_vr.dm" +#include "code\modules\mining\drilling\drill.dm" +#include "code\modules\mining\drilling\scanner.dm" +#include "code\modules\mining\machinery\machine_input_output_plates.dm" +#include "code\modules\mining\machinery\machine_processing.dm" +#include "code\modules\mining\machinery\machine_stacking.dm" +#include "code\modules\mining\machinery\machine_unloading.dm" +#include "code\modules\mining\ore_redemption_machine\construction.dm" +#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm" +#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm" +#include "code\modules\mining\ore_redemption_machine\survey_vendor.dm" +#include "code\modules\mob\animations.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\gender.dm" +#include "code\modules\mob\gender_vr.dm" +#include "code\modules\mob\hear_say.dm" +#include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\login_vr.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_defines_vr.dm" +#include "code\modules\mob\mob_grab.dm" +#include "code\modules\mob\mob_grab_specials.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_helpers_vr.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_planes.dm" +#include "code\modules\mob\mob_planes_vr.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\say_vr.dm" +#include "code\modules\mob\skillset.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\_modifiers\aura.dm" +#include "code\modules\mob\_modifiers\changeling.dm" +#include "code\modules\mob\_modifiers\cloning.dm" +#include "code\modules\mob\_modifiers\feysight.dm" +#include "code\modules\mob\_modifiers\fire.dm" +#include "code\modules\mob\_modifiers\medical.dm" +#include "code\modules\mob\_modifiers\modifiers.dm" +#include "code\modules\mob\_modifiers\modifiers_misc.dm" +#include "code\modules\mob\_modifiers\traits.dm" +#include "code\modules\mob\_modifiers\traits_phobias.dm" +#include "code\modules\mob\_modifiers\unholy.dm" +#include "code\modules\mob\dead\corpse.dm" +#include "code\modules\mob\dead\corpse_vr.dm" +#include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\free_vr.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\observer_vr.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\freelook\chunk.dm" +#include "code\modules\mob\freelook\eye.dm" +#include "code\modules\mob\freelook\life.dm" +#include "code\modules\mob\freelook\update_triggers.dm" +#include "code\modules\mob\freelook\visualnet.dm" +#include "code\modules\mob\freelook\ai\cameranet.dm" +#include "code\modules\mob\freelook\ai\chunk.dm" +#include "code\modules\mob\freelook\ai\eye.dm" +#include "code\modules\mob\freelook\ai\update_triggers.dm" +#include "code\modules\mob\freelook\mask\chunk.dm" +#include "code\modules\mob\freelook\mask\cultnet.dm" +#include "code\modules\mob\freelook\mask\eye.dm" +#include "code\modules\mob\freelook\mask\update_triggers.dm" +#include "code\modules\mob\language\generic.dm" +#include "code\modules\mob\language\language.dm" +#include "code\modules\mob\language\monkey.dm" +#include "code\modules\mob\language\outsider.dm" +#include "code\modules\mob\language\station.dm" +#include "code\modules\mob\language\station_vr.dm" +#include "code\modules\mob\language\synthetic.dm" +#include "code\modules\mob\living\autohiss.dm" +#include "code\modules\mob\living\butchering.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\default_language.dm" +#include "code\modules\mob\living\inventory.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_defines_vr.dm" +#include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_powers.dm" +#include "code\modules\mob\living\living_vr.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\organs.dm" +#include "code\modules\mob\living\riding.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\status_indicators.dm" +#include "code\modules\mob\living\bot\bot.dm" +#include "code\modules\mob\living\bot\bot_vr.dm" +#include "code\modules\mob\living\bot\cleanbot.dm" +#include "code\modules\mob\living\bot\ed209bot.dm" +#include "code\modules\mob\living\bot\edCLNbot.dm" +#include "code\modules\mob\living\bot\farmbot.dm" +#include "code\modules\mob\living\bot\floorbot.dm" +#include "code\modules\mob\living\bot\medbot.dm" +#include "code\modules\mob\living\bot\mulebot.dm" +#include "code\modules\mob\living\bot\mulebot_vr.dm" +#include "code\modules\mob\living\bot\secbot.dm" +#include "code\modules\mob\living\bot\SLed209bot.dm" +#include "code\modules\mob\living\carbon\breathe.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_powers.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\lick_wounds.dm" +#include "code\modules\mob\living\carbon\resist.dm" +#include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\taste.dm" +#include "code\modules\mob\living\carbon\viruses.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" +#include "code\modules\mob\living\carbon\alien\alien_damage.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\progression.dm" +#include "code\modules\mob\living\carbon\alien\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" +#include "code\modules\mob\living\carbon\alien\diona\life.dm" +#include "code\modules\mob\living\carbon\alien\diona\progression.dm" +#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" +#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\progression.dm" +#include "code\modules\mob\living\carbon\brain\brain.dm" +#include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" +#include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" +#include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\robot.dm" +#include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\death_vr.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\emote_vr.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\examine_vr.dm" +#include "code\modules\mob\living\carbon\human\gradient.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_attackhand.dm" +#include "code\modules\mob\living\carbon\human\human_damage.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_defines_vr.dm" +#include "code\modules\mob\living\carbon\human\human_helpers.dm" +#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" +#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_organs.dm" +#include "code\modules\mob\living\carbon\human\human_powers.dm" +#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" +#include "code\modules\mob\living\carbon\human\human_resist.dm" +#include "code\modules\mob\living\carbon\human\human_species.dm" +#include "code\modules\mob\living\carbon\human\human_species_vr.dm" +#include "code\modules\mob\living\carbon\human\human_vr.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\life_vr.dm" +#include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\stripping.dm" +#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm" +#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" +#include "code\modules\mob\living\carbon\human\species\species.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_getters.dm" +#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_helpers.dm" +#include "code\modules\mob\living\carbon\human\species\species_hud.dm" +#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" +#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_vr.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\event.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" +#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\golem.dm" +#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" +#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" +#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" +#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" +#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\emote.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_vr.dm" +#include "code\modules\mob\living\silicon\subystems.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_movement.dm" +#include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" +#include "code\modules\mob\living\silicon\ai\ai_vr.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\icons.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\malf.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\decoy\death.dm" +#include "code\modules\mob\living\silicon\decoy\decoy.dm" +#include "code\modules\mob\living\silicon\decoy\life.dm" +#include "code\modules\mob\living\silicon\pai\admin.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\examine.dm" +#include "code\modules\mob\living\silicon\pai\life.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\pai_vr.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\recruit.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\robot\analyzer.dm" +#include "code\modules\mob\living\silicon\robot\component.dm" +#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\examine_vr.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\photos.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm" +#include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" +#include "code\modules\mob\living\silicon\robot\robot_vr.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event_vr.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" +#include "code\modules\mob\living\simple_mob\appearance.dm" +#include "code\modules\mob\living\simple_mob\butchering.dm" +#include "code\modules\mob\living\simple_mob\combat.dm" +#include "code\modules\mob\living\simple_mob\defense.dm" +#include "code\modules\mob\living\simple_mob\donteatpets_vr.dm" +#include "code\modules\mob\living\simple_mob\hands.dm" +#include "code\modules\mob\living\simple_mob\harvesting.dm" +#include "code\modules\mob\living\simple_mob\life.dm" +#include "code\modules\mob\living\simple_mob\on_click.dm" +#include "code\modules\mob\living\simple_mob\simple_hud.dm" +#include "code\modules\mob\living\simple_mob\simple_mob.dm" +#include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" +#include "code\modules\mob\living\simple_mob\taming.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_powers.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\chicken.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\giant_spider_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\pepper.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\phorogenic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\thermic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\jerboa_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\fox_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\fluffy_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" +#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" +#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\wahlem_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\hoverpod.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\marauder.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\mecha.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\odysseus.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\phazon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\ripley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\monitor_ward.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\ward.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" +#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" +#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\slime_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\weretiger.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\xeno_vore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bus.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\busclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\c_shift.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Clowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\hespawner.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" +#include "code\modules\mob\living\voice\voice.dm" +#include "code\modules\mob\living\voice\voice_vr.dm" +#include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\login_vr.dm" +#include "code\modules\mob\new_player\logout.dm" +#include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\new_player_vr.dm" +#include "code\modules\mob\new_player\news.dm" +#include "code\modules\mob\new_player\poll.dm" +#include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\preferences_setup_vr.dm" +#include "code\modules\mob\new_player\skill.dm" +#include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories_ear.dm" +#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_extra.dm" +#include "code\modules\mob\new_player\sprite_accessories_extra_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_tail.dm" +#include "code\modules\mob\new_player\sprite_accessories_tail_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_taur.dm" +#include "code\modules\mob\new_player\sprite_accessories_taur_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_wing.dm" +#include "code\modules\mob\new_player\sprite_accessories_wing_vr.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\modular_computer\core.dm" +#include "code\modules\modular_computers\computers\modular_computer\damage.dm" +#include "code\modules\modular_computers\computers\modular_computer\hardware.dm" +#include "code\modules\modular_computers\computers\modular_computer\interaction.dm" +#include "code\modules\modular_computers\computers\modular_computer\power.dm" +#include "code\modules\modular_computers\computers\modular_computer\ui.dm" +#include "code\modules\modular_computers\computers\modular_computer\variables.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_console.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_console.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop_vr.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_tablet_vr.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\news_article.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\file_system\programs\command\card.dm" +#include "code\modules\modular_computers\file_system\programs\command\comm.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\alarm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\atmos_control.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\shutoff_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\generic\camera.dm" +#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\game.dm" +#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" +#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" +#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" +#include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" +#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm" +#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\nano_printer.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" +#include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\emails\email_account.dm" +#include "code\modules\modular_computers\NTNet\emails\email_message.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\multi-tile\multi-tile.dm" +#include "code\modules\multiz\_stubs.dm" +#include "code\modules\multiz\admin_upload.dm" +#include "code\modules\multiz\basic.dm" +#include "code\modules\multiz\hoist.dm" +#include "code\modules\multiz\ladder_assembly_vr.dm" +#include "code\modules\multiz\ladders.dm" +#include "code\modules\multiz\ladders_vr.dm" +#include "code\modules\multiz\movement.dm" +#include "code\modules\multiz\movement_vr.dm" +#include "code\modules\multiz\pipes.dm" +#include "code\modules\multiz\stairs.dm" +#include "code\modules\multiz\turf.dm" +#include "code\modules\news\news_init.dm" +#include "code\modules\news\newspaper.dm" +#include "code\modules\news\newspaper_layout.dm" +#include "code\modules\nifsoft\nif.dm" +#include "code\modules\nifsoft\nif_softshop.dm" +#include "code\modules\nifsoft\nif_tgui.dm" +#include "code\modules\nifsoft\nifsoft.dm" +#include "code\modules\nifsoft\software\01_vision.dm" +#include "code\modules\nifsoft\software\05_health.dm" +#include "code\modules\nifsoft\software\06_screens.dm" +#include "code\modules\nifsoft\software\10_combat.dm" +#include "code\modules\nifsoft\software\13_soulcatcher.dm" +#include "code\modules\nifsoft\software\14_commlink.dm" +#include "code\modules\nifsoft\software\15_misc.dm" +#include "code\modules\organs\blood.dm" +#include "code\modules\organs\misc.dm" +#include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_external.dm" +#include "code\modules\organs\organ_external_vr.dm" +#include "code\modules\organs\organ_icon.dm" +#include "code\modules\organs\organ_stump.dm" +#include "code\modules\organs\pain.dm" +#include "code\modules\organs\robolimbs.dm" +#include "code\modules\organs\robolimbs_custom.dm" +#include "code\modules\organs\robolimbs_vr.dm" +#include "code\modules\organs\wound.dm" +#include "code\modules\organs\internal\_organ_internal.dm" +#include "code\modules\organs\internal\appendix.dm" +#include "code\modules\organs\internal\augment.dm" +#include "code\modules\organs\internal\brain.dm" +#include "code\modules\organs\internal\eyes.dm" +#include "code\modules\organs\internal\heart.dm" +#include "code\modules\organs\internal\intestine.dm" +#include "code\modules\organs\internal\kidneys.dm" +#include "code\modules\organs\internal\liver.dm" +#include "code\modules\organs\internal\lungs.dm" +#include "code\modules\organs\internal\spleen.dm" +#include "code\modules\organs\internal\stomach.dm" +#include "code\modules\organs\internal\voicebox.dm" +#include "code\modules\organs\internal\augment\armmounted.dm" +#include "code\modules\organs\internal\augment\bio.dm" +#include "code\modules\organs\internal\robotic\diagnostic.dm" +#include "code\modules\organs\internal\robotic\heatsink.dm" +#include "code\modules\organs\internal\robotic\robotic.dm" +#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\subtypes\indestructible.dm" +#include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\nano.dm" +#include "code\modules\organs\subtypes\replicant.dm" +#include "code\modules\organs\subtypes\shadekin.dm" +#include "code\modules\organs\subtypes\shadekin_vr.dm" +#include "code\modules\organs\subtypes\slime.dm" +#include "code\modules\organs\subtypes\slime_vr.dm" +#include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\standard_vr.dm" +#include "code\modules\organs\subtypes\teshari.dm" +#include "code\modules\organs\subtypes\unathi.dm" +#include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\unseverable.dm" +#include "code\modules\organs\subtypes\vox.dm" +#include "code\modules\organs\subtypes\vox_vr.dm" +#include "code\modules\organs\subtypes\xenos.dm" +#include "code\modules\overmap\abductor_vr.dm" +#include "code\modules\overmap\bluespace_rift_vr.dm" +#include "code\modules\overmap\champagne.dm" +#include "code\modules\overmap\helpers.dm" +#include "code\modules\overmap\overmap_object.dm" +#include "code\modules\overmap\overmap_planet.dm" +#include "code\modules\overmap\overmap_shuttle.dm" +#include "code\modules\overmap\sectors.dm" +#include "code\modules\overmap\spacetravel.dm" +#include "code\modules\overmap\turfs.dm" +#include "code\modules\overmap\disperser\disperser.dm" +#include "code\modules\overmap\disperser\disperser_charge.dm" +#include "code\modules\overmap\disperser\disperser_circuit.dm" +#include "code\modules\overmap\disperser\disperser_console.dm" +#include "code\modules\overmap\disperser\disperser_fire.dm" +#include "code\modules\overmap\events\event_handler.dm" +#include "code\modules\overmap\events\generation.dm" +#include "code\modules\overmap\events\overmap_event.dm" +#include "code\modules\overmap\ships\landable.dm" +#include "code\modules\overmap\ships\panicbutton.dm" +#include "code\modules\overmap\ships\ship.dm" +#include "code\modules\overmap\ships\computers\computer_shims.dm" +#include "code\modules\overmap\ships\computers\engine_control.dm" +#include "code\modules\overmap\ships\computers\helm.dm" +#include "code\modules\overmap\ships\computers\sensors.dm" +#include "code\modules\overmap\ships\computers\ship.dm" +#include "code\modules\overmap\ships\computers\ship_vr.dm" +#include "code\modules\overmap\ships\computers\shuttle.dm" +#include "code\modules\overmap\ships\engines\engine.dm" +#include "code\modules\overmap\ships\engines\gas_thruster.dm" +#include "code\modules\overmap\ships\engines\gas_thruster_vr.dm" +#include "code\modules\overmap\ships\engines\ion_thruster.dm" +#include "code\modules\paperwork\adminpaper.dm" +#include "code\modules\paperwork\carbonpaper.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\faxmachine_vr.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_bundle.dm" +#include "code\modules\paperwork\paper_sticky.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\papershredder.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\photography.dm" +#include "code\modules\paperwork\silicon_photography.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\pda\ai.dm" +#include "code\modules\pda\app.dm" +#include "code\modules\pda\cart.dm" +#include "code\modules\pda\cart_apps.dm" +#include "code\modules\pda\cart_vr.dm" +#include "code\modules\pda\core_apps.dm" +#include "code\modules\pda\messenger.dm" +#include "code\modules\pda\messenger_plugins.dm" +#include "code\modules\pda\pda.dm" +#include "code\modules\pda\pda_subtypes.dm" +#include "code\modules\pda\pda_tgui.dm" +#include "code\modules\pda\pda_vr.dm" +#include "code\modules\pda\radio.dm" +#include "code\modules\pda\utilities.dm" +#include "code\modules\persistence\filth.dm" +#include "code\modules\persistence\graffiti.dm" +#include "code\modules\persistence\noticeboard.dm" +#include "code\modules\persistence\paintings.dm" +#include "code\modules\persistence\serialize.dm" +#include "code\modules\persistence\datum\persistence_datum.dm" +#include "code\modules\persistence\effects\filth.dm" +#include "code\modules\persistence\effects\graffiti.dm" +#include "code\modules\persistence\effects\paper.dm" +#include "code\modules\persistence\effects\paper_sticky.dm" +#include "code\modules\persistence\effects\trash.dm" +#include "code\modules\persistence\storage\smartfridge.dm" +#include "code\modules\persistence\storage\storage.dm" +#include "code\modules\planet\planet.dm" +#include "code\modules\planet\sun.dm" +#include "code\modules\planet\time.dm" +#include "code\modules\planet\virgo3b_vr.dm" +#include "code\modules\planet\virgo4_vr.dm" +#include "code\modules\planet\weather.dm" +#include "code\modules\planet\weather_vr.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\apc_vr.dm" +#include "code\modules\power\batteryrack.dm" +#include "code\modules\power\batteryrack_vr.dm" +#include "code\modules\power\breaker_box.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cable_ender.dm" +#include "code\modules\power\cable_heavyduty.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\debug_items.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\gravitygenerator_vr.dm" +#include "code\modules\power\grid_checker.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\lighting_vr.dm" +#include "code\modules\power\lightswitch_vr.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\port_gen_vr.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\smes_construction.dm" +#include "code\modules\power\smes_vr.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\antimatter\containment_jar.dm" +#include "code\modules\power\antimatter\control.dm" +#include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\cells\device_cells.dm" +#include "code\modules\power\cells\device_cells_vr.dm" +#include "code\modules\power\cells\esoteric_cells.dm" +#include "code\modules\power\cells\power_cells.dm" +#include "code\modules\power\fusion\_setup.dm" +#include "code\modules\power\fusion\fusion_circuits.dm" +#include "code\modules\power\fusion\fusion_particle_catcher.dm" +#include "code\modules\power\fusion\fusion_reactions.dm" +#include "code\modules\power\fusion\magpower.dm" +#include "code\modules\power\fusion\core\_core.dm" +#include "code\modules\power\fusion\core\core_control.dm" +#include "code\modules\power\fusion\core\core_field.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_assembly.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_compressor.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_control.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_injector.dm" +#include "code\modules\power\fusion\gyrotron\gyrotron.dm" +#include "code\modules\power\fusion\gyrotron\gyrotron_control.dm" +#include "code\modules\power\sensors\powernet_sensor.dm" +#include "code\modules\power\sensors\sensor_monitoring.dm" +#include "code\modules\power\singularity\act.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\emitter_vr.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm" +#include "code\modules\power\supermatter\setup_supermatter.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\power\tesla\telsa_construction.dm" +#include "code\modules\power\tesla\tesla_act.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\broken.dm" +#include "code\modules\projectiles\dnalocking.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\magazines_vr.dm" +#include "code\modules\projectiles\ammunition\magnetic.dm" +#include "code\modules\projectiles\ammunition\rounds.dm" +#include "code\modules\projectiles\ammunition\smartmag.dm" +#include "code\modules\projectiles\brokenguns\energy.dm" +#include "code\modules\projectiles\brokenguns\launcher.dm" +#include "code\modules\projectiles\brokenguns\magnetic.dm" +#include "code\modules\projectiles\brokenguns\projectile.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\launcher.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\modular_guns.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\vox.dm" +#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" +#include "code\modules\projectiles\guns\energy\crestrose_vr.dm" +#include "code\modules\projectiles\guns\energy\dominator_vr.dm" +#include "code\modules\projectiles\guns\energy\gunsword_vr.dm" +#include "code\modules\projectiles\guns\energy\hooklauncher.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\laser_vr.dm" +#include "code\modules\projectiles\guns\energy\netgun_vr.dm" +#include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\nuclear_vr.dm" +#include "code\modules\projectiles\guns\energy\particle.dm" +#include "code\modules\projectiles\guns\energy\phase.dm" +#include "code\modules\projectiles\guns\energy\protector_vr.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\pummeler_vr.dm" +#include "code\modules\projectiles\guns\energy\sickshot_vr.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\special_vr.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\stun_vr.dm" +#include "code\modules\projectiles\guns\energy\temperature.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\cell_loaded.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m_cells.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon_cells.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw_cells.dm" +#include "code\modules\projectiles\guns\launcher\bows.dm" +#include "code\modules\projectiles\guns\launcher\crossbow.dm" +#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" +#include "code\modules\projectiles\guns\launcher\pneumatic.dm" +#include "code\modules\projectiles\guns\launcher\rocket.dm" +#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\magic\fireball.dm" +#include "code\modules\projectiles\guns\magnetic\bore.dm" +#include "code\modules\projectiles\guns\magnetic\gasthrower.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" +#include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\automatic_vr.dm" +#include "code\modules\projectiles\guns\projectile\boltaction.dm" +#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm" +#include "code\modules\projectiles\guns\projectile\caseless.dm" +#include "code\modules\projectiles\guns\projectile\contender.dm" +#include "code\modules\projectiles\guns\projectile\dartgun.dm" +#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm" +#include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\pistol_vr.dm" +#include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\revolver_vr.dm" +#include "code\modules\projectiles\guns\projectile\semiauto.dm" +#include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" +#include "code\modules\projectiles\projectile\arc.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\beams_vr.dm" +#include "code\modules\projectiles\projectile\blob.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\bullets_vr.dm" +#include "code\modules\projectiles\projectile\change.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\energy_vr.dm" +#include "code\modules\projectiles\projectile\explosive.dm" +#include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\hook.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\magnetic.dm" +#include "code\modules\projectiles\projectile\pellets.dm" +#include "code\modules\projectiles\projectile\scatter.dm" +#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\projectiles\projectile\trace.dm" +#include "code\modules\projectiles\targeting\targeting_client.dm" +#include "code\modules\projectiles\targeting\targeting_gun.dm" +#include "code\modules\projectiles\targeting\targeting_mob.dm" +#include "code\modules\projectiles\targeting\targeting_overlay.dm" +#include "code\modules\projectiles\targeting\targeting_triggers.dm" +#include "code\modules\radiation\radiation.dm" +#include "code\modules\random_map\_random_map_setup.dm" +#include "code\modules\random_map\random_map.dm" +#include "code\modules\random_map\random_map_verbs.dm" +#include "code\modules\random_map\automata\automata.dm" +#include "code\modules\random_map\automata\caves.dm" +#include "code\modules\random_map\building\building.dm" +#include "code\modules\random_map\drop\drop_types.dm" +#include "code\modules\random_map\drop\droppod.dm" +#include "code\modules\random_map\drop\droppod_doors.dm" +#include "code\modules\random_map\drop\supply.dm" +#include "code\modules\random_map\mazes\maze.dm" +#include "code\modules\random_map\mazes\maze_cell.dm" +#include "code\modules\random_map\noise\desert.dm" +#include "code\modules\random_map\noise\noise.dm" +#include "code\modules\random_map\noise\ore.dm" +#include "code\modules\random_map\noise\tundra.dm" +#include "code\modules\reagents\Chemistry-Colours.dm" +#include "code\modules\reagents\Chemistry-Logging.dm" +#include "code\modules\reagents\Chemistry-Metabolism.dm" +#include "code\modules\reagents\holder\distilling.dm" +#include "code\modules\reagents\holder\holder.dm" +#include "code\modules\reagents\hoses\connector.dm" +#include "code\modules\reagents\hoses\hose.dm" +#include "code\modules\reagents\hoses\hose_connector.dm" +#include "code\modules\reagents\machinery\chem_master.dm" +#include "code\modules\reagents\machinery\chemalyzer.dm" +#include "code\modules\reagents\machinery\distillery.dm" +#include "code\modules\reagents\machinery\grinder.dm" +#include "code\modules\reagents\machinery\dispenser\_defines.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser2.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm" +#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" +#include "code\modules\reagents\machinery\dispenser\supply.dm" +#include "code\modules\reagents\reactions\_reactions.dm" +#include "code\modules\reagents\reactions\distilling\distilling.dm" +#include "code\modules\reagents\reactions\fusion\fusion.dm" +#include "code\modules\reagents\reactions\instant\drinks.dm" +#include "code\modules\reagents\reactions\instant\drinks_vr.dm" +#include "code\modules\reagents\reactions\instant\food.dm" +#include "code\modules\reagents\reactions\instant\food_vr.dm" +#include "code\modules\reagents\reactions\instant\instant.dm" +#include "code\modules\reagents\reactions\instant\instant_vr.dm" +#include "code\modules\reagents\reagent_containers\_reagent_containers.dm" +#include "code\modules\reagents\reagent_containers\blood_pack.dm" +#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" +#include "code\modules\reagents\reagent_containers\borghypo.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\glass_vr.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypospray_vr.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\pill_vr.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\spray_vr.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\reagents\reagent_containers\syringes_vr.dm" +#include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" +#include "code\modules\reagents\reagents\_helpers.dm" +#include "code\modules\reagents\reagents\_reagents.dm" +#include "code\modules\reagents\reagents\core.dm" +#include "code\modules\reagents\reagents\dispenser.dm" +#include "code\modules\reagents\reagents\food_drinks.dm" +#include "code\modules\reagents\reagents\food_drinks_vr.dm" +#include "code\modules\reagents\reagents\medicine.dm" +#include "code\modules\reagents\reagents\medicine_vr.dm" +#include "code\modules\reagents\reagents\modifiers.dm" +#include "code\modules\reagents\reagents\other.dm" +#include "code\modules\reagents\reagents\other_vr.dm" +#include "code\modules\reagents\reagents\toxins.dm" +#include "code\modules\reagents\reagents\vore_vr.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\disposal-construction.dm" +#include "code\modules\recycling\disposal.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\research\circuitprinter.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\mechfab_designs.dm" +#include "code\modules\research\message_server.dm" +#include "code\modules\research\prosfab_designs.dm" +#include "code\modules\research\prosfab_designs_vr.dm" +#include "code\modules\research\protolathe.dm" +#include "code\modules\research\rd-readme.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdconsole_tgui.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\teleport_vr.dm" +#include "code\modules\research\designs\ai_holders.dm" +#include "code\modules\research\designs\bag_of_holding.dm" +#include "code\modules\research\designs\beakers.dm" +#include "code\modules\research\designs\bio_devices.dm" +#include "code\modules\research\designs\bio_devices_vr.dm" +#include "code\modules\research\designs\circuit_assembly.dm" +#include "code\modules\research\designs\engineering.dm" +#include "code\modules\research\designs\HUDs.dm" +#include "code\modules\research\designs\HUDs_vr.dm" +#include "code\modules\research\designs\implants.dm" +#include "code\modules\research\designs\implants_vr.dm" +#include "code\modules\research\designs\locator_devices.dm" +#include "code\modules\research\designs\medical.dm" +#include "code\modules\research\designs\medical_vr.dm" +#include "code\modules\research\designs\mining_toys.dm" +#include "code\modules\research\designs\misc.dm" +#include "code\modules\research\designs\misc_vr.dm" +#include "code\modules\research\designs\modular_computer.dm" +#include "code\modules\research\designs\pdas.dm" +#include "code\modules\research\designs\power_cells.dm" +#include "code\modules\research\designs\precursor.dm" +#include "code\modules\research\designs\stock_parts.dm" +#include "code\modules\research\designs\subspace_parts.dm" +#include "code\modules\research\designs\tech_disks.dm" +#include "code\modules\research\designs\weapons.dm" +#include "code\modules\research\designs\weapons_vr.dm" +#include "code\modules\research\designs\xenoarch_toys.dm" +#include "code\modules\research\designs\xenobio_toys.dm" +#include "code\modules\research\designs\circuits\ai_modules.dm" +#include "code\modules\research\designs\circuits\ai_modules_vr.dm" +#include "code\modules\research\designs\circuits\circuits.dm" +#include "code\modules\research\designs\circuits\circuits_vr.dm" +#include "code\modules\research\designs\circuits\disks.dm" +#include "code\modules\resleeving\circuitboards.dm" +#include "code\modules\resleeving\computers.dm" +#include "code\modules\resleeving\designer.dm" +#include "code\modules\resleeving\documents.dm" +#include "code\modules\resleeving\implant.dm" +#include "code\modules\resleeving\infocore_records.dm" +#include "code\modules\resleeving\infomorph.dm" +#include "code\modules\resleeving\infomorph_software.dm" +#include "code\modules\resleeving\machines.dm" +#include "code\modules\resleeving\machines_vr.dm" +#include "code\modules\resleeving\resleeving_sickness.dm" +#include "code\modules\resleeving\sleevecard.dm" +#include "code\modules\rogueminer_vr\asteroid.dm" +#include "code\modules\rogueminer_vr\controller.dm" +#include "code\modules\rogueminer_vr\debug.dm" +#include "code\modules\rogueminer_vr\landmarks.dm" +#include "code\modules\rogueminer_vr\roguemines_mobs.dm" +#include "code\modules\rogueminer_vr\wrappers.dm" +#include "code\modules\rogueminer_vr\zone_console.dm" +#include "code\modules\rogueminer_vr\zonemaster.dm" +#include "code\modules\scripting\Errors.dm" +#include "code\modules\scripting\IDE.dm" +#include "code\modules\scripting\Options.dm" +#include "code\modules\scripting\stack.dm" +#include "code\modules\scripting\AST\AST Nodes.dm" +#include "code\modules\scripting\AST\Blocks.dm" +#include "code\modules\scripting\AST\Statements.dm" +#include "code\modules\scripting\AST\Operators\Binary Operators.dm" +#include "code\modules\scripting\AST\Operators\Unary Operators.dm" +#include "code\modules\scripting\Implementations\_Logic.dm" +#include "code\modules\scripting\Implementations\Telecomms.dm" +#include "code\modules\scripting\Interpreter\Evaluation.dm" +#include "code\modules\scripting\Interpreter\Interaction.dm" +#include "code\modules\scripting\Interpreter\Interpreter.dm" +#include "code\modules\scripting\Interpreter\Scope.dm" +#include "code\modules\scripting\Parser\Expressions.dm" +#include "code\modules\scripting\Parser\Keywords.dm" +#include "code\modules\scripting\Parser\Parser.dm" +#include "code\modules\scripting\Scanner\Scanner.dm" +#include "code\modules\scripting\Scanner\Tokens.dm" +#include "code\modules\security levels\keycard authentication.dm" +#include "code\modules\security levels\security levels.dm" +#include "code\modules\shieldgen\directional_shield.dm" +#include "code\modules\shieldgen\emergency_shield.dm" +#include "code\modules\shieldgen\energy_field.dm" +#include "code\modules\shieldgen\energy_shield.dm" +#include "code\modules\shieldgen\handheld_defuser.dm" +#include "code\modules\shieldgen\sheldwallgen.dm" +#include "code\modules\shieldgen\shield_capacitor.dm" +#include "code\modules\shieldgen\shield_diffuser.dm" +#include "code\modules\shieldgen\shield_gen.dm" +#include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shieldgen\shield_generator.dm" +#include "code\modules\shieldgen\shield_modes.dm" +#include "code\modules\shuttles\antagonist.dm" +#include "code\modules\shuttles\crashes.dm" +#include "code\modules\shuttles\departmental.dm" +#include "code\modules\shuttles\escape_pods.dm" +#include "code\modules\shuttles\landmarks.dm" +#include "code\modules\shuttles\shuttle.dm" +#include "code\modules\shuttles\shuttle_autodock.dm" +#include "code\modules\shuttles\shuttle_console.dm" +#include "code\modules\shuttles\shuttle_console_multi.dm" +#include "code\modules\shuttles\shuttle_emergency.dm" +#include "code\modules\shuttles\shuttle_ferry.dm" +#include "code\modules\shuttles\shuttle_specops.dm" +#include "code\modules\shuttles\shuttle_supply.dm" +#include "code\modules\shuttles\shuttles_multi.dm" +#include "code\modules\shuttles\shuttles_vr.dm" +#include "code\modules\shuttles\shuttles_web.dm" +#include "code\modules\shuttles\web_datums.dm" +#include "code\modules\spells\artifacts.dm" +#include "code\modules\spells\construct_spells.dm" +#include "code\modules\spells\no_clothes.dm" +#include "code\modules\spells\spell_code.dm" +#include "code\modules\spells\spell_projectile.dm" +#include "code\modules\spells\spellbook.dm" +#include "code\modules\spells\spells.dm" +#include "code\modules\spells\aoe_turf\aoe_turf.dm" +#include "code\modules\spells\aoe_turf\blink.dm" +#include "code\modules\spells\aoe_turf\charge.dm" +#include "code\modules\spells\aoe_turf\disable_tech.dm" +#include "code\modules\spells\aoe_turf\knock.dm" +#include "code\modules\spells\aoe_turf\smoke.dm" +#include "code\modules\spells\aoe_turf\summons.dm" +#include "code\modules\spells\aoe_turf\conjure\conjure.dm" +#include "code\modules\spells\aoe_turf\conjure\construct.dm" +#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" +#include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\rune_write.dm" +#include "code\modules\spells\targeted\ethereal_jaunt.dm" +#include "code\modules\spells\targeted\genetic.dm" +#include "code\modules\spells\targeted\harvest.dm" +#include "code\modules\spells\targeted\mind_transfer.dm" +#include "code\modules\spells\targeted\shift.dm" +#include "code\modules\spells\targeted\subjugate.dm" +#include "code\modules\spells\targeted\targeted.dm" +#include "code\modules\spells\targeted\equip\equip.dm" +#include "code\modules\spells\targeted\equip\horsemask.dm" +#include "code\modules\spells\targeted\projectile\dumbfire.dm" +#include "code\modules\spells\targeted\projectile\fireball.dm" +#include "code\modules\spells\targeted\projectile\magic_missile.dm" +#include "code\modules\spells\targeted\projectile\projectile.dm" +#include "code\modules\surgery\_defines.dm" +#include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\encased.dm" +#include "code\modules\surgery\external_repair.dm" +#include "code\modules\surgery\face.dm" +#include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\neck.dm" +#include "code\modules\surgery\organs_internal.dm" +#include "code\modules\surgery\other.dm" +#include "code\modules\surgery\robotics.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\~defines.dm" +#include "code\modules\tables\bench.dm" +#include "code\modules\tables\flipping.dm" +#include "code\modules\tables\interactions.dm" +#include "code\modules\tables\presets.dm" +#include "code\modules\tables\presets_vr.dm" +#include "code\modules\tables\rack.dm" +#include "code\modules\tables\rack_vr.dm" +#include "code\modules\tables\tables.dm" +#include "code\modules\tables\update_triggers.dm" +#include "code\modules\telesci\bscyrstal.dm" +#include "code\modules\telesci\construction.dm" +#include "code\modules\telesci\gps_advanced.dm" +#include "code\modules\telesci\quantum_pad.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tension\tension.dm" +#include "code\modules\tgs\includes.dm" +#include "code\modules\tgui\external.dm" +#include "code\modules\tgui\modal.dm" +#include "code\modules\tgui\states.dm" +#include "code\modules\tgui\tgui.dm" +#include "code\modules\tgui\tgui_alert.dm" +#include "code\modules\tgui\tgui_input_list.dm" +#include "code\modules\tgui\tgui_input_text.dm" +#include "code\modules\tgui\tgui_window.dm" +#include "code\modules\tgui\modules\_base.dm" +#include "code\modules\tgui\modules\admin_shuttle_controller.dm" +#include "code\modules\tgui\modules\agentcard.dm" +#include "code\modules\tgui\modules\alarm.dm" +#include "code\modules\tgui\modules\appearance_changer.dm" +#include "code\modules\tgui\modules\appearance_changer_vr.dm" +#include "code\modules\tgui\modules\atmos_control.dm" +#include "code\modules\tgui\modules\camera.dm" +#include "code\modules\tgui\modules\communications.dm" +#include "code\modules\tgui\modules\crew_manifest.dm" +#include "code\modules\tgui\modules\crew_monitor.dm" +#include "code\modules\tgui\modules\gyrotron_control.dm" +#include "code\modules\tgui\modules\law_manager.dm" +#include "code\modules\tgui\modules\overmap.dm" +#include "code\modules\tgui\modules\power_monitor.dm" +#include "code\modules\tgui\modules\rcon.dm" +#include "code\modules\tgui\modules\rustcore_monitor.dm" +#include "code\modules\tgui\modules\rustfuel_control.dm" +#include "code\modules\tgui\modules\shutoff_monitor.dm" +#include "code\modules\tgui\modules\supermatter_monitor.dm" +#include "code\modules\tgui\modules\teleporter.dm" +#include "code\modules\tgui\modules\ntos-only\cardmod.dm" +#include "code\modules\tgui\modules\ntos-only\configurator.dm" +#include "code\modules\tgui\modules\ntos-only\email.dm" +#include "code\modules\tgui\modules\ntos-only\uav.dm" +#include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\conscious.dm" +#include "code\modules\tgui\states\contained.dm" +#include "code\modules\tgui\states\deep_inventory.dm" +#include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\human_adjacent.dm" +#include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\inventory_vr.dm" +#include "code\modules\tgui\states\not_incapacitated.dm" +#include "code\modules\tgui\states\notcontained.dm" +#include "code\modules\tgui\states\observer.dm" +#include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\vorepanel_vr.dm" +#include "code\modules\tgui\states\zlevel.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\turbolift\_turbolift.dm" +#include "code\modules\turbolift\turbolift.dm" +#include "code\modules\turbolift\turbolift_areas.dm" +#include "code\modules\turbolift\turbolift_console.dm" +#include "code\modules\turbolift\turbolift_console_vr.dm" +#include "code\modules\turbolift\turbolift_door.dm" +#include "code\modules\turbolift\turbolift_door_vr.dm" +#include "code\modules\turbolift\turbolift_floor.dm" +#include "code\modules\turbolift\turbolift_map.dm" +#include "code\modules\turbolift\turbolift_turfs.dm" +#include "code\modules\vchat\vchat_client.dm" +#include "code\modules\vchat\vchat_db.dm" +#include "code\modules\vehicles\bike.dm" +#include "code\modules\vehicles\boat.dm" +#include "code\modules\vehicles\cargo_train.dm" +#include "code\modules\vehicles\construction.dm" +#include "code\modules\vehicles\quad.dm" +#include "code\modules\vehicles\train.dm" +#include "code\modules\vehicles\vehicle.dm" +#include "code\modules\ventcrawl\ventcrawl.dm" +#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" +#include "code\modules\ventcrawl\ventcrawl_multiz.dm" +#include "code\modules\ventcrawl\ventcrawl_verb.dm" +#include "code\modules\virus2\admin.dm" +#include "code\modules\virus2\analyser.dm" +#include "code\modules\virus2\antibodies.dm" +#include "code\modules\virus2\centrifuge.dm" +#include "code\modules\virus2\curer.dm" +#include "code\modules\virus2\disease2.dm" +#include "code\modules\virus2\diseasesplicer.dm" +#include "code\modules\virus2\dishincubator.dm" +#include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\effect_vr.dm" +#include "code\modules\virus2\helpers.dm" +#include "code\modules\virus2\isolator.dm" +#include "code\modules\virus2\items_devices.dm" +#include "code\modules\vore\hook-defs_vr.dm" +#include "code\modules\vore\trycatch_vr.dm" +#include "code\modules\vore\appearance\preferences_vr.dm" +#include "code\modules\vore\appearance\update_icons_vr.dm" +#include "code\modules\vore\eating\belly_dat_vr.dm" +#include "code\modules\vore\eating\belly_obj_vr.dm" +#include "code\modules\vore\eating\bellymodes_datum_vr.dm" +#include "code\modules\vore\eating\bellymodes_vr.dm" +#include "code\modules\vore\eating\contaminate_vr.dm" +#include "code\modules\vore\eating\digest_act_vr.dm" +#include "code\modules\vore\eating\leave_remains_vr.dm" +#include "code\modules\vore\eating\living_vr.dm" +#include "code\modules\vore\eating\silicon_vr.dm" +#include "code\modules\vore\eating\simple_animal_vr.dm" +#include "code\modules\vore\eating\transforming_vr.dm" +#include "code\modules\vore\eating\vore_vr.dm" +#include "code\modules\vore\eating\vorehooks_vr.dm" +#include "code\modules\vore\eating\vorepanel_vr.dm" +#include "code\modules\vore\fluffstuff\custom_boxes_vr.dm" +#include "code\modules\vore\fluffstuff\custom_clothes_vr.dm" +#include "code\modules\vore\fluffstuff\custom_items_vr.dm" +#include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" +#include "code\modules\vore\fluffstuff\custom_permits_vr.dm" +#include "code\modules\vore\persist\persist_vr.dm" +#include "code\modules\vore\resizing\grav_pull_vr.dm" +#include "code\modules\vore\resizing\holder_micro_vr.dm" +#include "code\modules\vore\resizing\resize_vr.dm" +#include "code\modules\vore\resizing\sizegun_vr.dm" +#include "code\modules\vore\smoleworld\smoleworld_vr.dm" +#include "code\modules\vore\weight\fitness_machines_vr.dm" +#include "code\modules\webhooks\_webhook.dm" +#include "code\modules\webhooks\webhook_ahelp2discord.dm" +#include "code\modules\webhooks\webhook_custom_event.dm" +#include "code\modules\webhooks\webhook_fax2discord.dm" +#include "code\modules\webhooks\webhook_roundend.dm" +#include "code\modules\webhooks\webhook_roundprep.dm" +#include "code\modules\webhooks\webhook_roundstart.dm" +#include "code\modules\xenoarcheaology\anomaly_container.dm" +#include "code\modules\xenoarcheaology\boulder.dm" +#include "code\modules\xenoarcheaology\effect.dm" +#include "code\modules\xenoarcheaology\manuals.dm" +#include "code\modules\xenoarcheaology\misc.dm" +#include "code\modules\xenoarcheaology\sampling.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_vr.dm" +#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" +#include "code\modules\xenoarcheaology\artifacts\crystal.dm" +#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" +#include "code\modules\xenoarcheaology\artifacts\replicator.dm" +#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm" +#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm" +#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm" +#include "code\modules\xenoarcheaology\effects\badfeeling.dm" +#include "code\modules\xenoarcheaology\effects\berserk.dm" +#include "code\modules\xenoarcheaology\effects\cannibal.dm" +#include "code\modules\xenoarcheaology\effects\cellcharge.dm" +#include "code\modules\xenoarcheaology\effects\celldrain.dm" +#include "code\modules\xenoarcheaology\effects\cold.dm" +#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" +#include "code\modules\xenoarcheaology\effects\electric_field.dm" +#include "code\modules\xenoarcheaology\effects\emp.dm" +#include "code\modules\xenoarcheaology\effects\feysight.dm" +#include "code\modules\xenoarcheaology\effects\forcefield.dm" +#include "code\modules\xenoarcheaology\effects\gaia.dm" +#include "code\modules\xenoarcheaology\effects\gasco2.dm" +#include "code\modules\xenoarcheaology\effects\gasnitro.dm" +#include "code\modules\xenoarcheaology\effects\gasoxy.dm" +#include "code\modules\xenoarcheaology\effects\gasphoron.dm" +#include "code\modules\xenoarcheaology\effects\gassleeping.dm" +#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" +#include "code\modules\xenoarcheaology\effects\gravitational_waves.dm" +#include "code\modules\xenoarcheaology\effects\heal.dm" +#include "code\modules\xenoarcheaology\effects\heat.dm" +#include "code\modules\xenoarcheaology\effects\hurt.dm" +#include "code\modules\xenoarcheaology\effects\poltergeist.dm" +#include "code\modules\xenoarcheaology\effects\radiate.dm" +#include "code\modules\xenoarcheaology\effects\resurrect.dm" +#include "code\modules\xenoarcheaology\effects\roboheal.dm" +#include "code\modules\xenoarcheaology\effects\robohurt.dm" +#include "code\modules\xenoarcheaology\effects\sleepy.dm" +#include "code\modules\xenoarcheaology\effects\stun.dm" +#include "code\modules\xenoarcheaology\effects\teleport.dm" +#include "code\modules\xenoarcheaology\effects\vampire.dm" +#include "code\modules\xenoarcheaology\finds\eguns.dm" +#include "code\modules\xenoarcheaology\finds\eguns_vr.dm" +#include "code\modules\xenoarcheaology\finds\find_spawning.dm" +#include "code\modules\xenoarcheaology\finds\finds.dm" +#include "code\modules\xenoarcheaology\finds\finds_defines.dm" +#include "code\modules\xenoarcheaology\finds\fossils.dm" +#include "code\modules\xenoarcheaology\finds\misc.dm" +#include "code\modules\xenoarcheaology\finds\special.dm" +#include "code\modules\xenoarcheaology\finds\talking.dm" +#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" +#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" +#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" +#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" +#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" +#include "code\modules\xenoarcheaology\tools\equipment.dm" +#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" +#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" +#include "code\modules\xenoarcheaology\tools\tools.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" +#include "code\modules\xenoarcheaology\tools\tools_vr.dm" +#include "code\modules\xenobio\items\extracts.dm" +#include "code\modules\xenobio\items\slime_objects.dm" +#include "code\modules\xenobio\items\slimepotions.dm" +#include "code\modules\xenobio\items\weapons.dm" +#include "code\modules\xenobio\machinery\processor.dm" +#include "code\modules\xgm\xgm_gas_data.dm" +#include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\unit_tests\decl_tests.dm" +#include "code\unit_tests\language_tests.dm" +#include "code\unit_tests\loadout_tests.dm" +#include "code\unit_tests\map_tests.dm" +#include "code\unit_tests\material_tests.dm" +#include "code\unit_tests\mob_tests.dm" +#include "code\unit_tests\recipe_tests.dm" +#include "code\unit_tests\research_tests.dm" +#include "code\unit_tests\sqlite_tests.dm" +#include "code\unit_tests\subsystem_tests.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\unit_test_vr.dm" +#include "code\unit_tests\vore_tests_vr.dm" +#include "code\unit_tests\zas_tests.dm" +#include "code\unit_tests\integrated_circuits\arithmetic.dm" +#include "code\unit_tests\integrated_circuits\circuits.dm" +#include "code\unit_tests\integrated_circuits\converter.dm" +#include "code\unit_tests\integrated_circuits\logic.dm" +#include "code\unit_tests\integrated_circuits\trig.dm" +#include "code\ZAS\Airflow.dm" +#include "code\ZAS\Atom.dm" +#include "code\ZAS\Connection.dm" +#include "code\ZAS\ConnectionGroup.dm" +#include "code\ZAS\ConnectionManager.dm" +#include "code\ZAS\Controller.dm" +#include "code\ZAS\Debug.dm" +#include "code\ZAS\Diagnostic.dm" +#include "code\ZAS\Fire.dm" +#include "code\ZAS\Phoron.dm" +#include "code\ZAS\Turf.dm" +#include "code\ZAS\Variable Settings.dm" +#include "code\ZAS\Zone.dm" +#include "interface\interface.dm" +#include "interface\skin.dmf" +#include "maps\gateway_archive_vr\blackmarketpackers.dm" +#include "maps\offmap_vr\om_ships\abductor.dm" +#include "maps\southern_cross\items\clothing\sc_accessory.dm" +#include "maps\southern_cross\items\clothing\sc_suit.dm" +#include "maps\southern_cross\items\clothing\sc_under.dm" +#include "maps\southern_cross\loadout\loadout_suit.dm" +#include "maps\southern_cross\loadout\loadout_uniform.dm" +#include "maps\southern_cross\loadout\loadout_vr.dm" +#include "maps\submaps\_helpers.dm" +#include "maps\submaps\_readme.dm" +#include "maps\submaps\engine_submaps\engine.dm" +#include "maps\submaps\engine_submaps\engine_areas.dm" +#include "maps\submaps\engine_submaps_vr\tether\_engine_submaps.dm" +#include "maps\submaps\space_submaps\space.dm" +#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" +#include "maps\submaps\surface_submaps\mountains\mountains.dm" +#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" +#include "maps\submaps\surface_submaps\mountains\mountains_areas_vr.dm" +#include "maps\submaps\surface_submaps\plains\plains.dm" +#include "maps\submaps\surface_submaps\plains\plains_areas.dm" +#include "maps\submaps\surface_submaps\wilderness\wilderness.dm" +#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" +#include "maps\tether\tether.dm" +#include "maps\~map_system\maps.dm" +// END_INCLUDE +======= +// DM Environment file for baystation12.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. + // New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES +// BEGIN_INCLUDE +#include "code\_away_mission_tests.dm" +#include "code\_macros.dm" +#include "code\_macros_vr.dm" +#include "code\_map_tests.dm" +#include "code\_unit_tests.dm" +#include "code\global.dm" +#include "code\global_init.dm" +#include "code\global_vr.dm" +#include "code\hub.dm" +#include "code\names.dm" +#include "code\stylesheet.dm" +#include "code\world.dm" +#include "code\__datastructures\globals.dm" +#include "code\__defines\__513_compatibility.dm" +#include "code\__defines\_compile_options.dm" +#include "code\__defines\_lists.dm" +#include "code\__defines\_planes+layers.dm" +#include "code\__defines\_planes+layers_vr.dm" +#include "code\__defines\_protect.dm" +#include "code\__defines\_tick.dm" +#include "code\__defines\admin.dm" +#include "code\__defines\admin_vr.dm" +#include "code\__defines\appearance.dm" +#include "code\__defines\atmos.dm" +#include "code\__defines\belly_modes_vr.dm" +#include "code\__defines\callbacks.dm" +#include "code\__defines\chemistry.dm" +#include "code\__defines\chemistry_vr.dm" +#include "code\__defines\color.dm" +#include "code\__defines\construction.dm" +#include "code\__defines\crafting.dm" +#include "code\__defines\damage_organs.dm" +#include "code\__defines\dna.dm" +#include "code\__defines\exosuit_fab.dm" +#include "code\__defines\flags.dm" +#include "code\__defines\gamemode.dm" +#include "code\__defines\holomap.dm" +#include "code\__defines\hoses.dm" +#include "code\__defines\input.dm" +#include "code\__defines\instruments.dm" +#include "code\__defines\integrated_circuits.dm" +#include "code\__defines\inventory_sizes.dm" +#include "code\__defines\is_helpers.dm" +#include "code\__defines\items_clothing.dm" +#include "code\__defines\lighting.dm" +#include "code\__defines\lighting_vr.dm" +#include "code\__defines\machinery.dm" +#include "code\__defines\map.dm" +#include "code\__defines\materials.dm" +#include "code\__defines\math.dm" +#include "code\__defines\math_physics.dm" +#include "code\__defines\MC.dm" +#include "code\__defines\misc.dm" +#include "code\__defines\misc_vr.dm" +#include "code\__defines\mobs.dm" +#include "code\__defines\mobs_vr.dm" +#include "code\__defines\nifsoft.dm" +#include "code\__defines\objects.dm" +#include "code\__defines\overmap.dm" +#include "code\__defines\pda.dm" +#include "code\__defines\planets.dm" +#include "code\__defines\planets_vr.dm" +#include "code\__defines\plants.dm" +#include "code\__defines\preferences.dm" +#include "code\__defines\process_scheduler.dm" +#include "code\__defines\qdel.dm" +#include "code\__defines\research.dm" +#include "code\__defines\roguemining_vr.dm" +#include "code\__defines\rust_g.dm" +#include "code\__defines\shields.dm" +#include "code\__defines\shuttle.dm" +#include "code\__defines\sound.dm" +#include "code\__defines\spaceman_dmm.dm" +#include "code\__defines\species_languages.dm" +#include "code\__defines\species_languages_vr.dm" +#include "code\__defines\sprite_sheets.dm" +#include "code\__defines\sqlite_defines.dm" +#include "code\__defines\stat_tracking.dm" +#include "code\__defines\subsystems.dm" +#include "code\__defines\supply.dm" +#include "code\__defines\targeting.dm" +#include "code\__defines\tgs.config.dm" +#include "code\__defines\tgs.dm" +#include "code\__defines\tgui.dm" +#include "code\__defines\tools.dm" +#include "code\__defines\turfs.dm" +#include "code\__defines\typeids.dm" +#include "code\__defines\unit_tests.dm" +#include "code\__defines\vote.dm" +#include "code\__defines\vv.dm" +#include "code\__defines\webhooks.dm" +#include "code\__defines\wires.dm" +#include "code\__defines\xenoarcheaology.dm" +#include "code\__defines\ZAS.dm" +#include "code\__defines\dcs\flags.dm" +#include "code\__defines\dcs\helpers.dm" +#include "code\__defines\dcs\signals.dm" +#include "code\_global_vars\bitfields.dm" +#include "code\_global_vars\misc.dm" +#include "code\_global_vars\mobs.dm" +#include "code\_global_vars\religion.dm" +#include "code\_global_vars\sensitive.dm" +#include "code\_global_vars\typecache.dm" +#include "code\_global_vars\lists\mapping.dm" +#include "code\_global_vars\lists\misc.dm" +#include "code\_global_vars\lists\species.dm" +#include "code\_helpers\_global_objects.dm" +#include "code\_helpers\_global_objects_vr.dm" +#include "code\_helpers\_lists.dm" +#include "code\_helpers\atmospherics.dm" +#include "code\_helpers\atom_movables.dm" +#include "code\_helpers\events.dm" +#include "code\_helpers\files.dm" +#include "code\_helpers\game.dm" +#include "code\_helpers\global_lists.dm" +#include "code\_helpers\global_lists_vr.dm" +#include "code\_helpers\icons.dm" +#include "code\_helpers\icons_vr.dm" +#include "code\_helpers\lighting.dm" +#include "code\_helpers\logging.dm" +#include "code\_helpers\logging_vr.dm" +#include "code\_helpers\matrices.dm" +#include "code\_helpers\mobs.dm" +#include "code\_helpers\names.dm" +#include "code\_helpers\sanitize_values.dm" +#include "code\_helpers\storage.dm" +#include "code\_helpers\string_lists.dm" +#include "code\_helpers\text.dm" +#include "code\_helpers\time.dm" +#include "code\_helpers\turfs.dm" +#include "code\_helpers\type2type.dm" +#include "code\_helpers\unsorted.dm" +#include "code\_helpers\unsorted_vr.dm" +#include "code\_helpers\view.dm" +#include "code\_helpers\visual_filters.dm" +#include "code\_helpers\sorts\__main.dm" +#include "code\_helpers\sorts\comparators.dm" +#include "code\_helpers\sorts\TimSort.dm" +#include "code\_onclick\_defines.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\rig.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\_defines_vr.dm" +#include "code\_onclick\hud\ability_screen_objects.dm" +#include "code\_onclick\hud\action.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alert_vr.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\gun_mode.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\map_popups.dm" +#include "code\_onclick\hud\minihud.dm" +#include "code\_onclick\hud\minihud_mapper.dm" +#include "code\_onclick\hud\minihud_rigmech.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\other_mobs.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\robot_vr.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\screen_objects_vr.dm" +#include "code\_onclick\hud\skybox.dm" +#include "code\_onclick\hud\soulcatcher_guest.dm" +#include "code\_onclick\hud\spell_screen_objects.dm" +#include "code\ATMOSPHERICS\_atmos_setup.dm" +#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" +#include "code\ATMOSPHERICS\atmospherics.dm" +#include "code\ATMOSPHERICS\datum_pipe_network.dm" +#include "code\ATMOSPHERICS\datum_pipeline.dm" +#include "code\ATMOSPHERICS\components\portables_connector.dm" +#include "code\ATMOSPHERICS\components\shutoff.dm" +#include "code\ATMOSPHERICS\components\tvalve.dm" +#include "code\ATMOSPHERICS\components\valve.dm" +#include "code\ATMOSPHERICS\components\binary_devices\algae_generator_vr.dm" +#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" +#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" +#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" +#include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" +#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" +#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" +#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" +#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" +#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" +#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" +#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" +#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" +#include "code\ATMOSPHERICS\components\unary\heat_source.dm" +#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" +#include "code\ATMOSPHERICS\components\unary\unary_base.dm" +#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" +#include "code\ATMOSPHERICS\components\unary\vent_scrubber_vr.dm" +#include "code\ATMOSPHERICS\pipes\cap.dm" +#include "code\ATMOSPHERICS\pipes\he_pipes.dm" +#include "code\ATMOSPHERICS\pipes\he_pipes_vr.dm" +#include "code\ATMOSPHERICS\pipes\manifold.dm" +#include "code\ATMOSPHERICS\pipes\manifold4w.dm" +#include "code\ATMOSPHERICS\pipes\pipe_base.dm" +#include "code\ATMOSPHERICS\pipes\pipe_base_vr.dm" +#include "code\ATMOSPHERICS\pipes\simple.dm" +#include "code\ATMOSPHERICS\pipes\tank.dm" +#include "code\ATMOSPHERICS\pipes\tank_vr.dm" +#include "code\ATMOSPHERICS\pipes\universal.dm" +#include "code\ATMOSPHERICS\pipes\vent.dm" +#include "code\controllers\autotransfer.dm" +#include "code\controllers\communications.dm" +#include "code\controllers\configuration.dm" +#include "code\controllers\configuration_vr.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\emergency_shuttle_controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks-defs.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\master_controller.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\verbs.dm" +#include "code\controllers\observer_listener\atom\observer.dm" +#include "code\controllers\subsystems\ai.dm" +#include "code\controllers\subsystems\aifast.dm" +#include "code\controllers\subsystems\air.dm" +#include "code\controllers\subsystems\airflow.dm" +#include "code\controllers\subsystems\alarm.dm" +#include "code\controllers\subsystems\assets.dm" +#include "code\controllers\subsystems\atoms.dm" +#include "code\controllers\subsystems\character_setup.dm" +#include "code\controllers\subsystems\chat.dm" +#include "code\controllers\subsystems\chemistry.dm" +#include "code\controllers\subsystems\circuits.dm" +#include "code\controllers\subsystems\dcs.dm" +#include "code\controllers\subsystems\events.dm" +#include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\holomaps.dm" +#include "code\controllers\subsystems\inactivity.dm" +#include "code\controllers\subsystems\input.dm" +#include "code\controllers\subsystems\job.dm" +#include "code\controllers\subsystems\lighting.dm" +#include "code\controllers\subsystems\machines.dm" +#include "code\controllers\subsystems\mapping.dm" +#include "code\controllers\subsystems\media_tracks.dm" +#include "code\controllers\subsystems\mobs.dm" +#include "code\controllers\subsystems\nightshift.dm" +#include "code\controllers\subsystems\orbits.dm" +#include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\persist_vr.dm" +#include "code\controllers\subsystems\persistence.dm" +#include "code\controllers\subsystems\planets.dm" +#include "code\controllers\subsystems\plants.dm" +#include "code\controllers\subsystems\radiation.dm" +#include "code\controllers\subsystems\shuttles.dm" +#include "code\controllers\subsystems\skybox.dm" +#include "code\controllers\subsystems\sounds.dm" +#include "code\controllers\subsystems\sqlite.dm" +#include "code\controllers\subsystems\sun.dm" +#include "code\controllers\subsystems\supply.dm" +#include "code\controllers\subsystems\tgui.dm" +#include "code\controllers\subsystems\ticker.dm" +#include "code\controllers\subsystems\time_track.dm" +#include "code\controllers\subsystems\timer.dm" +#include "code\controllers\subsystems\transcore_vr.dm" +#include "code\controllers\subsystems\vis_overlays.dm" +#include "code\controllers\subsystems\vote.dm" +#include "code\controllers\subsystems\webhooks.dm" +#include "code\controllers\subsystems\xenoarch.dm" +#include "code\controllers\subsystems\processing\bellies_vr.dm" +#include "code\controllers\subsystems\processing\fastprocess.dm" +#include "code\controllers\subsystems\processing\instruments.dm" +#include "code\controllers\subsystems\processing\obj.dm" +#include "code\controllers\subsystems\processing\processing.dm" +#include "code\controllers\subsystems\processing\projectiles.dm" +#include "code\controllers\subsystems\processing\turfs.dm" +#include "code\datums\ai_law_sets.dm" +#include "code\datums\ai_law_sets_vr.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\category.dm" +#include "code\datums\chat_message.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\EPv2.dm" +#include "code\datums\ghost_query.dm" +#include "code\datums\ghost_query_vr.dm" +#include "code\datums\hierarchy.dm" +#include "code\datums\mind.dm" +#include "code\datums\mind_vr.dm" +#include "code\datums\mixed.dm" +#include "code\datums\modules.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\orbit.dm" +#include "code\datums\organs.dm" +#include "code\datums\position_point_vector.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\reference_tracking.dm" +#include "code\datums\riding.dm" +#include "code\datums\soul_link.dm" +#include "code\datums\sun.dm" +#include "code\datums\weakref.dm" +#include "code\datums\autolathe\arms.dm" +#include "code\datums\autolathe\arms_vr.dm" +#include "code\datums\autolathe\autolathe.dm" +#include "code\datums\autolathe\devices.dm" +#include "code\datums\autolathe\devices_vr.dm" +#include "code\datums\autolathe\engineering.dm" +#include "code\datums\autolathe\engineering_vr.dm" +#include "code\datums\autolathe\general.dm" +#include "code\datums\autolathe\general_vr.dm" +#include "code\datums\autolathe\materials.dm" +#include "code\datums\autolathe\medical.dm" +#include "code\datums\autolathe\medical_vr.dm" +#include "code\datums\autolathe\tools.dm" +#include "code\datums\autolathe\tools_vr.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\overlay_lighting.dm" +#include "code\datums\components\resize_guard.dm" +#include "code\datums\components\crafting\crafting.dm" +#include "code\datums\components\crafting\crafting_external.dm" +#include "code\datums\components\crafting\recipes.dm" +#include "code\datums\components\crafting\tool_quality.dm" +#include "code\datums\components\crafting\recipes\primitive.dm" +#include "code\datums\components\crafting\recipes\weapons.dm" +#include "code\datums\elements\_element.dm" +#include "code\datums\elements\light_blocking.dm" +#include "code\datums\elements\turf_transparency.dm" +#include "code\datums\game_masters\_common.dm" +#include "code\datums\helper_datums\construction_datum.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\getrev.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\teleport_vr.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\locations\locations.dm" +#include "code\datums\locations\nyx.dm" +#include "code\datums\locations\qerrvallis.dm" +#include "code\datums\locations\s_randarr.dm" +#include "code\datums\locations\sol.dm" +#include "code\datums\locations\tau_ceti.dm" +#include "code\datums\locations\uueoa_esa.dm" +#include "code\datums\locations\vir.dm" +#include "code\datums\looping_sounds\_looping_sound.dm" +#include "code\datums\looping_sounds\item_sounds.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\sequence.dm" +#include "code\datums\looping_sounds\weather_sounds.dm" +#include "code\datums\managed_browsers\_managed_browser.dm" +#include "code\datums\managed_browsers\feedback_form.dm" +#include "code\datums\managed_browsers\feedback_viewer.dm" +#include "code\datums\observation\_debug.dm" +#include "code\datums\observation\_defines.dm" +#include "code\datums\observation\destroyed.dm" +#include "code\datums\observation\dir_set.dm" +#include "code\datums\observation\equipped.dm" +#include "code\datums\observation\helpers.dm" +#include "code\datums\observation\logged_in.dm" +#include "code\datums\observation\moved.dm" +#include "code\datums\observation\observation.dm" +#include "code\datums\observation\power_change.dm" +#include "code\datums\observation\shuttle_added.dm" +#include "code\datums\observation\shuttle_moved.dm" +#include "code\datums\observation\stat_set.dm" +#include "code\datums\observation\turf_changed.dm" +#include "code\datums\observation\turf_enterexit.dm" +#include "code\datums\observation\unequipped.dm" +#include "code\datums\observation\z_moved.dm" +#include "code\datums\observation\~cleanup.dm" +#include "code\datums\outfits\_defines.dm" +#include "code\datums\outfits\horror_killers.dm" +#include "code\datums\outfits\misc.dm" +#include "code\datums\outfits\nanotrasen.dm" +#include "code\datums\outfits\outfit.dm" +#include "code\datums\outfits\outfit_vr.dm" +#include "code\datums\outfits\pirates.dm" +#include "code\datums\outfits\spec_op.dm" +#include "code\datums\outfits\tournament.dm" +#include "code\datums\outfits\wizardry.dm" +#include "code\datums\outfits\costumes\costume.dm" +#include "code\datums\outfits\costumes\halloween.dm" +#include "code\datums\outfits\jobs\cargo.dm" +#include "code\datums\outfits\jobs\civilian.dm" +#include "code\datums\outfits\jobs\civilian_vr.dm" +#include "code\datums\outfits\jobs\command.dm" +#include "code\datums\outfits\jobs\command_vr.dm" +#include "code\datums\outfits\jobs\engineering.dm" +#include "code\datums\outfits\jobs\job.dm" +#include "code\datums\outfits\jobs\medical.dm" +#include "code\datums\outfits\jobs\medical_vr.dm" +#include "code\datums\outfits\jobs\misc.dm" +#include "code\datums\outfits\jobs\science.dm" +#include "code\datums\outfits\jobs\science_vr.dm" +#include "code\datums\outfits\jobs\security.dm" +#include "code\datums\outfits\jobs\special_vr.dm" +#include "code\datums\outfits\military\fleet.dm" +#include "code\datums\outfits\military\marines.dm" +#include "code\datums\outfits\military\military.dm" +#include "code\datums\outfits\military\sifguard.dm" +#include "code\datums\repositories\ammomaterial.dm" +#include "code\datums\repositories\cameras.dm" +#include "code\datums\repositories\crew.dm" +#include "code\datums\repositories\decls.dm" +#include "code\datums\repositories\repository.dm" +#include "code\datums\repositories\unique.dm" +#include "code\datums\roundstats\_defines_local.dm" +#include "code\datums\roundstats\departmentgoal.dm" +#include "code\datums\roundstats\roundstats.dm" +#include "code\datums\supplypacks\atmospherics.dm" +#include "code\datums\supplypacks\contraband.dm" +#include "code\datums\supplypacks\contraband_vr.dm" +#include "code\datums\supplypacks\costumes.dm" +#include "code\datums\supplypacks\costumes_vr.dm" +#include "code\datums\supplypacks\engineering.dm" +#include "code\datums\supplypacks\engineering_vr.dm" +#include "code\datums\supplypacks\hospitality.dm" +#include "code\datums\supplypacks\hospitality_vr.dm" +#include "code\datums\supplypacks\hydroponics.dm" +#include "code\datums\supplypacks\hydroponics_vr.dm" +#include "code\datums\supplypacks\materials.dm" +#include "code\datums\supplypacks\medical.dm" +#include "code\datums\supplypacks\medical_vr.dm" +#include "code\datums\supplypacks\misc.dm" +#include "code\datums\supplypacks\misc_vr.dm" +#include "code\datums\supplypacks\munitions.dm" +#include "code\datums\supplypacks\munitions_vr.dm" +#include "code\datums\supplypacks\musical.dm" +#include "code\datums\supplypacks\recreation.dm" +#include "code\datums\supplypacks\recreation_vr.dm" +#include "code\datums\supplypacks\robotics.dm" +#include "code\datums\supplypacks\robotics_vr.dm" +#include "code\datums\supplypacks\science.dm" +#include "code\datums\supplypacks\science_vr.dm" +#include "code\datums\supplypacks\security.dm" +#include "code\datums\supplypacks\security_vr.dm" +#include "code\datums\supplypacks\supply.dm" +#include "code\datums\supplypacks\supply_vr.dm" +#include "code\datums\supplypacks\supplypacks.dm" +#include "code\datums\supplypacks\voidsuits.dm" +#include "code\datums\supplypacks\voidsuits_vr.dm" +#include "code\datums\underwear\bottom.dm" +#include "code\datums\underwear\socks.dm" +#include "code\datums\underwear\top.dm" +#include "code\datums\underwear\undershirts.dm" +#include "code\datums\underwear\underwear.dm" +#include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\ammunition_vr.dm" +#include "code\datums\uplink\announcements.dm" +#include "code\datums\uplink\armor.dm" +#include "code\datums\uplink\backup.dm" +#include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\grenades.dm" +#include "code\datums\uplink\hardsuit_modules.dm" +#include "code\datums\uplink\implants.dm" +#include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\medical_vr.dm" +#include "code\datums\uplink\resources.dm" +#include "code\datums\uplink\stealth_items.dm" +#include "code\datums\uplink\stealthy_weapons.dm" +#include "code\datums\uplink\telecrystals.dm" +#include "code\datums\uplink\tools.dm" +#include "code\datums\uplink\tools_vr.dm" +#include "code\datums\uplink\uplink_categories.dm" +#include "code\datums\uplink\uplink_items.dm" +#include "code\datums\uplink\visible_weapons.dm" +#include "code\datums\uplink\visible_weapons_vr.dm" +#include "code\datums\vending\stored_item.dm" +#include "code\datums\vending\vending.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\camera.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\grid_checker.dm" +#include "code\datums\wires\jukebox.dm" +#include "code\datums\wires\mines.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\seedstorage.dm" +#include "code\datums\wires\shield_generator.dm" +#include "code\datums\wires\smartfridge.dm" +#include "code\datums\wires\smes.dm" +#include "code\datums\wires\suit_storage_unit.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\datums\wires\wires.dm" +#include "code\defines\gases.dm" +#include "code\defines\obj.dm" +#include "code\defines\obj\weapon.dm" +#include "code\defines\procs\announce.dm" +#include "code\defines\procs\AStar.dm" +#include "code\defines\procs\dbcore.dm" +#include "code\defines\procs\radio.dm" +#include "code\defines\procs\statistics.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\atoms_movable_vr.dm" +#include "code\game\base_turf.dm" +#include "code\game\periodic_news.dm" +#include "code\game\response_team.dm" +#include "code\game\response_team_vr.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\skincmd.dm" +#include "code\game\sound.dm" +#include "code\game\trader_visit.dm" +#include "code\game\trader_visit_vr.dm" +#include "code\game\world.dm" +#include "code\game\antagonist\_antagonist_setup.dm" +#include "code\game\antagonist\antagonist.dm" +#include "code\game\antagonist\antagonist_add.dm" +#include "code\game\antagonist\antagonist_create.dm" +#include "code\game\antagonist\antagonist_equip.dm" +#include "code\game\antagonist\antagonist_factions.dm" +#include "code\game\antagonist\antagonist_helpers.dm" +#include "code\game\antagonist\antagonist_objectives.dm" +#include "code\game\antagonist\antagonist_panel.dm" +#include "code\game\antagonist\antagonist_place.dm" +#include "code\game\antagonist\antagonist_print.dm" +#include "code\game\antagonist\antagonist_update.dm" +#include "code\game\antagonist\alien\borer.dm" +#include "code\game\antagonist\alien\xenomorph.dm" +#include "code\game\antagonist\outsider\commando.dm" +#include "code\game\antagonist\outsider\deathsquad.dm" +#include "code\game\antagonist\outsider\ert.dm" +#include "code\game\antagonist\outsider\ert_vr.dm" +#include "code\game\antagonist\outsider\mercenary.dm" +#include "code\game\antagonist\outsider\ninja.dm" +#include "code\game\antagonist\outsider\raider.dm" +#include "code\game\antagonist\outsider\technomancer.dm" +#include "code\game\antagonist\outsider\trader.dm" +#include "code\game\antagonist\outsider\wizard.dm" +#include "code\game\antagonist\station\changeling.dm" +#include "code\game\antagonist\station\cultist.dm" +#include "code\game\antagonist\station\highlander.dm" +#include "code\game\antagonist\station\infiltrator.dm" +#include "code\game\antagonist\station\loyalist.dm" +#include "code\game\antagonist\station\renegade.dm" +#include "code\game\antagonist\station\revolutionary.dm" +#include "code\game\antagonist\station\rogue_ai.dm" +#include "code\game\antagonist\station\stowaway.dm" +#include "code\game\antagonist\station\thug.dm" +#include "code\game\antagonist\station\traitor.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\areas_vr.dm" +#include "code\game\area\asteroid_areas.dm" +#include "code\game\area\Away Mission areas.dm" +#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\Space Station 13 areas_vr.dm" +#include "code\game\area\ss13_deprecated_areas.dm" +#include "code\game\dna\dna2.dm" +#include "code\game\dna\dna2_domutcheck.dm" +#include "code\game\dna\dna2_helpers.dm" +#include "code\game\dna\dna_modifier.dm" +#include "code\game\dna\genes\disabilities.dm" +#include "code\game\dna\genes\gene.dm" +#include "code\game\dna\genes\powers.dm" +#include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\game_mode_latespawn.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\calamity\calamity.dm" +#include "code\game\gamemodes\changeling\absorbed_dna.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_powers.dm" +#include "code\game\gamemodes\changeling\generic_equip_procs.dm" +#include "code\game\gamemodes\changeling\modularchangling.dm" +#include "code\game\gamemodes\changeling\powers\absorb.dm" +#include "code\game\gamemodes\changeling\powers\armblade.dm" +#include "code\game\gamemodes\changeling\powers\armor.dm" +#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" +#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" +#include "code\game\gamemodes\changeling\powers\blind_sting.dm" +#include "code\game\gamemodes\changeling\powers\boost_range.dm" +#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" +#include "code\game\gamemodes\changeling\powers\darkvision.dm" +#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" +#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" +#include "code\game\gamemodes\changeling\powers\digital_camo.dm" +#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" +#include "code\game\gamemodes\changeling\powers\endoarmor.dm" +#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" +#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" +#include "code\game\gamemodes\changeling\powers\enrage.dm" +#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" +#include "code\game\gamemodes\changeling\powers\escape_restraints.dm" +#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" +#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" +#include "code\game\gamemodes\changeling\powers\fake_death.dm" +#include "code\game\gamemodes\changeling\powers\fleshmend.dm" +#include "code\game\gamemodes\changeling\powers\hivemind.dm" +#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" +#include "code\game\gamemodes\changeling\powers\panacea.dm" +#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" +#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" +#include "code\game\gamemodes\changeling\powers\respec.dm" +#include "code\game\gamemodes\changeling\powers\revive.dm" +#include "code\game\gamemodes\changeling\powers\self_respiration.dm" +#include "code\game\gamemodes\changeling\powers\shriek.dm" +#include "code\game\gamemodes\changeling\powers\silence_sting.dm" +#include "code\game\gamemodes\changeling\powers\transform.dm" +#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" +#include "code\game\gamemodes\cult\construct_spells.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\cult\cult_items.dm" +#include "code\game\gamemodes\cult\cult_structures.dm" +#include "code\game\gamemodes\cult\hell_universe.dm" +#include "code\game\gamemodes\cult\narsie.dm" +#include "code\game\gamemodes\cult\ritual.dm" +#include "code\game\gamemodes\cult\runes.dm" +#include "code\game\gamemodes\cult\soulstone.dm" +#include "code\game\gamemodes\cult\talisman.dm" +#include "code\game\gamemodes\cult\cultify\mob.dm" +#include "code\game\gamemodes\cult\cultify\obj.dm" +#include "code\game\gamemodes\cult\cultify\turf.dm" +#include "code\game\gamemodes\endgame\endgame.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" +#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" +#include "code\game\gamemodes\events\black_hole.dm" +#include "code\game\gamemodes\events\clang.dm" +#include "code\game\gamemodes\events\dust.dm" +#include "code\game\gamemodes\events\power_failure.dm" +#include "code\game\gamemodes\events\wormholes.dm" +#include "code\game\gamemodes\events\holidays\Christmas.dm" +#include "code\game\gamemodes\events\holidays\Holidays.dm" +#include "code\game\gamemodes\events\holidays\Other.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\heist\heist.dm" +#include "code\game\gamemodes\infiltrator\infiltrator.dm" +#include "code\game\gamemodes\malfunction\malf_hardware.dm" +#include "code\game\gamemodes\malfunction\malf_research.dm" +#include "code\game\gamemodes\malfunction\malf_research_ability.dm" +#include "code\game\gamemodes\malfunction\malfunction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" +#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\meteor\meteors_vr.dm" +#include "code\game\gamemodes\mixed\conflux.dm" +#include "code\game\gamemodes\mixed\infestation.dm" +#include "code\game\gamemodes\mixed\intrigue.dm" +#include "code\game\gamemodes\mixed\lizard.dm" +#include "code\game\gamemodes\mixed\mercrenegade.dm" +#include "code\game\gamemodes\mixed\mercwiz.dm" +#include "code\game\gamemodes\mixed\paranoia.dm" +#include "code\game\gamemodes\mixed\traitorling.dm" +#include "code\game\gamemodes\mixed\traitorrenegade.dm" +#include "code\game\gamemodes\mixed\uprising.dm" +#include "code\game\gamemodes\mixed\visitors.dm" +#include "code\game\gamemodes\ninja\ninja.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\nuclear\pinpointer.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\technomancer\catalog.dm" +#include "code\game\gamemodes\technomancer\clothing.dm" +#include "code\game\gamemodes\technomancer\core_obj.dm" +#include "code\game\gamemodes\technomancer\equipment.dm" +#include "code\game\gamemodes\technomancer\instability.dm" +#include "code\game\gamemodes\technomancer\spell_objs.dm" +#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" +#include "code\game\gamemodes\technomancer\technomancer.dm" +#include "code\game\gamemodes\technomancer\assistance\assistance.dm" +#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" +#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" +#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" +#include "code\game\gamemodes\technomancer\devices\hypos.dm" +#include "code\game\gamemodes\technomancer\devices\implants.dm" +#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" +#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" +#include "code\game\gamemodes\technomancer\spells\abjuration.dm" +#include "code\game\gamemodes\technomancer\spells\apportation.dm" +#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" +#include "code\game\gamemodes\technomancer\spells\blink.dm" +#include "code\game\gamemodes\technomancer\spells\chroma.dm" +#include "code\game\gamemodes\technomancer\spells\condensation.dm" +#include "code\game\gamemodes\technomancer\spells\control.dm" +#include "code\game\gamemodes\technomancer\spells\dispel.dm" +#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" +#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" +#include "code\game\gamemodes\technomancer\spells\gambit.dm" +#include "code\game\gamemodes\technomancer\spells\illusion.dm" +#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" +#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" +#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" +#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" +#include "code\game\gamemodes\technomancer\spells\passwall.dm" +#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" +#include "code\game\gamemodes\technomancer\spells\radiance.dm" +#include "code\game\gamemodes\technomancer\spells\reflect.dm" +#include "code\game\gamemodes\technomancer\spells\resurrect.dm" +#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" +#include "code\game\gamemodes\technomancer\spells\shield.dm" +#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" +#include "code\game\gamemodes\technomancer\spells\track.dm" +#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" +#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" +#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_all.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\purify.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lesser_chain_lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" +#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" +#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" +#include "code\game\gamemodes\technomancer\spells\summon\summon_ward.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\jobs\_access_defs.dm" +#include "code\game\jobs\access.dm" +#include "code\game\jobs\access_datum.dm" +#include "code\game\jobs\access_datum_vr.dm" +#include "code\game\jobs\job_controller.dm" +#include "code\game\jobs\jobs.dm" +#include "code\game\jobs\whitelist.dm" +#include "code\game\jobs\whitelist_vr.dm" +#include "code\game\jobs\job\_alt_title.dm" +#include "code\game\jobs\job\assistant.dm" +#include "code\game\jobs\job\assistant_vr.dm" +#include "code\game\jobs\job\captain.dm" +#include "code\game\jobs\job\captain_vr.dm" +#include "code\game\jobs\job\civilian.dm" +#include "code\game\jobs\job\civilian_chaplain.dm" +#include "code\game\jobs\job\civilian_vr.dm" +#include "code\game\jobs\job\department.dm" +#include "code\game\jobs\job\department_vr.dm" +#include "code\game\jobs\job\engineering.dm" +#include "code\game\jobs\job\engineering_vr.dm" +#include "code\game\jobs\job\exploration_vr.dm" +#include "code\game\jobs\job\job.dm" +#include "code\game\jobs\job\job_vr.dm" +#include "code\game\jobs\job\medical.dm" +#include "code\game\jobs\job\medical_vr.dm" +#include "code\game\jobs\job\offduty_vr.dm" +#include "code\game\jobs\job\science.dm" +#include "code\game\jobs\job\science_vr.dm" +#include "code\game\jobs\job\security.dm" +#include "code\game\jobs\job\security_vr.dm" +#include "code\game\jobs\job\silicon.dm" +#include "code\game\jobs\job\silicon_vr.dm" +#include "code\game\jobs\job\special_vr.dm" +#include "code\game\machinery\adv_med.dm" +#include "code\game\machinery\adv_med_vr.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\air_alarm.dm" +#include "code\game\machinery\airconditioner_vr.dm" +#include "code\game\machinery\atmo_control.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\biogenerator.dm" +#include "code\game\machinery\bioprinter.dm" +#include "code\game\machinery\bomb_tester_vr.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\buttons_vr.dm" +#include "code\game\machinery\CableLayer.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\cryo.dm" +#include "code\game\machinery\cryopod.dm" +#include "code\game\machinery\cryopod_vr.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\deployable_vr.dm" +#include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doorbell_vr.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\exonet_node.dm" +#include "code\game\machinery\fire_alarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\floodlight.dm" +#include "code\game\machinery\floor_light.dm" +#include "code\game\machinery\floorlayer.dm" +#include "code\game\machinery\frame.dm" +#include "code\game\machinery\gear_dispenser.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\holoposter.dm" +#include "code\game\machinery\holosign.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\jukebox.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\machinery.dm" +#include "code\game\machinery\machinery_power.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\neonsign.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\nuclear_bomb.dm" +#include "code\game\machinery\OpTable.dm" +#include "code\game\machinery\overview.dm" +#include "code\game\machinery\oxygen_pump.dm" +#include "code\game\machinery\painter_vr.dm" +#include "code\game\machinery\partslathe_vr.dm" +#include "code\game\machinery\pda_multicaster.dm" +#include "code\game\machinery\pointdefense.dm" +#include "code\game\machinery\portable_turret.dm" +#include "code\game\machinery\portable_turret_vr.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\requests_console_vr.dm" +#include "code\game\machinery\robot_fabricator.dm" +#include "code\game\machinery\seed_extractor.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\status_display_ai.dm" +#include "code\game\machinery\suit_cycler_datums.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\suit_storage_unit_vr.dm" +#include "code\game\machinery\supply_display.dm" +#include "code\game\machinery\supplybeacon.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebeacon_vr.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transportpod.dm" +#include "code\game\machinery\turret_control.dm" +#include "code\game\machinery\vending_machines_vr.dm" +#include "code\game\machinery\vitals_monitor.dm" +#include "code\game\machinery\wall_frames.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer.dm" +#include "code\game\machinery\atmoalter\area_atmos_computer_vr.dm" +#include "code\game\machinery\atmoalter\canister.dm" +#include "code\game\machinery\atmoalter\clamp.dm" +#include "code\game\machinery\atmoalter\meter.dm" +#include "code\game\machinery\atmoalter\portable_atmospherics.dm" +#include "code\game\machinery\atmoalter\pump.dm" +#include "code\game\machinery\atmoalter\pump_vr.dm" +#include "code\game\machinery\atmoalter\scrubber.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\camera_vr.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\ai_core.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\arcade_vr.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_vr.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\computer.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\guestpass.dm" +#include "code\game\machinery\computer\id_restorer_vr.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\message.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\prisoner.dm" +#include "code\game\machinery\computer\prisonshuttle.dm" +#include "code\game\machinery\computer\RCON_Console.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\shutoff_monitor.dm" +#include "code\game\machinery\computer\shuttle.dm" +#include "code\game\machinery\computer\skills.dm" +#include "code\game\machinery\computer\specops_shuttle.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\supply.dm" +#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" +#include "code\game\machinery\computer\timeclock_vr.dm" +#include "code\game\machinery\computer\~computer_vr.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_control.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_vr.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\blast_door.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\door_vr.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\firedoor_assembly.dm" +#include "code\game\machinery\doors\firedoor_vr.dm" +#include "code\game\machinery\doors\multi_tile.dm" +#include "code\game\machinery\doors\multi_tile_vr.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\airlock_controllers.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" +#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" +#include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\docking_program.dm" +#include "code\game\machinery\embedded_controller\docking_program_multi.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\embedded_program_base.dm" +#include "code\game\machinery\embedded_controller\mapping_helpers.dm" +#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" +#include "code\game\machinery\event\stage_vr.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\pipe\pipe_recipes.dm" +#include "code\game\machinery\pipe\pipelayer.dm" +#include "code\game\machinery\reagents\pump.dm" +#include "code\game\machinery\telecomms\broadcaster.dm" +#include "code\game\machinery\telecomms\broadcaster_vr.dm" +#include "code\game\machinery\telecomms\logbrowser.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\presets.dm" +#include "code\game\machinery\telecomms\presets_vr.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\telemonitor.dm" +#include "code\game\machinery\telecomms\traffic_control.dm" +#include "code\game\machinery\virtual_reality\ar_console.dm" +#include "code\game\machinery\virtual_reality\vr_console.dm" +#include "code\game\magic\Uristrunes.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mech_prosthetics.dm" +#include "code\game\mecha\mech_sensor.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_appearance.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_helpers.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_vr.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\fighter.dm" +#include "code\game\mecha\combat\gorilla.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\components\_component.dm" +#include "code\game\mecha\components\actuators.dm" +#include "code\game\mecha\components\armor.dm" +#include "code\game\mecha\components\electrical.dm" +#include "code\game\mecha\components\hull.dm" +#include "code\game\mecha\components\lifesupport.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm" +#include "code\game\mecha\equipment\tools\armor_melee.dm" +#include "code\game\mecha\equipment\tools\armor_ranged.dm" +#include "code\game\mecha\equipment\tools\cable_layer.dm" +#include "code\game\mecha\equipment\tools\catapult.dm" +#include "code\game\mecha\equipment\tools\clamp.dm" +#include "code\game\mecha\equipment\tools\cloak.dm" +#include "code\game\mecha\equipment\tools\drill.dm" +#include "code\game\mecha\equipment\tools\energy_relay.dm" +#include "code\game\mecha\equipment\tools\extinguisher.dm" +#include "code\game\mecha\equipment\tools\generator.dm" +#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" +#include "code\game\mecha\equipment\tools\inflatables.dm" +#include "code\game\mecha\equipment\tools\jetpack.dm" +#include "code\game\mecha\equipment\tools\medigun_vr.dm" +#include "code\game\mecha\equipment\tools\orescanner.dm" +#include "code\game\mecha\equipment\tools\passenger.dm" +#include "code\game\mecha\equipment\tools\powertool.dm" +#include "code\game\mecha\equipment\tools\rcd.dm" +#include "code\game\mecha\equipment\tools\repair_droid.dm" +#include "code\game\mecha\equipment\tools\running_board.dm" +#include "code\game\mecha\equipment\tools\shield.dm" +#include "code\game\mecha\equipment\tools\shield_omni.dm" +#include "code\game\mecha\equipment\tools\sleeper.dm" +#include "code\game\mecha\equipment\tools\speedboost.dm" +#include "code\game\mecha\equipment\tools\syringe_gun.dm" +#include "code\game\mecha\equipment\tools\teleporter.dm" +#include "code\game\mecha\equipment\tools\tools.dm" +#include "code\game\mecha\equipment\tools\weldinglaser.dm" +#include "code\game\mecha\equipment\tools\wormhole.dm" +#include "code\game\mecha\equipment\weapons\honk.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm" +#include "code\game\mecha\equipment\weapons\ballistic\ballistic.dm" +#include "code\game\mecha\equipment\weapons\ballistic\mortar.dm" +#include "code\game\mecha\equipment\weapons\ballistic\shotgun.dm" +#include "code\game\mecha\equipment\weapons\defense\shocker.dm" +#include "code\game\mecha\equipment\weapons\energy\energy.dm" +#include "code\game\mecha\equipment\weapons\energy\ion.dm" +#include "code\game\mecha\equipment\weapons\energy\laser.dm" +#include "code\game\mecha\equipment\weapons\energy\phased.dm" +#include "code\game\mecha\equipment\weapons\energy\pulse.dm" +#include "code\game\mecha\equipment\weapons\energy\stun.dm" +#include "code\game\mecha\equipment\weapons\explosive\grenade.dm" +#include "code\game\mecha\equipment\weapons\explosive\missile.dm" +#include "code\game\mecha\equipment\weapons\fire\flamethrower.dm" +#include "code\game\mecha\equipment\weapons\fire\incendiary.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\medical\odysseus_vr.dm" +#include "code\game\mecha\micro\mecha_construction_paths_vr.dm" +#include "code\game\mecha\micro\mecha_parts_vr.dm" +#include "code\game\mecha\micro\mecha_vr.dm" +#include "code\game\mecha\micro\mechfab_designs_vr.dm" +#include "code\game\mecha\micro\micro.dm" +#include "code\game\mecha\micro\micro_equipment.dm" +#include "code\game\mecha\micro\security.dm" +#include "code\game\mecha\micro\utility.dm" +#include "code\game\mecha\space\hoverpod.dm" +#include "code\game\mecha\space\shuttle.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\ripley_vr.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\banners.dm" +#include "code\game\objects\banners_vr.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\explosion.dm" +#include "code\game\objects\explosion_recursive.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\mob_spawner_vr.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\stumble_into_vr.dm" +#include "code\game\objects\weapons.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\confetti_vr.dm" +#include "code\game\objects\effects\effect_system.dm" +#include "code\game\objects\effects\explosion_particles.dm" +#include "code\game\objects\effects\gibs.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\item_pickup_ghost.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\landmarks_vr.dm" +#include "code\game\objects\effects\manifest.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\semirandom_mobs_vr.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\spiders_vr.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\zone_divider.dm" +#include "code\game\objects\effects\alien\aliens.dm" +#include "code\game\objects\effects\chem\chemsmoke.dm" +#include "code\game\objects\effects\chem\coating.dm" +#include "code\game\objects\effects\chem\foam.dm" +#include "code\game\objects\effects\chem\foam_vr.dm" +#include "code\game\objects\effects\chem\water.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\warning_stripes.dm" +#include "code\game\objects\effects\decals\Cleanable\aliens.dm" +#include "code\game\objects\effects\decals\Cleanable\fuel.dm" +#include "code\game\objects\effects\decals\Cleanable\humans.dm" +#include "code\game\objects\effects\decals\Cleanable\misc.dm" +#include "code\game\objects\effects\decals\Cleanable\robots.dm" +#include "code\game\objects\effects\decals\Cleanable\tracks.dm" +#include "code\game\objects\effects\decals\posters\bs12.dm" +#include "code\game\objects\effects\decals\posters\polarisposters.dm" +#include "code\game\objects\effects\decals\posters\polarisposters_vr.dm" +#include "code\game\objects\effects\decals\posters\posters.dm" +#include "code\game\objects\effects\decals\posters\tgposters.dm" +#include "code\game\objects\effects\decals\posters\voreposters_vr.dm" +#include "code\game\objects\effects\map_effects\beam_point.dm" +#include "code\game\objects\effects\map_effects\effect_emitter.dm" +#include "code\game\objects\effects\map_effects\map_effects.dm" +#include "code\game\objects\effects\map_effects\perma_light.dm" +#include "code\game\objects\effects\map_effects\portal.dm" +#include "code\game\objects\effects\map_effects\radiation_emitter.dm" +#include "code\game\objects\effects\map_effects\screen_shaker.dm" +#include "code\game\objects\effects\map_effects\sound_emitter.dm" +#include "code\game\objects\effects\prop\columnblast.dm" +#include "code\game\objects\effects\prop\snake.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\graffiti.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "code\game\objects\items\antag_spawners.dm" +#include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\bells.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\contraband.dm" +#include "code\game\objects\items\contraband_vr.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\falling_object_vr.dm" +#include "code\game\objects\items\glassjar.dm" +#include "code\game\objects\items\gunbox.dm" +#include "code\game\objects\items\gunbox_vr.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\paintkit.dm" +#include "code\game\objects\items\pizza_voucher_vr.dm" +#include "code\game\objects\items\poi_items.dm" +#include "code\game\objects\items\robobag.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\tailoring.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\trash_material.dm" +#include "code\game\objects\items\trash_vr.dm" +#include "code\game\objects\items\uav.dm" +#include "code\game\objects\items\devices\advnifrepair.dm" +#include "code\game\objects\items\devices\ai_detector.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\binoculars.dm" +#include "code\game\objects\items\devices\body_snatcher_vr.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\debugger.dm" +#include "code\game\objects\items\devices\defib.dm" +#include "code\game\objects\items\devices\denecrotizer_vr.dm" +#include "code\game\objects\items\devices\flash.dm" +#include "code\game\objects\items\devices\flash_vr.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\flashlight_vr.dm" +#include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\geiger.dm" +#include "code\game\objects\items\devices\gps.dm" +#include "code\game\objects\items\devices\hacktool.dm" +#include "code\game\objects\items\devices\holowarrant.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\modkit.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\scanners_vr.dm" +#include "code\game\objects\items\devices\spy_bug.dm" +#include "code\game\objects\items\devices\suit_cooling.dm" +#include "code\game\objects\items\devices\t_scanner.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\text_to_speech.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\translator.dm" +#include "code\game\objects\items\devices\translocator_vr.dm" +#include "code\game\objects\items\devices\tvcamera.dm" +#include "code\game\objects\items\devices\uplink.dm" +#include "code\game\objects\items\devices\uplink_random_lists.dm" +#include "code\game\objects\items\devices\whistle.dm" +#include "code\game\objects\items\devices\communicator\communicator.dm" +#include "code\game\objects\items\devices\communicator\helper.dm" +#include "code\game\objects\items\devices\communicator\integrated.dm" +#include "code\game\objects\items\devices\communicator\messaging.dm" +#include "code\game\objects\items\devices\communicator\phone.dm" +#include "code\game\objects\items\devices\communicator\UI_tgui.dm" +#include "code\game\objects\items\devices\radio\beacon.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\headset_vr.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\jammer.dm" +#include "code\game\objects\items\devices\radio\jammer_vr.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\devices\radio\radio_vr.dm" +#include "code\game\objects\items\devices\radio\radiopack.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\robot\robot_upgrades_vr.dm" +#include "code\game\objects\items\stacks\marker_beacons.dm" +#include "code\game\objects\items\stacks\matter_synth.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\medical_vr.dm" +#include "code\game\objects\items\stacks\nanopaste.dm" +#include "code\game\objects\items\stacks\nanopaste_vr.dm" +#include "code\game\objects\items\stacks\sandbags.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\tickets.dm" +#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\toys\balls_vr.dm" +#include "code\game\objects\items\toys\godfigures.dm" +#include "code\game\objects\items\toys\mech_toys.dm" +#include "code\game\objects\items\toys\toys.dm" +#include "code\game\objects\items\toys\toys_vr.dm" +#include "code\game\objects\items\weapons\AI_modules.dm" +#include "code\game\objects\items\weapons\AI_modules_vr.dm" +#include "code\game\objects\items\weapons\augment_items.dm" +#include "code\game\objects\items\weapons\autopsy.dm" +#include "code\game\objects\items\weapons\bones.dm" +#include "code\game\objects\items\weapons\candle.dm" +#include "code\game\objects\items\weapons\canes.dm" +#include "code\game\objects\items\weapons\cards_ids_vr.dm" +#include "code\game\objects\items\weapons\chewables.dm" +#include "code\game\objects\items\weapons\cigs_lighters.dm" +#include "code\game\objects\items\weapons\clown_items.dm" +#include "code\game\objects\items\weapons\cosmetics.dm" +#include "code\game\objects\items\weapons\dna_injector.dm" +#include "code\game\objects\items\weapons\ecigs.dm" +#include "code\game\objects\items\weapons\explosives.dm" +#include "code\game\objects\items\weapons\explosives_vr.dm" +#include "code\game\objects\items\weapons\extinguisher.dm" +#include "code\game\objects\items\weapons\flamethrower.dm" +#include "code\game\objects\items\weapons\gift_wrappaper.dm" +#include "code\game\objects\items\weapons\handcuffs.dm" +#include "code\game\objects\items\weapons\handcuffs_vr.dm" +#include "code\game\objects\items\weapons\improvised_components.dm" +#include "code\game\objects\items\weapons\inducer_vr.dm" +#include "code\game\objects\items\weapons\manuals.dm" +#include "code\game\objects\items\weapons\manuals_vr.dm" +#include "code\game\objects\items\weapons\mop.dm" +#include "code\game\objects\items\weapons\mop_deploy.dm" +#include "code\game\objects\items\weapons\paint.dm" +#include "code\game\objects\items\weapons\paiwire.dm" +#include "code\game\objects\items\weapons\policetape.dm" +#include "code\game\objects\items\weapons\RCD.dm" +#include "code\game\objects\items\weapons\RCD_vr.dm" +#include "code\game\objects\items\weapons\RMS_vr.dm" +#include "code\game\objects\items\weapons\RPD_vr.dm" +#include "code\game\objects\items\weapons\RSF.dm" +#include "code\game\objects\items\weapons\scrolls.dm" +#include "code\game\objects\items\weapons\shields.dm" +#include "code\game\objects\items\weapons\shields_vr.dm" +#include "code\game\objects\items\weapons\stunbaton.dm" +#include "code\game\objects\items\weapons\surgery_tools.dm" +#include "code\game\objects\items\weapons\swords_axes_etc.dm" +#include "code\game\objects\items\weapons\syndie.dm" +#include "code\game\objects\items\weapons\tape.dm" +#include "code\game\objects\items\weapons\teleportation.dm" +#include "code\game\objects\items\weapons\towels.dm" +#include "code\game\objects\items\weapons\traps.dm" +#include "code\game\objects\items\weapons\traps_vr.dm" +#include "code\game\objects\items\weapons\trays.dm" +#include "code\game\objects\items\weapons\weaponry.dm" +#include "code\game\objects\items\weapons\weldbackpack.dm" +#include "code\game\objects\items\weapons\circuitboards\broken.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" +#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" +#include "code\game\objects\items\weapons\circuitboards\frame.dm" +#include "code\game\objects\items\weapons\circuitboards\mecha.dm" +#include "code\game\objects\items\weapons\circuitboards\other.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" +#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\fluidpump.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" +#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" +#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" +#include "code\game\objects\items\weapons\grenades\concussion.dm" +#include "code\game\objects\items\weapons\grenades\emgrenade.dm" +#include "code\game\objects\items\weapons\grenades\explosive.dm" +#include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\grenade.dm" +#include "code\game\objects\items\weapons\grenades\projectile.dm" +#include "code\game\objects\items\weapons\grenades\smokebomb.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" +#include "code\game\objects\items\weapons\grenades\spawnergrenade_vr.dm" +#include "code\game\objects\items\weapons\grenades\supermatter.dm" +#include "code\game\objects\items\weapons\id cards\cards.dm" +#include "code\game\objects\items\weapons\id cards\cards_vr.dm" +#include "code\game\objects\items\weapons\id cards\id_stacks.dm" +#include "code\game\objects\items\weapons\id cards\id_stacks_vr.dm" +#include "code\game\objects\items\weapons\id cards\station_ids.dm" +#include "code\game\objects\items\weapons\id cards\station_ids_vr.dm" +#include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" +#include "code\game\objects\items\weapons\implants\implant.dm" +#include "code\game\objects\items\weapons\implants\implant_vr.dm" +#include "code\game\objects\items\weapons\implants\implantaugment.dm" +#include "code\game\objects\items\weapons\implants\implantcase.dm" +#include "code\game\objects\items\weapons\implants\implantcase_vr.dm" +#include "code\game\objects\items\weapons\implants\implantchair.dm" +#include "code\game\objects\items\weapons\implants\implantcircuits.dm" +#include "code\game\objects\items\weapons\implants\implantdud.dm" +#include "code\game\objects\items\weapons\implants\implanter.dm" +#include "code\game\objects\items\weapons\implants\implanter_vr.dm" +#include "code\game\objects\items\weapons\implants\implantfreedom.dm" +#include "code\game\objects\items\weapons\implants\implantlanguage.dm" +#include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" +#include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" +#include "code\game\objects\items\weapons\implants\implantuplink.dm" +#include "code\game\objects\items\weapons\implants\neuralbasic.dm" +#include "code\game\objects\items\weapons\material\ashtray.dm" +#include "code\game\objects\items\weapons\material\bats.dm" +#include "code\game\objects\items\weapons\material\chainsaw.dm" +#include "code\game\objects\items\weapons\material\foam.dm" +#include "code\game\objects\items\weapons\material\gravemarker.dm" +#include "code\game\objects\items\weapons\material\kitchen.dm" +#include "code\game\objects\items\weapons\material\knives.dm" +#include "code\game\objects\items\weapons\material\knives_vr.dm" +#include "code\game\objects\items\weapons\material\material_armor.dm" +#include "code\game\objects\items\weapons\material\material_weapons.dm" +#include "code\game\objects\items\weapons\material\misc.dm" +#include "code\game\objects\items\weapons\material\shards.dm" +#include "code\game\objects\items\weapons\material\shards_vr.dm" +#include "code\game\objects\items\weapons\material\swords.dm" +#include "code\game\objects\items\weapons\material\thrown.dm" +#include "code\game\objects\items\weapons\material\twohanded.dm" +#include "code\game\objects\items\weapons\material\twohanded_vr.dm" +#include "code\game\objects\items\weapons\material\whetstone.dm" +#include "code\game\objects\items\weapons\melee\deflect.dm" +#include "code\game\objects\items\weapons\melee\energy.dm" +#include "code\game\objects\items\weapons\melee\energy_vr.dm" +#include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\melee\misc_vr.dm" +#include "code\game\objects\items\weapons\storage\backpack.dm" +#include "code\game\objects\items\weapons\storage\backpack_vr.dm" +#include "code\game\objects\items\weapons\storage\bags.dm" +#include "code\game\objects\items\weapons\storage\bags_vr.dm" +#include "code\game\objects\items\weapons\storage\belt.dm" +#include "code\game\objects\items\weapons\storage\belt_vr.dm" +#include "code\game\objects\items\weapons\storage\bible.dm" +#include "code\game\objects\items\weapons\storage\boxes.dm" +#include "code\game\objects\items\weapons\storage\boxes_vr.dm" +#include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\egg_vr.dm" +#include "code\game\objects\items\weapons\storage\fancy.dm" +#include "code\game\objects\items\weapons\storage\firstaid.dm" +#include "code\game\objects\items\weapons\storage\firstaid_vr.dm" +#include "code\game\objects\items\weapons\storage\internal.dm" +#include "code\game\objects\items\weapons\storage\laundry_basket.dm" +#include "code\game\objects\items\weapons\storage\lockbox.dm" +#include "code\game\objects\items\weapons\storage\misc.dm" +#include "code\game\objects\items\weapons\storage\mre.dm" +#include "code\game\objects\items\weapons\storage\pouches.dm" +#include "code\game\objects\items\weapons\storage\quickdraw.dm" +#include "code\game\objects\items\weapons\storage\secure.dm" +#include "code\game\objects\items\weapons\storage\storage.dm" +#include "code\game\objects\items\weapons\storage\toolbox.dm" +#include "code\game\objects\items\weapons\storage\toolbox_vr.dm" +#include "code\game\objects\items\weapons\storage\uplink_kits.dm" +#include "code\game\objects\items\weapons\storage\wallets.dm" +#include "code\game\objects\items\weapons\tanks\jetpack.dm" +#include "code\game\objects\items\weapons\tanks\tank_types.dm" +#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" +#include "code\game\objects\items\weapons\tanks\tanks.dm" +#include "code\game\objects\items\weapons\tools\crowbar.dm" +#include "code\game\objects\items\weapons\tools\crowbar_vr.dm" +#include "code\game\objects\items\weapons\tools\screwdriver.dm" +#include "code\game\objects\items\weapons\tools\weldingtool.dm" +#include "code\game\objects\items\weapons\tools\wirecutters.dm" +#include "code\game\objects\items\weapons\tools\wrench.dm" +#include "code\game\objects\random\_random.dm" +#include "code\game\objects\random\guns_and_ammo.dm" +#include "code\game\objects\random\maintenance.dm" +#include "code\game\objects\random\mapping.dm" +#include "code\game\objects\random\mapping_vr.dm" +#include "code\game\objects\random\mechs.dm" +#include "code\game\objects\random\misc.dm" +#include "code\game\objects\random\misc_vr.dm" +#include "code\game\objects\random\mob.dm" +#include "code\game\objects\random\mob_vr.dm" +#include "code\game\objects\random\spacesuits.dm" +#include "code\game\objects\random\unidentified\medicine.dm" +#include "code\game\objects\structures\artstuff.dm" +#include "code\game\objects\structures\barricades.dm" +#include "code\game\objects\structures\barsign.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\bedsheet_bin_vr.dm" +#include "code\game\objects\structures\bonfire.dm" +#include "code\game\objects\structures\catwalk.dm" +#include "code\game\objects\structures\cliff.dm" +#include "code\game\objects\structures\coathanger.dm" +#include "code\game\objects\structures\curtains.dm" +#include "code\game\objects\structures\dancepole_vr.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\dogbed.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fence.dm" +#include "code\game\objects\structures\fireaxe.dm" +#include "code\game\objects\structures\fitness.dm" +#include "code\game\objects\structures\fitness_vr.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\gravemarker.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\handrail.dm" +#include "code\game\objects\structures\holoplant.dm" +#include "code\game\objects\structures\inflatable.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_foodcart_vr.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\ledges.dm" +#include "code\game\objects\structures\lightpost.dm" +#include "code\game\objects\structures\loot_piles.dm" +#include "code\game\objects\structures\map_blocker_vr.dm" +#include "code\game\objects\structures\medical_stand_vr.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\morgue_vr.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\railing.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\salvageable.dm" +#include "code\game\objects\structures\signs.dm" +#include "code\game\objects\structures\signs_vr.dm" +#include "code\game\objects\structures\simple_doors.dm" +#include "code\game\objects\structures\simple_doors_vr.dm" +#include "code\game\objects\structures\snowman.dm" +#include "code\game\objects\structures\stasis_cage.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\transit_tubes.dm" +#include "code\game\objects\structures\trash_pile_vr.dm" +#include "code\game\objects\structures\under_wardrobe.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\watercloset_vr.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\window_vr.dm" +#include "code\game\objects\structures\alien\alien egg.dm" +#include "code\game\objects\structures\alien\alien.dm" +#include "code\game\objects\structures\crates_lockers\__closets.dm" +#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" +#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\crates_vr.dm" +#include "code\game\objects\structures\crates_lockers\largecrate.dm" +#include "code\game\objects\structures\crates_lockers\largecrate_vr.dm" +#include "code\game\objects\structures\crates_lockers\vehiclecage.dm" +#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" +#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" +#include "code\game\objects\structures\crates_lockers\closets\egg_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" +#include "code\game\objects\structures\crates_lockers\closets\misc_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\statue.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical_vr.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" +#include "code\game\objects\structures\flora\flora.dm" +#include "code\game\objects\structures\flora\flora_vr.dm" +#include "code\game\objects\structures\flora\grass.dm" +#include "code\game\objects\structures\flora\moretrees_vr.dm" +#include "code\game\objects\structures\flora\trees.dm" +#include "code\game\objects\structures\ghost_pods\event_vr.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" +#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" +#include "code\game\objects\structures\ghost_pods\human.dm" +#include "code\game\objects\structures\ghost_pods\mysterious.dm" +#include "code\game\objects\structures\ghost_pods\silicon.dm" +#include "code\game\objects\structures\ghost_pods\silicon_vr.dm" +#include "code\game\objects\structures\props\alien_props.dm" +#include "code\game\objects\structures\props\alien_props_vr.dm" +#include "code\game\objects\structures\props\beam_prism.dm" +#include "code\game\objects\structures\props\blackbox.dm" +#include "code\game\objects\structures\props\fake_ai.dm" +#include "code\game\objects\structures\props\nest.dm" +#include "code\game\objects\structures\props\projectile_lock.dm" +#include "code\game\objects\structures\props\prop.dm" +#include "code\game\objects\structures\props\puzzledoor.dm" +#include "code\game\objects\structures\props\rocks.dm" +#include "code\game\objects\structures\props\swarm.dm" +#include "code\game\objects\structures\props\transmitter.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\chairs_vr.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" +#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" +#include "code\game\turfs\simulated.dm" +#include "code\game\turfs\simulated_vr.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\turf_changing.dm" +#include "code\game\turfs\turf_flick_animations.dm" +#include "code\game\turfs\unsimulated.dm" +#include "code\game\turfs\flooring\flooring.dm" +#include "code\game\turfs\flooring\flooring_decals.dm" +#include "code\game\turfs\flooring\flooring_decals_vr.dm" +#include "code\game\turfs\flooring\flooring_premade.dm" +#include "code\game\turfs\flooring\flooring_vr.dm" +#include "code\game\turfs\flooring\shuttle_vr.dm" +#include "code\game\turfs\initialization\init.dm" +#include "code\game\turfs\initialization\maintenance.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\floor_acts.dm" +#include "code\game\turfs\simulated\floor_attackby.dm" +#include "code\game\turfs\simulated\floor_damage.dm" +#include "code\game\turfs\simulated\floor_icon.dm" +#include "code\game\turfs\simulated\floor_static.dm" +#include "code\game\turfs\simulated\floor_types.dm" +#include "code\game\turfs\simulated\floor_types_eris.dm" +#include "code\game\turfs\simulated\floor_types_vr.dm" +#include "code\game\turfs\simulated\lava.dm" +#include "code\game\turfs\simulated\wall_attacks.dm" +#include "code\game\turfs\simulated\wall_icon.dm" +#include "code\game\turfs\simulated\wall_types.dm" +#include "code\game\turfs\simulated\wall_types_vr.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\water_vr.dm" +#include "code\game\turfs\simulated\dungeon\floor.dm" +#include "code\game\turfs\simulated\dungeon\wall.dm" +#include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" +#include "code\game\turfs\simulated\outdoors\dirt.dm" +#include "code\game\turfs\simulated\outdoors\grass.dm" +#include "code\game\turfs\simulated\outdoors\ironsand_vr.dm" +#include "code\game\turfs\simulated\outdoors\outdoors.dm" +#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" +#include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" +#include "code\game\turfs\simulated\outdoors\sky.dm" +#include "code\game\turfs\simulated\outdoors\snow.dm" +#include "code\game\turfs\snow\snow.dm" +#include "code\game\turfs\space\cracked_asteroid.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\game\turfs\unsimulated\beach.dm" +#include "code\game\turfs\unsimulated\beach_vr.dm" +#include "code\game\turfs\unsimulated\floor.dm" +#include "code\game\turfs\unsimulated\planetary.dm" +#include "code\game\turfs\unsimulated\planetary_vr.dm" +#include "code\game\turfs\unsimulated\shuttle.dm" +#include "code\game\turfs\unsimulated\sky_vr.dm" +#include "code\game\turfs\unsimulated\walls.dm" +#include "code\js\byjax.dm" +#include "code\js\menus.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_attack_log.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_memo.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_secrets.dm" +#include "code\modules\admin\admin_tools.dm" +#include "code\modules\admin\admin_verb_lists_vr.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\admin_vr.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\ckey_vr.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\map_capture.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\news.dm" +#include "code\modules\admin\persistence.dm" +#include "code\modules\admin\player_notes.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\ToRban.dm" +#include "code\modules\admin\callproc\callproc.dm" +#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\permissionverbs\permissionedit.dm" +#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" +#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" +#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" +#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" +#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" +#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" +#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" +#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" +#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" +#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" +#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" +#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" +#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" +#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" +#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" +#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" +#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" +#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\only_one.dm" +#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" +#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm" +#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" +#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" +#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" +#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" +#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" +#include "code\modules\admin\secrets\random_events\gravity_vr.dm" +#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" +#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminhelp_vr.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\antag-ooc.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\buildmode.dm" +#include "code\modules\admin\verbs\change_appearance.dm" +#include "code\modules\admin\verbs\check_customitem_activity.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\custom_event.dm" +#include "code\modules\admin\verbs\dbcon_fix.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\debug_vr.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\fps.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\grief_fixers.dm" +#include "code\modules\admin\verbs\lightning_strike.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\panicbunker.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\randomverbs_vr.dm" +#include "code\modules\admin\verbs\resize.dm" +#include "code\modules\admin\verbs\smite.dm" +#include "code\modules\admin\verbs\smite_vr.dm" +#include "code\modules\admin\verbs\striketeam.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\admin\view_variables\admin_delete.dm" +#include "code\modules\admin\view_variables\debug_variables.dm" +#include "code\modules\admin\view_variables\get_variables.dm" +#include "code\modules\admin\view_variables\helpers.dm" +#include "code\modules\admin\view_variables\mass_edit_variables.dm" +#include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\topic.dm" +#include "code\modules\admin\view_variables\topic_list.dm" +#include "code\modules\admin\view_variables\view_variables.dm" +#include "code\modules\admin\view_variables\view_variables_global.dm" +#include "code\modules\ai\_defines.dm" +#include "code\modules\ai\ai_holder.dm" +#include "code\modules\ai\ai_holder_combat.dm" +#include "code\modules\ai\ai_holder_combat_unseen.dm" +#include "code\modules\ai\ai_holder_communication.dm" +#include "code\modules\ai\ai_holder_cooperation.dm" +#include "code\modules\ai\ai_holder_debug.dm" +#include "code\modules\ai\ai_holder_disabled.dm" +#include "code\modules\ai\ai_holder_fleeing.dm" +#include "code\modules\ai\ai_holder_follow.dm" +#include "code\modules\ai\ai_holder_movement.dm" +#include "code\modules\ai\ai_holder_pathfinding.dm" +#include "code\modules\ai\ai_holder_targeting.dm" +#include "code\modules\ai\ai_holder_targeting_vr.dm" +#include "code\modules\ai\interfaces.dm" +#include "code\modules\ai\say_list.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" +#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" +#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" +#include "code\modules\alarm\alarm.dm" +#include "code\modules\alarm\alarm_handler.dm" +#include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\camera_alarm.dm" +#include "code\modules\alarm\fire_alarm.dm" +#include "code\modules\alarm\motion_alarm.dm" +#include "code\modules\alarm\power_alarm.dm" +#include "code\modules\artifice\cursedform.dm" +#include "code\modules\artifice\deadringer.dm" +#include "code\modules\artifice\telecube.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\asset_cache\asset_cache.dm" +#include "code\modules\asset_cache\asset_cache_client.dm" +#include "code\modules\asset_cache\asset_cache_item.dm" +#include "code\modules\asset_cache\asset_list.dm" +#include "code\modules\asset_cache\asset_list_items.dm" +#include "code\modules\awaymissions\bluespaceartillery.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\gateway_vr.dm" +#include "code\modules\awaymissions\loot.dm" +#include "code\modules\awaymissions\loot_vr.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\trigger.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\blob\blob.dm" +#include "code\modules\blob2\_defines.dm" +#include "code\modules\blob2\core_chunk.dm" +#include "code\modules\blob2\blobs\base_blob.dm" +#include "code\modules\blob2\blobs\core.dm" +#include "code\modules\blob2\blobs\factory.dm" +#include "code\modules\blob2\blobs\node.dm" +#include "code\modules\blob2\blobs\normal.dm" +#include "code\modules\blob2\blobs\resource.dm" +#include "code\modules\blob2\blobs\shield.dm" +#include "code\modules\blob2\overmind\overmind.dm" +#include "code\modules\blob2\overmind\powers.dm" +#include "code\modules\blob2\overmind\types.dm" +#include "code\modules\blob2\overmind\types\blazing_oil.dm" +#include "code\modules\blob2\overmind\types\classic.dm" +#include "code\modules\blob2\overmind\types\cryogenic_goo.dm" +#include "code\modules\blob2\overmind\types\ectoplasmic_horror.dm" +#include "code\modules\blob2\overmind\types\electromagnetic_web.dm" +#include "code\modules\blob2\overmind\types\energized_jelly.dm" +#include "code\modules\blob2\overmind\types\explosive_lattice.dm" +#include "code\modules\blob2\overmind\types\fabrication_swarm.dm" +#include "code\modules\blob2\overmind\types\fulminant_organism.dm" +#include "code\modules\blob2\overmind\types\fungal_bloom.dm" +#include "code\modules\blob2\overmind\types\grey_goo.dm" +#include "code\modules\blob2\overmind\types\pressurized_slime.dm" +#include "code\modules\blob2\overmind\types\radioactive_ooze.dm" +#include "code\modules\blob2\overmind\types\ravenous_macrophage.dm" +#include "code\modules\blob2\overmind\types\reactive_spines.dm" +#include "code\modules\blob2\overmind\types\roiling_mold.dm" +#include "code\modules\blob2\overmind\types\shifting_fragments.dm" +#include "code\modules\blob2\overmind\types\synchronous_mesh.dm" +#include "code\modules\blob2\overmind\types\volatile_alluvium.dm" +#include "code\modules\busy_space_vr\air_traffic.dm" +#include "code\modules\busy_space_vr\loremaster.dm" +#include "code\modules\busy_space_vr\organizations.dm" +#include "code\modules\catalogue\atoms.dm" +#include "code\modules\catalogue\catalogue_data.dm" +#include "code\modules\catalogue\catalogue_data_vr.dm" +#include "code\modules\catalogue\cataloguer.dm" +#include "code\modules\catalogue\cataloguer_visuals.dm" +#include "code\modules\catalogue\cataloguer_vr.dm" +#include "code\modules\client\client defines.dm" +#include "code\modules\client\client procs.dm" +#include "code\modules\client\client procs_vr.dm" +#include "code\modules\client\movement.dm" +#include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_factions.dm" +#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_spawnpoints.dm" +#include "code\modules\client\preferences_toggle_procs.dm" +#include "code\modules\client\preferences_vr.dm" +#include "code\modules\client\spam_prevention.dm" +#include "code\modules\client\ui_style.dm" +#include "code\modules\client\preference_setup\_defines.dm" +#include "code\modules\client\preference_setup\preference_setup.dm" +#include "code\modules\client\preference_setup\preference_setup_vr.dm" +#include "code\modules\client\preference_setup\antagonism\01_basic.dm" +#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" +#include "code\modules\client\preference_setup\general\01_basic.dm" +#include "code\modules\client\preference_setup\general\02_language.dm" +#include "code\modules\client\preference_setup\general\03_body.dm" +#include "code\modules\client\preference_setup\general\04_equipment.dm" +#include "code\modules\client\preference_setup\general\05_background.dm" +#include "code\modules\client\preference_setup\general\06_flavor.dm" +#include "code\modules\client\preference_setup\global\01_ui.dm" +#include "code\modules\client\preference_setup\global\02_settings.dm" +#include "code\modules\client\preference_setup\global\03_pai.dm" +#include "code\modules\client\preference_setup\global\04_ooc.dm" +#include "code\modules\client\preference_setup\global\setting_datums.dm" +#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" +#include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout.dm" +#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" +#include "code\modules\client\preference_setup\loadout\loadout_accessories_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cosmetics_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" +#include "code\modules\client\preference_setup\loadout\loadout_ears.dm" +#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_eyes_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general.dm" +#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" +#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_head.dm" +#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_mask.dm" +#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" +#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" +#include "code\modules\client\preference_setup\loadout\loadout_suit.dm" +#include "code\modules\client\preference_setup\loadout\loadout_suit_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" +#include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_utility.dm" +#include "code\modules\client\preference_setup\loadout\loadout_utility_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_vr.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" +#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" +#include "code\modules\client\preference_setup\occupation\occupation.dm" +#include "code\modules\client\preference_setup\skills\skills.dm" +#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" +#include "code\modules\client\preference_setup\volume_sliders\02_media.dm" +#include "code\modules\client\preference_setup\vore\01_ears.dm" +#include "code\modules\client\preference_setup\vore\02_size.dm" +#include "code\modules\client\preference_setup\vore\03_egg.dm" +#include "code\modules\client\preference_setup\vore\04_resleeving.dm" +#include "code\modules\client\preference_setup\vore\05_persistence.dm" +#include "code\modules\client\preference_setup\vore\06_vantag.dm" +#include "code\modules\client\preference_setup\vore\07_traits.dm" +#include "code\modules\client\preference_setup\vore\08_nif.dm" +#include "code\modules\client\preference_setup\vore\09_misc.dm" +#include "code\modules\client\verbs\advanced_who.dm" +#include "code\modules\client\verbs\character_directory.dm" +#include "code\modules\client\verbs\ignore.dm" +#include "code\modules\client\verbs\ooc.dm" +#include "code\modules\client\verbs\ping.dm" +#include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\who.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\clothing_accessories.dm" +#include "code\modules\clothing\clothing_icons.dm" +#include "code\modules\clothing\clothing_vr.dm" +#include "code\modules\clothing\ears\earrings.dm" +#include "code\modules\clothing\ears\ears.dm" +#include "code\modules\clothing\glasses\glasses.dm" +#include "code\modules\clothing\glasses\glasses_vr.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\hud_vr.dm" +#include "code\modules\clothing\gloves\antagonist.dm" +#include "code\modules\clothing\gloves\arm_guards.dm" +#include "code\modules\clothing\gloves\arm_guards_vr.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\gauntlets.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\miscellaneous_vr.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\flowercrowns.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\helmet_vr.dm" +#include "code\modules\clothing\head\hood.dm" +#include "code\modules\clothing\head\hood_vr.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\jobs_vr.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\misc_vr.dm" +#include "code\modules\clothing\head\pilot_helmet.dm" +#include "code\modules\clothing\head\pilot_helmet_vr.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\solgov.dm" +#include "code\modules\clothing\head\solgov_vr.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\breath_vr.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\gasmask_vr.dm" +#include "code\modules\clothing\masks\hailer.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\shiny_vr.dm" +#include "code\modules\clothing\masks\voice.dm" +#include "code\modules\clothing\rings\material.dm" +#include "code\modules\clothing\rings\rings.dm" +#include "code\modules\clothing\rings\rings_vr.dm" +#include "code\modules\clothing\shoes\boots.dm" +#include "code\modules\clothing\shoes\boots_vr.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\leg_guards.dm" +#include "code\modules\clothing\shoes\leg_guards_vr.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\shoes\miscellaneous_vr.dm" +#include "code\modules\clothing\spacesuits\alien.dm" +#include "code\modules\clothing\spacesuits\breaches.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\spacesuits.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\rig\rig.dm" +#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" +#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" +#include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" +#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" +#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" +#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" +#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" +#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" +#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" +#include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm" +#include "code\modules\clothing\spacesuits\rig\suits\light.dm" +#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" +#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station.dm" +#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" +#include "code\modules\clothing\spacesuits\void\ert_vr.dm" +#include "code\modules\clothing\spacesuits\void\event.dm" +#include "code\modules\clothing\spacesuits\void\event_vr.dm" +#include "code\modules\clothing\spacesuits\void\merc.dm" +#include "code\modules\clothing\spacesuits\void\military_vr.dm" +#include "code\modules\clothing\spacesuits\void\station.dm" +#include "code\modules\clothing\spacesuits\void\station_vr.dm" +#include "code\modules\clothing\spacesuits\void\void.dm" +#include "code\modules\clothing\spacesuits\void\void_vr.dm" +#include "code\modules\clothing\spacesuits\void\wizard.dm" +#include "code\modules\clothing\spacesuits\void\zaddat.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\armor_vr.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\bio_vr.dm" +#include "code\modules\clothing\suits\hooded.dm" +#include "code\modules\clothing\suits\hooded_vr.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\jobs_vr.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\labcoat_vr.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\miscellaneous_vr.dm" +#include "code\modules\clothing\suits\solgov.dm" +#include "code\modules\clothing\suits\solgov_vr.dm" +#include "code\modules\clothing\suits\storage.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\utility_vr.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\suits\aliens\tajara.dm" +#include "code\modules\clothing\suits\aliens\teshari.dm" +#include "code\modules\clothing\suits\aliens\unathi.dm" +#include "code\modules\clothing\suits\aliens\vox.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\imperial_vr.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\miscellaneous_vr.dm" +#include "code\modules\clothing\under\nanotrasen_vr.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shiny_vr.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\solgov.dm" +#include "code\modules\clothing\under\solgov_vr.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\accessories\accessory.dm" +#include "code\modules\clothing\under\accessories\accessory_vr.dm" +#include "code\modules\clothing\under\accessories\armband.dm" +#include "code\modules\clothing\under\accessories\armor.dm" +#include "code\modules\clothing\under\accessories\badges.dm" +#include "code\modules\clothing\under\accessories\clothing.dm" +#include "code\modules\clothing\under\accessories\holster.dm" +#include "code\modules\clothing\under\accessories\holster_vr.dm" +#include "code\modules\clothing\under\accessories\lockets.dm" +#include "code\modules\clothing\under\accessories\permits.dm" +#include "code\modules\clothing\under\accessories\permits_vr.dm" +#include "code\modules\clothing\under\accessories\shiny_vr.dm" +#include "code\modules\clothing\under\accessories\storage.dm" +#include "code\modules\clothing\under\accessories\storage_vr.dm" +#include "code\modules\clothing\under\accessories\torch.dm" +#include "code\modules\clothing\under\accessories\torch_vr.dm" +#include "code\modules\clothing\under\accessories\temperature\poncho.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\xenos\teshari.dm" +#include "code\modules\clothing\under\xenos\vox.dm" +#include "code\modules\compass\_compass.dm" +#include "code\modules\compass\compass_holder.dm" +#include "code\modules\compass\compass_waypoint.dm" +#include "code\modules\compass\~compass.dm" +#include "code\modules\customitems\item_spawning.dm" +#include "code\modules\detectivework\footprints.dm" +#include "code\modules\detectivework\forensics.dm" +#include "code\modules\detectivework\microscope\dnascanner.dm" +#include "code\modules\detectivework\microscope\microscope.dm" +#include "code\modules\detectivework\tools\crimekit.dm" +#include "code\modules\detectivework\tools\evidencebag.dm" +#include "code\modules\detectivework\tools\luminol.dm" +#include "code\modules\detectivework\tools\rag.dm" +#include "code\modules\detectivework\tools\sample_kits.dm" +#include "code\modules\detectivework\tools\scanner.dm" +#include "code\modules\detectivework\tools\storage.dm" +#include "code\modules\detectivework\tools\swabs.dm" +#include "code\modules\detectivework\tools\uvlight.dm" +#include "code\modules\economy\Accounts.dm" +#include "code\modules\economy\Accounts_DB.dm" +#include "code\modules\economy\ATM.dm" +#include "code\modules\economy\cash.dm" +#include "code\modules\economy\cash_register.dm" +#include "code\modules\economy\coins.dm" +#include "code\modules\economy\coins_vr.dm" +#include "code\modules\economy\economy_misc.dm" +#include "code\modules\economy\EFTPOS.dm" +#include "code\modules\economy\Events.dm" +#include "code\modules\economy\Events_Mundane.dm" +#include "code\modules\economy\lorenews.dm" +#include "code\modules\economy\mint.dm" +#include "code\modules\economy\money_bag.dm" +#include "code\modules\economy\price_list.dm" +#include "code\modules\economy\retail_scanner.dm" +#include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\economy\vending.dm" +#include "code\modules\economy\vending_machines.dm" +#include "code\modules\emotes\emote_define.dm" +#include "code\modules\emotes\emote_mob.dm" +#include "code\modules\emotes\definitions\_mob.dm" +#include "code\modules\emotes\definitions\_species.dm" +#include "code\modules\emotes\definitions\audible.dm" +#include "code\modules\emotes\definitions\audible_cough.dm" +#include "code\modules\emotes\definitions\audible_furry_vr.dm" +#include "code\modules\emotes\definitions\audible_scream.dm" +#include "code\modules\emotes\definitions\audible_scream_vr.dm" +#include "code\modules\emotes\definitions\audible_slap.dm" +#include "code\modules\emotes\definitions\audible_snap.dm" +#include "code\modules\emotes\definitions\audible_sneeze.dm" +#include "code\modules\emotes\definitions\audible_whistle.dm" +#include "code\modules\emotes\definitions\exertion.dm" +#include "code\modules\emotes\definitions\helpers_vr.dm" +#include "code\modules\emotes\definitions\human.dm" +#include "code\modules\emotes\definitions\slimes.dm" +#include "code\modules\emotes\definitions\synthetics.dm" +#include "code\modules\emotes\definitions\visible.dm" +#include "code\modules\emotes\definitions\visible_animated.dm" +#include "code\modules\emotes\definitions\visible_vomit.dm" +#include "code\modules\emotes\definitions\visible_vr.dm" +#include "code\modules\entopics_vr\alternate_appearance.dm" +#include "code\modules\entopics_vr\entopics.dm" +#include "code\modules\error_handler\_defines.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\error_handler\~defines.dm" +#include "code\modules\events\apc_damage.dm" +#include "code\modules\events\atmos_leak.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\camera_damage.dm" +#include "code\modules\events\canister_leak.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\comms_blackout.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\drone_pod_vr.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\event.dm" +#include "code\modules\events\event_container.dm" +#include "code\modules\events\event_container_vr.dm" +#include "code\modules\events\event_dynamic.dm" +#include "code\modules\events\event_manager.dm" +#include "code\modules\events\gravity_vr.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\grubinfestation_vr.dm" +#include "code\modules\events\ian_storm_vr.dm" +#include "code\modules\events\infestation.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\maintenance_predator_vr.dm" +#include "code\modules\events\meteor_strike_vr.dm" +#include "code\modules\events\meteors.dm" +#include "code\modules\events\money_hacker.dm" +#include "code\modules\events\money_lotto.dm" +#include "code\modules\events\money_spam.dm" +#include "code\modules\events\morph_spawn_vr.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\random_antagonist.dm" +#include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\shipping_error.dm" +#include "code\modules\events\solar_storm.dm" +#include "code\modules\events\space_ninja.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\spontaneous_appendicitis_vr.dm" +#include "code\modules\events\supply_demand_vr.dm" +#include "code\modules\events\wallrot.dm" +#include "code\modules\examine\examine.dm" +#include "code\modules\examine\stat_icons.dm" +#include "code\modules\examine\descriptions\armor.dm" +#include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\containers.dm" +#include "code\modules\examine\descriptions\devices.dm" +#include "code\modules\examine\descriptions\engineering.dm" +#include "code\modules\examine\descriptions\machines.dm" +#include "code\modules\examine\descriptions\medical.dm" +#include "code\modules\examine\descriptions\mobs.dm" +#include "code\modules\examine\descriptions\paperwork.dm" +#include "code\modules\examine\descriptions\stacks.dm" +#include "code\modules\examine\descriptions\structures.dm" +#include "code\modules\examine\descriptions\telecomms.dm" +#include "code\modules\examine\descriptions\turfs.dm" +#include "code\modules\examine\descriptions\weapons.dm" +#include "code\modules\ext_scripts\irc.dm" +#include "code\modules\ext_scripts\python.dm" +#include "code\modules\fishing\fishing.dm" +#include "code\modules\fishing\fishing_net.dm" +#include "code\modules\fishing\fishing_rod.dm" +#include "code\modules\fishing\fishing_rod_vr.dm" +#include "code\modules\fishing\fishing_vr.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\flufftext\look_up.dm" +#include "code\modules\flufftext\TextFilters.dm" +#include "code\modules\food\food.dm" +#include "code\modules\food\recipe.dm" +#include "code\modules\food\recipe_dump.dm" +#include "code\modules\food\recipes_fryer.dm" +#include "code\modules\food\recipes_fryer_vr.dm" +#include "code\modules\food\recipes_grill.dm" +#include "code\modules\food\recipes_microwave.dm" +#include "code\modules\food\recipes_microwave_vr.dm" +#include "code\modules\food\recipes_oven.dm" +#include "code\modules\food\recipes_oven_vr.dm" +#include "code\modules\food\drinkingglass\drinkingglass.dm" +#include "code\modules\food\drinkingglass\extras.dm" +#include "code\modules\food\drinkingglass\glass_boxes.dm" +#include "code\modules\food\drinkingglass\glass_types.dm" +#include "code\modules\food\drinkingglass\metaglass.dm" +#include "code\modules\food\drinkingglass\metaglass_vr.dm" +#include "code\modules\food\drinkingglass\serving_glasses.dm" +#include "code\modules\food\drinkingglass\shaker.dm" +#include "code\modules\food\drinkingglass\shaker_vr.dm" +#include "code\modules\food\food\cans.dm" +#include "code\modules\food\food\cans_vr.dm" +#include "code\modules\food\food\condiment.dm" +#include "code\modules\food\food\drinks.dm" +#include "code\modules\food\food\drinks_vr.dm" +#include "code\modules\food\food\lunch.dm" +#include "code\modules\food\food\sandwich.dm" +#include "code\modules\food\food\snacks.dm" +#include "code\modules\food\food\snacks_vr.dm" +#include "code\modules\food\food\thecake.dm" +#include "code\modules\food\food\z_custom_food_vr.dm" +#include "code\modules\food\food\drinks\bottle.dm" +#include "code\modules\food\food\drinks\cup.dm" +#include "code\modules\food\food\drinks\drinkingglass.dm" +#include "code\modules\food\food\drinks\jar.dm" +#include "code\modules\food\food\drinks\bottle\robot.dm" +#include "code\modules\food\food\snacks\meat.dm" +#include "code\modules\food\glass\bottle.dm" +#include "code\modules\food\glass\bottle_vr.dm" +#include "code\modules\food\glass\bottle\robot.dm" +#include "code\modules\food\kitchen\gibber.dm" +#include "code\modules\food\kitchen\icecream.dm" +#include "code\modules\food\kitchen\microwave.dm" +#include "code\modules\food\kitchen\cooking_machines\_appliance.dm" +#include "code\modules\food\kitchen\cooking_machines\_cooker.dm" +#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm" +#include "code\modules\food\kitchen\cooking_machines\_mixer.dm" +#include "code\modules\food\kitchen\cooking_machines\candy.dm" +#include "code\modules\food\kitchen\cooking_machines\cereal.dm" +#include "code\modules\food\kitchen\cooking_machines\container.dm" +#include "code\modules\food\kitchen\cooking_machines\fryer.dm" +#include "code\modules\food\kitchen\cooking_machines\grill.dm" +#include "code\modules\food\kitchen\cooking_machines\oven.dm" +#include "code\modules\food\kitchen\smartfridge\drying_rack.dm" +#include "code\modules\food\kitchen\smartfridge\engineering.dm" +#include "code\modules\food\kitchen\smartfridge\hydroponics.dm" +#include "code\modules\food\kitchen\smartfridge\medical.dm" +#include "code\modules\food\kitchen\smartfridge\smartfridge.dm" +#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm" +#include "code\modules\gamemaster\defines.dm" +#include "code\modules\gamemaster\event2\event.dm" +#include "code\modules\gamemaster\event2\meta.dm" +#include "code\modules\gamemaster\event2\events\ghost_pod_spawner.dm" +#include "code\modules\gamemaster\event2\events\mob_spawning.dm" +#include "code\modules\gamemaster\event2\events\cargo\shipping_error.dm" +#include "code\modules\gamemaster\event2\events\command\manifest_malfunction.dm" +#include "code\modules\gamemaster\event2\events\command\money_hacker.dm" +#include "code\modules\gamemaster\event2\events\command\raise_funds.dm" +#include "code\modules\gamemaster\event2\events\engineering\airlock_failure.dm" +#include "code\modules\gamemaster\event2\events\engineering\blob.dm" +#include "code\modules\gamemaster\event2\events\engineering\brand_intelligence.dm" +#include "code\modules\gamemaster\event2\events\engineering\camera_damage.dm" +#include "code\modules\gamemaster\event2\events\engineering\canister_leak.dm" +#include "code\modules\gamemaster\event2\events\engineering\dust.dm" +#include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" +#include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" +#include "code\modules\gamemaster\event2\events\engineering\meteor_defense.dm" +#include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" +#include "code\modules\gamemaster\event2\events\engineering\wallrot.dm" +#include "code\modules\gamemaster\event2\events\engineering\window_break.dm" +#include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" +#include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" +#include "code\modules\gamemaster\event2\events\everyone\gravity_vr.dm" +#include "code\modules\gamemaster\event2\events\everyone\infestation.dm" +#include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" +#include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" +#include "code\modules\gamemaster\event2\events\everyone\random_antag.dm" +#include "code\modules\gamemaster\event2\events\everyone\solar_storm.dm" +#include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" +#include "code\modules\gamemaster\event2\events\legacy\legacy.dm" +#include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" +#include "code\modules\gamemaster\event2\events\medical\virus.dm" +#include "code\modules\gamemaster\event2\events\security\carp_migration.dm" +#include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" +#include "code\modules\gamemaster\event2\events\security\prison_break.dm" +#include "code\modules\gamemaster\event2\events\security\rogue_drones.dm" +#include "code\modules\gamemaster\event2\events\security\security_advisement.dm" +#include "code\modules\gamemaster\event2\events\security\spider_infestation.dm" +#include "code\modules\gamemaster\event2\events\security\stowaway.dm" +#include "code\modules\gamemaster\event2\events\security\surprise_carp.dm" +#include "code\modules\gamemaster\event2\events\security\swarm_boarder.dm" +#include "code\modules\gamemaster\event2\events\synthetic\ion_storm.dm" +#include "code\modules\games\cah.dm" +#include "code\modules\games\cah_black_cards.dm" +#include "code\modules\games\cah_white_cards.dm" +#include "code\modules\games\cardemon.dm" +#include "code\modules\games\cards.dm" +#include "code\modules\games\dice.dm" +#include "code\modules\games\spaceball_cards.dm" +#include "code\modules\games\tarot.dm" +#include "code\modules\genetics\side_effects.dm" +#include "code\modules\ghosttrap\trap.dm" +#include "code\modules\holodeck\HolodeckControl.dm" +#include "code\modules\holodeck\HolodeckObjects.dm" +#include "code\modules\holodeck\HolodeckPrograms.dm" +#include "code\modules\holomap\generate_holomap.dm" +#include "code\modules\holomap\holomap_area.dm" +#include "code\modules\holomap\holomap_datum.dm" +#include "code\modules\holomap\mapper.dm" +#include "code\modules\holomap\station_holomap.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\grown_inedible.dm" +#include "code\modules\hydroponics\grown_predefined.dm" +#include "code\modules\hydroponics\seed.dm" +#include "code\modules\hydroponics\seed_datums_vr.dm" +#include "code\modules\hydroponics\seed_gene_mut.dm" +#include "code\modules\hydroponics\seed_machines.dm" +#include "code\modules\hydroponics\seed_mobs.dm" +#include "code\modules\hydroponics\seed_packets.dm" +#include "code\modules\hydroponics\seed_packets_vr.dm" +#include "code\modules\hydroponics\seed_storage.dm" +#include "code\modules\hydroponics\seed_storage_vr.dm" +#include "code\modules\hydroponics\beekeeping\beehive.dm" +#include "code\modules\hydroponics\seedtypes\amauri.dm" +#include "code\modules\hydroponics\seedtypes\ambrosia.dm" +#include "code\modules\hydroponics\seedtypes\apples.dm" +#include "code\modules\hydroponics\seedtypes\banana.dm" +#include "code\modules\hydroponics\seedtypes\berries.dm" +#include "code\modules\hydroponics\seedtypes\cabbage.dm" +#include "code\modules\hydroponics\seedtypes\carrots.dm" +#include "code\modules\hydroponics\seedtypes\celery.dm" +#include "code\modules\hydroponics\seedtypes\cherries.dm" +#include "code\modules\hydroponics\seedtypes\chili.dm" +#include "code\modules\hydroponics\seedtypes\citrus.dm" +#include "code\modules\hydroponics\seedtypes\cocoa.dm" +#include "code\modules\hydroponics\seedtypes\corn.dm" +#include "code\modules\hydroponics\seedtypes\diona.dm" +#include "code\modules\hydroponics\seedtypes\durian.dm" +#include "code\modules\hydroponics\seedtypes\eggplant.dm" +#include "code\modules\hydroponics\seedtypes\flowers.dm" +#include "code\modules\hydroponics\seedtypes\gelthi.dm" +#include "code\modules\hydroponics\seedtypes\gnomes.dm" +#include "code\modules\hydroponics\seedtypes\grapes.dm" +#include "code\modules\hydroponics\seedtypes\grass.dm" +#include "code\modules\hydroponics\seedtypes\jurlmah.dm" +#include "code\modules\hydroponics\seedtypes\kudzu.dm" +#include "code\modules\hydroponics\seedtypes\lettuce.dm" +#include "code\modules\hydroponics\seedtypes\malanitear.dm" +#include "code\modules\hydroponics\seedtypes\mushrooms.dm" +#include "code\modules\hydroponics\seedtypes\nettles.dm" +#include "code\modules\hydroponics\seedtypes\onion.dm" +#include "code\modules\hydroponics\seedtypes\peanuts.dm" +#include "code\modules\hydroponics\seedtypes\pineapple.dm" +#include "code\modules\hydroponics\seedtypes\potato.dm" +#include "code\modules\hydroponics\seedtypes\pumpkin.dm" +#include "code\modules\hydroponics\seedtypes\rhubarb.dm" +#include "code\modules\hydroponics\seedtypes\rice.dm" +#include "code\modules\hydroponics\seedtypes\selemhand.dm" +#include "code\modules\hydroponics\seedtypes\soybean.dm" +#include "code\modules\hydroponics\seedtypes\sugarcane.dm" +#include "code\modules\hydroponics\seedtypes\surik.dm" +#include "code\modules\hydroponics\seedtypes\telriis.dm" +#include "code\modules\hydroponics\seedtypes\thaadra.dm" +#include "code\modules\hydroponics\seedtypes\tobacco.dm" +#include "code\modules\hydroponics\seedtypes\tomatoes.dm" +#include "code\modules\hydroponics\seedtypes\vale.dm" +#include "code\modules\hydroponics\seedtypes\vanilla.dm" +#include "code\modules\hydroponics\seedtypes\wabback.dm" +#include "code\modules\hydroponics\seedtypes\watermelon.dm" +#include "code\modules\hydroponics\seedtypes\weeds.dm" +#include "code\modules\hydroponics\seedtypes\wheat.dm" +#include "code\modules\hydroponics\seedtypes\whitebeets.dm" +#include "code\modules\hydroponics\seedtypes\wurmwoad.dm" +#include "code\modules\hydroponics\seedtypes\xeno.dm" +#include "code\modules\hydroponics\spreading\spreading.dm" +#include "code\modules\hydroponics\spreading\spreading_growth.dm" +#include "code\modules\hydroponics\spreading\spreading_response.dm" +#include "code\modules\hydroponics\trays\tray.dm" +#include "code\modules\hydroponics\trays\tray_process.dm" +#include "code\modules\hydroponics\trays\tray_reagents.dm" +#include "code\modules\hydroponics\trays\tray_soil.dm" +#include "code\modules\hydroponics\trays\tray_tools.dm" +#include "code\modules\hydroponics\trays\tray_update_icons.dm" +#include "code\modules\identification\identification.dm" +#include "code\modules\identification\item_procs.dm" +#include "code\modules\instruments\items.dm" +#include "code\modules\instruments\stationary.dm" +#include "code\modules\instruments\instrument_data\_instrument_data.dm" +#include "code\modules\instruments\instrument_data\_instrument_key.dm" +#include "code\modules\instruments\instrument_data\brass.dm" +#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" +#include "code\modules\instruments\instrument_data\fun.dm" +#include "code\modules\instruments\instrument_data\guitar.dm" +#include "code\modules\instruments\instrument_data\hardcoded.dm" +#include "code\modules\instruments\instrument_data\organ.dm" +#include "code\modules\instruments\instrument_data\piano.dm" +#include "code\modules\instruments\instrument_data\synth_tones.dm" +#include "code\modules\instruments\songs\_song.dm" +#include "code\modules\instruments\songs\editor.dm" +#include "code\modules\instruments\songs\play_legacy.dm" +#include "code\modules\instruments\songs\play_synthesized.dm" +#include "code\modules\integrated_electronics\_defines.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\detailer.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\printer.dm" +#include "code\modules\integrated_electronics\core\tools.dm" +#include "code\modules\integrated_electronics\core\assemblies\clothing.dm" +#include "code\modules\integrated_electronics\core\assemblies\device.dm" +#include "code\modules\integrated_electronics\core\assemblies\generic.dm" +#include "code\modules\integrated_electronics\core\assemblies\implant.dm" +#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\built_in.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input.dm" +#include "code\modules\integrated_electronics\subtypes\lists.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\output.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\~defines\~defines.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_movekeys.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\lib_readme.dm" +#include "code\modules\library\hardcode_library\_library.dm" +#include "code\modules\library\hardcode_library\fiction\APsychonaut.dm" +#include "code\modules\library\hardcode_library\fiction\battlefieldcommander.dm" +#include "code\modules\library\hardcode_library\fiction\PortedBooks.dm" +#include "code\modules\library\hardcode_library\fiction\schnayy.dm" +#include "code\modules\library\hardcode_library\non-fiction\PortedBooks.dm" +#include "code\modules\library\hardcode_library\reference\PortedBooks.dm" +#include "code\modules\library\hardcode_library\reference\Schnayy.dm" +#include "code\modules\library\hardcode_library\religious\PortedBooks.dm" +#include "code\modules\lighting\emissive_blocker.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_fake_sun_vr.dm" +#include "code\modules\lighting\lighting_overlay.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\looking_glass\lg_area.dm" +#include "code\modules\looking_glass\lg_console.dm" +#include "code\modules\looking_glass\lg_imageholder.dm" +#include "code\modules\looking_glass\lg_turfs.dm" +#include "code\modules\lore_codex\codex.dm" +#include "code\modules\lore_codex\codex_tree.dm" +#include "code\modules\lore_codex\pages.dm" +#include "code\modules\lore_codex\lore_data_vr\important_locations.dm" +#include "code\modules\lore_codex\lore_data_vr\main.dm" +#include "code\modules\lore_codex\lore_data_vr\orgs.dm" +#include "code\modules\lore_codex\lore_data_vr\political_parties.dm" +#include "code\modules\lore_codex\lore_data_vr\species.dm" +#include "code\modules\lore_codex\news_data\main.dm" +#include "code\modules\lore_codex\robutt_data\bybrand.dm" +#include "code\modules\lore_codex\robutt_data\main_robutts.dm" +#include "code\modules\lore_codex\robutt_data\more.dm" +#include "code\modules\makeup\nailpolish.dm" +#include "code\modules\maps\tg\dmm_suite.dm" +#include "code\modules\maps\tg\map_template.dm" +#include "code\modules\maps\tg\map_template_vr.dm" +#include "code\modules\maps\tg\reader.dm" +#include "code\modules\materials\fifty_spawner.dm" +#include "code\modules\materials\fifty_spawner_mats.dm" +#include "code\modules\materials\fifty_spawner_mats_vr.dm" +#include "code\modules\materials\material_synth.dm" +#include "code\modules\materials\materials\_materials.dm" +#include "code\modules\materials\materials\_materials_vr.dm" +#include "code\modules\materials\materials\alien_alloy.dm" +#include "code\modules\materials\materials\cult.dm" +#include "code\modules\materials\materials\gems.dm" +#include "code\modules\materials\materials\glass.dm" +#include "code\modules\materials\materials\glass_vr.dm" +#include "code\modules\materials\materials\holographic.dm" +#include "code\modules\materials\materials\other_vr.dm" +#include "code\modules\materials\materials\plastic.dm" +#include "code\modules\materials\materials\snow.dm" +#include "code\modules\materials\materials\stone.dm" +#include "code\modules\materials\materials\supermatter.dm" +#include "code\modules\materials\materials\metals\hull.dm" +#include "code\modules\materials\materials\metals\hull_vr.dm" +#include "code\modules\materials\materials\metals\metals.dm" +#include "code\modules\materials\materials\metals\metals_vr.dm" +#include "code\modules\materials\materials\metals\plasteel.dm" +#include "code\modules\materials\materials\metals\plasteel_vr.dm" +#include "code\modules\materials\materials\metals\steel.dm" +#include "code\modules\materials\materials\metals\steel_vr.dm" +#include "code\modules\materials\materials\organic\animal_products.dm" +#include "code\modules\materials\materials\organic\cloth.dm" +#include "code\modules\materials\materials\organic\leather.dm" +#include "code\modules\materials\materials\organic\resin.dm" +#include "code\modules\materials\materials\organic\wood.dm" +#include "code\modules\materials\sheets\_sheets.dm" +#include "code\modules\materials\sheets\gems.dm" +#include "code\modules\materials\sheets\glass.dm" +#include "code\modules\materials\sheets\glass_vr.dm" +#include "code\modules\materials\sheets\plastic.dm" +#include "code\modules\materials\sheets\snow.dm" +#include "code\modules\materials\sheets\stone.dm" +#include "code\modules\materials\sheets\supermatter.dm" +#include "code\modules\materials\sheets\metals\hull.dm" +#include "code\modules\materials\sheets\metals\hull_vr.dm" +#include "code\modules\materials\sheets\metals\metal.dm" +#include "code\modules\materials\sheets\metals\metal_vr.dm" +#include "code\modules\materials\sheets\metals\rods.dm" +#include "code\modules\materials\sheets\organic\animal_products.dm" +#include "code\modules\materials\sheets\organic\resin.dm" +#include "code\modules\materials\sheets\organic\textiles.dm" +#include "code\modules\materials\sheets\organic\wood.dm" +#include "code\modules\materials\sheets\organic\tanning\hide.dm" +#include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" +#include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" +#include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" +#include "code\modules\media\juke_remote.dm" +#include "code\modules\media\media_machinery.dm" +#include "code\modules\media\media_player_html5.dm" +#include "code\modules\media\media_player_vlc.dm" +#include "code\modules\media\media_player_wmp.dm" +#include "code\modules\media\media_tracks.dm" +#include "code\modules\media\mediamanager.dm" +#include "code\modules\media\walkpod.dm" +#include "code\modules\metric\activity.dm" +#include "code\modules\metric\count.dm" +#include "code\modules\metric\department.dm" +#include "code\modules\metric\metric.dm" +#include "code\modules\mining\abandonedcrates.dm" +#include "code\modules\mining\abandonedcrates_vr.dm" +#include "code\modules\mining\alloys.dm" +#include "code\modules\mining\alloys_vr.dm" +#include "code\modules\mining\fulton.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\mine_items_vr.dm" +#include "code\modules\mining\mine_outcrops.dm" +#include "code\modules\mining\mine_turfs.dm" +#include "code\modules\mining\mine_turfs_vr.dm" +#include "code\modules\mining\mineral_effect.dm" +#include "code\modules\mining\ore.dm" +#include "code\modules\mining\ore_box.dm" +#include "code\modules\mining\ore_datum.dm" +#include "code\modules\mining\resonator_vr.dm" +#include "code\modules\mining\shelter_atoms_vr.dm" +#include "code\modules\mining\shelters_vr.dm" +#include "code\modules\mining\drilling\drill.dm" +#include "code\modules\mining\drilling\scanner.dm" +#include "code\modules\mining\machinery\machine_input_output_plates.dm" +#include "code\modules\mining\machinery\machine_processing.dm" +#include "code\modules\mining\machinery\machine_stacking.dm" +#include "code\modules\mining\machinery\machine_unloading.dm" +#include "code\modules\mining\ore_redemption_machine\construction.dm" +#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm" +#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm" +#include "code\modules\mining\ore_redemption_machine\survey_vendor.dm" +#include "code\modules\mob\animations.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\gender.dm" +#include "code\modules\mob\gender_vr.dm" +#include "code\modules\mob\hear_say.dm" +#include "code\modules\mob\holder.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\login_vr.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_defines_vr.dm" +#include "code\modules\mob\mob_grab.dm" +#include "code\modules\mob\mob_grab_specials.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_helpers_vr.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_planes.dm" +#include "code\modules\mob\mob_planes_vr.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\say_vr.dm" +#include "code\modules\mob\skillset.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\_modifiers\aura.dm" +#include "code\modules\mob\_modifiers\changeling.dm" +#include "code\modules\mob\_modifiers\cloning.dm" +#include "code\modules\mob\_modifiers\feysight.dm" +#include "code\modules\mob\_modifiers\fire.dm" +#include "code\modules\mob\_modifiers\medical.dm" +#include "code\modules\mob\_modifiers\modifiers.dm" +#include "code\modules\mob\_modifiers\modifiers_misc.dm" +#include "code\modules\mob\_modifiers\traits.dm" +#include "code\modules\mob\_modifiers\traits_phobias.dm" +#include "code\modules\mob\_modifiers\unholy.dm" +#include "code\modules\mob\dead\corpse.dm" +#include "code\modules\mob\dead\corpse_vr.dm" +#include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\free_vr.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\observer_vr.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\freelook\chunk.dm" +#include "code\modules\mob\freelook\eye.dm" +#include "code\modules\mob\freelook\life.dm" +#include "code\modules\mob\freelook\update_triggers.dm" +#include "code\modules\mob\freelook\visualnet.dm" +#include "code\modules\mob\freelook\ai\cameranet.dm" +#include "code\modules\mob\freelook\ai\chunk.dm" +#include "code\modules\mob\freelook\ai\eye.dm" +#include "code\modules\mob\freelook\ai\update_triggers.dm" +#include "code\modules\mob\freelook\mask\chunk.dm" +#include "code\modules\mob\freelook\mask\cultnet.dm" +#include "code\modules\mob\freelook\mask\eye.dm" +#include "code\modules\mob\freelook\mask\update_triggers.dm" +#include "code\modules\mob\language\generic.dm" +#include "code\modules\mob\language\language.dm" +#include "code\modules\mob\language\monkey.dm" +#include "code\modules\mob\language\outsider.dm" +#include "code\modules\mob\language\station.dm" +#include "code\modules\mob\language\station_vr.dm" +#include "code\modules\mob\language\synthetic.dm" +#include "code\modules\mob\living\autohiss.dm" +#include "code\modules\mob\living\butchering.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\default_language.dm" +#include "code\modules\mob\living\inventory.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_defines_vr.dm" +#include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\living_powers.dm" +#include "code\modules\mob\living\living_vr.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\organs.dm" +#include "code\modules\mob\living\riding.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\status_indicators.dm" +#include "code\modules\mob\living\bot\bot.dm" +#include "code\modules\mob\living\bot\bot_vr.dm" +#include "code\modules\mob\living\bot\cleanbot.dm" +#include "code\modules\mob\living\bot\ed209bot.dm" +#include "code\modules\mob\living\bot\edCLNbot.dm" +#include "code\modules\mob\living\bot\farmbot.dm" +#include "code\modules\mob\living\bot\floorbot.dm" +#include "code\modules\mob\living\bot\medbot.dm" +#include "code\modules\mob\living\bot\mulebot.dm" +#include "code\modules\mob\living\bot\mulebot_vr.dm" +#include "code\modules\mob\living\bot\secbot.dm" +#include "code\modules\mob\living\bot\SLed209bot.dm" +#include "code\modules\mob\living\carbon\breathe.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_powers.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\lick_wounds.dm" +#include "code\modules\mob\living\carbon\resist.dm" +#include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\taste.dm" +#include "code\modules\mob\living\carbon\viruses.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" +#include "code\modules\mob\living\carbon\alien\alien_damage.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\progression.dm" +#include "code\modules\mob\living\carbon\alien\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" +#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" +#include "code\modules\mob\living\carbon\alien\diona\life.dm" +#include "code\modules\mob\living\carbon\alien\diona\progression.dm" +#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" +#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\progression.dm" +#include "code\modules\mob\living\carbon\brain\brain.dm" +#include "code\modules\mob\living\carbon\brain\death.dm" +#include "code\modules\mob\living\carbon\brain\emote.dm" +#include "code\modules\mob\living\carbon\brain\life.dm" +#include "code\modules\mob\living\carbon\brain\login.dm" +#include "code\modules\mob\living\carbon\brain\MMI.dm" +#include "code\modules\mob\living\carbon\brain\robot.dm" +#include "code\modules\mob\living\carbon\brain\say.dm" +#include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\death_vr.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\emote_vr.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\examine_vr.dm" +#include "code\modules\mob\living\carbon\human\gradient.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_attackhand.dm" +#include "code\modules\mob\living\carbon\human\human_damage.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_defines_vr.dm" +#include "code\modules\mob\living\carbon\human\human_helpers.dm" +#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" +#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\human_organs.dm" +#include "code\modules\mob\living\carbon\human\human_powers.dm" +#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" +#include "code\modules\mob\living\carbon\human\human_resist.dm" +#include "code\modules\mob\living\carbon\human\human_species.dm" +#include "code\modules\mob\living\carbon\human\human_species_vr.dm" +#include "code\modules\mob\living\carbon\human\human_vr.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\life_vr.dm" +#include "code\modules\mob\living\carbon\human\login.dm" +#include "code\modules\mob\living\carbon\human\logout.dm" +#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" +#include "code\modules\mob\living\carbon\human\npcs.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\stripping.dm" +#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm" +#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm" +#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" +#include "code\modules\mob\living\carbon\human\species\species.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack.dm" +#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_getters.dm" +#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_helpers.dm" +#include "code\modules\mob\living\carbon\human\species\species_hud.dm" +#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" +#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" +#include "code\modules\mob\living\carbon\human\species\species_vr.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\event.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" +#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" +#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\golem.dm" +#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" +#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" +#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" +#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" +#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" +#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" +#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\emote.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_vr.dm" +#include "code\modules\mob\living\silicon\subystems.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_movement.dm" +#include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" +#include "code\modules\mob\living\silicon\ai\ai_vr.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\icons.dm" +#include "code\modules\mob\living\silicon\ai\latejoin.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\malf.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\decoy\death.dm" +#include "code\modules\mob\living\silicon\decoy\decoy.dm" +#include "code\modules\mob\living\silicon\decoy\life.dm" +#include "code\modules\mob\living\silicon\pai\admin.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\examine.dm" +#include "code\modules\mob\living\silicon\pai\life.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\pai_vr.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\recruit.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\software_modules.dm" +#include "code\modules\mob\living\silicon\robot\analyzer.dm" +#include "code\modules\mob\living\silicon\robot\component.dm" +#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\examine_vr.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\photos.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm" +#include "code\modules\mob\living\silicon\robot\robot_damage.dm" +#include "code\modules\mob\living\silicon\robot\robot_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" +#include "code\modules\mob\living\silicon\robot\robot_vr.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" +#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" +#include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\event_vr.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" +#include "code\modules\mob\living\simple_mob\appearance.dm" +#include "code\modules\mob\living\simple_mob\butchering.dm" +#include "code\modules\mob\living\simple_mob\combat.dm" +#include "code\modules\mob\living\simple_mob\defense.dm" +#include "code\modules\mob\living\simple_mob\donteatpets_vr.dm" +#include "code\modules\mob\living\simple_mob\hands.dm" +#include "code\modules\mob\living\simple_mob\harvesting.dm" +#include "code\modules\mob\living\simple_mob\life.dm" +#include "code\modules\mob\living\simple_mob\on_click.dm" +#include "code\modules\mob\living\simple_mob\simple_hud.dm" +#include "code\modules\mob\living\simple_mob\simple_mob.dm" +#include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" +#include "code\modules\mob\living\simple_mob\taming.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_powers.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\chicken.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\giant_spider_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\pepper.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\phorogenic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\thermic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\jerboa_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\fox_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\fluffy_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" +#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" +#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" +#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\wahlem_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\hoverpod.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\marauder.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\mecha.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\odysseus.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\phazon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\ripley.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\monitor_ward.dm" +#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\ward.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" +#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" +#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" +#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\slime_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm" +#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\weretiger.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\xeno_vore.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bus.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\busclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\c_shift.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Clowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\hespawner.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" +#include "code\modules\mob\living\voice\voice.dm" +#include "code\modules\mob\living\voice\voice_vr.dm" +#include "code\modules\mob\new_player\login.dm" +#include "code\modules\mob\new_player\login_vr.dm" +#include "code\modules\mob\new_player\logout.dm" +#include "code\modules\mob\new_player\new_player.dm" +#include "code\modules\mob\new_player\new_player_vr.dm" +#include "code\modules\mob\new_player\news.dm" +#include "code\modules\mob\new_player\poll.dm" +#include "code\modules\mob\new_player\preferences_setup.dm" +#include "code\modules\mob\new_player\preferences_setup_vr.dm" +#include "code\modules\mob\new_player\skill.dm" +#include "code\modules\mob\new_player\sprite_accessories.dm" +#include "code\modules\mob\new_player\sprite_accessories_ear.dm" +#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_extra.dm" +#include "code\modules\mob\new_player\sprite_accessories_extra_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_tail.dm" +#include "code\modules\mob\new_player\sprite_accessories_tail_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_taur.dm" +#include "code\modules\mob\new_player\sprite_accessories_taur_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_vr.dm" +#include "code\modules\mob\new_player\sprite_accessories_wing.dm" +#include "code\modules\mob\new_player\sprite_accessories_wing_vr.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\modular_computer\core.dm" +#include "code\modules\modular_computers\computers\modular_computer\damage.dm" +#include "code\modules\modular_computers\computers\modular_computer\hardware.dm" +#include "code\modules\modular_computers\computers\modular_computer\interaction.dm" +#include "code\modules\modular_computers\computers\modular_computer\power.dm" +#include "code\modules\modular_computers\computers\modular_computer\ui.dm" +#include "code\modules\modular_computers\computers\modular_computer\variables.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_console.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_console.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_laptop_vr.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_tablet_vr.dm" +#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\news_article.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\file_system\programs\command\card.dm" +#include "code\modules\modular_computers\file_system\programs\command\comm.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\alarm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\atmos_control.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\shutoff_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\generic\camera.dm" +#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\game.dm" +#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" +#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" +#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" +#include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" +#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm" +#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\nano_printer.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" +#include "code\modules\modular_computers\hardware\processor_unit.dm" +#include "code\modules\modular_computers\hardware\tesla_link.dm" +#include "code\modules\modular_computers\NTNet\NTNet.dm" +#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" +#include "code\modules\modular_computers\NTNet\emails\email_account.dm" +#include "code\modules\modular_computers\NTNet\emails\email_message.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\multi-tile\multi-tile.dm" +#include "code\modules\multiz\_stubs.dm" +#include "code\modules\multiz\admin_upload.dm" +#include "code\modules\multiz\basic.dm" +#include "code\modules\multiz\hoist.dm" +#include "code\modules\multiz\ladder_assembly_vr.dm" +#include "code\modules\multiz\ladders.dm" +#include "code\modules\multiz\ladders_vr.dm" +#include "code\modules\multiz\movement.dm" +#include "code\modules\multiz\movement_vr.dm" +#include "code\modules\multiz\pipes.dm" +#include "code\modules\multiz\stairs.dm" +#include "code\modules\multiz\turf.dm" +#include "code\modules\news\news_init.dm" +#include "code\modules\news\newspaper.dm" +#include "code\modules\news\newspaper_layout.dm" +#include "code\modules\nifsoft\nif.dm" +#include "code\modules\nifsoft\nif_softshop.dm" +#include "code\modules\nifsoft\nif_tgui.dm" +#include "code\modules\nifsoft\nifsoft.dm" +#include "code\modules\nifsoft\software\01_vision.dm" +#include "code\modules\nifsoft\software\05_health.dm" +#include "code\modules\nifsoft\software\06_screens.dm" +#include "code\modules\nifsoft\software\10_combat.dm" +#include "code\modules\nifsoft\software\13_soulcatcher.dm" +#include "code\modules\nifsoft\software\14_commlink.dm" +#include "code\modules\nifsoft\software\15_misc.dm" +#include "code\modules\organs\blood.dm" +#include "code\modules\organs\misc.dm" +#include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_external.dm" +#include "code\modules\organs\organ_external_vr.dm" +#include "code\modules\organs\organ_icon.dm" +#include "code\modules\organs\organ_stump.dm" +#include "code\modules\organs\pain.dm" +#include "code\modules\organs\robolimbs.dm" +#include "code\modules\organs\robolimbs_custom.dm" +#include "code\modules\organs\robolimbs_vr.dm" +#include "code\modules\organs\wound.dm" +#include "code\modules\organs\internal\_organ_internal.dm" +#include "code\modules\organs\internal\appendix.dm" +#include "code\modules\organs\internal\augment.dm" +#include "code\modules\organs\internal\brain.dm" +#include "code\modules\organs\internal\eyes.dm" +#include "code\modules\organs\internal\heart.dm" +#include "code\modules\organs\internal\intestine.dm" +#include "code\modules\organs\internal\kidneys.dm" +#include "code\modules\organs\internal\liver.dm" +#include "code\modules\organs\internal\lungs.dm" +#include "code\modules\organs\internal\spleen.dm" +#include "code\modules\organs\internal\stomach.dm" +#include "code\modules\organs\internal\voicebox.dm" +#include "code\modules\organs\internal\augment\armmounted.dm" +#include "code\modules\organs\internal\augment\bio.dm" +#include "code\modules\organs\internal\robotic\diagnostic.dm" +#include "code\modules\organs\internal\robotic\heatsink.dm" +#include "code\modules\organs\internal\robotic\robotic.dm" +#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\subtypes\indestructible.dm" +#include "code\modules\organs\subtypes\machine.dm" +#include "code\modules\organs\subtypes\nano.dm" +#include "code\modules\organs\subtypes\replicant.dm" +#include "code\modules\organs\subtypes\shadekin.dm" +#include "code\modules\organs\subtypes\shadekin_vr.dm" +#include "code\modules\organs\subtypes\slime.dm" +#include "code\modules\organs\subtypes\slime_vr.dm" +#include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\standard_vr.dm" +#include "code\modules\organs\subtypes\teshari.dm" +#include "code\modules\organs\subtypes\unathi.dm" +#include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\unseverable.dm" +#include "code\modules\organs\subtypes\vox.dm" +#include "code\modules\organs\subtypes\vox_vr.dm" +#include "code\modules\organs\subtypes\xenos.dm" +#include "code\modules\overmap\abductor_vr.dm" +#include "code\modules\overmap\bluespace_rift_vr.dm" +#include "code\modules\overmap\champagne.dm" +#include "code\modules\overmap\helpers.dm" +#include "code\modules\overmap\overmap_object.dm" +#include "code\modules\overmap\overmap_planet.dm" +#include "code\modules\overmap\overmap_shuttle.dm" +#include "code\modules\overmap\sectors.dm" +#include "code\modules\overmap\spacetravel.dm" +#include "code\modules\overmap\turfs.dm" +#include "code\modules\overmap\disperser\disperser.dm" +#include "code\modules\overmap\disperser\disperser_charge.dm" +#include "code\modules\overmap\disperser\disperser_circuit.dm" +#include "code\modules\overmap\disperser\disperser_console.dm" +#include "code\modules\overmap\disperser\disperser_fire.dm" +#include "code\modules\overmap\events\event_handler.dm" +#include "code\modules\overmap\events\generation.dm" +#include "code\modules\overmap\events\overmap_event.dm" +#include "code\modules\overmap\ships\landable.dm" +#include "code\modules\overmap\ships\panicbutton.dm" +#include "code\modules\overmap\ships\ship.dm" +#include "code\modules\overmap\ships\computers\computer_shims.dm" +#include "code\modules\overmap\ships\computers\engine_control.dm" +#include "code\modules\overmap\ships\computers\helm.dm" +#include "code\modules\overmap\ships\computers\sensors.dm" +#include "code\modules\overmap\ships\computers\ship.dm" +#include "code\modules\overmap\ships\computers\ship_vr.dm" +#include "code\modules\overmap\ships\computers\shuttle.dm" +#include "code\modules\overmap\ships\engines\engine.dm" +#include "code\modules\overmap\ships\engines\gas_thruster.dm" +#include "code\modules\overmap\ships\engines\gas_thruster_vr.dm" +#include "code\modules\overmap\ships\engines\ion_thruster.dm" +#include "code\modules\paperwork\adminpaper.dm" +#include "code\modules\paperwork\carbonpaper.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\faxmachine.dm" +#include "code\modules\paperwork\faxmachine_vr.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_bundle.dm" +#include "code\modules\paperwork\paper_sticky.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\papershredder.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\photography.dm" +#include "code\modules\paperwork\silicon_photography.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\pda\ai.dm" +#include "code\modules\pda\app.dm" +#include "code\modules\pda\cart.dm" +#include "code\modules\pda\cart_apps.dm" +#include "code\modules\pda\cart_vr.dm" +#include "code\modules\pda\core_apps.dm" +#include "code\modules\pda\messenger.dm" +#include "code\modules\pda\messenger_plugins.dm" +#include "code\modules\pda\pda.dm" +#include "code\modules\pda\pda_subtypes.dm" +#include "code\modules\pda\pda_tgui.dm" +#include "code\modules\pda\pda_vr.dm" +#include "code\modules\pda\radio.dm" +#include "code\modules\pda\utilities.dm" +#include "code\modules\persistence\filth.dm" +#include "code\modules\persistence\graffiti.dm" +#include "code\modules\persistence\noticeboard.dm" +#include "code\modules\persistence\paintings.dm" +#include "code\modules\persistence\serialize.dm" +#include "code\modules\persistence\datum\persistence_datum.dm" +#include "code\modules\persistence\effects\filth.dm" +#include "code\modules\persistence\effects\graffiti.dm" +#include "code\modules\persistence\effects\paper.dm" +#include "code\modules\persistence\effects\paper_sticky.dm" +#include "code\modules\persistence\effects\trash.dm" +#include "code\modules\persistence\storage\smartfridge.dm" +#include "code\modules\persistence\storage\storage.dm" +#include "code\modules\planet\planet.dm" +#include "code\modules\planet\sun.dm" +#include "code\modules\planet\time.dm" +#include "code\modules\planet\virgo3b_vr.dm" +#include "code\modules\planet\virgo4_vr.dm" +#include "code\modules\planet\weather.dm" +#include "code\modules\planet\weather_vr.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\apc_vr.dm" +#include "code\modules\power\batteryrack.dm" +#include "code\modules\power\batteryrack_vr.dm" +#include "code\modules\power\breaker_box.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cable_ender.dm" +#include "code\modules\power\cable_heavyduty.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\debug_items.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\gravitygenerator_vr.dm" +#include "code\modules\power\grid_checker.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\lighting_vr.dm" +#include "code\modules\power\lightswitch_vr.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\port_gen_vr.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\smes_construction.dm" +#include "code\modules\power\smes_vr.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\antimatter\containment_jar.dm" +#include "code\modules\power\antimatter\control.dm" +#include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\cells\device_cells.dm" +#include "code\modules\power\cells\device_cells_vr.dm" +#include "code\modules\power\cells\esoteric_cells.dm" +#include "code\modules\power\cells\power_cells.dm" +#include "code\modules\power\fusion\_setup.dm" +#include "code\modules\power\fusion\fusion_circuits.dm" +#include "code\modules\power\fusion\fusion_particle_catcher.dm" +#include "code\modules\power\fusion\fusion_reactions.dm" +#include "code\modules\power\fusion\magpower.dm" +#include "code\modules\power\fusion\core\_core.dm" +#include "code\modules\power\fusion\core\core_control.dm" +#include "code\modules\power\fusion\core\core_field.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_assembly.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_compressor.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_control.dm" +#include "code\modules\power\fusion\fuel_assembly\fuel_injector.dm" +#include "code\modules\power\fusion\gyrotron\gyrotron.dm" +#include "code\modules\power\fusion\gyrotron\gyrotron_control.dm" +#include "code\modules\power\sensors\powernet_sensor.dm" +#include "code\modules\power\sensors\sensor_monitoring.dm" +#include "code\modules\power\singularity\act.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\emitter_vr.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm" +#include "code\modules\power\supermatter\setup_supermatter.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\power\tesla\telsa_construction.dm" +#include "code\modules\power\tesla\tesla_act.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\broken.dm" +#include "code\modules\projectiles\dnalocking.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\magazines_vr.dm" +#include "code\modules\projectiles\ammunition\magnetic.dm" +#include "code\modules\projectiles\ammunition\rounds.dm" +#include "code\modules\projectiles\ammunition\smartmag.dm" +#include "code\modules\projectiles\brokenguns\energy.dm" +#include "code\modules\projectiles\brokenguns\launcher.dm" +#include "code\modules\projectiles\brokenguns\magnetic.dm" +#include "code\modules\projectiles\brokenguns\projectile.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\launcher.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\modular_guns.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\vox.dm" +#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" +#include "code\modules\projectiles\guns\energy\crestrose_vr.dm" +#include "code\modules\projectiles\guns\energy\dominator_vr.dm" +#include "code\modules\projectiles\guns\energy\gunsword_vr.dm" +#include "code\modules\projectiles\guns\energy\hooklauncher.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\laser_vr.dm" +#include "code\modules\projectiles\guns\energy\netgun_vr.dm" +#include "code\modules\projectiles\guns\energy\nuclear.dm" +#include "code\modules\projectiles\guns\energy\nuclear_vr.dm" +#include "code\modules\projectiles\guns\energy\particle.dm" +#include "code\modules\projectiles\guns\energy\phase.dm" +#include "code\modules\projectiles\guns\energy\protector_vr.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\pummeler_vr.dm" +#include "code\modules\projectiles\guns\energy\sickshot_vr.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\special_vr.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\energy\stun_vr.dm" +#include "code\modules\projectiles\guns\energy\temperature.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\cell_loaded.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m_cells.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon_cells.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw.dm" +#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw_cells.dm" +#include "code\modules\projectiles\guns\launcher\bows.dm" +#include "code\modules\projectiles\guns\launcher\crossbow.dm" +#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" +#include "code\modules\projectiles\guns\launcher\pneumatic.dm" +#include "code\modules\projectiles\guns\launcher\rocket.dm" +#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\magic\fireball.dm" +#include "code\modules\projectiles\guns\magnetic\bore.dm" +#include "code\modules\projectiles\guns\magnetic\gasthrower.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" +#include "code\modules\projectiles\guns\projectile\automatic.dm" +#include "code\modules\projectiles\guns\projectile\automatic_vr.dm" +#include "code\modules\projectiles\guns\projectile\boltaction.dm" +#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm" +#include "code\modules\projectiles\guns\projectile\caseless.dm" +#include "code\modules\projectiles\guns\projectile\contender.dm" +#include "code\modules\projectiles\guns\projectile\dartgun.dm" +#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm" +#include "code\modules\projectiles\guns\projectile\pistol.dm" +#include "code\modules\projectiles\guns\projectile\pistol_vr.dm" +#include "code\modules\projectiles\guns\projectile\revolver.dm" +#include "code\modules\projectiles\guns\projectile\revolver_vr.dm" +#include "code\modules\projectiles\guns\projectile\semiauto.dm" +#include "code\modules\projectiles\guns\projectile\shotgun.dm" +#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm" +#include "code\modules\projectiles\guns\projectile\sniper.dm" +#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" +#include "code\modules\projectiles\projectile\arc.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\beams_vr.dm" +#include "code\modules\projectiles\projectile\blob.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\bullets_vr.dm" +#include "code\modules\projectiles\projectile\change.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\energy_vr.dm" +#include "code\modules\projectiles\projectile\explosive.dm" +#include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\hook.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\magnetic.dm" +#include "code\modules\projectiles\projectile\pellets.dm" +#include "code\modules\projectiles\projectile\scatter.dm" +#include "code\modules\projectiles\projectile\special.dm" +#include "code\modules\projectiles\projectile\trace.dm" +#include "code\modules\projectiles\targeting\targeting_client.dm" +#include "code\modules\projectiles\targeting\targeting_gun.dm" +#include "code\modules\projectiles\targeting\targeting_mob.dm" +#include "code\modules\projectiles\targeting\targeting_overlay.dm" +#include "code\modules\projectiles\targeting\targeting_triggers.dm" +#include "code\modules\radiation\radiation.dm" +#include "code\modules\random_map\_random_map_setup.dm" +#include "code\modules\random_map\random_map.dm" +#include "code\modules\random_map\random_map_verbs.dm" +#include "code\modules\random_map\automata\automata.dm" +#include "code\modules\random_map\automata\caves.dm" +#include "code\modules\random_map\building\building.dm" +#include "code\modules\random_map\drop\drop_types.dm" +#include "code\modules\random_map\drop\droppod.dm" +#include "code\modules\random_map\drop\droppod_doors.dm" +#include "code\modules\random_map\drop\supply.dm" +#include "code\modules\random_map\mazes\maze.dm" +#include "code\modules\random_map\mazes\maze_cell.dm" +#include "code\modules\random_map\noise\desert.dm" +#include "code\modules\random_map\noise\noise.dm" +#include "code\modules\random_map\noise\ore.dm" +#include "code\modules\random_map\noise\tundra.dm" +#include "code\modules\reagents\Chemistry-Colours.dm" +#include "code\modules\reagents\Chemistry-Logging.dm" +#include "code\modules\reagents\Chemistry-Metabolism.dm" +#include "code\modules\reagents\holder\distilling.dm" +#include "code\modules\reagents\holder\holder.dm" +#include "code\modules\reagents\hoses\connector.dm" +#include "code\modules\reagents\hoses\hose.dm" +#include "code\modules\reagents\hoses\hose_connector.dm" +#include "code\modules\reagents\machinery\chem_master.dm" +#include "code\modules\reagents\machinery\chemalyzer.dm" +#include "code\modules\reagents\machinery\distillery.dm" +#include "code\modules\reagents\machinery\grinder.dm" +#include "code\modules\reagents\machinery\dispenser\_defines.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm" +#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser2.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" +#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm" +#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" +#include "code\modules\reagents\machinery\dispenser\supply.dm" +#include "code\modules\reagents\reactions\_reactions.dm" +#include "code\modules\reagents\reactions\distilling\distilling.dm" +#include "code\modules\reagents\reactions\fusion\fusion.dm" +#include "code\modules\reagents\reactions\instant\drinks.dm" +#include "code\modules\reagents\reactions\instant\drinks_vr.dm" +#include "code\modules\reagents\reactions\instant\food.dm" +#include "code\modules\reagents\reactions\instant\food_vr.dm" +#include "code\modules\reagents\reactions\instant\instant.dm" +#include "code\modules\reagents\reactions\instant\instant_vr.dm" +#include "code\modules\reagents\reagent_containers\_reagent_containers.dm" +#include "code\modules\reagents\reagent_containers\blood_pack.dm" +#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" +#include "code\modules\reagents\reagent_containers\borghypo.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\glass_vr.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypospray_vr.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\pill_vr.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\spray_vr.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\reagents\reagent_containers\syringes_vr.dm" +#include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" +#include "code\modules\reagents\reagents\_helpers.dm" +#include "code\modules\reagents\reagents\_reagents.dm" +#include "code\modules\reagents\reagents\core.dm" +#include "code\modules\reagents\reagents\dispenser.dm" +#include "code\modules\reagents\reagents\food_drinks.dm" +#include "code\modules\reagents\reagents\food_drinks_vr.dm" +#include "code\modules\reagents\reagents\medicine.dm" +#include "code\modules\reagents\reagents\medicine_vr.dm" +#include "code\modules\reagents\reagents\modifiers.dm" +#include "code\modules\reagents\reagents\other.dm" +#include "code\modules\reagents\reagents\other_vr.dm" +#include "code\modules\reagents\reagents\toxins.dm" +#include "code\modules\reagents\reagents\vore_vr.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\disposal-construction.dm" +#include "code\modules\recycling\disposal.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\research\circuitprinter.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\mechfab_designs.dm" +#include "code\modules\research\message_server.dm" +#include "code\modules\research\prosfab_designs.dm" +#include "code\modules\research\prosfab_designs_vr.dm" +#include "code\modules\research\protolathe.dm" +#include "code\modules\research\rd-readme.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdconsole_tgui.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\teleport_vr.dm" +#include "code\modules\research\designs\ai_holders.dm" +#include "code\modules\research\designs\bag_of_holding.dm" +#include "code\modules\research\designs\beakers.dm" +#include "code\modules\research\designs\bio_devices.dm" +#include "code\modules\research\designs\bio_devices_vr.dm" +#include "code\modules\research\designs\circuit_assembly.dm" +#include "code\modules\research\designs\engineering.dm" +#include "code\modules\research\designs\HUDs.dm" +#include "code\modules\research\designs\HUDs_vr.dm" +#include "code\modules\research\designs\implants.dm" +#include "code\modules\research\designs\implants_vr.dm" +#include "code\modules\research\designs\locator_devices.dm" +#include "code\modules\research\designs\medical.dm" +#include "code\modules\research\designs\medical_vr.dm" +#include "code\modules\research\designs\mining_toys.dm" +#include "code\modules\research\designs\misc.dm" +#include "code\modules\research\designs\misc_vr.dm" +#include "code\modules\research\designs\modular_computer.dm" +#include "code\modules\research\designs\pdas.dm" +#include "code\modules\research\designs\power_cells.dm" +#include "code\modules\research\designs\precursor.dm" +#include "code\modules\research\designs\stock_parts.dm" +#include "code\modules\research\designs\subspace_parts.dm" +#include "code\modules\research\designs\tech_disks.dm" +#include "code\modules\research\designs\weapons.dm" +#include "code\modules\research\designs\weapons_vr.dm" +#include "code\modules\research\designs\xenoarch_toys.dm" +#include "code\modules\research\designs\xenobio_toys.dm" +#include "code\modules\research\designs\circuits\ai_modules.dm" +#include "code\modules\research\designs\circuits\ai_modules_vr.dm" +#include "code\modules\research\designs\circuits\circuits.dm" +#include "code\modules\research\designs\circuits\circuits_vr.dm" +#include "code\modules\research\designs\circuits\disks.dm" +#include "code\modules\resleeving\circuitboards.dm" +#include "code\modules\resleeving\computers.dm" +#include "code\modules\resleeving\designer.dm" +#include "code\modules\resleeving\documents.dm" +#include "code\modules\resleeving\implant.dm" +#include "code\modules\resleeving\infocore_records.dm" +#include "code\modules\resleeving\infomorph.dm" +#include "code\modules\resleeving\infomorph_software.dm" +#include "code\modules\resleeving\machines.dm" +#include "code\modules\resleeving\machines_vr.dm" +#include "code\modules\resleeving\resleeving_sickness.dm" +#include "code\modules\resleeving\sleevecard.dm" +#include "code\modules\rogueminer_vr\asteroid.dm" +#include "code\modules\rogueminer_vr\controller.dm" +#include "code\modules\rogueminer_vr\debug.dm" +#include "code\modules\rogueminer_vr\landmarks.dm" +#include "code\modules\rogueminer_vr\roguemines_mobs.dm" +#include "code\modules\rogueminer_vr\wrappers.dm" +#include "code\modules\rogueminer_vr\zone_console.dm" +#include "code\modules\rogueminer_vr\zonemaster.dm" +#include "code\modules\scripting\Errors.dm" +#include "code\modules\scripting\IDE.dm" +#include "code\modules\scripting\Options.dm" +#include "code\modules\scripting\stack.dm" +#include "code\modules\scripting\AST\AST Nodes.dm" +#include "code\modules\scripting\AST\Blocks.dm" +#include "code\modules\scripting\AST\Statements.dm" +#include "code\modules\scripting\AST\Operators\Binary Operators.dm" +#include "code\modules\scripting\AST\Operators\Unary Operators.dm" +#include "code\modules\scripting\Implementations\_Logic.dm" +#include "code\modules\scripting\Implementations\Telecomms.dm" +#include "code\modules\scripting\Interpreter\Evaluation.dm" +#include "code\modules\scripting\Interpreter\Interaction.dm" +#include "code\modules\scripting\Interpreter\Interpreter.dm" +#include "code\modules\scripting\Interpreter\Scope.dm" +#include "code\modules\scripting\Parser\Expressions.dm" +#include "code\modules\scripting\Parser\Keywords.dm" +#include "code\modules\scripting\Parser\Parser.dm" +#include "code\modules\scripting\Scanner\Scanner.dm" +#include "code\modules\scripting\Scanner\Tokens.dm" +#include "code\modules\security levels\keycard authentication.dm" +#include "code\modules\security levels\security levels.dm" +#include "code\modules\shieldgen\directional_shield.dm" +#include "code\modules\shieldgen\emergency_shield.dm" +#include "code\modules\shieldgen\energy_field.dm" +#include "code\modules\shieldgen\energy_shield.dm" +#include "code\modules\shieldgen\handheld_defuser.dm" +#include "code\modules\shieldgen\sheldwallgen.dm" +#include "code\modules\shieldgen\shield_capacitor.dm" +#include "code\modules\shieldgen\shield_diffuser.dm" +#include "code\modules\shieldgen\shield_gen.dm" +#include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shieldgen\shield_generator.dm" +#include "code\modules\shieldgen\shield_modes.dm" +#include "code\modules\shuttles\antagonist.dm" +#include "code\modules\shuttles\crashes.dm" +#include "code\modules\shuttles\departmental.dm" +#include "code\modules\shuttles\escape_pods.dm" +#include "code\modules\shuttles\landmarks.dm" +#include "code\modules\shuttles\shuttle.dm" +#include "code\modules\shuttles\shuttle_autodock.dm" +#include "code\modules\shuttles\shuttle_console.dm" +#include "code\modules\shuttles\shuttle_console_multi.dm" +#include "code\modules\shuttles\shuttle_emergency.dm" +#include "code\modules\shuttles\shuttle_ferry.dm" +#include "code\modules\shuttles\shuttle_specops.dm" +#include "code\modules\shuttles\shuttle_supply.dm" +#include "code\modules\shuttles\shuttles_multi.dm" +#include "code\modules\shuttles\shuttles_vr.dm" +#include "code\modules\shuttles\shuttles_web.dm" +#include "code\modules\shuttles\web_datums.dm" +#include "code\modules\spells\artifacts.dm" +#include "code\modules\spells\construct_spells.dm" +#include "code\modules\spells\no_clothes.dm" +#include "code\modules\spells\spell_code.dm" +#include "code\modules\spells\spell_projectile.dm" +#include "code\modules\spells\spellbook.dm" +#include "code\modules\spells\spells.dm" +#include "code\modules\spells\aoe_turf\aoe_turf.dm" +#include "code\modules\spells\aoe_turf\blink.dm" +#include "code\modules\spells\aoe_turf\charge.dm" +#include "code\modules\spells\aoe_turf\disable_tech.dm" +#include "code\modules\spells\aoe_turf\knock.dm" +#include "code\modules\spells\aoe_turf\smoke.dm" +#include "code\modules\spells\aoe_turf\summons.dm" +#include "code\modules\spells\aoe_turf\conjure\conjure.dm" +#include "code\modules\spells\aoe_turf\conjure\construct.dm" +#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" +#include "code\modules\spells\general\area_teleport.dm" +#include "code\modules\spells\general\rune_write.dm" +#include "code\modules\spells\targeted\ethereal_jaunt.dm" +#include "code\modules\spells\targeted\genetic.dm" +#include "code\modules\spells\targeted\harvest.dm" +#include "code\modules\spells\targeted\mind_transfer.dm" +#include "code\modules\spells\targeted\shift.dm" +#include "code\modules\spells\targeted\subjugate.dm" +#include "code\modules\spells\targeted\targeted.dm" +#include "code\modules\spells\targeted\equip\equip.dm" +#include "code\modules\spells\targeted\equip\horsemask.dm" +#include "code\modules\spells\targeted\projectile\dumbfire.dm" +#include "code\modules\spells\targeted\projectile\fireball.dm" +#include "code\modules\spells\targeted\projectile\magic_missile.dm" +#include "code\modules\spells\targeted\projectile\projectile.dm" +#include "code\modules\surgery\_defines.dm" +#include "code\modules\surgery\bones.dm" +#include "code\modules\surgery\encased.dm" +#include "code\modules\surgery\external_repair.dm" +#include "code\modules\surgery\face.dm" +#include "code\modules\surgery\generic.dm" +#include "code\modules\surgery\implant.dm" +#include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\neck.dm" +#include "code\modules\surgery\organs_internal.dm" +#include "code\modules\surgery\other.dm" +#include "code\modules\surgery\robotics.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\~defines.dm" +#include "code\modules\tables\bench.dm" +#include "code\modules\tables\flipping.dm" +#include "code\modules\tables\interactions.dm" +#include "code\modules\tables\presets.dm" +#include "code\modules\tables\presets_vr.dm" +#include "code\modules\tables\rack.dm" +#include "code\modules\tables\rack_vr.dm" +#include "code\modules\tables\tables.dm" +#include "code\modules\tables\update_triggers.dm" +#include "code\modules\telesci\bscyrstal.dm" +#include "code\modules\telesci\construction.dm" +#include "code\modules\telesci\gps_advanced.dm" +#include "code\modules\telesci\quantum_pad.dm" +#include "code\modules\telesci\telepad.dm" +#include "code\modules\telesci\telesci_computer.dm" +#include "code\modules\tension\tension.dm" +#include "code\modules\tgs\includes.dm" +#include "code\modules\tgui\external.dm" +#include "code\modules\tgui\modal.dm" +#include "code\modules\tgui\states.dm" +#include "code\modules\tgui\tgui.dm" +#include "code\modules\tgui\tgui_alert.dm" +#include "code\modules\tgui\tgui_input_list.dm" +#include "code\modules\tgui\tgui_input_text.dm" +#include "code\modules\tgui\tgui_window.dm" +#include "code\modules\tgui\modules\_base.dm" +#include "code\modules\tgui\modules\admin_shuttle_controller.dm" +#include "code\modules\tgui\modules\agentcard.dm" +#include "code\modules\tgui\modules\alarm.dm" +#include "code\modules\tgui\modules\appearance_changer.dm" +#include "code\modules\tgui\modules\appearance_changer_vr.dm" +#include "code\modules\tgui\modules\atmos_control.dm" +#include "code\modules\tgui\modules\camera.dm" +#include "code\modules\tgui\modules\communications.dm" +#include "code\modules\tgui\modules\crew_manifest.dm" +#include "code\modules\tgui\modules\crew_monitor.dm" +#include "code\modules\tgui\modules\gyrotron_control.dm" +#include "code\modules\tgui\modules\law_manager.dm" +#include "code\modules\tgui\modules\overmap.dm" +#include "code\modules\tgui\modules\power_monitor.dm" +#include "code\modules\tgui\modules\rcon.dm" +#include "code\modules\tgui\modules\rustcore_monitor.dm" +#include "code\modules\tgui\modules\rustfuel_control.dm" +#include "code\modules\tgui\modules\shutoff_monitor.dm" +#include "code\modules\tgui\modules\supermatter_monitor.dm" +#include "code\modules\tgui\modules\teleporter.dm" +#include "code\modules\tgui\modules\ntos-only\cardmod.dm" +#include "code\modules\tgui\modules\ntos-only\configurator.dm" +#include "code\modules\tgui\modules\ntos-only\email.dm" +#include "code\modules\tgui\modules\ntos-only\uav.dm" +#include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\conscious.dm" +#include "code\modules\tgui\states\contained.dm" +#include "code\modules\tgui\states\deep_inventory.dm" +#include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\human_adjacent.dm" +#include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\inventory_vr.dm" +#include "code\modules\tgui\states\not_incapacitated.dm" +#include "code\modules\tgui\states\notcontained.dm" +#include "code\modules\tgui\states\observer.dm" +#include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\vorepanel_vr.dm" +#include "code\modules\tgui\states\zlevel.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\turbolift\_turbolift.dm" +#include "code\modules\turbolift\turbolift.dm" +#include "code\modules\turbolift\turbolift_areas.dm" +#include "code\modules\turbolift\turbolift_console.dm" +#include "code\modules\turbolift\turbolift_console_vr.dm" +#include "code\modules\turbolift\turbolift_door.dm" +#include "code\modules\turbolift\turbolift_door_vr.dm" +#include "code\modules\turbolift\turbolift_floor.dm" +#include "code\modules\turbolift\turbolift_map.dm" +#include "code\modules\turbolift\turbolift_turfs.dm" +#include "code\modules\vchat\vchat_client.dm" +#include "code\modules\vchat\vchat_db.dm" +#include "code\modules\vehicles\bike.dm" +#include "code\modules\vehicles\boat.dm" +#include "code\modules\vehicles\cargo_train.dm" +#include "code\modules\vehicles\construction.dm" +#include "code\modules\vehicles\quad.dm" +#include "code\modules\vehicles\train.dm" +#include "code\modules\vehicles\vehicle.dm" +#include "code\modules\ventcrawl\ventcrawl.dm" +#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" +#include "code\modules\ventcrawl\ventcrawl_multiz.dm" +#include "code\modules\ventcrawl\ventcrawl_verb.dm" +#include "code\modules\virus2\admin.dm" +#include "code\modules\virus2\analyser.dm" +#include "code\modules\virus2\antibodies.dm" +#include "code\modules\virus2\centrifuge.dm" +#include "code\modules\virus2\curer.dm" +#include "code\modules\virus2\disease2.dm" +#include "code\modules\virus2\diseasesplicer.dm" +#include "code\modules\virus2\dishincubator.dm" +#include "code\modules\virus2\effect.dm" +#include "code\modules\virus2\effect_vr.dm" +#include "code\modules\virus2\helpers.dm" +#include "code\modules\virus2\isolator.dm" +#include "code\modules\virus2\items_devices.dm" +#include "code\modules\vore\hook-defs_vr.dm" +#include "code\modules\vore\trycatch_vr.dm" +#include "code\modules\vore\appearance\preferences_vr.dm" +#include "code\modules\vore\appearance\update_icons_vr.dm" +#include "code\modules\vore\eating\belly_dat_vr.dm" +#include "code\modules\vore\eating\belly_obj_vr.dm" +#include "code\modules\vore\eating\bellymodes_datum_vr.dm" +#include "code\modules\vore\eating\bellymodes_vr.dm" +#include "code\modules\vore\eating\contaminate_vr.dm" +#include "code\modules\vore\eating\digest_act_vr.dm" +#include "code\modules\vore\eating\leave_remains_vr.dm" +#include "code\modules\vore\eating\living_vr.dm" +#include "code\modules\vore\eating\silicon_vr.dm" +#include "code\modules\vore\eating\simple_animal_vr.dm" +#include "code\modules\vore\eating\transforming_vr.dm" +#include "code\modules\vore\eating\vore_vr.dm" +#include "code\modules\vore\eating\vorehooks_vr.dm" +#include "code\modules\vore\eating\vorepanel_vr.dm" +#include "code\modules\vore\fluffstuff\custom_boxes_vr.dm" +#include "code\modules\vore\fluffstuff\custom_clothes_vr.dm" +#include "code\modules\vore\fluffstuff\custom_items_vr.dm" +#include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" +#include "code\modules\vore\fluffstuff\custom_permits_vr.dm" +#include "code\modules\vore\persist\persist_vr.dm" +#include "code\modules\vore\resizing\grav_pull_vr.dm" +#include "code\modules\vore\resizing\holder_micro_vr.dm" +#include "code\modules\vore\resizing\resize_vr.dm" +#include "code\modules\vore\resizing\sizegun_vr.dm" +#include "code\modules\vore\smoleworld\smoleworld_vr.dm" +#include "code\modules\vore\weight\fitness_machines_vr.dm" +#include "code\modules\webhooks\_webhook.dm" +#include "code\modules\webhooks\webhook_ahelp2discord.dm" +#include "code\modules\webhooks\webhook_custom_event.dm" +#include "code\modules\webhooks\webhook_fax2discord.dm" +#include "code\modules\webhooks\webhook_roundend.dm" +#include "code\modules\webhooks\webhook_roundprep.dm" +#include "code\modules\webhooks\webhook_roundstart.dm" +#include "code\modules\xenoarcheaology\anomaly_container.dm" +#include "code\modules\xenoarcheaology\boulder.dm" +#include "code\modules\xenoarcheaology\effect.dm" +#include "code\modules\xenoarcheaology\manuals.dm" +#include "code\modules\xenoarcheaology\misc.dm" +#include "code\modules\xenoarcheaology\sampling.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_vr.dm" +#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" +#include "code\modules\xenoarcheaology\artifacts\crystal.dm" +#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" +#include "code\modules\xenoarcheaology\artifacts\replicator.dm" +#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm" +#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm" +#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm" +#include "code\modules\xenoarcheaology\effects\badfeeling.dm" +#include "code\modules\xenoarcheaology\effects\berserk.dm" +#include "code\modules\xenoarcheaology\effects\cannibal.dm" +#include "code\modules\xenoarcheaology\effects\cellcharge.dm" +#include "code\modules\xenoarcheaology\effects\celldrain.dm" +#include "code\modules\xenoarcheaology\effects\cold.dm" +#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" +#include "code\modules\xenoarcheaology\effects\electric_field.dm" +#include "code\modules\xenoarcheaology\effects\emp.dm" +#include "code\modules\xenoarcheaology\effects\feysight.dm" +#include "code\modules\xenoarcheaology\effects\forcefield.dm" +#include "code\modules\xenoarcheaology\effects\gaia.dm" +#include "code\modules\xenoarcheaology\effects\gasco2.dm" +#include "code\modules\xenoarcheaology\effects\gasnitro.dm" +#include "code\modules\xenoarcheaology\effects\gasoxy.dm" +#include "code\modules\xenoarcheaology\effects\gasphoron.dm" +#include "code\modules\xenoarcheaology\effects\gassleeping.dm" +#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" +#include "code\modules\xenoarcheaology\effects\gravitational_waves.dm" +#include "code\modules\xenoarcheaology\effects\heal.dm" +#include "code\modules\xenoarcheaology\effects\heat.dm" +#include "code\modules\xenoarcheaology\effects\hurt.dm" +#include "code\modules\xenoarcheaology\effects\poltergeist.dm" +#include "code\modules\xenoarcheaology\effects\radiate.dm" +#include "code\modules\xenoarcheaology\effects\resurrect.dm" +#include "code\modules\xenoarcheaology\effects\roboheal.dm" +#include "code\modules\xenoarcheaology\effects\robohurt.dm" +#include "code\modules\xenoarcheaology\effects\sleepy.dm" +#include "code\modules\xenoarcheaology\effects\stun.dm" +#include "code\modules\xenoarcheaology\effects\teleport.dm" +#include "code\modules\xenoarcheaology\effects\vampire.dm" +#include "code\modules\xenoarcheaology\finds\eguns.dm" +#include "code\modules\xenoarcheaology\finds\eguns_vr.dm" +#include "code\modules\xenoarcheaology\finds\find_spawning.dm" +#include "code\modules\xenoarcheaology\finds\finds.dm" +#include "code\modules\xenoarcheaology\finds\finds_defines.dm" +#include "code\modules\xenoarcheaology\finds\fossils.dm" +#include "code\modules\xenoarcheaology\finds\misc.dm" +#include "code\modules\xenoarcheaology\finds\special.dm" +#include "code\modules\xenoarcheaology\finds\talking.dm" +#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" +#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" +#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" +#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" +#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" +#include "code\modules\xenoarcheaology\tools\equipment.dm" +#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" +#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" +#include "code\modules\xenoarcheaology\tools\tools.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" +#include "code\modules\xenoarcheaology\tools\tools_vr.dm" +#include "code\modules\xenobio\items\extracts.dm" +#include "code\modules\xenobio\items\slime_objects.dm" +#include "code\modules\xenobio\items\slimepotions.dm" +#include "code\modules\xenobio\items\weapons.dm" +#include "code\modules\xenobio\machinery\processor.dm" +#include "code\modules\xgm\xgm_gas_data.dm" +#include "code\modules\xgm\xgm_gas_mixture.dm" +#include "code\unit_tests\decl_tests.dm" +#include "code\unit_tests\language_tests.dm" +#include "code\unit_tests\loadout_tests.dm" +#include "code\unit_tests\map_tests.dm" +#include "code\unit_tests\material_tests.dm" +#include "code\unit_tests\mob_tests.dm" +#include "code\unit_tests\recipe_tests.dm" +#include "code\unit_tests\research_tests.dm" +#include "code\unit_tests\sqlite_tests.dm" +#include "code\unit_tests\subsystem_tests.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\unit_test_vr.dm" +#include "code\unit_tests\vore_tests_vr.dm" +#include "code\unit_tests\zas_tests.dm" +#include "code\unit_tests\integrated_circuits\arithmetic.dm" +#include "code\unit_tests\integrated_circuits\circuits.dm" +#include "code\unit_tests\integrated_circuits\converter.dm" +#include "code\unit_tests\integrated_circuits\logic.dm" +#include "code\unit_tests\integrated_circuits\trig.dm" +#include "code\ZAS\Airflow.dm" +#include "code\ZAS\Atom.dm" +#include "code\ZAS\Connection.dm" +#include "code\ZAS\ConnectionGroup.dm" +#include "code\ZAS\ConnectionManager.dm" +#include "code\ZAS\Controller.dm" +#include "code\ZAS\Debug.dm" +#include "code\ZAS\Diagnostic.dm" +#include "code\ZAS\Fire.dm" +#include "code\ZAS\Phoron.dm" +#include "code\ZAS\Turf.dm" +#include "code\ZAS\Variable Settings.dm" +#include "code\ZAS\Zone.dm" +#include "interface\interface.dm" +#include "interface\skin.dmf" +#include "maps\gateway_archive_vr\blackmarketpackers.dm" +#include "maps\offmap_vr\om_ships\abductor.dm" +#include "maps\southern_cross\items\clothing\sc_accessory.dm" +#include "maps\southern_cross\items\clothing\sc_suit.dm" +#include "maps\southern_cross\items\clothing\sc_under.dm" +#include "maps\southern_cross\loadout\loadout_suit.dm" +#include "maps\southern_cross\loadout\loadout_uniform.dm" +#include "maps\southern_cross\loadout\loadout_vr.dm" +#include "maps\submaps\_helpers.dm" +#include "maps\submaps\_readme.dm" +#include "maps\submaps\engine_submaps\engine.dm" +#include "maps\submaps\engine_submaps\engine_areas.dm" +#include "maps\submaps\engine_submaps_vr\tether\_engine_submaps.dm" +#include "maps\submaps\space_submaps\space.dm" +#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" +#include "maps\submaps\surface_submaps\mountains\mountains.dm" +#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" +#include "maps\submaps\surface_submaps\mountains\mountains_areas_vr.dm" +#include "maps\submaps\surface_submaps\plains\plains.dm" +#include "maps\submaps\surface_submaps\plains\plains_areas.dm" +#include "maps\submaps\surface_submaps\wilderness\wilderness.dm" +#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" +#include "maps\tether\tether.dm" +#include "maps\~map_system\maps.dm" +// END_INCLUDE +>>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 9ad7140c674f654bb1436ec0ab91ca9182e8dd91 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Mon, 19 Jul 2021 23:19:27 -0400 Subject: [PATCH 06/86] Merge pull request #11164 from VOREStation/Arokha/fixpaths Fix some typepaths --- maps/offmap_vr/om_ships/curashuttle.dmm | 2 +- maps/submaps/pois_vr/debris_field/mining_drones.dmm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/maps/offmap_vr/om_ships/curashuttle.dmm b/maps/offmap_vr/om_ships/curashuttle.dmm index e6b4574392..83fe0dde11 100644 --- a/maps/offmap_vr/om_ships/curashuttle.dmm +++ b/maps/offmap_vr/om_ships/curashuttle.dmm @@ -4826,7 +4826,7 @@ aa /area/shuttle/curabitur/curashuttle/med) "bM" = ( /obj/structure/fans/hardlight, -/obj/machinery/door/airlock/external/glass/bolted{ +/obj/machinery/door/airlock/external/bolted{ frequency = 1480; id_tag = "curadocking" }, diff --git a/maps/submaps/pois_vr/debris_field/mining_drones.dmm b/maps/submaps/pois_vr/debris_field/mining_drones.dmm index 5fa8f77d65..c94ba77182 100644 --- a/maps/submaps/pois_vr/debris_field/mining_drones.dmm +++ b/maps/submaps/pois_vr/debris_field/mining_drones.dmm @@ -166,7 +166,7 @@ /turf/simulated/floor/tiled/airless, /area/submap/debrisfield/mining_outpost) "E" = ( -/obj/machinery/door/airlock/external/glass{ +/obj/machinery/door/airlock/external{ density = 0; health = 0; icon_state = "door_open"; @@ -175,7 +175,7 @@ /turf/simulated/floor/airless, /area/submap/debrisfield/mining_outpost) "F" = ( -/obj/machinery/door/airlock/external/glass/bolted, +/obj/machinery/door/airlock/external/bolted, /turf/simulated/floor/airless, /area/submap/debrisfield/mining_outpost) "G" = ( From ba4dc7c3ffd51e241d8ac187f5d97a12916893c5 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 03:19:59 +0000 Subject: [PATCH 08/86] Tweak alien eggs --- code/game/objects/effects/alien/alien egg.dm | 87 ++++++++++++++----- .../thinktank/thinktank_interactions.dm | 2 +- .../computers/modular_computer/interaction.dm | 2 +- code/modules/multiz/ladders.dm | 2 +- 4 files changed, 67 insertions(+), 26 deletions(-) diff --git a/code/game/objects/effects/alien/alien egg.dm b/code/game/objects/effects/alien/alien egg.dm index da12ae3f16..ad06e1f73d 100644 --- a/code/game/objects/effects/alien/alien egg.dm +++ b/code/game/objects/effects/alien/alien egg.dm @@ -37,55 +37,96 @@ /obj/structure/alien/egg/update_icon() if(progress == -1) - icon_state = "egg_hatched" + icon_state = "egg_opened" else if(progress < MAX_PROGRESS) icon_state = "egg_growing" else icon_state = "egg" -/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user) - if(progress == -1) //Egg has been hatched. - return + // Ghostjoinable icon + var/static/image/I + if(!I) + I = image('icons/mob/hud_vr.dmi', "ghostjoin") + I.invisibility = INVISIBILITY_OBSERVER + I.plane = PLANE_GHOSTS + I.appearance_flags = KEEP_APART|RESET_TRANSFORM + + if(progress >= MAX_PROGRESS) + add_overlay(I) + else + cut_overlay(I) - if(progress < MAX_PROGRESS) - to_chat(user, "\The [src] has not yet matured.") - return - if(!user.MayRespawn(1)) +/obj/structure/alien/egg/attack_ghost(var/mob/observer/dead/user) + // Still a ghost? + if(!istype(user)) + tgui_alert_async(user, "You have to be an observer to join as this Xenomorph larva.") return - + // Check for bans properly. +<<<<<<< HEAD:code/game/objects/effects/alien/alien egg.dm if(jobban_isbanned(user, MODE_XENOMORPH)) to_chat(user, "You are banned from playing a Genaprawn.") //CHOMPedit +||||||| parent of b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm + if(jobban_isbanned(user, "Xenomorph")) + to_chat(user, "You are banned from playing a Xenomorph.") +======= + if(jobban_isbanned(user, "Xenomorph")) + tgui_alert_async(user, "You are banned from playing a Xenomorph, so you can't join as this Xenomorph larva.") +>>>>>>> b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm return +<<<<<<< HEAD:code/game/objects/effects/alien/alien egg.dm var/confirm = alert(user, "Are you sure you want to join as a Genaprawn larva?", "Become Larva", "No", "Yes") //CHOMPedit if(!src || confirm != "Yes") +||||||| parent of b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm + + var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") + + if(!src || confirm != "Yes") +======= + + // Check for respawn + if(!user.MayRespawn(1)) + tgui_alert_async(user, "You aren't allowed to respawn, so you can't join as this Xenomorph larva.") +>>>>>>> b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm + return + + if(progress == -1) + tgui_alert_async(user, "That egg has already hatched.") + else if(progress >= MAX_PROGRESS) + tgui_alert_async(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", list("Yes","No"), CALLBACK(src, .proc/ghost_dunk), 20 SECONDS) + else + tgui_alert_async(user, "\The [src] has not yet matured.") + +/obj/structure/alien/egg/proc/ghost_dunk(choice) + if(choice != "Yes") + return + var/mob/observer/dead/user = usr + if(progress < MAX_PROGRESS || !istype(user)) return - if(!user || !user.ckey) - return - - if(progress == -1) //Egg has been hatched. - to_chat(user, "Too slow...") - return - - flick("egg_opening",src) progress = -1 // No harvesting pls. - sleep(5) + flick("egg_opening",src) + sleep(5) //5ds animation - if(!src || !user) + if(!src || !istype(user)) visible_message("\The [src] writhes with internal motion, but nothing comes out.") progress = MAX_PROGRESS // Someone else can have a go. return // What a pain. // Create the mob, transfer over key. var/mob/living/carbon/alien/larva/larva = new(get_turf(src)) - larva.ckey = user.ckey - spawn(-1) - if(user) qdel(user) // Remove the keyless ghost if it exists. - + + // Move the ghost in + if(user.mind) + user.mind.active = TRUE + user.mind.transfer_to(larva) + else + larva.ckey = user.ckey + qdel(user) + visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!") // Turn us into a hatched egg. diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm index 0c981cb4b2..852c09ff61 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm @@ -32,7 +32,7 @@ . = ..() -/mob/living/silicon/robot/platform/attack_ghost(mob/observer/ghost/user) +/mob/living/silicon/robot/platform/attack_ghost(mob/observer/dead/user) if(client || key || stat == DEAD || !ticker || !ticker.mode) return ..() diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index d7e8573010..4cc9c8ba89 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -97,7 +97,7 @@ uninstall_component(user, portable_drive) update_uis() -/obj/item/modular_computer/attack_ghost(var/mob/observer/ghost/user) +/obj/item/modular_computer/attack_ghost(var/mob/observer/dead/user) if(enabled) tgui_interact(user) else if(check_rights(R_ADMIN|R_EVENT, 0, user)) diff --git a/code/modules/multiz/ladders.dm b/code/modules/multiz/ladders.dm index e45e61e482..b4626022bb 100644 --- a/code/modules/multiz/ladders.dm +++ b/code/modules/multiz/ladders.dm @@ -89,7 +89,7 @@ return FALSE return TRUE -/mob/observer/ghost/may_climb_ladders(var/ladder) +/mob/observer/dead/may_climb_ladders(var/ladder) return TRUE /obj/structure/ladder/proc/climbLadder(var/mob/M, var/obj/target_ladder) From 21f58709d7442e8290672da67b1d43689685fa12 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 03:20:06 +0000 Subject: [PATCH 09/86] Fix two suit cycler problems --- code/__defines/sprite_sheets.dm | 16 + code/game/machinery/suit_cycler_datums.dm | 14 +- code/game/machinery/suit_storage_unit.dm | 19 +- code/modules/clothing/clothing.dm | 2117 +++++++++++++++++ .../clothing/spacesuits/void/ert_vr.dm | 5 + code/modules/clothing/spacesuits/void/void.dm | 28 +- .../clothing/spacesuits/void/void_vr.dm | 18 +- .../clothing/spacesuits/void/wizard.dm | 2 - 8 files changed, 2168 insertions(+), 51 deletions(-) diff --git a/code/__defines/sprite_sheets.dm b/code/__defines/sprite_sheets.dm index c40899e3fe..603bb82d5f 100644 --- a/code/__defines/sprite_sheets.dm +++ b/code/__defines/sprite_sheets.dm @@ -1,5 +1,6 @@ // Default species get default sprites, VR species get VR sprites #define VR_SPECIES_SPRITE_SHEETS_SUIT_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/suit/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi',\ @@ -12,6 +13,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HEAD_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/head/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi',\ @@ -24,6 +26,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HANDS_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/hands/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/mob_unathi.dmi',\ @@ -36,6 +39,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_FEET_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/feet/mob.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/mob_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/mob_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/mob_unathi.dmi',\ @@ -49,6 +53,7 @@ SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/feet/mob_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/suit/item.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi',\ @@ -61,6 +66,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/head/item.dmi',\ SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi',\ @@ -73,6 +79,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_HANDS_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/hands/item.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/item_unathi.dmi',\ @@ -85,6 +92,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/item_vr_vulpkanin.dmi') #define VR_SPECIES_SPRITE_SHEETS_FEET_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/feet/item.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/item_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/item_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/item_unathi.dmi',\ @@ -99,6 +107,7 @@ SPECIES_FENNEC = 'icons/inventory/feet/item_vr_vulpkanin.dmi') // All species get VR sprites #define ALL_VR_SPRITE_SHEETS_SUIT_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/suit/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi',\ @@ -111,6 +120,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HEAD_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi',\ @@ -123,6 +133,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HANDS_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/hands/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/mob_vr_unathi.dmi',\ @@ -135,6 +146,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_FEET_MOB list(\ +SPECIES_HUMAN = 'icons/inventory/feet/mob_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/mob_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/mob_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/mob_vr_unathi.dmi',\ @@ -148,6 +160,7 @@ SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/feet/mob_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_SUIT_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/suit/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/suit/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/suit/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/suit/item_vr_unathi.dmi',\ @@ -160,6 +173,7 @@ SPECIES_VULPKANIN = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/suit/item_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HEAD_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/head/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/head/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/head/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/head/item_vr_unathi.dmi',\ @@ -172,6 +186,7 @@ SPECIES_VULPKANIN = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/head/item_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_HANDS_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/hands/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/hands/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/hands/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/hands/item_vr_unathi.dmi',\ @@ -184,6 +199,7 @@ SPECIES_VULPKANIN = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vr_vulpkanin.dmi',\ SPECIES_FENNEC = 'icons/inventory/hands/item_vr_vulpkanin.dmi') #define ALL_VR_SPRITE_SHEETS_FEET_ITEM list(\ +SPECIES_HUMAN = 'icons/inventory/feet/item_vr.dmi',\ SPECIES_TAJ = 'icons/inventory/feet/item_vr_tajaran.dmi',\ SPECIES_SKRELL = 'icons/inventory/feet/item_vr_skrell.dmi',\ SPECIES_UNATHI = 'icons/inventory/feet/item_vr_unathi.dmi',\ diff --git a/code/game/machinery/suit_cycler_datums.dm b/code/game/machinery/suit_cycler_datums.dm index 205dc99979..e796213acf 100644 --- a/code/game/machinery/suit_cycler_datums.dm +++ b/code/game/machinery/suit_cycler_datums.dm @@ -14,12 +14,13 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged) var/helmet_becomes /datum/suit_cycler_choice/department/proc/can_refit_helmet(obj/item/clothing/head/helmet/helmet) - return !!helmet_becomes + return helmet && !!helmet_becomes /datum/suit_cycler_choice/department/proc/do_refit_helmet(obj/item/clothing/head/helmet/helmet) var/obj/item/clothing/tmp = new helmet_becomes() helmet.name = "refitted [tmp.name]" helmet.desc = tmp.desc + helmet.icon = tmp.icon helmet.icon_state = tmp.icon_state helmet.item_state = tmp.item_state helmet.item_state_slots = tmp.item_state_slots?.Copy() @@ -28,12 +29,13 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged) helmet.default_worn_icon = tmp.default_worn_icon /datum/suit_cycler_choice/department/proc/can_refit_suit(obj/item/clothing/suit/space/suit) - return !!suit_becomes + return suit && !!suit_becomes /datum/suit_cycler_choice/department/proc/do_refit_suit(obj/item/clothing/suit/space/suit) var/obj/item/clothing/tmp = new suit_becomes() suit.name = "refitted [tmp.name]" suit.desc = tmp.desc + suit.icon = tmp.icon suit.icon_state = tmp.icon_state suit.item_state = tmp.item_state suit.item_state_slots = tmp.item_state_slots?.Copy() @@ -305,16 +307,16 @@ GLOBAL_LIST_EMPTY(suit_cycler_emagged) // Uses same logic as it used to, which is that it bases an assumption of 'we should have custom sprites' on // the presence of the species in the sprite_sheets_obj list on the helmet and suit -/datum/suit_cycler_choice/species/proc/can_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) - for(var/obj/item/clothing/C in list(helmet, suit)) +/datum/suit_cycler_choice/species/proc/can_refit_to(...) + for(var/obj/item/clothing/C in args) if(LAZYACCESS(C.sprite_sheets_obj, name)) if(!(C.icon_state in cached_icon_states(C.sprite_sheets_obj[name]))) return FALSE // Species was in sprite_sheets_obj, but had no sprite for this object in particular return TRUE -/datum/suit_cycler_choice/species/proc/do_refit_to(obj/item/clothing/head/helmet/helmet, obj/item/clothing/suit/space/suit) - for(var/obj/item/clothing/C in list(helmet, suit)) +/datum/suit_cycler_choice/species/proc/do_refit_to(...) + for(var/obj/item/clothing/C in args) C.refit_for_species(name) /datum/suit_cycler_choice/species/noop diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 6b8c8747cc..175434088d 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1114,17 +1114,20 @@ GLOBAL_LIST_EMPTY(suit_cycler_typecache) /obj/machinery/suit_cycler/proc/apply_paintjob() if(!target_species || !target_department) return - if(suit?.helmet) - visible_message("[bicon(src)]Separate the suit and helmet before applying any customizations.") - return - if(helmet && target_department.can_refit_helmet(helmet)) + // Helmet to new paint + if(target_department.can_refit_helmet(helmet)) target_department.do_refit_helmet(helmet) - if(suit && target_department.can_refit_suit(suit)) + // Suit to new paint + if(target_department.can_refit_suit(suit)) target_department.do_refit_suit(suit) - - if(target_species.can_refit_to(helmet, suit)) - target_species.do_refit_to(helmet, suit) + // Attached voidsuit helmet to new paint + if(target_department.can_refit_helmet(suit?.helmet)) + target_department.do_refit_helmet(suit.helmet) + + // Species fitting for all 3 potential changes + if(target_species.can_refit_to(helmet, suit, suit?.helmet)) + target_species.do_refit_to(helmet, suit, suit?.helmet) else visible_message("[bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.") return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c6f0ddee71..d55902f268 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -1059,3 +1060,2119 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() +||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + /* + Sprites used when the clothing item is refit. This is done by setting icon_override. + For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. + Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), + while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). + */ + var/list/sprite_sheets_refit = null + var/ear_protection = 0 + var/blood_sprite_state + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + var/polychromic = FALSE //VOREStation edit + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + + //VOREStation edit start + if(polychromic) + verbs |= /obj/item/clothing/proc/change_color + //VOREStation edit start + +/obj/item/clothing/update_icon() + cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +//VOREStation edit start +/obj/item/clothing/proc/change_color() + set name = "Change Color" + set category = "Object" + set desc = "Change the color of the clothing." + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + var/new_color = input(usr, "Pick a new color", "Color", color) as color|null + + if(new_color && (new_color != color)) + color = new_color + update_icon() + update_clothing_icon() +//VOREStation edit end + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) + LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) + + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
    They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/inventory/hands/item.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/inventory/head/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_cone_y_offset = 11 + + var/light_overlay = "helmet_light" + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(light_range) + if(!isturf(user.loc)) + to_chat(user, "You cannot toggle the light while in this [user.loc]") + return + update_flashlight(user) + to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + set_light_on(!light_on) + + if(light_system == STATIC_LIGHT) + update_light() + + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(light_on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/inventory/face/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', + SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', + SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/inventory/feet/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + cut_overlay("[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + add_overlay("[icon_state]_knife") + if(contaminated) + add_overlay(contamination_overlay) + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + if(prob(1) && !recent_squish) //VOREStation edit begin + recent_squish = 1 + spawn(100) + recent_squish = 0 + for(var/mob/living/M in contents) + var/emote = pick(inside_emotes) + to_chat(M,emote) //VOREStation edit end + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/inventory/suit/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/taurtail = istaurtail(H.tail_style) + if((taurized && !taurtail) || (!taurized && taurtail)) + taurize(user, taurtail) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) + if(has_taur_tail) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + // means that if a taur puts on an already taurized suit without a taur sprite + // for their taur type, but the previous taur type had a sprite, it stays + // taurized and they end up with that taur style which is funny + else + taurized = FALSE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/inventory/uniform/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else + under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if(worn_state in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +======= +/obj/item/clothing + name = "clothing" + siemens_coefficient = 0.9 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + var/list/species_restricted = null //Only these species can wear this kit. + var/gunshot_residue //Used by forensics. + + var/list/accessories + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + var/list/starting_accessories + + var/flash_protection = FLASH_PROTECTION_NONE + var/tint = TINT_NONE + var/list/enables_planes //Enables these planes in the wearing mob's plane_holder + var/list/plane_slots //But only if it's equipped into this specific slot + + var/ear_protection = 0 + var/blood_sprite_state + + var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing + + var/polychromic = FALSE //VOREStation edit + +//Updates the icons of the mob wearing the clothing item, if any. +/obj/item/clothing/proc/update_clothing_icon() + return + +// Aurora forensics port. +/obj/item/clothing/clean_blood() + . = ..() + gunshot_residue = null + + +/obj/item/clothing/New() + ..() + if(starting_accessories) + for(var/T in starting_accessories) + var/obj/item/clothing/accessory/tie = new T(src) + src.attach_accessory(null, tie) + set_clothing_index() + + //VOREStation edit start + if(polychromic) + verbs |= /obj/item/clothing/proc/change_color + //VOREStation edit start + +/obj/item/clothing/update_icon() + cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() + . = ..() + +/obj/item/clothing/equipped(var/mob/user,var/slot) + ..() + if(enables_planes) + user.recalculate_vis() + +/obj/item/clothing/dropped(var/mob/user) + ..() + if(enables_planes) + user.recalculate_vis() + +//BS12: Species-restricted clothing check. +/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) + + //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) + if (!..()) + return 0 + + if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) + var/exclusive = null + var/wearable = null + var/mob/living/carbon/human/H = M + + if("exclude" in species_restricted) + exclusive = 1 + + if(H.species) + if(exclusive) + if(!(H.species.get_bodytype(H) in species_restricted)) + wearable = 1 + else + if(H.species.get_bodytype(H) in species_restricted) + wearable = 1 + + if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) + to_chat(H, "Your species cannot wear [src].") + return 0 + return 1 + +/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + . = ..() + if((. == 0) && LAZYLEN(accessories)) + for(var/obj/item/I in accessories) + var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) + + if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. + . = check + break + +// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. +/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_low_temperature(tempcheck)) + . = TRUE + + if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) + . = TRUE + +/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) + . = FALSE + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + if(C.handle_high_temperature(tempcheck)) + . = TRUE + + if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) + . = TRUE + +// Returns the relative flag-vars for covered protection. +/obj/item/clothing/proc/get_cold_protection_flags() + . = cold_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_cold_protection_flags() + +/obj/item/clothing/proc/get_heat_protection_flags() + . = heat_protection + + if(LAZYLEN(accessories)) + for(var/obj/item/clothing/C in accessories) + . |= C.get_heat_protection_flags() + +/obj/item/clothing/proc/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +//VOREStation edit start +/obj/item/clothing/proc/change_color() + set name = "Change Color" + set category = "Object" + set desc = "Change the color of the clothing." + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + var/new_color = input(usr, "Pick a new color", "Color", color) as color|null + + if(new_color && (new_color != color)) + color = new_color + update_icon() + update_clothing_icon() +//VOREStation edit end + +/obj/item/clothing/head/helmet/refit_for_species(var/target_species) + if(!species_restricted) + return //this item doesn't use the species_restricted system + + //Set species_restricted list + switch(target_species) + //VOREStation Edit Start + if(SPECIES_HUMAN) + species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_SKRELL) + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) + if(SPECIES_UNATHI) + species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) + if(SPECIES_VULPKANIN) + species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) + if(SPECIES_SERGAL) + species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) + //VOREStation Edit End + else + species_restricted = list(target_species) + + //Set icon + if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) + icon = sprite_sheets_obj[target_species] + else + icon = initial(icon) + +/////////////////////////////////////////////////////////////////////// +// Ears: headsets, earmuffs and tiny objects +/obj/item/clothing/ears + name = "ears" + w_class = ITEMSIZE_TINY + throwforce = 2 + slot_flags = SLOT_EARS + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') + +/obj/item/clothing/ears/attack_hand(mob/user as mob) + if (!user) return + + if (src.loc != user || !istype(user,/mob/living/carbon/human)) + ..() + return + + var/mob/living/carbon/human/H = user + if(H.l_ear != src && H.r_ear != src) + ..() + return + + if(!canremove) + return + + var/obj/item/clothing/ears/O + if(slot_flags & SLOT_TWOEARS ) + O = (H.l_ear == src ? H.r_ear : H.l_ear) + user.u_equip(O) + if(!istype(src,/obj/item/clothing/ears/offear)) + qdel(O) + O = src + else + O = src + + user.unEquip(src) + + if (O) + user.put_in_hands(O) + O.add_fingerprint(user) + + if(istype(src,/obj/item/clothing/ears/offear)) + qdel(src) + +/obj/item/clothing/ears/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_ears() + +/obj/item/clothing/ears/MouseDrop(var/obj/over_object) + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one + if(slot_flags & SLOT_TWOEARS) + var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) + if(istype(src, /obj/item/clothing/ears/offear)) + . = O.MouseDrop(over_object) + H.drop_from_inventory(src) + qdel(src) + else + . = ..() + H.drop_from_inventory(O) + qdel(O) + else + . = ..() + + +/obj/item/clothing/ears/offear + name = "Other ear" + w_class = ITEMSIZE_HUGE + icon = 'icons/mob/screen1_Midnight.dmi' + icon_state = "block" + slot_flags = SLOT_EARS | SLOT_TWOEARS + +/obj/item/clothing/ears/offear/New(var/obj/O) + name = O.name + desc = O.desc + icon = O.icon + icon_state = O.icon_state + set_dir(O.dir) + +//////////////////////////////////////////////////////////////////////////////////////// +//Gloves +/obj/item/clothing/gloves + name = "gloves" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', + ) + gender = PLURAL //Carn: for grammarically correct text-parsing + w_class = ITEMSIZE_SMALL + icon = 'icons/inventory/hands/item.dmi' + siemens_coefficient = 0.9 + blood_sprite_state = "bloodyhands" + var/wired = 0 + var/obj/item/weapon/cell/cell = 0 + var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through + var/obj/item/clothing/gloves/ring = null //Covered ring + var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping + var/glove_level = 2 //What "layer" the glove is on + var/overgloves = 0 //Used by gauntlets and arm_guards + var/punch_force = 0 //How much damage do these gloves add to a punch? + var/punch_damtype = BRUTE //What type of damage does this make fists be? + body_parts_covered = HANDS + slot_flags = SLOT_GLOVES + attack_verb = list("challenged") + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/gloves.ogg' + pickup_sound = 'sound/items/pickup/gloves.ogg' + +/obj/item/clothing/proc/set_clothing_index() + return + +/obj/item/clothing/gloves/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_gloves() + +/obj/item/clothing/gloves/emp_act(severity) + if(cell) + cell.emp_act(severity) + if(ring) + ring.emp_act(severity) + ..() + +// Called just before an attack_hand(), in mob/UnarmedAttack() +/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) + return 0 // return 1 to cancel attack_hand() + +/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) + if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) + if (clipped) + to_chat(user, "The [src] have already been clipped!") + update_icon() + return + + playsound(src, W.usesound, 50, 1) + user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") + + clipped = 1 + name = "modified [name]" + desc = "[desc]
    They have had the fingertips cut off of them." + if("exclude" in species_restricted) + species_restricted -= SPECIES_UNATHI + species_restricted -= SPECIES_TAJ + return +*/ + +/obj/item/clothing/gloves/clean_blood() + . = ..() + transfer_blood = 0 + update_icon() + +/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) + var/mob/living/carbon/human/H = user + + if(slot && slot == slot_gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G)) + ring = H.gloves + if(ring.glove_level >= src.glove_level) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + ring = null + return 0 + else + H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. + ring.forceMove(src) + to_chat(user, "You slip \the [src] on over \the [src.ring].") + if(!(flags & THICKMATERIAL)) + punch_force += ring.punch_force + else + ring = null + + if(!..()) + if(ring) //Put the ring back on if the check fails. + if(H.equip_to_slot_if_possible(ring, slot_gloves)) + src.ring = null + punch_force = initial(punch_force) + return 0 + + wearer = H //TODO clean this when magboots are cleaned + return 1 + +/obj/item/clothing/gloves/dropped() + ..() + + if(!wearer) + return + + var/mob/living/carbon/human/H = wearer + if(ring && istype(H)) + if(!H.equip_to_slot_if_possible(ring, slot_gloves)) + ring.forceMove(get_turf(src)) + src.ring = null + punch_force = initial(punch_force) + wearer = null + +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + +///////////////////////////////////////////////////////////////////// +//Rings + +/obj/item/clothing/gloves/ring + name = "ring" + w_class = ITEMSIZE_TINY + icon = 'icons/inventory/hands/item.dmi' + gender = NEUTER + species_restricted = list("exclude", SPECIES_DIONA) + siemens_coefficient = 1 + glove_level = 1 + fingerprint_chance = 100 + punch_force = 2 + body_parts_covered = 0 + drop_sound = 'sound/items/drop/ring.ogg' + pickup_sound = 'sound/items/pickup/ring.ogg' + +/////////////////////////////////////////////////////////////////////// +//Head +/obj/item/clothing/head + name = "head" + icon = 'icons/inventory/head/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_HEAD + w_class = ITEMSIZE_SMALL + blood_sprite_state = "helmetblood" + + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_cone_y_offset = 11 + + var/light_overlay = "helmet_light" + var/image/helmet_light + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/hat.ogg' + pickup_sound = 'sound/items/pickup/hat.ogg' + +/obj/item/clothing/head/attack_self(mob/user) + if(light_range) + if(!isturf(user.loc)) + to_chat(user, "You cannot toggle the light while in this [user.loc]") + return + update_flashlight(user) + to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") + else + return ..(user) + +/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) + set_light_on(!light_on) + + if(light_system == STATIC_LIGHT) + update_light() + + update_icon(user) + user.update_action_buttons() + +/obj/item/clothing/head/attack_ai(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/attack_generic(var/mob/user) + if(!mob_wear_hat(user)) + return ..() + +/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) + if(!Adjacent(user)) + return 0 + var/success + if(istype(user, /mob/living/silicon/robot/drone)) + var/mob/living/silicon/robot/drone/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + else if(istype(user, /mob/living/carbon/alien/diona)) + var/mob/living/carbon/alien/diona/D = user + if(D.hat) + success = 2 + else + D.wear_hat(src) + success = 1 + + if(!success) + return 0 + else if(success == 2) + to_chat(user, "You are already wearing a hat.") + else if(success == 1) + to_chat(user, "You crawl under \the [src].") + return 1 + +/obj/item/clothing/head/update_icon(var/mob/user) + var/mob/living/carbon/human/H + if(ishuman(user)) + H = user + + if(light_on) + // Generate object icon. + if(!light_overlay_cache["[light_overlay]_icon"]) + light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") + helmet_light = light_overlay_cache["[light_overlay]_icon"] + add_overlay(helmet_light) + + // Generate and cache the on-mob icon, which is used in update_inv_head(). + var/body_type = (H && H.species.get_bodytype(H)) + var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" + if(!light_overlay_cache[cache_key]) + var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' + light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") + + else if(helmet_light) + cut_overlay(helmet_light) + helmet_light = null + + user.update_inv_head() //Will redraw the helmet with the light on the mob + +/obj/item/clothing/head/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_head() + +/////////////////////////////////////////////////////////////////////// +//Mask +/obj/item/clothing/mask + name = "mask" + icon = 'icons/inventory/face/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', + ) + body_parts_covered = HEAD + slot_flags = SLOT_MASK + body_parts_covered = FACE|EYES + blood_sprite_state = "maskblood" + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', + SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', + SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' + ) + + var/voicechange = 0 + var/list/say_messages + var/list/say_verbs + + drop_sound = "generic_drop" + pickup_sound = "generic_pickup" + +/obj/item/clothing/mask/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_mask() + +/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) + return + +/////////////////////////////////////////////////////////////////////// +//Shoes +/obj/item/clothing/shoes + name = "shoes" + icon = 'icons/inventory/feet/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', + ) + desc = "Comfortable-looking shoes." + gender = PLURAL //Carn: for grammarically correct text-parsing + siemens_coefficient = 0.9 + body_parts_covered = FEET + slot_flags = SLOT_FEET + blood_sprite_state = "shoeblood" + + var/can_hold_knife = 0 + var/obj/item/holding + + var/shoes_under_pants = 0 + + var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed + var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed + var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. + + var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are + + permeability_coefficient = 0.50 + slowdown = SHOES_SLOWDOWN + force = 2 + var/overshoes = 0 + species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' + ) + drop_sound = 'sound/items/drop/shoes.ogg' + pickup_sound = 'sound/items/pickup/shoes.ogg' + +/obj/item/clothing/shoes/proc/draw_knife() + set name = "Draw Boot Knife" + set desc = "Pull out your boot knife." + set category = "IC" + set src in usr + + if(usr.stat || usr.restrained() || usr.incapacitated()) + return + + holding.forceMove(get_turf(usr)) + + if(usr.put_in_hands(holding)) + usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) + holding = null + cut_overlay("[icon_state]_knife") + else + to_chat(usr, "Your need an empty, unbroken hand to do that.") + holding.forceMove(src) + + if(!holding) + verbs -= /obj/item/clothing/shoes/proc/draw_knife + + update_icon() + return + +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() + +/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) + if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ + istype(I, /obj/item/weapon/material/butterfly) || \ + istype(I, /obj/item/weapon/material/kitchen/utensil) || \ + istype(I, /obj/item/weapon/material/knife/tacknife))) + if(holding) + to_chat(user, "\The [src] is already holding \a [holding].") + return + user.unEquip(I) + I.forceMove(src) + holding = I + user.visible_message("\The [user] shoves \the [I] into \the [src].") + verbs |= /obj/item/clothing/shoes/proc/draw_knife + update_icon() + else + return ..() + +/obj/item/clothing/shoes/verb/toggle_layer() + set name = "Switch Shoe Layer" + set category = "Object" + + if(shoes_under_pants == -1) + to_chat(usr, "\The [src] cannot be worn above your suit!") + return + shoes_under_pants = !shoes_under_pants + update_icon() + +/obj/item/clothing/shoes/update_icon() + . = ..() + if(holding) + add_overlay("[icon_state]_knife") + if(contaminated) + add_overlay(contamination_overlay) + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End + if(ismob(usr)) + var/mob/M = usr + M.update_inv_shoes() + +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + +/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) + if(prob(1) && !recent_squish) //VOREStation edit begin + recent_squish = 1 + spawn(100) + recent_squish = 0 + for(var/mob/living/M in contents) + var/emote = pick(inside_emotes) + to_chat(M,emote) //VOREStation edit end + return + +/obj/item/clothing/shoes/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_shoes() + + +/////////////////////////////////////////////////////////////////////// +//Suit +/obj/item/clothing/suit + icon = 'icons/inventory/suit/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', + ) + name = "suit" + var/fire_resist = T0C+100 + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + allowed = list(/obj/item/weapon/tank/emergency/oxygen) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) + slot_flags = SLOT_OCLOTHING + var/blood_overlay_type = "suit" + blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + preserve_item = 1 + equip_sound = 'sound/items/jumpsuit_equip.ogg' + + + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' + ) + + valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) + restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) + +/obj/item/clothing/suit/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_wear_suit() + +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/taurtail = istaurtail(H.tail_style) + if((taurized && !taurtail) || (!taurized && taurtail)) + taurize(user, taurtail) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) + if(has_taur_tail) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + // means that if a taur puts on an already taurized suit without a taur sprite + // for their taur type, but the previous taur type had a sprite, it stays + // taurized and they end up with that taur style which is funny + else + taurized = FALSE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + +/////////////////////////////////////////////////////////////////////// +//Under clothing +/obj/item/clothing/under + icon = 'icons/inventory/uniform/item.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + name = "under" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + permeability_coefficient = 0.90 + slot_flags = SLOT_ICLOTHING + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + equip_sound = 'sound/items/jumpsuit_equip.ogg' + w_class = ITEMSIZE_NORMAL + show_messages = 1 + blood_sprite_state = "uniformblood" + + var/has_sensor = 1 //For the crew computer 2 = unable to change mode + var/sensor_mode = 0 + /* + 1 = Report living/dead + 2 = Report detailed damages + 3 = Report location + */ + var/displays_id = 1 + var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled + sprite_sheets = list( + SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', + SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' + ) + + //convenience var for defining the icon state for the overlay used when the clothing is worn. + //Also used by rolling/unrolling. + var/worn_state = null + valid_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_DECOR\ + |ACCESSORY_SLOT_MEDAL\ + |ACCESSORY_SLOT_INSIGNIA\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + restricted_accessory_slots = (\ + ACCESSORY_SLOT_UTILITY\ + |ACCESSORY_SLOT_WEAPON\ + |ACCESSORY_SLOT_ARMBAND\ + |ACCESSORY_SLOT_TIE\ + |ACCESSORY_SLOT_RANK\ + |ACCESSORY_SLOT_DEPT\ + |ACCESSORY_SLOT_OVER) + + var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' + var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(LAZYLEN(accessories)) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return + ..() + +/obj/item/clothing/under/New() + ..() + if(worn_state) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + worn_state = icon_state + + //autodetect rollability + if(rolled_down < 0) + if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) + rolled_down = 0 + + if(rolled_down == -1) + verbs -= /obj/item/clothing/under/verb/rollsuit + if(rolled_sleeves == -1) + verbs -= /obj/item/clothing/under/verb/rollsleeves + +/obj/item/clothing/under/proc/update_rolldown_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_icon)) + under_icon = rolled_down_icon + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) + if(rolled_down != 1) + rolled_down = 0 + else + rolled_down = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/proc/update_rollsleeves_status() + var/mob/living/carbon/human/H + if(istype(src.loc, /mob/living/carbon/human)) + H = src.loc + + var/icon/under_icon + if(icon_override) + under_icon = icon_override + else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) + under_icon = sprite_sheets[H.species.get_bodytype(H)] + else if(LAZYACCESS(item_icons, slot_w_uniform_str)) + under_icon = item_icons[slot_w_uniform_str] + else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) + under_icon = rolled_down_sleeves_icon + else + under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) + + // The _s is because the icon update procs append it. + if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) + if(rolled_sleeves != 1) + rolled_sleeves = 0 + else + rolled_sleeves = -1 + if(H) update_clothing_icon() + +/obj/item/clothing/under/update_clothing_icon() + if (ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_w_uniform() + + set_clothing_index() + + +/obj/item/clothing/under/examine(mob/user) + . = ..() + switch(src.sensor_mode) + if(0) + . += "Its sensors appear to be disabled." + if(1) + . += "Its binary life sensors appear to be enabled." + if(2) + . += "Its vital tracker appears to be enabled." + if(3) + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) + var/mob/M = usr + if (istype(M, /mob/observer)) return + if (usr.stat || usr.restrained()) return + if(has_sensor >= 2) + to_chat(usr, "The controls are locked.") + return 0 + if(has_sensor <= 0) + to_chat(usr, "This suit does not have any sensors.") + return 0 + + var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") + var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) + if(get_dist(usr, src) > 1) + to_chat(usr, "You have moved too far away.") + return + sensor_mode = modes.Find(switchMode) - 1 + + if (src.loc == usr) + switch(sensor_mode) + if(0) + usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") + if(1) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") + if(2) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") + if(3) + usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") + + else if (istype(src.loc, /mob)) + usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") + +/obj/item/clothing/under/verb/toggle() + set name = "Toggle Suit Sensors" + set category = "Object" + set src in usr + set_sensors(usr) + +/obj/item/clothing/under/verb/rollsuit() + set name = "Roll Down Jumpsuit" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rolldown_status() + if(rolled_down == -1) + to_chat(usr, "You cannot roll down [src]!") + return + if((rolled_sleeves == 1) && !(rolled_down)) + rolled_sleeves = 0 + + rolled_down = !rolled_down + if(rolled_down) + body_parts_covered = initial(body_parts_covered) + body_parts_covered &= ~(UPPER_TORSO|ARMS) + if(worn_state in cached_icon_states(rolled_down_icon)) + icon_override = rolled_down_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") + + to_chat(usr, "You roll down your [src].") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll up your [src].") + update_clothing_icon() + +/obj/item/clothing/under/verb/rollsleeves() + set name = "Roll Up Sleeves" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + + update_rollsleeves_status() + if(rolled_sleeves == -1) + to_chat(usr, "You cannot roll up your [src]'s sleeves!") + return + if(rolled_down == 1) + to_chat(usr, "You must roll up your [src] first!") + return + + rolled_sleeves = !rolled_sleeves + if(rolled_sleeves) + body_parts_covered &= ~(ARMS) + if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) + icon_override = rolled_down_sleeves_icon + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + else + LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") + to_chat(usr, "You roll up your [src]'s sleeves.") + else + body_parts_covered = initial(body_parts_covered) + if(icon_override == rolled_down_sleeves_icon) + icon_override = initial(icon_override) + LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) + to_chat(usr, "You roll down your [src]'s sleeves.") + update_clothing_icon() + +/obj/item/clothing/under/rank/New() + sensor_mode = pick(0,1,2,3) + ..() +>>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm index 6dd1c3b7d4..47094c4f98 100644 --- a/code/modules/clothing/spacesuits/void/ert_vr.dm +++ b/code/modules/clothing/spacesuits/void/ert_vr.dm @@ -239,4 +239,9 @@ SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi', SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi' ) +<<<<<<< HEAD sprite_sheets_refit = list() //have to nullify this as well just to be thorough +||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks + sprite_sheets_refit = list() //have to nullify this as well just to be thorough +======= +>>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 9d1f4e7c90..a47fd885cd 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -14,18 +14,8 @@ //Species-specific stuff. species_restricted = list("Human", "Promethean") - sprite_sheets_refit = list( - SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/head/mob_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi' - //Teshari have a general sprite sheet defined in modules/clothing/clothing.dm - ) - sprite_sheets_obj = list( - SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/head/item_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi', - SPECIES_TESHARI = 'icons/inventory/head/item_teshari.dmi' - ) + sprite_sheets = VR_SPECIES_SPRITE_SHEETS_HEAD_MOB + sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM light_overlay = "helmet_light" var/no_cycle = FALSE //stop this item from being put in a cycler @@ -44,18 +34,8 @@ max_pressure_protection = 10 * ONE_ATMOSPHERE species_restricted = list("Human", SPECIES_SKRELL, "Promethean") - sprite_sheets_refit = list( - SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/suit/mob_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi' - //Teshari have a general sprite sheet defined in modules/clothing/clothing.dm - ) - sprite_sheets_obj = list( - SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi', - SPECIES_TAJ = 'icons/inventory/suit/item_tajaran.dmi', - SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi', - SPECIES_TESHARI = 'icons/inventory/suit/item_teshari.dmi' - ) + sprite_sheets = VR_SPECIES_SPRITE_SHEETS_SUIT_MOB + sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM //Breach thresholds, should ideally be inherited by most (if not all) voidsuits. //With 0.2 resiliance, will reach 10 breach damage after 3 laser carbine blasts or 8 smg hits. diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index eb78925427..4f166e61e8 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -7,20 +7,10 @@ /obj/item/clothing/head/helmet/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - sprite_sheets = VR_SPECIES_SPRITE_SHEETS_HEAD_MOB - sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM /obj/item/clothing/suit/space/void species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - sprite_sheets = VR_SPECIES_SPRITE_SHEETS_SUIT_MOB - sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM - // This is a hack to prevent the item_state variable on the suits from taking effect - // when the item is equipped in outer clothing slot. - // This variable is normally used to set the icon_override when the suit is refitted, - // however the species spritesheet now means we no longer need that anyway! - sprite_sheets_refit = list() - /obj/item/clothing/head/helmet/space/void/heck name = "\improper H.E.C.K. helmet" desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from \[REDACTED\]. It wasn't enough for its last owner." @@ -106,7 +96,6 @@ default_worn_icon = 'icons/inventory/suit/mob_vr.dmi' sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB sprite_sheets_obj = null - sprite_sheets_refit = null /obj/item/clothing/suit/space/void/autolok/Initialize() . = ..() @@ -162,4 +151,11 @@ default_worn_icon = 'icons/inventory/head/mob_vr.dmi' sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB sprite_sheets_obj = null +<<<<<<< HEAD sprite_sheets_refit = null +||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks + sprite_sheets_refit = null + +======= + +>>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index 7dab89d1d7..bcef9752ac 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -7,7 +7,6 @@ unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles! armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 - sprite_sheets_refit = null sprite_sheets_obj = null wizard_garb = 1 @@ -20,6 +19,5 @@ unacidable = TRUE armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 - sprite_sheets_refit = null sprite_sheets_obj = null wizard_garb = 1 From 6b785cb0deec3f22cbc5a5029e0065fe7fef0336 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Tue, 20 Jul 2021 09:12:26 -0400 Subject: [PATCH 10/86] Merge pull request #11174 from Very-Soft/smoletweak Smole gateway tweak --- code/modules/awaymissions/gateway.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 1fa45f6a10..9e8967732e 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -176,6 +176,8 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) //VOREStation Addition Start: Abduction! if(istype(M, /mob/living) && dest.abductor) var/mob/living/L = M + if(L.nutrition > 500) + L.nutrition = 500 //If the aim is to negate people overpreparing, then they shouldn't be able to stuff themselves full of food either. //Situations to get the mob out of if(L.buckled) L.buckled.unbuckle_mob() From 60bc7333ea2def8ebe21408ab9de8cb74b8ec4db Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 10:42:20 -0400 Subject: [PATCH 12/86] Merge pull request #11168 from Heroman3003/emptylines Fixes some more potential issues with empty lines on examine with pAIs --- code/modules/vore/eating/living_vr.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index d69ccb25b9..a5bd3eff04 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -319,8 +319,11 @@ var/list/message_list = list() for (var/belly in vore_organs) var/obj/belly/B = belly - message_list += B.get_examine_msg() - message_list += B.get_examine_msg_absorbed() + var/bellymessage = B.get_examine_msg() + if(bellymessage) message_list += bellymessage + + bellymessage = B.get_examine_msg_absorbed() + if(bellymessage) message_list += bellymessage return message_list From 66669af98db6427f5c34fcb10aec2b0cbea38788 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 10:45:40 -0400 Subject: [PATCH 14/86] Merge pull request #11170 from Heroman3003/thepurge Finishes purge of Industrial Expansion --- code/game/objects/random/mapping.dm | 12 ++++---- code/modules/mining/alloys.dm | 3 +- code/modules/mining/drilling/drill.dm | 10 +++---- code/modules/mining/drilling/scanner.dm | 8 +++--- code/modules/mining/mine_turfs.dm | 8 +++--- code/modules/mining/ore.dm | 8 +++--- code/modules/mining/ore_datum.dm | 7 +++-- code/modules/random_map/noise/ore.dm | 36 ++++++++++++------------ maps/expedition_vr/aerostat/_aerostat.dm | 3 +- maps/tether/tether_turfs.dm | 11 +------- 10 files changed, 49 insertions(+), 57 deletions(-) diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 06a5e75fd1..f61567d6de 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -464,7 +464,7 @@ /obj/random/multiple/ore_pile/item_to_spawn() return pick( - prob(10);list( + /*prob(10);list( /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite, @@ -475,7 +475,7 @@ /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite, /obj/item/weapon/ore/bauxite - ), + ),*/ prob(10);list( /obj/item/weapon/ore/coal, /obj/item/weapon/ore/coal, @@ -488,7 +488,7 @@ /obj/item/weapon/ore/coal, /obj/item/weapon/ore/coal ), - prob(10);list( + /*prob(10);list( /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper, @@ -499,7 +499,7 @@ /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper, /obj/item/weapon/ore/copper - ), + ),*/ prob(3);list( /obj/item/weapon/ore/diamond, /obj/item/weapon/ore/diamond, @@ -598,11 +598,11 @@ prob(2);list( /obj/item/weapon/ore/verdantium, /obj/item/weapon/ore/verdantium - ), + ),/* prob(2);list( /obj/item/weapon/ore/void_opal, /obj/item/weapon/ore/void_opal - ), + ),*/ ) /obj/random/multiple/corp_crate diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm index 219a2becdb..4ca7e64571 100644 --- a/code/modules/mining/alloys.dm +++ b/code/modules/mining/alloys.dm @@ -44,7 +44,7 @@ "sand" = 2 ) product = /obj/item/stack/material/glass/phoronglass - +/* /datum/alloy/bronze metaltag = "bronze" requires = list( @@ -52,3 +52,4 @@ "tin" = 1 ) product = /obj/item/stack/material/bronze +*/ \ No newline at end of file diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index f1b8816c8a..b8618ccf86 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -28,9 +28,9 @@ "hydrogen" = /obj/item/weapon/ore/hydrogen, "silicates" = /obj/item/weapon/ore/glass, "carbon" = /obj/item/weapon/ore/coal, - "copper" = /obj/item/weapon/ore/copper, + // "copper" = /obj/item/weapon/ore/copper, // "tin" = /obj/item/weapon/ore/tin, - "bauxite" = /obj/item/weapon/ore/bauxite, + // "bauxite" = /obj/item/weapon/ore/bauxite, "rutile" = /obj/item/weapon/ore/rutile ) @@ -44,14 +44,14 @@ // Found with an advanced laser. exotic_drilling >= 1 var/list/ore_types_uncommon = list( MAT_MARBLE = /obj/item/weapon/ore/marble, - "painite" = /obj/item/weapon/ore/painite, - "quartz" = /obj/item/weapon/ore/quartz, + //"painite" = /obj/item/weapon/ore/painite, + //"quartz" = /obj/item/weapon/ore/quartz, MAT_LEAD = /obj/item/weapon/ore/lead ) // Found with an ultra laser. exotic_drilling >= 2 var/list/ore_types_rare = list( - "void opal" = /obj/item/weapon/ore/void_opal, + //"void opal" = /obj/item/weapon/ore/void_opal, MAT_VERDANTIUM = /obj/item/weapon/ore/verdantium ) diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index 302216b8d4..9d6eea4607 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -41,13 +41,13 @@ var/ore_type switch(metal) - if("silicates", "carbon", "marble", "quartz") ore_type = "surface minerals" - if("hematite", "tin", "copper", "bauxite", "lead") ore_type = "industrial metals" + if("silicates", "carbon", "marble", /*"quartz"*/) ore_type = "surface minerals" + if("hematite", /*"tin", "copper", "bauxite",*/ "lead") ore_type = "industrial metals" if("gold", "silver", "rutile") ore_type = "precious metals" - if("diamond", "painite") ore_type = "precious gems" + if("diamond", /*"painite"*/) ore_type = "precious gems" if("uranium") ore_type = "nuclear fuel" if("phoron", "osmium", "hydrogen") ore_type = "exotic matter" - if("verdantium", "void opal") ore_type = "anomalous matter" + if("verdantium", /*"void opal"*/) ore_type = "anomalous matter" if(ore_type) metals[ore_type] += T.resources[metal] diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 9155f054a4..174fb7ad91 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -63,9 +63,9 @@ var/list/mining_overlay_cache = list() "verdantium" = /obj/item/weapon/ore/verdantium, "marble" = /obj/item/weapon/ore/marble, "lead" = /obj/item/weapon/ore/lead, - "copper" = /obj/item/weapon/ore/copper, +// "copper" = /obj/item/weapon/ore/copper, // "tin" = /obj/item/weapon/ore/tin, - "bauxite" = /obj/item/weapon/ore/bauxite, +// "bauxite" = /obj/item/weapon/ore/bauxite, // "void opal" = /obj/item/weapon/ore/void_opal, // "painite" = /obj/item/weapon/ore/painite, // "quartz" = /obj/item/weapon/ore/quartz, @@ -689,10 +689,10 @@ var/list/mining_overlay_cache = list() var/mineral_name if(rare_ore) - mineral_name = pickweight(list("marble" = 5,/* "quartz" = 15,*/ "copper" = 10, /*"tin" = 5,*/ "bauxite" = 5, "uranium" = 15, "platinum" = 20, "hematite" = 15, "rutile" = 20, "carbon" = 15, "diamond" = 3, "gold" = 15, "silver" = 15, "phoron" = 25, "lead" = 5,/* "void opal" = 1,*/ "verdantium" = 2/*, "painite" = 1*/)) + mineral_name = pickweight(list("marble" = 5,/* "quartz" = 15, "copper" = 10, "tin" = 5, "bauxite" = 5*/, "uranium" = 15, "platinum" = 20, "hematite" = 15, "rutile" = 20, "carbon" = 15, "diamond" = 3, "gold" = 15, "silver" = 15, "phoron" = 25, "lead" = 5,/* "void opal" = 1,*/ "verdantium" = 2/*, "painite" = 1*/)) else - mineral_name = pickweight(list("marble" = 3,/* "quartz" = 10,*/ "copper" = 20, /*"tin" = 15,*/ "bauxite" = 15, "uranium" = 10, "platinum" = 10, "hematite" = 70, "rutile" = 15, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 3,/* "void opal" = 1,*/ "verdantium" = 1/*, "painite" = 1*/)) + mineral_name = pickweight(list("marble" = 3,/* "quartz" = 10, "copper" = 20, "tin" = 15, "bauxite" = 15*/, "uranium" = 10, "platinum" = 10, "hematite" = 70, "rutile" = 15, "carbon" = 70, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20, "lead" = 3,/* "void opal" = 1,*/ "verdantium" = 1/*, "painite" = 1*/)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index dc95d0e082..4fc2091b03 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -106,7 +106,7 @@ icon_state = "ore_lead" material = MAT_LEAD origin_tech = list(TECH_MATERIAL = 3) - +/* /obj/item/weapon/ore/copper name = "raw copper" icon_state = "ore_copper" @@ -121,12 +121,12 @@ name = "raw bauxite" icon_state = "ore_bauxite" material = "bauxite" - +*/ /obj/item/weapon/ore/rutile name = "raw rutile" icon_state = "ore_rutile" material = "rutile" - +/* /obj/item/weapon/ore/void_opal name = "raw void opal" icon_state = "ore_void_opal" @@ -141,7 +141,7 @@ name = "raw quartz" icon_state = "ore_quartz" material = "quartz" - +*/ /obj/item/weapon/ore/slag name = "Slag" desc = "Someone screwed up..." diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 5a26dcf0fd..382e31b8bd 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -175,7 +175,7 @@ ore = /obj/item/weapon/ore/lead scan_icon = "mineral_rare" reagent = "lead" - +/* /ore/copper name = "copper" display_name = "copper" @@ -215,7 +215,7 @@ ore = /obj/item/weapon/ore/bauxite scan_icon = "mineral_common" reagent = "aluminum" - +*/ /ore/rutile name = "rutile" display_name = "rutile" @@ -225,7 +225,7 @@ alloy = 1 ore = /obj/item/weapon/ore/rutile scan_icon = "mineral_uncommon" - +/* /ore/painite name = "painite" display_name = "rough painite" @@ -243,3 +243,4 @@ spread_chance = 1 ore = /obj/item/weapon/ore/void_opal scan_icon = "mineral_rare" +*/ \ No newline at end of file diff --git a/code/modules/random_map/noise/ore.dm b/code/modules/random_map/noise/ore.dm index 4881154d60..112a01b493 100644 --- a/code/modules/random_map/noise/ore.dm +++ b/code/modules/random_map/noise/ore.dm @@ -64,13 +64,13 @@ T.resources["hydrogen"] = 0 T.resources["verdantium"] = 0 T.resources["lead"] = 0 - T.resources["copper"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - T.resources["tin"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) - T.resources["bauxite"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) + //T.resources["copper"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) + //T.resources["tin"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) + //T.resources["bauxite"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["rutile"] = 0 - T.resources["void opal"] = 0 - T.resources["quartz"] = 0 - T.resources["painite"] = 0 + //T.resources["void opal"] = 0 + //T.resources["quartz"] = 0 + //T.resources["painite"] = 0 else if(current_cell < deep_val) // Rare metals. T.resources["gold"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) T.resources["silver"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) @@ -83,13 +83,13 @@ T.resources["diamond"] = 0 T.resources["hematite"] = 0 T.resources["marble"] = 0 - T.resources["copper"] = 0 - T.resources["tin"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) - T.resources["bauxite"] = 0 + //T.resources["copper"] = 0 + //T.resources["tin"] = rand(RESOURCE_MID_MIN, RESOURCE_MID_MAX) + //T.resources["bauxite"] = 0 T.resources["rutile"] = rand(RESOURCE_LOW_MIN, RESOURCE_MID_MAX) - T.resources["void opal"] = 0 - T.resources["quartz"] = 0 - T.resources["painite"] = 0 + //T.resources["void opal"] = 0 + //T.resources["quartz"] = 0 + //T.resources["painite"] = 0 else // Deep metals. T.resources["uranium"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) T.resources["diamond"] = rand(RESOURCE_LOW_MIN, RESOURCE_LOW_MAX) @@ -102,13 +102,13 @@ T.resources["hematite"] = 0 T.resources["gold"] = 0 T.resources["silver"] = 0 - T.resources["copper"] = 0 - T.resources["tin"] = 0 - T.resources["bauxite"] = 0 + //T.resources["copper"] = 0 + //T.resources["tin"] = 0 + //T.resources["bauxite"] = 0 T.resources["rutile"] = rand(RESOURCE_MID_MIN, RESOURCE_HIGH_MAX) - T.resources["void opal"] = 0 - T.resources["quartz"] = 0 - T.resources["painite"] = 0 + //T.resources["void opal"] = 0 + //T.resources["quartz"] = 0 + //T.resources["painite"] = 0 return /datum/random_map/noise/ore/get_map_char(var/value) diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm index 09b5eb3632..04d3b4ad82 100644 --- a/maps/expedition_vr/aerostat/_aerostat.dm +++ b/maps/expedition_vr/aerostat/_aerostat.dm @@ -133,7 +133,7 @@ VIRGO2_TURF_CREATE(/turf/simulated/mineral) if(mineral) return - var/mineral_name = pickweight(list("marble" = 5, "uranium" = 5, "platinum" = 5, "hematite" = 5, "carbon" = 5, "diamond" = 5, "gold" = 5, "silver" = 5, "lead" = 5, "verdantium" = 5, "rutile" = 10, "copper" = 5, "tin" = 5, "bauxite" = 5)) + var/mineral_name = pickweight(list("marble" = 5, "uranium" = 5, "platinum" = 5, "hematite" = 5, "carbon" = 5, "diamond" = 5, "gold" = 5, "silver" = 5, "lead" = 5, "verdantium" = 5, "rutile" = 20)) if(mineral_name && (mineral_name in GLOB.ore_data)) mineral = GLOB.ore_data[mineral_name] @@ -211,4 +211,3 @@ VIRGO2_TURF_CREATE(/turf/simulated/floor/hull) name = "V4 Outpost - Power Room" /area/tether_away/aerostat/surface/outpost/guardpost name = "V4 Outpost - Guard Post" - \ No newline at end of file diff --git a/maps/tether/tether_turfs.dm b/maps/tether/tether_turfs.dm index e10c6a5fe0..0bf0ef290f 100644 --- a/maps/tether/tether_turfs.dm +++ b/maps/tether/tether_turfs.dm @@ -69,10 +69,6 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) "uranium" = 10, "platinum" = 10, "hematite" = 20, - "copper" = 8, -// "tin" = 4, - "bauxite" = 4, - "rutile" = 4, "carbon" = 20, "diamond" = 1, "gold" = 8, @@ -86,10 +82,6 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) "uranium" = 5, "platinum" = 5, "hematite" = 35, - "copper" = 15, -// "tin" = 10, - "bauxite" = 10, - "rutile" = 10, "carbon" = 35, "gold" = 3, "silver" = 3, @@ -272,7 +264,7 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) new_junction |= (1<<5) icon_state = "[base_icon_state]-[new_junction]" - + add_vis_overlay('icons/effects/effects.dmi', "white", plane = SPACE_PLANE, add_vis_flags = VIS_INHERIT_ID|VIS_UNDERLAY) /turf/space/v3b_midpoint/Initialize() @@ -283,4 +275,3 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) . = ..() for(var/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b/F in src) qdel(F) - \ No newline at end of file From cbb54c7c7e21d6d75fad35b517b446331f2c3db2 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 10:46:35 -0400 Subject: [PATCH 16/86] Merge pull request #11171 from Heroman3003/paifix Should allow pAI to resize uncapped in dorms (as well as any other user of Set Size) --- code/modules/vore/resizing/resize_vr.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 3d7086f9c3..ec2aead7de 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -78,7 +78,7 @@ var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard) if(guard) qdel(guard) - + if(size_multiplier == new_size) return 1 @@ -143,7 +143,7 @@ var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or 1% to 600% in dormitories). (DO NOT ABUSE)" var/new_size = input(nagmessage, "Pick a Size") as num|null if(size_range_check(new_size)) - resize(new_size/100) + resize(new_size/100, uncapped = has_large_resize_bounds(), ignore_prefs = TRUE) // I'm not entirely convinced that `src ? ADMIN_JMP(src) : "null"` here does anything // but just in case it does, I'm leaving the null-src checking message_admins("[key_name(src)] used the resize command in-game to be [new_size]% size. [src ? ADMIN_JMP(src) : "null"]") From 16673f8a2b76a32db569c4690a48802d47a454f7 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 14:50:49 +0000 Subject: [PATCH 18/86] Adds xenochimera water breathing trait + refactors water breathing --- .../carbon/human/species/outsider/event.dm | 6 +----- .../carbon/human/species/shadekin/shadekin.dm | 4 +--- .../living/carbon/human/species/species.dm | 3 ++- .../carbon/human/species/station/alraune.dm | 4 +--- .../carbon/human/species/station/blank_vr.dm | 6 ------ .../carbon/human/species/station/station.dm | 5 ++--- .../human/species/station/station_vr.dm | 21 ++++++++++++------- .../species/station/traits_vr/positive.dm | 1 + .../species/station/xenochimera_trait_vr.dm | 11 +++++++++- 9 files changed, 31 insertions(+), 30 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm index f88768aa74..32c3314b0b 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/event.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm @@ -112,7 +112,6 @@ Variables you may want to make use of are: ) var/use_bodyshape = SPECIES_HUMAN - var/waterbreathing = 0 var/overcome_gravity = 0 var/hover = 0 @@ -199,7 +198,7 @@ Variables you may want to make use of are: /datum/species/event1/proc/toggle_cloning() flags ^= NO_SCAN - + /datum/species/event1/proc/toggle_defibbing() flags ^= NO_DEFIB @@ -215,9 +214,6 @@ Variables you may want to make use of are: /datum/species/event1/get_bodytype(var/mob/living/carbon/human/H) //Default to human sprites, if they're based on another species, var edit use_bodyshape to the correct thing in _defines/mobs.dm of the species you want to use. return use_bodyshape -/datum/species/event1/can_breathe_water() - return waterbreathing - /datum/species/event1/can_overcome_gravity(var/mob/living/carbon/human/H) return overcome_gravity diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index 5cf9fa8f73..2e589f3fbb 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -74,6 +74,7 @@ breath_type = null poison_type = null + water_breather = TRUE //They don't quite breathe vision_flags = SEE_SELF|SEE_MOBS appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR @@ -135,9 +136,6 @@ /datum/species/shadekin/handle_environment_special(var/mob/living/carbon/human/H) handle_shade(H) -/datum/species/shadekin/can_breathe_water() - return TRUE //they dont quite breathe - /datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H) ..() add_shadekin_abilities(H) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d63681898d..b93a56b3db 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -132,6 +132,7 @@ var/breath_type = "oxygen" // Non-oxygen gas breathed, if any. var/poison_type = "phoron" // Poisonous air. var/exhale_type = "carbon_dioxide" // Exhaled gas type. + var/water_breather = FALSE var/body_temperature = 310.15 // Species will try to stabilize at this temperature. (also affects temperature processing) @@ -504,7 +505,7 @@ // Called when lying down on a water tile. /datum/species/proc/can_breathe_water() - return FALSE + return water_breather // Impliments different trails for species depending on if they're wearing shoes. /datum/species/proc/get_move_trail(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index e7151b9608..bb788ad5b3 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -24,6 +24,7 @@ breath_type = "oxygen" poison_type = "phoron" exhale_type = "oxygen" + water_breather = TRUE //eh, why not? Aquatic plants are a thing. // Heat and cold resistances are 20 degrees broader on the level 1 range, level 2 is default, level 3 is much weaker, halfway between L2 and normal L3. // Essentially, they can tolerate a broader range of comfortable temperatures, but suffer more at extremes. @@ -92,9 +93,6 @@ A_FRUIT = /obj/item/organ/internal/fruitgland, ) -/datum/species/alraune/can_breathe_water() - return TRUE //eh, why not? Aquatic plants are a thing. - /datum/species/alraune/handle_environment_special(var/mob/living/carbon/human/H) if(H.inStasisNow()) // if they're in stasis, they won't need this stuff. diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index af626ee68b..2962b30fc5 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -60,12 +60,6 @@ // Stub species overrides for shoving trait abilities into -//Called when face-down in the water or otherwise over their head. -// Return: TRUE for able to breathe fine in water. -/datum/species/custom/can_breathe_water() - return /datum/trait/positive/water_breather in traits - - //Called during handle_environment in Life() ticks. // Return: Not used. /datum/species/custom/handle_environment_special(var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 1bd96fae47..21a5efb14a 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -349,6 +349,8 @@ reagent_tag = IS_SKRELL allergens = ALLERGEN_MEAT|ALLERGEN_FISH|ALLERGEN_DAIRY|ALLERGEN_EGGS + water_breather = TRUE + has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), @@ -363,9 +365,6 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) ) -/datum/species/skrell/can_breathe_water() - return TRUE - /datum/species/zaddat name = SPECIES_ZADDAT name_plural = "Zaddat" diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 6b51d9db8a..03b9987385 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -112,13 +112,12 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + water_breather = TRUE + flesh_color = "#AFA59E" base_color = "#777777" blood_color = "#1D2CBF" -/datum/species/akula/can_breathe_water() - return TRUE // Surprise, SHERKS. - /datum/species/nevrean name = SPECIES_NEVREAN name_plural = "Nevreans" @@ -323,7 +322,7 @@ /datum/species/zaddat spawn_flags = SPECIES_CAN_JOIN min_age = 18 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose gluttonous = 0 genders = list(MALE, FEMALE, PLURAL, NEUTER) descriptors = list() @@ -373,8 +372,16 @@ /datum/species/vox gluttonous = 0 +<<<<<<< HEAD spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit min_age = 18 +||||||| parent of e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + min_age = 18 +======= + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + min_age = 18 +>>>>>>> e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' @@ -504,6 +511,7 @@ breath_type = null poison_type = null + water_breather = TRUE //They do not quite breathe... appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_UNDERWEAR @@ -534,12 +542,9 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/crewkin) ) -/datum/species/shadekin/get_bodytype() +/datum/species/crew_shadekin/get_bodytype() return SPECIES_SHADEKIN -/datum/species/shadekin/can_breathe_water() - return TRUE //they dont quite breathe - //These species are not really species but are just there for custom species selection /datum/species/fl_zorren diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm index 171ded07f8..8e068aee2a 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -209,3 +209,4 @@ name = "Water Breather" desc = "You can breathe under water." cost = 1 + var_changes = list("water_breather" = 1) diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm index 2065d91cc4..bd1eb55172 100644 --- a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm @@ -1,4 +1,4 @@ -/* +/* ** For now, these are just neutral traits for Xenochimera only to take. ** These are only traits that they should reasonably be able to evolve to acquire themselves. ** I won't add the resistances though because those are kinda lame for a 'chimera to take! @@ -49,3 +49,12 @@ cost = 0 category = 0 custom_only = FALSE + +/datum/trait/positive/water_breather/xenochimera + sort = TRAIT_SORT_SPECIES + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Water Breather" + desc = "You can breathe under water." + cost = 0 + category = 0 + custom_only = FALSE \ No newline at end of file From 7437154387f5328f8f69ab49d5e903cf013c12ef Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 15:03:10 +0000 Subject: [PATCH 19/86] Allows hiding mobs/areas from observers without completely forbidding --- code/game/objects/effects/landmarks.dm | 9 + code/modules/mob/dead/observer/observer.dm | 2000 ++++++++++++++++++++ maps/~map_system/maps.dm | 1 + 3 files changed, 2010 insertions(+) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 3a60ef5480..82070a520a 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -123,6 +123,15 @@ else log_error("[type] mapped in but no using_map") +/obj/effect/landmark/hidden_level + delete_me = 1 +/obj/effect/landmark/hidden_level/Initialize() + . = ..() + if(using_map) + using_map.hidden_levels |= z + else + log_error("[type] mapped in but no using_map") + /obj/effect/landmark/virtual_reality name = "virtual_reality" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9e80b75da5..7566448252 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -994,3 +995,2002 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() +||||||| parent of bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/mob/observer/dead + name = "ghost" + desc = "It's a g-g-g-g-ghooooost!" //jinkies! + icon = 'icons/mob/ghost.dmi' + icon_state = "ghost" + stat = DEAD + canmove = 0 + blinded = 0 + anchored = TRUE // don't get pushed around + + var/can_reenter_corpse + var/datum/hud/living/carbon/hud = null // hud + var/bootime = 0 + var/started_as_observer //This variable is set to 1 when you enter the game as an observer. + //If you died in the game and are a ghsot - this will remain as null. + //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/medHUD = 0 + var/secHUD = 0 + var/antagHUD = 0 + universal_speak = 1 + var/atom/movable/following = null + var/admin_ghosted = 0 + var/anonsay = 0 + var/ghostvision = 1 //is the ghost able to see things humans can't? + incorporeal_move = 1 + + var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. + var/ghost_sprite = null + var/global/list/possible_ghost_sprites = list( + "Clear" = "blank", + "Green Blob" = "otherthing", + "Bland" = "ghost", + "Robed-B" = "ghost1", + "Robed-BAlt" = "ghost2", + "King" = "ghostking", + "Shade" = "shade", + "Hecate" = "ghost-narsie", + "Glowing Statue" = "armour", + "Artificer" = "artificer", + "Behemoth" = "behemoth", + "Harvester" = "harvester", + "Wraith" = "wraith", + "Viscerator" = "viscerator", + "Corgi" = "corgi", + "Tamaskan" = "tamaskan", + "Black Cat" = "blackcat", + "Lizard" = "lizard", + "Goat" = "goat", + "Space Bear" = "bear", + "Bats" = "bat", + "Chicken" = "chicken_white", + "Parrot"= "parrot_fly", + "Goose" = "goose", + "Penguin" = "penguin", + "Brown Crab" = "crab", + "Gray Crab" = "evilcrab", + "Trout" = "trout-swim", + "Salmon" = "salmon-swim", + "Pike" = "pike-swim", + "Koi" = "koi-swim", + "Carp" = "carp", + "Red Robes" = "robe_red", + "Faithless" = "faithless", + "Shadowform" = "forgotten", + "Dark Ethereal" = "bloodguardian", + "Holy Ethereal" = "lightguardian", + "Red Elemental" = "magicRed", + "Blue Elemental" = "magicBlue", + "Pink Elemental" = "magicPink", + "Orange Elemental" = "magicOrange", + "Green Elemental" = "magicGreen", + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" + ) + var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. + var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns + +/mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + see_invisible = SEE_INVISIBLE_OBSERVER + see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... + + var/turf/T + if(ismob(body)) + T = get_turf(body) //Where is the body located? + attack_log = body.attack_log //preserve our attack logs by copying them to our ghost + gender = body.gender + if(body.mind && body.mind.name) + name = body.mind.name + else + if(body.real_name) + name = body.real_name + else + if(gender == MALE) + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position + forceMove(T) + + if(!name) //To prevent nameless ghosts + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + real_name = name + animate(src, pixel_y = 2, time = 10, loop = -1) + observer_mob_list += src + ..() + +/mob/observer/dead/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + if(href_list["reenter"]) + reenter_corpse() + return + +/mob/observer/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/book/tome)) + var/mob/observer/dead/M = src + M.manifest(user) + +/mob/observer/dead/CanPass(atom/movable/mover, turf/target) + return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + +/mob/observer/dead/examine_icon() + var/icon/I = get_cached_examine_icon(src) + if(!I) + I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) + set_cached_examine_icon(src, I, 200 SECONDS) + return I + +/mob/observer/dead/examine(mob/user) + . = ..() + + if(is_admin(user)) + . += "\t>[ADMIN_FULLMONTY(src)]" + +/* +Transfer_mind is there to check if mob is being deleted/not going to have a body. +Works together with spawning an observer, noted above. +*/ + +/mob/observer/dead/Life() + ..() + if(!loc) return + if(!client) return 0 + + handle_regular_hud_updates() + handle_vision() + +/mob/proc/ghostize(var/can_reenter_corpse = 1) + if(key) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.vr_holder && !can_reenter_corpse) + H.exit_vr() + return 0 + var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.timeofdeath = src.timeofdeath //BS12 EDIT + ghost.key = key + if(istype(loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = loc + M.update() + else if(istype(loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = loc + B.update() + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + return ghost + +/* +This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. +*/ +/mob/living/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + if(stat == DEAD && !forbid_seeing_deadchat) + announce_ghost_joinleave(ghostize(1)) + else + var/response + if(src.client && src.client.holder) + response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. + if(response != "Ghost") + return + resting = 1 + var/turf/location = get_turf(src) + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(!.) + M.stop_following() + + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + observer_mob_list -= src + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

    Crew Manifest

    " + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.add_overlay("pai-ghostalert") + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +======= +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/mob/observer/dead + name = "ghost" + desc = "It's a g-g-g-g-ghooooost!" //jinkies! + icon = 'icons/mob/ghost.dmi' + icon_state = "ghost" + stat = DEAD + canmove = 0 + blinded = 0 + anchored = TRUE // don't get pushed around + + var/can_reenter_corpse + var/datum/hud/living/carbon/hud = null // hud + var/bootime = 0 + var/started_as_observer //This variable is set to 1 when you enter the game as an observer. + //If you died in the game and are a ghsot - this will remain as null. + //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/medHUD = 0 + var/secHUD = 0 + var/antagHUD = 0 + universal_speak = 1 + var/atom/movable/following = null + var/admin_ghosted = 0 + var/anonsay = 0 + var/ghostvision = 1 //is the ghost able to see things humans can't? + incorporeal_move = 1 + + var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. + var/ghost_sprite = null + var/global/list/possible_ghost_sprites = list( + "Clear" = "blank", + "Green Blob" = "otherthing", + "Bland" = "ghost", + "Robed-B" = "ghost1", + "Robed-BAlt" = "ghost2", + "King" = "ghostking", + "Shade" = "shade", + "Hecate" = "ghost-narsie", + "Glowing Statue" = "armour", + "Artificer" = "artificer", + "Behemoth" = "behemoth", + "Harvester" = "harvester", + "Wraith" = "wraith", + "Viscerator" = "viscerator", + "Corgi" = "corgi", + "Tamaskan" = "tamaskan", + "Black Cat" = "blackcat", + "Lizard" = "lizard", + "Goat" = "goat", + "Space Bear" = "bear", + "Bats" = "bat", + "Chicken" = "chicken_white", + "Parrot"= "parrot_fly", + "Goose" = "goose", + "Penguin" = "penguin", + "Brown Crab" = "crab", + "Gray Crab" = "evilcrab", + "Trout" = "trout-swim", + "Salmon" = "salmon-swim", + "Pike" = "pike-swim", + "Koi" = "koi-swim", + "Carp" = "carp", + "Red Robes" = "robe_red", + "Faithless" = "faithless", + "Shadowform" = "forgotten", + "Dark Ethereal" = "bloodguardian", + "Holy Ethereal" = "lightguardian", + "Red Elemental" = "magicRed", + "Blue Elemental" = "magicBlue", + "Pink Elemental" = "magicPink", + "Orange Elemental" = "magicOrange", + "Green Elemental" = "magicGreen", + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" + ) + var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. + var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns + +/mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + see_invisible = SEE_INVISIBLE_OBSERVER + see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... + + var/turf/T + if(ismob(body)) + T = get_turf(body) //Where is the body located? + attack_log = body.attack_log //preserve our attack logs by copying them to our ghost + gender = body.gender + if(body.mind && body.mind.name) + name = body.mind.name + else + if(body.real_name) + name = body.real_name + else + if(gender == MALE) + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position + forceMove(T) + + if(!name) //To prevent nameless ghosts + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + real_name = name + animate(src, pixel_y = 2, time = 10, loop = -1) + observer_mob_list += src + ..() + +/mob/observer/dead/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + if(href_list["reenter"]) + reenter_corpse() + return + +/mob/observer/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/book/tome)) + var/mob/observer/dead/M = src + M.manifest(user) + +/mob/observer/dead/CanPass(atom/movable/mover, turf/target) + return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + +/mob/observer/dead/examine_icon() + var/icon/I = get_cached_examine_icon(src) + if(!I) + I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) + set_cached_examine_icon(src, I, 200 SECONDS) + return I + +/mob/observer/dead/examine(mob/user) + . = ..() + + if(is_admin(user)) + . += "\t>[ADMIN_FULLMONTY(src)]" + +/* +Transfer_mind is there to check if mob is being deleted/not going to have a body. +Works together with spawning an observer, noted above. +*/ + +/mob/observer/dead/Life() + ..() + if(!loc) return + if(!client) return 0 + + handle_regular_hud_updates() + handle_vision() + +/mob/proc/ghostize(var/can_reenter_corpse = 1) + if(key) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.vr_holder && !can_reenter_corpse) + H.exit_vr() + return 0 + var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.timeofdeath = src.timeofdeath //BS12 EDIT + ghost.key = key + if(istype(loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = loc + M.update() + else if(istype(loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = loc + B.update() + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + return ghost + +/* +This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. +*/ +/mob/living/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + if(stat == DEAD && !forbid_seeing_deadchat) + announce_ghost_joinleave(ghostize(1)) + else + var/response + if(src.client && src.client.holder) + response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. + if(response != "Ghost") + return + resting = 1 + var/turf/location = get_turf(src) + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(!.) + M.stop_following() + + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + observer_mob_list -= src + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

    Crew Manifest

    " + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.add_overlay("pai-ghostalert") + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +>>>>>>> bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 4a6b06fc77..12a31b74a1 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -35,6 +35,7 @@ var/list/all_maps = list() var/static/list/xenoarch_exempt_levels = list() //Z-levels exempt from xenoarch finds and digsites spawning. var/static/list/persist_levels = list() // Z-levels where SSpersistence should persist between rounds. Defaults to station_levels if unset. var/static/list/secret_levels = list() // Z-levels that (non-admin) ghosts can't get to + var/static/list/hidden_levels = list() // Z-levels who's contents are hidden, but not forbidden (gateways) var/static/list/empty_levels = list() // Empty Z-levels that may be used for various things var/static/list/vorespawn_levels = list() //Z-levels where players are allowed to vore latejoin to. //CHOMPedit: the number of missing chompedits is giving me an aneurysm var/static/list/mappable_levels = list()// List of levels where mapping or other similar devices might work fully From 82dfa37a0494fcaba17d5f18529e9851681094c6 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:17 -0400 Subject: [PATCH 20/86] Merge pull request #11185 from VOREStation/Arokha/protsynth Proteans are synthetic, yeah --- .../carbon/human/species/station/protean_vr/protean_blob.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 0830d10e83..3c0fbf3492 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -93,6 +93,9 @@ /mob/living/simple_mob/protean_blob/init_vore() return //Don't make a random belly, don't waste your time +/mob/living/simple_mob/protean_blob/isSynthetic() + return TRUE // yup + /mob/living/simple_mob/protean_blob/Stat() ..() if(humanform) From 2bcc08b16f3425af359a37bb8d32c2d117e3662a Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:12 -0400 Subject: [PATCH 22/86] Merge pull request #11184 from VOREStation/Fixes/11003 Fixes #11003 --- .../carbon/human/species/station/protean_vr/protean_blob.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 0830d10e83..7a3ace6da0 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -84,6 +84,12 @@ healing.expire() return ..() +/mob/living/simple_mob/protean_blob/say_understands(var/mob/other, var/datum/language/speaking = null) + // The parent of this proc and its parent are SHAMS and should be rewritten, but I'm not up to it right now. + if(!speaking) + return TRUE // can understand common, they're like, a normal person thing + return ..() + /mob/living/simple_mob/protean_blob/speech_bubble_appearance() return "synthetic" From aea925d17d535b1ffdbd66268b041e75326171a8 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:05 -0400 Subject: [PATCH 24/86] Merge pull request #11183 from VOREStation/Fixes/11167 Fixes #11167 --- icons/mob/pai_vr.dmi | Bin 157362 -> 166129 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/pai_vr.dmi b/icons/mob/pai_vr.dmi index 45ee85a06628f75e6a2e3be9d1712a0d008bcef2..0b8b985ff7c54a9b8aabe28d622755e628333ce0 100644 GIT binary patch literal 166129 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 literal 157362 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⩔ncUsXWp4oBe&a3H_7VEJlXz{y~bn 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 K&*U07hW!`tY}teW From 369afc60186ef310a30403f1b5ca4690259afe93 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:29:00 -0400 Subject: [PATCH 26/86] Merge pull request #11182 from VOREStation/Arokha/bucklefind Add code to trace recursive buckle issue --- code/game/objects/buckling.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index b0f4f4c2c1..484c51012e 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -54,6 +54,10 @@ if(!can_buckle_check(M, forced)) return FALSE + if(M == src) + stack_trace("Recursive buckle warning: [M] being buckled to self.") + return + M.buckled = src M.facing_dir = null M.set_dir(buckle_dir ? buckle_dir : dir) From 442c888d5e4ae351d6a748d1b137b7460aa2386b Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:28:52 -0400 Subject: [PATCH 28/86] Merge pull request #11181 from VOREStation/Arokha/farpaint Add art possibility to Virgo 2 surface outpost --- code/game/objects/structures/artstuff.dm | 6 ++++ maps/expedition_vr/aerostat/surface.dmm | 36 ++++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 2e2f4052b8..cbb95e955f 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -375,6 +375,12 @@ persistence_id = "library_private" req_one_access = list(access_library) +/obj/structure/sign/painting/away_areas // for very hard-to-get-to areas + name = "\improper Remote Painting Exhibit mounting" + desc = "For art pieces made in the depths of space." + desc_with_canvas = "A painting hung where only the determined can reach it." + persistence_id = "away_area" + /obj/structure/sign/painting/Initialize(mapload, dir, building) . = ..() if(persistence_id) diff --git a/maps/expedition_vr/aerostat/surface.dmm b/maps/expedition_vr/aerostat/surface.dmm index 6b519879a9..b60deeb4de 100644 --- a/maps/expedition_vr/aerostat/surface.dmm +++ b/maps/expedition_vr/aerostat/surface.dmm @@ -421,6 +421,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/eris/dark, /area/tether_away/aerostat/surface/outpost/cafe) +"nx" = ( +/obj/structure/sign/painting/away_areas{ + pixel_x = -32 + }, +/turf/simulated/floor/tiled/eris/bcircuit, +/area/tether_away/aerostat/surface/outpost/hallway) "nI" = ( /obj/structure/cable/cyan{ icon_state = "1-2" @@ -550,6 +556,13 @@ }, /turf/simulated/floor/plating/eris/under, /area/tether_away/aerostat/surface/outpost/powerroom) +"ru" = ( +/obj/structure/table/woodentable, +/obj/structure/sign/painting/away_areas{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/eris/dark, +/area/tether_away/aerostat/surface/outpost/cafe) "rA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -1116,6 +1129,13 @@ /obj/structure/medical_stand/anesthetic, /turf/simulated/floor/tiled/eris/bcircuit, /area/tether_away/aerostat/surface/outpost/backroom) +"GH" = ( +/obj/structure/table/woodentable, +/obj/structure/sign/painting/away_areas{ + pixel_x = 32 + }, +/turf/simulated/floor/wood, +/area/tether_away/aerostat/surface/outpost/barracks) "Ha" = ( /obj/structure/cable/cyan{ icon_state = "1-2" @@ -1402,6 +1422,8 @@ "ON" = ( /obj/structure/table/rack/shelf/steel, /obj/item/weapon/storage/box/glasses, +/obj/item/paint_brush, +/obj/item/paint_palette, /turf/simulated/floor/tiled/eris/dark/monofloor, /area/tether_away/aerostat/surface/outpost/cafe) "OT" = ( @@ -1550,6 +1572,8 @@ "Ur" = ( /obj/structure/table/rack/shelf/steel, /obj/item/weapon/storage/box/glasses/pint, +/obj/item/canvas/twentyfour_twentyfour, +/obj/item/canvas/nineteen_nineteen, /turf/simulated/floor/tiled/eris/dark/monofloor, /area/tether_away/aerostat/surface/outpost/cafe) "UC" = ( @@ -2602,9 +2626,9 @@ Ge QJ Zb br -zN -zN -zN +nx +nx +nx br zN dE @@ -5308,9 +5332,9 @@ gq dE zr WC +ru Ra -Ra -Ra +ru iu WF Oi @@ -6301,7 +6325,7 @@ Rw Bs sA nK -nK +GH tG gx gx From cf4df390475f8ca7e99718d001d1958a7208e43c Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 21:30:13 +0000 Subject: [PATCH 30/86] Update gateways --- code/modules/mob/dead/observer/observer.dm | 2004 +++++++++++++++++ maps/gateway_vr/carpfarm.dmm | 6 +- maps/gateway_vr/listeningpost.dmm | 6 +- maps/gateway_vr/snowfield.dmm | 10 +- maps/gateway_vr/variable/arynthilake_a.dmm | 6 +- maps/gateway_vr/variable/arynthilake_b.dmm | 6 +- .../variable/arynthilakeunderground_a.dmm | 6 +- .../variable/arynthilakeunderground_b.dmm | 6 +- .../variable/honlethhighlands_a.dmm | 8 +- .../variable/honlethhighlands_b.dmm | 8 +- maps/gateway_vr/wildwest.dmm | 6 +- maps/tether/tether_defines.dm | 3 +- 12 files changed, 2063 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9e80b75da5..6b50a6e273 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -994,3 +995,2006 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() +||||||| parent of 55de23fab7... Merge pull request #11180 from Very-Soft/updootgateways +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/mob/observer/dead + name = "ghost" + desc = "It's a g-g-g-g-ghooooost!" //jinkies! + icon = 'icons/mob/ghost.dmi' + icon_state = "ghost" + stat = DEAD + canmove = 0 + blinded = 0 + anchored = TRUE // don't get pushed around + + var/can_reenter_corpse + var/datum/hud/living/carbon/hud = null // hud + var/bootime = 0 + var/started_as_observer //This variable is set to 1 when you enter the game as an observer. + //If you died in the game and are a ghsot - this will remain as null. + //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/medHUD = 0 + var/secHUD = 0 + var/antagHUD = 0 + universal_speak = 1 + var/atom/movable/following = null + var/admin_ghosted = 0 + var/anonsay = 0 + var/ghostvision = 1 //is the ghost able to see things humans can't? + incorporeal_move = 1 + + var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. + var/ghost_sprite = null + var/global/list/possible_ghost_sprites = list( + "Clear" = "blank", + "Green Blob" = "otherthing", + "Bland" = "ghost", + "Robed-B" = "ghost1", + "Robed-BAlt" = "ghost2", + "King" = "ghostking", + "Shade" = "shade", + "Hecate" = "ghost-narsie", + "Glowing Statue" = "armour", + "Artificer" = "artificer", + "Behemoth" = "behemoth", + "Harvester" = "harvester", + "Wraith" = "wraith", + "Viscerator" = "viscerator", + "Corgi" = "corgi", + "Tamaskan" = "tamaskan", + "Black Cat" = "blackcat", + "Lizard" = "lizard", + "Goat" = "goat", + "Space Bear" = "bear", + "Bats" = "bat", + "Chicken" = "chicken_white", + "Parrot"= "parrot_fly", + "Goose" = "goose", + "Penguin" = "penguin", + "Brown Crab" = "crab", + "Gray Crab" = "evilcrab", + "Trout" = "trout-swim", + "Salmon" = "salmon-swim", + "Pike" = "pike-swim", + "Koi" = "koi-swim", + "Carp" = "carp", + "Red Robes" = "robe_red", + "Faithless" = "faithless", + "Shadowform" = "forgotten", + "Dark Ethereal" = "bloodguardian", + "Holy Ethereal" = "lightguardian", + "Red Elemental" = "magicRed", + "Blue Elemental" = "magicBlue", + "Pink Elemental" = "magicPink", + "Orange Elemental" = "magicOrange", + "Green Elemental" = "magicGreen", + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" + ) + var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. + var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns + +/mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + see_invisible = SEE_INVISIBLE_OBSERVER + see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... + + var/turf/T + if(ismob(body)) + T = get_turf(body) //Where is the body located? + attack_log = body.attack_log //preserve our attack logs by copying them to our ghost + gender = body.gender + if(body.mind && body.mind.name) + name = body.mind.name + else + if(body.real_name) + name = body.real_name + else + if(gender == MALE) + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position + forceMove(T) + + if(!name) //To prevent nameless ghosts + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + real_name = name + animate(src, pixel_y = 2, time = 10, loop = -1) + observer_mob_list += src + ..() + +/mob/observer/dead/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + if(href_list["reenter"]) + reenter_corpse() + return + +/mob/observer/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/book/tome)) + var/mob/observer/dead/M = src + M.manifest(user) + +/mob/observer/dead/CanPass(atom/movable/mover, turf/target) + return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + +/mob/observer/dead/examine_icon() + var/icon/I = get_cached_examine_icon(src) + if(!I) + I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) + set_cached_examine_icon(src, I, 200 SECONDS) + return I + +/mob/observer/dead/examine(mob/user) + . = ..() + + if(is_admin(user)) + . += "\t>[ADMIN_FULLMONTY(src)]" + +/* +Transfer_mind is there to check if mob is being deleted/not going to have a body. +Works together with spawning an observer, noted above. +*/ + +/mob/observer/dead/Life() + ..() + if(!loc) return + if(!client) return 0 + + handle_regular_hud_updates() + handle_vision() + +/mob/proc/ghostize(var/can_reenter_corpse = 1) + if(key) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.vr_holder && !can_reenter_corpse) + H.exit_vr() + return 0 + var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.timeofdeath = src.timeofdeath //BS12 EDIT + ghost.key = key + if(istype(loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = loc + M.update() + else if(istype(loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = loc + B.update() + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + return ghost + +/* +This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. +*/ +/mob/living/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + if(stat == DEAD && !forbid_seeing_deadchat) + announce_ghost_joinleave(ghostize(1)) + else + var/response + if(src.client && src.client.holder) + response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. + if(response != "Ghost") + return + resting = 1 + var/turf/location = get_turf(src) + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(!.) + M.stop_following() + + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + observer_mob_list -= src + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

    Crew Manifest

    " + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.add_overlay("pai-ghostalert") + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +======= +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/mob/observer/dead + name = "ghost" + desc = "It's a g-g-g-g-ghooooost!" //jinkies! + icon = 'icons/mob/ghost.dmi' + icon_state = "ghost" + stat = DEAD + canmove = 0 + blinded = 0 + anchored = TRUE // don't get pushed around + + var/can_reenter_corpse + var/datum/hud/living/carbon/hud = null // hud + var/bootime = 0 + var/started_as_observer //This variable is set to 1 when you enter the game as an observer. + //If you died in the game and are a ghsot - this will remain as null. + //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. + var/has_enabled_antagHUD = 0 + var/medHUD = 0 + var/secHUD = 0 + var/antagHUD = 0 + universal_speak = 1 + var/atom/movable/following = null + var/admin_ghosted = 0 + var/anonsay = 0 + var/ghostvision = 1 //is the ghost able to see things humans can't? + incorporeal_move = 1 + + var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. + var/ghost_sprite = null + var/global/list/possible_ghost_sprites = list( + "Clear" = "blank", + "Green Blob" = "otherthing", + "Bland" = "ghost", + "Robed-B" = "ghost1", + "Robed-BAlt" = "ghost2", + "King" = "ghostking", + "Shade" = "shade", + "Hecate" = "ghost-narsie", + "Glowing Statue" = "armour", + "Artificer" = "artificer", + "Behemoth" = "behemoth", + "Harvester" = "harvester", + "Wraith" = "wraith", + "Viscerator" = "viscerator", + "Corgi" = "corgi", + "Tamaskan" = "tamaskan", + "Black Cat" = "blackcat", + "Lizard" = "lizard", + "Goat" = "goat", + "Space Bear" = "bear", + "Bats" = "bat", + "Chicken" = "chicken_white", + "Parrot"= "parrot_fly", + "Goose" = "goose", + "Penguin" = "penguin", + "Brown Crab" = "crab", + "Gray Crab" = "evilcrab", + "Trout" = "trout-swim", + "Salmon" = "salmon-swim", + "Pike" = "pike-swim", + "Koi" = "koi-swim", + "Carp" = "carp", + "Red Robes" = "robe_red", + "Faithless" = "faithless", + "Shadowform" = "forgotten", + "Dark Ethereal" = "bloodguardian", + "Holy Ethereal" = "lightguardian", + "Red Elemental" = "magicRed", + "Blue Elemental" = "magicBlue", + "Pink Elemental" = "magicPink", + "Orange Elemental" = "magicOrange", + "Green Elemental" = "magicGreen", + "Daemon" = "daemon", + "Guard Spider" = "guard", + "Hunter Spider" = "hunter", + "Nurse Spider" = "nurse", + "Rogue Drone" = "drone", + "ED-209" = "ed209", + "Beepsky" = "secbot" + ) + var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. + var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns + +/mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF + see_invisible = SEE_INVISIBLE_OBSERVER + see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... + + var/turf/T + if(ismob(body)) + T = get_turf(body) //Where is the body located? + attack_log = body.attack_log //preserve our attack logs by copying them to our ghost + gender = body.gender + if(body.mind && body.mind.name) + name = body.mind.name + else + if(body.real_name) + name = body.real_name + else + if(gender == MALE) + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + else + name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) + + mind = body.mind //we don't transfer the mind but we keep a reference to it. + + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + add_overlay(H.overlays_standing) + + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position + forceMove(T) + + if(!name) //To prevent nameless ghosts + name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) + real_name = name + animate(src, pixel_y = 2, time = 10, loop = -1) + observer_mob_list += src + ..() + +/mob/observer/dead/Topic(href, href_list) + if (href_list["track"]) + var/mob/target = locate(href_list["track"]) in mob_list + if(target) + ManualFollow(target) + if(href_list["reenter"]) + reenter_corpse() + return + +/mob/observer/dead/attackby(obj/item/W, mob/user) + if(istype(W,/obj/item/weapon/book/tome)) + var/mob/observer/dead/M = src + M.manifest(user) + +/mob/observer/dead/CanPass(atom/movable/mover, turf/target) + return TRUE + +/mob/observer/dead/set_stat(var/new_stat) + if(new_stat != DEAD) + CRASH("It is best if observers stay dead, thank you.") + +/mob/observer/dead/examine_icon() + var/icon/I = get_cached_examine_icon(src) + if(!I) + I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) + set_cached_examine_icon(src, I, 200 SECONDS) + return I + +/mob/observer/dead/examine(mob/user) + . = ..() + + if(is_admin(user)) + . += "\t>[ADMIN_FULLMONTY(src)]" + +/* +Transfer_mind is there to check if mob is being deleted/not going to have a body. +Works together with spawning an observer, noted above. +*/ + +/mob/observer/dead/Life() + ..() + if(!loc) return + if(!client) return 0 + + handle_regular_hud_updates() + handle_vision() + +/mob/proc/ghostize(var/can_reenter_corpse = 1) + if(key) + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.vr_holder && !can_reenter_corpse) + H.exit_vr() + return 0 + var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. + ghost.can_reenter_corpse = can_reenter_corpse + ghost.timeofdeath = src.timeofdeath //BS12 EDIT + ghost.key = key + if(istype(loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = loc + M.update() + else if(istype(loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = loc + B.update() + if(ghost.client) + ghost.client.time_died_as_mouse = ghost.timeofdeath + if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. + ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! + return ghost + +/* +This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. +*/ +/mob/living/verb/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + + if(stat == DEAD && !forbid_seeing_deadchat) + announce_ghost_joinleave(ghostize(1)) + else + var/response + if(src.client && src.client.holder) + response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. + if(response != "Ghost") + return + resting = 1 + var/turf/location = get_turf(src) + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) + var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + if(ghost) + ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. + ghost.set_respawn_timer() + announce_ghost_joinleave(ghost) + +/mob/observer/dead/can_use_hands() return 0 +/mob/observer/dead/is_active() return 0 + +/mob/observer/dead/Stat() + ..() + if(statpanel("Status")) + if(emergency_shuttle) + var/eta_status = emergency_shuttle.get_status_panel_eta() + if(eta_status) + stat(null, eta_status) + +/mob/observer/dead/verb/reenter_corpse() + set category = "Ghost" + set name = "Re-enter Corpse" + if(!client) return + if(!(mind && mind.current && can_reenter_corpse)) + to_chat(src, "You have no body.") + return + if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients + to_chat(usr, "Another consciousness is in your body... it is resisting you.") + return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). + var/found_rune + for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune + if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. + found_rune = 1 + break + if(!found_rune) + to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") + return + mind.current.ajourn=0 + mind.current.key = key + mind.current.teleop = null + if(istype(mind.current.loc, /obj/structure/morgue)) + var/obj/structure/morgue/M = mind.current.loc + M.update(1) + else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) + var/obj/structure/closet/body_bag/B = mind.current.loc + B.update(1) + if(!admin_ghosted) + announce_ghost_joinleave(mind, 0, "They now occupy their body again.") + return 1 + +/mob/observer/dead/verb/toggle_medHUD() + set category = "Ghost" + set name = "Toggle MedicHUD" + set desc = "Toggles Medical HUD allowing you to see how everyone is doing" + + medHUD = !medHUD + plane_holder.set_vis(VIS_CH_HEALTH, medHUD) + plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) + to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_secHUD() + set category = "Ghost" + set name = "Toggle Security HUD" + set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" + + secHUD = !secHUD + plane_holder.set_vis(VIS_CH_ID, secHUD) + plane_holder.set_vis(VIS_CH_WANTED, secHUD) + plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) + plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) + plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) + to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/verb/toggle_antagHUD() + set category = "Ghost" + set name = "Toggle AntagHUD" + set desc = "Toggles AntagHUD allowing you to see who is the antagonist" + + if(!config.antag_hud_allowed && !client.holder) + to_chat(src, "Admins have disabled this for this round.") + return + if(jobban_isbanned(src, "AntagHUD")) + to_chat(src, "You have been banned from using this feature") + return + if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) + var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) + if(response == "No") return + can_reenter_corpse = FALSE + set_respawn_timer(-1) // Foreeeever + if(!has_enabled_antagHUD && !client.holder) + has_enabled_antagHUD = TRUE + + antagHUD = !antagHUD + plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) + to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") + +/mob/observer/dead/proc/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// This is the ghost's follow verb with an argument +/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + var/turf/targetloc = get_turf(target) + if(check_holy(targetloc)) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return + if(get_z(target) in using_map?.secret_levels) + to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) + var/turf/T = get_turf(target) + if(!T) + break + // To stop the ghost flickering. + if(loc != T) + forceMove(T) + sleep(15) + + var/icon/I = icon(target.icon,target.icon_state,target.dir) + + var/orbitsize = (I.Width()+I.Height())*0.5 + orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) + + var/rot_seg + + /* We don't have this pref yet + switch(ghost_orbit) + if(GHOST_ORBIT_TRIANGLE) + rot_seg = 3 + if(GHOST_ORBIT_SQUARE) + rot_seg = 4 + if(GHOST_ORBIT_PENTAGON) + rot_seg = 5 + if(GHOST_ORBIT_HEXAGON) + rot_seg = 6 + else //Circular + rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle + */ + + orbit(target, orbitsize, FALSE, 20, rot_seg) + +/mob/observer/dead/orbit() + set_dir(2) //reset dir so the right directional sprites show up + return ..() + +/mob/observer/dead/stop_orbit() + . = ..() + //restart our floating animation after orbit is done. + pixel_y = 0 + pixel_x = 0 + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + +/mob/observer/dead/proc/stop_following() + following = null + stop_orbit() + +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/observer/dead/M in following_mobs) + if(!.) + M.stop_following() + + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) + +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/observer/dead/M in following_mobs) + M.stop_following() + following_mobs = null + return ..() + +/mob/observer/dead/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + stop_following() + observer_mob_list -= src + return ..() + +/mob/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/proc/check_holy(var/turf/T) + return 0 + +/mob/observer/dead/check_holy(var/turf/T) + if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) + return 0 + + return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) + +/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Jump to Mob" + set desc = "Teleport to a mob" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[input] + if (!target)//Make sure we actually have a target + return + else + var/mob/M = target //Destination mob + var/turf/T = get_turf(M) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This mob is not located in the game world.") + +/mob/observer/dead/memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/add_memory() + set hidden = 1 + to_chat(src, "You are dead! You have no mind to store memory!") + +/mob/observer/dead/Post_Incorpmove() + stop_following() + +/mob/observer/dead/verb/analyze_air() + set name = "Analyze Air" + set category = "Ghost" + + if(!istype(usr, /mob/observer/dead)) return + + // Shamelessly copied from the Gas Analyzers + if (!( istype(usr.loc, /turf) )) + return + + var/datum/gas_mixture/environment = usr.loc.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + to_chat(src, "Results:") + if(abs(pressure - ONE_ATMOSPHERE) < 10) + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + else + to_chat(src, "Pressure: [round(pressure,0.1)] kPa") + if(total_moles) + for(var/g in environment.gas) + to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") + to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") + to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") + +/mob/observer/dead/verb/check_radiation() + set name = "Check Radiation" + set category = "Ghost" + + var/turf/t = get_turf(src) + if(t) + var/rads = SSradiation.get_rads_at_turf(t) + to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") + + +/mob/observer/dead/verb/become_mouse() + set name = "Become mouse" + set category = "Ghost" + + if(config.disable_player_mice) + to_chat(src, "Spawning as a mouse is currently disabled.") + return + + if(!MayRespawn(1)) + return + + var/turf/T = get_turf(src) + if(!T || (T.z in using_map.admin_levels)) + to_chat(src, "You may not spawn as a mouse on this Z-level.") + return + + var/timedifference = world.time - client.time_died_as_mouse + if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) + var/timedifference_text + timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") + to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") + return + + var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) + if(response != "Squeek!") return //Hit the wrong key...again. + + + //find a viable mouse candidate + var/mob/living/simple_mob/animal/passive/mouse/host + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/list/found_vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) + if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) + found_vents.Add(v) + if(found_vents.len) + vent_found = pick(found_vents) + host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) + else + to_chat(src, "Unable to find any unwelded vents to spawn mice at.") + + if(host) + if(config.uneducated_mice) + host.universal_understand = 0 + announce_ghost_joinleave(src, 0, "They are now a mouse.") + host.ckey = src.ckey + host.add_ventcrawl(vent_found) + to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") + +/mob/observer/dead/verb/view_manfiest() + set name = "Show Crew Manifest" + set category = "Ghost" + + var/dat + dat += "

    Crew Manifest

    " + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + seedarkness = !seedarkness + updateghostsight() + to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + if(usr.client.prefs?.be_special & BE_PAI) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit + PP.add_overlay("pai-ghostalert") + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +>>>>>>> 55de23fab7... Merge pull request #11180 from Very-Soft/updootgateways diff --git a/maps/gateway_vr/carpfarm.dmm b/maps/gateway_vr/carpfarm.dmm index 51a3348abf..34feaf87d4 100644 --- a/maps/gateway_vr/carpfarm.dmm +++ b/maps/gateway_vr/carpfarm.dmm @@ -749,6 +749,10 @@ /obj/effect/overmap/visitable/sector/tether_gateway/carpfarm, /turf/space, /area/space) +"Ia" = ( +/obj/effect/landmark/hidden_level, +/turf/space, +/area/space) "Zb" = ( /obj/effect/shuttle_landmark{ base_area = /area/space; @@ -1182,7 +1186,7 @@ aa aa aa aa -aa +Ia aa "} (4,1,1) = {" diff --git a/maps/gateway_vr/listeningpost.dmm b/maps/gateway_vr/listeningpost.dmm index ef039b722b..8f451550f0 100644 --- a/maps/gateway_vr/listeningpost.dmm +++ b/maps/gateway_vr/listeningpost.dmm @@ -416,6 +416,10 @@ /obj/effect/floor_decal/rust, /turf/simulated/floor/airless, /area/awaymission/listeningpost) +"Hp" = ( +/obj/effect/landmark/hidden_level, +/turf/space, +/area/space) (1,1,1) = {" aa @@ -840,7 +844,7 @@ aa aa aa aa -aa +Hp aa "} (4,1,1) = {" diff --git a/maps/gateway_vr/snowfield.dmm b/maps/gateway_vr/snowfield.dmm index 2d09b9b2b3..1189687dff 100644 --- a/maps/gateway_vr/snowfield.dmm +++ b/maps/gateway_vr/snowfield.dmm @@ -1634,6 +1634,14 @@ temperature = 243.15 }, /area/awaymission/snowfield/base) +"no" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/floor/outdoors/snow{ + nitrogen = 93.7835; + oxygen = 20.7263; + temperature = 243.15 + }, +/area/awaymission/snowfield/restricted) "Bw" = ( /obj/effect/overmap/visitable/sector/tether_gateway/snowfield, /turf/simulated/floor/outdoors/snow{ @@ -2066,7 +2074,7 @@ ab ab ab ab -ab +no aa "} (4,1,1) = {" diff --git a/maps/gateway_vr/variable/arynthilake_a.dmm b/maps/gateway_vr/variable/arynthilake_a.dmm index 2c982bab65..6da233bf6c 100644 --- a/maps/gateway_vr/variable/arynthilake_a.dmm +++ b/maps/gateway_vr/variable/arynthilake_a.dmm @@ -2068,6 +2068,10 @@ }, /turf/simulated/floor/tiled/eris/white/brown_platform, /area/gateway/arynthilake/dome) +"Or" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/mineral/ignore_cavegen, +/area/gateway/arynthilake/caves) "OC" = ( /turf/simulated/floor/carpet/blucarpet{ outdoors = 1 @@ -3052,7 +3056,7 @@ Qr Qr Qr Qr -Qr +Or aa "} (5,1,1) = {" diff --git a/maps/gateway_vr/variable/arynthilake_b.dmm b/maps/gateway_vr/variable/arynthilake_b.dmm index a56a67f1b3..5ed87dc765 100644 --- a/maps/gateway_vr/variable/arynthilake_b.dmm +++ b/maps/gateway_vr/variable/arynthilake_b.dmm @@ -2022,6 +2022,10 @@ }, /turf/simulated/floor/tiled/eris/steel/gray_platform, /area/gateway/arynthilake/dome) +"Ry" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/mineral/ignore_cavegen, +/area/gateway/arynthilake/caves) "RK" = ( /obj/structure/table/fancyblack, /obj/effect/landmark/mcguffin_spawner, @@ -3022,7 +3026,7 @@ ek ek ek ek -ek +Ry nF "} (5,1,1) = {" diff --git a/maps/gateway_vr/variable/arynthilakeunderground_a.dmm b/maps/gateway_vr/variable/arynthilakeunderground_a.dmm index d7282a8095..121b0fac96 100644 --- a/maps/gateway_vr/variable/arynthilakeunderground_a.dmm +++ b/maps/gateway_vr/variable/arynthilakeunderground_a.dmm @@ -121,6 +121,10 @@ /obj/random/awayloot, /turf/simulated/floor/tiled/eris/steel/techfloor, /area/gateway/arynthilake/engine) +"nD" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/mineral/ignore_cavegen, +/area/gateway/arynthilake/underground) "nO" = ( /turf/simulated/mineral/floor/ignore_cavegen, /area/gateway/arynthilake/underground) @@ -670,7 +674,7 @@ gh gh gh gh -gh +nD Ft "} (3,1,1) = {" diff --git a/maps/gateway_vr/variable/arynthilakeunderground_b.dmm b/maps/gateway_vr/variable/arynthilakeunderground_b.dmm index 8755d3a2a5..75fa807ad5 100644 --- a/maps/gateway_vr/variable/arynthilakeunderground_b.dmm +++ b/maps/gateway_vr/variable/arynthilakeunderground_b.dmm @@ -103,6 +103,10 @@ /obj/random/awayloot, /turf/simulated/floor/tiled/eris/techmaint, /area/gateway/arynthilake/engine) +"jX" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/mineral/ignore_cavegen, +/area/gateway/arynthilake/underground) "kb" = ( /turf/simulated/wall/r_wall, /area/gateway/arynthilake/engine) @@ -723,7 +727,7 @@ bL bL bL bL -bL +jX bX "} (3,1,1) = {" diff --git a/maps/gateway_vr/variable/honlethhighlands_a.dmm b/maps/gateway_vr/variable/honlethhighlands_a.dmm index e80e463c65..19eebf89a3 100644 --- a/maps/gateway_vr/variable/honlethhighlands_a.dmm +++ b/maps/gateway_vr/variable/honlethhighlands_a.dmm @@ -1984,6 +1984,12 @@ /obj/item/weapon/stool/padded, /turf/simulated/floor/lino, /area/gateway/honlethhighlands/town/bar) +"Ey" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/floor/water/deep{ + temperature = 253.15 + }, +/area/gateway/honlethhighlands/beach) "EP" = ( /obj/structure/table/glass, /obj/item/weapon/paper_bin, @@ -3504,7 +3510,7 @@ bm bm bm bm -bm +Ey aa "} (5,1,1) = {" diff --git a/maps/gateway_vr/variable/honlethhighlands_b.dmm b/maps/gateway_vr/variable/honlethhighlands_b.dmm index 482c65dc67..1e46fe78df 100644 --- a/maps/gateway_vr/variable/honlethhighlands_b.dmm +++ b/maps/gateway_vr/variable/honlethhighlands_b.dmm @@ -2048,6 +2048,12 @@ }, /turf/simulated/floor/wood, /area/gateway/honlethhighlands) +"Gm" = ( +/obj/effect/landmark/hidden_level, +/turf/simulated/floor/water/deep{ + temperature = 253.15 + }, +/area/gateway/honlethhighlands/beach) "Gn" = ( /obj/structure/cable/pink{ d1 = 2; @@ -3543,7 +3549,7 @@ bm bm bm bm -bm +Gm aa "} (5,1,1) = {" diff --git a/maps/gateway_vr/wildwest.dmm b/maps/gateway_vr/wildwest.dmm index 02354f8abf..16e6a42d3f 100644 --- a/maps/gateway_vr/wildwest.dmm +++ b/maps/gateway_vr/wildwest.dmm @@ -1983,6 +1983,10 @@ /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/simulated/floor/tiled/white, /area/awaymission/wwmines) +"RC" = ( +/obj/effect/landmark/hidden_level, +/turf/space, +/area/space) "RP" = ( /obj/structure/bed/padded, /obj/item/weapon/bedsheet/blue, @@ -2468,7 +2472,7 @@ ia ia ia ia -ia +RC aa "} (3,1,1) = {" diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index 863ee39b2a..ecfd1c1d58 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -167,8 +167,7 @@ list("Carp Farm"), list("Snow Field"), list("Listening Post"), - list("Honleth Highlands A"), - list("Honleth Highlands B"), + list(list("Honleth Highlands A", "Honleth Highlands B")), list("Arynthi Lake Underground A","Arynthi Lake A"), list("Arynthi Lake Underground B","Arynthi Lake B"), list("Eggnog Town Underground","Eggnog Town"), From 15cafbe65b1f1c4ed982a0fa2e3feb3e000be946 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Tue, 20 Jul 2021 21:30:20 +0000 Subject: [PATCH 31/86] Optimize a couple things --- code/ATMOSPHERICS/pipes/he_pipes.dm | 4 +- code/ZAS/Atom.dm | 3 +- code/ZAS/Fire.dm | 3 +- code/_helpers/_lists.dm | 9 +- code/_helpers/game.dm | 6 +- code/_helpers/global_lists.dm | 17 +- code/_helpers/global_lists_vr.dm | 6 +- code/_helpers/icons.dm | 6 +- code/_helpers/unsorted.dm | 3 +- code/_helpers/visual_filters.dm | 3 +- code/_onclick/hud/minihud_rigmech.dm | 6 +- code/controllers/configuration.dm | 2290 ++++++++++++ code/controllers/master.dm | 15 +- code/controllers/subsystems/assets.dm | 3 +- code/controllers/subsystems/atoms.dm | 10 +- code/controllers/subsystems/chat.dm | 3 +- code/controllers/subsystems/circuits.dm | 18 +- code/controllers/subsystems/events.dm | 2 +- code/controllers/subsystems/events2.dm | 3 +- code/controllers/subsystems/game_master.dm | 15 +- code/controllers/subsystems/garbage.dm | 3 +- code/controllers/subsystems/mapping.dm | 8 +- code/controllers/subsystems/persistence.dm | 5 +- code/controllers/subsystems/planets.dm | 6 +- code/controllers/subsystems/plants.dm | 2 +- .../subsystems/processing/instruments.dm | 7 +- .../subsystems/processing/projectiles.dm | 3 +- code/controllers/subsystems/radiation.dm | 3 +- code/controllers/subsystems/shuttles.dm | 6 +- code/controllers/subsystems/timer.dm | 3 +- code/controllers/subsystems/vote.dm | 3 +- code/controllers/subsystems/xenoarch.dm | 3 +- code/controllers/verbs.dm | 3 +- code/datums/chat_message.dm | 6 +- code/datums/components/_component.dm | 6 +- code/datums/components/crafting/crafting.dm | 8 +- code/datums/components/material_container.dm | 17 +- code/datums/components/overlay_lighting.dm | 6 +- code/datums/datum.dm | 9 +- code/datums/game_masters/default.dm | 6 +- .../datums/game_masters/other_game_masters.dm | 6 +- code/datums/helper_datums/getrev.dm | 9 + code/datums/observation/~cleanup.dm | 9 +- code/datums/orbit.dm | 6 +- code/datums/progressbar.dm | 3 +- code/datums/soul_link.dm | 14 +- code/game/antagonist/_antagonist_setup.dm | 2 +- code/game/antagonist/mutiny/mutineer.dm | 2 +- code/game/atoms.dm | 21 +- code/game/atoms_movable.dm | 18 +- code/game/dna/dna2_helpers.dm | 3 +- .../gamemodes/changeling/modularchangling.dm | 2 +- code/game/gamemodes/sandbox/h_sandbox.dm | 2 +- code/game/gamemodes/technomancer/catalog.dm | 8 +- code/game/machinery/adv_med.dm | 5 +- code/game/machinery/adv_med_vr.dm | 3 +- code/game/machinery/autolathe.dm | 5 +- code/game/machinery/computer/card.dm | 3 +- code/game/machinery/cryopod.dm | 3 +- code/game/machinery/doors/airlock.dm | 3070 +++++++++++++++++ code/game/machinery/frame.dm | 7 +- code/game/machinery/jukebox.dm | 3 +- code/game/machinery/machinery.dm | 3 +- code/game/machinery/partslathe_vr.dm | 5 +- code/game/machinery/pointdefense.dm | 21 + code/game/machinery/portable_turret.dm | 5 +- code/game/objects/buckling.dm | 3 +- code/game/objects/effects/alien/aliens.dm | 3 +- .../objects/effects/map_effects/portal.dm | 27 +- .../effects/map_effects/screen_shaker.dm | 3 +- .../temporary_visuals/projectiles/tracer.dm | 3 +- .../items/devices/communicator/UI_tgui.dm | 3 +- code/game/objects/items/devices/hacktool.dm | 3 +- .../objects/items/devices/radio/jammer.dm | 3 +- code/game/objects/items/devices/scanners.dm | 9 +- .../game/objects/items/devices/scanners_vr.dm | 3 +- code/game/objects/items/stacks/medical_vr.dm | 6 +- code/game/objects/structures.dm | 3 +- code/game/objects/structures/electricchair.dm | 3 +- code/game/objects/structures/janicart.dm | 6 +- .../structures/stool_bed_chair_nest/chairs.dm | 6 +- .../stool_bed_chair_nest/wheelchair.dm | 9 +- code/game/objects/structures/watercloset.dm | 9 +- code/game/periodic_news.dm | 2 +- code/game/sound.dm | 3 +- code/game/turfs/turf.dm | 10 +- code/modules/admin/admin_secrets.dm | 2 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 6 +- code/modules/admin/verbs/adminhelp.dm | 12 +- code/modules/admin/verbs/randomverbs.dm | 3 +- .../admin/view_variables/modify_variables.dm | 3 +- code/modules/ai/ai_holder.dm | 8 +- code/modules/ai/ai_holder_combat.dm | 3 +- code/modules/ai/ai_holder_communication.dm | 3 +- code/modules/assembly/infrared.dm | 3 +- code/modules/asset_cache/asset_list_items.dm | 3 +- code/modules/awaymissions/loot_vr.dm | 2 +- code/modules/blob2/blobs/base_blob.dm | 3 +- code/modules/blob2/blobs/core.dm | 3 +- code/modules/blob2/overmind/overmind.dm | 6 +- .../blob2/overmind/types/synchronous_mesh.dm | 3 +- code/modules/busy_space/loremaster.dm | 2 +- code/modules/busy_space_vr/loremaster.dm | 2 +- code/modules/catalogue/cataloguer.dm | 24 +- code/modules/client/client procs.dm | 7 +- .../preference_setup/global/02_settings.dm | 6 +- .../preference_setup/global/setting_datums.dm | 9 +- .../preference_setup/loadout/loadout.dm | 7 +- .../loadout/loadout_accessories.dm | 24 +- .../loadout/loadout_general.dm | 6 +- .../loadout/loadout_general_vr.dm | 9 +- .../preference_setup/loadout/loadout_head.dm | 9 +- .../loadout/loadout_smoking.dm | 3 +- .../loadout/loadout_uniform.dm | 24 +- .../loadout/loadout_uniform_vr.dm | 3 +- .../loadout/loadout_utility.dm | 3 +- .../modules/client/preferences_spawnpoints.dm | 2 +- code/modules/clothing/chameleon.dm | 5 +- code/modules/clothing/clothing_accessories.dm | 3 +- code/modules/clothing/head/pilot_helmet.dm | 3 +- code/modules/economy/economy_misc.dm | 2 +- code/modules/emotes/emote_mob.dm | 6 +- .../entopics_vr/alternate_appearance.dm | 6 +- code/modules/entopics_vr/entopics.dm | 6 +- code/modules/events/carp_migration.dm | 3 +- code/modules/events/grubinfestation_vr.dm | 3 +- code/modules/events/supply_demand_vr.dm | 6 +- code/modules/food/food/lunch.dm | 5 +- code/modules/food/food/snacks.dm | 6 +- .../kitchen/cooking_machines/_appliance.dm | 21 +- .../food/kitchen/cooking_machines/_mixer.dm | 3 +- code/modules/food/kitchen/microwave.dm | 6 +- code/modules/food/recipe_dump.dm | 2 +- code/modules/gamemaster/event2/event.dm | 6 +- .../event2/events/engineering/blob.dm | 9 +- .../event2/events/engineering/grid_check.dm | 6 +- .../gamemaster/event2/events/mob_spawning.dm | 8 +- code/modules/genetics/side_effects.dm | 2 +- code/modules/holomap/mapper.dm | 6 +- .../hydroponics/spreading/spreading_growth.dm | 3 +- .../spreading/spreading_response.dm | 6 +- code/modules/identification/identification.dm | 3 +- .../instrument_data/_instrument_data.dm | 3 +- code/modules/instruments/items.dm | 3 +- code/modules/instruments/songs/play_legacy.dm | 3 +- .../instruments/songs/play_synthesized.dm | 9 +- code/modules/looking_glass/lg_area.dm | 9 +- code/modules/maps/tg/map_template.dm | 6 +- code/modules/media/media_machinery.dm | 3 +- code/modules/mining/abandonedcrates.dm | 4 +- code/modules/mining/fulton.dm | 3 +- .../mining/machinery/machine_stacking.dm | 5 +- code/modules/mob/animations.dm | 3 +- code/modules/mob/freelook/ai/chunk.dm | 3 +- code/modules/mob/freelook/chunk.dm | 15 +- code/modules/mob/freelook/visualnet.dm | 18 +- .../living/carbon/human/MedicalSideEffects.dm | 2 +- .../living/carbon/human/chem_side_effects.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 9 +- .../carbon/human/human_modular_limbs.dm | 6 +- code/modules/mob/living/carbon/human/life.dm | 6 +- .../species/shadekin/shadekin_abilities.dm | 6 +- .../human/species/species_shapeshift_vr.dm | 3 +- .../station/protean_vr/protean_blob.dm | 6 +- .../station/protean_vr/protean_species.dm | 6 +- code/modules/mob/living/death.dm | 6 +- code/modules/mob/living/living.dm | 5 +- code/modules/mob/living/say.dm | 12 +- code/modules/mob/living/silicon/ai/ai.dm | 3 +- .../living/silicon/ai/ai_remote_control.dm | 3 +- .../modules/mob/living/silicon/ai/multicam.dm | 21 +- code/modules/mob/living/silicon/pai/pai_vr.dm | 3 +- .../mob/living/silicon/pai/software.dm | 2 +- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 3 +- .../mob/living/silicon/robot/examine_vr.dm | 3 +- code/modules/mob/living/simple_mob/defense.dm | 15 +- .../mob/living/simple_mob/simple_mob_vr.dm | 3 +- .../subtypes/animal/giant_spider/nurse.dm | 3 +- .../subtypes/vore/demon/demon_abilities.dm | 12 +- .../living/simple_mob/subtypes/vore/lamia.dm | 6 +- .../subtypes/vore/shadekin/ability_procs.dm | 6 +- .../subtypes/vore/shadekin/shadekin.dm | 3 +- .../subtypes/vore/solargrub_larva.dm | 3 +- .../subtypes/vore/zz_vore_overrides.dm | 6 +- code/modules/mob/living/status_indicators.dm | 3 +- code/modules/mob/mob.dm | 2468 +++++++++++++ code/modules/mob/new_player/skill.dm | 2 +- code/modules/mob/say_vr.dm | 6 +- .../programs/generic/ntnrc_client.dm | 12 +- .../hardware/network_card.dm | 3 +- code/modules/nifsoft/nif.dm | 3 +- code/modules/nifsoft/nif_softshop.dm | 8 +- code/modules/nifsoft/software/05_health.dm | 12 + .../nifsoft/software/13_soulcatcher.dm | 26 +- code/modules/organs/organ_external.dm | 3 +- code/modules/overmap/events/event_handler.dm | 3 +- code/modules/overmap/sectors.dm | 3 +- .../overmap/ships/engines/gas_thruster.dm | 3 +- code/modules/overmap/ships/panicbutton.dm | 3 +- code/modules/paperwork/paperplane.dm | 3 +- code/modules/pda/cart.dm | 6 +- code/modules/pda/cart_apps.dm | 15 +- code/modules/pda/messenger.dm | 12 +- code/modules/pda/pda.dm | 3 +- code/modules/pda/pda_tgui.dm | 3 +- code/modules/planet/sif.dm | 6 +- code/modules/planet/virgo3b_vr.dm | 6 +- code/modules/planet/virgo4_vr.dm | 6 +- code/modules/planet/weather.dm | 3 +- code/modules/power/fusion/fusion_reactions.dm | 3 +- code/modules/power/gravitygenerator_vr.dm | 3 +- code/modules/power/singularity/singularity.dm | 3 +- code/modules/power/solar.dm | 3 +- code/modules/power/tesla/energy_ball.dm | 3 +- code/modules/projectiles/broken.dm | 9 +- .../guns/energy/cell_loaded_vr/cell_loaded.dm | 9 +- .../guns/energy/kinetic_accelerator_vr.dm | 12 +- code/modules/random_map/drop/droppod.dm | 2 +- code/modules/random_map/drop/supply.dm | 4 +- code/modules/random_map/noise/desert.dm | 4 +- code/modules/random_map/random_map_verbs.dm | 2 +- code/modules/reagents/holder/distilling.dm | 9 +- code/modules/reagents/holder/holder.dm | 1018 ++++++ code/modules/reagents/machinery/grinder.dm | 3 +- .../reagents/reactions/instant/instant_vr.dm | 3 +- code/modules/reagents/reagents/vore_vr.dm | 6 +- code/modules/research/research.dm | 7 +- code/modules/resleeving/infocore_records.dm | 3 +- code/modules/resleeving/infomorph.dm | 2 +- code/modules/rogueminer_vr/zonemaster.dm | 3 +- .../security levels/security levels.dm | 3 +- code/modules/shuttles/crashes.dm | 6 +- code/modules/shuttles/shuttle_console.dm | 7 + code/modules/shuttles/shuttles_web.dm | 3 +- code/modules/shuttles/web_datums.dm | 2 +- code/modules/tgs/v3210/commands.dm | 5 +- code/modules/tgs/v4/api.dm | 6 +- code/modules/tgs/v4/commands.dm | 2 +- code/modules/tgs/v5/api.dm | 6 +- code/modules/tgs/v5/commands.dm | 2 +- .../tgui/modules/admin_shuttle_controller.dm | 3 +- .../tgui/modules/appearance_changer.dm | 3 +- code/modules/tgui/modules/camera.dm | 3 +- .../modules/tgui/modules/ntos-only/cardmod.dm | 3 +- code/modules/tgui/modules/ntos-only/uav.dm | 6 +- code/modules/virus2/admin.dm | 5 +- code/modules/virus2/effect.dm | 5 +- code/modules/vore/eating/belly_obj_vr.dm | 9 +- code/modules/vore/eating/bellymodes_vr.dm | 6 +- code/modules/vore/eating/living_vr.dm | 23 +- code/modules/vore/eating/vorepanel_vr.dm | 12 +- .../xenoarcheaology/artifacts/artifact.dm | 8 +- code/modules/xenoarcheaology/tools/tools.dm | 6 +- code/modules/xenobio2/mob/slime/slime.dm | 2 +- code/modules/xgm/xgm_gas_data.dm | 2 +- .../unit_tests/integrated_circuits/prefabs.dm | 3 +- code/unit_tests/loadout_tests.dm | 3 +- code/unit_tests/research_tests.dm | 2 +- maps/tether/tether_shuttles.dm | 3 +- maps/~map_system/maps.dm | 2 +- 262 files changed, 9437 insertions(+), 934 deletions(-) diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm index 8b1b800830..89ecf1e2bb 100644 --- a/code/ATMOSPHERICS/pipes/he_pipes.dm +++ b/code/ATMOSPHERICS/pipes/he_pipes.dm @@ -104,9 +104,7 @@ parent.radiate_heat_to_space(surface, 1) if(has_buckled_mobs()) - for(var/M in buckled_mobs) - var/mob/living/L = M - + for(var/mob/living/L as anything in buckled_mobs) var/hc = pipe_air.heat_capacity() var/avg_temp = (pipe_air.temperature * hc + L.bodytemperature * 3500) / (hc + 3500) pipe_air.temperature = avg_temp diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index 1953c58e9f..06305182b3 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -93,8 +93,7 @@ return AIR_BLOCKED var/result = 0 - for(var/mm in contents) - var/atom/movable/M = mm + for(var/atom/movable/M as anything in contents) switch(M.can_atmos_pass) if(ATMOS_PASS_YES) continue diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 1f281d334a..e67d2ad3ac 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -71,8 +71,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/fuel_to_remove = used_liquid_fuel/(fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units - for(var/O in fuel_objs) - var/obj/effect/decal/cleanable/liquid_fuel/fuel = O + for(var/obj/effect/decal/cleanable/liquid_fuel/fuel as anything in fuel_objs) if(!istype(fuel)) fuel_objs -= fuel continue diff --git a/code/_helpers/_lists.dm b/code/_helpers/_lists.dm index d71897c466..c359227f05 100644 --- a/code/_helpers/_lists.dm +++ b/code/_helpers/_lists.dm @@ -127,22 +127,19 @@ //returns a new list with only atoms that are in typecache L /proc/typecache_filter_list(list/atoms, list/typecache) . = list() - for(var/thing in atoms) - var/atom/A = thing + for(var/atom/A as anything in atoms) if(typecache[A.type]) . += A /proc/typecache_filter_list_reverse(list/atoms, list/typecache) . = list() - for(var/thing in atoms) - var/atom/A = thing + for(var/atom/A as anything in atoms) if(!typecache[A.type]) . += A /proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude) . = list() - for(var/thing in atoms) - var/atom/A = thing + for(var/atom/A as anything in atoms) if(typecache_include[A.type] && !typecache_exclude[A.type]) . += A diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 179f7251d9..ac38f40302 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -226,8 +226,7 @@ var/mobs_radio_range_fired = 1 //CHOMPEdit . = list() // Returns a list of mobs who can hear any of the radios given in @radios var/list/speaker_coverage = list() - for(var/r in radios) - var/obj/item/device/radio/R = r // You better fucking be a radio. + for(var/obj/item/device/radio/R as anything in radios) var/turf/speaker = get_turf(R) if(speaker) for(var/turf/T in R.can_broadcast_to()) //CHOMPEdit @@ -378,8 +377,7 @@ var/mobs_radio_range_fired = 1 //CHOMPEdit /proc/flick_overlay_view(image/I, atom/target, duration, gc_after) //wrapper for the above, flicks to everyone who can see the target atom var/list/viewing = list() - for(var/m in viewers(target)) - var/mob/M = m + for(var/mob/M as anything in viewers(target)) if(M.client) viewing += M.client flick_overlay(I, viewing, duration, gc_after) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index fcb6554a5c..1a482e6d24 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -215,23 +215,20 @@ GLOBAL_LIST_EMPTY(mannequins) // Suit cyclers paths = subtypesof(/datum/suit_cycler_choice/department) - for(var/path in paths) - var/datum/suit_cycler_choice/SCC = path + for(var/datum/suit_cycler_choice/SCC as anything in paths) if(!initial(SCC.name)) continue - GLOB.suit_cycler_departments += new path() + GLOB.suit_cycler_departments += new SCC() paths = subtypesof(/datum/suit_cycler_choice/species) - for(var/path in paths) - var/datum/suit_cycler_choice/SCC = path + for(var/datum/suit_cycler_choice/SCC as anything in paths) if(!initial(SCC.name)) continue - GLOB.suit_cycler_species += new path() + GLOB.suit_cycler_species += new SCC() paths = subtypesof(/datum/suit_cycler_choice/department/emag) - for(var/path in paths) - var/datum/suit_cycler_choice/SCC = path + for(var/datum/suit_cycler_choice/SCC as anything in paths) if(!initial(SCC.name)) continue - GLOB.suit_cycler_emagged += new path() + GLOB.suit_cycler_emagged += new SCC() //Ores paths = subtypesof(/ore) @@ -273,7 +270,7 @@ GLOBAL_LIST_EMPTY(mannequins) /* // Custom species traits - paths = subtypesof(/datum/trait) - /datum/trait + paths = subtypesof(/datum/trait) for(var/path in paths) var/datum/trait/instance = new path() if(!instance.name) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 7224522352..0d982e65e8 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -534,7 +534,7 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, var/paths // Custom Hair Accessories - paths = typesof(/datum/sprite_accessory/hair_accessory) - /datum/sprite_accessory/hair_accessory + paths = subtypesof(/datum/sprite_accessory/hair_accessory) for(var/path in paths) var/datum/sprite_accessory/hair_accessory/instance = new path() hair_accesories_list[path] = instance @@ -568,14 +568,14 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, // Weaver recipe stuff - paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure + paths = subtypesof(/datum/weaver_recipe/structure) for(var/path in paths) var/datum/weaver_recipe/instance = new path() if(!instance.title) continue //A prototype or something weavable_structures[instance.title] = instance - paths = typesof(/datum/weaver_recipe/item) - /datum/weaver_recipe/item + paths = subtypesof(/datum/weaver_recipe/item) for(var/path in paths) var/datum/weaver_recipe/instance = new path() if(!instance.title) diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 8e4de46935..53ad12d9b3 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -762,8 +762,7 @@ world // Dimensions of overlay being added var/list/add_size[4] - for(var/V in layers) - var/image/I = V + for(var/image/I as anything in layers) if(I.alpha == 0) continue @@ -897,8 +896,7 @@ world //For photo camera. /proc/build_composite_icon(atom/A) var/icon/composite = icon(A.icon, A.icon_state, A.dir, 1) - for(var/O in A.overlays) - var/image/I = O + for(var/image/I as anything in A.overlays) composite.Blend(icon(I.icon, I.icon_state, I.dir, 1), ICON_OVERLAY) return composite diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index cef24751a2..4772ebcdf4 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1249,8 +1249,7 @@ var/mob/dview/dview_mob = new if(orange) turfs -= get_turf(center) . = list() - for(var/V in turfs) - var/turf/T = V + for(var/turf/T as anything in turfs) . += T . += T.contents if(areas) diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index 96f6871000..c02bbb6993 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -335,8 +335,7 @@ GLOBAL_LIST_INIT(master_filter_info, list( /obj/item/update_filters() . = ..() /* Will port this from TG - for(var/X in actions) - var/datum/action/A = X + for(var/datum/action/A as anything in actions) A.UpdateButtonIcon() */ diff --git a/code/_onclick/hud/minihud_rigmech.dm b/code/_onclick/hud/minihud_rigmech.dm index e54a733f80..b4d13f1c86 100644 --- a/code/_onclick/hud/minihud_rigmech.dm +++ b/code/_onclick/hud/minihud_rigmech.dm @@ -21,8 +21,7 @@ screenobjs += new /obj/screen/rig/deco1_f screenobjs += new /obj/screen/rig/deco2_f - for(var/scr in screenobjs) - var/obj/screen/S = scr + for(var/obj/screen/S as anything in screenobjs) S.master = owner_rig ..() @@ -71,8 +70,7 @@ screenobjs += new /obj/screen/mech/deco1_f screenobjs += new /obj/screen/mech/deco2_f - for(var/scr in screenobjs) - var/obj/screen/S = scr + for(var/obj/screen/S as anything in screenobjs) S.master = owner_mech ..() diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 037664027a..9a3e28e584 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD var/list/gamemode_cache = list() /datum/configuration @@ -1149,3 +1150,2292 @@ var/list/gamemode_cache = list() config.python_path = "/usr/bin/env python2" else //probably windows, if not this should work anyway config.python_path = "python" +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt +var/list/gamemode_cache = list() + +/datum/configuration + var/static/server_name = null // server name (for world name / status) + var/static/server_suffix = 0 // generate numeric suffix based on server port + + var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located + + var/static/log_ooc = 0 // log OOC channel + var/static/log_access = 0 // log login/logout + var/static/log_say = 0 // log client say + var/static/log_admin = 0 // log admin actions + var/static/log_debug = 1 // log debug output + var/static/log_game = 0 // log game events + var/static/log_vote = 0 // log voting + var/static/log_whisper = 0 // log client whisper + var/static/log_emote = 0 // log emotes + var/static/log_attack = 0 // log attack messages + var/static/log_adminchat = 0 // log admin chat messages + var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such + var/static/log_pda = 0 // log pda messages + var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits + var/static/log_runtime = 0 // logs world.log to a file + var/static/log_world_output = 0 // log to_world_log(messages) + var/static/log_graffiti = 0 // logs graffiti + var/static/sql_enabled = 0 // for sql switching + var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour + var/static/allow_vote_restart = 0 // allow votes to restart + var/static/ert_admin_call_only = 0 + var/static/allow_vote_mode = 0 // allow votes to change mode + var/static/allow_admin_jump = 1 // allows admin jumping + var/static/allow_admin_spawning = 1 // allows admin item spawning + var/static/allow_admin_rev = 1 // allows admin revives + var/static/pregame_time = 180 // pregame time in seconds + var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) + var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) + var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called + var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote + var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). + var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) + var/static/vote_no_dead = 0 // dead people can't vote (tbi) +// var/static/enable_authentication = 0 // goon authentication + var/static/del_new_on_log = 1 // del's new players if they log before they spawn in + var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard + var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/static/objectives_disabled = 0 //if objectives are disabled or not + var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other + var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/static/allow_Metadata = 0 // Metadata is supported. + var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/static/fps = 20 + var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling + var/static/Tickcomp = 0 + var/static/socket_talk = 0 // use socket_talk to communicate with other processes + var/static/list/resource_urls = null + var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/static/list/mode_names = list() + var/static/list/modes = list() // allowed modes + var/static/list/votable_modes = list() // votable modes + var/static/list/probabilities = list() // relative probability of each mode + var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. + var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. + var/static/humans_need_surnames = 0 + var/static/allow_random_events = 0 // enables random events mid-round when set to 1 + var/static/enable_game_master = 0 // enables the 'smart' event system. + var/static/allow_ai = 1 // allow ai job + var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. + var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell + var/static/hostedby = null + + var/static/respawn = 1 + var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) + var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" + + var/static/guest_jobban = 1 + var/static/usewhitelist = 0 + var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 + var/static/show_mods = 0 + var/static/show_devs = 0 + var/static/show_event_managers = 0 + var/static/mods_can_tempban = 0 + var/static/mods_can_job_tempban = 0 + var/static/mod_tempban_max = 1440 + var/static/mod_job_tempban_max = 1440 + var/static/load_jobs_from_txt = 0 + var/static/ToRban = 0 + var/static/automute_on = 0 //enables automuting/spam prevention + var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + + var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... + var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. + + var/static/character_slots = 10 // The number of available character slots + var/static/loadout_slots = 3 // The number of loadout slots per character + + var/static/max_maint_drones = 5 //This many drones can spawn, + var/static/allow_drone_spawn = 1 //assuming the admin allow them to. + var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. + + var/static/disable_player_mice = 0 + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech + + var/static/usealienwhitelist = 0 + var/static/limitalienplayers = 0 + var/static/alien_to_human_ratio = 0.5 + var/static/allow_extra_antags = 0 + var/static/guests_allowed = 1 + var/static/debugparanoid = 0 + var/static/panic_bunker = 0 + var/static/paranoia_logging = 0 + + var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. + var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. + var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). + var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. + var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. + var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. + + var/static/serverurl + var/static/server + var/static/banappeals + var/static/wikiurl + var/static/wikisearchurl + var/static/forumurl + var/static/githuburl + var/static/discordurl + var/static/rulesurl + var/static/mapurl + + //Alert level description + var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." + var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." + var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + + var/static/forbid_singulo_possession = 0 + + //game_options.txt configs + + var/static/health_threshold_softcrit = 0 + var/static/health_threshold_crit = 0 + var/static/health_threshold_dead = -100 + + var/static/organ_health_multiplier = 1 + var/static/organ_regeneration_multiplier = 1 + var/static/organs_decay + var/static/default_brain_health = 400 + var/static/allow_headgibs = FALSE + + //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, + //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. + var/static/organ_damage_spillover_multiplier = 0.5 + + var/static/bones_can_break = 0 + var/static/limbs_can_break = 0 + + var/static/revival_pod_plants = 1 + var/static/revival_cloning = 1 + var/static/revival_brain_life = -1 + + var/static/use_loyalty_implants = 0 + + var/static/welder_vision = 1 + var/static/generate_map = 0 + var/static/no_click_cooldown = 0 + + //Used for modifying movement speed for mobs. + //Unversal modifiers + var/static/run_speed = 0 + var/static/walk_speed = 0 + + //Mob specific modifiers. NOTE: These will affect different mob types in different ways + var/static/human_delay = 0 + var/static/robot_delay = 0 + var/static/monkey_delay = 0 + var/static/alien_delay = 0 + var/static/slime_delay = 0 + var/static/animal_delay = 0 + + var/static/footstep_volume = 0 + + var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt + var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt + var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database + + var/static/simultaneous_pm_warning_timeout = 100 + + var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. + var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. + + var/static/assistant_maint = 0 //Do assistants get maint access? + var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. + var/static/ghost_interaction = 0 + + var/static/comms_password = "" + + var/static/enter_allowed = 1 + + var/use_irc_bot = 0 + var/use_node_bot = 0 + var/irc_bot_port = 0 + var/irc_bot_host = "" + var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge + var/main_irc = "" + var/admin_irc = "" + var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix + var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. + var/use_overmap = 0 + + var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. + + // Event settings + var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours + // If the first delay has a custom start time + // No custom time, no custom time, between 80 to 100 minutes respectively. + var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) + // The lowest delay until next event + // 10, 30, 50 minutes respectively + var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) + // The upper delay until next event + // 15, 45, 70 minutes respectively + var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) + + var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. + var/static/ninjas_allowed = 0 + var/static/abandon_allowed = 1 + var/static/ooc_allowed = 1 + var/static/looc_allowed = 1 + var/static/dooc_allowed = 1 + var/static/dsay_allowed = 1 + + var/persistence_disabled = FALSE + var/persistence_ignore_mapload = FALSE + + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + + var/starlight = 0 // Whether space turfs have ambient light or not + + var/static/list/ert_species = list(SPECIES_HUMAN) + + var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + + var/static/aggressive_changelog = 0 + + var/static/list/language_prefixes = list(",","#")//Default language prefixes + + var/static/show_human_death_message = 1 + + var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf + var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/static/radiation_material_resistance_divisor = 1 + var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + + var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. + var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. + + // New shiny SQLite stuff. + // The basics. + var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. + + // In-Game Feedback. + var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. + var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. + var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. + var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. + var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + + var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/static/disable_cid_warn_popup = FALSE + + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + + // How strictly the loadout enforces object species whitelists + var/loadout_whitelist = LOADOUT_WHITELIST_LAX + + var/static/vgs_access_identifier = null // VOREStation Edit - VGS + var/static/vgs_server_port = null // VOREStation Edit - VGS + + var/disable_webhook_embeds = FALSE + + var/static/list/jukebox_track_files + +/datum/configuration/New() + var/list/L = typesof(/datum/game_mode) - /datum/game_mode + for (var/T in L) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + var/datum/game_mode/M = new T() + if (M.config_tag) + gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. + if(!(M.config_tag in modes)) // ensure each mode is added only once + log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") + modes += M.config_tag + mode_names[M.config_tag] = M.name + probabilities[M.config_tag] = M.probability + player_requirements[M.config_tag] = M.required_players + player_requirements_secret[M.config_tag] = M.required_players_secret + if (M.votable) + src.votable_modes += M.config_tag + src.votable_modes += "secret" + +/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist + var/list/Lines = file2list(filename) + + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + if(type == "config") + switch (name) + if ("resource_urls") + config.resource_urls = splittext(value, " ") + + if ("admin_legacy_system") + config.admin_legacy_system = 1 + + if ("ban_legacy_system") + config.ban_legacy_system = 1 + + if ("use_age_restriction_for_jobs") + config.use_age_restriction_for_jobs = 1 + + if ("use_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + + if ("jobs_have_minimal_access") + config.jobs_have_minimal_access = 1 + + if ("use_recursive_explosions") + use_recursive_explosions = 1 + + if ("multi_z_explosion_scalar") + multi_z_explosion_scalar = text2num(value) + + if ("log_ooc") + config.log_ooc = 1 + + if ("log_access") + config.log_access = 1 + + if ("sql_enabled") + config.sql_enabled = 1 + + if ("log_say") + config.log_say = 1 + + if ("debug_paranoid") + config.debugparanoid = 1 + + if ("log_admin") + config.log_admin = 1 + + if ("log_debug") + config.log_debug = text2num(value) + + if ("log_game") + config.log_game = 1 + + if ("log_vote") + config.log_vote = 1 + + if ("log_whisper") + config.log_whisper = 1 + + if ("log_attack") + config.log_attack = 1 + + if ("log_emote") + config.log_emote = 1 + + if ("log_adminchat") + config.log_adminchat = 1 + + if ("log_adminwarn") + config.log_adminwarn = 1 + + if ("log_pda") + config.log_pda = 1 + + if ("log_world_output") + config.log_world_output = 1 + + if ("log_hrefs") + config.log_hrefs = 1 + + if ("log_runtime") + config.log_runtime = 1 + + if ("log_graffiti") + config.log_graffiti = 1 + + if ("generate_map") + config.generate_map = 1 + + if ("no_click_cooldown") + config.no_click_cooldown = 1 + + if("allow_admin_ooccolor") + config.allow_admin_ooccolor = 1 + + if ("allow_vote_restart") + config.allow_vote_restart = 1 + + if ("allow_vote_mode") + config.allow_vote_mode = 1 + + if ("allow_admin_jump") + config.allow_admin_jump = 1 + + if("allow_admin_rev") + config.allow_admin_rev = 1 + + if ("allow_admin_spawning") + config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 + + if ("no_dead_vote") + config.vote_no_dead = 1 + + if ("default_no_vote") + config.vote_no_default = 1 + + if ("pregame_time") + config.pregame_time = text2num(value) + + if ("vote_delay") + config.vote_delay = text2num(value) + + if ("vote_period") + config.vote_period = text2num(value) + + if ("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if ("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + + if ("vote_autogamemode_timeleft") + config.vote_autogamemode_timeleft = text2num(value) + + if("ert_admin_only") + config.ert_admin_call_only = 1 + + if ("allow_ai") + config.allow_ai = 1 + + if ("allow_ai_shells") + config.allow_ai_shells = TRUE + + if("give_free_ai_shell") + config.give_free_ai_shell = TRUE + +// if ("authentication") +// config.enable_authentication = 1 + + if ("norespawn") + config.respawn = 0 + + if ("respawn_time") + var/raw_minutes = text2num(value) + config.respawn_time = raw_minutes MINUTES + + if ("respawn_message") + config.respawn_message = "[value]" + + if ("servername") + config.server_name = value + + if ("serversuffix") + config.server_suffix = 1 + + if ("nudge_script_path") + config.nudge_script_path = value + + if ("hostedby") + config.hostedby = value + + if ("serverurl") + config.serverurl = value + + if ("server") + config.server = value + + if ("banappeals") + config.banappeals = value + + if ("wikiurl") + config.wikiurl = value + + if ("wikisearchurl") + config.wikisearchurl = value + + if ("forumurl") + config.forumurl = value + + if ("rulesurl") + config.rulesurl = value + + if ("mapurl") + config.mapurl = value + + if ("githuburl") + config.githuburl = value + + if ("discordurl") + config.discordurl = value + + if ("guest_jobban") + config.guest_jobban = 1 + + if ("guest_ban") + config.guests_allowed = 0 + + if ("disable_ooc") + config.ooc_allowed = 0 + config.looc_allowed = 0 + + if ("disable_entry") + config.enter_allowed = 0 + + if ("disable_dead_ooc") + config.dooc_allowed = 0 + + if ("disable_dsay") + config.dsay_allowed = 0 + + if ("disable_respawn") + config.abandon_allowed = 0 + + if ("usewhitelist") + config.usewhitelist = 1 + + if ("feature_object_spell_system") + config.feature_object_spell_system = 1 + + if ("allow_metadata") + config.allow_Metadata = 1 + + if ("traitor_scaling") + config.traitor_scaling = 1 + + if ("aliens_allowed") + config.aliens_allowed = 1 + + if ("ninjas_allowed") + config.ninjas_allowed = 1 + + if ("objectives_disabled") + config.objectives_disabled = 1 + + if("protect_roles_from_antagonist") + config.protect_roles_from_antagonist = 1 + + if("persistence_disabled") + config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. + + if("persistence_ignore_mapload") + config.persistence_ignore_mapload = TRUE + + if ("probability") + var/prob_pos = findtext(value, " ") + var/prob_name = null + var/prob_value = null + + if (prob_pos) + prob_name = lowertext(copytext(value, 1, prob_pos)) + prob_value = copytext(value, prob_pos + 1) + if (prob_name in config.modes) + config.probabilities[prob_name] = text2num(prob_value) + else + log_misc("Unknown game mode probability configuration definition: [prob_name].") + else + log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") + + if ("required_players", "required_players_secret") + var/req_pos = findtext(value, " ") + var/req_name = null + var/req_value = null + var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. + + if(req_pos) + req_name = lowertext(copytext(value, 1, req_pos)) + req_value = copytext(value, req_pos + 1) + if(req_name in config.modes) + if(is_secret_override) + config.player_requirements_secret[req_name] = text2num(req_value) + else + config.player_requirements[req_name] = text2num(req_value) + else + log_misc("Unknown game mode player requirement configuration definition: [req_name].") + else + log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") + + if("allow_random_events") + config.allow_random_events = 1 + + if("enable_game_master") + config.enable_game_master = 1 + + if("kick_inactive") + config.kick_inactive = text2num(value) + + if("show_mods") + config.show_mods = 1 + + if("show_devs") + config.show_devs = 1 + + if("show_event_managers") + config.show_event_managers = 1 + + if("mods_can_tempban") + config.mods_can_tempban = 1 + + if("mods_can_job_tempban") + config.mods_can_job_tempban = 1 + + if("mod_tempban_max") + config.mod_tempban_max = text2num(value) + + if("mod_job_tempban_max") + config.mod_job_tempban_max = text2num(value) + + if("load_jobs_from_txt") + load_jobs_from_txt = 1 + + if("alert_red_upto") + config.alert_desc_red_upto = value + + if("alert_red_downto") + config.alert_desc_red_downto = value + + if("alert_blue_downto") + config.alert_desc_blue_downto = value + + if("alert_blue_upto") + config.alert_desc_blue_upto = value + + if("alert_green") + config.alert_desc_green = value + + if("alert_delta") + config.alert_desc_delta = value + + if("forbid_singulo_possession") + forbid_singulo_possession = 1 + + if("popup_admin_pm") + config.popup_admin_pm = 1 + + if("allow_holidays") + Holiday = 1 + + if("use_irc_bot") + use_irc_bot = 1 + + if("use_node_bot") + use_node_bot = 1 + + if("irc_bot_port") + config.irc_bot_port = value + + if("irc_bot_export") + irc_bot_export = 1 + + if("ticklag") + var/ticklag = text2num(value) + if(ticklag > 0) + fps = 10 / ticklag + + if("tick_limit_mc_init") + tick_limit_mc_init = text2num(value) + + if("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + + if("socket_talk") + socket_talk = text2num(value) + + if("tickcomp") + Tickcomp = 1 + + if("humans_need_surnames") + humans_need_surnames = 1 + + if("tor_ban") + ToRban = 1 + + if("automute_on") + automute_on = 1 + + if("usealienwhitelist") + usealienwhitelist = 1 + + if("alien_player_ratio") + limitalienplayers = 1 + alien_to_human_ratio = text2num(value) + + if("assistant_maint") + config.assistant_maint = 1 + + if("gateway_delay") + config.gateway_delay = text2num(value) + + if("continuous_rounds") + config.continous_rounds = 1 + + if("ghost_interaction") + config.ghost_interaction = 1 + + if("disable_player_mice") + config.disable_player_mice = 1 + + if("uneducated_mice") + config.uneducated_mice = 1 + + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + + if("main_irc") + config.main_irc = value + + if("admin_irc") + config.admin_irc = value + + if("python_path") + if(value) + config.python_path = value + + if("use_lib_nudge") + config.use_lib_nudge = 1 + + if("allow_cult_ghostwriter") + config.cult_ghostwriter = 1 + + if("req_cult_ghostwriter") + config.cult_ghostwriter_req_cultists = text2num(value) + + if("character_slots") + config.character_slots = text2num(value) + + if("loadout_slots") + config.loadout_slots = text2num(value) + + if("allow_drone_spawn") + config.allow_drone_spawn = text2num(value) + + if("drone_build_time") + config.drone_build_time = text2num(value) + + if("max_maint_drones") + config.max_maint_drones = text2num(value) + + if("use_overmap") + config.use_overmap = 1 + + if("engine_map") + config.engine_map = splittext(value, ",") +/* + if("station_levels") + using_map.station_levels = text2numlist(value, ";") + + if("admin_levels") + using_map.admin_levels = text2numlist(value, ";") + + if("contact_levels") + using_map.contact_levels = text2numlist(value, ";") + + if("player_levels") + using_map.player_levels = text2numlist(value, ";") +*/ + if("expected_round_length") + config.expected_round_length = MinutesToTicks(text2num(value)) + + if("disable_welder_vision") + config.welder_vision = 0 + + if("allow_extra_antags") + config.allow_extra_antags = 1 + + if("event_custom_start_mundane") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_moderate") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_major") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_delay_lower") + var/values = text2numlist(value, ";") + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("event_delay_upper") + var/values = text2numlist(value, ";") + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("starlight") + value = text2num(value) + config.starlight = value >= 0 ? value : 0 + + if("ert_species") + config.ert_species = splittext(value, ";") + if(!config.ert_species.len) + config.ert_species += SPECIES_HUMAN + + if("law_zero") + law_zero = value + + if("aggressive_changelog") + config.aggressive_changelog = 1 + + if("default_language_prefixes") + var/list/values = splittext(value, " ") + if(values.len > 0) + language_prefixes = values + + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + + if("radiation_resistance_calc_divide") + radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV + + if("radiation_resistance_calc_subtract") + radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB + + if("radiation_resistance_multiplier") + radiation_resistance_multiplier = text2num(value) + + if("radiation_material_resistance_divisor") + radiation_material_resistance_divisor = text2num(value) + + if("radiation_decay_rate") + radiation_decay_rate = text2num(value) + + if ("panic_bunker") + config.panic_bunker = 1 + + if ("paranoia_logging") + config.paranoia_logging = 1 + + if("ip_reputation") + config.ip_reputation = 1 + + if("ipr_email") + config.ipr_email = value + + if("ipr_block_bad_ips") + config.ipr_block_bad_ips = 1 + + if("ipr_bad_score") + config.ipr_bad_score = text2num(value) + + if("ipr_allow_existing") + config.ipr_allow_existing = 1 + + if("ipr_minimum_age") + config.ipr_minimum_age = text2num(value) + + if("random_submap_orientation") + config.random_submap_orientation = 1 + + if("autostart_solars") + config.autostart_solars = TRUE + + if("sqlite_enabled") + config.sqlite_enabled = TRUE + + if("sqlite_feedback") + config.sqlite_feedback = TRUE + + if("sqlite_feedback_topics") + config.sqlite_feedback_topics = splittext(value, ";") + if(!config.sqlite_feedback_topics.len) + config.sqlite_feedback_topics += "General" + + if("sqlite_feedback_privacy") + config.sqlite_feedback_privacy = TRUE + + if("sqlite_feedback_cooldown") + config.sqlite_feedback_cooldown = text2num(value) + + if("defib_timer") + config.defib_timer = text2num(value) + + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE + + if("enable_night_shifts") + config.enable_night_shifts = TRUE + + if("jukebox_track_files") + config.jukebox_track_files = splittext(value, ";") + + // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. + if("vgs_access_identifier") + config.vgs_access_identifier = value + if("vgs_server_port") + config.vgs_server_port = text2num(value) + // VOREStation Edit End + + else + log_misc("Unknown setting in configuration: '[name]'") + + else if(type == "game_options") + if(!value) + log_misc("Unknown value for setting [name] in [filename].") + value = text2num(value) + + switch(name) + if("health_threshold_crit") + config.health_threshold_crit = value + if("health_threshold_softcrit") + config.health_threshold_softcrit = value + if("health_threshold_dead") + config.health_threshold_dead = value + if("show_human_death_message") + config.show_human_death_message = 1 + if("revival_pod_plants") + config.revival_pod_plants = value + if("revival_cloning") + config.revival_cloning = value + if("revival_brain_life") + config.revival_brain_life = value + if("organ_health_multiplier") + config.organ_health_multiplier = value / 100 + if("organ_regeneration_multiplier") + config.organ_regeneration_multiplier = value / 100 + if("organ_damage_spillover_multiplier") + config.organ_damage_spillover_multiplier = value / 100 + if("organs_can_decay") + config.organs_decay = 1 + if("default_brain_health") + config.default_brain_health = text2num(value) + if(!config.default_brain_health || config.default_brain_health < 1) + config.default_brain_health = initial(config.default_brain_health) + if("bones_can_break") + config.bones_can_break = value + if("limbs_can_break") + config.limbs_can_break = value + if("allow_headgibs") + config.allow_headgibs = TRUE + + if("run_speed") + config.run_speed = value + if("walk_speed") + config.walk_speed = value + + if("human_delay") + config.human_delay = value + if("robot_delay") + config.robot_delay = value + if("monkey_delay") + config.monkey_delay = value + if("alien_delay") + config.alien_delay = value + if("slime_delay") + config.slime_delay = value + if("animal_delay") + config.animal_delay = value + + if("footstep_volume") + config.footstep_volume = text2num(value) + + if("use_loyalty_implants") + config.use_loyalty_implants = 1 + + if("loadout_whitelist") + config.loadout_whitelist = text2num(value) + + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + if ("feedback_database") + sqlfdbkdb = value + if ("feedback_login") + sqlfdbklogin = value + if ("feedback_password") + sqlfdbkpass = value + if ("enable_stat_tracking") + sqllogging = 1 + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadforumsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + forumsqladdress = value + if ("port") + forumsqlport = value + if ("database") + forumsqldb = value + if ("login") + forumsqllogin = value + if ("password") + forumsqlpass = value + if ("activatedgroup") + forum_activated_group = value + if ("authenticatedgroup") + forum_authenticated_group = value + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/pick_mode(mode_name) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + for (var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if (M.config_tag && M.config_tag == mode_name) + return M + return gamemode_cache["extended"] + +/datum/configuration/proc/get_runnable_modes() + var/list/runnable_modes = list() + for(var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) + runnable_modes |= M + return runnable_modes + +/datum/configuration/proc/post_load() + //apply a default value to config.python_path, if needed + if (!config.python_path) + if(world.system_type == UNIX) + config.python_path = "/usr/bin/env python2" + else //probably windows, if not this should work anyway + config.python_path = "python" +======= +var/list/gamemode_cache = list() + +/datum/configuration + var/static/server_name = null // server name (for world name / status) + var/static/server_suffix = 0 // generate numeric suffix based on server port + + var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located + + var/static/log_ooc = 0 // log OOC channel + var/static/log_access = 0 // log login/logout + var/static/log_say = 0 // log client say + var/static/log_admin = 0 // log admin actions + var/static/log_debug = 1 // log debug output + var/static/log_game = 0 // log game events + var/static/log_vote = 0 // log voting + var/static/log_whisper = 0 // log client whisper + var/static/log_emote = 0 // log emotes + var/static/log_attack = 0 // log attack messages + var/static/log_adminchat = 0 // log admin chat messages + var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such + var/static/log_pda = 0 // log pda messages + var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits + var/static/log_runtime = 0 // logs world.log to a file + var/static/log_world_output = 0 // log to_world_log(messages) + var/static/log_graffiti = 0 // logs graffiti + var/static/sql_enabled = 0 // for sql switching + var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour + var/static/allow_vote_restart = 0 // allow votes to restart + var/static/ert_admin_call_only = 0 + var/static/allow_vote_mode = 0 // allow votes to change mode + var/static/allow_admin_jump = 1 // allows admin jumping + var/static/allow_admin_spawning = 1 // allows admin item spawning + var/static/allow_admin_rev = 1 // allows admin revives + var/static/pregame_time = 180 // pregame time in seconds + var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) + var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) + var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called + var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote + var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). + var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) + var/static/vote_no_dead = 0 // dead people can't vote (tbi) +// var/static/enable_authentication = 0 // goon authentication + var/static/del_new_on_log = 1 // del's new players if they log before they spawn in + var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard + var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/static/objectives_disabled = 0 //if objectives are disabled or not + var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other + var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/static/allow_Metadata = 0 // Metadata is supported. + var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/static/fps = 20 + var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling + var/static/Tickcomp = 0 + var/static/socket_talk = 0 // use socket_talk to communicate with other processes + var/static/list/resource_urls = null + var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/static/list/mode_names = list() + var/static/list/modes = list() // allowed modes + var/static/list/votable_modes = list() // votable modes + var/static/list/probabilities = list() // relative probability of each mode + var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. + var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. + var/static/humans_need_surnames = 0 + var/static/allow_random_events = 0 // enables random events mid-round when set to 1 + var/static/enable_game_master = 0 // enables the 'smart' event system. + var/static/allow_ai = 1 // allow ai job + var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. + var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell + var/static/hostedby = null + + var/static/respawn = 1 + var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) + var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" + + var/static/guest_jobban = 1 + var/static/usewhitelist = 0 + var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 + var/static/show_mods = 0 + var/static/show_devs = 0 + var/static/show_event_managers = 0 + var/static/mods_can_tempban = 0 + var/static/mods_can_job_tempban = 0 + var/static/mod_tempban_max = 1440 + var/static/mod_job_tempban_max = 1440 + var/static/load_jobs_from_txt = 0 + var/static/ToRban = 0 + var/static/automute_on = 0 //enables automuting/spam prevention + var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + + var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... + var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. + + var/static/character_slots = 10 // The number of available character slots + var/static/loadout_slots = 3 // The number of loadout slots per character + + var/static/max_maint_drones = 5 //This many drones can spawn, + var/static/allow_drone_spawn = 1 //assuming the admin allow them to. + var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. + + var/static/disable_player_mice = 0 + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech + + var/static/usealienwhitelist = 0 + var/static/limitalienplayers = 0 + var/static/alien_to_human_ratio = 0.5 + var/static/allow_extra_antags = 0 + var/static/guests_allowed = 1 + var/static/debugparanoid = 0 + var/static/panic_bunker = 0 + var/static/paranoia_logging = 0 + + var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. + var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. + var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). + var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. + var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. + var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. + + var/static/serverurl + var/static/server + var/static/banappeals + var/static/wikiurl + var/static/wikisearchurl + var/static/forumurl + var/static/githuburl + var/static/discordurl + var/static/rulesurl + var/static/mapurl + + //Alert level description + var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." + var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." + var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + + var/static/forbid_singulo_possession = 0 + + //game_options.txt configs + + var/static/health_threshold_softcrit = 0 + var/static/health_threshold_crit = 0 + var/static/health_threshold_dead = -100 + + var/static/organ_health_multiplier = 1 + var/static/organ_regeneration_multiplier = 1 + var/static/organs_decay + var/static/default_brain_health = 400 + var/static/allow_headgibs = FALSE + + //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, + //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. + var/static/organ_damage_spillover_multiplier = 0.5 + + var/static/bones_can_break = 0 + var/static/limbs_can_break = 0 + + var/static/revival_pod_plants = 1 + var/static/revival_cloning = 1 + var/static/revival_brain_life = -1 + + var/static/use_loyalty_implants = 0 + + var/static/welder_vision = 1 + var/static/generate_map = 0 + var/static/no_click_cooldown = 0 + + //Used for modifying movement speed for mobs. + //Unversal modifiers + var/static/run_speed = 0 + var/static/walk_speed = 0 + + //Mob specific modifiers. NOTE: These will affect different mob types in different ways + var/static/human_delay = 0 + var/static/robot_delay = 0 + var/static/monkey_delay = 0 + var/static/alien_delay = 0 + var/static/slime_delay = 0 + var/static/animal_delay = 0 + + var/static/footstep_volume = 0 + + var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt + var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt + var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database + + var/static/simultaneous_pm_warning_timeout = 100 + + var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. + var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. + + var/static/assistant_maint = 0 //Do assistants get maint access? + var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. + var/static/ghost_interaction = 0 + + var/static/comms_password = "" + + var/static/enter_allowed = 1 + + var/use_irc_bot = 0 + var/use_node_bot = 0 + var/irc_bot_port = 0 + var/irc_bot_host = "" + var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge + var/main_irc = "" + var/admin_irc = "" + var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix + var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. + var/use_overmap = 0 + + var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. + + // Event settings + var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours + // If the first delay has a custom start time + // No custom time, no custom time, between 80 to 100 minutes respectively. + var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) + // The lowest delay until next event + // 10, 30, 50 minutes respectively + var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) + // The upper delay until next event + // 15, 45, 70 minutes respectively + var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) + + var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. + var/static/ninjas_allowed = 0 + var/static/abandon_allowed = 1 + var/static/ooc_allowed = 1 + var/static/looc_allowed = 1 + var/static/dooc_allowed = 1 + var/static/dsay_allowed = 1 + + var/persistence_disabled = FALSE + var/persistence_ignore_mapload = FALSE + + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + + var/starlight = 0 // Whether space turfs have ambient light or not + + var/static/list/ert_species = list(SPECIES_HUMAN) + + var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + + var/static/aggressive_changelog = 0 + + var/static/list/language_prefixes = list(",","#")//Default language prefixes + + var/static/show_human_death_message = 1 + + var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf + var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/static/radiation_material_resistance_divisor = 1 + var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + + var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. + var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. + + // New shiny SQLite stuff. + // The basics. + var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. + + // In-Game Feedback. + var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. + var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. + var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. + var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. + var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + + var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/static/disable_cid_warn_popup = FALSE + + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + + // How strictly the loadout enforces object species whitelists + var/loadout_whitelist = LOADOUT_WHITELIST_LAX + + var/static/vgs_access_identifier = null // VOREStation Edit - VGS + var/static/vgs_server_port = null // VOREStation Edit - VGS + + var/disable_webhook_embeds = FALSE + + var/static/list/jukebox_track_files + +/datum/configuration/New() + var/list/L = subtypesof(/datum/game_mode) + for (var/T in L) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + var/datum/game_mode/M = new T() + if (M.config_tag) + gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. + if(!(M.config_tag in modes)) // ensure each mode is added only once + log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") + modes += M.config_tag + mode_names[M.config_tag] = M.name + probabilities[M.config_tag] = M.probability + player_requirements[M.config_tag] = M.required_players + player_requirements_secret[M.config_tag] = M.required_players_secret + if (M.votable) + src.votable_modes += M.config_tag + src.votable_modes += "secret" + +/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist + var/list/Lines = file2list(filename) + + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + if(type == "config") + switch (name) + if ("resource_urls") + config.resource_urls = splittext(value, " ") + + if ("admin_legacy_system") + config.admin_legacy_system = 1 + + if ("ban_legacy_system") + config.ban_legacy_system = 1 + + if ("use_age_restriction_for_jobs") + config.use_age_restriction_for_jobs = 1 + + if ("use_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + + if ("jobs_have_minimal_access") + config.jobs_have_minimal_access = 1 + + if ("use_recursive_explosions") + use_recursive_explosions = 1 + + if ("multi_z_explosion_scalar") + multi_z_explosion_scalar = text2num(value) + + if ("log_ooc") + config.log_ooc = 1 + + if ("log_access") + config.log_access = 1 + + if ("sql_enabled") + config.sql_enabled = 1 + + if ("log_say") + config.log_say = 1 + + if ("debug_paranoid") + config.debugparanoid = 1 + + if ("log_admin") + config.log_admin = 1 + + if ("log_debug") + config.log_debug = text2num(value) + + if ("log_game") + config.log_game = 1 + + if ("log_vote") + config.log_vote = 1 + + if ("log_whisper") + config.log_whisper = 1 + + if ("log_attack") + config.log_attack = 1 + + if ("log_emote") + config.log_emote = 1 + + if ("log_adminchat") + config.log_adminchat = 1 + + if ("log_adminwarn") + config.log_adminwarn = 1 + + if ("log_pda") + config.log_pda = 1 + + if ("log_world_output") + config.log_world_output = 1 + + if ("log_hrefs") + config.log_hrefs = 1 + + if ("log_runtime") + config.log_runtime = 1 + + if ("log_graffiti") + config.log_graffiti = 1 + + if ("generate_map") + config.generate_map = 1 + + if ("no_click_cooldown") + config.no_click_cooldown = 1 + + if("allow_admin_ooccolor") + config.allow_admin_ooccolor = 1 + + if ("allow_vote_restart") + config.allow_vote_restart = 1 + + if ("allow_vote_mode") + config.allow_vote_mode = 1 + + if ("allow_admin_jump") + config.allow_admin_jump = 1 + + if("allow_admin_rev") + config.allow_admin_rev = 1 + + if ("allow_admin_spawning") + config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 + + if ("no_dead_vote") + config.vote_no_dead = 1 + + if ("default_no_vote") + config.vote_no_default = 1 + + if ("pregame_time") + config.pregame_time = text2num(value) + + if ("vote_delay") + config.vote_delay = text2num(value) + + if ("vote_period") + config.vote_period = text2num(value) + + if ("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if ("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + + if ("vote_autogamemode_timeleft") + config.vote_autogamemode_timeleft = text2num(value) + + if("ert_admin_only") + config.ert_admin_call_only = 1 + + if ("allow_ai") + config.allow_ai = 1 + + if ("allow_ai_shells") + config.allow_ai_shells = TRUE + + if("give_free_ai_shell") + config.give_free_ai_shell = TRUE + +// if ("authentication") +// config.enable_authentication = 1 + + if ("norespawn") + config.respawn = 0 + + if ("respawn_time") + var/raw_minutes = text2num(value) + config.respawn_time = raw_minutes MINUTES + + if ("respawn_message") + config.respawn_message = "[value]" + + if ("servername") + config.server_name = value + + if ("serversuffix") + config.server_suffix = 1 + + if ("nudge_script_path") + config.nudge_script_path = value + + if ("hostedby") + config.hostedby = value + + if ("serverurl") + config.serverurl = value + + if ("server") + config.server = value + + if ("banappeals") + config.banappeals = value + + if ("wikiurl") + config.wikiurl = value + + if ("wikisearchurl") + config.wikisearchurl = value + + if ("forumurl") + config.forumurl = value + + if ("rulesurl") + config.rulesurl = value + + if ("mapurl") + config.mapurl = value + + if ("githuburl") + config.githuburl = value + + if ("discordurl") + config.discordurl = value + + if ("guest_jobban") + config.guest_jobban = 1 + + if ("guest_ban") + config.guests_allowed = 0 + + if ("disable_ooc") + config.ooc_allowed = 0 + config.looc_allowed = 0 + + if ("disable_entry") + config.enter_allowed = 0 + + if ("disable_dead_ooc") + config.dooc_allowed = 0 + + if ("disable_dsay") + config.dsay_allowed = 0 + + if ("disable_respawn") + config.abandon_allowed = 0 + + if ("usewhitelist") + config.usewhitelist = 1 + + if ("feature_object_spell_system") + config.feature_object_spell_system = 1 + + if ("allow_metadata") + config.allow_Metadata = 1 + + if ("traitor_scaling") + config.traitor_scaling = 1 + + if ("aliens_allowed") + config.aliens_allowed = 1 + + if ("ninjas_allowed") + config.ninjas_allowed = 1 + + if ("objectives_disabled") + config.objectives_disabled = 1 + + if("protect_roles_from_antagonist") + config.protect_roles_from_antagonist = 1 + + if("persistence_disabled") + config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. + + if("persistence_ignore_mapload") + config.persistence_ignore_mapload = TRUE + + if ("probability") + var/prob_pos = findtext(value, " ") + var/prob_name = null + var/prob_value = null + + if (prob_pos) + prob_name = lowertext(copytext(value, 1, prob_pos)) + prob_value = copytext(value, prob_pos + 1) + if (prob_name in config.modes) + config.probabilities[prob_name] = text2num(prob_value) + else + log_misc("Unknown game mode probability configuration definition: [prob_name].") + else + log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") + + if ("required_players", "required_players_secret") + var/req_pos = findtext(value, " ") + var/req_name = null + var/req_value = null + var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. + + if(req_pos) + req_name = lowertext(copytext(value, 1, req_pos)) + req_value = copytext(value, req_pos + 1) + if(req_name in config.modes) + if(is_secret_override) + config.player_requirements_secret[req_name] = text2num(req_value) + else + config.player_requirements[req_name] = text2num(req_value) + else + log_misc("Unknown game mode player requirement configuration definition: [req_name].") + else + log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") + + if("allow_random_events") + config.allow_random_events = 1 + + if("enable_game_master") + config.enable_game_master = 1 + + if("kick_inactive") + config.kick_inactive = text2num(value) + + if("show_mods") + config.show_mods = 1 + + if("show_devs") + config.show_devs = 1 + + if("show_event_managers") + config.show_event_managers = 1 + + if("mods_can_tempban") + config.mods_can_tempban = 1 + + if("mods_can_job_tempban") + config.mods_can_job_tempban = 1 + + if("mod_tempban_max") + config.mod_tempban_max = text2num(value) + + if("mod_job_tempban_max") + config.mod_job_tempban_max = text2num(value) + + if("load_jobs_from_txt") + load_jobs_from_txt = 1 + + if("alert_red_upto") + config.alert_desc_red_upto = value + + if("alert_red_downto") + config.alert_desc_red_downto = value + + if("alert_blue_downto") + config.alert_desc_blue_downto = value + + if("alert_blue_upto") + config.alert_desc_blue_upto = value + + if("alert_green") + config.alert_desc_green = value + + if("alert_delta") + config.alert_desc_delta = value + + if("forbid_singulo_possession") + forbid_singulo_possession = 1 + + if("popup_admin_pm") + config.popup_admin_pm = 1 + + if("allow_holidays") + Holiday = 1 + + if("use_irc_bot") + use_irc_bot = 1 + + if("use_node_bot") + use_node_bot = 1 + + if("irc_bot_port") + config.irc_bot_port = value + + if("irc_bot_export") + irc_bot_export = 1 + + if("ticklag") + var/ticklag = text2num(value) + if(ticklag > 0) + fps = 10 / ticklag + + if("tick_limit_mc_init") + tick_limit_mc_init = text2num(value) + + if("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + + if("socket_talk") + socket_talk = text2num(value) + + if("tickcomp") + Tickcomp = 1 + + if("humans_need_surnames") + humans_need_surnames = 1 + + if("tor_ban") + ToRban = 1 + + if("automute_on") + automute_on = 1 + + if("usealienwhitelist") + usealienwhitelist = 1 + + if("alien_player_ratio") + limitalienplayers = 1 + alien_to_human_ratio = text2num(value) + + if("assistant_maint") + config.assistant_maint = 1 + + if("gateway_delay") + config.gateway_delay = text2num(value) + + if("continuous_rounds") + config.continous_rounds = 1 + + if("ghost_interaction") + config.ghost_interaction = 1 + + if("disable_player_mice") + config.disable_player_mice = 1 + + if("uneducated_mice") + config.uneducated_mice = 1 + + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + + if("main_irc") + config.main_irc = value + + if("admin_irc") + config.admin_irc = value + + if("python_path") + if(value) + config.python_path = value + + if("use_lib_nudge") + config.use_lib_nudge = 1 + + if("allow_cult_ghostwriter") + config.cult_ghostwriter = 1 + + if("req_cult_ghostwriter") + config.cult_ghostwriter_req_cultists = text2num(value) + + if("character_slots") + config.character_slots = text2num(value) + + if("loadout_slots") + config.loadout_slots = text2num(value) + + if("allow_drone_spawn") + config.allow_drone_spawn = text2num(value) + + if("drone_build_time") + config.drone_build_time = text2num(value) + + if("max_maint_drones") + config.max_maint_drones = text2num(value) + + if("use_overmap") + config.use_overmap = 1 + + if("engine_map") + config.engine_map = splittext(value, ",") +/* + if("station_levels") + using_map.station_levels = text2numlist(value, ";") + + if("admin_levels") + using_map.admin_levels = text2numlist(value, ";") + + if("contact_levels") + using_map.contact_levels = text2numlist(value, ";") + + if("player_levels") + using_map.player_levels = text2numlist(value, ";") +*/ + if("expected_round_length") + config.expected_round_length = MinutesToTicks(text2num(value)) + + if("disable_welder_vision") + config.welder_vision = 0 + + if("allow_extra_antags") + config.allow_extra_antags = 1 + + if("event_custom_start_mundane") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_moderate") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_major") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_delay_lower") + var/values = text2numlist(value, ";") + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("event_delay_upper") + var/values = text2numlist(value, ";") + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("starlight") + value = text2num(value) + config.starlight = value >= 0 ? value : 0 + + if("ert_species") + config.ert_species = splittext(value, ";") + if(!config.ert_species.len) + config.ert_species += SPECIES_HUMAN + + if("law_zero") + law_zero = value + + if("aggressive_changelog") + config.aggressive_changelog = 1 + + if("default_language_prefixes") + var/list/values = splittext(value, " ") + if(values.len > 0) + language_prefixes = values + + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + + if("radiation_resistance_calc_divide") + radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV + + if("radiation_resistance_calc_subtract") + radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB + + if("radiation_resistance_multiplier") + radiation_resistance_multiplier = text2num(value) + + if("radiation_material_resistance_divisor") + radiation_material_resistance_divisor = text2num(value) + + if("radiation_decay_rate") + radiation_decay_rate = text2num(value) + + if ("panic_bunker") + config.panic_bunker = 1 + + if ("paranoia_logging") + config.paranoia_logging = 1 + + if("ip_reputation") + config.ip_reputation = 1 + + if("ipr_email") + config.ipr_email = value + + if("ipr_block_bad_ips") + config.ipr_block_bad_ips = 1 + + if("ipr_bad_score") + config.ipr_bad_score = text2num(value) + + if("ipr_allow_existing") + config.ipr_allow_existing = 1 + + if("ipr_minimum_age") + config.ipr_minimum_age = text2num(value) + + if("random_submap_orientation") + config.random_submap_orientation = 1 + + if("autostart_solars") + config.autostart_solars = TRUE + + if("sqlite_enabled") + config.sqlite_enabled = TRUE + + if("sqlite_feedback") + config.sqlite_feedback = TRUE + + if("sqlite_feedback_topics") + config.sqlite_feedback_topics = splittext(value, ";") + if(!config.sqlite_feedback_topics.len) + config.sqlite_feedback_topics += "General" + + if("sqlite_feedback_privacy") + config.sqlite_feedback_privacy = TRUE + + if("sqlite_feedback_cooldown") + config.sqlite_feedback_cooldown = text2num(value) + + if("defib_timer") + config.defib_timer = text2num(value) + + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE + + if("enable_night_shifts") + config.enable_night_shifts = TRUE + + if("jukebox_track_files") + config.jukebox_track_files = splittext(value, ";") + + // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. + if("vgs_access_identifier") + config.vgs_access_identifier = value + if("vgs_server_port") + config.vgs_server_port = text2num(value) + // VOREStation Edit End + + else + log_misc("Unknown setting in configuration: '[name]'") + + else if(type == "game_options") + if(!value) + log_misc("Unknown value for setting [name] in [filename].") + value = text2num(value) + + switch(name) + if("health_threshold_crit") + config.health_threshold_crit = value + if("health_threshold_softcrit") + config.health_threshold_softcrit = value + if("health_threshold_dead") + config.health_threshold_dead = value + if("show_human_death_message") + config.show_human_death_message = 1 + if("revival_pod_plants") + config.revival_pod_plants = value + if("revival_cloning") + config.revival_cloning = value + if("revival_brain_life") + config.revival_brain_life = value + if("organ_health_multiplier") + config.organ_health_multiplier = value / 100 + if("organ_regeneration_multiplier") + config.organ_regeneration_multiplier = value / 100 + if("organ_damage_spillover_multiplier") + config.organ_damage_spillover_multiplier = value / 100 + if("organs_can_decay") + config.organs_decay = 1 + if("default_brain_health") + config.default_brain_health = text2num(value) + if(!config.default_brain_health || config.default_brain_health < 1) + config.default_brain_health = initial(config.default_brain_health) + if("bones_can_break") + config.bones_can_break = value + if("limbs_can_break") + config.limbs_can_break = value + if("allow_headgibs") + config.allow_headgibs = TRUE + + if("run_speed") + config.run_speed = value + if("walk_speed") + config.walk_speed = value + + if("human_delay") + config.human_delay = value + if("robot_delay") + config.robot_delay = value + if("monkey_delay") + config.monkey_delay = value + if("alien_delay") + config.alien_delay = value + if("slime_delay") + config.slime_delay = value + if("animal_delay") + config.animal_delay = value + + if("footstep_volume") + config.footstep_volume = text2num(value) + + if("use_loyalty_implants") + config.use_loyalty_implants = 1 + + if("loadout_whitelist") + config.loadout_whitelist = text2num(value) + + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + if ("feedback_database") + sqlfdbkdb = value + if ("feedback_login") + sqlfdbklogin = value + if ("feedback_password") + sqlfdbkpass = value + if ("enable_stat_tracking") + sqllogging = 1 + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadforumsql(filename) // -- TLE + var/list/Lines = file2list(filename) + for(var/t in Lines) + if(!t) continue + + t = trim(t) + if (length(t) == 0) + continue + else if (copytext(t, 1, 2) == "#") + continue + + var/pos = findtext(t, " ") + var/name = null + var/value = null + + if (pos) + name = lowertext(copytext(t, 1, pos)) + value = copytext(t, pos + 1) + else + name = lowertext(t) + + if (!name) + continue + + switch (name) + if ("address") + forumsqladdress = value + if ("port") + forumsqlport = value + if ("database") + forumsqldb = value + if ("login") + forumsqllogin = value + if ("password") + forumsqlpass = value + if ("activatedgroup") + forum_activated_group = value + if ("authenticatedgroup") + forum_authenticated_group = value + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/pick_mode(mode_name) + // I wish I didn't have to instance the game modes in order to look up + // their information, but it is the only way (at least that I know of). + for (var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if (M.config_tag && M.config_tag == mode_name) + return M + return gamemode_cache["extended"] + +/datum/configuration/proc/get_runnable_modes() + var/list/runnable_modes = list() + for(var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) + runnable_modes |= M + return runnable_modes + +/datum/configuration/proc/post_load() + //apply a default value to config.python_path, if needed + if (!config.python_path) + if(world.system_type == UNIX) + config.python_path = "/usr/bin/env python2" + else //probably windows, if not this should work anyway + config.python_path = "python" +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 4ff1b7219b..fc065bc86a 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -251,8 +251,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/list/tickersubsystems = list() var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel var/timer = world.time - for (var/thing in subsystems) - var/datum/controller/subsystem/SS = thing + for (var/datum/controller/subsystem/SS as anything in subsystems) if (SS.flags & SS_NO_FIRE) continue SS.queued_time = 0 @@ -339,8 +338,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new cached_runlevel = checking_runlevel current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel] var/stagger = world.time - for(var/I in current_runlevel_subsystems) - var/datum/controller/subsystem/SS = I + for(var/datum/controller/subsystem/SS as anything in current_runlevel_subsystems) if(SS.next_fire <= world.time) stagger += world.tick_lag * rand(1, 5) SS.next_fire = stagger @@ -553,8 +551,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new for(var/I in runlevel_SS) subsystemstocheck |= I - for (var/thing in subsystemstocheck) - var/datum/controller/subsystem/SS = thing + for (var/datum/controller/subsystem/SS as anything in subsystemstocheck) if (!SS || !istype(SS)) //list(SS) is so if a list makes it in the subsystem list, we remove the list, not the contents subsystems -= list(SS) @@ -601,8 +598,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new //disallow more than one map to load at once, multithreading it will just cause race conditions while(map_loading) stoplag() - for(var/S in subsystems) - var/datum/controller/subsystem/SS = S + for(var/datum/controller/subsystem/SS as anything in subsystems) SS.StartLoadingMap() map_loading = TRUE @@ -611,6 +607,5 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if(!quiet) admin_notice("Map is finished. Unlocking.", R_DEBUG) map_loading = FALSE - for(var/S in subsystems) - var/datum/controller/subsystem/SS = S + for(var/datum/controller/subsystem/SS as anything in subsystems) SS.StopLoadingMap() diff --git a/code/controllers/subsystems/assets.dm b/code/controllers/subsystems/assets.dm index 2041104a2b..00d1693c06 100644 --- a/code/controllers/subsystems/assets.dm +++ b/code/controllers/subsystems/assets.dm @@ -6,8 +6,7 @@ SUBSYSTEM_DEF(assets) var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) - for(var/type in typesof(/datum/asset)) - var/datum/asset/A = type + for(var/datum/asset/A as anything in typesof(/datum/asset)) if (type != initial(A._abstract)) get_asset_datum(type) diff --git a/code/controllers/subsystems/atoms.dm b/code/controllers/subsystems/atoms.dm index 4db490914a..a62c5265c5 100644 --- a/code/controllers/subsystems/atoms.dm +++ b/code/controllers/subsystems/atoms.dm @@ -38,11 +38,10 @@ SUBSYSTEM_DEF(atoms) if(atoms) created_atoms = list() count = atoms.len - for(var/I in atoms) - var/atom/A = I + for(var/atom/A as anything in atoms) if(!A.initialized) - if(InitAtom(I, mapload_arg)) - atoms -= I + if(InitAtom(A, mapload_arg)) + atoms -= A CHECK_TICK else count = 0 @@ -57,8 +56,7 @@ SUBSYSTEM_DEF(atoms) initialized = INITIALIZATION_INNEW_REGULAR if(late_loaders.len) - for(var/I in late_loaders) - var/atom/A = I + for(var/atom/A as anything in late_loaders) A.LateInitialize() CHECK_TICK testing("Late initialized [late_loaders.len] atoms") diff --git a/code/controllers/subsystems/chat.dm b/code/controllers/subsystems/chat.dm index 553c30d128..aece61d39e 100644 --- a/code/controllers/subsystems/chat.dm +++ b/code/controllers/subsystems/chat.dm @@ -13,8 +13,7 @@ SUBSYSTEM_DEF(chat) /datum/controller/subsystem/chat/fire() var/list/msg_queue = src.msg_queue // Local variable for sanic speed. - for(var/i in msg_queue) - var/client/C = i + for(var/client/C as anything in msg_queue) var/list/messages = msg_queue[C] msg_queue -= C if (C) diff --git a/code/controllers/subsystems/circuits.dm b/code/controllers/subsystems/circuits.dm index 8fda048c60..4d2b282171 100644 --- a/code/controllers/subsystems/circuits.dm +++ b/code/controllers/subsystems/circuits.dm @@ -23,11 +23,10 @@ SUBSYSTEM_DEF(circuit) /datum/controller/subsystem/circuit/proc/circuits_init() //Cached lists for free performance - for(var/path in typesof(/obj/item/integrated_circuit)) - var/obj/item/integrated_circuit/IC = path - var/name = initial(IC.name) - all_components[name] = path // Populating the component lists - cached_components[IC] = new path + for(var/obj/item/integrated_circuit/IC as anything in typesof(/obj/item/integrated_circuit)) + var/path = IC + all_components[initial(IC.name)] = path // Populating the component lists + cached_components[path] = new path if(!(initial(IC.spawn_flags) & (IC_SPAWN_DEFAULT | IC_SPAWN_RESEARCH))) continue @@ -38,11 +37,10 @@ SUBSYSTEM_DEF(circuit) var/list/category_list = circuit_fabricator_recipe_list[category] category_list += IC // Populating the fabricator categories - for(var/path in typesof(/obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/A = path - var/name = initial(A.name) - all_assemblies[name] = path - cached_assemblies[A] = new path + for(var/obj/item/device/electronic_assembly/A as anything in typesof(/obj/item/device/electronic_assembly)) + var/path = A + all_assemblies[initial(A.name)] = path + cached_assemblies[path] = new path circuit_fabricator_recipe_list["Assemblies"] = list( diff --git a/code/controllers/subsystems/events.dm b/code/controllers/subsystems/events.dm index 5b613775e4..83ab2fa00c 100644 --- a/code/controllers/subsystems/events.dm +++ b/code/controllers/subsystems/events.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(events) var/datum/event_meta/new_event = new /datum/controller/subsystem/events/Initialize() - allEvents = typesof(/datum/event) - /datum/event + allEvents = subtypesof(/datum/event) event_containers = list( EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane, EVENT_LEVEL_MODERATE = new/datum/event_container/moderate, diff --git a/code/controllers/subsystems/events2.dm b/code/controllers/subsystems/events2.dm index 2a73498b1d..7cf986358f 100644 --- a/code/controllers/subsystems/events2.dm +++ b/code/controllers/subsystems/events2.dm @@ -14,8 +14,7 @@ SUBSYSTEM_DEF(event_ticker) // Process active events. /datum/controller/subsystem/event_ticker/fire(resumed) - for(var/E in active_events) - var/datum/event2/event/event = E + for(var/datum/event2/event/event as anything in active_events) event.process() if(event.finished) event_finished(event) diff --git a/code/controllers/subsystems/game_master.dm b/code/controllers/subsystems/game_master.dm index 01ea086935..06a6060227 100644 --- a/code/controllers/subsystems/game_master.dm +++ b/code/controllers/subsystems/game_master.dm @@ -74,8 +74,7 @@ SUBSYSTEM_DEF(game_master) chosen_event.enabled = FALSE if(chosen_event.event_class) // Disable similar events, too. - for(var/M in available_events) - var/datum/event2/meta/meta = M + for(var/datum/event2/meta/meta as anything in available_events) if(meta.event_class == chosen_event.event_class) meta.enabled = FALSE @@ -235,8 +234,7 @@ SUBSYSTEM_DEF(game_master) dat += "Players" dat += "" - for(var/P in player_list) - var/mob/M = P + for(var/mob/M as anything in player_list) dat += "" dat += "[M] ([M.ckey])" dat += "[metric.assess_player_activity(M)]%" @@ -255,8 +253,7 @@ SUBSYSTEM_DEF(game_master) dat += "Buttons" dat += "" - for(var/E in available_events) - var/datum/event2/meta/event = E + for(var/datum/event2/meta/event as anything in available_events) dat += "" if(!event.enabled) dat += "[event.name]" @@ -285,8 +282,7 @@ SUBSYSTEM_DEF(game_master) dat += "Buttons" dat += "" - for(var/E in SSevent_ticker.active_events) - var/datum/event2/event/event = E + for(var/datum/event2/event/event as anything in SSevent_ticker.active_events) dat += "" dat += "[event.type]" dat += "[event.time_started]" @@ -309,8 +305,7 @@ SUBSYSTEM_DEF(game_master) dat += "Finish Time" dat += "" - for(var/E in SSevent_ticker.finished_events) - var/datum/event2/event/event = E + for(var/datum/event2/event/event as anything in SSevent_ticker.finished_events) dat += "" dat += "[event.type]" dat += "[event.time_started]" diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index 422fa6743f..c1fe92295d 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -172,8 +172,7 @@ SUBSYSTEM_DEF(garbage) log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") #ifdef TESTING - for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage - var/client/admin = c + for(var/client/admin as anything in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage if(!check_rights_for(admin, R_ADMIN)) continue to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --") diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index 848a5552d6..06bf16e255 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -34,11 +34,10 @@ SUBSYSTEM_DEF(mapping) ..() /datum/controller/subsystem/mapping/proc/load_map_templates() - for(var/T in subtypesof(/datum/map_template)) - var/datum/map_template/template = T + for(var/datum/map_template/template as anything in subtypesof(/datum/map_template)) if(!(initial(template.mappath))) // If it's missing the actual path its probably a base type or being used for inheritence. continue - template = new T() + template = new template() map_templates[template.name] = template return TRUE @@ -113,8 +112,7 @@ SUBSYSTEM_DEF(mapping) MT.load_new_z(centered = FALSE) /datum/controller/subsystem/mapping/proc/preloadShelterTemplates() - for(var/item in subtypesof(/datum/map_template/shelter)) - var/datum/map_template/shelter/shelter_type = item + for(var/datum/map_template/shelter/shelter_type as anything in subtypesof(/datum/map_template/shelter)) if(!(initial(shelter_type.mappath))) continue var/datum/map_template/shelter/S = new shelter_type() diff --git a/code/controllers/subsystems/persistence.dm b/code/controllers/subsystems/persistence.dm index 8168bfa6c2..f238621b3e 100644 --- a/code/controllers/subsystems/persistence.dm +++ b/code/controllers/subsystems/persistence.dm @@ -12,11 +12,10 @@ SUBSYSTEM_DEF(persistence) /datum/controller/subsystem/persistence/Initialize() . = ..() - for(var/thing in subtypesof(/datum/persistent)) - var/datum/persistent/P = thing + for(var/datum/persistent/P as anything in subtypesof(/datum/persistent)) if(initial(P.name)) P = new P - persistence_datums[thing] = P + persistence_datums[P.type] = P P.Initialize() /datum/controller/subsystem/persistence/Shutdown() diff --git a/code/controllers/subsystems/planets.dm b/code/controllers/subsystems/planets.dm index 16fbe59d3a..5486034871 100644 --- a/code/controllers/subsystems/planets.dm +++ b/code/controllers/subsystems/planets.dm @@ -111,8 +111,7 @@ SUBSYSTEM_DEF(planets) /datum/controller/subsystem/planets/proc/updateTemp(var/datum/planet/P) //Set new temperatures - for(var/W in P.planet_walls) - var/turf/unsimulated/wall/planetary/wall = W + for(var/turf/unsimulated/wall/planetary/wall as anything in P.planet_walls) wall.set_temperature(P.weather_holder.temperature) CHECK_TICK @@ -120,8 +119,7 @@ SUBSYSTEM_DEF(planets) var/count = 100000 while(count > 0) count-- - for(var/planet in planets) - var/datum/planet/P = planet + for(var/datum/planet/P as anything in planets) if(P.weather_holder) P.weather_holder.change_weather(pick(P.weather_holder.allowed_weather_types)) sleep(3) diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm index cc066cb99d..f21cc1cb2c 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/plants.dm @@ -62,7 +62,7 @@ SUBSYSTEM_DEF(plants) accessible_product_sprites |= base // Populate the global seed datum list. - for(var/type in typesof(/datum/seed)-/datum/seed) + for(var/type in subtypesof(/datum/seed)) var/datum/seed/S = new type seeds[S.name] = S S.uid = "[seeds.len]" diff --git a/code/controllers/subsystems/processing/instruments.dm b/code/controllers/subsystems/processing/instruments.dm index ee0fd1ea00..3f305fb8fc 100644 --- a/code/controllers/subsystems/processing/instruments.dm +++ b/code/controllers/subsystems/processing/instruments.dm @@ -33,11 +33,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments) songs -= S /datum/controller/subsystem/processing/instruments/proc/initialize_instrument_data() - for(var/path in subtypesof(/datum/instrument)) - var/datum/instrument/I = path - if(initial(I.abstract_type) == path) + for(var/datum/instrument/I as anything in subtypesof(/datum/instrument)) + if(initial(I.abstract_type) == I) continue - I = new path + I = new I I.Initialize() if(!I.id) qdel(I) diff --git a/code/controllers/subsystems/processing/projectiles.dm b/code/controllers/subsystems/processing/projectiles.dm index e4316304ce..3e5e1b2127 100644 --- a/code/controllers/subsystems/processing/projectiles.dm +++ b/code/controllers/subsystems/processing/projectiles.dm @@ -19,7 +19,6 @@ PROCESSING_SUBSYSTEM_DEF(projectiles) /datum/controller/subsystem/processing/projectiles/proc/set_pixel_speed(new_speed) global_pixel_speed = new_speed - for(var/i in processing) - var/obj/item/projectile/P = i + for(var/obj/item/projectile/P as anything in processing) if(istype(P)) //there's non projectiles on this too. P.set_pixel_speed(new_speed) diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm index 50c72ddd60..8f140a5fc8 100644 --- a/code/controllers/subsystems/radiation.dm +++ b/code/controllers/subsystems/radiation.dm @@ -63,8 +63,7 @@ SUBSYSTEM_DEF(radiation) if(!istype(T)) return - for(var/value in sources) - var/datum/radiation_source/source = value + for(var/datum/radiation_source/source as anything in sources) if(source.rad_power < .) continue // Already being affected by a stronger source diff --git a/code/controllers/subsystems/shuttles.dm b/code/controllers/subsystems/shuttles.dm index 40039edceb..38ec9e5c83 100644 --- a/code/controllers/subsystems/shuttles.dm +++ b/code/controllers/subsystems/shuttles.dm @@ -119,8 +119,7 @@ SUBSYSTEM_DEF(shuttles) landmarks_still_needed[landmark_tag] = given_sector // Landmark isn't registered yet, queue it to be added once it is. var/landmarks_to_check = landmarks_awaiting_sector.Copy() - for(var/thing in landmarks_to_check) - var/obj/effect/shuttle_landmark/automatic/landmark = thing + for(var/obj/effect/shuttle_landmark/automatic/landmark as anything in landmarks_to_check) if(landmark.z in given_sector.map_z) given_sector.add_landmark(landmark, landmark.shuttle_restricted) landmarks_awaiting_sector -= landmark @@ -170,8 +169,7 @@ SUBSYSTEM_DEF(shuttles) if(overmap_halted == new_setting) return overmap_halted = !overmap_halted - for(var/ship in ships) - var/obj/effect/overmap/visitable/ship/ship_effect = ship + for(var/obj/effect/overmap/visitable/ship/ship_effect as anything in ships) overmap_halted ? ship_effect.halt() : ship_effect.unhalt() /datum/controller/subsystem/shuttles/stat_entry() diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm index dadcd9ab95..4fadc4f599 100644 --- a/code/controllers/subsystems/timer.dm +++ b/code/controllers/subsystems/timer.dm @@ -202,8 +202,7 @@ SUBSYSTEM_DEF(timer) bucket_count -= length(spent) - for (var/i in spent) - var/datum/timedevent/qtimer = i + for(var/datum/timedevent/qtimer as anything in spent) if(QDELETED(qtimer)) bucket_count++ continue diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 34128d372a..c1e4288869 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -35,8 +35,7 @@ SUBSYSTEM_DEF(vote) // Before doing the vote, see if anyone is playing. // If not, just do the transfer. var/players_are_in_round = FALSE - for(var/a in player_list) // Mobs with clients attached. - var/mob/living/L = a + for(var/mob/living/L as anything in player_list) // Mobs with clients attached. if(!istype(L)) // Exclude ghosts and other weird things. continue if(L.stat == DEAD) // Dead mobs aren't playing. diff --git a/code/controllers/subsystems/xenoarch.dm b/code/controllers/subsystems/xenoarch.dm index 9851c69278..a175625b1f 100644 --- a/code/controllers/subsystems/xenoarch.dm +++ b/code/controllers/subsystems/xenoarch.dm @@ -41,8 +41,7 @@ SUBSYSTEM_DEF(xenoarch) continue var/farEnough = 1 - for(var/A in digsite_spawning_turfs) - var/turf/T = A + for(var/turf/T as anything in digsite_spawning_turfs) if(T in range(5, M)) farEnough = 0 break diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 7323d2cba2..da3e8e1baf 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -75,8 +75,7 @@ options["MC"] = Master options["Failsafe"] = Failsafe options["Configuration"] = config - for(var/i in Master.subsystems) - var/datum/controller/subsystem/S = i + for(var/datum/controller/subsystem/S as anything in Master.subsystems) if(!istype(S)) //Eh, we're a debug verb, let's have typechecking. continue var/strtype = "SS[get_end_section_of_type(S.type)]" diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm index ae17f21e2d..982e9e098c 100644 --- a/code/datums/chat_message.dm +++ b/code/datums/chat_message.dm @@ -172,8 +172,7 @@ var/list/runechat_image_cache = list() if(owned_by.seen_messages) var/idx = 1 var/combined_height = approx_lines - for(var/msg in owned_by.seen_messages[message_loc]) - var/datum/chatmessage/m = msg + for(var/datum/chatmessage/m as anything in owned_by.seen_messages[message_loc]) animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME) combined_height += m.approx_lines @@ -336,8 +335,7 @@ var/list/runechat_image_cache = list() var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src), range, remote_ghosts = FALSE) hearing_mobs = hear["mobs"] - for(var/mob in hearing_mobs) - var/mob/M = mob + for(var/mob/M as anything in hearing_mobs) if(!M.client) continue M.create_chat_message(src, message, italics, classes, audible) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index c5bd07cdcb..2e177c8ff3 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -320,8 +320,7 @@ var/proctype = C.signal_procs[src][sigtype] return NONE | CallAsync(C, proctype, arguments) . = NONE - for(var/I in target) - var/datum/C = I + for(var/datum/C as anything in target) if(!C.signal_enabled) continue var/proctype = C.signal_procs[src][sigtype] @@ -444,8 +443,7 @@ var/list/arguments = raw_args.Copy() arguments[1] = new_comp var/make_new_component = TRUE - for(var/i in GetComponents(new_type)) - var/datum/component/C = i + for(var/datum/component/C as anything in GetComponents(new_type)) if(C.CheckDupeComponent(arglist(arguments))) make_new_component = FALSE QDEL_NULL(new_comp) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index cc6bb53a97..c4d8bcc3d4 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -402,8 +402,7 @@ var/list/surroundings = get_surroundings(user) var/list/craftability = list() - for(var/rec in GLOB.crafting_recipes) - var/datum/crafting_recipe/R = rec + for(var/datum/crafting_recipe/R as anything in GLOB.crafting_recipes) if(!R.always_available && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. continue @@ -420,11 +419,10 @@ var/list/data = list() var/list/crafting_recipes = list() - for(var/rec in GLOB.crafting_recipes) - var/datum/crafting_recipe/R = rec + for(var/datum/crafting_recipe/R as anything in GLOB.crafting_recipes) if(R.name == "") //This is one of the invalid parents that sneaks in - GLOB.crafting_recipes -= rec + GLOB.crafting_recipes -= R continue if(!R.always_available && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index c8f54a1f0c..86573474e6 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -99,9 +99,8 @@ /datum/component/material_container/proc/on_examine(datum/source, mob/user, list/examine_texts) SIGNAL_HANDLER - for(var/I in materials) - var/datum/material/M = I - var/amt = materials[I] + for(var/datum/material/M as anything in materials) + var/amt = materials[M] if(amt) examine_texts += "It has [amt] units of [lowertext(M.name)] stored." @@ -327,13 +326,13 @@ var/list/mats_to_remove = list() //Assoc list MAT | AMOUNT - for(var/x in mats) //Loop through all required materials - var/datum/material/req_mat = x + for(var/datum/material/req_mat as anything in mats) //Loop through all required materials + var/imat = req_mat if(!istype(req_mat)) req_mat = GET_MATERIAL_REF(req_mat) //Get the ref if necesary if(!materials[req_mat]) //Do we have the resource? return FALSE //Can't afford it - var/amount_required = mats[x] * multiplier + var/amount_required = mats[imat] * multiplier if(!(materials[req_mat] >= amount_required)) // do we have enough of the resource? return FALSE //Can't afford it mats_to_remove[req_mat] += amount_required //Add it to the assoc list of things to remove @@ -392,8 +391,8 @@ if(!mats || !mats.len) return FALSE - for(var/x in mats) //Loop through all required materials - var/datum/material/req_mat = x + for(var/datum/material/req_mat as anything in mats) //Loop through all required materials + var/imat = req_mat if(!istype(req_mat)) if(ispath(req_mat) || istext(req_mat)) //Is this an actual material, or is it a category? req_mat = GET_MATERIAL_REF(req_mat) //Get the ref @@ -404,7 +403,7 @@ // else // continue - if(!has_enough_of_material(req_mat, mats[x], multiplier))//Not a category, so just check the normal way + if(!has_enough_of_material(req_mat, mats[imat], multiplier))//Not a category, so just check the normal way return FALSE return TRUE diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index b6a812ce9a..76bd3d3c73 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -171,8 +171,7 @@ ///Clears the affected_turfs lazylist, removing from its contents the effects of being near the light. /datum/component/overlay_lighting/proc/clean_old_turfs() - for(var/t in affected_turfs) - var/turf/lit_turf = t + for(var/turf/lit_turf as anything in affected_turfs) lit_turf.dynamic_lumcount -= lum_power affected_turfs = null @@ -431,8 +430,7 @@ . = lum_power lum_power = new_lum_power var/difference = . - lum_power - for(var/t in affected_turfs) - var/turf/lit_turf = t + for(var/turf/lit_turf as anything in affected_turfs) lit_turf.dynamic_lumcount -= difference ///Moves the light directional_atom that emits our "light" based on our position and our direction diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 2304af887a..01eb82dd71 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -31,8 +31,7 @@ //clear timers var/list/timers = active_timers active_timers = null - for(var/thing in timers) - var/datum/timedevent/timer = thing + for(var/datum/timedevent/timer as anything in timers) if (timer.spent) continue qdel(timer) @@ -46,8 +45,7 @@ if(dc) var/all_components = dc[/datum/component] if(length(all_components)) - for(var/I in all_components) - var/datum/component/C = I + for(var/datum/component/C as anything in all_components) qdel(C, FALSE, TRUE) else var/datum/component/C = all_components @@ -59,8 +57,7 @@ for(var/sig in lookup) var/list/comps = lookup[sig] if(length(comps)) - for(var/i in comps) - var/datum/component/comp = i + for(var/datum/component/comp as anything in comps) comp.UnregisterSignal(src, sig) else var/datum/component/comp = comps diff --git a/code/datums/game_masters/default.dm b/code/datums/game_masters/default.dm index d380476df2..8f69b296af 100644 --- a/code/datums/game_masters/default.dm +++ b/code/datums/game_masters/default.dm @@ -17,8 +17,7 @@ log_game_master("Got [best_events.len] choice\s for the next event.") var/list/weighted_events = list() - for(var/E in best_events) - var/datum/event2/meta/event = E + for(var/datum/event2/meta/event as anything in best_events) var/weight = event.get_weight() if(weight <= 0) continue @@ -71,8 +70,7 @@ // If no list is passed, all the events will be returned. /datum/game_master/default/proc/filter_events_by_departments(list/departments) . = list() - for(var/E in SSgame_master.available_events) - var/datum/event2/meta/event = E + for(var/datum/event2/meta/event as anything in SSgame_master.available_events) if(!event.enabled) continue if(event.chaotic_threshold && !ignore_round_chaos) diff --git a/code/datums/game_masters/other_game_masters.dm b/code/datums/game_masters/other_game_masters.dm index f62d83cfe3..cd45483251 100644 --- a/code/datums/game_masters/other_game_masters.dm +++ b/code/datums/game_masters/other_game_masters.dm @@ -3,8 +3,7 @@ // * Does not react to danger at all. /datum/game_master/classic/choose_event() var/list/weighted_events = list() - for(var/E in SSgame_master.available_events) - var/datum/event2/meta/event = E + for(var/datum/event2/meta/event as anything in SSgame_master.available_events) if(!event.enabled) continue weighted_events[event] = event.get_weight() @@ -31,8 +30,7 @@ /datum/game_master/brutal/choose_event() var/list/weighted_events = list() - for(var/E in SSgame_master.available_events) - var/datum/event2/meta/event = E + for(var/datum/event2/meta/event as anything in SSgame_master.available_events) if(!event.enabled) continue weighted_events[event] = event.get_weight() + (event.chaos * 2) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index debc08c2c4..4533abbe1c 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -45,9 +45,18 @@ GLOBAL_DATUM(revdata, /datum/getrev) return if(header) . += "The following pull requests are currently test merged:" +<<<<<<< HEAD for(var/line in testmerge) var/datum/tgs_revision_information/test_merge/tm = line var/cm = tm.head_commit //CHOMPStation Edit TGS4 +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for(var/line in testmerge) + var/datum/tgs_revision_information/test_merge/tm = line + var/cm = tm.pull_request_commit +======= + for(var/datum/tgs_revision_information/test_merge/tm as anything in testmerge) + var/cm = tm.pull_request_commit +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11)) if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder)) continue diff --git a/code/datums/observation/~cleanup.dm b/code/datums/observation/~cleanup.dm index 9dcc601436..da902052bd 100644 --- a/code/datums/observation/~cleanup.dm +++ b/code/datums/observation/~cleanup.dm @@ -40,8 +40,7 @@ GLOBAL_LIST_EMPTY(event_listen_count) /decl/observ/destroyed/proc/cleanup_global_listener(listener, listen_count) GLOB.global_listen_count -= listener - for(var/entry in GLOB.all_observable_events.events) - var/decl/observ/event = entry + for(var/decl/observ/event as anything in GLOB.all_observable_events.events) if(event.unregister_global(listener)) // log_debug("[event] - [listener] was deleted while still registered to global events.") // TODO: Apply axe, reimplement with datum component listeners if(!(--listen_count)) @@ -49,8 +48,7 @@ GLOBAL_LIST_EMPTY(event_listen_count) /decl/observ/destroyed/proc/cleanup_source_listeners(event_source, source_listener_count) GLOB.event_sources_count -= event_source - for(var/entry in GLOB.all_observable_events.events) - var/decl/observ/event = entry + for(var/decl/observ/event as anything in GLOB.all_observable_events.events) var/proc_owners = event.event_sources[event_source] if(proc_owners) for(var/proc_owner in proc_owners) @@ -61,8 +59,7 @@ GLOBAL_LIST_EMPTY(event_listen_count) /decl/observ/destroyed/proc/cleanup_event_listener(listener, listener_count) GLOB.event_listen_count -= listener - for(var/entry in GLOB.all_observable_events.events) - var/decl/observ/event = entry + for(var/decl/observ/event as anything in GLOB.all_observable_events.events) for(var/event_source in event.event_sources) if(event.unregister(event_source, listener)) // log_debug("[event] - [listener] was deleted while still listening to [event_source].") // TODO: Apply axe, reimplement with datum component listeners diff --git a/code/datums/orbit.dm b/code/datums/orbit.dm index 0176d7f23d..adbd166d25 100644 --- a/code/datums/orbit.dm +++ b/code/datums/orbit.dm @@ -110,8 +110,7 @@ /atom/Destroy(force = FALSE) . = ..() if (orbiters) - for (var/thing in orbiters) - var/datum/orbit/O = thing + for(var/datum/orbit/O as anything in orbiters) if (O.orbiter) O.orbiter.stop_orbit() @@ -123,8 +122,7 @@ /* /atom/movable/proc/transfer_observers_to(atom/movable/target) if(orbiters) - for(var/thing in orbiters) - var/datum/orbit/O = thing + for(var/datum/orbit/O as anything in orbiters) if(O.orbiter && isobserver(O.orbiter)) var/mob/dead/observer/D = O.orbiter D.ManualFollow(target) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index c24dfcd922..8da8d7c000 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -51,8 +51,7 @@ animate(bar, pixel_y = shiftheight, time = 5, easing = SINE_EASING) /datum/progressbar/Destroy() - for(var/I in user.progressbars[bar.loc]) - var/datum/progressbar/P = I + for(var/datum/progressbar/P as anything in user.progressbars[bar.loc]) if(P != src && P.listindex > listindex) P.shiftDown() diff --git a/code/datums/soul_link.dm b/code/datums/soul_link.dm index 7bc652a863..d15049d924 100644 --- a/code/datums/soul_link.dm +++ b/code/datums/soul_link.dm @@ -6,13 +6,11 @@ var/list/shared_soul_links // Soul links we are a/the sharer of. /mob/living/Destroy() - for(var/s in owned_soul_links) - var/datum/soul_link/S = s + for(var/datum/soul_link/S as anything in owned_soul_links) S.owner_died(FALSE) - qdel(s) // If the owner is destroy()'d, the soullink is destroy()'d. + qdel(S) // If the owner is destroy()'d, the soullink is destroy()'d. owned_soul_links = null - for(var/s in shared_soul_links) - var/datum/soul_link/S = s + for(var/datum/soul_link/S as anything in shared_soul_links) S.sharer_died(FALSE) S.remove_soul_sharer(src) // If a sharer is destroy()'d, they are simply removed. shared_soul_links = null @@ -82,8 +80,7 @@ soul_owner = owner soul_sharers = sharers LAZYADD(owner.owned_soul_links, src) - for(var/l in sharers) - var/mob/living/L = l + for(var/mob/living/L as anything in sharers) LAZYADD(L.shared_soul_links, src) return TRUE @@ -144,8 +141,7 @@ /datum/soul_link/multi_sharer/replacement_pool/owner_died(gibbed, mob/living/owner) if(LAZYLEN(soul_sharers) && !gibbed) //let's not put them in some gibs var/list/souls = shuffle(soul_sharers.Copy()) - for(var/l in souls) - var/mob/living/L = l + for(var/mob/living/L as anything in souls) if(L.stat != DEAD && L.mind) L.mind.transfer_to(soul_owner) soul_owner.revive(TRUE, TRUE) diff --git a/code/game/antagonist/_antagonist_setup.dm b/code/game/antagonist/_antagonist_setup.dm index 6f514b9413..c1e5002e74 100644 --- a/code/game/antagonist/_antagonist_setup.dm +++ b/code/game/antagonist/_antagonist_setup.dm @@ -46,7 +46,7 @@ var/global/list/antag_names_to_ids = list() antag.update_all_icons() /proc/populate_antag_type_list() - for(var/antag_type in typesof(/datum/antagonist)-/datum/antagonist) + for(var/antag_type in subtypesof(/datum/antagonist)) var/datum/antagonist/A = new antag_type all_antag_types[A.id] = A all_antag_spawnpoints[A.landmark_id] = list() diff --git a/code/game/antagonist/mutiny/mutineer.dm b/code/game/antagonist/mutiny/mutineer.dm index 480fc83c70..85aecd71ea 100644 --- a/code/game/antagonist/mutiny/mutineer.dm +++ b/code/game/antagonist/mutiny/mutineer.dm @@ -54,7 +54,7 @@ var/datum/antagonist/mutineer/mutineers proc/get_directive_candidates() var/list/candidates[0] - for(var/T in typesof(/datum/directive) - /datum/directive) + for(var/T in subtypesof(/datum/directive)) var/datum/directive/D = new T(src) if (D.meets_prerequisites()) candidates.Add(D) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5c8ff8974d..3e4b277696 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -153,8 +153,7 @@ ASSERT(callback) ASSERT(isturf(loc)) var/list/turfs = trange(range, src) - for(var/t in turfs) - var/turf/T = t + for(var/turf/T as anything in turfs) GLOB.turf_entered_event.register(T, src, callback) //Unregister from prox listening in a certain range. You should do this BEFORE you move, but if you @@ -162,8 +161,7 @@ /atom/proc/unsense_proximity(var/range = 1, var/callback, var/center) ASSERT(isturf(center) || isturf(loc)) var/list/turfs = trange(range, center ? center : src) - for(var/t in turfs) - var/turf/T = t + for(var/turf/T as anything in turfs) GLOB.turf_entered_event.unregister(T, src, callback) @@ -529,11 +527,9 @@ if(LAZYLEN(exclude_mobs)) seeing_mobs -= exclude_mobs - for(var/obj in seeing_objs) - var/obj/O = obj + for(var/obj/O as anything in seeing_objs) O.show_message(message, VISIBLE_MESSAGE, blind_message, AUDIBLE_MESSAGE) - for(var/mob in seeing_mobs) - var/mob/M = mob + for(var/mob/M as anything in seeing_mobs) if(M.see_invisible >= invisibility && MOB_CAN_SEE_PLANE(M, plane)) M.show_message(message, VISIBLE_MESSAGE, blind_message, AUDIBLE_MESSAGE) if(runemessage != -1) @@ -555,16 +551,13 @@ var/list/hearing_objs = hear["objs"] if(radio_message) - for(var/obj in hearing_objs) - var/obj/O = obj + for(var/obj/O as anything in hearing_objs) O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) else - for(var/obj in hearing_objs) - var/obj/O = obj + for(var/obj/O as anything in hearing_objs) O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) - for(var/mob in hearing_mobs) - var/mob/M = mob + for(var/mob/M as anything in hearing_mobs) var/msg = message M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) if(runemessage != -1) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 08b0f3e056..9dfba6c423 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -134,8 +134,7 @@ oldarea.Exited(src, newloc) // Multi-tile objects can't reach here, otherwise you'd need to avoid uncrossing yourself - for(var/i in oldloc) - var/atom/movable/thing = i + for(var/atom/movable/thing as anything in oldloc) // We don't call parent so we are calling this for byond thing.Uncrossed(src) @@ -145,8 +144,7 @@ newarea.Entered(src, oldloc) // Multi-tile objects can't reach here, otherwise you'd need to avoid uncrossing yourself - for(var/i in loc) - var/atom/movable/thing = i + for(var/atom/movable/thing as anything in loc) // We don't call parent so we are calling this for byond thing.Crossed(src, oldloc) @@ -315,8 +313,7 @@ old_area.Exited(src, destination) // Uncross everything where we left - for(var/i in oldloc) - var/atom/movable/AM = i + for(var/atom/movable/AM as anything in oldloc) if(AM == src) continue AM.Uncrossed(src) @@ -341,8 +338,7 @@ destarea.Entered(src, oldloc) // We ignore ourselves because if we're multi-tile we might be in both old and new locs - for(var/i in destination) - var/atom/movable/AM = i + for(var/atom/movable/AM as anything in destination) if(AM == src) continue AM.Crossed(src, oldloc) @@ -364,8 +360,7 @@ loc = null // Uncross everything where we left (no multitile safety like above because we are definitely not still there) - for(var/i in oldloc) - var/atom/movable/AM = i + for(var/atom/movable/AM as anything in oldloc) AM.Uncrossed(src) // Exited() our loc and area @@ -379,8 +374,7 @@ /atom/movable/proc/onTransitZ(old_z,new_z) GLOB.z_moved_event.raise_event(src, old_z, new_z) SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_z, new_z) - for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. - var/atom/movable/AM = item + for(var/atom/movable/AM as anything in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. AM.onTransitZ(old_z,new_z) /atom/movable/proc/glide_for(movetime) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 3fb282d72d..8371c395a4 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -258,8 +258,7 @@ //VOREStation Add /mob/living/carbon/human/proc/force_update_organs() - for(var/organ in organs + internal_organs) - var/obj/item/organ/O = organ + for(var/obj/item/organ/O as anything in organs + internal_organs) O.species = species //VOREStation Add End diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm index c6af89ad75..5563d4f01b 100644 --- a/code/game/gamemodes/changeling/modularchangling.dm +++ b/code/game/gamemodes/changeling/modularchangling.dm @@ -2,7 +2,7 @@ //Ling power's evolution menu entry datum should be contained alongside the mob proc for the actual power, in their own file. -var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now +var/list/powers = subtypesof(/datum/power/changeling) //needed for the badmin verb for now var/list/datum/power/changeling/powerinstances = list() /datum/power //Could be used by other antags too diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 08340f5a76..449d448fe0 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -105,7 +105,7 @@ mob hsb.loc = usr.loc to_chat(usr, "Sandbox: Created an airlock.") if("hsbcanister") - var/list/hsbcanisters = typesof(/obj/machinery/portable_atmospherics/canister/) - /obj/machinery/portable_atmospherics/canister/ + var/list/hsbcanisters = subtypesof(/obj/machinery/portable_atmospherics/canister) var/hsbcanister = tgui_input_list(usr, "Choose a canister to spawn:", "Sandbox", hsbcanisters) if(hsbcanister) new hsbcanister(usr.loc) diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index b403639ddc..539329da15 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -4,10 +4,10 @@ #define UTILITY_SPELLS "Utility" #define SUPPORT_SPELLS "Support" -var/list/all_technomancer_spells = typesof(/datum/technomancer/spell) - /datum/technomancer/spell -var/list/all_technomancer_equipment = typesof(/datum/technomancer/equipment) - /datum/technomancer/equipment -var/list/all_technomancer_consumables = typesof(/datum/technomancer/consumable) - /datum/technomancer/consumable -var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - /datum/technomancer/assistance +var/list/all_technomancer_spells = subtypesof(/datum/technomancer/spell) +var/list/all_technomancer_equipment = subtypesof(/datum/technomancer/equipment) +var/list/all_technomancer_consumables = subtypesof(/datum/technomancer/consumable) +var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance) /datum/technomancer var/name = "technomancer thing" diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index d54f3e6521..bd8edfcd8a 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -474,9 +474,8 @@ infected = "Gangrene Detected:" var/unknown_body = 0 - for(var/thing in e.implants) - var/obj/item/weapon/implant/I = thing - var/obj/item/device/nif/N = thing //VOREStation Add: NIFs + for(var/obj/item/weapon/implant/I as anything in e.implants) + var/obj/item/device/nif/N = I //VOREStation Add: NIFs if(istype(I) && I.known_implant) imp += "[I] implanted:" if(istype(N) && N.known_implant) //VOREStation Add: NIFs diff --git a/code/game/machinery/adv_med_vr.dm b/code/game/machinery/adv_med_vr.dm index e8ff59adc0..c4c1d93374 100644 --- a/code/game/machinery/adv_med_vr.dm +++ b/code/game/machinery/adv_med_vr.dm @@ -12,8 +12,7 @@ var/livingprey = 0 var/objectprey = 0 - for(var/belly in H.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in H.vore_organs) for(var/C in B) if(ishuman(C)) humanprey++ diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index b3d315cbad..f079485f19 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -183,9 +183,8 @@ //Check if we still have the materials. var/coeff = (making.no_scale ? 1 : mat_efficiency) //stacks are unaffected by production coefficient - for(var/MAT in making.resources) - var/datum/material/used_material = MAT - var/amount_needed = making.resources[MAT] * coeff * multiplier + for(var/datum/material/used_material as anything in making.resources) + var/amount_needed = making.resources[used_material] * coeff * multiplier materials_used[used_material] = amount_needed if(LAZYLEN(materials_used)) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 58565ead6e..c15a9d1524 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -111,8 +111,7 @@ data["id_rank"] = modify && modify.assignment ? modify.assignment : "Unassigned" var/list/departments = list() - for(var/D in SSjob.get_all_department_datums()) - var/datum/department/dept = D + for(var/datum/department/dept as anything in SSjob.get_all_department_datums()) if(!dept.assignable) // No AI ID cards for you. continue if(dept.centcom_only && !is_centcom()) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index b7ba4a4339..19ae206605 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -373,8 +373,7 @@ hook_vr("despawn", list(to_despawn, src)) if(isliving(to_despawn)) var/mob/living/L = to_despawn - for(var/belly in L.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in L.vore_organs) for(var/mob/living/sub_L in B) despawn_occupant(sub_L) for(var/obj/item/W in B) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 02f80de642..e08c48caaf 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //VOREStation Edit - Redone a lot of airlock things: /* - Specific department maintenance doors @@ -1534,3 +1535,3072 @@ About the new airlock wires panel: qdel(src) return TRUE return FALSE +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt +//VOREStation Edit - Redone a lot of airlock things: +/* +- Specific department maintenance doors +- Named doors properly according to type +- Gave them default access levels with the access constants +- Improper'd all of the names in the new() +*/ + +/obj/machinery/door/airlock + name = "Airlock" + icon = 'icons/obj/doors/Doorint.dmi' + icon_state = "door_closed" + power_channel = ENVIRON + + explosion_resistance = 10 + + // Doors do their own stuff + bullet_vulnerability = 0 + + blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime + + var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + var/hackProof = 0 // if 1, this door can't be hacked by the AI + var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. + var/main_power_lost_until = 0 //World time when main power is restored. + var/backup_power_lost_until = -1 //World time when backup power is restored. + var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. + var/spawnPowerRestoreRunning = 0 + var/welded = null + var/locked = 0 + var/lights = 1 // bolt lights show by default + var/aiDisabledIdScanner = 0 + var/aiHacking = 0 + var/obj/machinery/door/airlock/closeOther = null + var/closeOtherId = null + var/lockdownbyai = 0 + autoclose = 1 + var/assembly_type = /obj/structure/door_assembly + var/mineral = null + var/justzap = 0 + var/safe = 1 + normalspeed = 1 + var/obj/item/weapon/airlock_electronics/electronics = null + var/hasShocked = 0 //Prevents multiple shocks from happening + var/secured_wires = 0 + var/datum/wires/airlock/wires = null + + var/open_sound_powered = 'sound/machines/door/covert1o.ogg' + var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' + var/close_sound_powered = 'sound/machines/door/covert1c.ogg' + var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' + var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' + var/department_open_powered = null + var/department_close_powered = null + var/denied_sound = 'sound/machines/deniedbeep.ogg' + var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' + var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' + +/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) + if(src.locked || src.welded) + visible_message("\The [user] begins breaking into \the [src] internals!") + user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. + if(do_after(user,10 SECONDS,src)) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + if(prob(25)) + src.shock(user, 100) + user.set_AI_busy(FALSE) + else if(src.density) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.locked || src.welded) + visible_message("\The [user] begins tearing into \the [src] internals!") + src.do_animate("deny") + if(do_after(user,15 SECONDS,src)) + visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") + src.do_animate("spark") + playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + src.set_broken() //These aren't emags, these be CLAWS + else if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 5 SECONDS,src)) + playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + src.do_animate("deny") + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/get_material() + if(mineral) + return get_material_by_name(mineral) + return get_material_by_name(MAT_STEEL) + +/obj/machinery/door/airlock/command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcom.dmi' + req_one_access = list(access_heads) + assembly_type = /obj/structure/door_assembly/door_assembly_com + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd3o.ogg' + department_close_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsec.dmi' + req_one_access = list(access_security) + assembly_type = /obj/structure/door_assembly/door_assembly_sec + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Dooreng.dmi' + req_one_access = list(access_engine) + assembly_type = /obj/structure/door_assembly/door_assembly_eng + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmos.dmi' + req_one_access = list(access_atmospherics) + assembly_type = /obj/structure/door_assembly/door_assembly_eat + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormed.dmi' + req_one_access = list(access_medical) + assembly_type = /obj/structure/door_assembly/door_assembly_med + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/maintenance + name = "Maintenance Access" + icon = 'icons/obj/doors/Doormaint.dmi' + //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access + assembly_type = /obj/structure/door_assembly/door_assembly_mai + open_sound_powered = 'sound/machines/door/door2o.ogg' + close_sound_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/cargo + icon = 'icons/obj/doors/Doormaint_cargo.dmi' + req_one_access = list(access_cargo) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/door2o.ogg' + department_close_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/command + icon = 'icons/obj/doors/Doormaint_command.dmi' + req_one_access = list(access_heads) + +/obj/machinery/door/airlock/maintenance/common + icon = 'icons/obj/doors/Doormaint_common.dmi' + open_sound_powered = 'sound/machines/door/hall3o.ogg' + close_sound_powered = 'sound/machines/door/hall3c.ogg' + +/obj/machinery/door/airlock/maintenance/engi + icon = 'icons/obj/doors/Doormaint_engi.dmi' + req_one_access = list(access_engine) + +/obj/machinery/door/airlock/maintenance/int + icon = 'icons/obj/doors/Doormaint_int.dmi' + +/obj/machinery/door/airlock/maintenance/medical + icon = 'icons/obj/doors/Doormaint_med.dmi' + req_one_access = list(access_medical) + +/obj/machinery/door/airlock/maintenance/rnd + icon = 'icons/obj/doors/Doormaint_rnd.dmi' + req_one_access = list(access_research) + +/obj/machinery/door/airlock/maintenance/sec + icon = 'icons/obj/doors/Doormaint_sec.dmi' + req_one_access = list(access_security) + +/obj/machinery/door/airlock/external + name = "External Airlock" + icon = 'icons/obj/doors/Doorext.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/external/bolted + icon_state = "door_locked" // So it looks visibly bolted in map editor + locked = 1 + +// For convenience in making docking ports: one that is pre-bolted with frequency set! +/obj/machinery/door/airlock/external/bolted/cycling + frequency = 1379 + +/obj/machinery/door/airlock/glass_external + name = "External Airlock" + icon = 'icons/obj/doors/Doorextglass.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + opacity = 0 + glass = 1 + req_one_access = list(access_external_airlocks) + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/glass + name = "Glass Airlock" + icon = 'icons/obj/doors/Doorglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + open_sound_powered = 'sound/machines/door/hall1o.ogg' + close_sound_powered = 'sound/machines/door/hall1c.ogg' + legacy_open_powered = 'sound/machines/door/windowdoor.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + glass = 1 + +/obj/machinery/door/airlock/centcom + name = "Centcom Airlock" + icon = 'icons/obj/doors/Doorele.dmi' + req_one_access = list(access_cent_general) + opacity = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/glass_centcom + name = "Airlock" + icon = 'icons/obj/doors/Dooreleglass.dmi' + opacity = 0 + glass = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/vault + name = "Vault" + icon = 'icons/obj/doors/vault.dmi' + explosion_resistance = 20 + opacity = 1 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/vault1o.ogg' + close_sound_powered = 'sound/machines/door/vault1c.ogg' + +/obj/machinery/door/airlock/vault/bolted + icon_state = "door_locked" + locked = 1 + +/obj/machinery/door/airlock/freezer + name = "Freezer Airlock" + icon = 'icons/obj/doors/Doorfreezer.dmi' + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/hatch + name = "Airtight Hatch" + icon = 'icons/obj/doors/Doorhatchele.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_hatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/maintenance_hatch + name = "Maintenance Hatch" + icon = 'icons/obj/doors/Doorhatchmaint2.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_mhatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/glass_command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcomglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_com + glass = 1 + req_one_access = list(access_heads) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd1o.ogg' + department_close_powered = 'sound/machines/door/cmd1c.ogg' + +/obj/machinery/door/airlock/glass_engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Doorengglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eng + glass = 1 + req_one_access = list(access_engine) + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eat + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsecglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_sec + glass = 1 + req_one_access = list(access_security) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/glass_medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormedglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_med + glass = 1 + req_one_access = list(access_medical) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doormining.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_min + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmo.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearch.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_research + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearchglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_research + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doorminingglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_min + glass = 1 + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/glass_atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/gold + name = "Gold Airlock" + icon = 'icons/obj/doors/Doorgold.dmi' + mineral = "gold" + +/obj/machinery/door/airlock/silver + name = "Silver Airlock" + icon = 'icons/obj/doors/Doorsilver.dmi' + mineral = "silver" + +/obj/machinery/door/airlock/diamond + name = "Diamond Airlock" + icon = 'icons/obj/doors/Doordiamond.dmi' + mineral = "diamond" + +/obj/machinery/door/airlock/uranium + name = "Uranium Airlock" + desc = "And they said I was crazy." + icon = 'icons/obj/doors/Dooruranium.dmi' + mineral = "uranium" + var/last_event = 0 + var/rad_power = 7.5 + +/obj/machinery/door/airlock/process() + // Deliberate no call to parent. + if(main_power_lost_until > 0 && world.time >= main_power_lost_until) + regainMainPower() + + if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) + regainBackupPower() + + else if(electrified_until > 0 && world.time >= electrified_until) + electrify(0) + + if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) + . = PROCESS_KILL + +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + SSradiation.radiate(src, rad_power) + last_event = world.time + ..() + +/obj/machinery/door/airlock/phoron + name = "Phoron Airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/Doorphoron.dmi' + mineral = "phoron" + +/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) + for(var/turf/simulated/floor/target_tile in range(2,loc)) + target_tile.assume_gas("phoron", 35, 400+T0C) + spawn (0) target_tile.hotspot_expose(temperature, 400) + for(var/turf/simulated/wall/W in range(3,src)) + W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame + for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) + D.ignite(temperature/4) + new/obj/structure/door_assembly( src.loc ) + qdel(src) + +/obj/machinery/door/airlock/sandstone + name = "Sandstone Airlock" + icon = 'icons/obj/doors/Doorsand.dmi' + mineral = "sandstone" + +/obj/machinery/door/airlock/science + name = "Research Airlock" + icon = 'icons/obj/doors/Doorsci.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_science + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_science + name = "Glass Airlocks" + icon = 'icons/obj/doors/Doorsciglass.dmi' + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_science + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/highsecurity + name = "Secure Airlock" + icon = 'icons/obj/doors/hightechsecurity.dmi' + explosion_resistance = 20 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/secure1o.ogg' + close_sound_powered = 'sound/machines/door/secure1c.ogg' + +/obj/machinery/door/airlock/voidcraft + name = "voidcraft hatch" + desc = "It's an extra resilient airlock intended for spacefaring vessels." + icon = 'icons/obj/doors/shuttledoors.dmi' + explosion_resistance = 20 + opacity = 0 + glass = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + +// Airlock opens from top-bottom instead of left-right. +/obj/machinery/door/airlock/voidcraft/vertical + icon = 'icons/obj/doors/shuttledoors_vertical.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + + +/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock + name = "Precursor Alpha Object - Doors" + desc = "This object appears to be used in order to restrict or allow access to \ + rooms based on its physical state. In other words, a door. \ + Despite being designed and created by unknown ancient alien hands, this door has \ + a large number of similarities to the conventional airlock, such as being driven by \ + electricity, opening and closing by physically moving, and being air tight. \ + It also operates by responding to signals through internal electrical conduits. \ + These characteristics make it possible for one with experience with a multitool \ + to manipulate the door.\ +

    \ + The symbol on the door does not match any living species' patterns, giving further \ + implications that this door is very old, and yet it remains operational after \ + thousands of years. It is unknown if that is due to superb construction, or \ + unseen autonomous maintenance having been performed." + value = CATALOGUER_REWARD_EASY + +/obj/machinery/door/airlock/alien + name = "alien airlock" + desc = "You're fairly sure this is a door." + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) + icon = 'icons/obj/doors/Dooralien.dmi' + explosion_resistance = 20 + secured_wires = TRUE + hackProof = TRUE + assembly_type = /obj/structure/door_assembly/door_assembly_alien + req_one_access = list(access_alien) + +/obj/machinery/door/airlock/alien/locked + icon_state = "door_locked" + locked = TRUE + +/obj/machinery/door/airlock/alien/public // Entry to UFO. + req_one_access = list() + normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. + hackProof = TRUE //VOREStation Edit - No borgos + +/* +About the new airlock wires panel: +* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. +* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) +* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. +* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. +* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. +* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. +* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. +* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) +* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. +* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. +*/ + + + +/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite + if(!issilicon(usr)) + if(src.isElectrified()) + if(!src.justzap) + if(src.shock(user, 100)) + src.justzap = 1 + spawn (10) + src.justzap = 0 + return + else /*if(src.justzap)*/ + return + else if(user.hallucination > 50 && prob(10) && src.operating == 0) + to_chat(user, "You feel a powerful shock course through your body!") + user.halloss += 10 + user.stunned += 10 + return + ..(user) + +/obj/machinery/door/airlock/proc/isElectrified() + if(src.electrified_until != 0) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/canAIControl() + return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/canAIHack() + return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/arePowerSystemsOn() + if (stat & (NOPOWER|BROKEN)) + return 0 + return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) + +/obj/machinery/door/airlock/requiresID() + return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) + +/obj/machinery/door/airlock/proc/isAllPowerLoss() + if(stat & (NOPOWER|BROKEN)) + return 1 + if(mainPowerCablesCut() && backupPowerCablesCut()) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/mainPowerCablesCut() + return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) + +/obj/machinery/door/airlock/proc/backupPowerCablesCut() + return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) + +/obj/machinery/door/airlock/proc/loseMainPower() + main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running + if(backup_power_lost_until == -1 && !backupPowerCablesCut()) + backup_power_lost_until = world.time + SecondsToTicks(10) + + if(main_power_lost_until > 0 || backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/loseBackupPower() + backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + if(backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/regainMainPower() + if(!mainPowerCablesCut()) + main_power_lost_until = 0 + // If backup power is currently active then disable, otherwise let it count down and disable itself later + if(!backup_power_lost_until) + backup_power_lost_until = -1 + + update_icon() + +/obj/machinery/door/airlock/proc/regainBackupPower() + if(!backupPowerCablesCut()) + // Restore backup power only if main power is offline, otherwise permanently disable + backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 + + update_icon() + +/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) + message = text("The electrification wire is cut - Door permanently electrified.") + src.electrified_until = -1 + else if(duration && !arePowerSystemsOn()) + message = text("The door is unpowered - Cannot electrify the door.") + src.electrified_until = 0 + else if(!duration && electrified_until != 0) + message = "The door is now un-electrified." + src.electrified_until = 0 + else if(duration) //electrify door for the given duration seconds + if(usr) + shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") + add_attack_logs(usr,name,"Electrified a door") + else + shockedby += text("\[[time_stamp()]\] - EMP)") + message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." + src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + + if(electrified_until > 0) + START_MACHINE_PROCESSING(src) + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_IDSCAN)) + message = "The IdScan wire is cut - IdScan feature permanently disabled." + else if(activate && src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 0 + message = "IdScan feature has been enabled." + else if(!activate && !src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 1 + message = "IdScan feature has been disabled." + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) + var/message = "" + // Safeties! We don't need no stinking safeties! + if (wires.is_cut(WIRE_SAFETY)) + message = text("The safety wire is cut - Cannot enable safeties.") + else if (!activate && src.safe) + safe = 0 + else if (activate && !src.safe) + safe = 1 + + if(feedback && message) + to_chat(usr,message) + +// shock user with probability prb (if all connections & power are working) +// returns 1 if shocked, 0 otherwise +// The preceding comment was borrowed from the grille's shock script +/obj/machinery/door/airlock/shock(mob/user, prb) + if(!arePowerSystemsOn()) + return 0 + if(hasShocked) + return 0 //Already shocked someone recently? + if(..()) + hasShocked = 1 + sleep(10) + hasShocked = 0 + return 1 + else + return 0 + + +/obj/machinery/door/airlock/update_icon() + cut_overlays() + if(density) + if(locked && lights && src.arePowerSystemsOn()) + icon_state = "door_locked" + else + icon_state = "door_closed" + if(p_open || welded) + if(p_open) + add_overlay("panel_open") + if (!(stat & NOPOWER)) + if(stat & BROKEN) + add_overlay("sparks_broken") + else if (health < maxhealth * 3/4) + add_overlay("sparks_damaged") + if(welded) + add_overlay("welded") + else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) + add_overlay("sparks_damaged") + else + icon_state = "door_open" + if((stat & BROKEN) && !(stat & NOPOWER)) + add_overlay("sparks_open") + return + +/obj/machinery/door/airlock/do_animate(animation) + switch(animation) + if("opening") + cut_overlay() + if(p_open) + spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. + flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking + update_icon() + else + flick("door_opening", src)//[stat ? "_stat":] + update_icon() + if("closing") + cut_overlay() + if(p_open) + spawn(2) + flick("o_door_closing", src) + update_icon() + else + flick("door_closing", src) + update_icon() + if("spark") + if(density) + flick("door_spark", src) + if("deny") + if(density && src.arePowerSystemsOn()) + flick("door_deny", src) + playsound(src, denied_sound, 50, 0, 3) + return + +/obj/machinery/door/airlock/attack_ai(mob/user as mob) + tgui_interact(user) + +/obj/machinery/door/airlock/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiAirlock", name) + ui.open() + if(custom_state) + ui.set_state(custom_state) + return TRUE + +/obj/machinery/door/airlock/tgui_data(mob/user) + var/list/data = list() + + var/list/power = list() + power["main"] = main_power_lost_until > 0 ? 0 : 2 + power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) + power["backup"] = backup_power_lost_until > 0 ? 0 : 2 + power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) + data["power"] = power + + data["shock"] = (electrified_until == 0) ? 2 : 0 + data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) + data["id_scanner"] = !aiDisabledIdScanner + data["locked"] = locked // bolted + data["lights"] = lights // bolt lights + data["safe"] = safe // safeties + data["speed"] = normalspeed // safe speed + data["welded"] = welded // welded + data["opened"] = !density // opened + + var/list/wire = list() + wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) + wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) + wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) + wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) + wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) + wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) + wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) + wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) + wire["safe"] = !wires.is_cut(WIRE_SAFETY) + wire["timing"] = !wires.is_cut(WIRE_SPEED) + + data["wires"] = wire + return data + +/obj/machinery/door/airlock/proc/hack(mob/user as mob) + if(src.aiHacking==0) + src.aiHacking=1 + spawn(20) + //TODO: Make this take a minute + to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") + sleep(50) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") + sleep(20) + to_chat(user, "Attempting to hack into airlock. This may take some time.") + sleep(200) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Upload access confirmed. Loading control program into airlock software.") + sleep(170) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Transfer complete. Forcing airlock to execute program.") + sleep(50) + //disable blocked control + src.aiControlDisabled = 2 + to_chat(user, "Receiving control information from airlock.") + sleep(10) + //bring up airlock dialog + src.aiHacking = 0 + if (user) + src.attack_ai(user) + +/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) + if (src.isElectrified()) + if (istype(mover, /obj/item)) + var/obj/item/i = mover + if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return ..() + +/obj/machinery/door/airlock/attack_hand(mob/user as mob) + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 100)) + return + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + + if(src.p_open) + user.set_machine(src) + wires.Interact(user) + else + ..(user) + return + +/obj/machinery/door/airlock/tgui_act(action, params) + if(..()) + return TRUE + if(!user_allowed(usr)) + return TRUE + + switch(action) + if("disrupt-main") + if(!main_power_lost_until) + loseMainPower() + update_icon() + else + to_chat(usr, "Main power is already offline.") + . = TRUE + if("disrupt-backup") + if(!backup_power_lost_until) + loseBackupPower() + update_icon() + else + to_chat(usr, "Backup power is already offline.") + . = TRUE + if("shock-restore") + electrify(0, 1) + . = TRUE + if("shock-temp") + electrify(30, 1) + . = TRUE + if("shock-perm") + electrify(-1, 1) + . = TRUE + if("idscan-toggle") + set_idscan(aiDisabledIdScanner, 1) + . = TRUE + // if("emergency-toggle") + // toggle_emergency(usr) + // . = TRUE + if("bolt-toggle") + toggle_bolt(usr) + . = TRUE + if("light-toggle") + if(wires.is_cut(WIRE_BOLT_LIGHT)) + to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") + return + lights = !lights + update_icon() + . = TRUE + if("safe-toggle") + set_safeties(!safe, 1) + . = TRUE + if("speed-toggle") + if(wires.is_cut(WIRE_SPEED)) + to_chat(usr, "The timing wire is cut - Cannot alter timing.") + return + normalspeed = !normalspeed + . = TRUE + if("open-close") + user_toggle_open(usr) + . = TRUE + + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/user_allowed(mob/user) + var/allowed = (issilicon(user) && canAIControl(user)) + if(!allowed && isobserver(user)) + var/mob/observer/dead/D = user + if(D.can_admin_interact()) + allowed = TRUE + return allowed + +/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) + if(!user_allowed(user)) + return + if(wires.is_cut(WIRE_DOOR_BOLTS)) + to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") + return + if(locked) + if(!arePowerSystemsOn()) + to_chat(user, "The door has no power - you can't raise the door bolts.") + else + unlock() + to_chat(user, "The door bolts have been raised.") + // log_combat(user, src, "unbolted") + else + lock() + to_chat(user, "The door bolts have been dropped.") + // log_combat(user, src, "bolted") + +/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) + if(!user_allowed(user)) + return + if(welded) + to_chat(user, text("The airlock has been welded shut!")) + else if(locked) + to_chat(user, text("The door bolts are down!")) + else if(!density) + close() + else + open() + +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + +/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) + //to_world("airlock attackby src [src] obj [C] mob [user]") + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 75)) + return + if(istype(C, /obj/item/taperoll)) + return + + src.add_fingerprint(user) + if (attempt_vr(src,"attackby_vr",list(C, user))) return + if(istype(C, /mob/living)) + ..() + return + if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(0,user)) + if(!src.welded) + src.welded = 1 + else + src.welded = null + playsound(src, C.usesound, 75, 1) + src.update_icon() + return + else + return + else if(C.is_screwdriver()) + if (src.p_open) + if (stat & BROKEN) + to_chat(usr, "The panel is broken and cannot be closed.") + else + src.p_open = 0 + playsound(src, C.usesound, 50, 1) + else + src.p_open = 1 + playsound(src, C.usesound, 50, 1) + src.update_icon() + else if(C.is_wirecutter()) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/multitool)) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/assembly/signaler)) + return src.attack_hand(user) + else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE + var/obj/item/weapon/pai_cable/cable = C + cable.plugin(src, user) + else if(!repairing && C.is_crowbar()) + if(can_remove_electronics()) + playsound(src, C.usesound, 75, 1) + user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") + if(do_after(user,40 * C.toolspeed)) + to_chat(user, "You removed the airlock electronics!") + + var/obj/structure/door_assembly/da = new assembly_type(src.loc) + if (istype(da, /obj/structure/door_assembly/multi_tile)) + da.set_dir(src.dir) + + da.anchored = TRUE + if(mineral) + da.glass = mineral + //else if(glass) + else if(glass && !da.glass) + da.glass = 1 + da.state = 1 + da.created_name = src.name + da.update_state() + + if(operating == -1 || (stat & BROKEN)) + new /obj/item/weapon/circuitboard/broken(src.loc) + operating = 0 + else + if (!electronics) create_electronics() + + electronics.loc = src.loc + electronics = null + + qdel(src) + return + else if(arePowerSystemsOn()) + to_chat(user, "The airlock's motors resist your efforts to force it.") + else if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else + if(density) + spawn(0) open(1) + else + spawn(0) close(1) + + // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). + else if(istype(C, /obj/item/weapon)) + var/obj/item/weapon/W = C + if((W.pry == 1) && !arePowerSystemsOn()) + if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else if( !welded && !operating ) + if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + to_chat(user, "You need to be wielding \the [F] to do that.") + return + // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. + if(density) + spawn(0) + open(1) + else + spawn(0) + close(1) + else + ..() + else + ..() + return + +/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) + if(C) + ignite(is_hot(C)) + ..() + +/obj/machinery/door/airlock/set_broken() + src.p_open = 1 + stat |= BROKEN + if (secured_wires) + lock() + for (var/mob/O in viewers(src, null)) + if ((O.client && !( O.blinded ))) + O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + + update_icon() + return + +/obj/machinery/door/airlock/open(var/forced=0) + if(!can_open(forced)) + return 0 + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + + //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator + for(var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. + if(arePowerSystemsOn()) + sound = legacy_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else // Else, play these. + if(arePowerSystemsOn()) + sound = open_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + + if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) + src.closeOther.close() + return ..() + +/obj/machinery/door/airlock/can_open(var/forced=0) + if(!forced) + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + if(locked || welded) + return 0 + return ..() + +/obj/machinery/door/airlock/can_close(var/forced=0) + if(locked || welded) + return 0 + + if(!forced) + //despite the name, this wire is for general door control. + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + return ..() + +/atom/movable/proc/blocks_airlock() + return density + +/obj/machinery/door/blocks_airlock() + return 0 + +/obj/machinery/mech_sensor/blocks_airlock() + return 0 + +/mob/living/blocks_airlock() + return 1 + +/atom/movable/proc/airlock_crush(var/crush_damage) + return 0 + +/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) + . = ..() + health -= crush_damage + healthcheck() + +/obj/effect/energy_field/airlock_crush(var/crush_damage) + adjust_strength(crush_damage) + +/obj/structure/closet/airlock_crush(var/crush_damage) + ..() + damage(crush_damage) + for(var/atom/movable/AM in src) + AM.airlock_crush() + return 1 + +/mob/living/airlock_crush(var/crush_damage) + . = ..() + adjustBruteLoss(crush_damage) + SetStunned(5) + SetWeakened(5) + var/turf/T = get_turf(src) + T.add_blood(src) + return 1 + +/mob/living/carbon/airlock_crush(var/crush_damage) + . = ..() + if(can_feel_pain()) + emote("scream") + +/mob/living/silicon/robot/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + return 0 + +/obj/machinery/door/airlock/close(var/forced=0) + if(!can_close(forced)) + return 0 + + if(safe) + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.blocks_airlock()) + if(!has_beeped) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) + has_beeped = 1 + autoclose_in(6) + return + + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) + take_damage(DOOR_CRUSH_DAMAGE) + + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + has_beeped = 0 + for(var/P in player_list) + var/mob/M = P + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) + if(arePowerSystemsOn()) + sound = legacy_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else + if(arePowerSystemsOn()) + sound = close_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + for(var/turf/turf in locs) + var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) + if(killthis) + killthis.ex_act(2)//Smashin windows + return ..() + +/obj/machinery/door/airlock/proc/lock(var/forced=0) + if(locked) + return 0 + + if (operating && !forced) return 0 + + src.locked = 1 + playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/unlock(var/forced=0) + if(!src.locked) + return + + if (!forced) + if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return + + src.locked = 0 + playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/allowed(mob/M) + if(locked) + return 0 + return ..(M) + +/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) + ..() + + //if assembly is given, create the new door from the assembly + if (assembly && istype(assembly)) + assembly_type = assembly.type + + electronics = assembly.electronics + electronics.loc = src + + //update the door's access to match the electronics' + secured_wires = electronics.secure + if(electronics.one_access) + LAZYCLEARLIST(req_access) + req_one_access = src.electronics.conf_access + else + LAZYCLEARLIST(req_one_access) + req_access = src.electronics.conf_access + + //get the name from the assembly + if(assembly.created_name) + name = assembly.created_name + else + name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + + //get the dir from the assembly + set_dir(assembly.dir) + + //wires + var/turf/T = get_turf(newloc) + if(T && (T.z in using_map.admin_levels)) + secured_wires = 1 + if (secured_wires) + wires = new/datum/wires/airlock/secure(src) + else + wires = new/datum/wires/airlock(src) + +/obj/machinery/door/airlock/Initialize() + if(src.closeOtherId != null) + for (var/obj/machinery/door/airlock/A in machines) + if(A.closeOtherId == src.closeOtherId && A != src) + src.closeOther = A + break + name = "\improper [name]" + . = ..() + +/obj/machinery/door/airlock/Destroy() + qdel(wires) + wires = null + return ..() + +// Most doors will never be deconstructed over the course of a round, +// so as an optimization defer the creation of electronics until +// the airlock is deconstructed +/obj/machinery/door/airlock/proc/create_electronics() + //create new electronics + if (secured_wires) + src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) + else + src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) + + //update the electronics to match the door's access + if(LAZYLEN(req_access)) + electronics.conf_access = req_access + else if (LAZYLEN(req_one_access)) + electronics.conf_access = req_one_access + electronics.one_access = 1 + +/obj/machinery/door/airlock/emp_act(var/severity) + if(prob(40/severity)) + var/duration = world.time + SecondsToTicks(30 / severity) + if(duration > electrified_until) + electrify(duration) + ..() + +/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason + ..() + if(stat & NOPOWER) + // If we lost power, disable electrification + // Keeping door lights on, runs on internal battery or something. + electrified_until = 0 + update_icon() + +/obj/machinery/door/airlock/proc/prison_open() + if(arePowerSystemsOn()) + src.unlock() + src.open() + src.lock() + return + + +/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + // Old RCD code made it cost 10 units to decon an airlock. + // Now the new one costs ten "sheets". + return list( + RCD_VALUE_MODE = RCD_DECONSTRUCT, + RCD_VALUE_DELAY = 5 SECONDS, + RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 + ) + return FALSE + +/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, span("notice", "You deconstruct \the [src].")) + qdel(src) + return TRUE + return FALSE +======= +//VOREStation Edit - Redone a lot of airlock things: +/* +- Specific department maintenance doors +- Named doors properly according to type +- Gave them default access levels with the access constants +- Improper'd all of the names in the new() +*/ + +/obj/machinery/door/airlock + name = "Airlock" + icon = 'icons/obj/doors/Doorint.dmi' + icon_state = "door_closed" + power_channel = ENVIRON + + explosion_resistance = 10 + + // Doors do their own stuff + bullet_vulnerability = 0 + + blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime + + var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + var/hackProof = 0 // if 1, this door can't be hacked by the AI + var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. + var/main_power_lost_until = 0 //World time when main power is restored. + var/backup_power_lost_until = -1 //World time when backup power is restored. + var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. + var/spawnPowerRestoreRunning = 0 + var/welded = null + var/locked = 0 + var/lights = 1 // bolt lights show by default + var/aiDisabledIdScanner = 0 + var/aiHacking = 0 + var/obj/machinery/door/airlock/closeOther = null + var/closeOtherId = null + var/lockdownbyai = 0 + autoclose = 1 + var/assembly_type = /obj/structure/door_assembly + var/mineral = null + var/justzap = 0 + var/safe = 1 + normalspeed = 1 + var/obj/item/weapon/airlock_electronics/electronics = null + var/hasShocked = 0 //Prevents multiple shocks from happening + var/secured_wires = 0 + var/datum/wires/airlock/wires = null + + var/open_sound_powered = 'sound/machines/door/covert1o.ogg' + var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' + var/close_sound_powered = 'sound/machines/door/covert1c.ogg' + var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' + var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' + var/department_open_powered = null + var/department_close_powered = null + var/denied_sound = 'sound/machines/deniedbeep.ogg' + var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' + var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' + +/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) + if(stat & (BROKEN|NOPOWER)) + if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) + if(src.locked || src.welded) + visible_message("\The [user] begins breaking into \the [src] internals!") + user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. + if(do_after(user,10 SECONDS,src)) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + if(prob(25)) + src.shock(user, 100) + user.set_AI_busy(FALSE) + else if(src.density) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + if(src.locked || src.welded) + visible_message("\The [user] begins tearing into \the [src] internals!") + src.do_animate("deny") + if(do_after(user,15 SECONDS,src)) + visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") + src.do_animate("spark") + playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + src.locked = 0 + src.welded = 0 + update_icon() + open(1) + src.set_broken() //These aren't emags, these be CLAWS + else if(src.density) + visible_message("\The [user] begins forcing \the [src] open!") + if(do_after(user, 5 SECONDS,src)) + playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) + visible_message("\The [user] forces \the [src] open!") + open(1) + else + visible_message("\The [user] forces \the [src] closed!") + close(1) + else + src.do_animate("deny") + visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") + return + ..() + +/obj/machinery/door/airlock/get_material() + if(mineral) + return get_material_by_name(mineral) + return get_material_by_name(MAT_STEEL) + +/obj/machinery/door/airlock/command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcom.dmi' + req_one_access = list(access_heads) + assembly_type = /obj/structure/door_assembly/door_assembly_com + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd3o.ogg' + department_close_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsec.dmi' + req_one_access = list(access_security) + assembly_type = /obj/structure/door_assembly/door_assembly_sec + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Dooreng.dmi' + req_one_access = list(access_engine) + assembly_type = /obj/structure/door_assembly/door_assembly_eng + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmos.dmi' + req_one_access = list(access_atmospherics) + assembly_type = /obj/structure/door_assembly/door_assembly_eat + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormed.dmi' + req_one_access = list(access_medical) + assembly_type = /obj/structure/door_assembly/door_assembly_med + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/maintenance + name = "Maintenance Access" + icon = 'icons/obj/doors/Doormaint.dmi' + //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access + assembly_type = /obj/structure/door_assembly/door_assembly_mai + open_sound_powered = 'sound/machines/door/door2o.ogg' + close_sound_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/cargo + icon = 'icons/obj/doors/Doormaint_cargo.dmi' + req_one_access = list(access_cargo) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/door2o.ogg' + department_close_powered = 'sound/machines/door/door2c.ogg' + +/obj/machinery/door/airlock/maintenance/command + icon = 'icons/obj/doors/Doormaint_command.dmi' + req_one_access = list(access_heads) + +/obj/machinery/door/airlock/maintenance/common + icon = 'icons/obj/doors/Doormaint_common.dmi' + open_sound_powered = 'sound/machines/door/hall3o.ogg' + close_sound_powered = 'sound/machines/door/hall3c.ogg' + +/obj/machinery/door/airlock/maintenance/engi + icon = 'icons/obj/doors/Doormaint_engi.dmi' + req_one_access = list(access_engine) + +/obj/machinery/door/airlock/maintenance/int + icon = 'icons/obj/doors/Doormaint_int.dmi' + +/obj/machinery/door/airlock/maintenance/medical + icon = 'icons/obj/doors/Doormaint_med.dmi' + req_one_access = list(access_medical) + +/obj/machinery/door/airlock/maintenance/rnd + icon = 'icons/obj/doors/Doormaint_rnd.dmi' + req_one_access = list(access_research) + +/obj/machinery/door/airlock/maintenance/sec + icon = 'icons/obj/doors/Doormaint_sec.dmi' + req_one_access = list(access_security) + +/obj/machinery/door/airlock/external + name = "External Airlock" + icon = 'icons/obj/doors/Doorext.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/external/bolted + icon_state = "door_locked" // So it looks visibly bolted in map editor + locked = 1 + +// For convenience in making docking ports: one that is pre-bolted with frequency set! +/obj/machinery/door/airlock/external/bolted/cycling + frequency = 1379 + +/obj/machinery/door/airlock/glass_external + name = "External Airlock" + icon = 'icons/obj/doors/Doorextglass.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_ext + opacity = 0 + glass = 1 + req_one_access = list(access_external_airlocks) + open_sound_powered = 'sound/machines/door/space1o.ogg' + close_sound_powered = 'sound/machines/door/space1c.ogg' + +/obj/machinery/door/airlock/glass + name = "Glass Airlock" + icon = 'icons/obj/doors/Doorglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + open_sound_powered = 'sound/machines/door/hall1o.ogg' + close_sound_powered = 'sound/machines/door/hall1c.ogg' + legacy_open_powered = 'sound/machines/door/windowdoor.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + glass = 1 + +/obj/machinery/door/airlock/centcom + name = "Centcom Airlock" + icon = 'icons/obj/doors/Doorele.dmi' + req_one_access = list(access_cent_general) + opacity = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/glass_centcom + name = "Airlock" + icon = 'icons/obj/doors/Dooreleglass.dmi' + opacity = 0 + glass = 1 + open_sound_powered = 'sound/machines/door/cmd3o.ogg' + close_sound_powered = 'sound/machines/door/cmd3c.ogg' + +/obj/machinery/door/airlock/vault + name = "Vault" + icon = 'icons/obj/doors/vault.dmi' + explosion_resistance = 20 + opacity = 1 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/vault1o.ogg' + close_sound_powered = 'sound/machines/door/vault1c.ogg' + +/obj/machinery/door/airlock/vault/bolted + icon_state = "door_locked" + locked = 1 + +/obj/machinery/door/airlock/freezer + name = "Freezer Airlock" + icon = 'icons/obj/doors/Doorfreezer.dmi' + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_fre + +/obj/machinery/door/airlock/hatch + name = "Airtight Hatch" + icon = 'icons/obj/doors/Doorhatchele.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_hatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/maintenance_hatch + name = "Maintenance Hatch" + icon = 'icons/obj/doors/Doorhatchmaint2.dmi' + explosion_resistance = 20 + opacity = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_mhatch + req_one_access = list(access_maint_tunnels) + open_sound_powered = 'sound/machines/door/hatchopen.ogg' + close_sound_powered = 'sound/machines/door/hatchclose.ogg' + open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' + +/obj/machinery/door/airlock/glass_command + name = "Command Airlock" + icon = 'icons/obj/doors/Doorcomglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_com + glass = 1 + req_one_access = list(access_heads) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cmd1o.ogg' + department_close_powered = 'sound/machines/door/cmd1c.ogg' + +/obj/machinery/door/airlock/glass_engineering + name = "Engineering Airlock" + icon = 'icons/obj/doors/Doorengglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eng + glass = 1 + req_one_access = list(access_engine) + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_engineeringatmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Doorengatmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_eat + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/glass_security + name = "Security Airlock" + icon = 'icons/obj/doors/Doorsecglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_sec + glass = 1 + req_one_access = list(access_security) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sec1o.ogg' + department_close_powered = 'sound/machines/door/sec1c.ogg' + +/obj/machinery/door/airlock/glass_medical + name = "Medical Airlock" + icon = 'icons/obj/doors/Doormedglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_med + glass = 1 + req_one_access = list(access_medical) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/med1o.ogg' + department_close_powered = 'sound/machines/door/med1c.ogg' + +/obj/machinery/door/airlock/mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doormining.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_min + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmo.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearch.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_research + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_research + name = "Research Airlock" + icon = 'icons/obj/doors/Doorresearchglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_research + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_mining + name = "Mining Airlock" + icon = 'icons/obj/doors/Doorminingglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_min + glass = 1 + req_one_access = list(access_mining) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/cgo1o.ogg' + department_close_powered = 'sound/machines/door/cgo1c.ogg' + +/obj/machinery/door/airlock/glass_atmos + name = "Atmospherics Airlock" + icon = 'icons/obj/doors/Dooratmoglass.dmi' + hitsound = 'sound/effects/Glasshit.ogg' + maxhealth = 300 + explosion_resistance = 5 + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_atmo + glass = 1 + req_one_access = list(access_atmospherics) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/eng1o.ogg' + department_close_powered = 'sound/machines/door/eng1c.ogg' + +/obj/machinery/door/airlock/gold + name = "Gold Airlock" + icon = 'icons/obj/doors/Doorgold.dmi' + mineral = "gold" + +/obj/machinery/door/airlock/silver + name = "Silver Airlock" + icon = 'icons/obj/doors/Doorsilver.dmi' + mineral = "silver" + +/obj/machinery/door/airlock/diamond + name = "Diamond Airlock" + icon = 'icons/obj/doors/Doordiamond.dmi' + mineral = "diamond" + +/obj/machinery/door/airlock/uranium + name = "Uranium Airlock" + desc = "And they said I was crazy." + icon = 'icons/obj/doors/Dooruranium.dmi' + mineral = "uranium" + var/last_event = 0 + var/rad_power = 7.5 + +/obj/machinery/door/airlock/process() + // Deliberate no call to parent. + if(main_power_lost_until > 0 && world.time >= main_power_lost_until) + regainMainPower() + + if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) + regainBackupPower() + + else if(electrified_until > 0 && world.time >= electrified_until) + electrify(0) + + if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) + . = PROCESS_KILL + +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + SSradiation.radiate(src, rad_power) + last_event = world.time + ..() + +/obj/machinery/door/airlock/phoron + name = "Phoron Airlock" + desc = "No way this can end badly." + icon = 'icons/obj/doors/Doorphoron.dmi' + mineral = "phoron" + +/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) + if(exposed_temperature > 300) + PhoronBurn(exposed_temperature) + +/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) + for(var/turf/simulated/floor/target_tile in range(2,loc)) + target_tile.assume_gas("phoron", 35, 400+T0C) + spawn (0) target_tile.hotspot_expose(temperature, 400) + for(var/turf/simulated/wall/W in range(3,src)) + W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame + for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) + D.ignite(temperature/4) + new/obj/structure/door_assembly( src.loc ) + qdel(src) + +/obj/machinery/door/airlock/sandstone + name = "Sandstone Airlock" + icon = 'icons/obj/doors/Doorsand.dmi' + mineral = "sandstone" + +/obj/machinery/door/airlock/science + name = "Research Airlock" + icon = 'icons/obj/doors/Doorsci.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_science + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/glass_science + name = "Glass Airlocks" + icon = 'icons/obj/doors/Doorsciglass.dmi' + opacity = 0 + assembly_type = /obj/structure/door_assembly/door_assembly_science + glass = 1 + req_one_access = list(access_research) + open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. + department_open_powered = 'sound/machines/door/sci1o.ogg' + department_close_powered = 'sound/machines/door/sci1c.ogg' + +/obj/machinery/door/airlock/highsecurity + name = "Secure Airlock" + icon = 'icons/obj/doors/hightechsecurity.dmi' + explosion_resistance = 20 + secured_wires = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity + req_one_access = list(access_heads_vault) + open_sound_powered = 'sound/machines/door/secure1o.ogg' + close_sound_powered = 'sound/machines/door/secure1c.ogg' + +/obj/machinery/door/airlock/voidcraft + name = "voidcraft hatch" + desc = "It's an extra resilient airlock intended for spacefaring vessels." + icon = 'icons/obj/doors/shuttledoors.dmi' + explosion_resistance = 20 + opacity = 0 + glass = 1 + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + +// Airlock opens from top-bottom instead of left-right. +/obj/machinery/door/airlock/voidcraft/vertical + icon = 'icons/obj/doors/shuttledoors_vertical.dmi' + assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical + open_sound_powered = 'sound/machines/door/shuttle1o.ogg' + close_sound_powered = 'sound/machines/door/shuttle1c.ogg' + + +/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock + name = "Precursor Alpha Object - Doors" + desc = "This object appears to be used in order to restrict or allow access to \ + rooms based on its physical state. In other words, a door. \ + Despite being designed and created by unknown ancient alien hands, this door has \ + a large number of similarities to the conventional airlock, such as being driven by \ + electricity, opening and closing by physically moving, and being air tight. \ + It also operates by responding to signals through internal electrical conduits. \ + These characteristics make it possible for one with experience with a multitool \ + to manipulate the door.\ +

    \ + The symbol on the door does not match any living species' patterns, giving further \ + implications that this door is very old, and yet it remains operational after \ + thousands of years. It is unknown if that is due to superb construction, or \ + unseen autonomous maintenance having been performed." + value = CATALOGUER_REWARD_EASY + +/obj/machinery/door/airlock/alien + name = "alien airlock" + desc = "You're fairly sure this is a door." + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) + icon = 'icons/obj/doors/Dooralien.dmi' + explosion_resistance = 20 + secured_wires = TRUE + hackProof = TRUE + assembly_type = /obj/structure/door_assembly/door_assembly_alien + req_one_access = list(access_alien) + +/obj/machinery/door/airlock/alien/locked + icon_state = "door_locked" + locked = TRUE + +/obj/machinery/door/airlock/alien/public // Entry to UFO. + req_one_access = list() + normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. + hackProof = TRUE //VOREStation Edit - No borgos + +/* +About the new airlock wires panel: +* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. +* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) +* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. +* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. +* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. +* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. +* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. +* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) +* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. +* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. +*/ + + + +/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite + if(!issilicon(usr)) + if(src.isElectrified()) + if(!src.justzap) + if(src.shock(user, 100)) + src.justzap = 1 + spawn (10) + src.justzap = 0 + return + else /*if(src.justzap)*/ + return + else if(user.hallucination > 50 && prob(10) && src.operating == 0) + to_chat(user, "You feel a powerful shock course through your body!") + user.halloss += 10 + user.stunned += 10 + return + ..(user) + +/obj/machinery/door/airlock/proc/isElectrified() + if(src.electrified_until != 0) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/canAIControl() + return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/canAIHack() + return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); + +/obj/machinery/door/airlock/proc/arePowerSystemsOn() + if (stat & (NOPOWER|BROKEN)) + return 0 + return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) + +/obj/machinery/door/airlock/requiresID() + return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) + +/obj/machinery/door/airlock/proc/isAllPowerLoss() + if(stat & (NOPOWER|BROKEN)) + return 1 + if(mainPowerCablesCut() && backupPowerCablesCut()) + return 1 + return 0 + +/obj/machinery/door/airlock/proc/mainPowerCablesCut() + return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) + +/obj/machinery/door/airlock/proc/backupPowerCablesCut() + return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) + +/obj/machinery/door/airlock/proc/loseMainPower() + main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running + if(backup_power_lost_until == -1 && !backupPowerCablesCut()) + backup_power_lost_until = world.time + SecondsToTicks(10) + + if(main_power_lost_until > 0 || backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/loseBackupPower() + backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) + + if(backup_power_lost_until > 0) + START_MACHINE_PROCESSING(src) + + // Disable electricity if required + if(electrified_until && isAllPowerLoss()) + electrify(0) + + update_icon() + +/obj/machinery/door/airlock/proc/regainMainPower() + if(!mainPowerCablesCut()) + main_power_lost_until = 0 + // If backup power is currently active then disable, otherwise let it count down and disable itself later + if(!backup_power_lost_until) + backup_power_lost_until = -1 + + update_icon() + +/obj/machinery/door/airlock/proc/regainBackupPower() + if(!backupPowerCablesCut()) + // Restore backup power only if main power is offline, otherwise permanently disable + backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 + + update_icon() + +/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) + message = text("The electrification wire is cut - Door permanently electrified.") + src.electrified_until = -1 + else if(duration && !arePowerSystemsOn()) + message = text("The door is unpowered - Cannot electrify the door.") + src.electrified_until = 0 + else if(!duration && electrified_until != 0) + message = "The door is now un-electrified." + src.electrified_until = 0 + else if(duration) //electrify door for the given duration seconds + if(usr) + shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") + add_attack_logs(usr,name,"Electrified a door") + else + shockedby += text("\[[time_stamp()]\] - EMP)") + message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." + src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) + + if(electrified_until > 0) + START_MACHINE_PROCESSING(src) + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) + var/message = "" + if(wires.is_cut(WIRE_IDSCAN)) + message = "The IdScan wire is cut - IdScan feature permanently disabled." + else if(activate && src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 0 + message = "IdScan feature has been enabled." + else if(!activate && !src.aiDisabledIdScanner) + src.aiDisabledIdScanner = 1 + message = "IdScan feature has been disabled." + + if(feedback && message) + to_chat(usr,message) + +/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) + var/message = "" + // Safeties! We don't need no stinking safeties! + if (wires.is_cut(WIRE_SAFETY)) + message = text("The safety wire is cut - Cannot enable safeties.") + else if (!activate && src.safe) + safe = 0 + else if (activate && !src.safe) + safe = 1 + + if(feedback && message) + to_chat(usr,message) + +// shock user with probability prb (if all connections & power are working) +// returns 1 if shocked, 0 otherwise +// The preceding comment was borrowed from the grille's shock script +/obj/machinery/door/airlock/shock(mob/user, prb) + if(!arePowerSystemsOn()) + return 0 + if(hasShocked) + return 0 //Already shocked someone recently? + if(..()) + hasShocked = 1 + sleep(10) + hasShocked = 0 + return 1 + else + return 0 + + +/obj/machinery/door/airlock/update_icon() + cut_overlays() + if(density) + if(locked && lights && src.arePowerSystemsOn()) + icon_state = "door_locked" + else + icon_state = "door_closed" + if(p_open || welded) + if(p_open) + add_overlay("panel_open") + if (!(stat & NOPOWER)) + if(stat & BROKEN) + add_overlay("sparks_broken") + else if (health < maxhealth * 3/4) + add_overlay("sparks_damaged") + if(welded) + add_overlay("welded") + else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) + add_overlay("sparks_damaged") + else + icon_state = "door_open" + if((stat & BROKEN) && !(stat & NOPOWER)) + add_overlay("sparks_open") + return + +/obj/machinery/door/airlock/do_animate(animation) + switch(animation) + if("opening") + cut_overlay() + if(p_open) + spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. + flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking + update_icon() + else + flick("door_opening", src)//[stat ? "_stat":] + update_icon() + if("closing") + cut_overlay() + if(p_open) + spawn(2) + flick("o_door_closing", src) + update_icon() + else + flick("door_closing", src) + update_icon() + if("spark") + if(density) + flick("door_spark", src) + if("deny") + if(density && src.arePowerSystemsOn()) + flick("door_deny", src) + playsound(src, denied_sound, 50, 0, 3) + return + +/obj/machinery/door/airlock/attack_ai(mob/user as mob) + tgui_interact(user) + +/obj/machinery/door/airlock/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiAirlock", name) + ui.open() + if(custom_state) + ui.set_state(custom_state) + return TRUE + +/obj/machinery/door/airlock/tgui_data(mob/user) + var/list/data = list() + + var/list/power = list() + power["main"] = main_power_lost_until > 0 ? 0 : 2 + power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) + power["backup"] = backup_power_lost_until > 0 ? 0 : 2 + power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) + data["power"] = power + + data["shock"] = (electrified_until == 0) ? 2 : 0 + data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) + data["id_scanner"] = !aiDisabledIdScanner + data["locked"] = locked // bolted + data["lights"] = lights // bolt lights + data["safe"] = safe // safeties + data["speed"] = normalspeed // safe speed + data["welded"] = welded // welded + data["opened"] = !density // opened + + var/list/wire = list() + wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) + wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) + wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) + wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) + wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) + wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) + wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) + wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) + wire["safe"] = !wires.is_cut(WIRE_SAFETY) + wire["timing"] = !wires.is_cut(WIRE_SPEED) + + data["wires"] = wire + return data + +/obj/machinery/door/airlock/proc/hack(mob/user as mob) + if(src.aiHacking==0) + src.aiHacking=1 + spawn(20) + //TODO: Make this take a minute + to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") + sleep(50) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") + sleep(20) + to_chat(user, "Attempting to hack into airlock. This may take some time.") + sleep(200) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Upload access confirmed. Loading control program into airlock software.") + sleep(170) + if(src.canAIControl()) + to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") + src.aiHacking=0 + return + else if(!src.canAIHack(user)) + to_chat(user, "We've lost our connection! Unable to hack airlock.") + src.aiHacking=0 + return + to_chat(user, "Transfer complete. Forcing airlock to execute program.") + sleep(50) + //disable blocked control + src.aiControlDisabled = 2 + to_chat(user, "Receiving control information from airlock.") + sleep(10) + //bring up airlock dialog + src.aiHacking = 0 + if (user) + src.attack_ai(user) + +/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) + if (src.isElectrified()) + if (istype(mover, /obj/item)) + var/obj/item/i = mover + if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + return ..() + +/obj/machinery/door/airlock/attack_hand(mob/user as mob) + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 100)) + return + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/X = user + if(istype(X.species, /datum/species/xenos)) + src.attack_alien(user) + return + + if(src.p_open) + user.set_machine(src) + wires.Interact(user) + else + ..(user) + return + +/obj/machinery/door/airlock/tgui_act(action, params) + if(..()) + return TRUE + if(!user_allowed(usr)) + return TRUE + + switch(action) + if("disrupt-main") + if(!main_power_lost_until) + loseMainPower() + update_icon() + else + to_chat(usr, "Main power is already offline.") + . = TRUE + if("disrupt-backup") + if(!backup_power_lost_until) + loseBackupPower() + update_icon() + else + to_chat(usr, "Backup power is already offline.") + . = TRUE + if("shock-restore") + electrify(0, 1) + . = TRUE + if("shock-temp") + electrify(30, 1) + . = TRUE + if("shock-perm") + electrify(-1, 1) + . = TRUE + if("idscan-toggle") + set_idscan(aiDisabledIdScanner, 1) + . = TRUE + // if("emergency-toggle") + // toggle_emergency(usr) + // . = TRUE + if("bolt-toggle") + toggle_bolt(usr) + . = TRUE + if("light-toggle") + if(wires.is_cut(WIRE_BOLT_LIGHT)) + to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") + return + lights = !lights + update_icon() + . = TRUE + if("safe-toggle") + set_safeties(!safe, 1) + . = TRUE + if("speed-toggle") + if(wires.is_cut(WIRE_SPEED)) + to_chat(usr, "The timing wire is cut - Cannot alter timing.") + return + normalspeed = !normalspeed + . = TRUE + if("open-close") + user_toggle_open(usr) + . = TRUE + + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/user_allowed(mob/user) + var/allowed = (issilicon(user) && canAIControl(user)) + if(!allowed && isobserver(user)) + var/mob/observer/dead/D = user + if(D.can_admin_interact()) + allowed = TRUE + return allowed + +/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) + if(!user_allowed(user)) + return + if(wires.is_cut(WIRE_DOOR_BOLTS)) + to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") + return + if(locked) + if(!arePowerSystemsOn()) + to_chat(user, "The door has no power - you can't raise the door bolts.") + else + unlock() + to_chat(user, "The door bolts have been raised.") + // log_combat(user, src, "unbolted") + else + lock() + to_chat(user, "The door bolts have been dropped.") + // log_combat(user, src, "bolted") + +/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) + if(!user_allowed(user)) + return + if(welded) + to_chat(user, text("The airlock has been welded shut!")) + else if(locked) + to_chat(user, text("The door bolts are down!")) + else if(!density) + close() + else + open() + +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + +/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) + //to_world("airlock attackby src [src] obj [C] mob [user]") + if(!istype(usr, /mob/living/silicon)) + if(src.isElectrified()) + if(src.shock(user, 75)) + return + if(istype(C, /obj/item/taperoll)) + return + + src.add_fingerprint(user) + if (attempt_vr(src,"attackby_vr",list(C, user))) return + if(istype(C, /mob/living)) + ..() + return + if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) + var/obj/item/weapon/weldingtool/W = C + if(W.remove_fuel(0,user)) + if(!src.welded) + src.welded = 1 + else + src.welded = null + playsound(src, C.usesound, 75, 1) + src.update_icon() + return + else + return + else if(C.is_screwdriver()) + if (src.p_open) + if (stat & BROKEN) + to_chat(usr, "The panel is broken and cannot be closed.") + else + src.p_open = 0 + playsound(src, C.usesound, 50, 1) + else + src.p_open = 1 + playsound(src, C.usesound, 50, 1) + src.update_icon() + else if(C.is_wirecutter()) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/multitool)) + return src.attack_hand(user) + else if(istype(C, /obj/item/device/assembly/signaler)) + return src.attack_hand(user) + else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE + var/obj/item/weapon/pai_cable/cable = C + cable.plugin(src, user) + else if(!repairing && C.is_crowbar()) + if(can_remove_electronics()) + playsound(src, C.usesound, 75, 1) + user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") + if(do_after(user,40 * C.toolspeed)) + to_chat(user, "You removed the airlock electronics!") + + var/obj/structure/door_assembly/da = new assembly_type(src.loc) + if (istype(da, /obj/structure/door_assembly/multi_tile)) + da.set_dir(src.dir) + + da.anchored = TRUE + if(mineral) + da.glass = mineral + //else if(glass) + else if(glass && !da.glass) + da.glass = 1 + da.state = 1 + da.created_name = src.name + da.update_state() + + if(operating == -1 || (stat & BROKEN)) + new /obj/item/weapon/circuitboard/broken(src.loc) + operating = 0 + else + if (!electronics) create_electronics() + + electronics.loc = src.loc + electronics = null + + qdel(src) + return + else if(arePowerSystemsOn()) + to_chat(user, "The airlock's motors resist your efforts to force it.") + else if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else + if(density) + spawn(0) open(1) + else + spawn(0) close(1) + + // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). + else if(istype(C, /obj/item/weapon)) + var/obj/item/weapon/W = C + if((W.pry == 1) && !arePowerSystemsOn()) + if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else if( !welded && !operating ) + if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + to_chat(user, "You need to be wielding \the [F] to do that.") + return + // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. + if(density) + spawn(0) + open(1) + else + spawn(0) + close(1) + else + ..() + else + ..() + return + +/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) + if(C) + ignite(is_hot(C)) + ..() + +/obj/machinery/door/airlock/set_broken() + src.p_open = 1 + stat |= BROKEN + if (secured_wires) + lock() + for (var/mob/O in viewers(src, null)) + if ((O.client && !( O.blinded ))) + O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + + update_icon() + return + +/obj/machinery/door/airlock/open(var/forced=0) + if(!can_open(forced)) + return 0 + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + + //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator + for(var/mob/M as anything in player_list) + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. + if(arePowerSystemsOn()) + sound = legacy_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_open_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else // Else, play these. + if(arePowerSystemsOn()) + sound = open_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + + if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) + src.closeOther.close() + return ..() + +/obj/machinery/door/airlock/can_open(var/forced=0) + if(!forced) + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + if(locked || welded) + return 0 + return ..() + +/obj/machinery/door/airlock/can_close(var/forced=0) + if(locked || welded) + return 0 + + if(!forced) + //despite the name, this wire is for general door control. + if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) + return 0 + + return ..() + +/atom/movable/proc/blocks_airlock() + return density + +/obj/machinery/door/blocks_airlock() + return 0 + +/obj/machinery/mech_sensor/blocks_airlock() + return 0 + +/mob/living/blocks_airlock() + return 1 + +/atom/movable/proc/airlock_crush(var/crush_damage) + return 0 + +/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) + . = ..() + health -= crush_damage + healthcheck() + +/obj/effect/energy_field/airlock_crush(var/crush_damage) + adjust_strength(crush_damage) + +/obj/structure/closet/airlock_crush(var/crush_damage) + ..() + damage(crush_damage) + for(var/atom/movable/AM in src) + AM.airlock_crush() + return 1 + +/mob/living/airlock_crush(var/crush_damage) + . = ..() + adjustBruteLoss(crush_damage) + SetStunned(5) + SetWeakened(5) + var/turf/T = get_turf(src) + T.add_blood(src) + return 1 + +/mob/living/carbon/airlock_crush(var/crush_damage) + . = ..() + if(can_feel_pain()) + emote("scream") + +/mob/living/silicon/robot/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + return 0 + +/obj/machinery/door/airlock/close(var/forced=0) + if(!can_close(forced)) + return 0 + + if(safe) + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.blocks_airlock()) + if(!has_beeped) + playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) + has_beeped = 1 + autoclose_in(6) + return + + for(var/turf/turf in locs) + for(var/atom/movable/AM in turf) + if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) + take_damage(DOOR_CRUSH_DAMAGE) + + use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people + has_beeped = 0 + for(var/mob/M as anything in player_list) + if(!M || !M.client) + continue + var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) + var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) + var/sound + var/volume + if(old_sounds) + if(arePowerSystemsOn()) + sound = legacy_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. + if(arePowerSystemsOn()) + sound = department_close_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + else + if(arePowerSystemsOn()) + sound = close_sound_powered + volume = 50 + else + sound = open_sound_unpowered + volume = 75 + + var/turf/T = get_turf(M) + var/distance = get_dist(T, get_turf(src)) + if(distance <= world.view * 2) + if(T && T.z == get_z(src)) + M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) + for(var/turf/turf in locs) + var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) + if(killthis) + killthis.ex_act(2)//Smashin windows + return ..() + +/obj/machinery/door/airlock/proc/lock(var/forced=0) + if(locked) + return 0 + + if (operating && !forced) return 0 + + src.locked = 1 + playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/proc/unlock(var/forced=0) + if(!src.locked) + return + + if (!forced) + if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return + + src.locked = 0 + playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) + for(var/mob/M in range(1,src)) + M.show_message("You hear a click from the bottom of the door.", 2) + update_icon() + return 1 + +/obj/machinery/door/airlock/allowed(mob/M) + if(locked) + return 0 + return ..(M) + +/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) + ..() + + //if assembly is given, create the new door from the assembly + if (assembly && istype(assembly)) + assembly_type = assembly.type + + electronics = assembly.electronics + electronics.loc = src + + //update the door's access to match the electronics' + secured_wires = electronics.secure + if(electronics.one_access) + LAZYCLEARLIST(req_access) + req_one_access = src.electronics.conf_access + else + LAZYCLEARLIST(req_one_access) + req_access = src.electronics.conf_access + + //get the name from the assembly + if(assembly.created_name) + name = assembly.created_name + else + name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + + //get the dir from the assembly + set_dir(assembly.dir) + + //wires + var/turf/T = get_turf(newloc) + if(T && (T.z in using_map.admin_levels)) + secured_wires = 1 + if (secured_wires) + wires = new/datum/wires/airlock/secure(src) + else + wires = new/datum/wires/airlock(src) + +/obj/machinery/door/airlock/Initialize() + if(src.closeOtherId != null) + for (var/obj/machinery/door/airlock/A in machines) + if(A.closeOtherId == src.closeOtherId && A != src) + src.closeOther = A + break + name = "\improper [name]" + . = ..() + +/obj/machinery/door/airlock/Destroy() + qdel(wires) + wires = null + return ..() + +// Most doors will never be deconstructed over the course of a round, +// so as an optimization defer the creation of electronics until +// the airlock is deconstructed +/obj/machinery/door/airlock/proc/create_electronics() + //create new electronics + if (secured_wires) + src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) + else + src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) + + //update the electronics to match the door's access + if(LAZYLEN(req_access)) + electronics.conf_access = req_access + else if (LAZYLEN(req_one_access)) + electronics.conf_access = req_one_access + electronics.one_access = 1 + +/obj/machinery/door/airlock/emp_act(var/severity) + if(prob(40/severity)) + var/duration = world.time + SecondsToTicks(30 / severity) + if(duration > electrified_until) + electrify(duration) + ..() + +/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason + ..() + if(stat & NOPOWER) + // If we lost power, disable electrification + // Keeping door lights on, runs on internal battery or something. + electrified_until = 0 + update_icon() + +/obj/machinery/door/airlock/proc/prison_open() + if(arePowerSystemsOn()) + src.unlock() + src.open() + src.lock() + return + + +/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + // Old RCD code made it cost 10 units to decon an airlock. + // Now the new one costs ten "sheets". + return list( + RCD_VALUE_MODE = RCD_DECONSTRUCT, + RCD_VALUE_DELAY = 5 SECONDS, + RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 + ) + return FALSE + +/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, span("notice", "You deconstruct \the [src].")) + qdel(src) + return TRUE + return FALSE +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index d2ee11fbf8..6a593ab554 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -5,7 +5,7 @@ //Create global frame type list if it hasn't been made already. construction_frame_wall = list() construction_frame_floor = list() - for(var/R in typesof(/datum/frame/frame_types) - /datum/frame/frame_types) + for(var/R in subtypesof(/datum/frame/frame_types)) var/datum/frame/frame_types/type = new R if(type.frame_style == FRAME_STYLE_WALL) construction_frame_wall += type @@ -272,9 +272,8 @@ for(var/A in circuit.req_components) req_components[A] = circuit.req_components[A] req_component_names = circuit.req_components.Copy() - for(var/A in req_components) - var/obj/ct = A - req_component_names[A] = initial(ct.name) + for(var/obj/ct as anything in req_components) + req_component_names[ct] = initial(ct.name) /obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/datum/frame/frame_types/type, mob/user as mob) ..() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 54a65642f0..db40cbcf39 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -91,8 +91,7 @@ media_start_time = 0 update_music() //VOREStation Add - for(var/rem in remotes) - var/obj/item/device/juke_remote/remote = rem + for(var/obj/item/device/juke_remote/remote as anything in remotes) remote.update_music() //VOREStation Add End diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 2da7d5342a..26766addf6 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -548,8 +548,7 @@ Class Procs: surviving_parts += new /obj/item/stack/cable_coil(null, 1) surviving_parts += new /obj/item/stack/cable_coil(null, 1) - for(var/a in surviving_parts) - var/atom/movable/A = a + for(var/atom/movable/A as anything in surviving_parts) A.forceMove(droploc) if(scatter && isturf(droploc)) var/turf/T = droploc diff --git a/code/game/machinery/partslathe_vr.dm b/code/game/machinery/partslathe_vr.dm index 6f83f6d158..77eefb94c9 100644 --- a/code/game/machinery/partslathe_vr.dm +++ b/code/game/machinery/partslathe_vr.dm @@ -265,8 +265,7 @@ if(istype(copy_board)) data["copyBoard"] = copy_board.name var/list/req_components_ui = list() - for(var/CP in (copy_board.req_components || list())) - var/obj/comp_path = CP + for(var/obj/comp_path as anything in (copy_board.req_components || list())) var/comp_amt = copy_board.req_components[comp_path] if(comp_amt && (comp_path in partslathe_recipies)) req_components_ui.Add(list(list("name" = initial(comp_path.name), "qty" = comp_amt))) @@ -355,7 +354,7 @@ /obj/machinery/partslathe/proc/update_recipe_list() if(!partslathe_recipies) partslathe_recipies = list() - var/list/paths = typesof(/obj/item/weapon/stock_parts)-/obj/item/weapon/stock_parts + var/list/paths = subtypesof(/obj/item/weapon/stock_parts) for(var/type in paths) var/obj/item/weapon/stock_parts/I = new type() if(getHighestOriginTechLevel(I) > 1) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index d1923e949c..6d4cc34768 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -25,8 +25,15 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) . = ..() if(id_tag) //No more than 1 controller please. +<<<<<<< HEAD for(var/thing in GLOB.pointdefense_controllers) var/obj/machinery/pointdefense_control/PC = thing +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for(var/thing in pointdefense_controllers) + var/obj/machinery/pointdefense_control/PC = thing +======= + for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers) +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt if(PC != src && PC.id_tag == id_tag) warning("Two [src] with the same id_tag of [id_tag]") id_tag = null @@ -101,8 +108,15 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state)) // Check for duplicate controllers with this ID +<<<<<<< HEAD for(var/thing in GLOB.pointdefense_controllers) var/obj/machinery/pointdefense_control/PC = thing +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for(var/thing in pointdefense_controllers) + var/obj/machinery/pointdefense_control/PC = thing +======= + for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers) +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt if(PC != src && PC.id_tag == id_tag) to_chat(user, "The [new_ident] network already has a controller.") return @@ -208,8 +222,15 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) if(!id_tag) return null var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) +<<<<<<< HEAD for(var/thing in GLOB.pointdefense_controllers) var/obj/machinery/pointdefense_control/PDC = thing +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for(var/thing in pointdefense_controllers) + var/obj/machinery/pointdefense_control/PDC = thing +======= + for(var/obj/machinery/pointdefense_control/PDC as anything in pointdefense_controllers) +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels)) return PDC diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 0b1e575596..1779fdb070 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -679,12 +679,11 @@ for(var/turf/T in oview(world.view, src)) seenturfs += T - for(var/mob in living_mob_list) - var/mob/M = mob + for(var/mob/M as anything in living_mob_list) if(M.z != z) //Skip continue if(get_turf(M) in seenturfs) - assess_and_assign(mob, targets, secondarytargets) + assess_and_assign(M, targets, secondarytargets) /* This was dumb. Why do this and then check line of sight later? for(var/mob/M in mobs_in_xray_view(world.view, src)) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index b0f4f4c2c1..1e8c2e8a96 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -176,8 +176,7 @@ return M /atom/movable/proc/handle_buckled_mob_movement(atom/old_loc, direct, movetime) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) if(!L.Move(loc, direct, movetime)) L.forceMove(loc, direct, movetime) L.last_move = last_move diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 0cc5868762..2d7471a478 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -293,8 +293,7 @@ for(var/obj/effect/alien/weeds/W in orange(node_range, src)) nearby_weeds |= W - for(var/nbw in nearby_weeds) - var/obj/effect/alien/weeds/W = nbw + for(var/obj/effect/alien/weeds/W as anything in nearby_weeds) if(!W.linked_node) W.linked_node = src diff --git a/code/game/objects/effects/map_effects/portal.dm b/code/game/objects/effects/map_effects/portal.dm index 375bbcd336..ede5cbdaca 100644 --- a/code/game/objects/effects/map_effects/portal.dm +++ b/code/game/objects/effects/map_effects/portal.dm @@ -113,8 +113,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec var/lowest_y = 0 // First pass is for finding the top right corner. - for(var/thing in vis_contents) - var/turf/T = thing + for(var/turf/T as anything in vis_contents) if(T.x > highest_x) highest_x = T.x if(T.y > highest_y) @@ -124,8 +123,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec lowest_y = highest_y // Second one is for the bottom left corner. - for(var/thing in vis_contents) - var/turf/T = thing + for(var/turf/T as anything in vis_contents) if(T.x < lowest_x) lowest_x = T.x if(T.y < lowest_y) @@ -182,8 +180,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec // Connects both sides of a portal together. /obj/effect/map_effect/portal/master/proc/find_counterparts() - for(var/thing in GLOB.all_portal_masters) - var/obj/effect/map_effect/portal/master/M = thing + for(var/obj/effect/map_effect/portal/master/M as anything in GLOB.all_portal_masters) if(M == src) continue if(M.counterpart) @@ -205,8 +202,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec /obj/effect/map_effect/portal/master/proc/make_visuals() var/list/observed_turfs = list() - for(var/thing in portal_lines + src) - var/obj/effect/map_effect/portal/P = thing + for(var/obj/effect/map_effect/portal/P as anything in portal_lines + src) P.name = null P.icon_state = null @@ -230,8 +226,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec // Shifts the portal's pixels in order to line up properly, as BYOND offsets the sprite when it holds multiple turfs inside `vis_contents`. // This undos the shift that BYOND did. /obj/effect/map_effect/portal/master/proc/apply_offset() - for(var/thing in portal_lines + src) - var/obj/effect/map_effect/portal/P = thing + for(var/obj/effect/map_effect/portal/P as anything in portal_lines + src) P.pixel_x = WORLD_ICON_SIZE * P.portal_distance_x P.pixel_y = WORLD_ICON_SIZE * P.portal_distance_y @@ -245,8 +240,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec var/list/in_range = get_mobs_and_objs_in_view_fast(T, world.view, 0) var/list/mobs_to_relay = in_range["mobs"] - for(var/thing in mobs_to_relay) - var/mob/mob = thing + for(var/mob/mob as anything in mobs_to_relay) var/rendered = "[text]" mob.show_message(rendered) @@ -261,8 +255,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec var/list/in_range = get_mobs_and_objs_in_view_fast(T, world.view, 0) var/list/mobs_to_relay = in_range["mobs"] - for(var/thing in mobs_to_relay) - var/mob/mob = thing + for(var/mob/mob as anything in mobs_to_relay) mob.show_message(rendered) ..() @@ -275,8 +268,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec var/list/in_range = get_mobs_and_objs_in_view_fast(T, world.view, 0) var/list/mobs_to_relay = in_range["mobs"] - for(var/thing in mobs_to_relay) - var/mob/mob = thing + for(var/mob/mob as anything in mobs_to_relay) var/list/combined = mob.combine_message(message_pieces, verb, M) var/message = combined["formatted"] var/name_used = M.GetVoice() @@ -296,8 +288,7 @@ when portals are shortly lived, or when portals are made to be obvious with spec var/obj/effect/map_effect/portal/master/other_master = counterpart var/in_vis_contents = FALSE - for(var/thing in other_master.portal_lines + other_master) - var/obj/effect/map_effect/portal/P = thing + for(var/obj/effect/map_effect/portal/P as anything in other_master.portal_lines + other_master) if(P in true_turf.vis_locs) in_vis_contents = TRUE break diff --git a/code/game/objects/effects/map_effects/screen_shaker.dm b/code/game/objects/effects/map_effects/screen_shaker.dm index 29568242e5..c8f5d413bd 100644 --- a/code/game/objects/effects/map_effects/screen_shaker.dm +++ b/code/game/objects/effects/map_effects/screen_shaker.dm @@ -11,8 +11,7 @@ var/shake_strength = 1 // How much it shakes. /obj/effect/map_effect/interval/screen_shaker/trigger() - for(var/A in player_list) - var/mob/M = A + for(var/mob/M as anything in player_list) if(M.z == src.z && get_dist(src, M) <= shake_radius) shake_camera(M, shake_duration, shake_strength) ..() \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 76e8015976..4c2f6b6e73 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -23,8 +23,7 @@ if(light_range > 0 && light_intensity > 0) var/list/turf/line = getline(starting.return_turf(), ending.return_turf()) tracing_line: - for(var/i in line) - var/turf/T = i + for(var/turf/T as anything in line) for(var/obj/effect/projectile_lighting/PL in T) if(PL.owner == instance_key) continue tracing_line diff --git a/code/game/objects/items/devices/communicator/UI_tgui.dm b/code/game/objects/items/devices/communicator/UI_tgui.dm index 989d68078e..3759d23d4e 100644 --- a/code/game/objects/items/devices/communicator/UI_tgui.dm +++ b/code/game/objects/items/devices/communicator/UI_tgui.dm @@ -24,8 +24,7 @@ cam_plane_masters = get_tgui_plane_masters() - for(var/plane in cam_plane_masters) - var/obj/screen/instance = plane + for(var/obj/screen/instance as anything in cam_plane_masters) instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/game/objects/items/devices/hacktool.dm b/code/game/objects/items/devices/hacktool.dm index b221ff875c..e92c45e151 100644 --- a/code/game/objects/items/devices/hacktool.dm +++ b/code/game/objects/items/devices/hacktool.dm @@ -15,8 +15,7 @@ hack_state = new(src) /obj/item/device/multitool/hacktool/Destroy() - for(var/T in known_targets) - var/atom/target = T + for(var/atom/target as anything in known_targets) target.unregister(OBSERVER_EVENT_DESTROY, src) known_targets.Cut() qdel(hack_state) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index ed52707904..ace17fa07d 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -4,8 +4,7 @@ var/global/list/active_radio_jammers = list() var/turf/Tr = get_turf(radio) if(!Tr) return 0 //Nullspace radios don't get jammed. - for(var/jammer in active_radio_jammers) - var/obj/item/device/radio_jammer/J = jammer + for(var/obj/item/device/radio_jammer/J as anything in active_radio_jammers) var/turf/Tj = get_turf(J) if(J.on && Tj.z == Tr.z) //If we're on the same Z, it's worth checking. diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 79f38554b8..1fac4f3226 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -133,8 +133,7 @@ HALOGEN COUNTER - Radcount on mobs var/unknown = 0 var/reagentdata[0] var/unknownreagents[0] - for(var/A in C.reagents.reagent_list) - var/datum/reagent/R = A + for(var/datum/reagent/R as anything in C.reagents.reagent_list) if(R.scannable) reagentdata["[R.id]"] = "\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - Overdose" : ""]
    " else @@ -155,8 +154,7 @@ HALOGEN COUNTER - Radcount on mobs var/unknown = 0 var/stomachreagentdata[0] var/stomachunknownreagents[0] - for(var/B in C.ingested.reagent_list) - var/datum/reagent/R = B + for(var/datum/reagent/R as anything in C.ingested.reagent_list) if(R.scannable) stomachreagentdata["[R.id]"] = "\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - Overdose" : ""]
    " if (advscan == 0 || showadvscan == 0) @@ -179,8 +177,7 @@ HALOGEN COUNTER - Radcount on mobs var/unknown = 0 var/touchreagentdata[0] var/touchunknownreagents[0] - for(var/B in C.touching.reagent_list) - var/datum/reagent/R = B + for(var/datum/reagent/R as anything in C.touching.reagent_list) if(R.scannable) touchreagentdata["[R.id]"] = "\t[round(C.touching.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.can_overdose_touch && R.volume > R.overdose) ? " - Overdose" : ""]
    " if (advscan == 0 || showadvscan == 0) diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm index b0c928e5a2..1722617106 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -54,8 +54,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob // Gather potential subtargets var/list/choices = list(M) if(istype(M)) - for(var/belly in M.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in M.vore_organs) for(var/mob/living/carbon/human/H in B) // I do want an istype choices += H // Subtargets diff --git a/code/game/objects/items/stacks/medical_vr.dm b/code/game/objects/items/stacks/medical_vr.dm index 4599bb43f9..9ba54cea33 100644 --- a/code/game/objects/items/stacks/medical_vr.dm +++ b/code/game/objects/items/stacks/medical_vr.dm @@ -43,16 +43,14 @@ var/clotted = 0 var/too_far_gone = 0 - for(var/org in H.organs) //'organs' is just external organs, as opposed to 'internal_organs' - var/obj/item/organ/external/affecting = org + for(var/obj/item/organ/external/affecting as anything in H.organs) //'organs' is just external organs, as opposed to 'internal_organs' // No amount of clotting is going to help you here. if(affecting.open) too_far_gone++ continue - for(var/wnd in affecting.wounds) - var/datum/wound/W = wnd + for(var/datum/wound/W as anything in affecting.wounds) // No need if(W.bandaged) continue diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 38e173e3ff..67d76a8c89 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -252,6 +252,5 @@ return TRUE /obj/structure/proc/refresh_neighbors() - for(var/thing in RANGE_TURFS(1, src)) - var/turf/T = thing + for(var/turf/T as anything in RANGE_TURFS(1, src)) T.update_icon() diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm index ca515e230f..2859d55dfb 100644 --- a/code/game/objects/structures/electricchair.dm +++ b/code/game/objects/structures/electricchair.dm @@ -65,8 +65,7 @@ s.set_up(12, 1, src) s.start() if(has_buckled_mobs()) - for(var/a in buckled_mobs) - var/mob/living/L = a + for(var/mob/living/L as anything in buckled_mobs) L.burn_skin(85) to_chat(L, "You feel a deep shock course through your body!") sleep(1) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 87f568f703..46a888e55f 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -456,8 +456,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) ..() update_layer() if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) if(L.loc != loc) L.buckled = null //Temporary, so Move() succeeds. L.buckled = src //Restoring @@ -467,8 +466,7 @@ GLOBAL_LIST_BOILERPLATE(all_janitorial_carts, /obj/structure/janitorialcart) /obj/structure/bed/chair/janicart/proc/update_mob() if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) L.set_dir(dir) switch(dir) if(SOUTH) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 164554652b..4a3c5b53ff 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -63,8 +63,7 @@ ..() update_layer() if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) L.set_dir(dir) /obj/structure/bed/chair/verb/rotate_clockwise() @@ -151,8 +150,7 @@ playsound(src, 'sound/effects/roll.ogg', 100, 1) /obj/structure/bed/chair/office/handle_buckled_mob_movement(atom/new_loc, direction, movetime) - for(var/A in buckled_mobs) - var/mob/living/occupant = A + for(var/mob/living/occupant as anything in buckled_mobs) occupant.buckled = null occupant.Move(loc, direction, movetime) occupant.buckled = src diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 461cc122bf..2521055dad 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -51,8 +51,7 @@ . = ..() if(.) if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) L.set_dir(dir) /obj/structure/bed/chair/wheelchair/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -95,8 +94,7 @@ var/turf/T = null //--1---Move occupant---1--// if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) L.buckled = null step(L, direction) L.buckled = src @@ -128,8 +126,7 @@ . = ..() playsound(src, 'sound/effects/roll.ogg', 75, 1) if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/occupant = A + for(var/mob/living/occupant as anything in buckled_mobs) if(!driving) occupant.buckled = null occupant.Move(src.loc) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 72474fea33..a8eb677840 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -265,12 +265,11 @@ /obj/machinery/shower/process() if(!on) return - for(var/thing in loc) - var/atom/movable/AM = thing - var/mob/living/L = thing - if(istype(AM) && AM.simulated) + for(var/atom/movable/AM in loc) + if(AM.simulated) wash(AM) - if(istype(L)) + if(isliving(AM)) + var/mob/living/L = AM process_heat(L) wash_floor() reagents.add_reagent("water", reagents.get_free_space()) diff --git a/code/game/periodic_news.dm b/code/game/periodic_news.dm index a3d89313c5..a5eb2042be 100644 --- a/code/game/periodic_news.dm +++ b/code/game/periodic_news.dm @@ -109,7 +109,7 @@ var/global/list/newscaster_standard_feeds = list(/datum/news_announcement/bluesp var/global/tmp/announced_news_types = list() /proc/check_for_newscaster_updates(type) - for(var/subtype in typesof(type)-type) + for(var/subtype in subtypesof(type)) var/datum/news_announcement/news = new subtype() if(news.round_time * 10 <= world.time && !(subtype in announced_news_types)) announced_news_types += subtype diff --git a/code/game/sound.dm b/code/game/sound.dm index 4635415058..0b2cf4b80e 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -17,8 +17,7 @@ var/list/listeners = player_list if(!ignore_walls) //these sounds don't carry through walls listeners = listeners & hearers(maxdistance,turf_source) - for(var/P in listeners) - var/mob/M = P + for(var/mob/M as anything in listeners) if(!M || !M.client) continue var/turf/T = get_turf(M) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 10e78e83ee..5a6495d638 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -239,19 +239,17 @@ /turf/proc/AdjacentTurfs(var/check_blockage = TRUE) . = list() - for(var/t in (trange(1,src) - src)) - var/turf/T = t + for(var/turf/T as anything in (trange(1,src) - src)) if(check_blockage) if(!T.density) if(!LinkBlocked(src, T) && !TurfBlockedNonWindow(T)) - . += t + . += T else - . += t + . += T /turf/proc/CardinalTurfs(var/check_blockage = TRUE) . = list() - for(var/ad in AdjacentTurfs(check_blockage)) - var/turf/T = ad + for(var/turf/T as anything in AdjacentTurfs(check_blockage)) if(T.x == src.x || T.y == src.y) . += T diff --git a/code/modules/admin/admin_secrets.dm b/code/modules/admin/admin_secrets.dm index 89f032071c..e8ab89101c 100644 --- a/code/modules/admin/admin_secrets.dm +++ b/code/modules/admin/admin_secrets.dm @@ -12,7 +12,7 @@ var/datum/admin_secrets/admin_secrets = new() for(var/datum/admin_secret_category/category in categories) category_assoc[category.type] = category - for(var/item_type in (typesof(/datum/admin_secret_item) - /datum/admin_secret_item)) + for(var/item_type in subtypesof(/datum/admin_secret_item)) var/datum/admin_secret_item/secret_item = item_type if(!initial(secret_item.name)) continue diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index fd11766653..e9d63621b0 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -302,7 +302,7 @@ to_chat(usr, "Looks like you didn't select a mob.") return - var/list/possible_modifiers = typesof(/datum/modifier) - /datum/modifier + var/list/possible_modifiers = subtypesof(/datum/modifier) var/new_modifier_type = tgui_input_list(usr, "What modifier should we add to [L]?", "Modifier Type", possible_modifiers) if(!new_modifier_type) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 0d9bceb996..60542d5a05 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -238,8 +238,7 @@ Example: USING PROCCALL = BLOCKING, SELECT = FORCE_NULLS, PRIORITY = HIGH SELECT do CHECK_TICK finished = TRUE - for(var/i in running) - var/datum/SDQL2_query/query = i + for(var/datum/SDQL2_query/query as anything in running) if(QDELETED(query)) running -= query continue @@ -562,8 +561,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null location = list(location) if(type == "*") - for(var/i in location) - var/datum/d = i + for(var/datum/d as anything in location) if(d.can_vv_get() || superuser) out += d SDQL2_TICK_CHECK diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 20d3bad3c7..1943147aee 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -82,8 +82,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) return var/list/dat = list("[title]") dat += "Refresh

    " - for(var/I in l2b) - var/datum/admin_help/AH = I + for(var/datum/admin_help/AH as anything in l2b) dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
    " usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") @@ -92,8 +91,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help_tickets/proc/stat_entry() var/num_disconnected = 0 stat("Active Tickets:", astatclick.update("[active_tickets.len]")) - for(var/I in active_tickets) - var/datum/admin_help/AH = I + for(var/datum/admin_help/AH as anything in active_tickets) if(AH.initiator) stat("#[AH.id]. [AH.initiator_key_name]:", AH.statclick.update()) else @@ -119,8 +117,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //Get a ticket given a ckey /datum/admin_help_tickets/proc/CKey2ActiveTicket(ckey) - for(var/I in active_tickets) - var/datum/admin_help/AH = I + for(var/datum/admin_help/AH as anything in active_tickets) if(AH.initiator_ckey == ckey) return AH @@ -669,8 +666,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /proc/ircadminwho() var/list/message = list("Admins: ") var/list/admin_keys = list() - for(var/adm in GLOB.admins) - var/client/C = adm + for(var/client/C as anything in GLOB.admins) admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]" for(var/admin in admin_keys) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e903df406a..645c2eef1c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -282,8 +282,7 @@ Ccomp's first proc. GLOB.respawn_timers -= target var/found_client = FALSE - for(var/c in GLOB.clients) - var/client/C = c + for(var/client/C as anything in GLOB.clients) if(C.ckey == target) found_client = C to_chat(C, "You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead.") diff --git a/code/modules/admin/view_variables/modify_variables.dm b/code/modules/admin/view_variables/modify_variables.dm index 6f354e9b63..8863e76533 100644 --- a/code/modules/admin/view_variables/modify_variables.dm +++ b/code/modules/admin/view_variables/modify_variables.dm @@ -46,8 +46,7 @@ GLOBAL_PROTECT(VVpixelmovement) var/things = get_all_of_type(type, subtypes) var/i = 0 - for(var/thing in things) - var/datum/D = thing + for(var/datum/D as anything in things) i++ //try one of 3 methods to shorten the type text: // fancy type, diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm index edd55a4c04..78f16a96a0 100644 --- a/code/modules/ai/ai_holder.dm +++ b/code/modules/ai/ai_holder.dm @@ -175,11 +175,10 @@ var/list/choices = list() for(var/typechoice in types) var/list/found = list() - for(var/mob in searching) // Isnt't there a helper for this, maybe? I forget. - var/atom/M = mob + for(var/atom/M as anything in searching) // Isnt't there a helper for this, maybe? I forget. if(!(M.z in levels_working)) continue - if(!istype(mob,typechoice)) + if(!istype(M,typechoice)) continue found += M choices["[typechoice] ([found.len])"] = found // Prettified name for the user input below) @@ -190,8 +189,7 @@ href_list["datumrefresh"] = "\ref[src]" return var/list/selected = choices[choice] - for(var/mob in selected) - var/mob/living/L = mob + for(var/mob/living/L as anything in selected) if(!istype(L)) to_chat(usr,"Skipping incompatible mob: [L] [ADMIN_COORDJMP(L)]") continue diff --git a/code/modules/ai/ai_holder_combat.dm b/code/modules/ai/ai_holder_combat.dm index e2e1ecbdea..760031985e 100644 --- a/code/modules/ai/ai_holder_combat.dm +++ b/code/modules/ai/ai_holder_combat.dm @@ -132,8 +132,7 @@ ai_log("test_projectile_safety() : Test projectile did[!would_hit_primary_target ? " NOT " : " "]hit \the [AM]", AI_LOG_DEBUG) // Make sure we don't have a chance to shoot our friends. - for(var/a in hit_things) - var/atom/A = a + for(var/atom/A as anything in hit_things) ai_log("test_projectile_safety() : Evaluating \the [A] ([A.type]).", AI_LOG_TRACE) if(isliving(A)) // Don't shoot at our friends, even if they're behind the target, as RNG can make them get hit. var/mob/living/L = A diff --git a/code/modules/ai/ai_holder_communication.dm b/code/modules/ai/ai_holder_communication.dm index beddb68924..caafe5c8b8 100644 --- a/code/modules/ai/ai_holder_communication.dm +++ b/code/modules/ai/ai_holder_communication.dm @@ -84,8 +84,7 @@ if(rand(0,200) < speak_chance) // Check if anyone is around to 'appreciate' what we say. var/alone = TRUE - for(var/m in viewers(holder)) - var/mob/M = m + for(var/mob/M as anything in viewers(holder)) if(M.client) alone = FALSE break diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index af697777f9..66ed0c186a 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -127,8 +127,7 @@ return TRUE if("visible") visible = !visible - for(var/ibeam in i_beams) - var/obj/effect/beam/i_beam/I = ibeam + for(var/obj/effect/beam/i_beam/I as anything in i_beams) I.visible = visible CHECK_TICK return TRUE diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index e92d5b1719..88cbfa16f7 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -375,8 +375,7 @@ /datum/asset/spritesheet/vending/register() populate_vending_products() - for(var/k in GLOB.vending_products) - var/atom/item = k + for(var/atom/item as anything in GLOB.vending_products) if(!ispath(item, /atom)) continue diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm index 17509ce12e..d602eb9da2 100644 --- a/code/modules/awaymissions/loot_vr.dm +++ b/code/modules/awaymissions/loot_vr.dm @@ -63,7 +63,7 @@ //credits var/amount = rand(2,6) var/list/possible_spawns = list() - for(var/cash_type in typesof(/obj/item/weapon/spacecash) - /obj/item/weapon/spacecash) + for(var/cash_type in subtypesof(/obj/item/weapon/spacecash)) possible_spawns += cash_type var/cash_type = pick(possible_spawns) diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index f9c9eb588d..14f7eb54c0 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -111,8 +111,7 @@ GLOBAL_LIST_EMPTY(all_blobs) shuffle_inplace(blobs_to_affect) - for(var/L in blobs_to_affect) - var/obj/structure/blob/B = L + for(var/obj/structure/blob/B as anything in blobs_to_affect) if(B.faction != faction) continue diff --git a/code/modules/blob2/blobs/core.dm b/code/modules/blob2/blobs/core.dm index cd4a68a308..2b5cefa89d 100644 --- a/code/modules/blob2/blobs/core.dm +++ b/code/modules/blob2/blobs/core.dm @@ -197,8 +197,7 @@ var/list/blob_cores = list() if(!difficulty_threshold) return var/list/valid_types = list() - for(var/thing in subtypesof(/datum/blob_type)) - var/datum/blob_type/BT = thing + for(var/datum/blob_type/BT as anything in subtypesof(/datum/blob_type)) if(initial(BT.difficulty) > difficulty_threshold) // Too hard. continue if(initial(BT.difficulty) < difficulty_floor) // Too easy. diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm index 6df0cba629..cdfe6d766a 100644 --- a/code/modules/blob2/overmind/overmind.dm +++ b/code/modules/blob2/overmind/overmind.dm @@ -57,14 +57,12 @@ var/list/overminds = list() return ..(newloc) /mob/observer/blob/Destroy() - for(var/BL in GLOB.all_blobs) - var/obj/structure/blob/B = BL + for(var/obj/structure/blob/B as anything in GLOB.all_blobs) if(B && B.overmind == src) B.overmind = null B.update_icon() //reset anything that was ours - for(var/BLO in blob_mobs) - var/mob/living/simple_mob/blob/spore/BM = BLO + for(var/mob/living/simple_mob/blob/spore/BM as anything in blob_mobs) if(BM) BM.overmind = null BM.update_icons() diff --git a/code/modules/blob2/overmind/types/synchronous_mesh.dm b/code/modules/blob2/overmind/types/synchronous_mesh.dm index e234756b2d..acf9441b71 100644 --- a/code/modules/blob2/overmind/types/synchronous_mesh.dm +++ b/code/modules/blob2/overmind/types/synchronous_mesh.dm @@ -34,8 +34,7 @@ if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && (C.overmind == B.overmind) ) //if it doesn't have the same 'ownership' or is a core or node, don't split damage to it blobs_to_hurt += C - for(var/thing in blobs_to_hurt) - var/obj/structure/blob/C = thing + for(var/obj/structure/blob/C as anything in blobs_to_hurt) if(C == B) continue // We'll damage this later. diff --git a/code/modules/busy_space/loremaster.dm b/code/modules/busy_space/loremaster.dm index 28dca0055b..9c2f0f55b4 100644 --- a/code/modules/busy_space/loremaster.dm +++ b/code/modules/busy_space/loremaster.dm @@ -7,7 +7,7 @@ var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster /datum/lore/loremaster/New() - var/list/paths = typesof(/datum/lore/organization) - /datum/lore/organization + var/list/paths = subtypesof(/datum/lore/organization) for(var/path in paths) // Some intermediate paths are not real organizations (ex. /datum/lore/organization/mil). Only do ones with names var/datum/lore/organization/instance = path diff --git a/code/modules/busy_space_vr/loremaster.dm b/code/modules/busy_space_vr/loremaster.dm index 28dca0055b..9c2f0f55b4 100644 --- a/code/modules/busy_space_vr/loremaster.dm +++ b/code/modules/busy_space_vr/loremaster.dm @@ -7,7 +7,7 @@ var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster /datum/lore/loremaster/New() - var/list/paths = typesof(/datum/lore/organization) - /datum/lore/organization + var/list/paths = subtypesof(/datum/lore/organization) for(var/path in paths) // Some intermediate paths are not real organizations (ex. /datum/lore/organization/mil). Only do ones with names var/datum/lore/organization/instance = path diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 8f7f3152f3..92ed97f347 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -78,8 +78,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) if(isturf(target) && (!target.can_catalogue())) var/turf/T = target - for(var/a in T) // If we can't scan the turf, see if we can scan anything on it, to help with aiming. - var/atom/A = a + for(var/atom/A as anything in T) // If we can't scan the turf, see if we can scan anything on it, to help with aiming. if(A.can_catalogue()) target = A break @@ -149,8 +148,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) // Figure out who may have helped out. var/list/contributers = list() var/list/contributer_names = list() - for(var/thing in player_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in player_list) if(L == user) continue if(!istype(L)) @@ -169,8 +167,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) if(istype(I)) var/list/discoveries = I.discover(user, list(user.name) + contributer_names) // If one discovery leads to another, the list returned will have all of them. if(LAZYLEN(discoveries)) - for(var/D in discoveries) - var/datum/category_item/catalogue/data = D + for(var/datum/category_item/catalogue/data as anything in discoveries) points_gained += data.value // Give out points. @@ -208,23 +205,20 @@ GLOBAL_LIST_EMPTY(all_cataloguers) // First, get everything able to be scanned. var/list/scannable_atoms = list() - for(var/a in view(world.view, user)) - var/atom/A = a + for(var/atom/A as anything in view(world.view, user)) if(A.can_catalogue()) // Not passing the user is intentional, so they don't get spammed. scannable_atoms += A // Highlight things able to be scanned. var/filter = filter(type = "outline", size = 1, color = "#00FF00") - for(var/a in scannable_atoms) - var/atom/A = a + for(var/atom/A as anything in scannable_atoms) A.filters += filter to_chat(user, span("notice", "\The [src] is highlighting scannable objects in green, if any exist.")) sleep(2 SECONDS) // Remove the highlights. - for(var/a in scannable_atoms) - var/atom/A = a + for(var/atom/A as anything in scannable_atoms) if(QDELETED(A)) continue A.filters -= filter @@ -271,14 +265,12 @@ GLOBAL_LIST_EMPTY(all_cataloguers) else dat += "
    " - for(var/G in GLOB.catalogue_data.categories) - var/datum/category_group/group = G + for(var/datum/category_group/group as anything in GLOB.catalogue_data.categories) var/list/group_dat = list() var/show_group = FALSE group_dat += "[group.name]" - for(var/I in group.items) - var/datum/category_item/catalogue/item = I + for(var/datum/category_item/catalogue/item as anything in group.items) if(item.visible || debug) group_dat += "[item.name]" show_group = TRUE diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index bd905205f4..f68ddc011d 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -74,13 +74,12 @@ if(href_list["discord_reg"]) var/their_id = html_decode(href_list["discord_reg"]) var/sane = FALSE - for(var/item in GLOB.pending_discord_registrations) - var/list/L = item + for(var/list/L as anything in GLOB.pending_discord_registrations) if(!islist(L)) - GLOB.pending_discord_registrations -= item + GLOB.pending_discord_registrations -= L continue if(L["ckey"] == ckey && L["id"] == their_id) - GLOB.pending_discord_registrations -= list(item) + GLOB.pending_discord_registrations -= list(L) var/time = L["time"] if((world.realtime - time) > 10 MINUTES) to_chat(src, "Sorry, that link has expired. Please request another on Discord.") diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index f213c15a8a..8f047985c7 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -29,8 +29,7 @@ // Arrange preferences that have never been enabled/disabled. var/list/client_preference_keys = list() - for(var/cp in get_client_preferences()) - var/datum/client_preference/client_pref = cp + for(var/datum/client_preference/client_pref as anything in get_client_preferences()) client_preference_keys += client_pref.key if((client_pref.key in pref.preferences_enabled) || (client_pref.key in pref.preferences_disabled)) continue @@ -57,8 +56,7 @@ . += "Preferences
    " . += "" var/mob/pref_mob = preference_mob() - for(var/cp in get_client_preferences()) - var/datum/client_preference/client_pref = cp + for(var/datum/client_preference/client_pref as anything in get_client_preferences()) if(!client_pref.may_toggle(pref_mob)) continue diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index 24ce8f1d33..7138d28626 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -5,8 +5,7 @@ var/list/_client_preferences_by_type /proc/get_client_preferences() if(!_client_preferences) _client_preferences = list() - for(var/ct in subtypesof(/datum/client_preference)) - var/datum/client_preference/client_type = ct + for(var/datum/client_preference/client_type as anything in subtypesof(/datum/client_preference)) if(initial(client_type.description)) _client_preferences += new client_type() return _client_preferences @@ -21,16 +20,14 @@ var/list/_client_preferences_by_type /proc/get_client_preference_by_key(var/preference) if(!_client_preferences_by_key) _client_preferences_by_key = list() - for(var/ct in get_client_preferences()) - var/datum/client_preference/client_pref = ct + for(var/datum/client_preference/client_pref as anything in get_client_preferences()) _client_preferences_by_key[client_pref.key] = client_pref return _client_preferences_by_key[preference] /proc/get_client_preference_by_type(var/preference) if(!_client_preferences_by_type) _client_preferences_by_type = list() - for(var/ct in get_client_preferences()) - var/datum/client_preference/client_pref = ct + for(var/datum/client_preference/client_pref as anything in get_client_preferences()) _client_preferences_by_type[client_pref.type] = client_pref return _client_preferences_by_type[preference] diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index e01d5f0b24..f16815d356 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -12,9 +12,8 @@ var/list/gear_datums = list() /hook/startup/proc/populate_gear_list() //create a list of gear datums to sort - for(var/geartype in typesof(/datum/gear)-/datum/gear) - var/datum/gear/G = geartype - if(initial(G.type_category) == geartype) + for(var/datum/gear/G as anything in subtypesof(/datum/gear)) + if(initial(G.type_category) == G) continue var/use_name = initial(G.display_name) var/use_category = initial(G.sort_category) @@ -32,7 +31,7 @@ var/list/gear_datums = list() if(!loadout_categories[use_category]) loadout_categories[use_category] = new /datum/loadout_category(use_category) var/datum/loadout_category/LC = loadout_categories[use_category] - gear_datums[use_name] = new geartype + gear_datums[use_name] = new G LC.gear[use_name] = gear_datums[use_name] loadout_categories = sortAssoc(loadout_categories) diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index b9c446fb87..07c1b7f1be 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -13,8 +13,7 @@ /datum/gear/accessory/armband/New() ..() var/list/armbands = list() - for(var/armband in (typesof(/obj/item/clothing/accessory/armband) - typesof(/obj/item/clothing/accessory/armband/med/color))) - var/obj/item/clothing/accessory/armband_type = armband + for(var/obj/item/clothing/accessory/armband_type as anything in (typesof(/obj/item/clothing/accessory/armband) - typesof(/obj/item/clothing/accessory/armband/med/color))) armbands[initial(armband_type.name)] = armband_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(armbands)) @@ -71,8 +70,7 @@ /datum/gear/accessory/wcoat/New() ..() var/list/wcoats = list() - for(var/wcoat in typesof(/obj/item/clothing/accessory/wcoat)) - var/obj/item/clothing/accessory/wcoat_type = wcoat + for(var/obj/item/clothing/accessory/wcoat_type as anything in typesof(/obj/item/clothing/accessory/wcoat)) wcoats[initial(wcoat_type.name)] = wcoat_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(wcoats)) @@ -84,8 +82,7 @@ /datum/gear/accessory/holster/New() ..() var/list/holsters = list() - for(var/holster in typesof(/obj/item/clothing/accessory/holster)) - var/obj/item/clothing/accessory/holster_type = holster + for(var/obj/item/clothing/accessory/holster_type as anything in typesof(/obj/item/clothing/accessory/holster)) holsters[initial(holster_type.name)] = holster_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(holsters)) @@ -97,8 +94,7 @@ /datum/gear/accessory/tie/New() ..() var/list/ties = list() - for(var/tie in typesof(/obj/item/clothing/accessory/tie)) - var/obj/item/clothing/accessory/tie_type = tie + for(var/obj/item/clothing/accessory/tie_type as anything in typesof(/obj/item/clothing/accessory/tie)) ties[initial(tie_type.name)] = tie_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ties)) @@ -110,8 +106,7 @@ /datum/gear/accessory/scarf/New() ..() var/list/scarfs = list() - for(var/scarf in typesof(/obj/item/clothing/accessory/scarf)) - var/obj/item/clothing/accessory/scarf_type = scarf + for(var/obj/item/clothing/accessory/scarf_type as anything in typesof(/obj/item/clothing/accessory/scarf)) scarfs[initial(scarf_type.name)] = scarf_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(scarfs)) @@ -132,8 +127,7 @@ /datum/gear/accessory/jacket/New() ..() var/list/jackets = list() - for(var/jacket in typesof(/obj/item/clothing/accessory/jacket)) - var/obj/item/clothing/accessory/jacket_type = jacket + for(var/obj/item/clothing/accessory/jacket_type as anything in typesof(/obj/item/clothing/accessory/jacket)) jackets[initial(jacket_type.name)] = jacket_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jackets)) @@ -179,8 +173,7 @@ /datum/gear/accessory/fannypack/New() ..() var/list/fannys = list() - for(var/fanny in typesof(/obj/item/weapon/storage/belt/fannypack)) - var/obj/item/weapon/storage/belt/fannypack/fanny_type = fanny + for(var/obj/item/weapon/storage/belt/fannypack/fanny_type as anything in typesof(/obj/item/weapon/storage/belt/fannypack)) fannys[initial(fanny_type.name)] = fanny_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(fannys)) @@ -280,8 +273,7 @@ /datum/gear/accessory/asym/New() ..() var/list/asyms = list() - for(var/asym in typesof(/obj/item/clothing/accessory/asymmetric)) - var/obj/item/clothing/accessory/asymmetric_type = asym + for(var/obj/item/clothing/accessory/asymmetric_type as anything in typesof(/obj/item/clothing/accessory/asymmetric)) asyms[initial(asymmetric_type.name)] = asymmetric_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(asyms)) diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index 719eb6fcfc..8b566fe3c9 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -53,8 +53,7 @@ /datum/gear/plushie/New() ..() var/list/plushies = list() - for(var/plushie in subtypesof(/obj/item/toy/plushie/) - /obj/item/toy/plushie/therapy) - var/obj/item/toy/plushie/plushie_type = plushie + for(var/obj/item/toy/plushie/plushie_type as anything in subtypesof(/obj/item/toy/plushie) - /obj/item/toy/plushie/therapy) plushies[initial(plushie_type.name)] = plushie_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(plushies)) @@ -66,8 +65,7 @@ /datum/gear/figure/New() ..() var/list/figures = list() - for(var/figure in typesof(/obj/item/toy/figure/) - /obj/item/toy/figure) - var/obj/item/toy/figure/figure_type = figure + for(var/obj/item/toy/figure/figure_type as anything in subtypesof(/obj/item/toy/figure)) figures[initial(figure_type.name)] = figure_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(figures)) diff --git a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm index 94739c56bb..9b72d27aba 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general_vr.dm @@ -6,8 +6,7 @@ /datum/gear/ball/New() ..() var/list/balls = list() - for(var/ball in typesof(/obj/item/toy/tennis/)) - var/obj/item/toy/tennis/ball_type = ball + for(var/obj/item/toy/tennis/ball_type as anything in typesof(/obj/item/toy/tennis/)) balls[initial(ball_type.name)] = ball_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(balls)) @@ -19,8 +18,7 @@ /datum/gear/character/New() ..() var/list/characters = list() - for(var/character in typesof(/obj/item/toy/character/) - /obj/item/toy/character) - var/obj/item/toy/character/character_type = character + for(var/obj/item/toy/character/character_type as anything in subtypesof(/obj/item/toy/character)) characters[initial(character_type.name)] = character_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(characters)) @@ -32,8 +30,7 @@ /datum/gear/mechtoy/New() ..() var/list/mechs = list() - for(var/mech in typesof(/obj/item/toy/mecha/) - /obj/item/toy/mecha/) - var/obj/item/toy/mecha/mech_type = mech + for(var/obj/item/toy/mecha/mech_type as anything in subtypesof(/obj/item/toy/mecha)) mechs[initial(mech_type.name)] = mech_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(mechs)) diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index ee161f598d..ba7d818dbd 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -169,8 +169,7 @@ /datum/gear/head/pin/New() ..() var/list/pins = list() - for(var/pin in typesof(/obj/item/clothing/head/pin)) - var/obj/item/clothing/head/pin/pin_type = pin + for(var/obj/item/clothing/head/pin/pin_type as anything in typesof(/obj/item/clothing/head/pin)) pins[initial(pin_type.name)] = pin_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pins)) @@ -182,8 +181,7 @@ /datum/gear/head/hardhat/New() ..() var/list/hardhats = list() - for(var/hardhat in typesof(/obj/item/clothing/head/hardhat)) - var/obj/item/clothing/head/hardhat/hardhat_type = hardhat + for(var/obj/item/clothing/head/hardhat/hardhat_type as anything in typesof(/obj/item/clothing/head/hardhat)) hardhats[initial(hardhat_type.name)] = hardhat_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(hardhats)) @@ -223,8 +221,7 @@ /datum/gear/head/santahat/New() ..() var/list/santahats = list() - for(var/santahat in typesof(/obj/item/clothing/head/santa)) - var/obj/item/clothing/head/santa/santahat_type = santahat + for(var/obj/item/clothing/head/santa/santahat_type as anything in typesof(/obj/item/clothing/head/santa)) santahats[initial(santahat_type.name)] = santahat_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(santahats)) diff --git a/code/modules/client/preference_setup/loadout/loadout_smoking.dm b/code/modules/client/preference_setup/loadout/loadout_smoking.dm index 96db8bf2fe..f9442518b2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_smoking.dm +++ b/code/modules/client/preference_setup/loadout/loadout_smoking.dm @@ -48,7 +48,6 @@ /datum/gear/cigarettes/New() ..() var/list/cigarettes = list() - for(var/cigarette in (typesof(/obj/item/weapon/storage/fancy/cigarettes) - typesof(/obj/item/weapon/storage/fancy/cigarettes/killthroat))) - var/obj/item/weapon/storage/fancy/cigarettes/cigarette_brand = cigarette + for(var/obj/item/weapon/storage/fancy/cigarettes/cigarette_brand as anything in (typesof(/obj/item/weapon/storage/fancy/cigarettes) - typesof(/obj/item/weapon/storage/fancy/cigarettes/killthroat))) cigarettes[initial(cigarette_brand.name)] = cigarette_brand gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cigarettes)) diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 4d9e530992..5b7bc83757 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -16,8 +16,7 @@ /datum/gear/uniform/cheongsam/New() ..() var/list/cheongasms = list() - for(var/cheongasm in typesof(/obj/item/clothing/under/cheongsam)) - var/obj/item/clothing/under/cheongsam/cheongasm_type = cheongasm + for(var/obj/item/clothing/under/cheongsam/cheongasm_type as anything in typesof(/obj/item/clothing/under/cheongsam)) cheongasms[initial(cheongasm_type.name)] = cheongasm_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cheongasms)) @@ -28,8 +27,7 @@ /datum/gear/uniform/croptop/New() ..() var/list/croptops = list() - for(var/croptop in typesof(/obj/item/clothing/under/croptop)) - var/obj/item/clothing/under/croptop/croptop_type = croptop + for(var/obj/item/clothing/under/croptop/croptop_type as anything in typesof(/obj/item/clothing/under/croptop)) croptops[initial(croptop_type.name)] = croptop_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(croptops)) @@ -52,8 +50,7 @@ /datum/gear/uniform/jumpsuit/New() ..() var/list/jumpclothes = list() - for(var/jump in typesof(/obj/item/clothing/under/color)) - var/obj/item/clothing/under/color/jumps = jump + for(var/obj/item/clothing/under/color/jumps as anything in typesof(/obj/item/clothing/under/color)) jumpclothes[initial(jumps.name)] = jumps gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jumpclothes)) @@ -78,8 +75,7 @@ /datum/gear/uniform/pants/New() ..() var/list/pants = list() - for(var/pant in typesof(/obj/item/clothing/under/pants)) - var/obj/item/clothing/under/pants/pant_type = pant + for(var/obj/item/clothing/under/pants/pant_type as anything in typesof(/obj/item/clothing/under/pants)) pants[initial(pant_type.name)] = pant_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pants)) @@ -90,8 +86,7 @@ /datum/gear/uniform/shorts/New() ..() var/list/shorts = list() - for(var/short in typesof(/obj/item/clothing/under/shorts)) - var/obj/item/clothing/under/pants/short_type = short + for(var/obj/item/clothing/under/pants/short_type as anything in typesof(/obj/item/clothing/under/shorts)) shorts[initial(short_type.name)] = short_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(shorts)) @@ -212,8 +207,7 @@ /datum/gear/uniform/suit/lawyer/New() ..() var/list/lsuits = list() - for(var/lsuit in typesof(/obj/item/clothing/under/lawyer)) - var/obj/item/clothing/suit/lsuit_type = lsuit + for(var/obj/item/clothing/suit/lsuit_type as anything in typesof(/obj/item/clothing/under/lawyer)) lsuits[initial(lsuit_type.name)] = lsuit_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(lsuits)) @@ -273,8 +267,7 @@ /datum/gear/uniform/scrub/New() ..() var/list/scrubs = list() - for(var/scrub in typesof(/obj/item/clothing/under/rank/medical/scrubs)) - var/obj/item/clothing/under/rank/medical/scrubs/scrub_type = scrub + for(var/obj/item/clothing/under/rank/medical/scrubs/scrub_type as anything in typesof(/obj/item/clothing/under/rank/medical/scrubs)) scrubs[initial(scrub_type.name)] = scrub_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(scrubs)) @@ -396,8 +389,7 @@ /datum/gear/uniform/dresses/maid/New() ..() var/list/maids = list() - for(var/maid in typesof(/obj/item/clothing/under/dress/maid)) - var/obj/item/clothing/under/dress/maid/maid_type = maid + for(var/obj/item/clothing/under/dress/maid/maid_type as anything in typesof(/obj/item/clothing/under/dress/maid)) maids[initial(maid_type.name)] = maid_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(maids)) diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index a165232e1a..448b7747e4 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -183,8 +183,7 @@ Swimsuits /datum/gear/uniform/swimsuits/New() ..() var/list/swimsuits = list() - for(var/swimsuit in typesof(/obj/item/weapon/storage/box/fluff/swimsuit)) - var/obj/item/weapon/storage/box/fluff/swimsuit/swimsuit_type = swimsuit + for(var/obj/item/weapon/storage/box/fluff/swimsuit/swimsuit_type as anything in typesof(/obj/item/weapon/storage/box/fluff/swimsuit)) swimsuits[initial(swimsuit_type.name)] = swimsuit_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(swimsuits)) diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 4798a4b994..d185ca2608 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -21,8 +21,7 @@ /datum/gear/utility/communicator/New() ..() var/list/communicators = list() - for(var/communicator in typesof(/obj/item/device/communicator) - list(/obj/item/device/communicator/integrated,/obj/item/device/communicator/commlink)) //VOREStation Edit - Remove Commlink - var/obj/item/device/communicator_type = communicator + for(var/obj/item/device/communicator_type as anything in typesof(/obj/item/device/communicator) - list(/obj/item/device/communicator/integrated,/obj/item/device/communicator/commlink)) //VOREStation Edit - Remove Commlink communicators[initial(communicator_type.name)] = communicator_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(communicators)) diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preferences_spawnpoints.dm index 06f7aa5e06..455be8a8b8 100644 --- a/code/modules/client/preferences_spawnpoints.dm +++ b/code/modules/client/preferences_spawnpoints.dm @@ -2,7 +2,7 @@ var/list/spawntypes = list() /proc/populate_spawn_points() spawntypes = list() - for(var/type in typesof(/datum/spawnpoint)-/datum/spawnpoint) + for(var/type in subtypesof(/datum/spawnpoint)) var/datum/spawnpoint/S = new type() spawntypes[S.display_name] = S diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index c0cde563a8..a69eee2e7f 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -24,15 +24,14 @@ . = list() var/i = 1 //in case there is a collision with both name AND icon_state - for(var/typepath in typesof(basetype) - blacklist) - var/obj/O = typepath + for(var/obj/O as anything in typesof(basetype) - blacklist) if(initial(O.icon) && initial(O.icon_state)) var/name = initial(O.name) if(name in .) name += " ([initial(O.icon_state)])" if(name in .) name += " \[[i++]\]" - .[name] = typepath + .[name] = O /obj/item/clothing/under/chameleon //starts off as black diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index d7415c4a75..c67d63e6a8 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -9,8 +9,7 @@ //Find all consumed slots var/consumed_slots = 0 - for(var/thing in accessories) - var/obj/item/clothing/accessory/AC = thing + for(var/obj/item/clothing/accessory/AC as anything in accessories) consumed_slots |= AC.slot //Mask to just consumed restricted diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm index f2c3956e47..590cba4dd1 100644 --- a/code/modules/clothing/head/pilot_helmet.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -166,8 +166,7 @@ I.color = newcolor /obj/item/clothing/head/pilot/Destroy() - for(var/img in raw_images) - var/image/I = img + for(var/image/I as anything in raw_images) I.loc = null shuttle_comp = null qdel(pilot_hud) diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm index a44c7c03fd..1b029ac74a 100644 --- a/code/modules/economy/economy_misc.dm +++ b/code/modules/economy/economy_misc.dm @@ -60,7 +60,7 @@ var/global/economy_init = 0 news_network.CreateFeedChannel("The Gibson Gazette", "Editor Mike Hammers", 1, 1) news_network.CreateFeedChannel("Oculum Content Aggregator", "Oculus v6rev7", 1, 1) - for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination) + for(var/loc_type in subtypesof(/datum/trade_destination)) var/datum/trade_destination/D = new loc_type weighted_randomevent_locations[D] = D.viable_random_events.len weighted_mundaneevent_locations[D] = D.mundane_probability diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm index 2003fac6d6..7516be2eff 100644 --- a/code/modules/emotes/emote_mob.dm +++ b/code/modules/emotes/emote_mob.dm @@ -194,8 +194,7 @@ var/list/m_viewers = in_range["mobs"] var/list/o_viewers = in_range["objs"] - for(var/mob in m_viewers) - var/mob/M = mob + for(var/mob/M as anything in m_viewers) spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes. if(M) if(isobserver(M)) @@ -203,8 +202,7 @@ M.show_message(message, m_type) M.create_chat_message(src, "[runemessage]", FALSE, list("emote"), (m_type == AUDIBLE_MESSAGE)) - for(var/obj in o_viewers) - var/obj/O = obj + for(var/obj/O as anything in o_viewers) spawn(0) if(O) O.see_emote(src, message, m_type) diff --git a/code/modules/entopics_vr/alternate_appearance.dm b/code/modules/entopics_vr/alternate_appearance.dm index 4fd7d31ed0..42b6d697f9 100644 --- a/code/modules/entopics_vr/alternate_appearance.dm +++ b/code/modules/entopics_vr/alternate_appearance.dm @@ -24,8 +24,7 @@ /datum/alternate_appearance/proc/display_to(list/displayTo) if(!displayTo || !displayTo.len) return - for(var/m in displayTo) - var/mob/M = m + for(var/mob/M as anything in displayTo) if(!M.viewing_alternate_appearances) M.viewing_alternate_appearances = list() viewers |= M @@ -42,8 +41,7 @@ if(hideFrom) hiding = hideFrom - for(var/m in hiding) - var/mob/M = m + for(var/mob/M as anything in hiding) if(M.client) M.client.images -= img if(M.viewing_alternate_appearances && M.viewing_alternate_appearances.len) diff --git a/code/modules/entopics_vr/entopics.dm b/code/modules/entopics_vr/entopics.dm index 1e146e0c05..a3ea9e35ab 100644 --- a/code/modules/entopics_vr/entopics.dm +++ b/code/modules/entopics_vr/entopics.dm @@ -77,8 +77,7 @@ var/global/list/alt_farmanimals = list() registered = TRUE entopic_images += my_image - for(var/m in entopic_users) - var/mob/M = m + for(var/mob/M as anything in entopic_users) if(M.client) M.client.images += my_image @@ -88,8 +87,7 @@ var/global/list/alt_farmanimals = list() registered = FALSE entopic_images -= my_image - for(var/m in entopic_users) - var/mob/M = m + for(var/mob/M as anything in entopic_users) if(M.client) M.client.images -= my_image diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 77612bbd25..fcbd1d951b 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -79,8 +79,7 @@ // Counts living carp spawned by this event. /datum/event/carp_migration/proc/count_spawned_carps() . = 0 - for(var/I in spawned_carp) - var/mob/living/simple_mob/animal/M = I + for(var/mob/living/simple_mob/animal/M as anything in spawned_carp) if(!QDELETED(M) && M.stat != DEAD) . += 1 diff --git a/code/modules/events/grubinfestation_vr.dm b/code/modules/events/grubinfestation_vr.dm index 685d59f3f2..8dcf1a20b1 100644 --- a/code/modules/events/grubinfestation_vr.dm +++ b/code/modules/events/grubinfestation_vr.dm @@ -32,8 +32,7 @@ /datum/event/grub_infestation/end() var/list/area_names = list() - for(var/grub in existing_solargrubs) - var/mob/living/G = grub + for(var/mob/living/G as anything in existing_solargrubs) if(!G || G.stat == DEAD) continue var/area/grub_area = get_area(G) diff --git a/code/modules/events/supply_demand_vr.dm b/code/modules/events/supply_demand_vr.dm index 64d402c443..6e229e1b48 100644 --- a/code/modules/events/supply_demand_vr.dm +++ b/code/modules/events/supply_demand_vr.dm @@ -252,7 +252,7 @@ // /datum/event/supply_demand/proc/choose_food_items(var/differentTypes) - var/list/types = typesof(/datum/recipe) - /datum/recipe + var/list/types = subtypesof(/datum/recipe) for(var/i in 1 to differentTypes) var/datum/recipe/R = pick(types) types -= R // Don't pick the same thing twice @@ -262,7 +262,7 @@ return /datum/event/supply_demand/proc/choose_research_items(var/differentTypes) - var/list/types = typesof(/datum/design) - /datum/design + var/list/types = subtypesof(/datum/design) for(var/i in 1 to differentTypes) var/datum/design/D = pick(types) types -= D // Don't pick the same thing twice @@ -327,7 +327,7 @@ return /datum/event/supply_demand/proc/choose_alloy_items(var/differentTypes) - var/list/types = typesof(/datum/alloy) - /datum/alloy + var/list/types = subtypesof(/datum/alloy) for(var/i in 1 to differentTypes) var/datum/alloy/A = pick(types) types -= A // Don't pick the same thing twice diff --git a/code/modules/food/food/lunch.dm b/code/modules/food/food/lunch.dm index 6bbd434e43..81e75fa254 100644 --- a/code/modules/food/food/lunch.dm +++ b/code/modules/food/food/lunch.dm @@ -106,9 +106,8 @@ var/list/lunchables_ethanol_reagents_ = list(/datum/reagent/ethanol/acid_spit, /proc/init_lunchable_list(var/list/lunches) . = list() - for(var/lunch in lunches) - var/obj/O = lunch - .[initial(O.name)] = lunch + for(var/obj/O as anything in lunches) + .[initial(O.name)] = O return sortAssoc(.) /proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_types) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index d1ef64d081..4b78169387 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -4155,8 +4155,7 @@ //Calculate the reagents of the coating needed var/req = 0 - for (var/r in reagents.reagent_list) - var/datum/reagent/R = r + for(var/datum/reagent/R as anything in reagents.reagent_list) if (istype(R, /datum/reagent/nutriment)) req += R.volume * 0.2 else @@ -4238,8 +4237,7 @@ if (do_coating_prefix == 1) name = "[coating.coated_adj] [name]" - for (var/r in reagents.reagent_list) - var/datum/reagent/R = r + for(var/datum/reagent/R as anything in reagents.reagent_list) if (istype(R, /datum/reagent/nutriment/coating)) var/datum/reagent/nutriment/coating/C = R C.data["cooked"] = 1 diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index db3025f961..8847e99580 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -53,14 +53,12 @@ if (!available_recipes) available_recipes = new - for(var/type in subtypesof(/datum/recipe)) - var/datum/recipe/test = type + for(var/datum/recipe/test as anything in subtypesof(/datum/recipe)) if((appliancetype & initial(test.appliance))) available_recipes += new test /obj/machinery/appliance/Destroy() - for (var/a in cooking_objs) - var/datum/cooking_item/CI = a + for(var/datum/cooking_item/CI as anything in cooking_objs) qdel(CI.container)//Food is fragile, it probably doesnt survive the destruction of the machine cooking_objs -= CI qdel(CI) @@ -74,8 +72,7 @@ /obj/machinery/appliance/proc/list_contents(var/mob/user) if (cooking_objs.len) var/string = "Contains..." - for (var/a in cooking_objs) - var/datum/cooking_item/CI = a + for(var/datum/cooking_item/CI as anything in cooking_objs) string += "-\a [CI.container.label(null, CI.combine_target)], [report_progress(CI)]
    " return string else @@ -343,8 +340,7 @@ for (var/obj/item/J in CI.container) cookwork_by_item(J, CI) - for (var/r in CI.container.reagents.reagent_list) - var/datum/reagent/R = r + for(var/datum/reagent/R as anything in CI.container.reagents.reagent_list) if (istype(R, /datum/reagent/nutriment)) CI.max_cookwork += R.volume *2//Added reagents contribute less than those in food items due to granular form @@ -373,8 +369,7 @@ var/work = 0 if (istype(S)) if (S.reagents) - for (var/r in S.reagents.reagent_list) - var/datum/reagent/R = r + for(var/datum/reagent/R as anything in S.reagents.reagent_list) if (istype(R, /datum/reagent/nutriment)) work += R.volume *3//Core nutrients contribute much more than peripheral chemicals @@ -463,8 +458,7 @@ results += TR - for (var/r in results) - var/obj/item/weapon/reagent_containers/food/snacks/R = r + for(var/obj/item/weapon/reagent_containers/food/snacks/R as anything in results) R.forceMove(C) //Move everything from the buffer back to the container R.cooked |= cook_type @@ -608,8 +602,7 @@ /obj/machinery/appliance/proc/removal_menu(var/mob/user) if (can_remove_items(user)) var/list/menuoptions = list() - for (var/a in cooking_objs) - var/datum/cooking_item/CI = a + for(var/datum/cooking_item/CI as anything in cooking_objs) if (CI.container) menuoptions[CI.container.label(menuoptions.len)] = CI diff --git a/code/modules/food/kitchen/cooking_machines/_mixer.dm b/code/modules/food/kitchen/cooking_machines/_mixer.dm index 24b0371cfd..7d18865167 100644 --- a/code/modules/food/kitchen/cooking_machines/_mixer.dm +++ b/code/modules/food/kitchen/cooking_machines/_mixer.dm @@ -80,8 +80,7 @@ fundamental differences /obj/machinery/appliance/mixer/removal_menu(var/mob/user) if (can_remove_items(user)) var/list/menuoptions = list() - for (var/a in cooking_objs) - var/datum/cooking_item/CI = a + for(var/datum/cooking_item/CI as anything in cooking_objs) if (CI.container) if (!CI.container.check_contents()) to_chat(user, "There's nothing in [src] you can remove!") diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index bb9ef2a255..b781c4473b 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -43,8 +43,7 @@ if(!available_recipes) available_recipes = new - for(var/T in (typesof(/datum/recipe)-/datum/recipe)) - var/datum/recipe/type = T + for(var/datum/recipe/type as anything in subtypesof(/datum/recipe)) if((initial(type.appliance) & appliancetype)) available_recipes += new type @@ -423,8 +422,7 @@ valid = 1 sleep(2) - for(var/r in cooked_items) - var/atom/movable/R = r + for(var/atom/movable/R as anything in cooked_items) R.forceMove(src) //Move everything from the buffer back to the container QDEL_NULL(temp)//Delete buffer object diff --git a/code/modules/food/recipe_dump.dm b/code/modules/food/recipe_dump.dm index 63dc510eb9..dffce315e4 100644 --- a/code/modules/food/recipe_dump.dm +++ b/code/modules/food/recipe_dump.dm @@ -15,7 +15,7 @@ "Catalysts" = CR.catalysts) //////////////////////// FOOD - var/list/food_recipes = typesof(/datum/recipe) - /datum/recipe + var/list/food_recipes = subtypesof(/datum/recipe) //Build a useful list for(var/Rp in food_recipes) //Lists don't work with datum-stealing no-instance initial() so we have to. diff --git a/code/modules/gamemaster/event2/event.dm b/code/modules/gamemaster/event2/event.dm index 4432be40ab..b9f1d92648 100644 --- a/code/modules/gamemaster/event2/event.dm +++ b/code/modules/gamemaster/event2/event.dm @@ -88,8 +88,7 @@ This allows for events that have their announcement happen after the end itself. if(!LAZYLEN(grand_list_of_areas)) return list() - for(var/thing in grand_list_of_areas) - var/list/A = thing + for(var/list/A as anything in grand_list_of_areas) var/list/turfs = list() for(var/turf/T in A) if(!T.check_density()) @@ -107,8 +106,7 @@ This allows for events that have their announcement happen after the end itself. var/list/area/grand_list_of_areas = get_all_existing_areas_of_types(specific_areas) . = list() - for(var/thing in shuffle(grand_list_of_areas)) - var/area/A = thing + for(var/area/A as anything in shuffle(grand_list_of_areas)) if(A.forbid_events) continue if(!(A.z in get_location_z_levels())) diff --git a/code/modules/gamemaster/event2/events/engineering/blob.dm b/code/modules/gamemaster/event2/events/engineering/blob.dm index 3ace8f0894..f3b8a16f8d 100644 --- a/code/modules/gamemaster/event2/events/engineering/blob.dm +++ b/code/modules/gamemaster/event2/events/engineering/blob.dm @@ -111,16 +111,14 @@ log_debug("Spawned [new_blob.overmind.blob_type.name] blob at [get_area(new_blob)].") /datum/event2/event/blob/should_end() - for(var/WR in blobs) - var/weakref/weakref = WR + for(var/weakref/weakref as anything in blobs) if(weakref.resolve()) // If the weakref is resolvable, that means the blob hasn't been deleted yet. return FALSE return TRUE // Only end if all blobs die. // Normally this does nothing, but is useful if aborted by an admin. /datum/event2/event/blob/end() - for(var/WR in blobs) - var/weakref/weakref = WR + for(var/weakref/weakref as anything in blobs) var/obj/structure/blob/core/B = weakref.resolve() if(istype(B)) qdel(B) @@ -130,8 +128,7 @@ var/danger_level = 0 var/list/blob_type_names = list() var/multiblob = FALSE - for(var/WR in blobs) - var/weakref/weakref = WR + for(var/weakref/weakref as anything in blobs) var/obj/structure/blob/core/B = weakref.resolve() if(!istype(B)) continue diff --git a/code/modules/gamemaster/event2/events/engineering/grid_check.dm b/code/modules/gamemaster/event2/events/engineering/grid_check.dm index 8b081f29e2..b4ae7976b6 100644 --- a/code/modules/gamemaster/event2/events/engineering/grid_check.dm +++ b/code/modules/gamemaster/event2/events/engineering/grid_check.dm @@ -15,8 +15,7 @@ // Having the turbines be way over their rated limit makes grid checks more likely. /datum/event2/meta/grid_check/proc/get_overpower() var/highest_overpower = 0 - for(var/T in GLOB.all_turbines) - var/obj/machinery/power/generator/turbine = T + for(var/obj/machinery/power/generator/turbine as anything in GLOB.all_turbines) var/overpower = max((turbine.effective_gen / turbine.max_power) - 1, 0) if(overpower > highest_overpower) highest_overpower = overpower @@ -35,8 +34,7 @@ /datum/event2/event/grid_check/set_up() // Find the turbine being pushed the most. var/obj/machinery/power/generator/most_stressed_turbine = null - for(var/T in GLOB.all_turbines) - var/obj/machinery/power/generator/turbine = T + for(var/obj/machinery/power/generator/turbine as anything in GLOB.all_turbines) if(!most_stressed_turbine) most_stressed_turbine = turbine else if(turbine.effective_gen > most_stressed_turbine.effective_gen) diff --git a/code/modules/gamemaster/event2/events/mob_spawning.dm b/code/modules/gamemaster/event2/events/mob_spawning.dm index 78b1eac69c..4f3bcffa02 100644 --- a/code/modules/gamemaster/event2/events/mob_spawning.dm +++ b/code/modules/gamemaster/event2/events/mob_spawning.dm @@ -66,10 +66,9 @@ // In the future, a new AI stance that handles long distance travel using getline() could work. var/max_distance = 8 var/turf/spawn_turf = null - for(var/P in space_line) - var/turf/point = P + for(var/turf/point as anything in space_line) if(get_dist(point, edge_of_station) <= max_distance) - spawn_turf = P + spawn_turf = point break if(spawn_turf) @@ -88,8 +87,7 @@ // Counts living simple_mobs spawned by this event. /datum/event2/event/mob_spawning/proc/count_spawned_mobs() . = 0 - for(var/I in spawned_mobs) - var/mob/living/simple_mob/M = I + for(var/mob/living/simple_mob/M as anything in spawned_mobs) if(!QDELETED(M) && M.stat != DEAD) . += 1 diff --git a/code/modules/genetics/side_effects.dm b/code/modules/genetics/side_effects.dm index 498aff20d0..958f05d5ac 100644 --- a/code/modules/genetics/side_effects.dm +++ b/code/modules/genetics/side_effects.dm @@ -67,7 +67,7 @@ /proc/trigger_side_effect(mob/living/carbon/human/H) spawn if(!istype(H)) return - var/tp = pick(typesof(/datum/genetics/side_effect) - /datum/genetics/side_effect) + var/tp = pick(subtypesof(/datum/genetics/side_effect)) var/datum/genetics/side_effect/S = new tp S.start(H) diff --git a/code/modules/holomap/mapper.dm b/code/modules/holomap/mapper.dm index b99d2928c1..40a8f433bb 100644 --- a/code/modules/holomap/mapper.dm +++ b/code/modules/holomap/mapper.dm @@ -280,8 +280,7 @@ extras_holder.pixel_y = bgmap.pixel_y = -1*T_y + offset_y // Populate other mapper icons - for(var/hc in mapping_units) - var/obj/item/device/mapping_unit/HC = hc + for(var/obj/item/device/mapping_unit/HC as anything in mapping_units) if(HC.mapper_filter != mapper_filter) continue var/mob_indicator = HOLOMAP_ERROR @@ -340,8 +339,7 @@ extras += mark // Marker beacon items - for(var/hb in mapping_beacons) - var/obj/item/device/holomap_beacon/HB = hb + for(var/obj/item/device/holomap_beacon/HB as anything in mapping_beacons) if(HB.mapper_filter != mapper_filter) continue diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index 99929ea360..b8f8701205 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -74,8 +74,7 @@ plant.layer = layer + 0.1 if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) seed.do_sting(L,src) if(seed.get_trait(TRAIT_CARNIVOROUS)) seed.do_thorns(L,src) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index ab22ae15df..b9e64b8d32 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -49,8 +49,7 @@ /obj/effect/plant/proc/unbuckle() if(has_buckled_mobs()) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) if(L.buckled == src) L.buckled = null L.anchored = initial(L.anchored) @@ -64,8 +63,7 @@ if(seed) chance = round(100/(20*seed.get_trait(TRAIT_POTENCY)/100)) if(prob(chance)) - for(var/A in buckled_mobs) - var/mob/living/L = A + for(var/mob/living/L as anything in buckled_mobs) if(!(user in buckled_mobs)) L.visible_message(\ "\The [user] frees \the [L] from \the [src].",\ diff --git a/code/modules/identification/identification.dm b/code/modules/identification/identification.dm index 6ddcdbb075..99ed8bc633 100644 --- a/code/modules/identification/identification.dm +++ b/code/modules/identification/identification.dm @@ -97,8 +97,7 @@ return "unidentified object" var/list/new_name = list() - for(var/i in naming_lists) - var/list/current_list = i + for(var/list/current_list as anything in naming_lists) new_name += pick(current_list) return new_name.Join(" ") diff --git a/code/modules/instruments/instrument_data/_instrument_data.dm b/code/modules/instruments/instrument_data/_instrument_data.dm index 39d16e499f..7cede360a2 100644 --- a/code/modules/instruments/instrument_data/_instrument_data.dm +++ b/code/modules/instruments/instrument_data/_instrument_data.dm @@ -70,8 +70,7 @@ /datum/instrument/Destroy() SSinstruments.instrument_data -= id - for(var/i in songs_using) - var/datum/song/S = i + for(var/datum/song/S as anything in songs_using) S.set_instrument(null) real_samples = null samples = null diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index 455c10e5cb..31d4c396cc 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -296,8 +296,7 @@ /obj/item/instrument/harmonica, /obj/item/instrument/piano_synth/headphones ) - for(var/V in templist) - var/atom/A = V + for(var/atom/A as anything in templist) instruments[initial(A.name)] = A return instruments */ diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm index e8666f7867..9d7ba493d4 100644 --- a/code/modules/instruments/songs/play_legacy.dm +++ b/code/modules/instruments/songs/play_legacy.dm @@ -80,8 +80,7 @@ if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) do_hearcheck() var/sound/music_played = sound(soundfile) - for(var/i in hearing_mobs) - var/mob/M = i + for(var/mob/M as anything in hearing_mobs) /* Would be nice if(user && HAS_TRAIT(user, TRAIT_MUSICIAN) && isliving(M)) var/mob/living/L = M diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm index d8b10654d5..63369228aa 100644 --- a/code/modules/instruments/songs/play_synthesized.dm +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -61,8 +61,7 @@ channels_playing[channel_text] = 100 last_channel_played = channel_text var/turf/source = get_turf(parent) - for(var/i in hearing_mobs) - var/mob/M = i + for(var/mob/M as anything in hearing_mobs) /* Maybe someday if(user && HAS_TRAIT(user, TRAIT_MUSICIAN) && isliving(M)) var/mob/living/L = M @@ -142,10 +141,8 @@ if(dead) channels_playing -= channel channels_idle += channel - for(var/i in hearing_mobs) - var/mob/M = i + for(var/mob/M as anything in hearing_mobs) M.stop_sound_channel(channelnumber) else - for(var/i in hearing_mobs) - var/mob/M = i + for(var/mob/M as anything in hearing_mobs) M.set_sound_channel_volume(channelnumber, (current_volume * 0.01) * volume * using_instrument.volume_multiplier) diff --git a/code/modules/looking_glass/lg_area.dm b/code/modules/looking_glass/lg_area.dm index b17c67449f..25d3bd7a3d 100644 --- a/code/modules/looking_glass/lg_area.dm +++ b/code/modules/looking_glass/lg_area.dm @@ -38,8 +38,7 @@ /area/looking_glass/proc/begin_program(var/image/newimage) if(!active) - for(var/trf in our_turfs) - var/turf/simulated/floor/looking_glass/lgt = trf + for(var/turf/simulated/floor/looking_glass/lgt as anything in our_turfs) lgt.activate() our_landmark.take_image(newimage) @@ -47,8 +46,7 @@ /area/looking_glass/proc/end_program() if(active) - for(var/trf in our_turfs) - var/turf/simulated/floor/looking_glass/lgt = trf + for(var/turf/simulated/floor/looking_glass/lgt as anything in our_turfs) lgt.deactivate() active = FALSE @@ -57,8 +55,7 @@ our_landmark.drop_image() /area/looking_glass/proc/toggle_optional(var/transparent) - for(var/trf in our_optional_turfs) - var/turf/simulated/floor/looking_glass/lgt = trf + for(var/turf/simulated/floor/looking_glass/lgt as anything in our_optional_turfs) lgt.center = !transparent if(active) lgt.deactivate() diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index 8cc742c508..3e530206a4 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -49,8 +49,7 @@ var/list/obj/machinery/atmospherics/atmos_machines = list() var/list/turf/turfs = block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])) - for(var/L in turfs) - var/turf/B = L + for(var/turf/B as anything in turfs) atoms += B areas |= B.loc for(var/A in B) @@ -71,8 +70,7 @@ SSmachines.setup_powernets_for_cables(cables) // Ensure all machines in loaded areas get notified of power status - for(var/I in areas) - var/area/A = I + for(var/area/A as anything in areas) A.power_change() if(machinery_was_awake) diff --git a/code/modules/media/media_machinery.dm b/code/modules/media/media_machinery.dm index 3957ff9005..bbde62a347 100644 --- a/code/modules/media/media_machinery.dm +++ b/code/modules/media/media_machinery.dm @@ -48,8 +48,7 @@ // Update Media Source. A.media_source = null // Clients - for(var/m in mobs_in_area(A)) - var/mob/M = m + for(var/mob/M as anything in mobs_in_area(A)) M.update_music() master_area = null diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index 199b1ed0d0..2896f7feea 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -58,7 +58,7 @@ if(53 to 54) new/obj/item/latexballon(src) if(55 to 56) - var/newitem = pick(typesof(/obj/item/toy/mecha) - /obj/item/toy/mecha) + var/newitem = pick(subtypesof(/obj/item/toy/mecha)) new newitem(src) if(57 to 58) new/obj/item/toy/syndicateballoon(src) @@ -77,7 +77,7 @@ if(67 to 68) var/t = rand(4,7) for(var/i = 0, i < t, ++i) - var/newitem = pick(typesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts - /obj/item/weapon/stock_parts/subspace) + var/newitem = pick(subtypesof(/obj/item/weapon/stock_parts) - /obj/item/weapon/stock_parts/subspace) new newitem(src) if(69 to 70) new/obj/item/weapon/pickaxe/silver(src) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index f5c74a2f8b..c5c939b2f1 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -18,8 +18,7 @@ var/global/list/total_extraction_beacons = list() /obj/item/extraction_pack/attack_self(mob/user) var/list/possible_beacons = list() - for(var/B in global.total_extraction_beacons) - var/obj/structure/extraction_point/EP = B + for(var/obj/structure/extraction_point/EP as anything in global.total_extraction_beacons) if(EP.beacon_network in beacon_networks) possible_beacons += EP diff --git a/code/modules/mining/machinery/machine_stacking.dm b/code/modules/mining/machinery/machine_stacking.dm index 030c52f764..b0b2a7890e 100644 --- a/code/modules/mining/machinery/machine_stacking.dm +++ b/code/modules/mining/machinery/machine_stacking.dm @@ -89,11 +89,10 @@ /obj/machinery/mineral/stacking_machine/New() ..() - for(var/stacktype in (subtypesof(/obj/item/stack/material) - typesof(/obj/item/stack/material/cyborg))) - var/obj/item/stack/material/S = stacktype + for(var/obj/item/stack/material/S as anything in (subtypesof(/obj/item/stack/material) - typesof(/obj/item/stack/material/cyborg))) var/s_matname = initial(S.default_type) stack_storage[s_matname] = 0 - stack_paths[s_matname] = stacktype + stack_paths[s_matname] = S spawn( 5 ) for (var/dir in cardinal) diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index 9b9ce3957f..fe64242795 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -237,8 +237,7 @@ note dizziness decrements automatically in the mob's Life() proc. //Check for clients with pref enabled var/list/viewing = list() - for(var/m in viewers(A)) - var/mob/M = m + for(var/mob/M as anything in viewers(A)) var/client/C = M.client if(C && C.is_preference_enabled(/datum/client_preference/attack_icons)) viewing += M.client diff --git a/code/modules/mob/freelook/ai/chunk.dm b/code/modules/mob/freelook/ai/chunk.dm index 2a689c1473..ebd68a6206 100644 --- a/code/modules/mob/freelook/ai/chunk.dm +++ b/code/modules/mob/freelook/ai/chunk.dm @@ -7,8 +7,7 @@ var/list/cameras = list() /datum/chunk/camera/acquireVisibleTurfs(var/list/visible) - for(var/camera in cameras) - var/obj/machinery/camera/c = camera + for(var/obj/machinery/camera/c as anything in cameras) if(!istype(c)) cameras -= c diff --git a/code/modules/mob/freelook/chunk.dm b/code/modules/mob/freelook/chunk.dm index da2d84701c..4ae5d3a590 100644 --- a/code/modules/mob/freelook/chunk.dm +++ b/code/modules/mob/freelook/chunk.dm @@ -86,20 +86,17 @@ visibleTurfs = newVisibleTurfs obscuredTurfs = turfs - newVisibleTurfs - for(var/turf in visAdded) - var/turf/t = turf + for(var/turf/t as anything in visAdded) if(LAZYLEN(t.obfuscations) && t.obfuscations[obfuscation.type]) obscured -= t.obfuscations[obfuscation.type] - for(var/eye in seenby) - var/mob/observer/eye/m = eye + for(var/mob/observer/eye/m as anything in seenby) if(!m) continue var/client/client = m.GetViewerClient() if(client) client.images -= t.obfuscations[obfuscation.type] - for(var/turf in visRemoved) - var/turf/t = turf + for(var/turf/t as anything in visRemoved) if(obscuredTurfs[t]) LAZYINITLIST(t.obfuscations) if(!t.obfuscations[obfuscation.type]) @@ -108,8 +105,7 @@ t.obfuscations[obfuscation.type] = ob_image obscured += t.obfuscations[obfuscation.type] - for(var/eye in seenby) - var/mob/observer/eye/m = eye + for(var/mob/observer/eye/m as anything in seenby) if(!m) seenby -= m continue @@ -142,8 +138,7 @@ obscuredTurfs = turfs - visibleTurfs - for(var/turf in obscuredTurfs) - var/turf/t = turf + for(var/turf/t as anything in obscuredTurfs) LAZYINITLIST(t.obfuscations) if(!t.obfuscations[obfuscation.type]) var/image/ob_image = image(obfuscation.icon, t, obfuscation.icon_state, OBFUSCATION_LAYER) diff --git a/code/modules/mob/freelook/visualnet.dm b/code/modules/mob/freelook/visualnet.dm index 44cd9278cc..1508a30133 100644 --- a/code/modules/mob/freelook/visualnet.dm +++ b/code/modules/mob/freelook/visualnet.dm @@ -49,8 +49,7 @@ var/list/chunks_pre_seen = list() var/list/chunks_post_seen = list() - for(var/V in moved_eyes) - var/mob/observer/eye/eye = V + for(var/mob/observer/eye/eye as anything in moved_eyes) if(C) chunks_pre_seen |= eye.visibleChunks // 0xf = 15 @@ -69,31 +68,26 @@ var/list/remove = eye.visibleChunks - visibleChunks var/list/add = visibleChunks - eye.visibleChunks - for(var/chunk in remove) - var/datum/chunk/c = chunk + for(var/datum/chunk/c as anything in remove) c.remove(eye, FALSE) - for(var/chunk in add) - var/datum/chunk/c = chunk + for(var/datum/chunk/c as anything in add) c.add(eye, FALSE) if(C) chunks_post_seen |= eye.visibleChunks if(C) - for(var/V in other_eyes) - var/mob/observer/eye/eye = V + for(var/mob/observer/eye/eye as anything in other_eyes) chunks_post_seen |= eye.visibleChunks var/list/remove = chunks_pre_seen - chunks_post_seen var/list/add = chunks_post_seen - chunks_pre_seen - for(var/chunk in remove) - var/datum/chunk/c = chunk + for(var/datum/chunk/c as anything in remove) C.images -= c.obscured - for(var/chunk in add) - var/datum/chunk/c = chunk + for(var/datum/chunk/c as anything in add) C.images += c.obscured // Updates the chunks that the turf is located in. Use this when obstacles are destroyed or when doors open. diff --git a/code/modules/mob/living/carbon/human/MedicalSideEffects.dm b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm index 9af2957074..6946f26a80 100644 --- a/code/modules/mob/living/carbon/human/MedicalSideEffects.dm +++ b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm @@ -56,7 +56,7 @@ if(life_tick % 15 != 0) return 0 - var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect + var/list/L = subtypesof(/datum/medical_effect) for(var/T in L) var/datum/medical_effect/M = new T if (M.manifest(src)) diff --git a/code/modules/mob/living/carbon/human/chem_side_effects.dm b/code/modules/mob/living/carbon/human/chem_side_effects.dm index 9af2957074..6946f26a80 100644 --- a/code/modules/mob/living/carbon/human/chem_side_effects.dm +++ b/code/modules/mob/living/carbon/human/chem_side_effects.dm @@ -56,7 +56,7 @@ if(life_tick % 15 != 0) return 0 - var/list/L = typesof(/datum/medical_effect)-/datum/medical_effect + var/list/L = subtypesof(/datum/medical_effect) for(var/T in L) var/datum/medical_effect/M = new T if (M.manifest(src)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c61b4724d5..1ed1ad847d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -751,7 +751,7 @@ update_eyes() // hair - var/list/all_hairs = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair + var/list/all_hairs = subtypesof(/datum/sprite_accessory/hair) var/list/hairs = list() // loop through potential hairs @@ -767,7 +767,7 @@ h_style = new_style // facial hair - var/list/all_fhairs = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair + var/list/all_fhairs = subtypesof(/datum/sprite_accessory/facial_hair) var/list/fhairs = list() for(var/x in all_fhairs) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 62fef2744d..e43a1de6b6 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -135,8 +135,7 @@ emp_act siemens_coefficient *= C.siemens_coefficient // Modifiers. - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) if(!isnull(M.siemens_coefficient)) siemens_coefficient *= M.siemens_coefficient @@ -181,8 +180,7 @@ emp_act for(var/obj/item/clothing/gear in protective_gear) protection += gear.armor[type] - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) var/modifier_armor = LAZYACCESS(M.armor_percent, type) if(modifier_armor) protection += modifier_armor @@ -197,8 +195,7 @@ emp_act for(var/obj/item/clothing/gear in protective_gear) soaked += gear.armorsoak[type] - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) var/modifier_armor = LAZYACCESS(M.armor_flat, type) if(modifier_armor) soaked += modifier_armor diff --git a/code/modules/mob/living/carbon/human/human_modular_limbs.dm b/code/modules/mob/living/carbon/human/human_modular_limbs.dm index 81d4af05ce..4010a2d487 100644 --- a/code/modules/mob/living/carbon/human/human_modular_limbs.dm +++ b/code/modules/mob/living/carbon/human/human_modular_limbs.dm @@ -58,8 +58,7 @@ // Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use // case but I can see it being expanded in the future if meat limbs or doona limbs use it. /mob/living/carbon/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc) - for(var/bp in organs) - var/obj/item/organ/external/E = bp + for(var/obj/item/organ/external/E as anything in organs) if(!validate_proc || call(E, validate_proc)(src) > MODULAR_BODYPART_INVALID) LAZYADD(., E) if(return_first_found) @@ -67,8 +66,7 @@ // Prune children so we can't remove every individual component of an entire prosthetic arm // piece by piece. Technically a circular dependency here would remove the limb entirely but // if there's a parent whose child is also its parent, there's something wrong regardless. - for(var/bp in .) - var/obj/item/organ/external/E = bp + for(var/obj/item/organ/external/E as anything in .) if(length(E.children)) . -= E.children diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d091f43298..cc5ad6f2ff 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -846,8 +846,7 @@ . = 1 - . // Invert from 1 = immunity to 0 = immunity. // Doing it this way makes multiplicative stacking not get out of hand, so two modifiers that give 0.5 protection will be combined to 0.75 in the end. - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) if(!isnull(M.heat_protection)) . *= 1 - M.heat_protection @@ -866,8 +865,7 @@ . = 1 - . // Invert from 1 = immunity to 0 = immunity. // Doing it this way makes multiplicative stacking not get out of hand, so two modifiers that give 0.5 protection will be combined to 0.75 in the end. - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) if(!isnull(M.cold_protection)) // Invert the modifier values so they align with the current working value. . *= 1 - M.cold_protection diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index 6f81a53f6b..b26d57a82b 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -91,8 +91,7 @@ ability_flags &= ~AB_PHASE_SHIFTED mouse_opacity = 1 name = real_name - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = initial(B.escapable) //cut_overlays() @@ -140,8 +139,7 @@ custom_emote(1,"phases out!") name = "Something" - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = FALSE var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc) diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm index aab6fdd40b..fbd1921c55 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm @@ -171,8 +171,7 @@ last_special = world.time + 50 - for(var/limb in src.organs) - var/obj/item/organ/external/L = limb + for(var/obj/item/organ/external/L as anything in src.organs) L.transparent = !L.transparent visible_message("\The [src]'s interal composition seems to change.") update_icons_body() diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 0830d10e83..252008d25b 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -420,8 +420,7 @@ var/global/list/disallowed_protean_accessories = list( //Transfer vore organs blob.vore_organs = vore_organs blob.vore_selected = vore_selected - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.forceMove(blob) B.owner = blob @@ -524,8 +523,7 @@ var/global/list/disallowed_protean_accessories = list( //Transfer vore organs vore_selected = blob.vore_selected - for(var/belly in blob.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in blob.vore_organs) B.forceMove(src) B.owner = src diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 2a208e43c7..1130918ed5 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -236,8 +236,7 @@ CHOMP Station removal end*/ stat(null, "- -- --- REFACTORY ERROR! --- -- -") stat(null, "- -- --- Abilities (Shift+LMB Examines) --- -- -") - for(var/ability in abilities) - var/obj/effect/protean_ability/A = ability + for(var/obj/effect/protean_ability/A as anything in abilities) stat("[A.ability_name]",A.atom_button_text()) // Various modifiers @@ -330,8 +329,7 @@ CHOMP Removal end*/ holder.adjustBruteLoss(-1,include_robo = TRUE) //Modified by species resistances holder.adjustFireLoss(-0.5,include_robo = TRUE) //Modified by species resistances var/mob/living/carbon/human/H = holder - for(var/organ in H.internal_organs) - var/obj/item/organ/O = organ + for(var/obj/item/organ/O as anything in H.internal_organs) // Fix internal damage if(O.damage > 0) O.damage = max(0,O.damage-0.1) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index b33a5d3945..94776d570e 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -17,11 +17,9 @@ //VOREStation Edit End nest = null - for(var/s in owned_soul_links) - var/datum/soul_link/S = s + for(var/datum/soul_link/S as anything in owned_soul_links) S.owner_died(gibbed) - for(var/s in shared_soul_links) - var/datum/soul_link/S = s + for(var/datum/soul_link/S as anything in shared_soul_links) S.sharer_died(gibbed) . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 592d7d0db2..622c3965c4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -868,9 +868,8 @@ update_transform() //VOREStation Add if(lying && LAZYLEN(buckled_mobs)) - for(var/rider in buckled_mobs) - var/mob/living/L = rider - if(buckled_mobs[rider] != "riding") + for(var/mob/living/L as anything in buckled_mobs) + if(buckled_mobs[L] != "riding") continue // Only boot off riders if(riding_datum) riding_datum.force_dismount(L) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index fc7d08677b..cc66172f43 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -387,11 +387,9 @@ var/list/channel_to_radio_key = new //Remove all those images. At least it's just ONE spawn this time. spawn(30) - for(var/img in images_to_clients) - var/image/I = img + for(var/image/I as anything in images_to_clients) var/list/clients_from_image = images_to_clients[I] - for(var/client in clients_from_image) - var/client/C = client + for(var/client/C as anything in clients_from_image) if(C) //Could have disconnected after message sent, before removing bubble. C.images -= I qdel(I) @@ -416,12 +414,10 @@ var/list/channel_to_radio_key = new else var/list/potentials = get_mobs_and_objs_in_view_fast(T, world.view) var/list/mobs = potentials["mobs"] - for(var/hearer in mobs) - var/mob/M = hearer + for(var/mob/M as anything in mobs) M.hear_signlang(message, verb, language, src) var/list/objs = potentials["objs"] - for(var/hearer in objs) - var/obj/O = hearer + for(var/obj/O as anything in objs) O.hear_signlang(message, verb, language, src) return 1 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 2a0a307818..38f59adbc5 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -32,8 +32,7 @@ var/list/ai_verbs_default = list( /proc/AutoUpdateAI(obj/subject) var/is_in_use = 0 if (subject!=null) - for(var/A in ai_list) - var/mob/living/silicon/ai/M = A + for(var/mob/living/silicon/ai/M as anything in ai_list) if ((M.client && M.machine == subject)) is_in_use = 1 subject.attack_ai(M) diff --git a/code/modules/mob/living/silicon/ai/ai_remote_control.dm b/code/modules/mob/living/silicon/ai/ai_remote_control.dm index 768aba02f5..ac092ed693 100644 --- a/code/modules/mob/living/silicon/ai/ai_remote_control.dm +++ b/code/modules/mob/living/silicon/ai/ai_remote_control.dm @@ -25,8 +25,7 @@ var/list/possible = list() - for(var/borgie in GLOB.available_ai_shells) - var/mob/living/silicon/robot/R = borgie + for(var/mob/living/silicon/robot/R as anything in GLOB.available_ai_shells) if(R.shell && !R.deployed && (R.stat != DEAD) && (!R.connected_ai || (R.connected_ai == src) ) && !(using_map.ai_shell_restricted && !(R.z in using_map.ai_shell_allowed_levels)) ) //VOREStation Edit: shell restrictions possible += R diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 7f84eebf6e..1a69c5f5f3 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -202,10 +202,8 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) var/list/obj/machinery/camera/add = list() var/list/obj/machinery/camera/remove = list() var/list/obj/machinery/camera/visible = list() - for(var/VV in visibleChunks) - var/datum/chunk/camera/CC = VV - for(var/V in CC.cameras) - var/obj/machinery/camera/C = V + for(var/datum/chunk/camera/CC as anything in visibleChunks) + for(var/obj/machinery/camera/C as anything in CC.cameras) if (!C.can_use() || (get_dist(C, src) > telegraph_range)) continue visible |= C @@ -213,15 +211,13 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) add = visible - cameras_telegraphed remove = cameras_telegraphed - visible - for(var/V in remove) - var/obj/machinery/camera/C = V + for(var/obj/machinery/camera/C as anything in remove) if(QDELETED(C)) continue cameras_telegraphed -= C C.in_use_lights-- C.update_icon() - for(var/V in add) - var/obj/machinery/camera/C = V + for(var/obj/machinery/camera/C as anything in add) if(QDELETED(C)) continue cameras_telegraphed |= C @@ -230,8 +226,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) /mob/observer/eye/aiEye/pic_in_pic/proc/disable_camera_telegraphing() telegraph_cameras = FALSE - for(var/V in cameras_telegraphed) - var/obj/machinery/camera/C = V + for(var/obj/machinery/camera/C as anything in cameras_telegraphed) if(QDELETED(C)) continue C.in_use_lights-- @@ -291,8 +286,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) /mob/living/silicon/ai/proc/refresh_multicam() reset_view(GLOB.ai_camera_room_landmark) if(client) - for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + for(var/obj/screen/movable/pic_in_pic/P as anything in multicam_screens) P.show_to(client) /mob/living/silicon/ai/proc/end_multicam() @@ -301,8 +295,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) multicam_on = FALSE select_main_multicam_window(null) if(client) - for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + for(var/obj/screen/movable/pic_in_pic/P as anything in multicam_screens) P.unshow_to(client) reset_view() to_chat(src, "Multiple-camera viewing mode deactivated.") diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm index 59a0fad74d..c8ab1d7e07 100644 --- a/code/modules/mob/living/silicon/pai/pai_vr.dm +++ b/code/modules/mob/living/silicon/pai/pai_vr.dm @@ -17,8 +17,7 @@ /mob/living/silicon/pai/proc/update_fullness_pai() //Determines if they have something in their stomach. Copied and slightly modified. var/new_people_eaten = 0 - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) for(var/mob/living/M in B) new_people_eaten += M.size_multiplier people_eaten = min(1, new_people_eaten) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index cad5229097..3a98a5bea3 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -21,7 +21,7 @@ var/global/list/pai_software_by_key = list() var/global/list/default_pai_software = list() /hook/startup/proc/populate_pai_software_list() var/r = 1 // I would use ., but it'd sacrifice runtime detection - for(var/type in typesof(/datum/pai_software) - /datum/pai_software) + for(var/type in subtypesof(/datum/pai_software)) var/datum/pai_software/P = new type() if(pai_software_by_key[P.id]) var/datum/pai_software/O = pai_software_by_key[P.id] diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index a15e2bf518..9e3bd95c86 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -567,8 +567,7 @@ 'sound/vore/death10.ogg') playsound(src, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) if(is_vore_predator(T)) - for(var/belly in T.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in T.vore_organs) for(var/atom/movable/thing in B) thing.forceMove(src) if(ismob(thing)) diff --git a/code/modules/mob/living/silicon/robot/examine_vr.dm b/code/modules/mob/living/silicon/robot/examine_vr.dm index 2bebab2665..84b960050d 100644 --- a/code/modules/mob/living/silicon/robot/examine_vr.dm +++ b/code/modules/mob/living/silicon/robot/examine_vr.dm @@ -1,8 +1,7 @@ /mob/living/silicon/robot/proc/examine_bellies_borg() var/list/message_list = list() - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) var/bellymessage = B.get_examine_msg() if(bellymessage) message_list += bellymessage bellymessage = B.get_examine_msg_absorbed() diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index 09d6fc7335..af37f156c5 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -147,8 +147,7 @@ . = 1 - . // Invert from 1 = immunity to 0 = immunity. // Doing it this way makes multiplicative stacking not get out of hand, so two modifiers that give 0.5 protection will be combined to 0.75 in the end. - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) if(!isnull(M.cold_protection)) . *= 1 - M.cold_protection @@ -172,8 +171,7 @@ . = 1 - . // Invert from 1 = immunity to 0 = immunity. // Doing it this way makes multiplicative stacking not get out of hand, so two modifiers that give 0.5 protection will be combined to 0.75 in the end. - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) if(!isnull(M.heat_protection)) . *= 1 - M.heat_protection @@ -199,8 +197,7 @@ . = 1 - . // Invert from 1 = immunity to 0 = immunity. // Doing it this way makes multiplicative stacking not get out of hand, so two modifiers that give 0.5 protection will be combined to 0.75 in the end. - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) if(!isnull(M.siemens_coefficient)) . *= M.siemens_coefficient @@ -257,8 +254,7 @@ if(isnull(armorval)) armorval = 0 - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) var/modifier_armor = LAZYACCESS(M.armor_percent, attack_flag) if(modifier_armor) armorval += modifier_armor @@ -270,8 +266,7 @@ if(isnull(armorval)) armorval = 0 - for(var/thing in modifiers) - var/datum/modifier/M = thing + for(var/datum/modifier/M as anything in modifiers) var/modifier_armor = LAZYACCESS(M.armor_flat, attack_flag) if(modifier_armor) armorval += modifier_armor diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 59cfa2850a..305ecf70fc 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -67,8 +67,7 @@ // Update fullness based on size & quantity of belly contents /mob/living/simple_mob/proc/update_fullness() var/new_fullness = 0 - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) for(var/mob/living/M in B) new_fullness += M.size_multiplier new_fullness = new_fullness / size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm index 3d8401b76d..8035fb2d80 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/nurse.dm @@ -240,8 +240,7 @@ var/static/alternative_targets = typecacheof(list(/obj/item, /obj/structure)) - for(var/AT in typecache_filter_list(range(vision_range, holder), alternative_targets)) - var/obj/O = AT + for(var/obj/O as anything in typecache_filter_list(range(vision_range, holder), alternative_targets)) if(can_see(holder, O, vision_range) && !O.anchored) . += O diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm index 56214bf58c..e6c84387c8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm @@ -32,8 +32,7 @@ if(shifted_out) shifted_out = FALSE name = real_name - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = initial(B.escapable) cut_overlays() @@ -89,8 +88,7 @@ name = "Something" health = maxHealth //Fullheal - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = FALSE cut_overlays() @@ -145,8 +143,7 @@ real_name = name name = "Something" - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = FALSE cut_overlays() @@ -166,8 +163,7 @@ spawn(300) shifted_out = FALSE name = real_name - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = initial(B.escapable) cut_overlays() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm index 880008dff9..7f525c8310 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm @@ -54,8 +54,7 @@ /mob/living/simple_mob/vore/lamia/update_fullness() var/new_fullness = 0 // We only want to count our upper_stomach towards capacity - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) if(B.name == "upper stomach") for(var/mob/living/M in B) new_fullness += M.size_multiplier @@ -76,8 +75,7 @@ var/upper_shows = FALSE var/tail_shows = FALSE - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) if(!(B.name in list("upper stomach", "tail stomach"))) continue var/belly_fullness = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm index 208030125d..ec1161630a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm @@ -21,8 +21,7 @@ ability_flags &= ~AB_PHASE_SHIFTED mouse_opacity = 1 name = real_name - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = initial(B.escapable) cut_overlays() @@ -76,8 +75,7 @@ real_name = name name = "Something" - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.escapable = FALSE cut_overlays() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm index 2f275db0f1..371fc8d241 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm @@ -215,8 +215,7 @@ abilities_stat() /mob/living/simple_mob/shadekin/proc/abilities_stat() - for(var/A in shadekin_abilities) - var/obj/effect/shadekin_ability/ability = A + for(var/obj/effect/shadekin_ability/ability as anything in shadekin_abilities) stat("[ability.ability_name]",ability.atom_button_text()) //They phase back to the dark when killed diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm index 72e2532792..f3c200410b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub_larva.dm @@ -205,8 +205,7 @@ var/global/list/grub_machine_overlays = list() var/static/potential_targets = typecacheof(list(/obj/machinery)) var/list/actual_targets = list() - for(var/AT in typecache_filter_list(range(vision_range, holder), potential_targets)) - var/obj/machinery/M = AT + for(var/obj/machinery/M as anything in typecache_filter_list(range(vision_range, holder), potential_targets)) if(istype(M, /obj/machinery/atmospherics/unary/vent_pump)) var/obj/machinery/atmospherics/unary/vent_pump/V = M if(!V.welded && prob(50)) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index 3ea220ef8d..e1c19a2dd4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -271,14 +271,12 @@ return . = ..() var/safe = (faction == "neutral") - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.digest_mode = safe ? DM_HOLD : vore_default_mode /mob/living/simple_mob/animal/space/carp/holographic/set_safety(var/safe) . = ..() - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.digest_mode = safe ? DM_HOLD : vore_default_mode /mob/living/simple_mob/animal/passive/mouse diff --git a/code/modules/mob/living/status_indicators.dm b/code/modules/mob/living/status_indicators.dm index a3f386b9e6..4f61b7ad34 100644 --- a/code/modules/mob/living/status_indicators.dm +++ b/code/modules/mob/living/status_indicators.dm @@ -67,8 +67,7 @@ current_x_position -= (icon_expected_width / 2) * (get_icon_scale_y() - 1) // Now the indicator row can actually be built. - for(var/thing in status_indicators) - var/image/I = thing + for(var/image/I as anything in status_indicators) // This is a semi-HUD element, in a similar manner as medHUDs, in that they're 'above' everything else in the world, // but don't pierce obfuscation layers such as blindness or darkness, unlike actual HUD elements like inventory slots. diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index af947a7b6e..3b52e76055 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game. mob_list -= src dead_mob_list -= src @@ -1232,3 +1233,2470 @@ GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list) /mob/proc/grab_ghost(force) if(mind) return mind.grab_ghost(force = force) +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt +/mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game. + mob_list -= src + dead_mob_list -= src + living_mob_list -= src + unset_machine() + qdel(hud_used) + clear_fullscreen() + if(client) + for(var/obj/screen/movable/spell_master/spell_master in spell_masters) + qdel(spell_master) + remove_screen_obj_references() + client.screen = list() + if(mind && mind.current == src) + spellremove(src) + ghostize() + QDEL_NULL(plane_holder) + ..() + return QDEL_HINT_HARDDEL_NOW + +/mob/proc/remove_screen_obj_references() + hands = null + pullin = null + purged = null + internals = null + i_select = null + m_select = null + healths = null + throw_icon = null + pain = null + item_use_icon = null + gun_move_icon = null + gun_setting_icon = null + spell_masters = null + zone_sel = null + +/mob/Initialize() + mob_list += src + if(stat == DEAD) + dead_mob_list += src + else + living_mob_list += src + lastarea = get_area(src) + set_focus(src) // VOREStation Add - Key Handling + hook_vr("mob_new",list(src)) //VOREStation Code + update_transform() // Some mobs may start bigger or smaller than normal. + return ..() + +/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) + + if(!client && !teleop) return + + if (type) + if((type & VISIBLE_MESSAGE) && (is_blind() || paralysis) )//Vision related + if (!( alt )) + return + else + msg = alt + type = alt_type + if ((type & AUDIBLE_MESSAGE) && is_deaf())//Hearing related + if (!( alt )) + return + else + msg = alt + type = alt_type + if ((type & VISIBLE_MESSAGE) && (sdisabilities & BLIND)) + return + // Added voice muffling for Issue 41. + if(stat == UNCONSCIOUS || sleeping > 0) + to_chat(src, "... You can almost hear someone talking ...") + else + to_chat(src,msg) + if(teleop) + to_chat(teleop, create_text_tag("body", "BODY:", teleop) + "[msg]") + return + +// Show a message to all mobs and objects in sight of this one +// This would be for visible actions by the src mob +// message is the message output to anyone who can see e.g. "[src] does something!" +// self_message (optional) is what the src mob sees e.g. "You do something!" +// blind_message (optional) is what blind people will hear e.g. "You hear something!" +/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null, var/range = world.view, var/runemessage) + if(self_message) + if(LAZYLEN(exclude_mobs)) + exclude_mobs |= src + else + exclude_mobs = list(src) + src.show_message(self_message, 1, blind_message, 2) + if(isnull(runemessage)) + runemessage = -1 + . = ..(message, blind_message, exclude_mobs, range, runemessage) // Really not ideal that atom/visible_message has different arg numbering :( + +// Returns an amount of power drawn from the object (-1 if it's not viable). +// If drain_check is set it will not actually drain power, just return a value. +// If surge is set, it will destroy/damage the recipient and not return any power. +// Not sure where to define this, so it can sit here for the rest of time. +/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) + return -1 + +// Show a message to all mobs and objects in earshot of this one +// This would be for audible actions by the src mob +// message is the message output to anyone who can hear. +// self_message (optional) is what the src mob hears. +// deaf_message (optional) is what deaf people will see. +// hearing_distance (optional) is the range, how many tiles away the message can be heard. +/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message, var/radio_message, var/runemessage) + + var/range = hearing_distance || world.view + var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE) + + var/list/hearing_mobs = hear["mobs"] + var/list/hearing_objs = hear["objs"] + + if(isnull(runemessage)) + runemessage = -1 // Symmetry with mob/audible_message, despite the fact this one doesn't call parent. Maybe it should! + + if(radio_message) + for(var/obj in hearing_objs) + var/obj/O = obj + O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) + else + for(var/obj in hearing_objs) + var/obj/O = obj + O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) + + for(var/mob in hearing_mobs) + var/mob/M = mob + var/msg = message + if(self_message && M==src) + msg = self_message + M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) + if(runemessage != -1) + M.create_chat_message(src, "[runemessage || message]", FALSE, list("emote"), audible = FALSE) + +/mob/proc/findname(msg) + for(var/mob/M in mob_list) + if (M.real_name == text("[]", msg)) + return M + return 0 + +/mob/proc/Life() +// if(organStructure) +// organStructure.ProcessOrgans() + return + +#define UNBUCKLED 0 +#define PARTIALLY_BUCKLED 1 +#define FULLY_BUCKLED 2 +/mob/proc/buckled() + // Preliminary work for a future buckle rewrite, + // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting) + if(!buckled) + return UNBUCKLED + return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED + +/mob/proc/is_blind() + return ((sdisabilities & BLIND) || blinded || incapacitated(INCAPACITATION_KNOCKOUT)) + +/mob/proc/is_deaf() + return ((sdisabilities & DEAF) || ear_deaf || incapacitated(INCAPACITATION_KNOCKOUT)) + +/mob/proc/is_physically_disabled() + return incapacitated(INCAPACITATION_DISABLED) + +/mob/proc/cannot_stand() + return incapacitated(INCAPACITATION_KNOCKDOWN) + +/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT) + if ((incapacitation_flags & INCAPACITATION_STUNNED) && stunned) + return 1 + + if ((incapacitation_flags & INCAPACITATION_FORCELYING) && (weakened || resting)) + return 1 + + if ((incapacitation_flags & INCAPACITATION_KNOCKOUT) && (stat || paralysis || sleeping || (status_flags & FAKEDEATH))) + return 1 + + if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained()) + return 1 + + if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY))) + var/buckling = buckled() + if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY)) + return 1 + if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY)) + return 1 + + return 0 + +#undef UNBUCKLED +#undef PARTIALLY_BUCKLED +#undef FULLY_BUCKLED + +/mob/proc/restrained() + return + +/mob/proc/reset_view(atom/A) + if (client) + if (istype(A, /atom/movable)) + client.perspective = EYE_PERSPECTIVE + client.eye = A + else + if (isturf(loc)) + client.eye = client.mob + client.perspective = MOB_PERSPECTIVE + else + client.perspective = EYE_PERSPECTIVE + client.eye = loc + return TRUE + +/mob/verb/pointed(atom/A as mob|obj|turf in view()) + set name = "Point To" + set category = "Object" + + if(!src || !isturf(src.loc) || !(A in view(src.loc))) + return 0 + if(istype(A, /obj/effect/decal/point)) + return 0 + + var/turf/tile = get_turf(A) + if (!tile) + return 0 + + var/turf/our_tile = get_turf(src) + var/obj/visual = new /obj/effect/decal/point(our_tile) + visual.invisibility = invisibility + visual.plane = ABOVE_PLANE + visual.layer = FLY_LAYER + + animate(visual, + pixel_x = (tile.x - our_tile.x) * world.icon_size + A.pixel_x, + pixel_y = (tile.y - our_tile.y) * world.icon_size + A.pixel_y, + time = 1.7, + easing = EASE_OUT) + + QDEL_IN(visual, 2 SECONDS) //Better qdel + + face_atom(A) + return 1 + + +/mob/proc/ret_grab(list/L, flag) + return + +/mob/verb/mode() + set name = "Activate Held Object" + set category = "Object" + set src = usr + + return + +/* +/mob/verb/dump_source() + + var/master = "
    "
    +	for(var/t in typesof(/area))
    +		master += text("[]\n", t)
    +		//Foreach goto(26)
    +	src << browse(master)
    +	return
    +*/
    +
    +/mob/verb/memory()
    +	set name = "Notes"
    +	set category = "IC"
    +	if(mind)
    +		mind.show_memory(src)
    +	else
    +		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    +
    +/mob/verb/add_memory(msg as message)
    +	set name = "Add Note"
    +	set category = "IC"
    +
    +	msg = sanitize(msg)
    +
    +	if(mind)
    +		mind.store_memory(msg)
    +	else
    +		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    +
    +/mob/proc/store_memory(msg as message, popup, sane = 1)
    +	msg = copytext(msg, 1, MAX_MESSAGE_LEN)
    +
    +	if (sane)
    +		msg = sanitize(msg)
    +
    +	if (length(memory) == 0)
    +		memory += msg
    +	else
    +		memory += "
    [msg]" + + if (popup) + memory() + +/mob/proc/update_flavor_text() + set src in usr + if(usr != src) + to_chat(usr, "No.") + var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes + + if(msg != null) + flavor_text = msg + +/mob/proc/warn_flavor_changed() + if(flavor_text && flavor_text != "") // don't spam people that don't use it! + to_chat(src, "

    OOC Warning:

    ") + to_chat(src, "Your flavor text is likely out of date! Change") + +/mob/proc/print_flavor_text() + if (flavor_text && flavor_text != "") + var/msg = replacetext(flavor_text, "\n", " ") + if(length(msg) <= 40) + return "[msg]" + else + return "[copytext_preserve_html(msg, 1, 37)]... More..." + +/* +/mob/verb/help() + set name = "Help" + src << browse('html/help.html', "window=help") + return +*/ + +/mob/proc/set_respawn_timer(var/time) + // Try to figure out what time to use + + // Special cases, can never respawn + if(ticker?.mode?.deny_respawn) + time = -1 + else if(!config.abandon_allowed) + time = -1 + else if(!config.respawn) + time = -1 + + // Special case for observing before game start + else if(ticker?.current_state <= GAME_STATE_SETTING_UP) + time = 1 MINUTE + + // Wasn't given a time, use the config time + else if(!time) + time = config.respawn_time + + var/keytouse = ckey + // Try harder to find a key to use + if(!keytouse && key) + keytouse = ckey(key) + else if(!keytouse && mind?.key) + keytouse = ckey(mind.key) + + GLOB.respawn_timers[keytouse] = world.time + time + +/mob/observer/dead/set_respawn_timer() + if(config.antag_hud_restricted && has_enabled_antagHUD) + ..(-1) + else + return // Don't set it, no need + +/mob/verb/abandon_mob() + set name = "Return to Menu" + set category = "OOC" + + if(stat != DEAD || !ticker) + to_chat(usr, "You must be dead to use this!") + return + + // Final chance to abort "respawning" + if(mind && timeofdeath) // They had spawned before + var/choice = tgui_alert(usr, "Returning to the menu will prevent your character from being revived in-round. Are you sure?", "Confirmation", list("No, wait", "Yes, leave")) + if(choice == "No, wait") + return + + // Beyond this point, you're going to respawn + to_chat(usr, config.respawn_message) + + if(!client) + log_game("[usr.key] AM failed due to disconnect.") + return + client.screen.Cut() + client.screen += client.void + if(!client) + log_game("[usr.key] AM failed due to disconnect.") + return + + announce_ghost_joinleave(client, 0) + + var/mob/new_player/M = new /mob/new_player() + if(!client) + log_game("[usr.key] AM failed due to disconnect.") + qdel(M) + return + + M.key = key + if(M.mind) + M.mind.reset() + return + +/client/verb/changes() + set name = "Changelog" + set category = "OOC" + src << browse('html/changelog.html', "window=changes;size=675x650") + if(prefs.lastchangelog != changelog_hash) + prefs.lastchangelog = changelog_hash + SScharacter_setup.queue_preferences_save(prefs) + winset(src, "rpane.changelog", "background-color=none;font-style=;") + +/mob/verb/observe() + set name = "Observe" + set category = "OOC" + var/is_admin = 0 + + if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT)) + is_admin = 1 + else if(stat != DEAD || istype(src, /mob/new_player)) + to_chat(usr, "You must be observing to use this!") + return + + if(is_admin && stat == DEAD) + is_admin = 0 + + var/list/targets = list() + + + targets += observe_list_format(nuke_disks) + targets += observe_list_format(all_singularities) + targets += getmobs() + targets += observe_list_format(sortAtom(mechas_list)) + targets += observe_list_format(SSshuttles.ships) + + client.perspective = EYE_PERSPECTIVE + + var/eye_name = null + + var/ok = "[is_admin ? "Admin Observe" : "Observe"]" + eye_name = tgui_input_list(usr, "Select something to [ok]:", "Select Target", targets) + + if (!eye_name) + return + + var/mob/mob_eye = targets[eye_name] + + if(client && mob_eye) + client.eye = mob_eye + if (is_admin) + client.adminobs = 1 + if(mob_eye == client.mob || client.eye == client.mob) + client.adminobs = 0 + +/mob/verb/cancel_camera() + set name = "Cancel Camera View" + set category = "OOC" + unset_machine() + reset_view(null) + +/mob/Topic(href, href_list) + if(href_list["mach_close"]) + var/t1 = text("window=[href_list["mach_close"]]") + unset_machine() + src << browse(null, t1) + + if(href_list["flavor_more"]) + usr << browse(text("[][]", name, replacetext(flavor_text, "\n", "
    ")), text("window=[];size=500x200", name)) + onclose(usr, "[name]") + if(href_list["flavor_change"]) + update_flavor_text() +// ..() + return + + +/mob/proc/pull_damage() + return 0 + +/mob/verb/stop_pulling() + + set name = "Stop Pulling" + set category = "IC" + + if(pulling) + if(ishuman(pulling)) + var/mob/living/carbon/human/H = pulling + visible_message(SPAN_WARNING("\The [src] lets go of \the [H]."), SPAN_NOTICE("You let go of \the [H]."), exclude_mobs = list(H)) + if(!H.stat) + to_chat(H, SPAN_WARNING("\The [src] lets go of you.")) + pulling.pulledby = null + pulling = null + if(pullin) + pullin.icon_state = "pull0" + +/mob/proc/start_pulling(var/atom/movable/AM) + + if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! + return + + if (AM.anchored) + to_chat(src, "It won't budge!") + return + + var/mob/M = AM + if(ismob(AM)) + + if(!can_pull_mobs || !can_pull_size) + to_chat(src, "They won't budge!") + return + + if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) + to_chat(src, "[M] is too large for you to move!") + return + + if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) + to_chat(src, "[M] is too heavy for you to move!") + return + + // If your size is larger than theirs and you have some + // kind of mob pull value AT ALL, you will be able to pull + // them, so don't bother checking that explicitly. + + if(M.grabbed_by.len) + // Only start pulling when nobody else has a grab on them + . = 1 + for(var/obj/item/weapon/grab/G in M.grabbed_by) + if(G.assailant != usr) + . = 0 + else + qdel(G) + if(!.) + to_chat(src, "Somebody has a grip on them!") + return + + if(!iscarbon(src)) + M.LAssailant = null + else + M.LAssailant = usr + + else if(isobj(AM)) + var/obj/I = AM + if(!can_pull_size || can_pull_size < I.w_class) + to_chat(src, "It won't budge!") + return + + if(pulling) + var/pulling_old = pulling + stop_pulling() + // Are we pulling the same thing twice? Just stop pulling. + if(pulling_old == AM) + return + + src.pulling = AM + AM.pulledby = src + + if(pullin) + pullin.icon_state = "pull1" + + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if(H.lying) // If they're on the ground we're probably dragging their arms to move them + visible_message(SPAN_WARNING("\The [src] leans down and grips \the [H]'s arms."), SPAN_NOTICE("You lean down and grip \the [H]'s arms."), exclude_mobs = list(H)) + if(!H.stat) + to_chat(H, SPAN_WARNING("\The [src] leans down and grips your arms.")) + else //Otherwise we're probably just holding their arm to lead them somewhere + visible_message(SPAN_WARNING("\The [src] grips \the [H]'s arm."), SPAN_NOTICE("You grip \the [H]'s arm."), exclude_mobs = list(H)) + if(!H.stat) + to_chat(H, SPAN_WARNING("\The [src] grips your arm.")) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25) //Quieter than hugging/grabbing but we still want some audio feedback + + if(H.pull_damage()) + to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.") + + //Attempted fix for people flying away through space when cuffed and dragged. + if(ismob(AM)) + var/mob/pulled = AM + pulled.inertia_dir = 0 + +/mob/proc/can_use_hands() + return + +/mob/proc/is_active() + return (0 >= usr.stat) + +/mob/proc/is_dead() + return stat == DEAD + +/mob/proc/is_mechanical() + if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI")) + return 1 + return istype(src, /mob/living/silicon) || get_species() == "Machine" + +/mob/proc/is_ready() + return client && !!mind + +/mob/proc/get_gender() + return gender + +/mob/proc/see(message) + if(!is_active()) + return 0 + to_chat(src,message) + return 1 + +/mob/proc/show_viewers(message) + for(var/mob/M in viewers()) + M.see(message) + +/mob/Stat() + ..() + . = (is_client_active(10 MINUTES)) + + if(.) + if(statpanel("Status")) + stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") + if(ticker && ticker.current_state != GAME_STATE_PREGAME) + stat("Station Time", stationtime2text()) + stat("Station Date", stationdate2text()) + stat("Round Duration", roundduration2text()) + + if(client.holder) + if(statpanel("Status")) + stat("Location:", "([x], [y], [z]) [loc]") + stat("CPU:","[world.cpu]") + stat("Instances:","[world.contents.len]") + stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") + stat("Keys Held", keys2text(client.move_keys_held | client.mod_keys_held)) + stat("Next Move ADD", dirs2text(client.next_move_dir_add)) + stat("Next Move SUB", dirs2text(client.next_move_dir_sub)) + + if(statpanel("MC")) + stat("Location:", "([x], [y], [z]) [loc]") + stat("CPU:","[world.cpu]") + stat("Instances:","[world.contents.len]") + stat("World Time:", world.time) + stat("Real time of day:", REALTIMEOFDAY) + stat(null) + if(GLOB) + GLOB.stat_entry() + else + stat("Globals:", "ERROR") + if(Master) + Master.stat_entry() + else + stat("Master Controller:", "ERROR") + if(Failsafe) + Failsafe.stat_entry() + else + stat("Failsafe Controller:", "ERROR") + if(Master) + stat(null) + for(var/datum/controller/subsystem/SS in Master.subsystems) + SS.stat_entry() + + if(statpanel("Tickets")) + GLOB.ahelp_tickets.stat_entry() + + + if(length(GLOB.sdql2_queries)) + if(statpanel("SDQL2")) + stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) + for(var/i in GLOB.sdql2_queries) + var/datum/SDQL2_query/Q = i + Q.generate_stat() + + if(listed_turf && client) + if(!TurfAdjacent(listed_turf)) + listed_turf = null + else + if(statpanel("Turf")) + stat(listed_turf) + for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue + if(A.invisibility > see_invisible) + continue + if(is_type_in_list(A, shouldnt_see)) + continue + if(A.plane > plane) + continue + stat(A) + + +// facing verbs +/mob/proc/canface() +// if(!canmove) return 0 //VOREStation Edit. Redundant check that only affects conscious proning, actual inability to turn and shift around handled by actual inabilities. + if(stat) return 0 + if(anchored) return 0 + if(transforming) return 0 + return 1 + +// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet. +/mob/proc/can_stand_overridden() + return 0 + +//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. +/mob/proc/update_canmove() + return canmove + + +/mob/proc/facedir(var/ndir) + if(!canface() || (client && (client.moving || !checkMoveCooldown()))) + DEBUG_INPUT("Denying Facedir for [src] (moving=[client?.moving])") + return 0 + set_dir(ndir) + if(buckled && buckled.buckle_movable) + buckled.set_dir(ndir) + setMoveCooldown(movement_delay()) + return 1 + + +/mob/verb/eastface() + set hidden = 1 + return facedir(client.client_dir(EAST)) + + +/mob/verb/westface() + set hidden = 1 + return facedir(client.client_dir(WEST)) + + +/mob/verb/northface() + set hidden = 1 + return facedir(client.client_dir(NORTH)) + + +/mob/verb/southface() + set hidden = 1 + return facedir(client.client_dir(SOUTH)) + + +//This might need a rename but it should replace the can this mob use things check +/mob/proc/IsAdvancedToolUser() + return 0 + +/mob/proc/Stun(amount) + if(status_flags & CANSTUN) + facing_dir = null + stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" + if(status_flags & CANSTUN) + stunned = max(amount,0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/AdjustStunned(amount) + if(status_flags & CANSTUN) + stunned = max(stunned + amount,0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/Weaken(amount) + if(status_flags & CANWEAKEN) + facing_dir = null + weakened = max(max(weakened,amount),0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/SetWeakened(amount) + if(status_flags & CANWEAKEN) + weakened = max(amount,0) + update_canmove() //can you guess what this does yet? + return + +/mob/proc/AdjustWeakened(amount) + if(status_flags & CANWEAKEN) + weakened = max(weakened + amount,0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/Paralyse(amount) + if(status_flags & CANPARALYSE) + facing_dir = null + paralysis = max(max(paralysis,amount),0) + return + +/mob/proc/SetParalysis(amount) + if(status_flags & CANPARALYSE) + paralysis = max(amount,0) + return + +/mob/proc/AdjustParalysis(amount) + if(status_flags & CANPARALYSE) + paralysis = max(paralysis + amount,0) + return + +/mob/proc/Sleeping(amount) + facing_dir = null + sleeping = max(max(sleeping,amount),0) + return + +/mob/proc/SetSleeping(amount) + sleeping = max(amount,0) + return + +/mob/proc/AdjustSleeping(amount) + sleeping = max(sleeping + amount,0) + return + +/mob/proc/Confuse(amount) + confused = max(max(confused,amount),0) + return + +/mob/proc/SetConfused(amount) + confused = max(amount,0) + return + +/mob/proc/AdjustConfused(amount) + confused = max(confused + amount,0) + return + +/mob/proc/Blind(amount) + eye_blind = max(max(eye_blind,amount),0) + return + +/mob/proc/SetBlinded(amount) + eye_blind = max(amount,0) + return + +/mob/proc/AdjustBlinded(amount) + eye_blind = max(eye_blind + amount,0) + return + +/mob/proc/Resting(amount) + facing_dir = null + resting = max(max(resting,amount),0) + update_canmove() + return + +/mob/proc/SetResting(amount) + resting = max(amount,0) + update_canmove() + return + +/mob/proc/AdjustResting(amount) + resting = max(resting + amount,0) + update_canmove() + return + +/mob/proc/AdjustLosebreath(amount) + losebreath = CLAMP(losebreath + amount, 0, 25) + +/mob/proc/SetLosebreath(amount) + losebreath = CLAMP(amount, 0, 25) + +/mob/proc/get_species() + return "" + +/mob/proc/flash_weak_pain() + flick("weak_pain",pain) + +/mob/proc/get_visible_implants(var/class = 0) + var/list/visible_implants = list() + for(var/obj/item/O in embedded) + if(O.w_class > class) + visible_implants += O + return visible_implants + +/mob/proc/embedded_needs_process() + return (embedded.len > 0) + +/mob/proc/yank_out_object() + set category = "Object" + set name = "Yank out object" + set desc = "Remove an embedded item at the cost of bleeding and pain." + set src in view(1) + + if(!isliving(usr) || !usr.checkClickCooldown()) + return + usr.setClickCooldown(20) + + if(usr.stat == 1) + to_chat(usr, "You are unconcious and cannot do that!") + return + + if(usr.restrained()) + to_chat(usr, "You are restrained and cannot do that!") + return + + var/mob/S = src + var/mob/U = usr + var/list/valid_objects = list() + var/self = null + + if(S == U) + self = 1 // Removing object from yourself. + + valid_objects = get_visible_implants(0) + if(!valid_objects.len) + if(self) + to_chat(src, "You have nothing stuck in your body that is large enough to remove.") + else + to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") + return + + var/obj/item/weapon/selection = tgui_input_list(usr, "What do you want to yank out?", "Embedded objects", valid_objects) + + if(self) + to_chat(src, "You attempt to get a good grip on [selection] in your body.") + else + to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") + + if(!do_after(U, 30)) + return + if(!selection || !S || !U) + return + + if(self) + visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") + else + visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") + valid_objects = get_visible_implants(0) + if(valid_objects.len == 1) //Yanking out last object - removing verb. + src.verbs -= /mob/proc/yank_out_object + clear_alert("embeddedobject") + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/obj/item/organ/external/affected + + for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant. + for(var/obj/item/O in organ.implants) + if(O == selection) + affected = organ + + affected.implants -= selection + H.shock_stage+=20 + affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction") + + if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-. + var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15)) + affected.wounds += I + H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50) + + if (ishuman(U)) + var/mob/living/carbon/human/human_user = U + human_user.bloody_hands(H) + + else if(issilicon(src)) + var/mob/living/silicon/robot/R = src + R.embedded -= selection + R.adjustBruteLoss(5) + R.adjustFireLoss(10) + + selection.forceMove(get_turf(src)) + U.put_in_hands(selection) + + for(var/obj/item/weapon/O in pinned) + if(O == selection) + pinned -= O + if(!pinned.len) + anchored = FALSE + return 1 + +//Check for brain worms in head. +/mob/proc/has_brain_worms() + + for(var/I in contents) + if(istype(I,/mob/living/simple_mob/animal/borer)) + return I + + return 0 + +/mob/proc/updateicon() + return + +// Please always use this proc, never just set the var directly. +/mob/proc/set_stat(var/new_stat) + . = (stat != new_stat) + stat = new_stat + +/mob/verb/face_direction() + + set name = "Face Direction" + set category = "IC" + set src = usr + + set_face_dir() + + if(!facing_dir) + to_chat(usr, "You are now not facing anything.") + else + to_chat(usr, "You are now facing [dir2text(facing_dir)].") + +/mob/proc/set_face_dir(var/newdir) + if(newdir == facing_dir) + facing_dir = null + else if(newdir) + set_dir(newdir) + facing_dir = newdir + else if(facing_dir) + facing_dir = null + else + set_dir(dir) + facing_dir = dir + +/mob/set_dir() + if(facing_dir) + if(!canface() || lying || buckled || restrained()) + facing_dir = null + else if(dir != facing_dir) + return ..(facing_dir) + else + return ..() + +/mob/verb/northfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(NORTH)) + +/mob/verb/southfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(SOUTH)) + +/mob/verb/eastfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(EAST)) + +/mob/verb/westfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(WEST)) + +// Begin VOREstation edit +/mob/verb/shiftnorth() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_y <= (default_pixel_y + 16)) + pixel_y++ + is_shifted = TRUE + +/mob/verb/shiftsouth() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_y >= (default_pixel_y - 16)) + pixel_y-- + is_shifted = TRUE + +/mob/verb/shiftwest() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_x >= (default_pixel_x - 16)) + pixel_x-- + is_shifted = TRUE + +/mob/verb/shifteast() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_x <= (default_pixel_x + 16)) + pixel_x++ + is_shifted = TRUE +// End VOREstation edit + +/mob/proc/adjustEarDamage() + return + +/mob/proc/setEarDamage() + return + +// Set client view distance (size of client's screen). Returns TRUE if anything changed. +/mob/proc/set_viewsize(var/new_view = world.view) + if (client && new_view != client.view) + client.view = new_view + return TRUE + return FALSE + +//Throwing stuff + +/mob/proc/toggle_throw_mode() + if (src.in_throw_mode) + throw_mode_off() + else + throw_mode_on() + +/mob/proc/throw_mode_off() + src.in_throw_mode = 0 + if(src.throw_icon) //in case we don't have the HUD and we use the hotkey + src.throw_icon.icon_state = "act_throw_off" + +/mob/proc/throw_mode_on() + src.in_throw_mode = 1 + if(src.throw_icon) + src.throw_icon.icon_state = "act_throw_on" + +/mob/proc/isSynthetic() + return 0 + +/mob/proc/is_muzzled() + return 0 + +//Exploitable Info Update + +/mob/proc/amend_exploitable(var/obj/item/I) + if(istype(I)) + exploit_addons |= I + var/exploitmsg = html_decode("\n" + "Has " + I.name + ".") + exploit_record += exploitmsg + +/client/proc/check_has_body_select() + return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) + +/client/verb/body_toggle_head() + set name = "body-toggle-head" + set hidden = 1 + toggle_zone_sel(list(BP_HEAD, O_EYES, O_MOUTH)) + +/client/verb/body_r_arm() + set name = "body-r-arm" + set hidden = 1 + toggle_zone_sel(list(BP_R_ARM,BP_R_HAND)) + +/client/verb/body_l_arm() + set name = "body-l-arm" + set hidden = 1 + toggle_zone_sel(list(BP_L_ARM,BP_L_HAND)) + +/client/verb/body_chest() + set name = "body-chest" + set hidden = 1 + toggle_zone_sel(list(BP_TORSO)) + +/client/verb/body_groin() + set name = "body-groin" + set hidden = 1 + toggle_zone_sel(list(BP_GROIN)) + +/client/verb/body_r_leg() + set name = "body-r-leg" + set hidden = 1 + toggle_zone_sel(list(BP_R_LEG,BP_R_FOOT)) + +/client/verb/body_l_leg() + set name = "body-l-leg" + set hidden = 1 + toggle_zone_sel(list(BP_L_LEG,BP_L_FOOT)) + +/client/proc/toggle_zone_sel(list/zones) + if(!check_has_body_select()) + return + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones)) + +// This handles setting the client's color variable, which makes everything look a specific color. +// This proc is here so it can be called without needing to check if the client exists, or if the client relogs. +// This is for inheritence since /mob/living will serve most cases. If you need ghosts to use this you'll have to implement that yourself. +/mob/proc/update_client_color() + if(client && client.color) + animate(client, color = null, time = 10) + return + +/mob/proc/swap_hand() + return + +//Throwing stuff +/mob/proc/throw_item(atom/target) + return + +/mob/proc/will_show_tooltip() + if(alpha <= EFFECTIVE_INVIS) + return FALSE + return TRUE + +/mob/MouseEntered(location, control, params) + if(usr != src && usr.is_preference_enabled(/datum/client_preference/mob_tooltips) && src.will_show_tooltip()) + openToolTip(user = usr, tip_src = src, params = params, title = get_nametag_name(usr), content = get_nametag_desc(usr)) + + ..() + +/mob/MouseDown() + closeToolTip(usr) //No reason not to, really + + ..() + +/mob/MouseExited() + closeToolTip(usr) //No reason not to, really + + ..() + +// Manages a global list of mobs with clients attached, indexed by z-level. +/mob/proc/update_client_z(new_z) // +1 to register, null to unregister. + if(registered_z != new_z) + if(registered_z) + GLOB.players_by_zlevel[registered_z] -= src + if(client) + if(new_z) + GLOB.players_by_zlevel[new_z] += src + registered_z = new_z + else + registered_z = null + +GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list) +/mob/living/update_client_z(new_z) + var/precall_reg_z = registered_z + . = ..() // will update registered_z if necessary + if(precall_reg_z != registered_z) // parent did work, let's do work too + if(precall_reg_z) + GLOB.living_players_by_zlevel[precall_reg_z] -= src + if(registered_z) + GLOB.living_players_by_zlevel[registered_z] += src + +/mob/onTransitZ(old_z, new_z) + ..() + update_client_z(new_z) + +/mob/cloak() + . = ..() + if(client && cloaked_selfimage) + client.images += cloaked_selfimage + +/mob/uncloak() + if(client && cloaked_selfimage) + client.images -= cloaked_selfimage + return ..() + +/mob/get_cloaked_selfimage() + var/icon/selficon = getCompoundIcon(src) + selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White + var/image/selfimage = image(selficon) + selfimage.color = "#0000FF" + selfimage.alpha = 100 + selfimage.layer = initial(layer) + selfimage.plane = initial(plane) + selfimage.loc = src + + return selfimage + +/mob/proc/GetAltName() + return "" + +/mob/proc/get_ghost(even_if_they_cant_reenter = 0) + if(mind) + return mind.get_ghost(even_if_they_cant_reenter) + +/mob/proc/grab_ghost(force) + if(mind) + return mind.grab_ghost(force = force) +======= +/mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game. + mob_list -= src + dead_mob_list -= src + living_mob_list -= src + unset_machine() + qdel(hud_used) + clear_fullscreen() + if(client) + for(var/obj/screen/movable/spell_master/spell_master in spell_masters) + qdel(spell_master) + remove_screen_obj_references() + client.screen = list() + if(mind && mind.current == src) + spellremove(src) + ghostize() + QDEL_NULL(plane_holder) + ..() + return QDEL_HINT_HARDDEL_NOW + +/mob/proc/remove_screen_obj_references() + hands = null + pullin = null + purged = null + internals = null + i_select = null + m_select = null + healths = null + throw_icon = null + pain = null + item_use_icon = null + gun_move_icon = null + gun_setting_icon = null + spell_masters = null + zone_sel = null + +/mob/Initialize() + mob_list += src + if(stat == DEAD) + dead_mob_list += src + else + living_mob_list += src + lastarea = get_area(src) + set_focus(src) // VOREStation Add - Key Handling + hook_vr("mob_new",list(src)) //VOREStation Code + update_transform() // Some mobs may start bigger or smaller than normal. + return ..() + +/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) + + if(!client && !teleop) return + + if (type) + if((type & VISIBLE_MESSAGE) && (is_blind() || paralysis) )//Vision related + if (!( alt )) + return + else + msg = alt + type = alt_type + if ((type & AUDIBLE_MESSAGE) && is_deaf())//Hearing related + if (!( alt )) + return + else + msg = alt + type = alt_type + if ((type & VISIBLE_MESSAGE) && (sdisabilities & BLIND)) + return + // Added voice muffling for Issue 41. + if(stat == UNCONSCIOUS || sleeping > 0) + to_chat(src, "... You can almost hear someone talking ...") + else + to_chat(src,msg) + if(teleop) + to_chat(teleop, create_text_tag("body", "BODY:", teleop) + "[msg]") + return + +// Show a message to all mobs and objects in sight of this one +// This would be for visible actions by the src mob +// message is the message output to anyone who can see e.g. "[src] does something!" +// self_message (optional) is what the src mob sees e.g. "You do something!" +// blind_message (optional) is what blind people will hear e.g. "You hear something!" +/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null, var/range = world.view, var/runemessage) + if(self_message) + if(LAZYLEN(exclude_mobs)) + exclude_mobs |= src + else + exclude_mobs = list(src) + src.show_message(self_message, 1, blind_message, 2) + if(isnull(runemessage)) + runemessage = -1 + . = ..(message, blind_message, exclude_mobs, range, runemessage) // Really not ideal that atom/visible_message has different arg numbering :( + +// Returns an amount of power drawn from the object (-1 if it's not viable). +// If drain_check is set it will not actually drain power, just return a value. +// If surge is set, it will destroy/damage the recipient and not return any power. +// Not sure where to define this, so it can sit here for the rest of time. +/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) + return -1 + +// Show a message to all mobs and objects in earshot of this one +// This would be for audible actions by the src mob +// message is the message output to anyone who can hear. +// self_message (optional) is what the src mob hears. +// deaf_message (optional) is what deaf people will see. +// hearing_distance (optional) is the range, how many tiles away the message can be heard. +/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message, var/radio_message, var/runemessage) + + var/range = hearing_distance || world.view + var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE) + + var/list/hearing_mobs = hear["mobs"] + var/list/hearing_objs = hear["objs"] + + if(isnull(runemessage)) + runemessage = -1 // Symmetry with mob/audible_message, despite the fact this one doesn't call parent. Maybe it should! + + if(radio_message) + for(var/obj/O as anything in hearing_objs) + O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) + else + for(var/obj/O as anything in hearing_objs) + O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) + + for(var/mob/M as anything in hearing_mobs) + var/msg = message + if(self_message && M==src) + msg = self_message + M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) + if(runemessage != -1) + M.create_chat_message(src, "[runemessage || message]", FALSE, list("emote"), audible = FALSE) + +/mob/proc/findname(msg) + for(var/mob/M in mob_list) + if (M.real_name == text("[]", msg)) + return M + return 0 + +/mob/proc/Life() +// if(organStructure) +// organStructure.ProcessOrgans() + return + +#define UNBUCKLED 0 +#define PARTIALLY_BUCKLED 1 +#define FULLY_BUCKLED 2 +/mob/proc/buckled() + // Preliminary work for a future buckle rewrite, + // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting) + if(!buckled) + return UNBUCKLED + return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED + +/mob/proc/is_blind() + return ((sdisabilities & BLIND) || blinded || incapacitated(INCAPACITATION_KNOCKOUT)) + +/mob/proc/is_deaf() + return ((sdisabilities & DEAF) || ear_deaf || incapacitated(INCAPACITATION_KNOCKOUT)) + +/mob/proc/is_physically_disabled() + return incapacitated(INCAPACITATION_DISABLED) + +/mob/proc/cannot_stand() + return incapacitated(INCAPACITATION_KNOCKDOWN) + +/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT) + if ((incapacitation_flags & INCAPACITATION_STUNNED) && stunned) + return 1 + + if ((incapacitation_flags & INCAPACITATION_FORCELYING) && (weakened || resting)) + return 1 + + if ((incapacitation_flags & INCAPACITATION_KNOCKOUT) && (stat || paralysis || sleeping || (status_flags & FAKEDEATH))) + return 1 + + if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained()) + return 1 + + if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY))) + var/buckling = buckled() + if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY)) + return 1 + if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY)) + return 1 + + return 0 + +#undef UNBUCKLED +#undef PARTIALLY_BUCKLED +#undef FULLY_BUCKLED + +/mob/proc/restrained() + return + +/mob/proc/reset_view(atom/A) + if (client) + if (istype(A, /atom/movable)) + client.perspective = EYE_PERSPECTIVE + client.eye = A + else + if (isturf(loc)) + client.eye = client.mob + client.perspective = MOB_PERSPECTIVE + else + client.perspective = EYE_PERSPECTIVE + client.eye = loc + return TRUE + +/mob/verb/pointed(atom/A as mob|obj|turf in view()) + set name = "Point To" + set category = "Object" + + if(!src || !isturf(src.loc) || !(A in view(src.loc))) + return 0 + if(istype(A, /obj/effect/decal/point)) + return 0 + + var/turf/tile = get_turf(A) + if (!tile) + return 0 + + var/turf/our_tile = get_turf(src) + var/obj/visual = new /obj/effect/decal/point(our_tile) + visual.invisibility = invisibility + visual.plane = ABOVE_PLANE + visual.layer = FLY_LAYER + + animate(visual, + pixel_x = (tile.x - our_tile.x) * world.icon_size + A.pixel_x, + pixel_y = (tile.y - our_tile.y) * world.icon_size + A.pixel_y, + time = 1.7, + easing = EASE_OUT) + + QDEL_IN(visual, 2 SECONDS) //Better qdel + + face_atom(A) + return 1 + + +/mob/proc/ret_grab(list/L, flag) + return + +/mob/verb/mode() + set name = "Activate Held Object" + set category = "Object" + set src = usr + + return + +/* +/mob/verb/dump_source() + + var/master = "
    "
    +	for(var/t in typesof(/area))
    +		master += text("[]\n", t)
    +		//Foreach goto(26)
    +	src << browse(master)
    +	return
    +*/
    +
    +/mob/verb/memory()
    +	set name = "Notes"
    +	set category = "IC"
    +	if(mind)
    +		mind.show_memory(src)
    +	else
    +		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    +
    +/mob/verb/add_memory(msg as message)
    +	set name = "Add Note"
    +	set category = "IC"
    +
    +	msg = sanitize(msg)
    +
    +	if(mind)
    +		mind.store_memory(msg)
    +	else
    +		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    +
    +/mob/proc/store_memory(msg as message, popup, sane = 1)
    +	msg = copytext(msg, 1, MAX_MESSAGE_LEN)
    +
    +	if (sane)
    +		msg = sanitize(msg)
    +
    +	if (length(memory) == 0)
    +		memory += msg
    +	else
    +		memory += "
    [msg]" + + if (popup) + memory() + +/mob/proc/update_flavor_text() + set src in usr + if(usr != src) + to_chat(usr, "No.") + var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes + + if(msg != null) + flavor_text = msg + +/mob/proc/warn_flavor_changed() + if(flavor_text && flavor_text != "") // don't spam people that don't use it! + to_chat(src, "

    OOC Warning:

    ") + to_chat(src, "Your flavor text is likely out of date! Change") + +/mob/proc/print_flavor_text() + if (flavor_text && flavor_text != "") + var/msg = replacetext(flavor_text, "\n", " ") + if(length(msg) <= 40) + return "[msg]" + else + return "[copytext_preserve_html(msg, 1, 37)]... More..." + +/* +/mob/verb/help() + set name = "Help" + src << browse('html/help.html', "window=help") + return +*/ + +/mob/proc/set_respawn_timer(var/time) + // Try to figure out what time to use + + // Special cases, can never respawn + if(ticker?.mode?.deny_respawn) + time = -1 + else if(!config.abandon_allowed) + time = -1 + else if(!config.respawn) + time = -1 + + // Special case for observing before game start + else if(ticker?.current_state <= GAME_STATE_SETTING_UP) + time = 1 MINUTE + + // Wasn't given a time, use the config time + else if(!time) + time = config.respawn_time + + var/keytouse = ckey + // Try harder to find a key to use + if(!keytouse && key) + keytouse = ckey(key) + else if(!keytouse && mind?.key) + keytouse = ckey(mind.key) + + GLOB.respawn_timers[keytouse] = world.time + time + +/mob/observer/dead/set_respawn_timer() + if(config.antag_hud_restricted && has_enabled_antagHUD) + ..(-1) + else + return // Don't set it, no need + +/mob/verb/abandon_mob() + set name = "Return to Menu" + set category = "OOC" + + if(stat != DEAD || !ticker) + to_chat(usr, "You must be dead to use this!") + return + + // Final chance to abort "respawning" + if(mind && timeofdeath) // They had spawned before + var/choice = tgui_alert(usr, "Returning to the menu will prevent your character from being revived in-round. Are you sure?", "Confirmation", list("No, wait", "Yes, leave")) + if(choice == "No, wait") + return + + // Beyond this point, you're going to respawn + to_chat(usr, config.respawn_message) + + if(!client) + log_game("[usr.key] AM failed due to disconnect.") + return + client.screen.Cut() + client.screen += client.void + if(!client) + log_game("[usr.key] AM failed due to disconnect.") + return + + announce_ghost_joinleave(client, 0) + + var/mob/new_player/M = new /mob/new_player() + if(!client) + log_game("[usr.key] AM failed due to disconnect.") + qdel(M) + return + + M.key = key + if(M.mind) + M.mind.reset() + return + +/client/verb/changes() + set name = "Changelog" + set category = "OOC" + src << browse('html/changelog.html', "window=changes;size=675x650") + if(prefs.lastchangelog != changelog_hash) + prefs.lastchangelog = changelog_hash + SScharacter_setup.queue_preferences_save(prefs) + winset(src, "rpane.changelog", "background-color=none;font-style=;") + +/mob/verb/observe() + set name = "Observe" + set category = "OOC" + var/is_admin = 0 + + if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT)) + is_admin = 1 + else if(stat != DEAD || istype(src, /mob/new_player)) + to_chat(usr, "You must be observing to use this!") + return + + if(is_admin && stat == DEAD) + is_admin = 0 + + var/list/targets = list() + + + targets += observe_list_format(nuke_disks) + targets += observe_list_format(all_singularities) + targets += getmobs() + targets += observe_list_format(sortAtom(mechas_list)) + targets += observe_list_format(SSshuttles.ships) + + client.perspective = EYE_PERSPECTIVE + + var/eye_name = null + + var/ok = "[is_admin ? "Admin Observe" : "Observe"]" + eye_name = tgui_input_list(usr, "Select something to [ok]:", "Select Target", targets) + + if (!eye_name) + return + + var/mob/mob_eye = targets[eye_name] + + if(client && mob_eye) + client.eye = mob_eye + if (is_admin) + client.adminobs = 1 + if(mob_eye == client.mob || client.eye == client.mob) + client.adminobs = 0 + +/mob/verb/cancel_camera() + set name = "Cancel Camera View" + set category = "OOC" + unset_machine() + reset_view(null) + +/mob/Topic(href, href_list) + if(href_list["mach_close"]) + var/t1 = text("window=[href_list["mach_close"]]") + unset_machine() + src << browse(null, t1) + + if(href_list["flavor_more"]) + usr << browse(text("[][]", name, replacetext(flavor_text, "\n", "
    ")), text("window=[];size=500x200", name)) + onclose(usr, "[name]") + if(href_list["flavor_change"]) + update_flavor_text() +// ..() + return + + +/mob/proc/pull_damage() + return 0 + +/mob/verb/stop_pulling() + + set name = "Stop Pulling" + set category = "IC" + + if(pulling) + if(ishuman(pulling)) + var/mob/living/carbon/human/H = pulling + visible_message(SPAN_WARNING("\The [src] lets go of \the [H]."), SPAN_NOTICE("You let go of \the [H]."), exclude_mobs = list(H)) + if(!H.stat) + to_chat(H, SPAN_WARNING("\The [src] lets go of you.")) + pulling.pulledby = null + pulling = null + if(pullin) + pullin.icon_state = "pull0" + +/mob/proc/start_pulling(var/atom/movable/AM) + + if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! + return + + if (AM.anchored) + to_chat(src, "It won't budge!") + return + + var/mob/M = AM + if(ismob(AM)) + + if(!can_pull_mobs || !can_pull_size) + to_chat(src, "They won't budge!") + return + + if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) + to_chat(src, "[M] is too large for you to move!") + return + + if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) + to_chat(src, "[M] is too heavy for you to move!") + return + + // If your size is larger than theirs and you have some + // kind of mob pull value AT ALL, you will be able to pull + // them, so don't bother checking that explicitly. + + if(M.grabbed_by.len) + // Only start pulling when nobody else has a grab on them + . = 1 + for(var/obj/item/weapon/grab/G in M.grabbed_by) + if(G.assailant != usr) + . = 0 + else + qdel(G) + if(!.) + to_chat(src, "Somebody has a grip on them!") + return + + if(!iscarbon(src)) + M.LAssailant = null + else + M.LAssailant = usr + + else if(isobj(AM)) + var/obj/I = AM + if(!can_pull_size || can_pull_size < I.w_class) + to_chat(src, "It won't budge!") + return + + if(pulling) + var/pulling_old = pulling + stop_pulling() + // Are we pulling the same thing twice? Just stop pulling. + if(pulling_old == AM) + return + + src.pulling = AM + AM.pulledby = src + + if(pullin) + pullin.icon_state = "pull1" + + if(ishuman(AM)) + var/mob/living/carbon/human/H = AM + if(H.lying) // If they're on the ground we're probably dragging their arms to move them + visible_message(SPAN_WARNING("\The [src] leans down and grips \the [H]'s arms."), SPAN_NOTICE("You lean down and grip \the [H]'s arms."), exclude_mobs = list(H)) + if(!H.stat) + to_chat(H, SPAN_WARNING("\The [src] leans down and grips your arms.")) + else //Otherwise we're probably just holding their arm to lead them somewhere + visible_message(SPAN_WARNING("\The [src] grips \the [H]'s arm."), SPAN_NOTICE("You grip \the [H]'s arm."), exclude_mobs = list(H)) + if(!H.stat) + to_chat(H, SPAN_WARNING("\The [src] grips your arm.")) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25) //Quieter than hugging/grabbing but we still want some audio feedback + + if(H.pull_damage()) + to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.") + + //Attempted fix for people flying away through space when cuffed and dragged. + if(ismob(AM)) + var/mob/pulled = AM + pulled.inertia_dir = 0 + +/mob/proc/can_use_hands() + return + +/mob/proc/is_active() + return (0 >= usr.stat) + +/mob/proc/is_dead() + return stat == DEAD + +/mob/proc/is_mechanical() + if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI")) + return 1 + return istype(src, /mob/living/silicon) || get_species() == "Machine" + +/mob/proc/is_ready() + return client && !!mind + +/mob/proc/get_gender() + return gender + +/mob/proc/see(message) + if(!is_active()) + return 0 + to_chat(src,message) + return 1 + +/mob/proc/show_viewers(message) + for(var/mob/M in viewers()) + M.see(message) + +/mob/Stat() + ..() + . = (is_client_active(10 MINUTES)) + + if(.) + if(statpanel("Status")) + stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") + if(ticker && ticker.current_state != GAME_STATE_PREGAME) + stat("Station Time", stationtime2text()) + stat("Station Date", stationdate2text()) + stat("Round Duration", roundduration2text()) + + if(client.holder) + if(statpanel("Status")) + stat("Location:", "([x], [y], [z]) [loc]") + stat("CPU:","[world.cpu]") + stat("Instances:","[world.contents.len]") + stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") + stat("Keys Held", keys2text(client.move_keys_held | client.mod_keys_held)) + stat("Next Move ADD", dirs2text(client.next_move_dir_add)) + stat("Next Move SUB", dirs2text(client.next_move_dir_sub)) + + if(statpanel("MC")) + stat("Location:", "([x], [y], [z]) [loc]") + stat("CPU:","[world.cpu]") + stat("Instances:","[world.contents.len]") + stat("World Time:", world.time) + stat("Real time of day:", REALTIMEOFDAY) + stat(null) + if(GLOB) + GLOB.stat_entry() + else + stat("Globals:", "ERROR") + if(Master) + Master.stat_entry() + else + stat("Master Controller:", "ERROR") + if(Failsafe) + Failsafe.stat_entry() + else + stat("Failsafe Controller:", "ERROR") + if(Master) + stat(null) + for(var/datum/controller/subsystem/SS in Master.subsystems) + SS.stat_entry() + + if(statpanel("Tickets")) + GLOB.ahelp_tickets.stat_entry() + + + if(length(GLOB.sdql2_queries)) + if(statpanel("SDQL2")) + stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) + for(var/datum/SDQL2_query/Q as anything in GLOB.sdql2_queries) + Q.generate_stat() + + if(listed_turf && client) + if(!TurfAdjacent(listed_turf)) + listed_turf = null + else + if(statpanel("Turf")) + stat(listed_turf) + for(var/atom/A in listed_turf) + if(!A.mouse_opacity) + continue + if(A.invisibility > see_invisible) + continue + if(is_type_in_list(A, shouldnt_see)) + continue + if(A.plane > plane) + continue + stat(A) + + +// facing verbs +/mob/proc/canface() +// if(!canmove) return 0 //VOREStation Edit. Redundant check that only affects conscious proning, actual inability to turn and shift around handled by actual inabilities. + if(stat) return 0 + if(anchored) return 0 + if(transforming) return 0 + return 1 + +// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet. +/mob/proc/can_stand_overridden() + return 0 + +//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. +/mob/proc/update_canmove() + return canmove + + +/mob/proc/facedir(var/ndir) + if(!canface() || (client && (client.moving || !checkMoveCooldown()))) + DEBUG_INPUT("Denying Facedir for [src] (moving=[client?.moving])") + return 0 + set_dir(ndir) + if(buckled && buckled.buckle_movable) + buckled.set_dir(ndir) + setMoveCooldown(movement_delay()) + return 1 + + +/mob/verb/eastface() + set hidden = 1 + return facedir(client.client_dir(EAST)) + + +/mob/verb/westface() + set hidden = 1 + return facedir(client.client_dir(WEST)) + + +/mob/verb/northface() + set hidden = 1 + return facedir(client.client_dir(NORTH)) + + +/mob/verb/southface() + set hidden = 1 + return facedir(client.client_dir(SOUTH)) + + +//This might need a rename but it should replace the can this mob use things check +/mob/proc/IsAdvancedToolUser() + return 0 + +/mob/proc/Stun(amount) + if(status_flags & CANSTUN) + facing_dir = null + stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" + if(status_flags & CANSTUN) + stunned = max(amount,0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/AdjustStunned(amount) + if(status_flags & CANSTUN) + stunned = max(stunned + amount,0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/Weaken(amount) + if(status_flags & CANWEAKEN) + facing_dir = null + weakened = max(max(weakened,amount),0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/SetWeakened(amount) + if(status_flags & CANWEAKEN) + weakened = max(amount,0) + update_canmove() //can you guess what this does yet? + return + +/mob/proc/AdjustWeakened(amount) + if(status_flags & CANWEAKEN) + weakened = max(weakened + amount,0) + update_canmove() //updates lying, canmove and icons + return + +/mob/proc/Paralyse(amount) + if(status_flags & CANPARALYSE) + facing_dir = null + paralysis = max(max(paralysis,amount),0) + return + +/mob/proc/SetParalysis(amount) + if(status_flags & CANPARALYSE) + paralysis = max(amount,0) + return + +/mob/proc/AdjustParalysis(amount) + if(status_flags & CANPARALYSE) + paralysis = max(paralysis + amount,0) + return + +/mob/proc/Sleeping(amount) + facing_dir = null + sleeping = max(max(sleeping,amount),0) + return + +/mob/proc/SetSleeping(amount) + sleeping = max(amount,0) + return + +/mob/proc/AdjustSleeping(amount) + sleeping = max(sleeping + amount,0) + return + +/mob/proc/Confuse(amount) + confused = max(max(confused,amount),0) + return + +/mob/proc/SetConfused(amount) + confused = max(amount,0) + return + +/mob/proc/AdjustConfused(amount) + confused = max(confused + amount,0) + return + +/mob/proc/Blind(amount) + eye_blind = max(max(eye_blind,amount),0) + return + +/mob/proc/SetBlinded(amount) + eye_blind = max(amount,0) + return + +/mob/proc/AdjustBlinded(amount) + eye_blind = max(eye_blind + amount,0) + return + +/mob/proc/Resting(amount) + facing_dir = null + resting = max(max(resting,amount),0) + update_canmove() + return + +/mob/proc/SetResting(amount) + resting = max(amount,0) + update_canmove() + return + +/mob/proc/AdjustResting(amount) + resting = max(resting + amount,0) + update_canmove() + return + +/mob/proc/AdjustLosebreath(amount) + losebreath = CLAMP(losebreath + amount, 0, 25) + +/mob/proc/SetLosebreath(amount) + losebreath = CLAMP(amount, 0, 25) + +/mob/proc/get_species() + return "" + +/mob/proc/flash_weak_pain() + flick("weak_pain",pain) + +/mob/proc/get_visible_implants(var/class = 0) + var/list/visible_implants = list() + for(var/obj/item/O in embedded) + if(O.w_class > class) + visible_implants += O + return visible_implants + +/mob/proc/embedded_needs_process() + return (embedded.len > 0) + +/mob/proc/yank_out_object() + set category = "Object" + set name = "Yank out object" + set desc = "Remove an embedded item at the cost of bleeding and pain." + set src in view(1) + + if(!isliving(usr) || !usr.checkClickCooldown()) + return + usr.setClickCooldown(20) + + if(usr.stat == 1) + to_chat(usr, "You are unconcious and cannot do that!") + return + + if(usr.restrained()) + to_chat(usr, "You are restrained and cannot do that!") + return + + var/mob/S = src + var/mob/U = usr + var/list/valid_objects = list() + var/self = null + + if(S == U) + self = 1 // Removing object from yourself. + + valid_objects = get_visible_implants(0) + if(!valid_objects.len) + if(self) + to_chat(src, "You have nothing stuck in your body that is large enough to remove.") + else + to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") + return + + var/obj/item/weapon/selection = tgui_input_list(usr, "What do you want to yank out?", "Embedded objects", valid_objects) + + if(self) + to_chat(src, "You attempt to get a good grip on [selection] in your body.") + else + to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") + + if(!do_after(U, 30)) + return + if(!selection || !S || !U) + return + + if(self) + visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") + else + visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") + valid_objects = get_visible_implants(0) + if(valid_objects.len == 1) //Yanking out last object - removing verb. + src.verbs -= /mob/proc/yank_out_object + clear_alert("embeddedobject") + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/obj/item/organ/external/affected + + for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant. + for(var/obj/item/O in organ.implants) + if(O == selection) + affected = organ + + affected.implants -= selection + H.shock_stage+=20 + affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction") + + if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-. + var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15)) + affected.wounds += I + H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50) + + if (ishuman(U)) + var/mob/living/carbon/human/human_user = U + human_user.bloody_hands(H) + + else if(issilicon(src)) + var/mob/living/silicon/robot/R = src + R.embedded -= selection + R.adjustBruteLoss(5) + R.adjustFireLoss(10) + + selection.forceMove(get_turf(src)) + U.put_in_hands(selection) + + for(var/obj/item/weapon/O in pinned) + if(O == selection) + pinned -= O + if(!pinned.len) + anchored = FALSE + return 1 + +//Check for brain worms in head. +/mob/proc/has_brain_worms() + + for(var/I in contents) + if(istype(I,/mob/living/simple_mob/animal/borer)) + return I + + return 0 + +/mob/proc/updateicon() + return + +// Please always use this proc, never just set the var directly. +/mob/proc/set_stat(var/new_stat) + . = (stat != new_stat) + stat = new_stat + +/mob/verb/face_direction() + + set name = "Face Direction" + set category = "IC" + set src = usr + + set_face_dir() + + if(!facing_dir) + to_chat(usr, "You are now not facing anything.") + else + to_chat(usr, "You are now facing [dir2text(facing_dir)].") + +/mob/proc/set_face_dir(var/newdir) + if(newdir == facing_dir) + facing_dir = null + else if(newdir) + set_dir(newdir) + facing_dir = newdir + else if(facing_dir) + facing_dir = null + else + set_dir(dir) + facing_dir = dir + +/mob/set_dir() + if(facing_dir) + if(!canface() || lying || buckled || restrained()) + facing_dir = null + else if(dir != facing_dir) + return ..(facing_dir) + else + return ..() + +/mob/verb/northfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(NORTH)) + +/mob/verb/southfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(SOUTH)) + +/mob/verb/eastfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(EAST)) + +/mob/verb/westfaceperm() + set hidden = 1 + set_face_dir(client.client_dir(WEST)) + +// Begin VOREstation edit +/mob/verb/shiftnorth() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_y <= (default_pixel_y + 16)) + pixel_y++ + is_shifted = TRUE + +/mob/verb/shiftsouth() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_y >= (default_pixel_y - 16)) + pixel_y-- + is_shifted = TRUE + +/mob/verb/shiftwest() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_x >= (default_pixel_x - 16)) + pixel_x-- + is_shifted = TRUE + +/mob/verb/shifteast() + set hidden = TRUE + if(!canface()) + return FALSE + if(pixel_x <= (default_pixel_x + 16)) + pixel_x++ + is_shifted = TRUE +// End VOREstation edit + +/mob/proc/adjustEarDamage() + return + +/mob/proc/setEarDamage() + return + +// Set client view distance (size of client's screen). Returns TRUE if anything changed. +/mob/proc/set_viewsize(var/new_view = world.view) + if (client && new_view != client.view) + client.view = new_view + return TRUE + return FALSE + +//Throwing stuff + +/mob/proc/toggle_throw_mode() + if (src.in_throw_mode) + throw_mode_off() + else + throw_mode_on() + +/mob/proc/throw_mode_off() + src.in_throw_mode = 0 + if(src.throw_icon) //in case we don't have the HUD and we use the hotkey + src.throw_icon.icon_state = "act_throw_off" + +/mob/proc/throw_mode_on() + src.in_throw_mode = 1 + if(src.throw_icon) + src.throw_icon.icon_state = "act_throw_on" + +/mob/proc/isSynthetic() + return 0 + +/mob/proc/is_muzzled() + return 0 + +//Exploitable Info Update + +/mob/proc/amend_exploitable(var/obj/item/I) + if(istype(I)) + exploit_addons |= I + var/exploitmsg = html_decode("\n" + "Has " + I.name + ".") + exploit_record += exploitmsg + +/client/proc/check_has_body_select() + return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) + +/client/verb/body_toggle_head() + set name = "body-toggle-head" + set hidden = 1 + toggle_zone_sel(list(BP_HEAD, O_EYES, O_MOUTH)) + +/client/verb/body_r_arm() + set name = "body-r-arm" + set hidden = 1 + toggle_zone_sel(list(BP_R_ARM,BP_R_HAND)) + +/client/verb/body_l_arm() + set name = "body-l-arm" + set hidden = 1 + toggle_zone_sel(list(BP_L_ARM,BP_L_HAND)) + +/client/verb/body_chest() + set name = "body-chest" + set hidden = 1 + toggle_zone_sel(list(BP_TORSO)) + +/client/verb/body_groin() + set name = "body-groin" + set hidden = 1 + toggle_zone_sel(list(BP_GROIN)) + +/client/verb/body_r_leg() + set name = "body-r-leg" + set hidden = 1 + toggle_zone_sel(list(BP_R_LEG,BP_R_FOOT)) + +/client/verb/body_l_leg() + set name = "body-l-leg" + set hidden = 1 + toggle_zone_sel(list(BP_L_LEG,BP_L_FOOT)) + +/client/proc/toggle_zone_sel(list/zones) + if(!check_has_body_select()) + return + var/obj/screen/zone_sel/selector = mob.zone_sel + selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones)) + +// This handles setting the client's color variable, which makes everything look a specific color. +// This proc is here so it can be called without needing to check if the client exists, or if the client relogs. +// This is for inheritence since /mob/living will serve most cases. If you need ghosts to use this you'll have to implement that yourself. +/mob/proc/update_client_color() + if(client && client.color) + animate(client, color = null, time = 10) + return + +/mob/proc/swap_hand() + return + +//Throwing stuff +/mob/proc/throw_item(atom/target) + return + +/mob/proc/will_show_tooltip() + if(alpha <= EFFECTIVE_INVIS) + return FALSE + return TRUE + +/mob/MouseEntered(location, control, params) + if(usr != src && usr.is_preference_enabled(/datum/client_preference/mob_tooltips) && src.will_show_tooltip()) + openToolTip(user = usr, tip_src = src, params = params, title = get_nametag_name(usr), content = get_nametag_desc(usr)) + + ..() + +/mob/MouseDown() + closeToolTip(usr) //No reason not to, really + + ..() + +/mob/MouseExited() + closeToolTip(usr) //No reason not to, really + + ..() + +// Manages a global list of mobs with clients attached, indexed by z-level. +/mob/proc/update_client_z(new_z) // +1 to register, null to unregister. + if(registered_z != new_z) + if(registered_z) + GLOB.players_by_zlevel[registered_z] -= src + if(client) + if(new_z) + GLOB.players_by_zlevel[new_z] += src + registered_z = new_z + else + registered_z = null + +GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list) +/mob/living/update_client_z(new_z) + var/precall_reg_z = registered_z + . = ..() // will update registered_z if necessary + if(precall_reg_z != registered_z) // parent did work, let's do work too + if(precall_reg_z) + GLOB.living_players_by_zlevel[precall_reg_z] -= src + if(registered_z) + GLOB.living_players_by_zlevel[registered_z] += src + +/mob/onTransitZ(old_z, new_z) + ..() + update_client_z(new_z) + +/mob/cloak() + . = ..() + if(client && cloaked_selfimage) + client.images += cloaked_selfimage + +/mob/uncloak() + if(client && cloaked_selfimage) + client.images -= cloaked_selfimage + return ..() + +/mob/get_cloaked_selfimage() + var/icon/selficon = getCompoundIcon(src) + selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White + var/image/selfimage = image(selficon) + selfimage.color = "#0000FF" + selfimage.alpha = 100 + selfimage.layer = initial(layer) + selfimage.plane = initial(plane) + selfimage.loc = src + + return selfimage + +/mob/proc/GetAltName() + return "" + +/mob/proc/get_ghost(even_if_they_cant_reenter = 0) + if(mind) + return mind.get_ghost(even_if_they_cant_reenter) + +/mob/proc/grab_ghost(force) + if(mind) + return mind.grab_ghost(force = force) +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index a24da0e4ba..e1a0b50b7f 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -159,7 +159,7 @@ var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKI /proc/setup_skills() if(SKILLS == null) SKILLS = list() - for(var/T in (typesof(/datum/skill)-/datum/skill)) + for(var/T in subtypesof(/datum/skill)) var/datum/skill/S = new T if(S.ID != "none") if(!SKILLS.Find(S.field)) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 64f65adfbb..8b06163590 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -49,8 +49,7 @@ var/list/vis_mobs = vis["mobs"] var/list/vis_objs = vis["objs"] - for(var/vismob in vis_mobs) - var/mob/M = vismob + for(var/mob/M as anything in vis_mobs) if(isobserver(M) && !is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder) spawn(0) M.show_message(undisplayed_message, 2) @@ -58,8 +57,7 @@ spawn(0) M.show_message(message, 2) - for(var/visobj in vis_objs) - var/obj/O = visobj + for(var/obj/O as anything in vis_objs) spawn(0) O.see_emote(src, message, 2) diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index f2466213f3..a9a1e3456d 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -83,8 +83,7 @@ return TRUE var/mob/living/user = usr if(can_run(user, TRUE, access_network)) - for(var/C in ntnet_global.chat_channels) - var/datum/ntnet_conversation/chan = C + for(var/datum/ntnet_conversation/chan as anything in ntnet_global.chat_channels) chan.remove_client(src) netadmin_mode = TRUE return TRUE @@ -92,8 +91,7 @@ var/newname = sanitize(params["new_name"]) if(!newname) return - for(var/C in ntnet_global.chat_channels) - var/datum/ntnet_conversation/chan = C + for(var/datum/ntnet_conversation/chan as anything in ntnet_global.chat_channels) if(src in chan.clients) chan.add_status_message("[username] is now known as [newname].") username = newname @@ -163,8 +161,7 @@ ui_header = "ntnrc_idle.gif" /datum/computer_file/program/chatclient/kill_program(forced = FALSE) - for(var/C in ntnet_global.chat_channels) - var/datum/ntnet_conversation/channel = C + for(var/datum/ntnet_conversation/channel as anything in ntnet_global.chat_channels) channel.remove_client(src) ..() @@ -180,8 +177,7 @@ var/list/data = get_header_data() var/list/all_channels = list() - for(var/C in ntnet_global.chat_channels) - var/datum/ntnet_conversation/conv = C + for(var/datum/ntnet_conversation/conv as anything in ntnet_global.chat_channels) if(conv && conv.title) all_channels.Add(list(list( "chan" = conv.title, diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 86af5d9ba0..7a3a4da632 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -106,8 +106,7 @@ var/global/ntnet_card_uid = 1 var/list/zlevels_in_range = using_map.get_map_levels(holderz, FALSE) var/list/zlevels_in_long_range = using_map.get_map_levels(holderz, TRUE, om_range = DEFAULT_OVERMAP_RANGE) - zlevels_in_range var/best = 0 - for(var/relay in ntnet_global.relays) - var/obj/machinery/ntnet_relay/R = relay + for(var/obj/machinery/ntnet_relay/R as anything in ntnet_global.relays) //Relay is down if(!R.operable()) continue diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index 8117293f90..cd2668f1d4 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -339,8 +339,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable //nif_hud.process_hud(human,1) //TODO VIS //Process all the ones that want that - for(var/S in nifsofts_life) - var/datum/nifsoft/nifsoft = S + for(var/datum/nifsoft/nifsoft as anything in nifsofts_life) nifsoft.life(human) if(NIF_POWFAIL) diff --git a/code/modules/nifsoft/nif_softshop.dm b/code/modules/nifsoft/nif_softshop.dm index 9ba72f215e..3fb2f43684 100644 --- a/code/modules/nifsoft/nif_softshop.dm +++ b/code/modules/nifsoft/nif_softshop.dm @@ -60,8 +60,7 @@ if(!starting_legal_nifsoft) starting_legal_nifsoft = list() starting_illegal_nifsoft = list() - for(var/P in (subtypesof(/datum/nifsoft) - typesof(/datum/nifsoft/package))) - var/datum/nifsoft/NS = P + for(var/datum/nifsoft/NS as anything in (subtypesof(/datum/nifsoft) - typesof(/datum/nifsoft/package))) if(initial(NS.vended)) switch(initial(NS.illegal)) if(TRUE) @@ -80,8 +79,7 @@ for(var/current_list in all_products) var/category = current_list[CAT_HIDDEN] - for(var/entry in current_list[CAT_NORMAL]) - var/datum/nifsoft/NS = entry + for(var/datum/nifsoft/NS as anything in current_list[CAT_NORMAL]) var/applies_to = initial(NS.applies_to) var/context = "" if(!(applies_to & NIF_SYNTHETIC)) @@ -89,7 +87,7 @@ else if(!(applies_to & NIF_ORGANIC)) context = " (Syn Only)" var/name = "[initial(NS.name)][context]" - var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name) + var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, NS, name) product.price = initial(NS.cost) product.amount = 10 diff --git a/code/modules/nifsoft/software/05_health.dm b/code/modules/nifsoft/software/05_health.dm index 7ceb260b6e..83503ee2f1 100644 --- a/code/modules/nifsoft/software/05_health.dm +++ b/code/modules/nifsoft/software/05_health.dm @@ -115,11 +115,23 @@ //Needs fixing W << 'sound/voice/nifmedsynth_injured.ogg' //CHOMP Add activate() +<<<<<<< HEAD for(var/eo in nif.human.bad_external_organs) var/obj/item/organ/external/EO = eo for(var/w in EO.wounds) var/datum/wound/W = w if(W.damage <= 30) // Chomp Edit // The current limb break threshold. +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for(var/eo in nif.human.bad_external_organs) + var/obj/item/organ/external/EO = eo + for(var/w in EO.wounds) + var/datum/wound/W = w + if(W.damage <= 5) +======= + for(var/obj/item/organ/external/EO as anything in nif.human.bad_external_organs) + for(var/datum/wound/W as anything in EO.wounds) + if(W.damage <= 5) +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt W.heal_damage(0.1) EO.update_damages() if(EO.update_icon()) diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index 6bb9536426..750f1b7df2 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -75,10 +75,9 @@ to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"") nif.human << sound - for(var/brainmob in brainmobs) - var/mob/living/carbon/brain/caught_soul/CS = brainmob + for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] Soulcatcher displays, \"[message]\"") - brainmob << sound + CS << sound /datum/nifsoft/soulcatcher/proc/say_into(var/message, var/mob/living/sender, var/mob/eyeobj) var/sender_name = eyeobj ? eyeobj.name : sender.name @@ -90,8 +89,7 @@ //Not AR Projecting else to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"") - for(var/brainmob in brainmobs) - var/mob/living/carbon/brain/caught_soul/CS = brainmob + for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] [sender_name] speaks, \"[message]\"") log_nsay(message,nif.human.real_name,sender) @@ -106,8 +104,7 @@ //Not AR Projecting else to_chat(nif.human,"\[[bicon(nif.big_icon)]NIF\] [sender_name] [message]") - for(var/brainmob in brainmobs) - var/mob/living/carbon/brain/caught_soul/CS = brainmob + for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) to_chat(CS,"\[[bicon(nif.big_icon)]NIF\] [sender_name] [message]") log_nme(message,nif.human.real_name,sender) @@ -135,8 +132,7 @@ new_flavor = sanitize(new_flavor, MAX_MESSAGE_LEN*2) inside_flavor = new_flavor nif.notify("Updating VR environment...") - for(var/brain in brainmobs) - var/mob/living/carbon/brain/caught_soul/CS = brain + for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs) to_chat(CS,"Your surroundings change to...\n[inside_flavor]") save_settings() return TRUE @@ -179,24 +175,20 @@ nif.clear_flag(NIF_O_SCOTHERS,NIF_FLAGS_OTHER) if(NIF_SC_ALLOW_EARS) if(setting_flags & NIF_SC_ALLOW_EARS) - for(var/brain in brainmobs) - var/mob/living/carbon/brain/caught_soul/brainmob = brain + for(var/mob/living/carbon/brain/caught_soul/brainmob as anything in brainmobs) brainmob.ext_deaf = FALSE notify_message = "External audio input enabled." else - for(var/brain in brainmobs) - var/mob/living/carbon/brain/caught_soul/brainmob = brain + for(var/mob/living/carbon/brain/caught_soul/brainmob as anything in brainmobs) brainmob.ext_deaf = TRUE notify_message = "External audio input disabled." if(NIF_SC_ALLOW_EYES) if(setting_flags & NIF_SC_ALLOW_EYES) - for(var/brain in brainmobs) - var/mob/living/carbon/brain/caught_soul/brainmob = brain + for(var/mob/living/carbon/brain/caught_soul/brainmob as anything in brainmobs) brainmob.ext_blind = FALSE notify_message = "External video input enabled." else - for(var/brain in brainmobs) - var/mob/living/carbon/brain/caught_soul/brainmob = brain + for(var/mob/living/carbon/brain/caught_soul/brainmob as anything in brainmobs) brainmob.ext_blind = TRUE notify_message = "External video input disabled." diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 01b5a7f1ef..85f76d9aa0 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -106,8 +106,7 @@ while(null in owner.organs) owner.organs -= null - for(var/imp in implants) - var/obj/item/weapon/implant/I = imp + for(var/obj/item/weapon/implant/I as anything in implants) if(!istype(I)) continue I.imp_in = I.part = null diff --git a/code/modules/overmap/events/event_handler.dm b/code/modules/overmap/events/event_handler.dm index 67785e95ac..2d9c2badda 100644 --- a/code/modules/overmap/events/event_handler.dm +++ b/code/modules/overmap/events/event_handler.dm @@ -14,8 +14,7 @@ GLOBAL_DATUM_INIT(overmap_event_handler, /decl/overmap_event_handler, new) // Acquire the list of not-yet utilized overmap turfs on this Z-level var/list/overmap_turfs = block(locate(OVERMAP_EDGE, OVERMAP_EDGE, z_level), locate(overmap_size - OVERMAP_EDGE, overmap_size - OVERMAP_EDGE, z_level)) var/list/candidate_turfs = list() - for(var/Trf in overmap_turfs) - var/turf/T = Trf + for(var/turf/T as anything in overmap_turfs) if(!(locate(/obj/effect/overmap/visitable) in T)) candidate_turfs += T diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 1b422c01d3..1e4cc23634 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -240,8 +240,7 @@ testing("Putting overmap on [global.using_map.overmap_z]") var/area/overmap/A = new - for (var/square in block(locate(1,1,global.using_map.overmap_z), locate(global.using_map.overmap_size,global.using_map.overmap_size,global.using_map.overmap_z))) - var/turf/T = square + for(var/turf/T as anything in block(locate(1,1,global.using_map.overmap_z), locate(global.using_map.overmap_size,global.using_map.overmap_size,global.using_map.overmap_z))) if(T.x == 1 || T.y == 1 || T.x == global.using_map.overmap_size || T.y == global.using_map.overmap_size) T = T.ChangeTurf(/turf/unsimulated/map/edge) else diff --git a/code/modules/overmap/ships/engines/gas_thruster.dm b/code/modules/overmap/ships/engines/gas_thruster.dm index 773ed97a64..5510a803de 100644 --- a/code/modules/overmap/ships/engines/gas_thruster.dm +++ b/code/modules/overmap/ships/engines/gas_thruster.dm @@ -86,8 +86,7 @@ controller = new(src) update_nearby_tiles(need_rebuild=1) - for(var/ship in SSshuttles.ships) - var/obj/effect/overmap/visitable/ship/S = ship + for(var/obj/effect/overmap/visitable/ship/S as anything in SSshuttles.ships) if(S.check_ownership(src)) S.engines |= controller if(dir != S.fore_dir) diff --git a/code/modules/overmap/ships/panicbutton.dm b/code/modules/overmap/ships/panicbutton.dm index 4e819db642..dcbcbf500f 100644 --- a/code/modules/overmap/ships/panicbutton.dm +++ b/code/modules/overmap/ships/panicbutton.dm @@ -66,8 +66,7 @@ var/turf/us = get_turf(src) for(var/hz in hear_z) - for(var/m in GLOB.players_by_zlevel[hz]) - var/mob/M = m + for(var/mob/M as anything in GLOB.players_by_zlevel[hz]) var/sound/SND = sound('sound/misc/emergency_beacon_launched.ogg') // Inside the loop because playsound_local modifies it for each person, so, need separate instances var/turf/them = get_turf(M) var/volume = max(0.20, 1-(get_dist(us,them) / mapsize*0.8))*100 diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 65c3bff6bf..a8cb28b873 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -40,8 +40,7 @@ if(!stamped) stamped = new else if(stamped) - for(var/S in stamped) - var/obj/item/weapon/stamp/ = S + for(var/obj/item/weapon/stamp/stamp as anything in stamped) var/image/stampoverlay = image('icons/obj/bureaucracy.dmi', "paperplane_[initial(stamp.icon_state)]") add_overlay(stampoverlay) diff --git a/code/modules/pda/cart.dm b/code/modules/pda/cart.dm index d391419d91..596486f3df 100644 --- a/code/modules/pda/cart.dm +++ b/code/modules/pda/cart.dm @@ -69,11 +69,9 @@ var/list/civilian_cartridges = list( return ..() /obj/item/weapon/cartridge/proc/update_programs(obj/item/device/pda/pda) - for(var/A in programs) - var/datum/data/pda/P = A + for(var/datum/data/pda/P as anything in programs) P.pda = pda - for(var/A in messenger_plugins) - var/datum/data/pda/messenger_plugin/P = A + for(var/datum/data/pda/messenger_plugin/P as anything in messenger_plugins) P.pda = pda /obj/item/weapon/cartridge/engineering diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm index acd942aa93..857b7bbc04 100644 --- a/code/modules/pda/cart_apps.dm +++ b/code/modules/pda/cart_apps.dm @@ -136,8 +136,7 @@ records["general"] = general_records.fields return records else - for(var/A in sortRecord(data_core.general)) - var/datum/data/record/R = A + for(var/datum/data/record/R as anything in sortRecord(data_core.general)) if(R) records += list(list(Name = R.fields["name"], "ref" = "\ref[R]")) data["recordsList"] = records @@ -182,8 +181,7 @@ /datum/data/pda/app/crew_records/medical/load_records(datum/data/record/R) ..(R) - for(var/A in data_core.medical) - var/datum/data/record/E = A + for(var/datum/data/record/E as anything in data_core.medical) if(E && (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) medical_records = E break @@ -208,8 +206,7 @@ /datum/data/pda/app/crew_records/security/load_records(datum/data/record/R) ..(R) - for(var/A in data_core.security) - var/datum/data/record/E = A + for(var/datum/data/record/E as anything in data_core.security) if(E && (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) security_records = E break @@ -229,8 +226,7 @@ supplyData["shuttle_loc"] = shuttle.at_station() ? "Station" : "Dock" var/supplyOrderCount = 0 var/supplyOrderData[0] - for(var/S in SSsupply.shoppinglist) - var/datum/supply_order/SO = S + for(var/datum/supply_order/SO as anything in SSsupply.shoppinglist) supplyOrderCount++ supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.ordered_by, "Comment" = html_encode(SO.comment)) @@ -240,8 +236,7 @@ var/requestCount = 0 var/requestData[0] - for(var/S in SSsupply.order_history) - var/datum/supply_order/SO = S + for(var/datum/supply_order/SO as anything in SSsupply.order_history) if(SO.status != SUP_ORDER_REQUESTED) continue diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index efb87577d5..03996dc35c 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -33,8 +33,7 @@ else var/convopdas[0] var/pdas[0] - for(var/A in PDAs) - var/obj/item/device/pda/P = A + for(var/obj/item/device/pda/P as anything in PDAs) var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger) if(!P.owner || PM.toff || P == pda || PM.m_hidden) @@ -49,8 +48,7 @@ var/list/plugins = list() if(pda.cartridge) - for(var/A in pda.cartridge.messenger_plugins) - var/datum/data/pda/messenger_plugin/P = A + for(var/datum/data/pda/messenger_plugin/P as anything in pda.cartridge.messenger_plugins) plugins += list(list(name = P.name, icon = P.icon, ref = "\ref[P]")) data["plugins"] = plugins @@ -148,8 +146,7 @@ //var/telecomms_intact = telecomms_process(P.owner, owner, t) var/obj/machinery/message_server/useMS = null if(message_servers) - for(var/A in message_servers) - var/obj/machinery/message_server/MS = A + for(var/obj/machinery/message_server/MS as anything in message_servers) //PDAs are now dependent on the Message Server. if(MS.active) useMS = MS @@ -194,8 +191,7 @@ to_chat(usr, "Turn on your receiver in order to send messages.") return - for(var/A in PDAs) - var/obj/item/device/pda/P = A + for(var/obj/item/device/pda/P as anything in PDAs) var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger) if(!P.owner || !PM || PM.hidden || P == pda || PM.toff) diff --git a/code/modules/pda/pda.dm b/code/modules/pda/pda.dm index 274a27857a..a237436974 100644 --- a/code/modules/pda/pda.dm +++ b/code/modules/pda/pda.dm @@ -197,8 +197,7 @@ var/global/list/obj/item/device/pda/PDAs = list() shortcut_cache.Cut() /obj/item/device/pda/proc/update_programs() - for(var/A in programs) - var/datum/data/pda/P = A + for(var/datum/data/pda/P as anything in programs) P.pda = src /obj/item/device/pda/proc/detonate_act(var/obj/item/device/pda/P) diff --git a/code/modules/pda/pda_tgui.dm b/code/modules/pda/pda_tgui.dm index 6d57a6c25e..036ec1fbe4 100644 --- a/code/modules/pda/pda_tgui.dm +++ b/code/modules/pda/pda_tgui.dm @@ -22,8 +22,7 @@ if(cartridge) prog_list |= cartridge.programs - for(var/A in prog_list) - var/datum/data/pda/P = A + for(var/datum/data/pda/P as anything in prog_list) if(P.hidden) continue diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index af6f632bdc..1d2e4b0af0 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -499,8 +499,7 @@ var/datum/planet/sif/planet_sif = null /datum/weather/sif/ash_storm/process_effects() ..() - for(var/thing in living_mob_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(L) if(!T.outdoors) @@ -536,8 +535,7 @@ var/datum/planet/sif/planet_sif = null /datum/weather/sif/fallout/process_effects() ..() - for(var/thing in living_mob_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) irradiate_nearby_turf(L) var/turf/T = get_turf(L) diff --git a/code/modules/planet/virgo3b_vr.dm b/code/modules/planet/virgo3b_vr.dm index ea441b6f38..d2faf2315d 100644 --- a/code/modules/planet/virgo3b_vr.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -471,8 +471,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null /datum/weather/virgo3b/ash_storm/process_effects() ..() - for(var/thing in living_mob_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(L) if(!T.outdoors) @@ -508,8 +507,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null /datum/weather/virgo3b/fallout/process_effects() ..() - for(var/thing in living_mob_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) irradiate_nearby_turf(L) var/turf/T = get_turf(L) diff --git a/code/modules/planet/virgo4_vr.dm b/code/modules/planet/virgo4_vr.dm index 6ac748f421..18f4298aa1 100644 --- a/code/modules/planet/virgo4_vr.dm +++ b/code/modules/planet/virgo4_vr.dm @@ -444,8 +444,7 @@ var/datum/planet/virgo4/planet_virgo4 = null /datum/weather/virgo4/ash_storm/process_effects() ..() - for(var/thing in living_mob_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) var/turf/T = get_turf(L) if(!T.outdoors) @@ -481,8 +480,7 @@ var/datum/planet/virgo4/planet_virgo4 = null /datum/weather/virgo4/fallout/process_effects() ..() - for(var/thing in living_mob_list) - var/mob/living/L = thing + for(var/mob/living/L as anything in living_mob_list) if(L.z in holder.our_planet.expected_z_levels) irradiate_nearby_turf(L) var/turf/T = get_turf(L) diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm index 48953a97f1..bbe2318a27 100644 --- a/code/modules/planet/weather.dm +++ b/code/modules/planet/weather.dm @@ -202,8 +202,7 @@ return for(var/z_level in 1 to world.maxz) - for(var/a in GLOB.players_by_zlevel[z_level]) - var/mob/M = a + for(var/mob/M as anything in GLOB.players_by_zlevel[z_level]) // Check if the mob left the z-levels we control. If so, make the sounds stop for them. if(!(z_level in holder.our_planet.expected_z_levels)) diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index b49fa564bc..54d72b11e8 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -17,7 +17,8 @@ var/list/fusion_reactions /proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) if(!fusion_reactions) fusion_reactions = list() - for(var/rtype in typesof(/decl/fusion_reaction) - /decl/fusion_reaction) + for(var/rtype in subtypesof(/decl/fusion_reaction) + ) var/decl/fusion_reaction/cur_reaction = new rtype() if(!fusion_reactions[cur_reaction.p_react]) fusion_reactions[cur_reaction.p_react] = list() diff --git a/code/modules/power/gravitygenerator_vr.dm b/code/modules/power/gravitygenerator_vr.dm index cce22b705a..ae282b41ca 100644 --- a/code/modules/power/gravitygenerator_vr.dm +++ b/code/modules/power/gravitygenerator_vr.dm @@ -389,8 +389,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. /obj/machinery/gravity_generator/main/proc/shake_everyone() var/sound/alert_sound = sound('sound/effects/alert.ogg') - for(var/i in player_list) - var/mob/M = i + for(var/mob/M as anything in player_list) if(!(M.z in levels)) continue M.update_gravity(M.mob_has_gravity()) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3225030581..39d413677d 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -265,8 +265,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) return 1 /obj/singularity/proc/eat() - for(var/T in orange(grav_pull, src)) - var/atom/X = T + for(var/atom/X as anything in orange(grav_pull, src)) if(!X.simulated) continue var/dist = get_dist(X, src) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 8a20c9e685..17bf6a400a 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -314,8 +314,7 @@ GLOBAL_LIST_EMPTY(solars_list) // This would use LateInitialize(), however the powernet does not appear to exist during that time. /hook/roundstart/proc/auto_start_solars() - for(var/a in GLOB.solars_list) - var/obj/machinery/power/solar_control/SC = a + for(var/obj/machinery/power/solar_control/SC as anything in GLOB.solars_list) SC.auto_start() return TRUE diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index e3ccafa4cc..cf7aa9e2c1 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -40,8 +40,7 @@ var/obj/singularity/energy_ball/EB = orbiting.orbiting EB.orbiting_balls -= src - for(var/ball in orbiting_balls) - var/obj/singularity/energy_ball/EB = ball + for(var/obj/singularity/energy_ball/EB as anything in orbiting_balls) qdel(EB) . = ..() diff --git a/code/modules/projectiles/broken.dm b/code/modules/projectiles/broken.dm index f46f7f34e5..57809fdbd1 100644 --- a/code/modules/projectiles/broken.dm +++ b/code/modules/projectiles/broken.dm @@ -31,20 +31,19 @@ if(do_after(user, 5 SECONDS)) to_chat(user, "\The [src] can possibly be restored with:") - for(var/resource in material_needs) - var/obj/item/res = resource - if(material_needs[resource] > 0) + for(var/obj/item/res as anything in material_needs) + if(material_needs[res] > 0) var/res_name = "" if(ispath(res,/obj/item/stack/material)) var/obj/item/stack/material/mat_stack = res var/datum/material/mat = get_material_by_name("[initial(mat_stack.default_type)]") - if(material_needs[resource]>1) + if(material_needs[res]>1) res_name = "[mat.use_name] [mat.sheet_plural_name]" else res_name = "[mat.use_name] [mat.sheet_singular_name]" else res_name = initial(res.name) - to_chat(user, "- x [material_needs[resource]] [res_name]") + to_chat(user, "- x [material_needs[res]] [res_name]") /obj/item/weapon/broken_gun/proc/setup_gun(var/obj/item/weapon/gun/path) if(ispath(path)) diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm index c819e8c603..eaa3a2d9e8 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm @@ -34,8 +34,7 @@ if(batt.shots_left) return new chambered.projectile_type() else - for(var/B in ammo_magazine.stored_ammo) - var/obj/item/ammo_casing/microbattery/other_batt = B + for(var/obj/item/ammo_casing/microbattery/other_batt as anything in ammo_magazine.stored_ammo) if(istype(other_batt,chambered.type) && other_batt.shots_left) switch_to(other_batt) return new chambered.projectile_type() @@ -54,8 +53,7 @@ charge_left = batt.shots_left max_charge = initial(batt.shots_left) if(ammo_magazine) //Crawl to find more - for(var/B in ammo_magazine.stored_ammo) - var/obj/item/ammo_casing/microbattery/bullet = B + for(var/obj/item/ammo_casing/microbattery/bullet as anything in ammo_magazine.stored_ammo) if(istype(bullet,batt.type)) charge_left += bullet.shots_left max_charge += initial(bullet.shots_left) @@ -179,8 +177,7 @@ return //Why bother var/current = 0 - for(var/B in stored_ammo) - var/obj/item/ammo_casing/microbattery/batt = B + for(var/obj/item/ammo_casing/microbattery/batt as anything in stored_ammo) var/image/cap = image(icon, icon_state = "[capname]_cap") cap.color = batt.type_color cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm index 043a353015..581e05d74d 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm @@ -25,8 +25,7 @@ . = ..() if(Adjacent(user) && max_mod_capacity) . += "[get_remaining_mod_capacity()]% mod capacity remaining." - for(var/A in get_modkits()) - var/obj/item/borg/upgrade/modkit/M = A + for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) . += "There is a [M.name] mod installed, using [M.cost]% capacity." /obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user) @@ -46,8 +45,7 @@ /obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 - for(var/A in get_modkits()) - var/obj/item/borg/upgrade/modkit/M = A + for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) current_capacity_used += M.cost return max_mod_capacity - current_capacity_used @@ -57,8 +55,7 @@ . += A /obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K) - for(var/A in get_modkits()) - var/obj/item/borg/upgrade/modkit/M = A + for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits()) M.modify_projectile(K) /obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile() @@ -185,8 +182,7 @@ . = TRUE if(denied_type) var/number_of_denied = 0 - for(var/A in KA.get_modkits()) - var/obj/item/borg/upgrade/modkit/M = A + for(var/obj/item/borg/upgrade/modkit/M as anything in KA.get_modkits()) if(istype(M, denied_type)) number_of_denied++ if(number_of_denied >= maximum_of_type) diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index e63c31b1a5..31a575212c 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -158,7 +158,7 @@ var/mob/living/spawned_mob var/list/spawned_mobs = list() - var/spawn_path = tgui_input_list(usr, "Select a mob type.", "Drop Pod Selection", typesof(/mob/living)-/mob/living) + var/spawn_path = tgui_input_list(usr, "Select a mob type.", "Drop Pod Selection", subtypesof(/mob/living)) if(!spawn_path) return diff --git a/code/modules/random_map/drop/supply.dm b/code/modules/random_map/drop/supply.dm index 912542d654..d1cc04211d 100644 --- a/code/modules/random_map/drop/supply.dm +++ b/code/modules/random_map/drop/supply.dm @@ -55,14 +55,14 @@ choice = tgui_alert(usr, "Do you wish to add structures or machines?","Supply Drop",list("No","Yes")) if(choice == "Yes") while(1) - var/adding_loot_type = tgui_input_list(usr, "Select a new loot path. Cancel to finish.", "Loot Selection", typesof(/obj) - typesof(/obj/item)) + var/adding_loot_type = tgui_input_list(usr, "Select a new loot path. Cancel to finish.", "Loot Selection", subtypesof(/obj)) if(!adding_loot_type) break chosen_loot_types |= adding_loot_type choice = tgui_alert(usr, "Do you wish to add any non-weapon items?","Supply Drop",list("No","Yes")) if(choice == "Yes") while(1) - var/adding_loot_type = tgui_input_list(usr, "Select a new loot path. Cancel to finish.", "Loot Selection", typesof(/obj/item) - typesof(/obj/item/weapon)) + var/adding_loot_type = tgui_input_list(usr, "Select a new loot path. Cancel to finish.", "Loot Selection", subtypesof(/obj/item)) if(!adding_loot_type) break chosen_loot_types |= adding_loot_type diff --git a/code/modules/random_map/noise/desert.dm b/code/modules/random_map/noise/desert.dm index 0264d2a781..ccb768ce3a 100644 --- a/code/modules/random_map/noise/desert.dm +++ b/code/modules/random_map/noise/desert.dm @@ -24,14 +24,14 @@ switch(val) if(2 to 3) if(prob(60)) - var/grass_path = pick(typesof(/obj/structure/flora/grass)-/obj/structure/flora/grass) + var/grass_path = pick(subtypesof(/obj/structure/flora/grass)) new grass_path(T) if(prob(5)) var/mob_type = pick(list(/mob/living/simple_mob/animal/passive/lizard, /mob/living/simple_mob/animal/passive/mouse)) new mob_type(T) if(5 to 6) if(prob(20)) - var/grass_path = pick(typesof(/obj/structure/flora/grass)-/obj/structure/flora/grass) + var/grass_path = pick(subtypesof(/obj/structure/flora/grass)) new grass_path(T) if(7 to 9) if(prob(60)) diff --git a/code/modules/random_map/random_map_verbs.dm b/code/modules/random_map/random_map_verbs.dm index c4d572d23f..ff93b73b09 100644 --- a/code/modules/random_map/random_map_verbs.dm +++ b/code/modules/random_map/random_map_verbs.dm @@ -36,7 +36,7 @@ if(!holder) return - var/map_datum = tgui_input_list(usr, "Choose a map to create.", "Map Choice", typesof(/datum/random_map)-/datum/random_map) + var/map_datum = tgui_input_list(usr, "Choose a map to create.", "Map Choice", subtypesof(/datum/random_map)) if(!map_datum) return diff --git a/code/modules/reagents/holder/distilling.dm b/code/modules/reagents/holder/distilling.dm index 1599f395d9..9fb4867901 100644 --- a/code/modules/reagents/holder/distilling.dm +++ b/code/modules/reagents/holder/distilling.dm @@ -8,19 +8,16 @@ var/list/effect_reactions = list() do reaction_occurred = FALSE - for(var/i in reagent_list) - var/datum/reagent/R = i + for(var/datum/reagent/R as anything in reagent_list) if(SSchemistry.distilled_reactions_by_reagent[R.id]) eligible_reactions |= SSchemistry.distilled_reactions_by_reagent[R.id] - for(var/i in eligible_reactions) - var/decl/chemical_reaction/C = i + for(var/decl/chemical_reaction/C as anything in eligible_reactions) if(C.can_happen(src) && C.process(src)) effect_reactions |= C reaction_occurred = TRUE eligible_reactions.len = 0 while(reaction_occurred) - for(var/i in effect_reactions) - var/decl/chemical_reaction/C = i + for(var/decl/chemical_reaction/C as anything in effect_reactions) C.post_reaction(src) update_total() \ No newline at end of file diff --git a/code/modules/reagents/holder/holder.dm b/code/modules/reagents/holder/holder.dm index 26ad557e98..6bde5e8508 100644 --- a/code/modules/reagents/holder/holder.dm +++ b/code/modules/reagents/holder/holder.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD #define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times /datum/reagents @@ -508,3 +509,1020 @@ for(var/datum/reagent/reagent as anything in cached_reagents) reagent.on_update(A) update_total() +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt +#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times + +/datum/reagents + var/list/datum/reagent/reagent_list = list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + +/datum/reagents/New(var/max = 100, atom/A = null) + ..() + maximum_volume = max + my_atom = A + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!SSchemistry.chemical_reagents) + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + var/paths = subtypesof(/datum/reagent) + SSchemistry.chemical_reagents = list() + for(var/path in paths) + var/datum/reagent/D = new path() + if(!D.name) + continue + SSchemistry.chemical_reagents[D.id] = D + +/datum/reagents/Destroy() + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + return ..() + +/* Internal procs */ + +/datum/reagents/proc/get_free_space() // Returns free space. + return maximum_volume - total_volume + +/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume. + var/the_reagent = null + var/the_volume = 0 + + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_reagent = A + + return the_reagent + +/datum/reagents/proc/get_master_reagent_name() // Returns the name of the reagent with the biggest volume. + var/the_name = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_name = A.name + + return the_name + +/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. + var/the_id = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_id = A.id + + return the_id + +/datum/reagents/proc/update_total() // Updates volume. + total_volume = 0 + for(var/datum/reagent/R in reagent_list) + if(R.volume < MINIMUM_CHEMICAL_VOLUME) + del_reagent(R.id) + else + total_volume += R.volume + return + +/datum/reagents/proc/handle_reactions() + if(QDELETED(my_atom)) + return FALSE + if(my_atom.flags & NOREACT) + return FALSE + var/reaction_occurred + var/list/eligible_reactions = list() + var/list/effect_reactions = list() + do + reaction_occurred = FALSE + for(var/i in reagent_list) + var/datum/reagent/R = i + if(SSchemistry.instant_reactions_by_reagent[R.id]) + eligible_reactions |= SSchemistry.instant_reactions_by_reagent[R.id] + + for(var/i in eligible_reactions) + var/decl/chemical_reaction/C = i + if(C.can_happen(src) && C.process(src)) + effect_reactions |= C + reaction_occurred = TRUE + eligible_reactions.len = 0 + while(reaction_occurred) + for(var/i in effect_reactions) + var/decl/chemical_reaction/C = i + C.post_reaction(src) + update_total() + +/* Holder-to-chemical */ + +/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0) + if(!isnum(amount) || amount <= 0) + return 0 + + update_total() + amount = min(amount, get_free_space()) + + + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + if(current.id == "blood") + if(LAZYLEN(data) && !isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container. + continue + + current.volume += amount + if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful + current.mix_data(data, amount) + update_total() + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + var/datum/reagent/D = SSchemistry.chemical_reagents[id] + if(D) + var/datum/reagent/R = new D.type() + reagent_list += R + R.holder = src + R.volume = amount + R.initialize_data(data) + update_total() + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + else + stack_trace("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") + return 0 + +/datum/reagents/proc/isolate_reagent(reagent) + for(var/A in reagent_list) + var/datum/reagent/R = A + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) + if(!isnum(amount)) + return 0 + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + current.volume -= amount // It can go negative, but it doesn't matter + update_total() // Because this proc will delete it then + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + return 0 + +/datum/reagents/proc/del_reagent(var/id) + for(var/datum/reagent/current in reagent_list) + if (current.id == id) + reagent_list -= current + qdel(current) + update_total() + if(my_atom) + my_atom.on_reagent_change() + return 0 + +/datum/reagents/proc/has_reagent(var/id, var/amount = 0) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + if(current.volume >= amount) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_any_reagent(var/list/check_reagents) + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_all_reagents(var/list/check_reagents) + //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list + var/missing = check_reagents.len + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + missing-- + return !missing + +/datum/reagents/proc/clear_reagents() + for(var/datum/reagent/current in reagent_list) + del_reagent(current.id) + return + +/datum/reagents/proc/get_reagent_amount(var/id) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + return current.volume + return 0 + +/datum/reagents/proc/get_data(var/id) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + return current.get_data() + return 0 + +/datum/reagents/proc/get_reagents() + . = list() + for(var/datum/reagent/current in reagent_list) + . += "[current.id] ([current.volume])" + return english_list(., "EMPTY", "", ", ", ", ") + +/* Holder-to-holder and similar procs */ + +/datum/reagents/proc/remove_any(var/amount = 1) // Removes up to [amount] of reagents from [src]. Returns actual amount removed. + amount = min(amount, total_volume) + + if(!amount) + return + + var/part = amount / total_volume + + for(var/datum/reagent/current in reagent_list) + var/amount_to_remove = current.volume * part + remove_reagent(current.id, amount_to_remove, 1) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). + if(!target || !istype(target)) + return + + amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier)) + + if(!amount) + return + + var/part = amount / total_volume + + for(var/datum/reagent/current in reagent_list) + var/amount_to_transfer = current.volume * part + target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place + if(!copy) + remove_reagent(current.id, amount_to_transfer, 1) + + if(!copy) + handle_reactions() + target.handle_reactions() + return amount + +/* Holder-to-atom and similar procs */ + +//The general proc for applying reagents to things. This proc assumes the reagents are being applied externally, +//not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). +//If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), +//call the appropriate trans_to_*() proc. +/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) + touch(target) //First, handle mere touch effects + + if(ismob(target)) + return splash_mob(target, amount, copy) + if(isturf(target)) + return trans_to_turf(target, amount, multiplier, copy) + if(isobj(target) && target.is_open_container()) + return trans_to_obj(target, amount, multiplier, copy) + return 0 + +//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. +/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) + var/spill = 0 + if(!isturf(target) && target.loc) + spill = amount*(rand(min_spill, max_spill)/100) + amount -= spill + if(spill) + splash(target.loc, spill, multiplier, copy, min_spill, max_spill) + + if(!trans_to(target, amount, multiplier, copy)) + touch(target, amount) + +/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) + if (!target) + return + + var/datum/reagent/transfering_reagent = get_reagent(rtype) + + if (istype(target, /atom)) + var/atom/A = target + if (!A.reagents || !A.simulated) + return + + amount = min(amount, transfering_reagent.volume) + + if(!amount) + return + + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(rtype) + F.add_reagent(rtype, amount, tmpdata) + remove_reagent(rtype, amount) + + + if (istype(target, /atom)) + return F.trans_to(target, amount) // Let this proc check the atom's type + else if (istype(target, /datum/reagents)) + return F.trans_to_holder(target, amount) + +/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) + if (!target || !target.reagents) + return + + amount = min(amount, get_reagent_amount(id)) + + if(!amount) + return + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(id) + F.add_reagent(id, amount, tmpdata) + remove_reagent(id, amount) + + return F.trans_to(target, amount) // Let this proc check the atom's type + +// When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. +// This does not handle transferring reagents to things. +// For example, splashing someone with water will get them wet and extinguish them if they are on fire, +// even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. +/datum/reagents/proc/touch(var/atom/target, var/amount) + if(ismob(target)) + touch_mob(target, amount) + if(isturf(target)) + touch_turf(target, amount) + if(isobj(target)) + touch_obj(target, amount) + return + +/datum/reagents/proc/touch_mob(var/mob/target) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_mob(target, current.volume) + + update_total() + +/datum/reagents/proc/touch_turf(var/turf/target, var/amount) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_turf(target, amount) + + update_total() + +/datum/reagents/proc/touch_obj(var/obj/target, var/amount) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_obj(target, amount) + + update_total() + +// Attempts to place a reagent on the mob's skin. +// Reagents are not guaranteed to transfer to the target. +// Do not call this directly, call trans_to() instead. +/datum/reagents/proc/splash_mob(var/mob/target, var/amount = 1, var/copy = 0) + var/perm = 1 + if(isliving(target)) //will we ever even need to tranfer reagents to non-living mobs? + var/mob/living/L = target + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(0, null, null, null, "the spray") == 1) //If they block the spray, it does nothing. + amount = 0 + perm = L.reagent_permeability() + return trans_to_mob(target, amount, CHEM_TOUCH, perm, copy) + +/datum/reagents/proc/trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0) // Transfer after checking into which holder... + if(!target || !istype(target)) + return + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(type == CHEM_BLOOD) + var/datum/reagents/R = C.reagents + return trans_to_holder(R, amount, multiplier, copy) + if(type == CHEM_INGEST) + var/datum/reagents/R = C.ingested + return C.ingest(src, R, amount, multiplier, copy) + if(type == CHEM_TOUCH) + var/datum/reagents/R = C.touching + return trans_to_holder(R, amount, multiplier, copy) + else + var/datum/reagents/R = new /datum/reagents(amount) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_mob(target) + +/datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. + if(!target) + return + + var/datum/reagents/R = new /datum/reagents(amount * multiplier) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_turf(target, amount) + return + +/datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. + if(!target) + return + + if(!target.reagents) + var/datum/reagents/R = new /datum/reagents(amount * multiplier) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_obj(target, amount) + return + + return trans_to_holder(target.reagents, amount, multiplier, copy) + +/* Atom reagent creation - use it all the time */ + +/atom/proc/create_reagents(var/max_vol, var/reagents_type = /datum/reagents) + if(!ispath(reagents_type)) + reagents_type = /datum/reagents + reagents = new reagents_type(max_vol, src) + +// Aurora Cooking Port +/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID + for(var/datum/reagent/A in reagent_list) + if (A.id == id) + return A + + return null + +//Spreads the contents of this reagent holder all over the vicinity of the target turf. +/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0) + var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING) + var/list/turfs = list() + for (var/turf/T in things) + turfs += T + if (!turfs.len) + return//Nowhere to splash to, somehow + //Create a temporary holder to hold all the amount that will be spread + var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier) + trans_to_holder(R, total_volume * portion, multiplier, copy) + //The exact amount that will be given to each turf + var/turfportion = R.total_volume / turfs.len + for (var/turf/T in turfs) + var/datum/reagents/TR = new /datum/reagents(turfportion) + R.trans_to_holder(TR, turfportion, 1, 0) + TR.splash_turf(T) + qdel(R) + + +//Spreads the contents of this reagent holder all over the target turf, dividing among things in it. +//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself +/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0) + if (isnull(amount)) + amount = total_volume + else + amount = min(amount, total_volume) + if (amount <= 0) + return + var/list/mobs = list() + for (var/mob/M in T) + mobs += M + var/list/objs = list() + for (var/obj/O in T) + objs += O + if (objs.len) + var/objportion = (amount * 0.2) / objs.len + for (var/o in objs) + var/obj/O = o + trans_to(O, objportion, multiplier, copy) + amount = min(amount, total_volume) + if (mobs.len) + var/mobportion = (amount * 0.5) / mobs.len + for (var/m in mobs) + var/mob/M = m + trans_to(M, mobportion, multiplier, copy) + trans_to(T, total_volume, multiplier, copy) + if (total_volume <= 0) + qdel(src) + +/** + * Calls [/datum/reagent/proc/on_update] on every reagent in this holder + * + * Arguments: + * * atom/A - passed to on_update + */ +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/datum/reagent/reagent as anything in cached_reagents) + reagent.on_update(A) + update_total() +======= +#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times + +/datum/reagents + var/list/datum/reagent/reagent_list = list() + var/total_volume = 0 + var/maximum_volume = 100 + var/atom/my_atom = null + +/datum/reagents/New(var/max = 100, atom/A = null) + ..() + maximum_volume = max + my_atom = A + + //I dislike having these here but map-objects are initialised before world/New() is called. >_> + if(!SSchemistry.chemical_reagents) + //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id + var/paths = subtypesof(/datum/reagent) + SSchemistry.chemical_reagents = list() + for(var/path in paths) + var/datum/reagent/D = new path() + if(!D.name) + continue + SSchemistry.chemical_reagents[D.id] = D + +/datum/reagents/Destroy() + for(var/datum/reagent/R in reagent_list) + qdel(R) + reagent_list = null + if(my_atom && my_atom.reagents == src) + my_atom.reagents = null + return ..() + +/* Internal procs */ + +/datum/reagents/proc/get_free_space() // Returns free space. + return maximum_volume - total_volume + +/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume. + var/the_reagent = null + var/the_volume = 0 + + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_reagent = A + + return the_reagent + +/datum/reagents/proc/get_master_reagent_name() // Returns the name of the reagent with the biggest volume. + var/the_name = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_name = A.name + + return the_name + +/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. + var/the_id = null + var/the_volume = 0 + for(var/datum/reagent/A in reagent_list) + if(A.volume > the_volume) + the_volume = A.volume + the_id = A.id + + return the_id + +/datum/reagents/proc/update_total() // Updates volume. + total_volume = 0 + for(var/datum/reagent/R in reagent_list) + if(R.volume < MINIMUM_CHEMICAL_VOLUME) + del_reagent(R.id) + else + total_volume += R.volume + return + +/datum/reagents/proc/handle_reactions() + if(QDELETED(my_atom)) + return FALSE + if(my_atom.flags & NOREACT) + return FALSE + var/reaction_occurred + var/list/eligible_reactions = list() + var/list/effect_reactions = list() + do + reaction_occurred = FALSE + for(var/datum/reagent/R as anything in reagent_list) + if(SSchemistry.instant_reactions_by_reagent[R.id]) + eligible_reactions |= SSchemistry.instant_reactions_by_reagent[R.id] + + for(var/decl/chemical_reaction/C as anything in eligible_reactions) + if(C.can_happen(src) && C.process(src)) + effect_reactions |= C + reaction_occurred = TRUE + eligible_reactions.len = 0 + while(reaction_occurred) + for(var/decl/chemical_reaction/C as anything in effect_reactions) + C.post_reaction(src) + update_total() + +/* Holder-to-chemical */ + +/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0) + if(!isnum(amount) || amount <= 0) + return 0 + + update_total() + amount = min(amount, get_free_space()) + + + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + if(current.id == "blood") + if(LAZYLEN(data) && !isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container. + continue + + current.volume += amount + if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful + current.mix_data(data, amount) + update_total() + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + var/datum/reagent/D = SSchemistry.chemical_reagents[id] + if(D) + var/datum/reagent/R = new D.type() + reagent_list += R + R.holder = src + R.volume = amount + R.initialize_data(data) + update_total() + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + else + stack_trace("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") + return 0 + +/datum/reagents/proc/isolate_reagent(reagent) + for(var/datum/reagent/R as anything in reagent_list) + if(R.id != reagent) + del_reagent(R.id) + update_total() + +/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) + if(!isnum(amount)) + return 0 + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + current.volume -= amount // It can go negative, but it doesn't matter + update_total() // Because this proc will delete it then + if(!safety) + handle_reactions() + if(my_atom) + my_atom.on_reagent_change() + return 1 + return 0 + +/datum/reagents/proc/del_reagent(var/id) + for(var/datum/reagent/current in reagent_list) + if (current.id == id) + reagent_list -= current + qdel(current) + update_total() + if(my_atom) + my_atom.on_reagent_change() + return 0 + +/datum/reagents/proc/has_reagent(var/id, var/amount = 0) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + if(current.volume >= amount) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_any_reagent(var/list/check_reagents) + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + return 1 + else + return 0 + return 0 + +/datum/reagents/proc/has_all_reagents(var/list/check_reagents) + //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list + var/missing = check_reagents.len + for(var/datum/reagent/current in reagent_list) + if(current.id in check_reagents) + if(current.volume >= check_reagents[current.id]) + missing-- + return !missing + +/datum/reagents/proc/clear_reagents() + for(var/datum/reagent/current in reagent_list) + del_reagent(current.id) + return + +/datum/reagents/proc/get_reagent_amount(var/id) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + return current.volume + return 0 + +/datum/reagents/proc/get_data(var/id) + for(var/datum/reagent/current in reagent_list) + if(current.id == id) + return current.get_data() + return 0 + +/datum/reagents/proc/get_reagents() + . = list() + for(var/datum/reagent/current in reagent_list) + . += "[current.id] ([current.volume])" + return english_list(., "EMPTY", "", ", ", ", ") + +/* Holder-to-holder and similar procs */ + +/datum/reagents/proc/remove_any(var/amount = 1) // Removes up to [amount] of reagents from [src]. Returns actual amount removed. + amount = min(amount, total_volume) + + if(!amount) + return + + var/part = amount / total_volume + + for(var/datum/reagent/current in reagent_list) + var/amount_to_remove = current.volume * part + remove_reagent(current.id, amount_to_remove, 1) + + update_total() + handle_reactions() + return amount + +/datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). + if(!target || !istype(target)) + return + + amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier)) + + if(!amount) + return + + var/part = amount / total_volume + + for(var/datum/reagent/current in reagent_list) + var/amount_to_transfer = current.volume * part + target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place + if(!copy) + remove_reagent(current.id, amount_to_transfer, 1) + + if(!copy) + handle_reactions() + target.handle_reactions() + return amount + +/* Holder-to-atom and similar procs */ + +//The general proc for applying reagents to things. This proc assumes the reagents are being applied externally, +//not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). +//If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), +//call the appropriate trans_to_*() proc. +/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) + touch(target) //First, handle mere touch effects + + if(ismob(target)) + return splash_mob(target, amount, copy) + if(isturf(target)) + return trans_to_turf(target, amount, multiplier, copy) + if(isobj(target) && target.is_open_container()) + return trans_to_obj(target, amount, multiplier, copy) + return 0 + +//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. +/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) + var/spill = 0 + if(!isturf(target) && target.loc) + spill = amount*(rand(min_spill, max_spill)/100) + amount -= spill + if(spill) + splash(target.loc, spill, multiplier, copy, min_spill, max_spill) + + if(!trans_to(target, amount, multiplier, copy)) + touch(target, amount) + +/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) + if (!target) + return + + var/datum/reagent/transfering_reagent = get_reagent(rtype) + + if (istype(target, /atom)) + var/atom/A = target + if (!A.reagents || !A.simulated) + return + + amount = min(amount, transfering_reagent.volume) + + if(!amount) + return + + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(rtype) + F.add_reagent(rtype, amount, tmpdata) + remove_reagent(rtype, amount) + + + if (istype(target, /atom)) + return F.trans_to(target, amount) // Let this proc check the atom's type + else if (istype(target, /datum/reagents)) + return F.trans_to_holder(target, amount) + +/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) + if (!target || !target.reagents) + return + + amount = min(amount, get_reagent_amount(id)) + + if(!amount) + return + + var/datum/reagents/F = new /datum/reagents(amount) + var/tmpdata = get_data(id) + F.add_reagent(id, amount, tmpdata) + remove_reagent(id, amount) + + return F.trans_to(target, amount) // Let this proc check the atom's type + +// When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. +// This does not handle transferring reagents to things. +// For example, splashing someone with water will get them wet and extinguish them if they are on fire, +// even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. +/datum/reagents/proc/touch(var/atom/target, var/amount) + if(ismob(target)) + touch_mob(target, amount) + if(isturf(target)) + touch_turf(target, amount) + if(isobj(target)) + touch_obj(target, amount) + return + +/datum/reagents/proc/touch_mob(var/mob/target) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_mob(target, current.volume) + + update_total() + +/datum/reagents/proc/touch_turf(var/turf/target, var/amount) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_turf(target, amount) + + update_total() + +/datum/reagents/proc/touch_obj(var/obj/target, var/amount) + if(!target || !istype(target)) + return + + for(var/datum/reagent/current in reagent_list) + current.touch_obj(target, amount) + + update_total() + +// Attempts to place a reagent on the mob's skin. +// Reagents are not guaranteed to transfer to the target. +// Do not call this directly, call trans_to() instead. +/datum/reagents/proc/splash_mob(var/mob/target, var/amount = 1, var/copy = 0) + var/perm = 1 + if(isliving(target)) //will we ever even need to tranfer reagents to non-living mobs? + var/mob/living/L = target + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(0, null, null, null, "the spray") == 1) //If they block the spray, it does nothing. + amount = 0 + perm = L.reagent_permeability() + return trans_to_mob(target, amount, CHEM_TOUCH, perm, copy) + +/datum/reagents/proc/trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0) // Transfer after checking into which holder... + if(!target || !istype(target)) + return + if(iscarbon(target)) + var/mob/living/carbon/C = target + if(type == CHEM_BLOOD) + var/datum/reagents/R = C.reagents + return trans_to_holder(R, amount, multiplier, copy) + if(type == CHEM_INGEST) + var/datum/reagents/R = C.ingested + return C.ingest(src, R, amount, multiplier, copy) + if(type == CHEM_TOUCH) + var/datum/reagents/R = C.touching + return trans_to_holder(R, amount, multiplier, copy) + else + var/datum/reagents/R = new /datum/reagents(amount) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_mob(target) + +/datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. + if(!target) + return + + var/datum/reagents/R = new /datum/reagents(amount * multiplier) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_turf(target, amount) + return + +/datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. + if(!target) + return + + if(!target.reagents) + var/datum/reagents/R = new /datum/reagents(amount * multiplier) + . = trans_to_holder(R, amount, multiplier, copy) + R.touch_obj(target, amount) + return + + return trans_to_holder(target.reagents, amount, multiplier, copy) + +/* Atom reagent creation - use it all the time */ + +/atom/proc/create_reagents(var/max_vol, var/reagents_type = /datum/reagents) + if(!ispath(reagents_type)) + reagents_type = /datum/reagents + reagents = new reagents_type(max_vol, src) + +// Aurora Cooking Port +/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID + for(var/datum/reagent/A in reagent_list) + if (A.id == id) + return A + + return null + +//Spreads the contents of this reagent holder all over the vicinity of the target turf. +/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0) + var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING) + var/list/turfs = list() + for (var/turf/T in things) + turfs += T + if (!turfs.len) + return//Nowhere to splash to, somehow + //Create a temporary holder to hold all the amount that will be spread + var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier) + trans_to_holder(R, total_volume * portion, multiplier, copy) + //The exact amount that will be given to each turf + var/turfportion = R.total_volume / turfs.len + for (var/turf/T in turfs) + var/datum/reagents/TR = new /datum/reagents(turfportion) + R.trans_to_holder(TR, turfportion, 1, 0) + TR.splash_turf(T) + qdel(R) + + +//Spreads the contents of this reagent holder all over the target turf, dividing among things in it. +//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself +/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0) + if (isnull(amount)) + amount = total_volume + else + amount = min(amount, total_volume) + if (amount <= 0) + return + var/list/mobs = list() + for (var/mob/M in T) + mobs += M + var/list/objs = list() + for (var/obj/O in T) + objs += O + if (objs.len) + var/objportion = (amount * 0.2) / objs.len + for(var/obj/O as anything in objs) + trans_to(O, objportion, multiplier, copy) + amount = min(amount, total_volume) + if (mobs.len) + var/mobportion = (amount * 0.5) / mobs.len + for(var/mob/M as anything in mobs) + trans_to(M, mobportion, multiplier, copy) + trans_to(T, total_volume, multiplier, copy) + if (total_volume <= 0) + qdel(src) + +/** + * Calls [/datum/reagent/proc/on_update] on every reagent in this holder + * + * Arguments: + * * atom/A - passed to on_update + */ +/datum/reagents/proc/conditional_update(atom/A) + var/list/cached_reagents = reagent_list + for(var/datum/reagent/reagent as anything in cached_reagents) + reagent.on_update(A) + update_total() +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt diff --git a/code/modules/reagents/machinery/grinder.dm b/code/modules/reagents/machinery/grinder.dm index 014305a8f1..3b5ea9e4fd 100644 --- a/code/modules/reagents/machinery/grinder.dm +++ b/code/modules/reagents/machinery/grinder.dm @@ -56,8 +56,7 @@ . += "\The [src] contains:" if(beaker) . += "- \A [beaker]." - for(var/i in holdingitems) - var/obj/item/O = i + for(var/obj/item/O as anything in holdingitems) . += "- \A [O.name]." if(!(stat & (NOPOWER|BROKEN))) diff --git a/code/modules/reagents/reactions/instant/instant_vr.dm b/code/modules/reagents/reactions/instant/instant_vr.dm index a014c0d45f..4eef9c3492 100644 --- a/code/modules/reagents/reactions/instant/instant_vr.dm +++ b/code/modules/reagents/reactions/instant/instant_vr.dm @@ -208,7 +208,8 @@ result_amount = 1 /decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder) - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK + var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/snacks) + playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1) diff --git a/code/modules/reagents/reagents/vore_vr.dm b/code/modules/reagents/reagents/vore_vr.dm index 5bb366fbe4..0fb3a74b61 100644 --- a/code/modules/reagents/reagents/vore_vr.dm +++ b/code/modules/reagents/reagents/vore_vr.dm @@ -76,8 +76,7 @@ M.make_dizzy(1) M.adjustHalLoss(2) - for(var/belly in M.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in M.vore_organs) for(var/atom/movable/A in B) if(isliving(A)) var/mob/living/P = A @@ -102,8 +101,7 @@ M.confused = max(M.confused, 20) M.hallucination += 15 - for(var/belly in M.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in M.vore_organs) if(B.digest_mode == DM_ABSORB) //Turn off absorbing on bellies B.digest_mode = DM_HOLD diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index e8ad090e10..81ee392a8b 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -52,12 +52,12 @@ GLOBAL_LIST_INIT(design_datums, list()) /datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated. if(!LAZYLEN(GLOB.design_datums)) - for(var/T in typesof(/datum/design) - /datum/design) + for(var/T in subtypesof(/datum/design)) GLOB.design_datums += new T possible_designs = GLOB.design_datums if(!LAZYLEN(known_tech)) - for(var/T in typesof(/datum/tech) - /datum/tech) + for(var/T in subtypesof(/datum/tech)) known_tech += new T RefreshResearch() @@ -120,8 +120,7 @@ GLOBAL_LIST_INIT(design_datums, list()) // A simple helper proc to find the name of a tech with a given ID. /proc/CallTechName(var/ID) - for(var/T in subtypesof(/datum/tech)) - var/datum/tech/check_tech = T + for(var/datum/tech/check_tech as anything in subtypesof(/datum/tech)) if(initial(check_tech.id) == ID) return initial(check_tech.name) diff --git a/code/modules/resleeving/infocore_records.dm b/code/modules/resleeving/infocore_records.dm index 5f3cb027c5..0f16a2b3b7 100644 --- a/code/modules/resleeving/infocore_records.dm +++ b/code/modules/resleeving/infocore_records.dm @@ -182,8 +182,7 @@ organ_data[org] = I.robotic //Genetic modifiers - for(var/modifier in M.modifiers) - var/datum/modifier/mod = modifier + for(var/datum/modifier/mod as anything in M.modifiers) if(mod.flags & MODIFIER_GENETIC) genetic_modifiers.Add(mod.type) diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index 7ba0858334..584ea22aac 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -447,7 +447,7 @@ var/global/list/infomorph_software_by_key = list() var/global/list/default_infomorph_software = list() /hook/startup/proc/populate_infomorph_software_list() var/r = 1 // I would use ., but it'd sacrifice runtime detection - for(var/type in typesof(/datum/infomorph_software) - /datum/infomorph_software) + for(var/type in subtypesof(/datum/infomorph_software)) var/datum/infomorph_software/P = new type() if(infomorph_software_by_key[P.id]) var/datum/infomorph_software/O = infomorph_software_by_key[P.id] diff --git a/code/modules/rogueminer_vr/zonemaster.dm b/code/modules/rogueminer_vr/zonemaster.dm index 2b1f3728f5..15d1887803 100644 --- a/code/modules/rogueminer_vr/zonemaster.dm +++ b/code/modules/rogueminer_vr/zonemaster.dm @@ -191,8 +191,7 @@ return var/farEnough = 1 - for(var/A in SSxenoarch.digsite_spawning_turfs) - var/turf/T = A + for(var/turf/T as anything in SSxenoarch.digsite_spawning_turfs) if(T in range(5, M)) farEnough = 0 break diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index aed060d18e..3ce724f87e 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -76,8 +76,7 @@ if(FA.z in using_map.contact_levels) FA.on_alert_changed(newlevel) //VOREStation Add - for(var/hp in GLOB.holoposters) - var/obj/machinery/holoposter/HP = hp + for(var/obj/machinery/holoposter/HP as anything in GLOB.holoposters) HP.update_icon() //VOREStation Add End diff --git a/code/modules/shuttles/crashes.dm b/code/modules/shuttles/crashes.dm index 6f6c66e177..a71ab5e07e 100644 --- a/code/modules/shuttles/crashes.dm +++ b/code/modules/shuttles/crashes.dm @@ -52,8 +52,7 @@ return // Lucky! // Hide people - for(var/living in victims) - var/mob/living/L = living + for(var/mob/living/L as anything in victims) victims[L] = get_turf(L) L.Sleeping(rand(10,20)) L.Life() @@ -70,8 +69,7 @@ command_announcement.Announce("[crash_message]", "Shuttle Alert") // Put people back - for(var/living in victims) - var/mob/living/L = living + for(var/mob/living/L as anything in victims) L.loc = victims[L] L.adjustBruteLoss(5) L.adjustBruteLoss(10) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 9deff67d7d..7371fa71b9 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -151,8 +151,15 @@ GLOBAL_LIST_BOILERPLATE(papers_dockingcode, /obj/item/weapon/paper/dockingcodes) /hook/roundstart/proc/populate_dockingcodes() +<<<<<<< HEAD for(var/paper in GLOB.papers_dockingcode) var/obj/item/weapon/paper/dockingcodes/dcp = paper +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for(var/paper in global.papers_dockingcode) + var/obj/item/weapon/paper/dockingcodes/dcp = paper +======= + for(var/obj/item/weapon/paper/dockingcodes/dcp as anything in global.papers_dockingcode) +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt dcp.populate_info() return TRUE diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index f871f49bdd..935b47ca72 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -112,8 +112,7 @@ web_master.process_autopath() /datum/shuttle/autodock/web_shuttle/proc/update_helmets() - for(var/helm in helmets) - var/obj/item/clothing/head/pilot/H = helm + for(var/obj/item/clothing/head/pilot/H as anything in helmets) if(QDELETED(H)) helmets -= H continue diff --git a/code/modules/shuttles/web_datums.dm b/code/modules/shuttles/web_datums.dm index 6e34d3750b..d061ebe397 100644 --- a/code/modules/shuttles/web_datums.dm +++ b/code/modules/shuttles/web_datums.dm @@ -193,7 +193,7 @@ /datum/shuttle_web_master/proc/build_destinations() // First, instantiate all the destination subtypes relevant to this datum. - var/list/destination_types = typesof(destination_class) - destination_class + var/list/destination_types = subtypesof(destination_class) for(var/new_type in destination_types) var/datum/shuttle_destination/D = new_type if(initial(D.skip_me)) diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index 4ccfc1a8a6..25b171bb52 100644 --- a/code/modules/tgs/v3210/commands.dm +++ b/code/modules/tgs/v3210/commands.dm @@ -8,7 +8,7 @@ var/list/command_name_types = list() var/list/warned_command_names = warnings_only ? list() : null var/warned_about_the_dangers_of_robutussin = !warnings_only - for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) + for(var/I in subtypesof(/datum/tgs_chat_command)) if(!warned_about_the_dangers_of_robutussin) TGS_ERROR_LOG("Custom chat commands in [ApiVersion()] lacks the /datum/tgs_chat_user/sender.channel field!") warned_about_the_dangers_of_robutussin = TRUE @@ -32,8 +32,7 @@ /datum/tgs_api/v3210/proc/HandleServiceCustomCommand(command, sender, params) if(!cached_custom_tgs_chat_commands) cached_custom_tgs_chat_commands = list() - for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) - var/datum/tgs_chat_command/stc = I + for(var/datum/tgs_chat_command/stc as anything in subtypesof(/datum/tgs_chat_command)) cached_custom_tgs_chat_commands[lowertext(initial(stc.name))] = stc var/command_type = cached_custom_tgs_chat_commands[command] diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 0e37a7aa24..5e338aaa56 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -260,8 +260,7 @@ var/list/ids if(length(channels)) ids = list() - for(var/I in channels) - var/datum/tgs_chat_channel/channel = I + for(var/datum/tgs_chat_channel/channel as anything in channels) ids += channel.id message = list("message" = message, "channelIds" = ids) if(intercepted_message_queue) @@ -271,8 +270,7 @@ /datum/tgs_api/v4/ChatTargetedBroadcast(message, admin_only) var/list/channels = list() - for(var/I in ChatChannelInfo()) - var/datum/tgs_chat_channel/channel = I + for(var/datum/tgs_chat_channel/channel as anything in ChatChannelInfo()) if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id message = list("message" = message, "channelIds" = channels) diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm index 4ca1500167..770b4864b1 100644 --- a/code/modules/tgs/v4/commands.dm +++ b/code/modules/tgs/v4/commands.dm @@ -1,7 +1,7 @@ /datum/tgs_api/v4/proc/ListCustomCommands() var/results = list() custom_commands = list() - for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) + for(var/I in subtypesof(/datum/tgs_chat_command)) var/datum/tgs_chat_command/stc = new I var/command_name = stc.name if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\"")) diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 704ff873c0..0d5adf2fe5 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -302,8 +302,7 @@ channels = ChatChannelInfo() var/list/ids = list() - for(var/I in channels) - var/datum/tgs_chat_channel/channel = I + for(var/datum/tgs_chat_channel/channel as anything in channels) ids += channel.id message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = ids) @@ -314,8 +313,7 @@ /datum/tgs_api/v5/ChatTargetedBroadcast(message, admin_only) var/list/channels = list() - for(var/I in ChatChannelInfo()) - var/datum/tgs_chat_channel/channel = I + for(var/datum/tgs_chat_channel/channel as anything in ChatChannelInfo()) if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = channels) diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm index 6d31dd3422..e5b2562efe 100644 --- a/code/modules/tgs/v5/commands.dm +++ b/code/modules/tgs/v5/commands.dm @@ -1,7 +1,7 @@ /datum/tgs_api/v5/proc/ListCustomCommands() var/results = list() custom_commands = list() - for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) + for(var/I in subtypesof(/datum/tgs_chat_command)) var/datum/tgs_chat_command/stc = new I var/command_name = stc.name if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\"")) diff --git a/code/modules/tgui/modules/admin_shuttle_controller.dm b/code/modules/tgui/modules/admin_shuttle_controller.dm index a40dec8fca..d03e78b32d 100644 --- a/code/modules/tgui/modules/admin_shuttle_controller.dm +++ b/code/modules/tgui/modules/admin_shuttle_controller.dm @@ -19,8 +19,7 @@ data["shuttles"] = shuttles var/list/overmap_ships = list() - for(var/ship in SSshuttles.ships) - var/obj/effect/overmap/visitable/ship/S = ship + for(var/obj/effect/overmap/visitable/ship/S as anything in SSshuttles.ships) overmap_ships.Add(list(list( "name" = S.name, "ref" = REF(S), diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index 3b84e95d53..fe7bb95440 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -45,8 +45,7 @@ cam_plane_masters = get_tgui_plane_masters() - for(var/plane in cam_plane_masters) - var/obj/screen/instance = plane + for(var/obj/screen/instance as anything in cam_plane_masters) instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index abfef14be1..fa67030d55 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -37,8 +37,7 @@ cam_plane_masters = get_tgui_plane_masters() - for(var/plane in cam_plane_masters) - var/obj/screen/instance = plane + for(var/obj/screen/instance as anything in cam_plane_masters) instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/modules/tgui/modules/ntos-only/cardmod.dm b/code/modules/tgui/modules/ntos-only/cardmod.dm index fc77417996..8a8ace688f 100644 --- a/code/modules/tgui/modules/ntos-only/cardmod.dm +++ b/code/modules/tgui/modules/ntos-only/cardmod.dm @@ -49,8 +49,7 @@ data["target_name"] = id_card ? id_card.name : "-----" var/list/departments = list() - for(var/D in SSjob.get_all_department_datums()) - var/datum/department/dept = D + for(var/datum/department/dept as anything in SSjob.get_all_department_datums()) if(!dept.assignable) // No AI ID cards for you. continue if(dept.centcom_only && !is_centcom) diff --git a/code/modules/tgui/modules/ntos-only/uav.dm b/code/modules/tgui/modules/ntos-only/uav.dm index b9288457e5..54dcda1675 100644 --- a/code/modules/tgui/modules/ntos-only/uav.dm +++ b/code/modules/tgui/modules/ntos-only/uav.dm @@ -30,8 +30,7 @@ var/list/paired_map = list() var/obj/item/modular_computer/mc_host = tgui_host() if(istype(mc_host)) - for(var/puav in mc_host.paired_uavs) - var/weakref/wr = puav + for(var/weakref/wr as anything in mc_host.paired_uavs) var/obj/item/device/uav/U = wr.resolve() paired_map.Add(list(list("name" = "[U ? U.nickname : "!!Missing!!"]", "uavref" = "\ref[U]"))) @@ -148,8 +147,7 @@ var/list/zlevels_in_long_range = using_map.get_map_levels(their_z, TRUE, om_range = DEFAULT_OVERMAP_RANGE) - zlevels_in_range var/their_signal = 0 // Measure z-distance between the AM passed in and the nearest relay - for(var/relay in ntnet_global.relays) - var/obj/machinery/ntnet_relay/R = relay + for(var/obj/machinery/ntnet_relay/R as anything in ntnet_global.relays) if(!R.operable()) continue if(R.z == their_z) diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index b0e92139b4..dd9ae7ead7 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -57,10 +57,9 @@ var/list/L = list() - for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) - var/datum/disease2/effect/f = e + for(var/datum/disease2/effect/f as anything in subtypesof(/datum/disease2/effect)) if(initial(f.stage) <= stage) - L[initial(f.name)] = e + L[initial(f.name)] = f var/datum/disease2/effect/Eff = s[stage] diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index dd19e5e3f4..5e3e955574 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -15,9 +15,8 @@ /datum/disease2/effectholder/proc/getrandomeffect(var/badness = 1, exclude_types=list()) var/list/datum/disease2/effect/list = list() - for(var/e in (typesof(/datum/disease2/effect) - /datum/disease2/effect)) - var/datum/disease2/effect/f = e - if(e in exclude_types) + for(var/datum/disease2/effect/f as anything in subtypesof(/datum/disease2/effect)) + if(f in exclude_types) continue if(initial(f.badness) > badness) //we don't want such strong effects continue diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 92724d0f86..16d1280b21 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -326,8 +326,7 @@ var/count = 0 //Iterate over contents and move them all - for(var/thing in contents) - var/atom/movable/AM = thing + for(var/atom/movable/AM as anything in contents) if(isliving(AM)) var/mob/living/L = AM if(L.absorbed && !include_absorbed) @@ -639,8 +638,7 @@ //This in particular will recurse oddly because if there is absorbed prey of prey of prey... //it will just move them up one belly. This should never happen though since... when they were //absobred, they should have been absorbed as well! - for(var/belly in M.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in M.vore_organs) for(var/mob/living/Mm in B) if(Mm.absorbed) absorb_living(Mm) @@ -777,8 +775,7 @@ else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started. var/obj/belly/dest_belly - for(var/belly in owner.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in owner.vore_organs) if(B.name == transferlocation) dest_belly = B break diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index aec57913ee..4687fb30cc 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -85,11 +85,11 @@ ///////////////////// Time to actually process mobs ///////////////////// - for(var/target in touchable_mobs) - var/mob/living/L = target + for(var/mob/living/L as anything in touchable_mobs) if(!istype(L)) + stack_trace("Touchable mobs had a nonmob: [L]") continue - var/list/returns = DM.process_mob(src, target) + var/list/returns = DM.process_mob(src, L) if(istype(returns) && returns["to_update"]) to_update = TRUE if(istype(returns) && returns["soundToPlay"] && !play_sound) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index d69ccb25b9..588d2ef503 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -251,8 +251,7 @@ var/list/serialized = list() - for(var/belly in src.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in src.vore_organs) serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks. P.belly_prefs = serialized @@ -305,8 +304,7 @@ // Release everything in every vore organ // /mob/living/proc/release_vore_contents(var/include_absorbed = TRUE, var/silent = FALSE) - for(var/belly in vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in vore_organs) B.release_all_contents(include_absorbed, silent) // @@ -317,10 +315,27 @@ return list() var/list/message_list = list() +<<<<<<< HEAD for (var/belly in vore_organs) var/obj/belly/B = belly message_list += B.get_examine_msg() message_list += B.get_examine_msg_absorbed() +||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + for (var/belly in vore_organs) + var/obj/belly/B = belly + var/bellymessage = B.get_examine_msg() + if(bellymessage) message_list += bellymessage + + bellymessage = B.get_examine_msg_absorbed() + if(bellymessage) message_list += bellymessage +======= + for(var/obj/belly/B as anything in vore_organs) + var/bellymessage = B.get_examine_msg() + if(bellymessage) message_list += bellymessage + + bellymessage = B.get_examine_msg_absorbed() + if(bellymessage) message_list += bellymessage +>>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt return message_list diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index c506ff98af..82133bf126 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -139,8 +139,7 @@ data["inside"] = inside var/list/our_bellies = list() - for(var/belly in host.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in host.vore_organs) our_bellies.Add(list(list( "selected" = (B == host.vore_selected), "name" = B.name, @@ -320,8 +319,7 @@ failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." // else if(whatever) //Next test here. else - for(var/belly in host.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in host.vore_organs) if(lowertext(new_name) == lowertext(B.name)) failure_msg = "No duplicate belly names, please." break @@ -694,8 +692,7 @@ failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." // else if(whatever) //Next test here. else - for(var/belly in host.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in host.vore_organs) if(lowertext(new_name) == lowertext(B.name)) failure_msg = "No duplicate belly names, please." break @@ -1034,8 +1031,7 @@ var/failure_msg = "" var/dest_for //Check to see if it's the destination of another vore organ. - for(var/belly in host.vore_organs) - var/obj/belly/B = belly + for(var/obj/belly/B as anything in host.vore_organs) if(B.transferlocation == host.vore_selected) dest_for = B.name failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. " diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index bbf54ed469..e723561a73 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -33,11 +33,11 @@ secondary_effect.ToggleActivate(0) else - var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) + var/effecttype = pick(subtypesof(/datum/artifact_effect)) my_effect = new effecttype(src) if(prob(75)) - effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) + effecttype = pick(subtypesof(/datum/artifact_effect)) secondary_effect = new effecttype(src) if(prob(75)) secondary_effect.ToggleActivate(0) @@ -85,11 +85,11 @@ secondary_effect.trigger = predefined_trig_secondary /obj/machinery/artifact/proc/choose_effect() - var/effect_type = tgui_input_list(usr, "What type do you want?", "Effect Type", typesof(/datum/artifact_effect) - /datum/artifact_effect) + var/effect_type = tgui_input_list(usr, "What type do you want?", "Effect Type", subtypesof(/datum/artifact_effect)) if(effect_type) my_effect = new effect_type(src) if(tgui_alert(usr, "Do you want a secondary effect?", "Second Effect", list("No", "Yes")) == "Yes") - var/second_effect_type = tgui_input_list(usr, "What type do you want as well?", "Second Effect Type", typesof(/datum/artifact_effect) - list(/datum/artifact_effect, effect_type)) + var/second_effect_type = tgui_input_list(usr, "What type do you want as well?", "Second Effect Type", subtypesof(/datum/artifact_effect) - effect_type) secondary_effect = new second_effect_type(src) else secondary_effect = null diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index f16eae5458..14bda53ca2 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -58,8 +58,7 @@ var/turf/cur_turf = get_turf(src) if(SSxenoarch) //Sanity check due to runtimes ~Z - for(var/A in SSxenoarch.artifact_spawning_turfs) - var/turf/simulated/mineral/T = A + for(var/turf/simulated/mineral/T as anything in SSxenoarch.artifact_spawning_turfs) if(T.density && T.artifact_find) if(T.z == cur_turf.z) var/cur_dist = get_dist(cur_turf, T) * 2 @@ -69,8 +68,7 @@ else SSxenoarch.artifact_spawning_turfs.Remove(T) - for(var/A in SSxenoarch.digsite_spawning_turfs) - var/turf/simulated/mineral/T = A + for(var/turf/simulated/mineral/T as anything in SSxenoarch.digsite_spawning_turfs) if(T.density && T.finds && T.finds.len) if(T.z == cur_turf.z) var/cur_dist = get_dist(cur_turf, T) * 2 diff --git a/code/modules/xenobio2/mob/slime/slime.dm b/code/modules/xenobio2/mob/slime/slime.dm index 3d52c053d8..a3fca442d5 100644 --- a/code/modules/xenobio2/mob/slime/slime.dm +++ b/code/modules/xenobio2/mob/slime/slime.dm @@ -82,7 +82,7 @@ Slime definitions, Life and New live here. /mob/living/simple_mob/xeno/slime/New() ..() - for(var/datum/language/L in (typesof(/datum/language) - /datum/language)) + for(var/datum/language/L in subtypesof(/datum/language)) languages += L speak += "[station_name()]?" traitdat.source = "Slime" diff --git a/code/modules/xgm/xgm_gas_data.dm b/code/modules/xgm/xgm_gas_data.dm index 4ee3e1c501..42c508c4f6 100644 --- a/code/modules/xgm/xgm_gas_data.dm +++ b/code/modules/xgm/xgm_gas_data.dm @@ -29,7 +29,7 @@ /hook/startup/proc/generateGasData() gas_data = new - for(var/p in (typesof(/decl/xgm_gas) - /decl/xgm_gas)) + for(var/p in subtypesof(/decl/xgm_gas)) var/decl/xgm_gas/gas = new p //avoid initial() because of potential New() actions if(gas.id in gas_data.gases) diff --git a/code/unit_tests/integrated_circuits/prefabs.dm b/code/unit_tests/integrated_circuits/prefabs.dm index 04b3136640..1436e7d097 100644 --- a/code/unit_tests/integrated_circuits/prefabs.dm +++ b/code/unit_tests/integrated_circuits/prefabs.dm @@ -10,8 +10,7 @@ var/available_size = initial(assembly.max_components) var/available_complexity = initial(assembly.max_complexity) - for(var/ic in prefab.integrated_circuits) - var/datum/ic_assembly_integrated_circuits/iaic = ic + for(var/datum/ic_assembly_integrated_circuits/iaic as anything in prefab.integrated_circuits) var/obj/item/integrated_circuit/circuit = iaic.circuit_type available_size -= initial(circuit.size) available_complexity -= initial(circuit.complexity) diff --git a/code/unit_tests/loadout_tests.dm b/code/unit_tests/loadout_tests.dm index aba7184229..f6bfd19d5a 100644 --- a/code/unit_tests/loadout_tests.dm +++ b/code/unit_tests/loadout_tests.dm @@ -3,8 +3,7 @@ /datum/unit_test/loadout_test_shall_have_name_cost_path/start_test() var/failed = 0 - for(var/geartype in typesof(/datum/gear) - /datum/gear) - var/datum/gear/G = geartype + for(var/datum/gear/G as anything in subtypesof(/datum/gear)) if(!initial(G.display_name)) log_unit_test("[G]: Loadout - Missing display name.") diff --git a/code/unit_tests/research_tests.dm b/code/unit_tests/research_tests.dm index 9d0174cabe..09de5aaca6 100644 --- a/code/unit_tests/research_tests.dm +++ b/code/unit_tests/research_tests.dm @@ -47,7 +47,7 @@ /datum/unit_test/research_designs_have_valid_materials/start_test() var/number_of_issues = 0 - for(var/design_type in typesof(/datum/design) - /datum/design) + for(var/design_type in subtypesof(/datum/design)) var/datum/design/design = design_type if(initial(design.id) == "id") continue diff --git a/maps/tether/tether_shuttles.dm b/maps/tether/tether_shuttles.dm index 0481ba9741..f8e126d024 100644 --- a/maps/tether/tether_shuttles.dm +++ b/maps/tether/tether_shuttles.dm @@ -94,8 +94,7 @@ /datum/shuttle/ferry/tether_backup/process_longjump(var/area/origin, var/area/intended_destination) var/failures = engines.len - for(var/engine in engines) - var/obj/structure/shuttle/engine/E = engine + for(var/obj/structure/shuttle/engine/E as anything in engines) failures -= E.jump() #define MOVE_PER(x) move_time*(x/100) SECONDS diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 4a6b06fc77..67f4ea76a3 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -3,7 +3,7 @@ var/datum/map/using_map = new USING_MAP_DATUM var/list/all_maps = list() /hook/startup/proc/initialise_map_list() - for(var/type in typesof(/datum/map) - /datum/map) + for(var/type in subtypesof(/datum/map)) var/datum/map/M if(type == using_map.type) M = using_map From 26f3292fc12171234c80912c435b877322b075ee Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 17:27:42 -0400 Subject: [PATCH 32/86] Merge pull request #11178 from Mewchild/MC-TtSQoL TTS Devices can now be used in chairs, and by alt clicking from pockets --- code/game/objects/items/devices/text_to_speech.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm index e962124022..54510fb9a4 100644 --- a/code/game/objects/items/devices/text_to_speech.dm +++ b/code/game/objects/items/devices/text_to_speech.dm @@ -7,7 +7,7 @@ var/named /obj/item/device/text_to_speech/attack_self(mob/user as mob) - if(user.incapacitated(INCAPACITATION_ALL)) //Are you in a state to actual use the device? + if(user.incapacitated(INCAPACITATION_KNOCKDOWN|INCAPACITATION_DISABLED)) // EDIT: We can use the device only if we are not in certain types of incapacitation. We don't want chairs stopping us from texting!! to_chat(user, "You cannot activate the device in your state.") return @@ -27,3 +27,6 @@ audible_message("[bicon(src)] \The [src.name] states, \"[message]\"", runemessage = "synthesized speech") if(ismob(loc)) loc.audible_message("", runemessage = "\[TTS Voice\] [message]") + +/obj/item/device/text_to_speech/AltClick(mob/user) // QOL Change + attack_self(user) From 609e62764e153a12aa49bf84388b4ea73e9b41e6 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:45:26 -0400 Subject: [PATCH 34/86] powder that makes you say yes --- vorestation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/vorestation.dme b/vorestation.dme index a0685571f0..29a53ccd20 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -790,7 +790,6 @@ #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" #include "code\game\jobs\access_datum_vr.dm" -#include "code\game\jobs\access_datum_yw.dm" #include "code\game\jobs\job_controller.dm" #include "code\game\jobs\jobs.dm" #include "code\game\jobs\whitelist.dm" From dd74255cdae6e9d0ef7ff9f8a0a8897aa79cf1e8 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:48:03 -0400 Subject: [PATCH 35/86] powder that makes you say yes --- code/controllers/configuration.dm | 2293 +---------------------------- 1 file changed, 2 insertions(+), 2291 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 7e81359cb8..d162cc3616 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,4 +1,4 @@ -<<<<<<< HEAD +<<<<<<< HEAD var/list/gamemode_cache = list() /datum/configuration @@ -233,7 +233,7 @@ var/list/gamemode_cache = list() // 15, 45, 70 minutes respectively var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - var/static/aliens_allowed = 1 //CHOMPedit to 1. This not only allows the natural spawning of xenos, but also the ability to lay eggs. Genaprawns cannot lay eggs if this is 0 + var/static/aliens_allowed = 1 var/static/ninjas_allowed = 0 var/static/abandon_allowed = 1 var/static/ooc_allowed = 1 @@ -1150,2292 +1150,3 @@ var/list/gamemode_cache = list() config.python_path = "/usr/bin/env python2" else //probably windows, if not this should work anyway config.python_path = "python" -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -var/list/gamemode_cache = list() - -/datum/configuration - var/static/server_name = null // server name (for world name / status) - var/static/server_suffix = 0 // generate numeric suffix based on server port - - var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located - - var/static/log_ooc = 0 // log OOC channel - var/static/log_access = 0 // log login/logout - var/static/log_say = 0 // log client say - var/static/log_admin = 0 // log admin actions - var/static/log_debug = 1 // log debug output - var/static/log_game = 0 // log game events - var/static/log_vote = 0 // log voting - var/static/log_whisper = 0 // log client whisper - var/static/log_emote = 0 // log emotes - var/static/log_attack = 0 // log attack messages - var/static/log_adminchat = 0 // log admin chat messages - var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such - var/static/log_pda = 0 // log pda messages - var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits - var/static/log_runtime = 0 // logs world.log to a file - var/static/log_world_output = 0 // log to_world_log(messages) - var/static/log_graffiti = 0 // logs graffiti - var/static/sql_enabled = 0 // for sql switching - var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour - var/static/allow_vote_restart = 0 // allow votes to restart - var/static/ert_admin_call_only = 0 - var/static/allow_vote_mode = 0 // allow votes to change mode - var/static/allow_admin_jump = 1 // allows admin jumping - var/static/allow_admin_spawning = 1 // allows admin item spawning - var/static/allow_admin_rev = 1 // allows admin revives - var/static/pregame_time = 180 // pregame time in seconds - var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) - var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) - var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called - var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote - var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). - var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) - var/static/vote_no_dead = 0 // dead people can't vote (tbi) -// var/static/enable_authentication = 0 // goon authentication - var/static/del_new_on_log = 1 // del's new players if they log before they spawn in - var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players - var/static/objectives_disabled = 0 //if objectives are disabled or not - var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/static/allow_Metadata = 0 // Metadata is supported. - var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/static/fps = 20 - var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling - var/static/Tickcomp = 0 - var/static/socket_talk = 0 // use socket_talk to communicate with other processes - var/static/list/resource_urls = null - var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. - var/static/list/mode_names = list() - var/static/list/modes = list() // allowed modes - var/static/list/votable_modes = list() // votable modes - var/static/list/probabilities = list() // relative probability of each mode - var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. - var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. - var/static/humans_need_surnames = 0 - var/static/allow_random_events = 0 // enables random events mid-round when set to 1 - var/static/enable_game_master = 0 // enables the 'smart' event system. - var/static/allow_ai = 1 // allow ai job - var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. - var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell - var/static/hostedby = null - - var/static/respawn = 1 - var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) - var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" - - var/static/guest_jobban = 1 - var/static/usewhitelist = 0 - var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 - var/static/show_mods = 0 - var/static/show_devs = 0 - var/static/show_event_managers = 0 - var/static/mods_can_tempban = 0 - var/static/mods_can_job_tempban = 0 - var/static/mod_tempban_max = 1440 - var/static/mod_job_tempban_max = 1440 - var/static/load_jobs_from_txt = 0 - var/static/ToRban = 0 - var/static/automute_on = 0 //enables automuting/spam prevention - var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. - - var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... - var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. - - var/static/character_slots = 10 // The number of available character slots - var/static/loadout_slots = 3 // The number of loadout slots per character - - var/static/max_maint_drones = 5 //This many drones can spawn, - var/static/allow_drone_spawn = 1 //assuming the admin allow them to. - var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. - - var/static/disable_player_mice = 0 - var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech - - var/static/usealienwhitelist = 0 - var/static/limitalienplayers = 0 - var/static/alien_to_human_ratio = 0.5 - var/static/allow_extra_antags = 0 - var/static/guests_allowed = 1 - var/static/debugparanoid = 0 - var/static/panic_bunker = 0 - var/static/paranoia_logging = 0 - - var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. - var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. - var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). - var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. - var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. - var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. - - var/static/serverurl - var/static/server - var/static/banappeals - var/static/wikiurl - var/static/wikisearchurl - var/static/forumurl - var/static/githuburl - var/static/discordurl - var/static/rulesurl - var/static/mapurl - - //Alert level description - var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." - var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." - var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - - var/static/forbid_singulo_possession = 0 - - //game_options.txt configs - - var/static/health_threshold_softcrit = 0 - var/static/health_threshold_crit = 0 - var/static/health_threshold_dead = -100 - - var/static/organ_health_multiplier = 1 - var/static/organ_regeneration_multiplier = 1 - var/static/organs_decay - var/static/default_brain_health = 400 - var/static/allow_headgibs = FALSE - - //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, - //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. - var/static/organ_damage_spillover_multiplier = 0.5 - - var/static/bones_can_break = 0 - var/static/limbs_can_break = 0 - - var/static/revival_pod_plants = 1 - var/static/revival_cloning = 1 - var/static/revival_brain_life = -1 - - var/static/use_loyalty_implants = 0 - - var/static/welder_vision = 1 - var/static/generate_map = 0 - var/static/no_click_cooldown = 0 - - //Used for modifying movement speed for mobs. - //Unversal modifiers - var/static/run_speed = 0 - var/static/walk_speed = 0 - - //Mob specific modifiers. NOTE: These will affect different mob types in different ways - var/static/human_delay = 0 - var/static/robot_delay = 0 - var/static/monkey_delay = 0 - var/static/alien_delay = 0 - var/static/slime_delay = 0 - var/static/animal_delay = 0 - - var/static/footstep_volume = 0 - - var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt - var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt - var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database - var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database - - var/static/simultaneous_pm_warning_timeout = 100 - - var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. - var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. - - var/static/assistant_maint = 0 //Do assistants get maint access? - var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. - var/static/ghost_interaction = 0 - - var/static/comms_password = "" - - var/static/enter_allowed = 1 - - var/use_irc_bot = 0 - var/use_node_bot = 0 - var/irc_bot_port = 0 - var/irc_bot_host = "" - var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge - var/main_irc = "" - var/admin_irc = "" - var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix - var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. - var/use_overmap = 0 - - var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. - - // Event settings - var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours - // If the first delay has a custom start time - // No custom time, no custom time, between 80 to 100 minutes respectively. - var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) - // The lowest delay until next event - // 10, 30, 50 minutes respectively - var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) - // The upper delay until next event - // 15, 45, 70 minutes respectively - var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - - var/static/aliens_allowed = 0 - var/static/ninjas_allowed = 0 - var/static/abandon_allowed = 1 - var/static/ooc_allowed = 1 - var/static/looc_allowed = 1 - var/static/dooc_allowed = 1 - var/static/dsay_allowed = 1 - - var/persistence_disabled = FALSE - var/persistence_ignore_mapload = FALSE - - var/allow_byond_links = 0 - var/allow_discord_links = 0 - var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations - - var/starlight = 0 // Whether space turfs have ambient light or not - - var/static/list/ert_species = list(SPECIES_HUMAN) - - var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" - - var/static/aggressive_changelog = 0 - - var/static/list/language_prefixes = list(",","#")//Default language prefixes - - var/static/show_human_death_message = 1 - - var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf - var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick - var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit - var/static/radiation_material_resistance_divisor = 1 - var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. - - var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. - var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. - - // New shiny SQLite stuff. - // The basics. - var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. - - // In-Game Feedback. - var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. - var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. - var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. - var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. - var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. - - var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. - var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. - - // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. - var/static/disable_cid_warn_popup = FALSE - - // whether or not to use the nightshift subsystem to perform lighting changes - var/static/enable_night_shifts = FALSE - - // How strictly the loadout enforces object species whitelists - var/loadout_whitelist = LOADOUT_WHITELIST_LAX - - var/static/vgs_access_identifier = null // VOREStation Edit - VGS - var/static/vgs_server_port = null // VOREStation Edit - VGS - - var/disable_webhook_embeds = FALSE - - var/static/list/jukebox_track_files - -/datum/configuration/New() - var/list/L = typesof(/datum/game_mode) - /datum/game_mode - for (var/T in L) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - if (M.config_tag) - gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. - if(!(M.config_tag in modes)) // ensure each mode is added only once - log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - player_requirements[M.config_tag] = M.required_players - player_requirements_secret[M.config_tag] = M.required_players_secret - if (M.votable) - src.votable_modes += M.config_tag - src.votable_modes += "secret" - -/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) - - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - if(type == "config") - switch (name) - if ("resource_urls") - config.resource_urls = splittext(value, " ") - - if ("admin_legacy_system") - config.admin_legacy_system = 1 - - if ("ban_legacy_system") - config.ban_legacy_system = 1 - - if ("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 - - if ("use_age_restriction_for_antags") - config.use_age_restriction_for_antags = 1 - - if ("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 - - if ("use_recursive_explosions") - use_recursive_explosions = 1 - - if ("multi_z_explosion_scalar") - multi_z_explosion_scalar = text2num(value) - - if ("log_ooc") - config.log_ooc = 1 - - if ("log_access") - config.log_access = 1 - - if ("sql_enabled") - config.sql_enabled = 1 - - if ("log_say") - config.log_say = 1 - - if ("debug_paranoid") - config.debugparanoid = 1 - - if ("log_admin") - config.log_admin = 1 - - if ("log_debug") - config.log_debug = text2num(value) - - if ("log_game") - config.log_game = 1 - - if ("log_vote") - config.log_vote = 1 - - if ("log_whisper") - config.log_whisper = 1 - - if ("log_attack") - config.log_attack = 1 - - if ("log_emote") - config.log_emote = 1 - - if ("log_adminchat") - config.log_adminchat = 1 - - if ("log_adminwarn") - config.log_adminwarn = 1 - - if ("log_pda") - config.log_pda = 1 - - if ("log_world_output") - config.log_world_output = 1 - - if ("log_hrefs") - config.log_hrefs = 1 - - if ("log_runtime") - config.log_runtime = 1 - - if ("log_graffiti") - config.log_graffiti = 1 - - if ("generate_map") - config.generate_map = 1 - - if ("no_click_cooldown") - config.no_click_cooldown = 1 - - if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 - - if ("allow_vote_restart") - config.allow_vote_restart = 1 - - if ("allow_vote_mode") - config.allow_vote_mode = 1 - - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("allow_byond_links") - allow_byond_links = 1 - - if ("allow_discord_links") - allow_discord_links = 1 - - if ("allow_url_links") - allow_url_links = 1 - - if ("no_dead_vote") - config.vote_no_dead = 1 - - if ("default_no_vote") - config.vote_no_default = 1 - - if ("pregame_time") - config.pregame_time = text2num(value) - - if ("vote_delay") - config.vote_delay = text2num(value) - - if ("vote_period") - config.vote_period = text2num(value) - - if ("vote_autotransfer_initial") - config.vote_autotransfer_initial = text2num(value) - - if ("vote_autotransfer_interval") - config.vote_autotransfer_interval = text2num(value) - - if ("vote_autogamemode_timeleft") - config.vote_autogamemode_timeleft = text2num(value) - - if("ert_admin_only") - config.ert_admin_call_only = 1 - - if ("allow_ai") - config.allow_ai = 1 - - if ("allow_ai_shells") - config.allow_ai_shells = TRUE - - if("give_free_ai_shell") - config.give_free_ai_shell = TRUE - -// if ("authentication") -// config.enable_authentication = 1 - - if ("norespawn") - config.respawn = 0 - - if ("respawn_time") - var/raw_minutes = text2num(value) - config.respawn_time = raw_minutes MINUTES - - if ("respawn_message") - config.respawn_message = "[value]" - - if ("servername") - config.server_name = value - - if ("serversuffix") - config.server_suffix = 1 - - if ("nudge_script_path") - config.nudge_script_path = value - - if ("hostedby") - config.hostedby = value - - if ("serverurl") - config.serverurl = value - - if ("server") - config.server = value - - if ("banappeals") - config.banappeals = value - - if ("wikiurl") - config.wikiurl = value - - if ("wikisearchurl") - config.wikisearchurl = value - - if ("forumurl") - config.forumurl = value - - if ("rulesurl") - config.rulesurl = value - - if ("mapurl") - config.mapurl = value - - if ("githuburl") - config.githuburl = value - - if ("discordurl") - config.discordurl = value - - if ("guest_jobban") - config.guest_jobban = 1 - - if ("guest_ban") - config.guests_allowed = 0 - - if ("disable_ooc") - config.ooc_allowed = 0 - config.looc_allowed = 0 - - if ("disable_entry") - config.enter_allowed = 0 - - if ("disable_dead_ooc") - config.dooc_allowed = 0 - - if ("disable_dsay") - config.dsay_allowed = 0 - - if ("disable_respawn") - config.abandon_allowed = 0 - - if ("usewhitelist") - config.usewhitelist = 1 - - if ("feature_object_spell_system") - config.feature_object_spell_system = 1 - - if ("allow_metadata") - config.allow_Metadata = 1 - - if ("traitor_scaling") - config.traitor_scaling = 1 - - if ("aliens_allowed") - config.aliens_allowed = 1 - - if ("ninjas_allowed") - config.ninjas_allowed = 1 - - if ("objectives_disabled") - config.objectives_disabled = 1 - - if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 - - if("persistence_disabled") - config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. - - if("persistence_ignore_mapload") - config.persistence_ignore_mapload = TRUE - - if ("probability") - var/prob_pos = findtext(value, " ") - var/prob_name = null - var/prob_value = null - - if (prob_pos) - prob_name = lowertext(copytext(value, 1, prob_pos)) - prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) - else - log_misc("Unknown game mode probability configuration definition: [prob_name].") - else - log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") - - if ("required_players", "required_players_secret") - var/req_pos = findtext(value, " ") - var/req_name = null - var/req_value = null - var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. - - if(req_pos) - req_name = lowertext(copytext(value, 1, req_pos)) - req_value = copytext(value, req_pos + 1) - if(req_name in config.modes) - if(is_secret_override) - config.player_requirements_secret[req_name] = text2num(req_value) - else - config.player_requirements[req_name] = text2num(req_value) - else - log_misc("Unknown game mode player requirement configuration definition: [req_name].") - else - log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") - - if("allow_random_events") - config.allow_random_events = 1 - - if("enable_game_master") - config.enable_game_master = 1 - - if("kick_inactive") - config.kick_inactive = text2num(value) - - if("show_mods") - config.show_mods = 1 - - if("show_devs") - config.show_devs = 1 - - if("show_event_managers") - config.show_event_managers = 1 - - if("mods_can_tempban") - config.mods_can_tempban = 1 - - if("mods_can_job_tempban") - config.mods_can_job_tempban = 1 - - if("mod_tempban_max") - config.mod_tempban_max = text2num(value) - - if("mod_job_tempban_max") - config.mod_job_tempban_max = text2num(value) - - if("load_jobs_from_txt") - load_jobs_from_txt = 1 - - if("alert_red_upto") - config.alert_desc_red_upto = value - - if("alert_red_downto") - config.alert_desc_red_downto = value - - if("alert_blue_downto") - config.alert_desc_blue_downto = value - - if("alert_blue_upto") - config.alert_desc_blue_upto = value - - if("alert_green") - config.alert_desc_green = value - - if("alert_delta") - config.alert_desc_delta = value - - if("forbid_singulo_possession") - forbid_singulo_possession = 1 - - if("popup_admin_pm") - config.popup_admin_pm = 1 - - if("allow_holidays") - Holiday = 1 - - if("use_irc_bot") - use_irc_bot = 1 - - if("use_node_bot") - use_node_bot = 1 - - if("irc_bot_port") - config.irc_bot_port = value - - if("irc_bot_export") - irc_bot_export = 1 - - if("ticklag") - var/ticklag = text2num(value) - if(ticklag > 0) - fps = 10 / ticklag - - if("tick_limit_mc_init") - tick_limit_mc_init = text2num(value) - - if("allow_antag_hud") - config.antag_hud_allowed = 1 - if("antag_hud_restricted") - config.antag_hud_restricted = 1 - - if("socket_talk") - socket_talk = text2num(value) - - if("tickcomp") - Tickcomp = 1 - - if("humans_need_surnames") - humans_need_surnames = 1 - - if("tor_ban") - ToRban = 1 - - if("automute_on") - automute_on = 1 - - if("usealienwhitelist") - usealienwhitelist = 1 - - if("alien_player_ratio") - limitalienplayers = 1 - alien_to_human_ratio = text2num(value) - - if("assistant_maint") - config.assistant_maint = 1 - - if("gateway_delay") - config.gateway_delay = text2num(value) - - if("continuous_rounds") - config.continous_rounds = 1 - - if("ghost_interaction") - config.ghost_interaction = 1 - - if("disable_player_mice") - config.disable_player_mice = 1 - - if("uneducated_mice") - config.uneducated_mice = 1 - - if("comms_password") - config.comms_password = value - - if("irc_bot_host") - config.irc_bot_host = value - - if("main_irc") - config.main_irc = value - - if("admin_irc") - config.admin_irc = value - - if("python_path") - if(value) - config.python_path = value - - if("use_lib_nudge") - config.use_lib_nudge = 1 - - if("allow_cult_ghostwriter") - config.cult_ghostwriter = 1 - - if("req_cult_ghostwriter") - config.cult_ghostwriter_req_cultists = text2num(value) - - if("character_slots") - config.character_slots = text2num(value) - - if("loadout_slots") - config.loadout_slots = text2num(value) - - if("allow_drone_spawn") - config.allow_drone_spawn = text2num(value) - - if("drone_build_time") - config.drone_build_time = text2num(value) - - if("max_maint_drones") - config.max_maint_drones = text2num(value) - - if("use_overmap") - config.use_overmap = 1 - - if("engine_map") - config.engine_map = splittext(value, ",") -/* - if("station_levels") - using_map.station_levels = text2numlist(value, ";") - - if("admin_levels") - using_map.admin_levels = text2numlist(value, ";") - - if("contact_levels") - using_map.contact_levels = text2numlist(value, ";") - - if("player_levels") - using_map.player_levels = text2numlist(value, ";") -*/ - if("expected_round_length") - config.expected_round_length = MinutesToTicks(text2num(value)) - - if("disable_welder_vision") - config.welder_vision = 0 - - if("allow_extra_antags") - config.allow_extra_antags = 1 - - if("event_custom_start_mundane") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_moderate") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_major") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_delay_lower") - var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("event_delay_upper") - var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("starlight") - value = text2num(value) - config.starlight = value >= 0 ? value : 0 - - if("ert_species") - config.ert_species = splittext(value, ";") - if(!config.ert_species.len) - config.ert_species += SPECIES_HUMAN - - if("law_zero") - law_zero = value - - if("aggressive_changelog") - config.aggressive_changelog = 1 - - if("default_language_prefixes") - var/list/values = splittext(value, " ") - if(values.len > 0) - language_prefixes = values - - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - - if("radiation_resistance_calc_divide") - radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV - - if("radiation_resistance_calc_subtract") - radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB - - if("radiation_resistance_multiplier") - radiation_resistance_multiplier = text2num(value) - - if("radiation_material_resistance_divisor") - radiation_material_resistance_divisor = text2num(value) - - if("radiation_decay_rate") - radiation_decay_rate = text2num(value) - - if ("panic_bunker") - config.panic_bunker = 1 - - if ("paranoia_logging") - config.paranoia_logging = 1 - - if("ip_reputation") - config.ip_reputation = 1 - - if("ipr_email") - config.ipr_email = value - - if("ipr_block_bad_ips") - config.ipr_block_bad_ips = 1 - - if("ipr_bad_score") - config.ipr_bad_score = text2num(value) - - if("ipr_allow_existing") - config.ipr_allow_existing = 1 - - if("ipr_minimum_age") - config.ipr_minimum_age = text2num(value) - - if("random_submap_orientation") - config.random_submap_orientation = 1 - - if("autostart_solars") - config.autostart_solars = TRUE - - if("sqlite_enabled") - config.sqlite_enabled = TRUE - - if("sqlite_feedback") - config.sqlite_feedback = TRUE - - if("sqlite_feedback_topics") - config.sqlite_feedback_topics = splittext(value, ";") - if(!config.sqlite_feedback_topics.len) - config.sqlite_feedback_topics += "General" - - if("sqlite_feedback_privacy") - config.sqlite_feedback_privacy = TRUE - - if("sqlite_feedback_cooldown") - config.sqlite_feedback_cooldown = text2num(value) - - if("defib_timer") - config.defib_timer = text2num(value) - - if("defib_braindamage_timer") - config.defib_braindamage_timer = text2num(value) - - if("disable_cid_warn_popup") - config.disable_cid_warn_popup = TRUE - - if("enable_night_shifts") - config.enable_night_shifts = TRUE - - if("jukebox_track_files") - config.jukebox_track_files = splittext(value, ";") - - // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. - if("vgs_access_identifier") - config.vgs_access_identifier = value - if("vgs_server_port") - config.vgs_server_port = text2num(value) - // VOREStation Edit End - - else - log_misc("Unknown setting in configuration: '[name]'") - - else if(type == "game_options") - if(!value) - log_misc("Unknown value for setting [name] in [filename].") - value = text2num(value) - - switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_softcrit") - config.health_threshold_softcrit = value - if("health_threshold_dead") - config.health_threshold_dead = value - if("show_human_death_message") - config.show_human_death_message = 1 - if("revival_pod_plants") - config.revival_pod_plants = value - if("revival_cloning") - config.revival_cloning = value - if("revival_brain_life") - config.revival_brain_life = value - if("organ_health_multiplier") - config.organ_health_multiplier = value / 100 - if("organ_regeneration_multiplier") - config.organ_regeneration_multiplier = value / 100 - if("organ_damage_spillover_multiplier") - config.organ_damage_spillover_multiplier = value / 100 - if("organs_can_decay") - config.organs_decay = 1 - if("default_brain_health") - config.default_brain_health = text2num(value) - if(!config.default_brain_health || config.default_brain_health < 1) - config.default_brain_health = initial(config.default_brain_health) - if("bones_can_break") - config.bones_can_break = value - if("limbs_can_break") - config.limbs_can_break = value - if("allow_headgibs") - config.allow_headgibs = TRUE - - if("run_speed") - config.run_speed = value - if("walk_speed") - config.walk_speed = value - - if("human_delay") - config.human_delay = value - if("robot_delay") - config.robot_delay = value - if("monkey_delay") - config.monkey_delay = value - if("alien_delay") - config.alien_delay = value - if("slime_delay") - config.slime_delay = value - if("animal_delay") - config.animal_delay = value - - if("footstep_volume") - config.footstep_volume = text2num(value) - - if("use_loyalty_implants") - config.use_loyalty_implants = 1 - - if("loadout_whitelist") - config.loadout_whitelist = text2num(value) - - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - sqladdress = value - if ("port") - sqlport = value - if ("database") - sqldb = value - if ("login") - sqllogin = value - if ("password") - sqlpass = value - if ("feedback_database") - sqlfdbkdb = value - if ("feedback_login") - sqlfdbklogin = value - if ("feedback_password") - sqlfdbkpass = value - if ("enable_stat_tracking") - sqllogging = 1 - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadforumsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - forumsqladdress = value - if ("port") - forumsqlport = value - if ("database") - forumsqldb = value - if ("login") - forumsqllogin = value - if ("password") - forumsqlpass = value - if ("activatedgroup") - forum_activated_group = value - if ("authenticatedgroup") - forum_authenticated_group = value - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - for (var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if (M.config_tag && M.config_tag == mode_name) - return M - return gamemode_cache["extended"] - -/datum/configuration/proc/get_runnable_modes() - var/list/runnable_modes = list() - for(var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) - runnable_modes |= M - return runnable_modes - -/datum/configuration/proc/post_load() - //apply a default value to config.python_path, if needed - if (!config.python_path) - if(world.system_type == UNIX) - config.python_path = "/usr/bin/env python2" - else //probably windows, if not this should work anyway - config.python_path = "python" -======= -var/list/gamemode_cache = list() - -/datum/configuration - var/static/server_name = null // server name (for world name / status) - var/static/server_suffix = 0 // generate numeric suffix based on server port - - var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located - - var/static/log_ooc = 0 // log OOC channel - var/static/log_access = 0 // log login/logout - var/static/log_say = 0 // log client say - var/static/log_admin = 0 // log admin actions - var/static/log_debug = 1 // log debug output - var/static/log_game = 0 // log game events - var/static/log_vote = 0 // log voting - var/static/log_whisper = 0 // log client whisper - var/static/log_emote = 0 // log emotes - var/static/log_attack = 0 // log attack messages - var/static/log_adminchat = 0 // log admin chat messages - var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such - var/static/log_pda = 0 // log pda messages - var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits - var/static/log_runtime = 0 // logs world.log to a file - var/static/log_world_output = 0 // log to_world_log(messages) - var/static/log_graffiti = 0 // logs graffiti - var/static/sql_enabled = 0 // for sql switching - var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour - var/static/allow_vote_restart = 0 // allow votes to restart - var/static/ert_admin_call_only = 0 - var/static/allow_vote_mode = 0 // allow votes to change mode - var/static/allow_admin_jump = 1 // allows admin jumping - var/static/allow_admin_spawning = 1 // allows admin item spawning - var/static/allow_admin_rev = 1 // allows admin revives - var/static/pregame_time = 180 // pregame time in seconds - var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) - var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) - var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called - var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote - var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). - var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) - var/static/vote_no_dead = 0 // dead people can't vote (tbi) -// var/static/enable_authentication = 0 // goon authentication - var/static/del_new_on_log = 1 // del's new players if they log before they spawn in - var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players - var/static/objectives_disabled = 0 //if objectives are disabled or not - var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/static/allow_Metadata = 0 // Metadata is supported. - var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/static/fps = 20 - var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling - var/static/Tickcomp = 0 - var/static/socket_talk = 0 // use socket_talk to communicate with other processes - var/static/list/resource_urls = null - var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. - var/static/list/mode_names = list() - var/static/list/modes = list() // allowed modes - var/static/list/votable_modes = list() // votable modes - var/static/list/probabilities = list() // relative probability of each mode - var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. - var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. - var/static/humans_need_surnames = 0 - var/static/allow_random_events = 0 // enables random events mid-round when set to 1 - var/static/enable_game_master = 0 // enables the 'smart' event system. - var/static/allow_ai = 1 // allow ai job - var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. - var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell - var/static/hostedby = null - - var/static/respawn = 1 - var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) - var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" - - var/static/guest_jobban = 1 - var/static/usewhitelist = 0 - var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 - var/static/show_mods = 0 - var/static/show_devs = 0 - var/static/show_event_managers = 0 - var/static/mods_can_tempban = 0 - var/static/mods_can_job_tempban = 0 - var/static/mod_tempban_max = 1440 - var/static/mod_job_tempban_max = 1440 - var/static/load_jobs_from_txt = 0 - var/static/ToRban = 0 - var/static/automute_on = 0 //enables automuting/spam prevention - var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. - - var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... - var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. - - var/static/character_slots = 10 // The number of available character slots - var/static/loadout_slots = 3 // The number of loadout slots per character - - var/static/max_maint_drones = 5 //This many drones can spawn, - var/static/allow_drone_spawn = 1 //assuming the admin allow them to. - var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. - - var/static/disable_player_mice = 0 - var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech - - var/static/usealienwhitelist = 0 - var/static/limitalienplayers = 0 - var/static/alien_to_human_ratio = 0.5 - var/static/allow_extra_antags = 0 - var/static/guests_allowed = 1 - var/static/debugparanoid = 0 - var/static/panic_bunker = 0 - var/static/paranoia_logging = 0 - - var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. - var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. - var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). - var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. - var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. - var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. - - var/static/serverurl - var/static/server - var/static/banappeals - var/static/wikiurl - var/static/wikisearchurl - var/static/forumurl - var/static/githuburl - var/static/discordurl - var/static/rulesurl - var/static/mapurl - - //Alert level description - var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." - var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." - var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - - var/static/forbid_singulo_possession = 0 - - //game_options.txt configs - - var/static/health_threshold_softcrit = 0 - var/static/health_threshold_crit = 0 - var/static/health_threshold_dead = -100 - - var/static/organ_health_multiplier = 1 - var/static/organ_regeneration_multiplier = 1 - var/static/organs_decay - var/static/default_brain_health = 400 - var/static/allow_headgibs = FALSE - - //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, - //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. - var/static/organ_damage_spillover_multiplier = 0.5 - - var/static/bones_can_break = 0 - var/static/limbs_can_break = 0 - - var/static/revival_pod_plants = 1 - var/static/revival_cloning = 1 - var/static/revival_brain_life = -1 - - var/static/use_loyalty_implants = 0 - - var/static/welder_vision = 1 - var/static/generate_map = 0 - var/static/no_click_cooldown = 0 - - //Used for modifying movement speed for mobs. - //Unversal modifiers - var/static/run_speed = 0 - var/static/walk_speed = 0 - - //Mob specific modifiers. NOTE: These will affect different mob types in different ways - var/static/human_delay = 0 - var/static/robot_delay = 0 - var/static/monkey_delay = 0 - var/static/alien_delay = 0 - var/static/slime_delay = 0 - var/static/animal_delay = 0 - - var/static/footstep_volume = 0 - - var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt - var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt - var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database - var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database - - var/static/simultaneous_pm_warning_timeout = 100 - - var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. - var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. - - var/static/assistant_maint = 0 //Do assistants get maint access? - var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. - var/static/ghost_interaction = 0 - - var/static/comms_password = "" - - var/static/enter_allowed = 1 - - var/use_irc_bot = 0 - var/use_node_bot = 0 - var/irc_bot_port = 0 - var/irc_bot_host = "" - var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge - var/main_irc = "" - var/admin_irc = "" - var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix - var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. - var/use_overmap = 0 - - var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. - - // Event settings - var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours - // If the first delay has a custom start time - // No custom time, no custom time, between 80 to 100 minutes respectively. - var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) - // The lowest delay until next event - // 10, 30, 50 minutes respectively - var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) - // The upper delay until next event - // 15, 45, 70 minutes respectively - var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - - var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. - var/static/ninjas_allowed = 0 - var/static/abandon_allowed = 1 - var/static/ooc_allowed = 1 - var/static/looc_allowed = 1 - var/static/dooc_allowed = 1 - var/static/dsay_allowed = 1 - - var/persistence_disabled = FALSE - var/persistence_ignore_mapload = FALSE - - var/allow_byond_links = 0 - var/allow_discord_links = 0 - var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations - - var/starlight = 0 // Whether space turfs have ambient light or not - - var/static/list/ert_species = list(SPECIES_HUMAN) - - var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" - - var/static/aggressive_changelog = 0 - - var/static/list/language_prefixes = list(",","#")//Default language prefixes - - var/static/show_human_death_message = 1 - - var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf - var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick - var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit - var/static/radiation_material_resistance_divisor = 1 - var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. - - var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. - var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. - - // New shiny SQLite stuff. - // The basics. - var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. - - // In-Game Feedback. - var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. - var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. - var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. - var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. - var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. - - var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. - var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. - - // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. - var/static/disable_cid_warn_popup = FALSE - - // whether or not to use the nightshift subsystem to perform lighting changes - var/static/enable_night_shifts = FALSE - - // How strictly the loadout enforces object species whitelists - var/loadout_whitelist = LOADOUT_WHITELIST_LAX - - var/static/vgs_access_identifier = null // VOREStation Edit - VGS - var/static/vgs_server_port = null // VOREStation Edit - VGS - - var/disable_webhook_embeds = FALSE - - var/static/list/jukebox_track_files - -/datum/configuration/New() - var/list/L = typesof(/datum/game_mode) - /datum/game_mode - for (var/T in L) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - if (M.config_tag) - gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. - if(!(M.config_tag in modes)) // ensure each mode is added only once - log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - player_requirements[M.config_tag] = M.required_players - player_requirements_secret[M.config_tag] = M.required_players_secret - if (M.votable) - src.votable_modes += M.config_tag - src.votable_modes += "secret" - -/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) - - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - if(type == "config") - switch (name) - if ("resource_urls") - config.resource_urls = splittext(value, " ") - - if ("admin_legacy_system") - config.admin_legacy_system = 1 - - if ("ban_legacy_system") - config.ban_legacy_system = 1 - - if ("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 - - if ("use_age_restriction_for_antags") - config.use_age_restriction_for_antags = 1 - - if ("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 - - if ("use_recursive_explosions") - use_recursive_explosions = 1 - - if ("multi_z_explosion_scalar") - multi_z_explosion_scalar = text2num(value) - - if ("log_ooc") - config.log_ooc = 1 - - if ("log_access") - config.log_access = 1 - - if ("sql_enabled") - config.sql_enabled = 1 - - if ("log_say") - config.log_say = 1 - - if ("debug_paranoid") - config.debugparanoid = 1 - - if ("log_admin") - config.log_admin = 1 - - if ("log_debug") - config.log_debug = text2num(value) - - if ("log_game") - config.log_game = 1 - - if ("log_vote") - config.log_vote = 1 - - if ("log_whisper") - config.log_whisper = 1 - - if ("log_attack") - config.log_attack = 1 - - if ("log_emote") - config.log_emote = 1 - - if ("log_adminchat") - config.log_adminchat = 1 - - if ("log_adminwarn") - config.log_adminwarn = 1 - - if ("log_pda") - config.log_pda = 1 - - if ("log_world_output") - config.log_world_output = 1 - - if ("log_hrefs") - config.log_hrefs = 1 - - if ("log_runtime") - config.log_runtime = 1 - - if ("log_graffiti") - config.log_graffiti = 1 - - if ("generate_map") - config.generate_map = 1 - - if ("no_click_cooldown") - config.no_click_cooldown = 1 - - if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 - - if ("allow_vote_restart") - config.allow_vote_restart = 1 - - if ("allow_vote_mode") - config.allow_vote_mode = 1 - - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("allow_byond_links") - allow_byond_links = 1 - - if ("allow_discord_links") - allow_discord_links = 1 - - if ("allow_url_links") - allow_url_links = 1 - - if ("no_dead_vote") - config.vote_no_dead = 1 - - if ("default_no_vote") - config.vote_no_default = 1 - - if ("pregame_time") - config.pregame_time = text2num(value) - - if ("vote_delay") - config.vote_delay = text2num(value) - - if ("vote_period") - config.vote_period = text2num(value) - - if ("vote_autotransfer_initial") - config.vote_autotransfer_initial = text2num(value) - - if ("vote_autotransfer_interval") - config.vote_autotransfer_interval = text2num(value) - - if ("vote_autogamemode_timeleft") - config.vote_autogamemode_timeleft = text2num(value) - - if("ert_admin_only") - config.ert_admin_call_only = 1 - - if ("allow_ai") - config.allow_ai = 1 - - if ("allow_ai_shells") - config.allow_ai_shells = TRUE - - if("give_free_ai_shell") - config.give_free_ai_shell = TRUE - -// if ("authentication") -// config.enable_authentication = 1 - - if ("norespawn") - config.respawn = 0 - - if ("respawn_time") - var/raw_minutes = text2num(value) - config.respawn_time = raw_minutes MINUTES - - if ("respawn_message") - config.respawn_message = "[value]" - - if ("servername") - config.server_name = value - - if ("serversuffix") - config.server_suffix = 1 - - if ("nudge_script_path") - config.nudge_script_path = value - - if ("hostedby") - config.hostedby = value - - if ("serverurl") - config.serverurl = value - - if ("server") - config.server = value - - if ("banappeals") - config.banappeals = value - - if ("wikiurl") - config.wikiurl = value - - if ("wikisearchurl") - config.wikisearchurl = value - - if ("forumurl") - config.forumurl = value - - if ("rulesurl") - config.rulesurl = value - - if ("mapurl") - config.mapurl = value - - if ("githuburl") - config.githuburl = value - - if ("discordurl") - config.discordurl = value - - if ("guest_jobban") - config.guest_jobban = 1 - - if ("guest_ban") - config.guests_allowed = 0 - - if ("disable_ooc") - config.ooc_allowed = 0 - config.looc_allowed = 0 - - if ("disable_entry") - config.enter_allowed = 0 - - if ("disable_dead_ooc") - config.dooc_allowed = 0 - - if ("disable_dsay") - config.dsay_allowed = 0 - - if ("disable_respawn") - config.abandon_allowed = 0 - - if ("usewhitelist") - config.usewhitelist = 1 - - if ("feature_object_spell_system") - config.feature_object_spell_system = 1 - - if ("allow_metadata") - config.allow_Metadata = 1 - - if ("traitor_scaling") - config.traitor_scaling = 1 - - if ("aliens_allowed") - config.aliens_allowed = 1 - - if ("ninjas_allowed") - config.ninjas_allowed = 1 - - if ("objectives_disabled") - config.objectives_disabled = 1 - - if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 - - if("persistence_disabled") - config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. - - if("persistence_ignore_mapload") - config.persistence_ignore_mapload = TRUE - - if ("probability") - var/prob_pos = findtext(value, " ") - var/prob_name = null - var/prob_value = null - - if (prob_pos) - prob_name = lowertext(copytext(value, 1, prob_pos)) - prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) - else - log_misc("Unknown game mode probability configuration definition: [prob_name].") - else - log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") - - if ("required_players", "required_players_secret") - var/req_pos = findtext(value, " ") - var/req_name = null - var/req_value = null - var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. - - if(req_pos) - req_name = lowertext(copytext(value, 1, req_pos)) - req_value = copytext(value, req_pos + 1) - if(req_name in config.modes) - if(is_secret_override) - config.player_requirements_secret[req_name] = text2num(req_value) - else - config.player_requirements[req_name] = text2num(req_value) - else - log_misc("Unknown game mode player requirement configuration definition: [req_name].") - else - log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") - - if("allow_random_events") - config.allow_random_events = 1 - - if("enable_game_master") - config.enable_game_master = 1 - - if("kick_inactive") - config.kick_inactive = text2num(value) - - if("show_mods") - config.show_mods = 1 - - if("show_devs") - config.show_devs = 1 - - if("show_event_managers") - config.show_event_managers = 1 - - if("mods_can_tempban") - config.mods_can_tempban = 1 - - if("mods_can_job_tempban") - config.mods_can_job_tempban = 1 - - if("mod_tempban_max") - config.mod_tempban_max = text2num(value) - - if("mod_job_tempban_max") - config.mod_job_tempban_max = text2num(value) - - if("load_jobs_from_txt") - load_jobs_from_txt = 1 - - if("alert_red_upto") - config.alert_desc_red_upto = value - - if("alert_red_downto") - config.alert_desc_red_downto = value - - if("alert_blue_downto") - config.alert_desc_blue_downto = value - - if("alert_blue_upto") - config.alert_desc_blue_upto = value - - if("alert_green") - config.alert_desc_green = value - - if("alert_delta") - config.alert_desc_delta = value - - if("forbid_singulo_possession") - forbid_singulo_possession = 1 - - if("popup_admin_pm") - config.popup_admin_pm = 1 - - if("allow_holidays") - Holiday = 1 - - if("use_irc_bot") - use_irc_bot = 1 - - if("use_node_bot") - use_node_bot = 1 - - if("irc_bot_port") - config.irc_bot_port = value - - if("irc_bot_export") - irc_bot_export = 1 - - if("ticklag") - var/ticklag = text2num(value) - if(ticklag > 0) - fps = 10 / ticklag - - if("tick_limit_mc_init") - tick_limit_mc_init = text2num(value) - - if("allow_antag_hud") - config.antag_hud_allowed = 1 - if("antag_hud_restricted") - config.antag_hud_restricted = 1 - - if("socket_talk") - socket_talk = text2num(value) - - if("tickcomp") - Tickcomp = 1 - - if("humans_need_surnames") - humans_need_surnames = 1 - - if("tor_ban") - ToRban = 1 - - if("automute_on") - automute_on = 1 - - if("usealienwhitelist") - usealienwhitelist = 1 - - if("alien_player_ratio") - limitalienplayers = 1 - alien_to_human_ratio = text2num(value) - - if("assistant_maint") - config.assistant_maint = 1 - - if("gateway_delay") - config.gateway_delay = text2num(value) - - if("continuous_rounds") - config.continous_rounds = 1 - - if("ghost_interaction") - config.ghost_interaction = 1 - - if("disable_player_mice") - config.disable_player_mice = 1 - - if("uneducated_mice") - config.uneducated_mice = 1 - - if("comms_password") - config.comms_password = value - - if("irc_bot_host") - config.irc_bot_host = value - - if("main_irc") - config.main_irc = value - - if("admin_irc") - config.admin_irc = value - - if("python_path") - if(value) - config.python_path = value - - if("use_lib_nudge") - config.use_lib_nudge = 1 - - if("allow_cult_ghostwriter") - config.cult_ghostwriter = 1 - - if("req_cult_ghostwriter") - config.cult_ghostwriter_req_cultists = text2num(value) - - if("character_slots") - config.character_slots = text2num(value) - - if("loadout_slots") - config.loadout_slots = text2num(value) - - if("allow_drone_spawn") - config.allow_drone_spawn = text2num(value) - - if("drone_build_time") - config.drone_build_time = text2num(value) - - if("max_maint_drones") - config.max_maint_drones = text2num(value) - - if("use_overmap") - config.use_overmap = 1 - - if("engine_map") - config.engine_map = splittext(value, ",") -/* - if("station_levels") - using_map.station_levels = text2numlist(value, ";") - - if("admin_levels") - using_map.admin_levels = text2numlist(value, ";") - - if("contact_levels") - using_map.contact_levels = text2numlist(value, ";") - - if("player_levels") - using_map.player_levels = text2numlist(value, ";") -*/ - if("expected_round_length") - config.expected_round_length = MinutesToTicks(text2num(value)) - - if("disable_welder_vision") - config.welder_vision = 0 - - if("allow_extra_antags") - config.allow_extra_antags = 1 - - if("event_custom_start_mundane") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_moderate") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_major") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_delay_lower") - var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("event_delay_upper") - var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("starlight") - value = text2num(value) - config.starlight = value >= 0 ? value : 0 - - if("ert_species") - config.ert_species = splittext(value, ";") - if(!config.ert_species.len) - config.ert_species += SPECIES_HUMAN - - if("law_zero") - law_zero = value - - if("aggressive_changelog") - config.aggressive_changelog = 1 - - if("default_language_prefixes") - var/list/values = splittext(value, " ") - if(values.len > 0) - language_prefixes = values - - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - - if("radiation_resistance_calc_divide") - radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV - - if("radiation_resistance_calc_subtract") - radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB - - if("radiation_resistance_multiplier") - radiation_resistance_multiplier = text2num(value) - - if("radiation_material_resistance_divisor") - radiation_material_resistance_divisor = text2num(value) - - if("radiation_decay_rate") - radiation_decay_rate = text2num(value) - - if ("panic_bunker") - config.panic_bunker = 1 - - if ("paranoia_logging") - config.paranoia_logging = 1 - - if("ip_reputation") - config.ip_reputation = 1 - - if("ipr_email") - config.ipr_email = value - - if("ipr_block_bad_ips") - config.ipr_block_bad_ips = 1 - - if("ipr_bad_score") - config.ipr_bad_score = text2num(value) - - if("ipr_allow_existing") - config.ipr_allow_existing = 1 - - if("ipr_minimum_age") - config.ipr_minimum_age = text2num(value) - - if("random_submap_orientation") - config.random_submap_orientation = 1 - - if("autostart_solars") - config.autostart_solars = TRUE - - if("sqlite_enabled") - config.sqlite_enabled = TRUE - - if("sqlite_feedback") - config.sqlite_feedback = TRUE - - if("sqlite_feedback_topics") - config.sqlite_feedback_topics = splittext(value, ";") - if(!config.sqlite_feedback_topics.len) - config.sqlite_feedback_topics += "General" - - if("sqlite_feedback_privacy") - config.sqlite_feedback_privacy = TRUE - - if("sqlite_feedback_cooldown") - config.sqlite_feedback_cooldown = text2num(value) - - if("defib_timer") - config.defib_timer = text2num(value) - - if("defib_braindamage_timer") - config.defib_braindamage_timer = text2num(value) - - if("disable_cid_warn_popup") - config.disable_cid_warn_popup = TRUE - - if("enable_night_shifts") - config.enable_night_shifts = TRUE - - if("jukebox_track_files") - config.jukebox_track_files = splittext(value, ";") - - // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. - if("vgs_access_identifier") - config.vgs_access_identifier = value - if("vgs_server_port") - config.vgs_server_port = text2num(value) - // VOREStation Edit End - - else - log_misc("Unknown setting in configuration: '[name]'") - - else if(type == "game_options") - if(!value) - log_misc("Unknown value for setting [name] in [filename].") - value = text2num(value) - - switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_softcrit") - config.health_threshold_softcrit = value - if("health_threshold_dead") - config.health_threshold_dead = value - if("show_human_death_message") - config.show_human_death_message = 1 - if("revival_pod_plants") - config.revival_pod_plants = value - if("revival_cloning") - config.revival_cloning = value - if("revival_brain_life") - config.revival_brain_life = value - if("organ_health_multiplier") - config.organ_health_multiplier = value / 100 - if("organ_regeneration_multiplier") - config.organ_regeneration_multiplier = value / 100 - if("organ_damage_spillover_multiplier") - config.organ_damage_spillover_multiplier = value / 100 - if("organs_can_decay") - config.organs_decay = 1 - if("default_brain_health") - config.default_brain_health = text2num(value) - if(!config.default_brain_health || config.default_brain_health < 1) - config.default_brain_health = initial(config.default_brain_health) - if("bones_can_break") - config.bones_can_break = value - if("limbs_can_break") - config.limbs_can_break = value - if("allow_headgibs") - config.allow_headgibs = TRUE - - if("run_speed") - config.run_speed = value - if("walk_speed") - config.walk_speed = value - - if("human_delay") - config.human_delay = value - if("robot_delay") - config.robot_delay = value - if("monkey_delay") - config.monkey_delay = value - if("alien_delay") - config.alien_delay = value - if("slime_delay") - config.slime_delay = value - if("animal_delay") - config.animal_delay = value - - if("footstep_volume") - config.footstep_volume = text2num(value) - - if("use_loyalty_implants") - config.use_loyalty_implants = 1 - - if("loadout_whitelist") - config.loadout_whitelist = text2num(value) - - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - sqladdress = value - if ("port") - sqlport = value - if ("database") - sqldb = value - if ("login") - sqllogin = value - if ("password") - sqlpass = value - if ("feedback_database") - sqlfdbkdb = value - if ("feedback_login") - sqlfdbklogin = value - if ("feedback_password") - sqlfdbkpass = value - if ("enable_stat_tracking") - sqllogging = 1 - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadforumsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - forumsqladdress = value - if ("port") - forumsqlport = value - if ("database") - forumsqldb = value - if ("login") - forumsqllogin = value - if ("password") - forumsqlpass = value - if ("activatedgroup") - forum_activated_group = value - if ("authenticatedgroup") - forum_authenticated_group = value - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - for (var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if (M.config_tag && M.config_tag == mode_name) - return M - return gamemode_cache["extended"] - -/datum/configuration/proc/get_runnable_modes() - var/list/runnable_modes = list() - for(var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) - runnable_modes |= M - return runnable_modes - -/datum/configuration/proc/post_load() - //apply a default value to config.python_path, if needed - if (!config.python_path) - if(world.system_type == UNIX) - config.python_path = "/usr/bin/env python2" - else //probably windows, if not this should work anyway - config.python_path = "python" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From aa0f75b9ef7e114434152fee5b29d5053fdb3dbb Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:50:14 -0400 Subject: [PATCH 36/86] powder that makes you say yes --- code/game/machinery/doors/airlock.dm | 3082 +------------------------- 1 file changed, 5 insertions(+), 3077 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a44d8f32ec..b75ac86df7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD //VOREStation Edit - Redone a lot of airlock things: /* - Specific department maintenance doors @@ -87,17 +86,17 @@ var/mob/living/carbon/human/X = user if(istype(X.species, /datum/species/xenos)) if(src.locked || src.welded) - visible_message("\The [user] begins tearing into \the [src] internals!") //CHOMPedit . edited message to make it more violent + visible_message("\The [user] begins tearing into \the [src] internals!") src.do_animate("deny") - if(do_after(user,30 SECONDS,src)) //CHOMPedit . Increased time to force open welded door for alien - visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") //CHOMPedit + if(do_after(user,15 SECONDS,src)) + visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!" src.do_animate("spark") - playsound(src, 'sound/machines/door/airlock_creaking_xeno.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) //CHOMPedit gave xeno airlock breaking its own sound effect + playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) src.locked = 0 src.welded = 0 update_icon() open(1) - src.set_broken() //CHOMPedit . Changed action to make ripping open the airlock more realistic + src.set_broken() //These aren't emags, these be CLAWS else if(src.density) visible_message("\The [user] begins forcing \the [src] open!") if(do_after(user, 5 SECONDS,src)) @@ -1535,3074 +1534,3 @@ About the new airlock wires panel: qdel(src) return TRUE return FALSE -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -//VOREStation Edit - Redone a lot of airlock things: -/* -- Specific department maintenance doors -- Named doors properly according to type -- Gave them default access levels with the access constants -- Improper'd all of the names in the new() -*/ - -/obj/machinery/door/airlock - name = "Airlock" - icon = 'icons/obj/doors/Doorint.dmi' - icon_state = "door_closed" - power_channel = ENVIRON - - explosion_resistance = 10 - - // Doors do their own stuff - bullet_vulnerability = 0 - - blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime - - var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - var/hackProof = 0 // if 1, this door can't be hacked by the AI - var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. - var/main_power_lost_until = 0 //World time when main power is restored. - var/backup_power_lost_until = -1 //World time when backup power is restored. - var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. - var/spawnPowerRestoreRunning = 0 - var/welded = null - var/locked = 0 - var/lights = 1 // bolt lights show by default - var/aiDisabledIdScanner = 0 - var/aiHacking = 0 - var/obj/machinery/door/airlock/closeOther = null - var/closeOtherId = null - var/lockdownbyai = 0 - autoclose = 1 - var/assembly_type = /obj/structure/door_assembly - var/mineral = null - var/justzap = 0 - var/safe = 1 - normalspeed = 1 - var/obj/item/weapon/airlock_electronics/electronics = null - var/hasShocked = 0 //Prevents multiple shocks from happening - var/secured_wires = 0 - var/datum/wires/airlock/wires = null - - var/open_sound_powered = 'sound/machines/door/covert1o.ogg' - var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' - var/close_sound_powered = 'sound/machines/door/covert1c.ogg' - var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' - var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' - var/department_open_powered = null - var/department_close_powered = null - var/denied_sound = 'sound/machines/deniedbeep.ogg' - var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' - var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' - -/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) - if(stat & (BROKEN|NOPOWER)) - if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) - if(src.locked || src.welded) - visible_message("\The [user] begins breaking into \the [src] internals!") - user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. - if(do_after(user,10 SECONDS,src)) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - if(prob(25)) - src.shock(user, 100) - user.set_AI_busy(FALSE) - else if(src.density) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - if(src.locked || src.welded) - visible_message("\The [user] begins digging into \the [src] internals!") - src.do_animate("deny") - if(do_after(user,5 SECONDS,src)) - visible_message("\The [user] forces \the [src] open, sparks flying from its electronics!") - src.do_animate("spark") - playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - src.emag_act() - else if(src.density) - visible_message("\The [user] begins forcing \the [src] open!") - if(do_after(user, 5 SECONDS,src)) - playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - src.do_animate("deny") - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/get_material() - if(mineral) - return get_material_by_name(mineral) - return get_material_by_name(MAT_STEEL) - -/obj/machinery/door/airlock/command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcom.dmi' - req_one_access = list(access_heads) - assembly_type = /obj/structure/door_assembly/door_assembly_com - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd3o.ogg' - department_close_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsec.dmi' - req_one_access = list(access_security) - assembly_type = /obj/structure/door_assembly/door_assembly_sec - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Dooreng.dmi' - req_one_access = list(access_engine) - assembly_type = /obj/structure/door_assembly/door_assembly_eng - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmos.dmi' - req_one_access = list(access_atmospherics) - assembly_type = /obj/structure/door_assembly/door_assembly_eat - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormed.dmi' - req_one_access = list(access_medical) - assembly_type = /obj/structure/door_assembly/door_assembly_med - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/maintenance - name = "Maintenance Access" - icon = 'icons/obj/doors/Doormaint.dmi' - //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access - assembly_type = /obj/structure/door_assembly/door_assembly_mai - open_sound_powered = 'sound/machines/door/door2o.ogg' - close_sound_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/cargo - icon = 'icons/obj/doors/Doormaint_cargo.dmi' - req_one_access = list(access_cargo) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/door2o.ogg' - department_close_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/command - icon = 'icons/obj/doors/Doormaint_command.dmi' - req_one_access = list(access_heads) - -/obj/machinery/door/airlock/maintenance/common - icon = 'icons/obj/doors/Doormaint_common.dmi' - open_sound_powered = 'sound/machines/door/hall3o.ogg' - close_sound_powered = 'sound/machines/door/hall3c.ogg' - -/obj/machinery/door/airlock/maintenance/engi - icon = 'icons/obj/doors/Doormaint_engi.dmi' - req_one_access = list(access_engine) - -/obj/machinery/door/airlock/maintenance/int - icon = 'icons/obj/doors/Doormaint_int.dmi' - -/obj/machinery/door/airlock/maintenance/medical - icon = 'icons/obj/doors/Doormaint_med.dmi' - req_one_access = list(access_medical) - -/obj/machinery/door/airlock/maintenance/rnd - icon = 'icons/obj/doors/Doormaint_rnd.dmi' - req_one_access = list(access_research) - -/obj/machinery/door/airlock/maintenance/sec - icon = 'icons/obj/doors/Doormaint_sec.dmi' - req_one_access = list(access_security) - -/obj/machinery/door/airlock/external - name = "External Airlock" - icon = 'icons/obj/doors/Doorext.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/external/bolted - icon_state = "door_locked" // So it looks visibly bolted in map editor - locked = 1 - -// For convenience in making docking ports: one that is pre-bolted with frequency set! -/obj/machinery/door/airlock/external/bolted/cycling - frequency = 1379 - -/obj/machinery/door/airlock/glass_external - name = "External Airlock" - icon = 'icons/obj/doors/Doorextglass.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - opacity = 0 - glass = 1 - req_one_access = list(access_external_airlocks) - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/glass - name = "Glass Airlock" - icon = 'icons/obj/doors/Doorglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - open_sound_powered = 'sound/machines/door/hall1o.ogg' - close_sound_powered = 'sound/machines/door/hall1c.ogg' - legacy_open_powered = 'sound/machines/door/windowdoor.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - glass = 1 - -/obj/machinery/door/airlock/centcom - name = "Centcom Airlock" - icon = 'icons/obj/doors/Doorele.dmi' - req_one_access = list(access_cent_general) - opacity = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/glass_centcom - name = "Airlock" - icon = 'icons/obj/doors/Dooreleglass.dmi' - opacity = 0 - glass = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/vault - name = "Vault" - icon = 'icons/obj/doors/vault.dmi' - explosion_resistance = 20 - opacity = 1 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/vault1o.ogg' - close_sound_powered = 'sound/machines/door/vault1c.ogg' - -/obj/machinery/door/airlock/vault/bolted - icon_state = "door_locked" - locked = 1 - -/obj/machinery/door/airlock/freezer - name = "Freezer Airlock" - icon = 'icons/obj/doors/Doorfreezer.dmi' - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/hatch - name = "Airtight Hatch" - icon = 'icons/obj/doors/Doorhatchele.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_hatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/maintenance_hatch - name = "Maintenance Hatch" - icon = 'icons/obj/doors/Doorhatchmaint2.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_mhatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/glass_command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcomglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_com - glass = 1 - req_one_access = list(access_heads) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd1o.ogg' - department_close_powered = 'sound/machines/door/cmd1c.ogg' - -/obj/machinery/door/airlock/glass_engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Doorengglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eng - glass = 1 - req_one_access = list(access_engine) - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eat - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsecglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_sec - glass = 1 - req_one_access = list(access_security) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/glass_medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormedglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_med - glass = 1 - req_one_access = list(access_medical) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doormining.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_min - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmo.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearch.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_research - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearchglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_research - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doorminingglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_min - glass = 1 - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/glass_atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/gold - name = "Gold Airlock" - icon = 'icons/obj/doors/Doorgold.dmi' - mineral = "gold" - -/obj/machinery/door/airlock/silver - name = "Silver Airlock" - icon = 'icons/obj/doors/Doorsilver.dmi' - mineral = "silver" - -/obj/machinery/door/airlock/diamond - name = "Diamond Airlock" - icon = 'icons/obj/doors/Doordiamond.dmi' - mineral = "diamond" - -/obj/machinery/door/airlock/uranium - name = "Uranium Airlock" - desc = "And they said I was crazy." - icon = 'icons/obj/doors/Dooruranium.dmi' - mineral = "uranium" - var/last_event = 0 - var/rad_power = 7.5 - -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() - - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - - if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) - . = PROCESS_KILL - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - SSradiation.radiate(src, rad_power) - last_event = world.time - ..() - -/obj/machinery/door/airlock/phoron - name = "Phoron Airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/Doorphoron.dmi' - mineral = "phoron" - -/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) - for(var/turf/simulated/floor/target_tile in range(2,loc)) - target_tile.assume_gas("phoron", 35, 400+T0C) - spawn (0) target_tile.hotspot_expose(temperature, 400) - for(var/turf/simulated/wall/W in range(3,src)) - W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame - for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) - D.ignite(temperature/4) - new/obj/structure/door_assembly( src.loc ) - qdel(src) - -/obj/machinery/door/airlock/sandstone - name = "Sandstone Airlock" - icon = 'icons/obj/doors/Doorsand.dmi' - mineral = "sandstone" - -/obj/machinery/door/airlock/science - name = "Research Airlock" - icon = 'icons/obj/doors/Doorsci.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_science - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_science - name = "Glass Airlocks" - icon = 'icons/obj/doors/Doorsciglass.dmi' - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_science - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/highsecurity - name = "Secure Airlock" - icon = 'icons/obj/doors/hightechsecurity.dmi' - explosion_resistance = 20 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/secure1o.ogg' - close_sound_powered = 'sound/machines/door/secure1c.ogg' - -/obj/machinery/door/airlock/voidcraft - name = "voidcraft hatch" - desc = "It's an extra resilient airlock intended for spacefaring vessels." - icon = 'icons/obj/doors/shuttledoors.dmi' - explosion_resistance = 20 - opacity = 0 - glass = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - -// Airlock opens from top-bottom instead of left-right. -/obj/machinery/door/airlock/voidcraft/vertical - icon = 'icons/obj/doors/shuttledoors_vertical.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - - -/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock - name = "Precursor Alpha Object - Doors" - desc = "This object appears to be used in order to restrict or allow access to \ - rooms based on its physical state. In other words, a door. \ - Despite being designed and created by unknown ancient alien hands, this door has \ - a large number of similarities to the conventional airlock, such as being driven by \ - electricity, opening and closing by physically moving, and being air tight. \ - It also operates by responding to signals through internal electrical conduits. \ - These characteristics make it possible for one with experience with a multitool \ - to manipulate the door.\ -

    \ - The symbol on the door does not match any living species' patterns, giving further \ - implications that this door is very old, and yet it remains operational after \ - thousands of years. It is unknown if that is due to superb construction, or \ - unseen autonomous maintenance having been performed." - value = CATALOGUER_REWARD_EASY - -/obj/machinery/door/airlock/alien - name = "alien airlock" - desc = "You're fairly sure this is a door." - catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) - icon = 'icons/obj/doors/Dooralien.dmi' - explosion_resistance = 20 - secured_wires = TRUE - hackProof = TRUE - assembly_type = /obj/structure/door_assembly/door_assembly_alien - req_one_access = list(access_alien) - -/obj/machinery/door/airlock/alien/locked - icon_state = "door_locked" - locked = TRUE - -/obj/machinery/door/airlock/alien/public // Entry to UFO. - req_one_access = list() - normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. - hackProof = TRUE //VOREStation Edit - No borgos - -/* -About the new airlock wires panel: -* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. -* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) -* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. -* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. -* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. -* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. -* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. -* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) -* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. -* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. -*/ - - - -/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite - if(!issilicon(usr)) - if(src.isElectrified()) - if(!src.justzap) - if(src.shock(user, 100)) - src.justzap = 1 - spawn (10) - src.justzap = 0 - return - else /*if(src.justzap)*/ - return - else if(user.hallucination > 50 && prob(10) && src.operating == 0) - to_chat(user, "You feel a powerful shock course through your body!") - user.halloss += 10 - user.stunned += 10 - return - ..(user) - -/obj/machinery/door/airlock/proc/isElectrified() - if(src.electrified_until != 0) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/canAIControl() - return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/canAIHack() - return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/arePowerSystemsOn() - if (stat & (NOPOWER|BROKEN)) - return 0 - return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) - -/obj/machinery/door/airlock/requiresID() - return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) - -/obj/machinery/door/airlock/proc/isAllPowerLoss() - if(stat & (NOPOWER|BROKEN)) - return 1 - if(mainPowerCablesCut() && backupPowerCablesCut()) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/mainPowerCablesCut() - return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) - -/obj/machinery/door/airlock/proc/backupPowerCablesCut() - return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) - -/obj/machinery/door/airlock/proc/loseMainPower() - main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running - if(backup_power_lost_until == -1 && !backupPowerCablesCut()) - backup_power_lost_until = world.time + SecondsToTicks(10) - - if(main_power_lost_until > 0 || backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/loseBackupPower() - backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - if(backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/regainMainPower() - if(!mainPowerCablesCut()) - main_power_lost_until = 0 - // If backup power is currently active then disable, otherwise let it count down and disable itself later - if(!backup_power_lost_until) - backup_power_lost_until = -1 - - update_icon() - -/obj/machinery/door/airlock/proc/regainBackupPower() - if(!backupPowerCablesCut()) - // Restore backup power only if main power is offline, otherwise permanently disable - backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 - - update_icon() - -/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) - message = text("The electrification wire is cut - Door permanently electrified.") - src.electrified_until = -1 - else if(duration && !arePowerSystemsOn()) - message = text("The door is unpowered - Cannot electrify the door.") - src.electrified_until = 0 - else if(!duration && electrified_until != 0) - message = "The door is now un-electrified." - src.electrified_until = 0 - else if(duration) //electrify door for the given duration seconds - if(usr) - shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") - add_attack_logs(usr,name,"Electrified a door") - else - shockedby += text("\[[time_stamp()]\] - EMP)") - message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." - src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) - - if(electrified_until > 0) - START_MACHINE_PROCESSING(src) - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_IDSCAN)) - message = "The IdScan wire is cut - IdScan feature permanently disabled." - else if(activate && src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 0 - message = "IdScan feature has been enabled." - else if(!activate && !src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 1 - message = "IdScan feature has been disabled." - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) - var/message = "" - // Safeties! We don't need no stinking safeties! - if (wires.is_cut(WIRE_SAFETY)) - message = text("The safety wire is cut - Cannot enable safeties.") - else if (!activate && src.safe) - safe = 0 - else if (activate && !src.safe) - safe = 1 - - if(feedback && message) - to_chat(usr,message) - -// shock user with probability prb (if all connections & power are working) -// returns 1 if shocked, 0 otherwise -// The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/shock(mob/user, prb) - if(!arePowerSystemsOn()) - return 0 - if(hasShocked) - return 0 //Already shocked someone recently? - if(..()) - hasShocked = 1 - sleep(10) - hasShocked = 0 - return 1 - else - return 0 - - -/obj/machinery/door/airlock/update_icon() - cut_overlays() - if(density) - if(locked && lights && src.arePowerSystemsOn()) - icon_state = "door_locked" - else - icon_state = "door_closed" - if(p_open || welded) - if(p_open) - add_overlay("panel_open") - if (!(stat & NOPOWER)) - if(stat & BROKEN) - add_overlay("sparks_broken") - else if (health < maxhealth * 3/4) - add_overlay("sparks_damaged") - if(welded) - add_overlay("welded") - else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) - add_overlay("sparks_damaged") - else - icon_state = "door_open" - if((stat & BROKEN) && !(stat & NOPOWER)) - add_overlay("sparks_open") - return - -/obj/machinery/door/airlock/do_animate(animation) - switch(animation) - if("opening") - cut_overlay() - if(p_open) - spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. - flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking - update_icon() - else - flick("door_opening", src)//[stat ? "_stat":] - update_icon() - if("closing") - cut_overlay() - if(p_open) - spawn(2) - flick("o_door_closing", src) - update_icon() - else - flick("door_closing", src) - update_icon() - if("spark") - if(density) - flick("door_spark", src) - if("deny") - if(density && src.arePowerSystemsOn()) - flick("door_deny", src) - playsound(src, denied_sound, 50, 0, 3) - return - -/obj/machinery/door/airlock/attack_ai(mob/user as mob) - tgui_interact(user) - -/obj/machinery/door/airlock/attack_ghost(mob/user) - tgui_interact(user) - -/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiAirlock", name) - ui.open() - if(custom_state) - ui.set_state(custom_state) - return TRUE - -/obj/machinery/door/airlock/tgui_data(mob/user) - var/list/data = list() - - var/list/power = list() - power["main"] = main_power_lost_until > 0 ? 0 : 2 - power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) - power["backup"] = backup_power_lost_until > 0 ? 0 : 2 - power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) - data["power"] = power - - data["shock"] = (electrified_until == 0) ? 2 : 0 - data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) - data["id_scanner"] = !aiDisabledIdScanner - data["locked"] = locked // bolted - data["lights"] = lights // bolt lights - data["safe"] = safe // safeties - data["speed"] = normalspeed // safe speed - data["welded"] = welded // welded - data["opened"] = !density // opened - - var/list/wire = list() - wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) - wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) - wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) - wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) - wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) - wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) - wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) - wire["safe"] = !wires.is_cut(WIRE_SAFETY) - wire["timing"] = !wires.is_cut(WIRE_SPEED) - - data["wires"] = wire - return data - -/obj/machinery/door/airlock/proc/hack(mob/user as mob) - if(src.aiHacking==0) - src.aiHacking=1 - spawn(20) - //TODO: Make this take a minute - to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") - sleep(50) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") - sleep(20) - to_chat(user, "Attempting to hack into airlock. This may take some time.") - sleep(200) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Upload access confirmed. Loading control program into airlock software.") - sleep(170) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Transfer complete. Forcing airlock to execute program.") - sleep(50) - //disable blocked control - src.aiControlDisabled = 2 - to_chat(user, "Receiving control information from airlock.") - sleep(10) - //bring up airlock dialog - src.aiHacking = 0 - if (user) - src.attack_ai(user) - -/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) - if (src.isElectrified()) - if (istype(mover, /obj/item)) - var/obj/item/i = mover - if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return ..() - -/obj/machinery/door/airlock/attack_hand(mob/user as mob) - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 100)) - return - - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - src.attack_alien(user) - return - - if(src.p_open) - user.set_machine(src) - wires.Interact(user) - else - ..(user) - return - -/obj/machinery/door/airlock/tgui_act(action, params) - if(..()) - return TRUE - if(!user_allowed(usr)) - return TRUE - - switch(action) - if("disrupt-main") - if(!main_power_lost_until) - loseMainPower() - update_icon() - else - to_chat(usr, "Main power is already offline.") - . = TRUE - if("disrupt-backup") - if(!backup_power_lost_until) - loseBackupPower() - update_icon() - else - to_chat(usr, "Backup power is already offline.") - . = TRUE - if("shock-restore") - electrify(0, 1) - . = TRUE - if("shock-temp") - electrify(30, 1) - . = TRUE - if("shock-perm") - electrify(-1, 1) - . = TRUE - if("idscan-toggle") - set_idscan(aiDisabledIdScanner, 1) - . = TRUE - // if("emergency-toggle") - // toggle_emergency(usr) - // . = TRUE - if("bolt-toggle") - toggle_bolt(usr) - . = TRUE - if("light-toggle") - if(wires.is_cut(WIRE_BOLT_LIGHT)) - to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") - return - lights = !lights - update_icon() - . = TRUE - if("safe-toggle") - set_safeties(!safe, 1) - . = TRUE - if("speed-toggle") - if(wires.is_cut(WIRE_SPEED)) - to_chat(usr, "The timing wire is cut - Cannot alter timing.") - return - normalspeed = !normalspeed - . = TRUE - if("open-close") - user_toggle_open(usr) - . = TRUE - - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/user_allowed(mob/user) - var/allowed = (issilicon(user) && canAIControl(user)) - if(!allowed && isobserver(user)) - var/mob/observer/dead/D = user - if(D.can_admin_interact()) - allowed = TRUE - return allowed - -/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_DOOR_BOLTS)) - to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") - return - if(locked) - if(!arePowerSystemsOn()) - to_chat(user, "The door has no power - you can't raise the door bolts.") - else - unlock() - to_chat(user, "The door bolts have been raised.") - // log_combat(user, src, "unbolted") - else - lock() - to_chat(user, "The door bolts have been dropped.") - // log_combat(user, src, "bolted") - -/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) - if(!user_allowed(user)) - return - if(welded) - to_chat(user, text("The airlock has been welded shut!")) - else if(locked) - to_chat(user, text("The door bolts are down!")) - else if(!density) - close() - else - open() - -/obj/machinery/door/airlock/proc/can_remove_electronics() - return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) - -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) - //to_world("airlock attackby src [src] obj [C] mob [user]") - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 75)) - return - if(istype(C, /obj/item/taperoll)) - return - - src.add_fingerprint(user) - if (attempt_vr(src,"attackby_vr",list(C, user))) return - if(istype(C, /mob/living)) - ..() - return - if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) - var/obj/item/weapon/weldingtool/W = C - if(W.remove_fuel(0,user)) - if(!src.welded) - src.welded = 1 - else - src.welded = null - playsound(src, C.usesound, 75, 1) - src.update_icon() - return - else - return - else if(C.is_screwdriver()) - if (src.p_open) - if (stat & BROKEN) - to_chat(usr, "The panel is broken and cannot be closed.") - else - src.p_open = 0 - playsound(src, C.usesound, 50, 1) - else - src.p_open = 1 - playsound(src, C.usesound, 50, 1) - src.update_icon() - else if(C.is_wirecutter()) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/multitool)) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/assembly/signaler)) - return src.attack_hand(user) - else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE - var/obj/item/weapon/pai_cable/cable = C - cable.plugin(src, user) - else if(!repairing && C.is_crowbar()) - if(can_remove_electronics()) - playsound(src, C.usesound, 75, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") - if(do_after(user,40 * C.toolspeed)) - to_chat(user, "You removed the airlock electronics!") - - var/obj/structure/door_assembly/da = new assembly_type(src.loc) - if (istype(da, /obj/structure/door_assembly/multi_tile)) - da.set_dir(src.dir) - - da.anchored = TRUE - if(mineral) - da.glass = mineral - //else if(glass) - else if(glass && !da.glass) - da.glass = 1 - da.state = 1 - da.created_name = src.name - da.update_state() - - if(operating == -1 || (stat & BROKEN)) - new /obj/item/weapon/circuitboard/broken(src.loc) - operating = 0 - else - if (!electronics) create_electronics() - - electronics.loc = src.loc - electronics = null - - qdel(src) - return - else if(arePowerSystemsOn()) - to_chat(user, "The airlock's motors resist your efforts to force it.") - else if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else - if(density) - spawn(0) open(1) - else - spawn(0) close(1) - - // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). - else if(istype(C, /obj/item/weapon)) - var/obj/item/weapon/W = C - if((W.pry == 1) && !arePowerSystemsOn()) - if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else if( !welded && !operating ) - if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. - var/obj/item/weapon/material/twohanded/fireaxe/F = C - if(!F.wielded) - to_chat(user, "You need to be wielding \the [F] to do that.") - return - // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. - if(density) - spawn(0) - open(1) - else - spawn(0) - close(1) - else - ..() - else - ..() - return - -/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) - if(C) - ignite(is_hot(C)) - ..() - -/obj/machinery/door/airlock/set_broken() - src.p_open = 1 - stat |= BROKEN - if (secured_wires) - lock() - for (var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - update_icon() - return - -/obj/machinery/door/airlock/open(var/forced=0) - if(!can_open(forced)) - return 0 - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - - //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator - for(var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. - if(arePowerSystemsOn()) - sound = legacy_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else // Else, play these. - if(arePowerSystemsOn()) - sound = open_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - - if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) - src.closeOther.close() - return ..() - -/obj/machinery/door/airlock/can_open(var/forced=0) - if(!forced) - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - if(locked || welded) - return 0 - return ..() - -/obj/machinery/door/airlock/can_close(var/forced=0) - if(locked || welded) - return 0 - - if(!forced) - //despite the name, this wire is for general door control. - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - return ..() - -/atom/movable/proc/blocks_airlock() - return density - -/obj/machinery/door/blocks_airlock() - return 0 - -/obj/machinery/mech_sensor/blocks_airlock() - return 0 - -/mob/living/blocks_airlock() - return 1 - -/atom/movable/proc/airlock_crush(var/crush_damage) - return 0 - -/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) - . = ..() - health -= crush_damage - healthcheck() - -/obj/effect/energy_field/airlock_crush(var/crush_damage) - adjust_strength(crush_damage) - -/obj/structure/closet/airlock_crush(var/crush_damage) - ..() - damage(crush_damage) - for(var/atom/movable/AM in src) - AM.airlock_crush() - return 1 - -/mob/living/airlock_crush(var/crush_damage) - . = ..() - adjustBruteLoss(crush_damage) - SetStunned(5) - SetWeakened(5) - var/turf/T = get_turf(src) - T.add_blood(src) - return 1 - -/mob/living/carbon/airlock_crush(var/crush_damage) - . = ..() - if(can_feel_pain()) - emote("scream") - -/mob/living/silicon/robot/airlock_crush(var/crush_damage) - adjustBruteLoss(crush_damage) - return 0 - -/obj/machinery/door/airlock/close(var/forced=0) - if(!can_close(forced)) - return 0 - - if(safe) - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.blocks_airlock()) - if(!has_beeped) - playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) - has_beeped = 1 - autoclose_in(6) - return - - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) - take_damage(DOOR_CRUSH_DAMAGE) - - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - has_beeped = 0 - for(var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) - if(arePowerSystemsOn()) - sound = legacy_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else - if(arePowerSystemsOn()) - sound = close_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - for(var/turf/turf in locs) - var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) - if(killthis) - killthis.ex_act(2)//Smashin windows - return ..() - -/obj/machinery/door/airlock/proc/lock(var/forced=0) - if(locked) - return 0 - - if (operating && !forced) return 0 - - src.locked = 1 - playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/unlock(var/forced=0) - if(!src.locked) - return - - if (!forced) - if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return - - src.locked = 0 - playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/allowed(mob/M) - if(locked) - return 0 - return ..(M) - -/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) - ..() - - //if assembly is given, create the new door from the assembly - if (assembly && istype(assembly)) - assembly_type = assembly.type - - electronics = assembly.electronics - electronics.loc = src - - //update the door's access to match the electronics' - secured_wires = electronics.secure - if(electronics.one_access) - LAZYCLEARLIST(req_access) - req_one_access = src.electronics.conf_access - else - LAZYCLEARLIST(req_one_access) - req_access = src.electronics.conf_access - - //get the name from the assembly - if(assembly.created_name) - name = assembly.created_name - else - name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" - - //get the dir from the assembly - set_dir(assembly.dir) - - //wires - var/turf/T = get_turf(newloc) - if(T && (T.z in using_map.admin_levels)) - secured_wires = 1 - if (secured_wires) - wires = new/datum/wires/airlock/secure(src) - else - wires = new/datum/wires/airlock(src) - -/obj/machinery/door/airlock/Initialize() - if(src.closeOtherId != null) - for (var/obj/machinery/door/airlock/A in machines) - if(A.closeOtherId == src.closeOtherId && A != src) - src.closeOther = A - break - name = "\improper [name]" - . = ..() - -/obj/machinery/door/airlock/Destroy() - qdel(wires) - wires = null - return ..() - -// Most doors will never be deconstructed over the course of a round, -// so as an optimization defer the creation of electronics until -// the airlock is deconstructed -/obj/machinery/door/airlock/proc/create_electronics() - //create new electronics - if (secured_wires) - src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) - else - src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) - - //update the electronics to match the door's access - if(LAZYLEN(req_access)) - electronics.conf_access = req_access - else if (LAZYLEN(req_one_access)) - electronics.conf_access = req_one_access - electronics.one_access = 1 - -/obj/machinery/door/airlock/emp_act(var/severity) - if(prob(40/severity)) - var/duration = world.time + SecondsToTicks(30 / severity) - if(duration > electrified_until) - electrify(duration) - ..() - -/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason - ..() - if(stat & NOPOWER) - // If we lost power, disable electrification - // Keeping door lights on, runs on internal battery or something. - electrified_until = 0 - update_icon() - -/obj/machinery/door/airlock/proc/prison_open() - if(arePowerSystemsOn()) - src.unlock() - src.open() - src.lock() - return - - -/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - // Old RCD code made it cost 10 units to decon an airlock. - // Now the new one costs ten "sheets". - return list( - RCD_VALUE_MODE = RCD_DECONSTRUCT, - RCD_VALUE_DELAY = 5 SECONDS, - RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 - ) - return FALSE - -/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span("notice", "You deconstruct \the [src].")) - qdel(src) - return TRUE - return FALSE -======= -//VOREStation Edit - Redone a lot of airlock things: -/* -- Specific department maintenance doors -- Named doors properly according to type -- Gave them default access levels with the access constants -- Improper'd all of the names in the new() -*/ - -/obj/machinery/door/airlock - name = "Airlock" - icon = 'icons/obj/doors/Doorint.dmi' - icon_state = "door_closed" - power_channel = ENVIRON - - explosion_resistance = 10 - - // Doors do their own stuff - bullet_vulnerability = 0 - - blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime - - var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - var/hackProof = 0 // if 1, this door can't be hacked by the AI - var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. - var/main_power_lost_until = 0 //World time when main power is restored. - var/backup_power_lost_until = -1 //World time when backup power is restored. - var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. - var/spawnPowerRestoreRunning = 0 - var/welded = null - var/locked = 0 - var/lights = 1 // bolt lights show by default - var/aiDisabledIdScanner = 0 - var/aiHacking = 0 - var/obj/machinery/door/airlock/closeOther = null - var/closeOtherId = null - var/lockdownbyai = 0 - autoclose = 1 - var/assembly_type = /obj/structure/door_assembly - var/mineral = null - var/justzap = 0 - var/safe = 1 - normalspeed = 1 - var/obj/item/weapon/airlock_electronics/electronics = null - var/hasShocked = 0 //Prevents multiple shocks from happening - var/secured_wires = 0 - var/datum/wires/airlock/wires = null - - var/open_sound_powered = 'sound/machines/door/covert1o.ogg' - var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' - var/close_sound_powered = 'sound/machines/door/covert1c.ogg' - var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' - var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' - var/department_open_powered = null - var/department_close_powered = null - var/denied_sound = 'sound/machines/deniedbeep.ogg' - var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' - var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' - -/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) - if(stat & (BROKEN|NOPOWER)) - if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) - if(src.locked || src.welded) - visible_message("\The [user] begins breaking into \the [src] internals!") - user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. - if(do_after(user,10 SECONDS,src)) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - if(prob(25)) - src.shock(user, 100) - user.set_AI_busy(FALSE) - else if(src.density) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - if(src.locked || src.welded) - visible_message("\The [user] begins tearing into \the [src] internals!") - src.do_animate("deny") - if(do_after(user,15 SECONDS,src)) - visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") - src.do_animate("spark") - playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - src.set_broken() //These aren't emags, these be CLAWS - else if(src.density) - visible_message("\The [user] begins forcing \the [src] open!") - if(do_after(user, 5 SECONDS,src)) - playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - src.do_animate("deny") - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/get_material() - if(mineral) - return get_material_by_name(mineral) - return get_material_by_name(MAT_STEEL) - -/obj/machinery/door/airlock/command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcom.dmi' - req_one_access = list(access_heads) - assembly_type = /obj/structure/door_assembly/door_assembly_com - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd3o.ogg' - department_close_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsec.dmi' - req_one_access = list(access_security) - assembly_type = /obj/structure/door_assembly/door_assembly_sec - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Dooreng.dmi' - req_one_access = list(access_engine) - assembly_type = /obj/structure/door_assembly/door_assembly_eng - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmos.dmi' - req_one_access = list(access_atmospherics) - assembly_type = /obj/structure/door_assembly/door_assembly_eat - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormed.dmi' - req_one_access = list(access_medical) - assembly_type = /obj/structure/door_assembly/door_assembly_med - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/maintenance - name = "Maintenance Access" - icon = 'icons/obj/doors/Doormaint.dmi' - //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access - assembly_type = /obj/structure/door_assembly/door_assembly_mai - open_sound_powered = 'sound/machines/door/door2o.ogg' - close_sound_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/cargo - icon = 'icons/obj/doors/Doormaint_cargo.dmi' - req_one_access = list(access_cargo) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/door2o.ogg' - department_close_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/command - icon = 'icons/obj/doors/Doormaint_command.dmi' - req_one_access = list(access_heads) - -/obj/machinery/door/airlock/maintenance/common - icon = 'icons/obj/doors/Doormaint_common.dmi' - open_sound_powered = 'sound/machines/door/hall3o.ogg' - close_sound_powered = 'sound/machines/door/hall3c.ogg' - -/obj/machinery/door/airlock/maintenance/engi - icon = 'icons/obj/doors/Doormaint_engi.dmi' - req_one_access = list(access_engine) - -/obj/machinery/door/airlock/maintenance/int - icon = 'icons/obj/doors/Doormaint_int.dmi' - -/obj/machinery/door/airlock/maintenance/medical - icon = 'icons/obj/doors/Doormaint_med.dmi' - req_one_access = list(access_medical) - -/obj/machinery/door/airlock/maintenance/rnd - icon = 'icons/obj/doors/Doormaint_rnd.dmi' - req_one_access = list(access_research) - -/obj/machinery/door/airlock/maintenance/sec - icon = 'icons/obj/doors/Doormaint_sec.dmi' - req_one_access = list(access_security) - -/obj/machinery/door/airlock/external - name = "External Airlock" - icon = 'icons/obj/doors/Doorext.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/external/bolted - icon_state = "door_locked" // So it looks visibly bolted in map editor - locked = 1 - -// For convenience in making docking ports: one that is pre-bolted with frequency set! -/obj/machinery/door/airlock/external/bolted/cycling - frequency = 1379 - -/obj/machinery/door/airlock/glass_external - name = "External Airlock" - icon = 'icons/obj/doors/Doorextglass.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - opacity = 0 - glass = 1 - req_one_access = list(access_external_airlocks) - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/glass - name = "Glass Airlock" - icon = 'icons/obj/doors/Doorglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - open_sound_powered = 'sound/machines/door/hall1o.ogg' - close_sound_powered = 'sound/machines/door/hall1c.ogg' - legacy_open_powered = 'sound/machines/door/windowdoor.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - glass = 1 - -/obj/machinery/door/airlock/centcom - name = "Centcom Airlock" - icon = 'icons/obj/doors/Doorele.dmi' - req_one_access = list(access_cent_general) - opacity = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/glass_centcom - name = "Airlock" - icon = 'icons/obj/doors/Dooreleglass.dmi' - opacity = 0 - glass = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/vault - name = "Vault" - icon = 'icons/obj/doors/vault.dmi' - explosion_resistance = 20 - opacity = 1 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/vault1o.ogg' - close_sound_powered = 'sound/machines/door/vault1c.ogg' - -/obj/machinery/door/airlock/vault/bolted - icon_state = "door_locked" - locked = 1 - -/obj/machinery/door/airlock/freezer - name = "Freezer Airlock" - icon = 'icons/obj/doors/Doorfreezer.dmi' - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/hatch - name = "Airtight Hatch" - icon = 'icons/obj/doors/Doorhatchele.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_hatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/maintenance_hatch - name = "Maintenance Hatch" - icon = 'icons/obj/doors/Doorhatchmaint2.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_mhatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/glass_command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcomglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_com - glass = 1 - req_one_access = list(access_heads) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd1o.ogg' - department_close_powered = 'sound/machines/door/cmd1c.ogg' - -/obj/machinery/door/airlock/glass_engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Doorengglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eng - glass = 1 - req_one_access = list(access_engine) - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eat - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsecglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_sec - glass = 1 - req_one_access = list(access_security) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/glass_medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormedglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_med - glass = 1 - req_one_access = list(access_medical) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doormining.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_min - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmo.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearch.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_research - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearchglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_research - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doorminingglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_min - glass = 1 - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/glass_atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/gold - name = "Gold Airlock" - icon = 'icons/obj/doors/Doorgold.dmi' - mineral = "gold" - -/obj/machinery/door/airlock/silver - name = "Silver Airlock" - icon = 'icons/obj/doors/Doorsilver.dmi' - mineral = "silver" - -/obj/machinery/door/airlock/diamond - name = "Diamond Airlock" - icon = 'icons/obj/doors/Doordiamond.dmi' - mineral = "diamond" - -/obj/machinery/door/airlock/uranium - name = "Uranium Airlock" - desc = "And they said I was crazy." - icon = 'icons/obj/doors/Dooruranium.dmi' - mineral = "uranium" - var/last_event = 0 - var/rad_power = 7.5 - -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() - - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - - if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) - . = PROCESS_KILL - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - SSradiation.radiate(src, rad_power) - last_event = world.time - ..() - -/obj/machinery/door/airlock/phoron - name = "Phoron Airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/Doorphoron.dmi' - mineral = "phoron" - -/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) - for(var/turf/simulated/floor/target_tile in range(2,loc)) - target_tile.assume_gas("phoron", 35, 400+T0C) - spawn (0) target_tile.hotspot_expose(temperature, 400) - for(var/turf/simulated/wall/W in range(3,src)) - W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame - for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) - D.ignite(temperature/4) - new/obj/structure/door_assembly( src.loc ) - qdel(src) - -/obj/machinery/door/airlock/sandstone - name = "Sandstone Airlock" - icon = 'icons/obj/doors/Doorsand.dmi' - mineral = "sandstone" - -/obj/machinery/door/airlock/science - name = "Research Airlock" - icon = 'icons/obj/doors/Doorsci.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_science - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_science - name = "Glass Airlocks" - icon = 'icons/obj/doors/Doorsciglass.dmi' - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_science - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/highsecurity - name = "Secure Airlock" - icon = 'icons/obj/doors/hightechsecurity.dmi' - explosion_resistance = 20 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/secure1o.ogg' - close_sound_powered = 'sound/machines/door/secure1c.ogg' - -/obj/machinery/door/airlock/voidcraft - name = "voidcraft hatch" - desc = "It's an extra resilient airlock intended for spacefaring vessels." - icon = 'icons/obj/doors/shuttledoors.dmi' - explosion_resistance = 20 - opacity = 0 - glass = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - -// Airlock opens from top-bottom instead of left-right. -/obj/machinery/door/airlock/voidcraft/vertical - icon = 'icons/obj/doors/shuttledoors_vertical.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - - -/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock - name = "Precursor Alpha Object - Doors" - desc = "This object appears to be used in order to restrict or allow access to \ - rooms based on its physical state. In other words, a door. \ - Despite being designed and created by unknown ancient alien hands, this door has \ - a large number of similarities to the conventional airlock, such as being driven by \ - electricity, opening and closing by physically moving, and being air tight. \ - It also operates by responding to signals through internal electrical conduits. \ - These characteristics make it possible for one with experience with a multitool \ - to manipulate the door.\ -

    \ - The symbol on the door does not match any living species' patterns, giving further \ - implications that this door is very old, and yet it remains operational after \ - thousands of years. It is unknown if that is due to superb construction, or \ - unseen autonomous maintenance having been performed." - value = CATALOGUER_REWARD_EASY - -/obj/machinery/door/airlock/alien - name = "alien airlock" - desc = "You're fairly sure this is a door." - catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) - icon = 'icons/obj/doors/Dooralien.dmi' - explosion_resistance = 20 - secured_wires = TRUE - hackProof = TRUE - assembly_type = /obj/structure/door_assembly/door_assembly_alien - req_one_access = list(access_alien) - -/obj/machinery/door/airlock/alien/locked - icon_state = "door_locked" - locked = TRUE - -/obj/machinery/door/airlock/alien/public // Entry to UFO. - req_one_access = list() - normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. - hackProof = TRUE //VOREStation Edit - No borgos - -/* -About the new airlock wires panel: -* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. -* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) -* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. -* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. -* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. -* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. -* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. -* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) -* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. -* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. -*/ - - - -/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite - if(!issilicon(usr)) - if(src.isElectrified()) - if(!src.justzap) - if(src.shock(user, 100)) - src.justzap = 1 - spawn (10) - src.justzap = 0 - return - else /*if(src.justzap)*/ - return - else if(user.hallucination > 50 && prob(10) && src.operating == 0) - to_chat(user, "You feel a powerful shock course through your body!") - user.halloss += 10 - user.stunned += 10 - return - ..(user) - -/obj/machinery/door/airlock/proc/isElectrified() - if(src.electrified_until != 0) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/canAIControl() - return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/canAIHack() - return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/arePowerSystemsOn() - if (stat & (NOPOWER|BROKEN)) - return 0 - return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) - -/obj/machinery/door/airlock/requiresID() - return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) - -/obj/machinery/door/airlock/proc/isAllPowerLoss() - if(stat & (NOPOWER|BROKEN)) - return 1 - if(mainPowerCablesCut() && backupPowerCablesCut()) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/mainPowerCablesCut() - return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) - -/obj/machinery/door/airlock/proc/backupPowerCablesCut() - return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) - -/obj/machinery/door/airlock/proc/loseMainPower() - main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running - if(backup_power_lost_until == -1 && !backupPowerCablesCut()) - backup_power_lost_until = world.time + SecondsToTicks(10) - - if(main_power_lost_until > 0 || backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/loseBackupPower() - backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - if(backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/regainMainPower() - if(!mainPowerCablesCut()) - main_power_lost_until = 0 - // If backup power is currently active then disable, otherwise let it count down and disable itself later - if(!backup_power_lost_until) - backup_power_lost_until = -1 - - update_icon() - -/obj/machinery/door/airlock/proc/regainBackupPower() - if(!backupPowerCablesCut()) - // Restore backup power only if main power is offline, otherwise permanently disable - backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 - - update_icon() - -/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) - message = text("The electrification wire is cut - Door permanently electrified.") - src.electrified_until = -1 - else if(duration && !arePowerSystemsOn()) - message = text("The door is unpowered - Cannot electrify the door.") - src.electrified_until = 0 - else if(!duration && electrified_until != 0) - message = "The door is now un-electrified." - src.electrified_until = 0 - else if(duration) //electrify door for the given duration seconds - if(usr) - shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") - add_attack_logs(usr,name,"Electrified a door") - else - shockedby += text("\[[time_stamp()]\] - EMP)") - message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." - src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) - - if(electrified_until > 0) - START_MACHINE_PROCESSING(src) - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_IDSCAN)) - message = "The IdScan wire is cut - IdScan feature permanently disabled." - else if(activate && src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 0 - message = "IdScan feature has been enabled." - else if(!activate && !src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 1 - message = "IdScan feature has been disabled." - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) - var/message = "" - // Safeties! We don't need no stinking safeties! - if (wires.is_cut(WIRE_SAFETY)) - message = text("The safety wire is cut - Cannot enable safeties.") - else if (!activate && src.safe) - safe = 0 - else if (activate && !src.safe) - safe = 1 - - if(feedback && message) - to_chat(usr,message) - -// shock user with probability prb (if all connections & power are working) -// returns 1 if shocked, 0 otherwise -// The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/shock(mob/user, prb) - if(!arePowerSystemsOn()) - return 0 - if(hasShocked) - return 0 //Already shocked someone recently? - if(..()) - hasShocked = 1 - sleep(10) - hasShocked = 0 - return 1 - else - return 0 - - -/obj/machinery/door/airlock/update_icon() - cut_overlays() - if(density) - if(locked && lights && src.arePowerSystemsOn()) - icon_state = "door_locked" - else - icon_state = "door_closed" - if(p_open || welded) - if(p_open) - add_overlay("panel_open") - if (!(stat & NOPOWER)) - if(stat & BROKEN) - add_overlay("sparks_broken") - else if (health < maxhealth * 3/4) - add_overlay("sparks_damaged") - if(welded) - add_overlay("welded") - else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) - add_overlay("sparks_damaged") - else - icon_state = "door_open" - if((stat & BROKEN) && !(stat & NOPOWER)) - add_overlay("sparks_open") - return - -/obj/machinery/door/airlock/do_animate(animation) - switch(animation) - if("opening") - cut_overlay() - if(p_open) - spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. - flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking - update_icon() - else - flick("door_opening", src)//[stat ? "_stat":] - update_icon() - if("closing") - cut_overlay() - if(p_open) - spawn(2) - flick("o_door_closing", src) - update_icon() - else - flick("door_closing", src) - update_icon() - if("spark") - if(density) - flick("door_spark", src) - if("deny") - if(density && src.arePowerSystemsOn()) - flick("door_deny", src) - playsound(src, denied_sound, 50, 0, 3) - return - -/obj/machinery/door/airlock/attack_ai(mob/user as mob) - tgui_interact(user) - -/obj/machinery/door/airlock/attack_ghost(mob/user) - tgui_interact(user) - -/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiAirlock", name) - ui.open() - if(custom_state) - ui.set_state(custom_state) - return TRUE - -/obj/machinery/door/airlock/tgui_data(mob/user) - var/list/data = list() - - var/list/power = list() - power["main"] = main_power_lost_until > 0 ? 0 : 2 - power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) - power["backup"] = backup_power_lost_until > 0 ? 0 : 2 - power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) - data["power"] = power - - data["shock"] = (electrified_until == 0) ? 2 : 0 - data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) - data["id_scanner"] = !aiDisabledIdScanner - data["locked"] = locked // bolted - data["lights"] = lights // bolt lights - data["safe"] = safe // safeties - data["speed"] = normalspeed // safe speed - data["welded"] = welded // welded - data["opened"] = !density // opened - - var/list/wire = list() - wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) - wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) - wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) - wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) - wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) - wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) - wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) - wire["safe"] = !wires.is_cut(WIRE_SAFETY) - wire["timing"] = !wires.is_cut(WIRE_SPEED) - - data["wires"] = wire - return data - -/obj/machinery/door/airlock/proc/hack(mob/user as mob) - if(src.aiHacking==0) - src.aiHacking=1 - spawn(20) - //TODO: Make this take a minute - to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") - sleep(50) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") - sleep(20) - to_chat(user, "Attempting to hack into airlock. This may take some time.") - sleep(200) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Upload access confirmed. Loading control program into airlock software.") - sleep(170) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Transfer complete. Forcing airlock to execute program.") - sleep(50) - //disable blocked control - src.aiControlDisabled = 2 - to_chat(user, "Receiving control information from airlock.") - sleep(10) - //bring up airlock dialog - src.aiHacking = 0 - if (user) - src.attack_ai(user) - -/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) - if (src.isElectrified()) - if (istype(mover, /obj/item)) - var/obj/item/i = mover - if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return ..() - -/obj/machinery/door/airlock/attack_hand(mob/user as mob) - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 100)) - return - - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - src.attack_alien(user) - return - - if(src.p_open) - user.set_machine(src) - wires.Interact(user) - else - ..(user) - return - -/obj/machinery/door/airlock/tgui_act(action, params) - if(..()) - return TRUE - if(!user_allowed(usr)) - return TRUE - - switch(action) - if("disrupt-main") - if(!main_power_lost_until) - loseMainPower() - update_icon() - else - to_chat(usr, "Main power is already offline.") - . = TRUE - if("disrupt-backup") - if(!backup_power_lost_until) - loseBackupPower() - update_icon() - else - to_chat(usr, "Backup power is already offline.") - . = TRUE - if("shock-restore") - electrify(0, 1) - . = TRUE - if("shock-temp") - electrify(30, 1) - . = TRUE - if("shock-perm") - electrify(-1, 1) - . = TRUE - if("idscan-toggle") - set_idscan(aiDisabledIdScanner, 1) - . = TRUE - // if("emergency-toggle") - // toggle_emergency(usr) - // . = TRUE - if("bolt-toggle") - toggle_bolt(usr) - . = TRUE - if("light-toggle") - if(wires.is_cut(WIRE_BOLT_LIGHT)) - to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") - return - lights = !lights - update_icon() - . = TRUE - if("safe-toggle") - set_safeties(!safe, 1) - . = TRUE - if("speed-toggle") - if(wires.is_cut(WIRE_SPEED)) - to_chat(usr, "The timing wire is cut - Cannot alter timing.") - return - normalspeed = !normalspeed - . = TRUE - if("open-close") - user_toggle_open(usr) - . = TRUE - - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/user_allowed(mob/user) - var/allowed = (issilicon(user) && canAIControl(user)) - if(!allowed && isobserver(user)) - var/mob/observer/dead/D = user - if(D.can_admin_interact()) - allowed = TRUE - return allowed - -/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_DOOR_BOLTS)) - to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") - return - if(locked) - if(!arePowerSystemsOn()) - to_chat(user, "The door has no power - you can't raise the door bolts.") - else - unlock() - to_chat(user, "The door bolts have been raised.") - // log_combat(user, src, "unbolted") - else - lock() - to_chat(user, "The door bolts have been dropped.") - // log_combat(user, src, "bolted") - -/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) - if(!user_allowed(user)) - return - if(welded) - to_chat(user, text("The airlock has been welded shut!")) - else if(locked) - to_chat(user, text("The door bolts are down!")) - else if(!density) - close() - else - open() - -/obj/machinery/door/airlock/proc/can_remove_electronics() - return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) - -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) - //to_world("airlock attackby src [src] obj [C] mob [user]") - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 75)) - return - if(istype(C, /obj/item/taperoll)) - return - - src.add_fingerprint(user) - if (attempt_vr(src,"attackby_vr",list(C, user))) return - if(istype(C, /mob/living)) - ..() - return - if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) - var/obj/item/weapon/weldingtool/W = C - if(W.remove_fuel(0,user)) - if(!src.welded) - src.welded = 1 - else - src.welded = null - playsound(src, C.usesound, 75, 1) - src.update_icon() - return - else - return - else if(C.is_screwdriver()) - if (src.p_open) - if (stat & BROKEN) - to_chat(usr, "The panel is broken and cannot be closed.") - else - src.p_open = 0 - playsound(src, C.usesound, 50, 1) - else - src.p_open = 1 - playsound(src, C.usesound, 50, 1) - src.update_icon() - else if(C.is_wirecutter()) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/multitool)) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/assembly/signaler)) - return src.attack_hand(user) - else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE - var/obj/item/weapon/pai_cable/cable = C - cable.plugin(src, user) - else if(!repairing && C.is_crowbar()) - if(can_remove_electronics()) - playsound(src, C.usesound, 75, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") - if(do_after(user,40 * C.toolspeed)) - to_chat(user, "You removed the airlock electronics!") - - var/obj/structure/door_assembly/da = new assembly_type(src.loc) - if (istype(da, /obj/structure/door_assembly/multi_tile)) - da.set_dir(src.dir) - - da.anchored = TRUE - if(mineral) - da.glass = mineral - //else if(glass) - else if(glass && !da.glass) - da.glass = 1 - da.state = 1 - da.created_name = src.name - da.update_state() - - if(operating == -1 || (stat & BROKEN)) - new /obj/item/weapon/circuitboard/broken(src.loc) - operating = 0 - else - if (!electronics) create_electronics() - - electronics.loc = src.loc - electronics = null - - qdel(src) - return - else if(arePowerSystemsOn()) - to_chat(user, "The airlock's motors resist your efforts to force it.") - else if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else - if(density) - spawn(0) open(1) - else - spawn(0) close(1) - - // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). - else if(istype(C, /obj/item/weapon)) - var/obj/item/weapon/W = C - if((W.pry == 1) && !arePowerSystemsOn()) - if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else if( !welded && !operating ) - if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. - var/obj/item/weapon/material/twohanded/fireaxe/F = C - if(!F.wielded) - to_chat(user, "You need to be wielding \the [F] to do that.") - return - // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. - if(density) - spawn(0) - open(1) - else - spawn(0) - close(1) - else - ..() - else - ..() - return - -/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) - if(C) - ignite(is_hot(C)) - ..() - -/obj/machinery/door/airlock/set_broken() - src.p_open = 1 - stat |= BROKEN - if (secured_wires) - lock() - for (var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - update_icon() - return - -/obj/machinery/door/airlock/open(var/forced=0) - if(!can_open(forced)) - return 0 - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - - //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator - for(var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. - if(arePowerSystemsOn()) - sound = legacy_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else // Else, play these. - if(arePowerSystemsOn()) - sound = open_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - - if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) - src.closeOther.close() - return ..() - -/obj/machinery/door/airlock/can_open(var/forced=0) - if(!forced) - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - if(locked || welded) - return 0 - return ..() - -/obj/machinery/door/airlock/can_close(var/forced=0) - if(locked || welded) - return 0 - - if(!forced) - //despite the name, this wire is for general door control. - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - return ..() - -/atom/movable/proc/blocks_airlock() - return density - -/obj/machinery/door/blocks_airlock() - return 0 - -/obj/machinery/mech_sensor/blocks_airlock() - return 0 - -/mob/living/blocks_airlock() - return 1 - -/atom/movable/proc/airlock_crush(var/crush_damage) - return 0 - -/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) - . = ..() - health -= crush_damage - healthcheck() - -/obj/effect/energy_field/airlock_crush(var/crush_damage) - adjust_strength(crush_damage) - -/obj/structure/closet/airlock_crush(var/crush_damage) - ..() - damage(crush_damage) - for(var/atom/movable/AM in src) - AM.airlock_crush() - return 1 - -/mob/living/airlock_crush(var/crush_damage) - . = ..() - adjustBruteLoss(crush_damage) - SetStunned(5) - SetWeakened(5) - var/turf/T = get_turf(src) - T.add_blood(src) - return 1 - -/mob/living/carbon/airlock_crush(var/crush_damage) - . = ..() - if(can_feel_pain()) - emote("scream") - -/mob/living/silicon/robot/airlock_crush(var/crush_damage) - adjustBruteLoss(crush_damage) - return 0 - -/obj/machinery/door/airlock/close(var/forced=0) - if(!can_close(forced)) - return 0 - - if(safe) - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.blocks_airlock()) - if(!has_beeped) - playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) - has_beeped = 1 - autoclose_in(6) - return - - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) - take_damage(DOOR_CRUSH_DAMAGE) - - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - has_beeped = 0 - for(var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) - if(arePowerSystemsOn()) - sound = legacy_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else - if(arePowerSystemsOn()) - sound = close_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - for(var/turf/turf in locs) - var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) - if(killthis) - killthis.ex_act(2)//Smashin windows - return ..() - -/obj/machinery/door/airlock/proc/lock(var/forced=0) - if(locked) - return 0 - - if (operating && !forced) return 0 - - src.locked = 1 - playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/unlock(var/forced=0) - if(!src.locked) - return - - if (!forced) - if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return - - src.locked = 0 - playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/allowed(mob/M) - if(locked) - return 0 - return ..(M) - -/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) - ..() - - //if assembly is given, create the new door from the assembly - if (assembly && istype(assembly)) - assembly_type = assembly.type - - electronics = assembly.electronics - electronics.loc = src - - //update the door's access to match the electronics' - secured_wires = electronics.secure - if(electronics.one_access) - LAZYCLEARLIST(req_access) - req_one_access = src.electronics.conf_access - else - LAZYCLEARLIST(req_one_access) - req_access = src.electronics.conf_access - - //get the name from the assembly - if(assembly.created_name) - name = assembly.created_name - else - name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" - - //get the dir from the assembly - set_dir(assembly.dir) - - //wires - var/turf/T = get_turf(newloc) - if(T && (T.z in using_map.admin_levels)) - secured_wires = 1 - if (secured_wires) - wires = new/datum/wires/airlock/secure(src) - else - wires = new/datum/wires/airlock(src) - -/obj/machinery/door/airlock/Initialize() - if(src.closeOtherId != null) - for (var/obj/machinery/door/airlock/A in machines) - if(A.closeOtherId == src.closeOtherId && A != src) - src.closeOther = A - break - name = "\improper [name]" - . = ..() - -/obj/machinery/door/airlock/Destroy() - qdel(wires) - wires = null - return ..() - -// Most doors will never be deconstructed over the course of a round, -// so as an optimization defer the creation of electronics until -// the airlock is deconstructed -/obj/machinery/door/airlock/proc/create_electronics() - //create new electronics - if (secured_wires) - src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) - else - src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) - - //update the electronics to match the door's access - if(LAZYLEN(req_access)) - electronics.conf_access = req_access - else if (LAZYLEN(req_one_access)) - electronics.conf_access = req_one_access - electronics.one_access = 1 - -/obj/machinery/door/airlock/emp_act(var/severity) - if(prob(40/severity)) - var/duration = world.time + SecondsToTicks(30 / severity) - if(duration > electrified_until) - electrify(duration) - ..() - -/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason - ..() - if(stat & NOPOWER) - // If we lost power, disable electrification - // Keeping door lights on, runs on internal battery or something. - electrified_until = 0 - update_icon() - -/obj/machinery/door/airlock/proc/prison_open() - if(arePowerSystemsOn()) - src.unlock() - src.open() - src.lock() - return - - -/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - // Old RCD code made it cost 10 units to decon an airlock. - // Now the new one costs ten "sheets". - return list( - RCD_VALUE_MODE = RCD_DECONSTRUCT, - RCD_VALUE_DELAY = 5 SECONDS, - RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 - ) - return FALSE - -/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span("notice", "You deconstruct \the [src].")) - qdel(src) - return TRUE - return FALSE ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 12997ce83081e67b6f0d6a9b8eb2946e7f21a739 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:53:55 -0400 Subject: [PATCH 37/86] powder that makes you say yes --- code/game/objects/effects/alien/aliens.dm | 133 ---------------------- 1 file changed, 133 deletions(-) diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index b42de46ee4..c0c01f3a46 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -421,136 +421,3 @@ if(0 to 1) visible_message("[src.target] begins to crumble under the acid!") spawn(rand(150, 200)) tick() - -<<<<<<< HEAD -//CHOMPedit old eggs removed -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -/* - * Egg - */ -/var/const //for the status var - BURST = 0 - BURSTING = 1 - GROWING = 2 - GROWN = 3 - - MIN_GROWTH_TIME = 1800 //time it takes to grow a hugger - MAX_GROWTH_TIME = 3000 - -/obj/effect/alien/egg - desc = "It looks like a weird egg" - name = "egg" -// icon_state = "egg_growing" // So the egg looks 'grown', even though it's not. - icon_state = "egg" - density = FALSE - anchored = TRUE - - var/health = 100 - var/status = BURST //can be GROWING, GROWN or BURST; all mutually exclusive - -/obj/effect/alien/egg/New() -/* - if(config.aliens_allowed) - ..() - spawn(rand(MIN_GROWTH_TIME,MAX_GROWTH_TIME)) - Grow() - else - qdel(src) -*/ -/obj/effect/alien/egg/attack_hand(user as mob) - - var/mob/living/carbon/M = user - if(!istype(M) || !(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)) - return attack_hand(user) - - switch(status) - if(BURST) - to_chat(user, "You clear the hatched egg.") - qdel(src) - return -/* if(GROWING) - to_chat(user, "The child is not developed yet.") - return - if(GROWN) - to_chat(user, "You retrieve the child.") - Burst(0) - return - -/obj/effect/alien/egg/proc/GetFacehugger() // Commented out for future edit. - return locate(/obj/item/clothing/mask/facehugger) in contents - -/obj/effect/alien/egg/proc/Grow() - icon_state = "egg" -// status = GROWN - status = BURST -// new /obj/item/clothing/mask/facehugger(src) - return -*/ -/obj/effect/alien/egg/proc/Burst(var/kill = 1) //drops and kills the hugger if any is remaining - if(status == GROWN || status == GROWING) -// var/obj/item/clothing/mask/facehugger/child = GetFacehugger() - icon_state = "egg_hatched" -/* flick("egg_opening", src) - status = BURSTING - spawn(15) - status = BURST - child.loc = get_turf(src) - - if(kill && istype(child)) - child.Die() - else - for(var/mob/M in range(1,src)) - if(CanHug(M)) - child.Attach(M) - break -*/ -/obj/effect/alien/egg/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - ..() - healthcheck() - return - -/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb) - visible_message("[user] [attack_verb] the [src]!") - user.do_attack_animation(src) - health -= damage - healthcheck() - return - -/obj/effect/alien/egg/take_damage(var/damage) - health -= damage - healthcheck() - return - - -/obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) - if(health <= 0) - return - if(LAZYLEN(W.attack_verb)) - src.visible_message("\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") - else - src.visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = W.force / 4.0 - - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - - if(WT.remove_fuel(0, user)) - damage = 15 - playsound(src, 'sound/items/Welder.ogg', 100, 1) - - src.health -= damage - src.healthcheck() - - -/obj/effect/alien/egg/proc/healthcheck() - if(health <= 0) - Burst() - -/obj/effect/alien/egg/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 500 + T0C) - health -= 5 - healthcheck() -======= -//Xenomorph Effect egg removed, replaced with Structure Egg. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 60717d65efcbda0ec07ce68497b009ea2af34128 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:55:42 -0400 Subject: [PATCH 38/86] powder that makes you say yes --- code/controllers/configuration.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index d162cc3616..7ddfc9e088 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD var/list/gamemode_cache = list() /datum/configuration From 19be92fca74b33b8204f2520315926405b510337 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:56:49 -0400 Subject: [PATCH 39/86] powder that makes you say yes --- code/modules/mob/living/carbon/alien/alien.dm | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 3bd95ddf7f..35aca42244 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -43,18 +43,6 @@ /mob/living/carbon/alien/u_equip(obj/item/W as obj) return -<<<<<<< HEAD -/*/mob/living/carbon/alien/Stat() //CHOMPedit. Commented out because this doesn't work properly for larva, when it should. Will probably give Diona their own kind of they don't have one - ..() - stat(null, "Progress: [amount_grown]/[max_grown]") */ - -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -/mob/living/carbon/alien/Stat() - ..() - stat(null, "Progress: [amount_grown]/[max_grown]") - -======= ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /mob/living/carbon/alien/restrained() return 0 From 8156522fbc627d5dff991316c469956d7af204ca Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:57:46 -0400 Subject: [PATCH 40/86] powder that makes you say yes --- code/modules/mob/living/carbon/alien/larva/larva.dm | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 18c5c34c7f..41630f8282 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -5,23 +5,10 @@ speak_emote = list("hisses") icon_state = "larva" language = "Hivemind" -<<<<<<< HEAD - maxHealth = 50 //CHOMPedit. Larva can gain a little more health on weeds/phoron to make them just a little harder to kill - health = 25 -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - maxHealth = 25 - health = 25 -======= maxHealth = 50 health = 50 ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul faction = "xeno" -<<<<<<< HEAD - max_grown = 325 //CHOMPedit. Since xenos can reproduce without people now I decided to drastically increase the growth time -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -======= max_grown = 325 //Increase larva growth time due to not needing hosts. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /mob/living/carbon/alien/larva/Initialize() . = ..() From 244169cb00be7839da63b51f8fdf220766c1d1d2 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:58:15 -0400 Subject: [PATCH 41/86] powder that makes you say yes --- .../modules/mob/living/carbon/alien/larva/progression.dm | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/larva/progression.dm b/code/modules/mob/living/carbon/alien/larva/progression.dm index 9be7ef6b9e..2318c87187 100644 --- a/code/modules/mob/living/carbon/alien/larva/progression.dm +++ b/code/modules/mob/living/carbon/alien/larva/progression.dm @@ -1,17 +1,8 @@ -<<<<<<< HEAD -/mob/living/carbon/alien/larva/Stat() //CHOMPedit. Oh thank god we can see how close we are to full grown now - . = ..() - if(. && statpanel("Status")) - stat("Growth", "[round(amount_grown)]/[max_grown]") - -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -======= /mob/living/carbon/alien/larva/Stat() //Specified where progression stats come from, because for some reason it doesn't work right in carbon/alien . = ..() if(. && statpanel("Status")) stat("Growth", "[round(amount_grown)]/[max_grown]") ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /mob/living/carbon/alien/larva/confirm_evolution() to_chat(src, "You are growing into a beautiful alien! It is time to choose a caste.") From 341f0d989e7b19377e8eb1b61b43332606c893e0 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:59:07 -0400 Subject: [PATCH 42/86] powder that makes you say yes --- code/modules/mob/living/carbon/alien/life.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index acc045e9e4..64e5145b97 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -28,13 +28,7 @@ var/rads = radiation/25 radiation -= rads -<<<<<<< HEAD - /*adjust_nutrition(rads)*/ //CHOMPedit. Commented out to prevent xeno/diona obesity, it was a real problem -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - adjust_nutrition(rads) -======= //adjust_nutrition(rads) //Commented out to prevent alien obesity. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul heal_overall_damage(rads,rads) adjustOxyLoss(-(rads)) adjustToxLoss(-(rads)) From 60f60e58f476deebab3db50a0350f1b911daade5 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 19:01:40 -0400 Subject: [PATCH 43/86] Merge pull request #11188 from VOREStation/Arokha/colorhelpers Remove tons of pointless helpers --- code/_helpers/icons.dm | 546 +----------------- code/_helpers/icons_vr.dm | 6 +- .../subtypes/converters.dm | 2 +- .../human/species/species_shapeshift.dm | 3 +- .../mob/living/carbon/human/update_icons.dm | 11 +- 5 files changed, 11 insertions(+), 557 deletions(-) diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 8e4de46935..74607efe05 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -1,218 +1,3 @@ -/* -IconProcs README - -A BYOND library for manipulating icons and colors - -by Lummox JR - -version 1.0 - -The IconProcs library was made to make a lot of common icon operations much easier. BYOND's icon manipulation -routines are very capable but some of the advanced capabilities like using alpha transparency can be unintuitive to beginners. - -CHANGING ICONS - -Several new procs have been added to the /icon datum to simplify working with icons. To use them, -remember you first need to setup an /icon var like so: - -var/icon/my_icon = new('iconfile.dmi') - -icon/ChangeOpacity(amount = 1) - A very common operation in DM is to try to make an icon more or less transparent. Making an icon more - transparent is usually much easier than making it less so, however. This proc basically is a frontend - for MapColors() which can change opacity any way you like, in much the same way that SetIntensity() - can make an icon lighter or darker. If amount is 0.5, the opacity of the icon will be cut in half. - If amount is 2, opacity is doubled and anything more than half-opaque will become fully opaque. -icon/GrayScale() - Converts the icon to grayscale instead of a fully colored icon. Alpha values are left intact. -icon/ColorTone(tone) - Similar to GrayScale(), this proc converts the icon to a range of black -> tone -> white, where tone is an - RGB color (its alpha is ignored). This can be used to create a sepia tone or similar effect. - See also the global ColorTone() proc. -icon/MinColors(icon) - The icon is blended with a second icon where the minimum of each RGB pixel is the result. - Transparency may increase, as if the icons were blended with ICON_ADD. You may supply a color in place of an icon. -icon/MaxColors(icon) - The icon is blended with a second icon where the maximum of each RGB pixel is the result. - Opacity may increase, as if the icons were blended with ICON_OR. You may supply a color in place of an icon. -icon/Opaque(background = "#000000") - All alpha values are set to 255 throughout the icon. Transparent pixels become black, or whatever background color you specify. -icon/BecomeAlphaMask() - You can convert a simple grayscale icon into an alpha mask to use with other icons very easily with this proc. - The black parts become transparent, the white parts stay white, and anything in between becomes a translucent shade of white. -icon/AddAlphaMask(mask) - The alpha values of the mask icon will be blended with the current icon. Anywhere the mask is opaque, - the current icon is untouched. Anywhere the mask is transparent, the current icon becomes transparent. - Where the mask is translucent, the current icon becomes more transparent. -icon/UseAlphaMask(mask, mode) - Sometimes you may want to take the alpha values from one icon and use them on a different icon. - This proc will do that. Just supply the icon whose alpha mask you want to use, and src will change - so it has the same colors as before but uses the mask for opacity. - -COLOR MANAGEMENT AND HSV - -RGB isn't the only way to represent color. Sometimes it's more useful to work with a model called HSV, which stands for hue, saturation, and value. - - * The hue of a color describes where it is along the color wheel. It goes from red to yellow to green to - cyan to blue to magenta and back to red. - * The saturation of a color is how much color is in it. A color with low saturation will be more gray, - and with no saturation at all it is a shade of gray. - * The value of a color determines how bright it is. A high-value color is vivid, moderate value is dark, - and no value at all is black. - -Just as BYOND uses "#rrggbb" to represent RGB values, a similar format is used for HSV: "#hhhssvv". The hue is three -hex digits because it ranges from 0 to 0x5FF. - - * 0 to 0xFF - red to yellow - * 0x100 to 0x1FF - yellow to green - * 0x200 to 0x2FF - green to cyan - * 0x300 to 0x3FF - cyan to blue - * 0x400 to 0x4FF - blue to magenta - * 0x500 to 0x5FF - magenta to red - -Knowing this, you can figure out that red is "#000ffff" in HSV format, which is hue 0 (red), saturation 255 (as colorful as possible), -value 255 (as bright as possible). Green is "#200ffff" and blue is "#400ffff". - -More than one HSV color can match the same RGB color. - -Here are some procs you can use for color management: - -ReadRGB(rgb) - Takes an RGB string like "#ffaa55" and converts it to a list such as list(255,170,85). If an RGBA format is used - that includes alpha, the list will have a fourth item for the alpha value. -hsv(hue, sat, val, apha) - Counterpart to rgb(), this takes the values you input and converts them to a string in "#hhhssvv" or "#hhhssvvaa" - format. Alpha is not included in the result if null. -ReadHSV(rgb) - Takes an HSV string like "#100FF80" and converts it to a list such as list(256,255,128). If an HSVA format is used that - includes alpha, the list will have a fourth item for the alpha value. -RGBtoHSV(rgb) - Takes an RGB or RGBA string like "#ffaa55" and converts it into an HSV or HSVA color such as "#080aaff". -HSVtoRGB(hsv) - Takes an HSV or HSVA string like "#080aaff" and converts it into an RGB or RGBA color such as "#ff55aa". -BlendRGB(rgb1, rgb2, amount) - Blends between two RGB or RGBA colors using regular RGB blending. If amount is 0, the first color is the result; - if 1, the second color is the result. 0.5 produces an average of the two. Values outside the 0 to 1 range are allowed as well. - The returned value is an RGB or RGBA color. -BlendHSV(hsv1, hsv2, amount) - Blends between two HSV or HSVA colors using HSV blending, which tends to produce nicer results than regular RGB - blending because the brightness of the color is left intact. If amount is 0, the first color is the result; if 1, - the second color is the result. 0.5 produces an average of the two. Values outside the 0 to 1 range are allowed as well. - The returned value is an HSV or HSVA color. -BlendRGBasHSV(rgb1, rgb2, amount) - Like BlendHSV(), but the colors used and the return value are RGB or RGBA colors. The blending is done in HSV form. -HueToAngle(hue) - Converts a hue to an angle range of 0 to 360. Angle 0 is red, 120 is green, and 240 is blue. -AngleToHue(hue) - Converts an angle to a hue in the valid range. -RotateHue(hsv, angle) - Takes an HSV or HSVA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360. - (Rotating red by 60deg produces yellow.) The result is another HSV or HSVA color with the same saturation and value - as the original, but a different hue. -GrayScale(rgb) - Takes an RGB or RGBA color and converts it to grayscale. Returns an RGB or RGBA string. -ColorTone(rgb, tone) - Similar to GrayScale(), this proc converts an RGB or RGBA color to a range of black -> tone -> white instead of - using strict shades of gray. The tone value is an RGB color; any alpha value is ignored. -*/ - -/* -Get Flat Icon DEMO by DarkCampainger - -This is a test for the get flat icon proc, modified approprietly for icons and their states. -Probably not a good idea to run this unless you want to see how the proc works in detail. -mob - icon = 'old_or_unused.dmi' - icon_state = "green" - - Login() - // Testing image underlays - underlays += image(icon='old_or_unused.dmi',icon_state="red") - underlays += image(icon='old_or_unused.dmi',icon_state="red", pixel_x = 32) - underlays += image(icon='old_or_unused.dmi',icon_state="red", pixel_x = -32) - - // Testing image overlays - overlays += image(icon='old_or_unused.dmi',icon_state="green", pixel_x = 32, pixel_y = -32) - overlays += image(icon='old_or_unused.dmi',icon_state="green", pixel_x = 32, pixel_y = 32) - overlays += image(icon='old_or_unused.dmi',icon_state="green", pixel_x = -32, pixel_y = -32) - - // Testing icon file overlays (defaults to mob's state) - overlays += '_flat_demoIcons2.dmi' - - // Testing icon_state overlays (defaults to mob's icon) - overlays += "white" - - // Testing dynamic icon overlays - var/icon/I = icon('old_or_unused.dmi', icon_state="aqua") - I.Shift(NORTH,16,1) - overlays+=I - - // Testing dynamic image overlays - I=image(icon=I,pixel_x = -32, pixel_y = 32) - overlays+=I - - // Testing object types (and layers) - overlays+=/obj/effect/overlayTest - - loc = locate (10,10,1) - verb - Browse_Icon() - set name = "1. Browse Icon" - // Give it a name for the cache - var/iconName = "[ckey(src.name)]_flattened.dmi" - // Send the icon to src's local cache - src<

    ") - - Output_Icon() - set name = "2. Output Icon" - to_chat(src, "Icon is: [bicon(getFlatIcon(src))]") - - Label_Icon() - set name = "3. Label Icon" - // Give it a name for the cache - var/iconName = "[ckey(src.name)]_flattened.dmi" - // Copy the file to the rsc manually - var/icon/I = fcopy_rsc(getFlatIcon(src)) - // Send the icon to src's local cache - src< 57 && ch < 65) || (ch > 70 && ch < 97) || ch > 102) break - ++digits - if(digits == 8) break - - var/single = digits < 6 - if(digits != 3 && digits != 4 && digits != 6 && digits != 8) return - if(digits == 4 || digits == 8) usealpha = 1 - for(i=start, digits>0, ++i) - ch = text2ascii(rgb, i) - if(ch >= 48 && ch <= 57) ch -= 48 - else if(ch >= 65 && ch <= 70) ch -= 55 - else if(ch >= 97 && ch <= 102) ch -= 87 - else break - --digits - switch(which) - if(0) - r = (r << 4) | ch - if(single) - r |= r << 4 - ++which - else if(!(digits & 1)) ++which - if(1) - g = (g << 4) | ch - if(single) - g |= g << 4 - ++which - else if(!(digits & 1)) ++which - if(2) - b = (b << 4) | ch - if(single) - b |= b << 4 - ++which - else if(!(digits & 1)) ++which - if(3) - alpha = (alpha << 4) | ch - if(single) alpha |= alpha << 4 - - . = list(r, g, b) - if(usealpha) . += alpha - -/proc/RGBdec2hex(var/list/values) - var/string = "" - while(values.len) - string = "[num2text(values[values.len], 2, 16)][string]" - values.len-- - return "#[string]" - -/proc/ReadHSV(hsv) - if(!hsv) return - - // interpret the HSV or HSVA value - var/i=1,start=1 - if(text2ascii(hsv) == 35) ++start // skip opening # - var/ch,which=0,hue=0,sat=0,val=0,alpha=0,usealpha - var/digits=0 - for(i=start, i<=length(hsv), ++i) - ch = text2ascii(hsv, i) - if(ch < 48 || (ch > 57 && ch < 65) || (ch > 70 && ch < 97) || ch > 102) break - ++digits - if(digits == 9) break - if(digits > 7) usealpha = 1 - if(digits <= 4) ++which - if(digits <= 2) ++which - for(i=start, digits>0, ++i) - ch = text2ascii(hsv, i) - if(ch >= 48 && ch <= 57) ch -= 48 - else if(ch >= 65 && ch <= 70) ch -= 55 - else if(ch >= 97 && ch <= 102) ch -= 87 - else break - --digits - switch(which) - if(0) - hue = (hue << 4) | ch - if(digits == (usealpha ? 6 : 4)) ++which - if(1) - sat = (sat << 4) | ch - if(digits == (usealpha ? 4 : 2)) ++which - if(2) - val = (val << 4) | ch - if(digits == (usealpha ? 2 : 0)) ++which - if(3) - alpha = (alpha << 4) | ch - - . = list(hue, sat, val) - if(usealpha) . += alpha - -/proc/HSVtoRGB(hsv) - if(!hsv) return "#000000" - var/list/HSV = ReadHSV(hsv) - if(!HSV) return "#000000" - - var/hue = HSV[1] - var/sat = HSV[2] - var/val = HSV[3] - - // Compress hue into easier-to-manage range - hue -= hue >> 8 - if(hue >= 0x5fa) hue -= 0x5fa - - var/hi,mid,lo,r,g,b - hi = val - lo = round((255 - sat) * val / 255, 1) - mid = lo + round(abs(round(hue, 510) - hue) * (hi - lo) / 255, 1) - if(hue >= 765) - if(hue >= 1275) {r=hi; g=lo; b=mid} - else if(hue >= 1020) {r=mid; g=lo; b=hi } - else {r=lo; g=mid; b=hi } - else - if(hue >= 510) {r=lo; g=hi; b=mid} - else if(hue >= 255) {r=mid; g=hi; b=lo } - else {r=hi; g=mid; b=lo } - - return (HSV.len > 3) ? rgb(r,g,b,HSV[4]) : rgb(r,g,b) - -/proc/RGBtoHSV(rgb) - if(!rgb) return "#0000000" - var/list/RGB = ReadRGB(rgb) - if(!RGB) return "#0000000" - - var/r = RGB[1] - var/g = RGB[2] - var/b = RGB[3] - var/hi = max(r,g,b) - var/lo = min(r,g,b) - - var/val = hi - var/sat = hi ? round((hi-lo) * 255 / hi, 1) : 0 - var/hue = 0 - - if(sat) - var/dir - var/mid - if(hi == r) - if(lo == b) {hue=0; dir=1; mid=g} - else {hue=1535; dir=-1; mid=b} - else if(hi == g) - if(lo == r) {hue=512; dir=1; mid=b} - else {hue=511; dir=-1; mid=r} - else if(hi == b) - if(lo == g) {hue=1024; dir=1; mid=r} - else {hue=1023; dir=-1; mid=g} - hue += dir * round((mid-lo) * 255 / (hi-lo), 1) - - return hsv(hue, sat, val, (RGB.len>3 ? RGB[4] : null)) - -/proc/hsv(hue, sat, val, alpha) - if(hue < 0 || hue >= 1536) hue %= 1536 - if(hue < 0) hue += 1536 - if((hue & 0xFF) == 0xFF) - ++hue - if(hue >= 1536) hue = 0 - if(sat < 0) sat = 0 - if(sat > 255) sat = 255 - if(val < 0) val = 0 - if(val > 255) val = 255 - . = "#" - . += TO_HEX_DIGIT(hue >> 8) - . += TO_HEX_DIGIT(hue >> 4) - . += TO_HEX_DIGIT(hue) - . += TO_HEX_DIGIT(sat >> 4) - . += TO_HEX_DIGIT(sat) - . += TO_HEX_DIGIT(val >> 4) - . += TO_HEX_DIGIT(val) - if(!isnull(alpha)) - if(alpha < 0) alpha = 0 - if(alpha > 255) alpha = 255 - . += TO_HEX_DIGIT(alpha >> 4) - . += TO_HEX_DIGIT(alpha) - -/* - Smooth blend between HSV colors - - amount=0 is the first color - amount=1 is the second color - amount=0.5 is directly between the two colors - - amount<0 or amount>1 are allowed - */ -/proc/BlendHSV(hsv1, hsv2, amount) - var/list/HSV1 = ReadHSV(hsv1) - var/list/HSV2 = ReadHSV(hsv2) - - // add missing alpha if needed - if(HSV1.len < HSV2.len) HSV1 += 255 - else if(HSV2.len < HSV1.len) HSV2 += 255 - var/usealpha = HSV1.len > 3 - - // normalize hsv values in case anything is screwy - if(HSV1[1] > 1536) HSV1[1] %= 1536 - if(HSV2[1] > 1536) HSV2[1] %= 1536 - if(HSV1[1] < 0) HSV1[1] += 1536 - if(HSV2[1] < 0) HSV2[1] += 1536 - if(!HSV1[3]) {HSV1[1] = 0; HSV1[2] = 0} - if(!HSV2[3]) {HSV2[1] = 0; HSV2[2] = 0} - - // no value for one color means don't change saturation - if(!HSV1[3]) HSV1[2] = HSV2[2] - if(!HSV2[3]) HSV2[2] = HSV1[2] - // no saturation for one color means don't change hues - if(!HSV1[2]) HSV1[1] = HSV2[1] - if(!HSV2[2]) HSV2[1] = HSV1[1] - - // Compress hues into easier-to-manage range - HSV1[1] -= HSV1[1] >> 8 - HSV2[1] -= HSV2[1] >> 8 - - var/hue_diff = HSV2[1] - HSV1[1] - if(hue_diff > 765) hue_diff -= 1530 - else if(hue_diff <= -765) hue_diff += 1530 - - var/hue = round(HSV1[1] + hue_diff * amount, 1) - var/sat = round(HSV1[2] + (HSV2[2] - HSV1[2]) * amount, 1) - var/val = round(HSV1[3] + (HSV2[3] - HSV1[3]) * amount, 1) - var/alpha = usealpha ? round(HSV1[4] + (HSV2[4] - HSV1[4]) * amount, 1) : null - - // normalize hue - if(hue < 0 || hue >= 1530) hue %= 1530 - if(hue < 0) hue += 1530 - // decompress hue - hue += round(hue / 255) - - return hsv(hue, sat, val, alpha) - -/* - Smooth blend between RGB colors - - amount=0 is the first color - amount=1 is the second color - amount=0.5 is directly between the two colors - - amount<0 or amount>1 are allowed - */ /proc/BlendRGB(rgb1, rgb2, amount) - var/list/RGB1 = ReadRGB(rgb1) - var/list/RGB2 = ReadRGB(rgb2) + var/list/RGB1 = rgb2num(rgb1) + var/list/RGB2 = rgb2num(rgb2) // add missing alpha if needed if(RGB1.len < RGB2.len) RGB1 += 255 @@ -574,65 +95,6 @@ world return isnull(alpha) ? rgb(r, g, b) : rgb(r, g, b, alpha) -/proc/BlendRGBasHSV(rgb1, rgb2, amount) - return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount) - -/proc/HueToAngle(hue) - // normalize hsv in case anything is screwy - if(hue < 0 || hue >= 1536) hue %= 1536 - if(hue < 0) hue += 1536 - // Compress hue into easier-to-manage range - hue -= hue >> 8 - return hue / (1530/360) - -/proc/AngleToHue(angle) - // normalize hsv in case anything is screwy - if(angle < 0 || angle >= 360) angle -= 360 * round(angle / 360) - var/hue = angle * (1530/360) - // Decompress hue - hue += round(hue / 255) - return hue - - -// positive angle rotates forward through red->green->blue -/proc/RotateHue(hsv, angle) - var/list/HSV = ReadHSV(hsv) - - // normalize hsv in case anything is screwy - if(HSV[1] >= 1536) HSV[1] %= 1536 - if(HSV[1] < 0) HSV[1] += 1536 - - // Compress hue into easier-to-manage range - HSV[1] -= HSV[1] >> 8 - - if(angle < 0 || angle >= 360) angle -= 360 * round(angle / 360) - HSV[1] = round(HSV[1] + angle * (1530/360), 1) - - // normalize hue - if(HSV[1] < 0 || HSV[1] >= 1530) HSV[1] %= 1530 - if(HSV[1] < 0) HSV[1] += 1530 - // decompress hue - HSV[1] += round(HSV[1] / 255) - - return hsv(HSV[1], HSV[2], HSV[3], (HSV.len > 3 ? HSV[4] : null)) - -// Convert an rgb color to grayscale -/proc/GrayScale(rgb) - var/list/RGB = ReadRGB(rgb) - var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11 - return (RGB.len > 3) ? rgb(gray, gray, gray, RGB[4]) : rgb(gray, gray, gray) - -// Change grayscale color to black->tone->white range -/proc/ColorTone(rgb, tone) - var/list/RGB = ReadRGB(rgb) - var/list/TONE = ReadRGB(tone) - - var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11 - var/tone_gray = TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11 - - if(gray <= tone_gray) return BlendRGB("#000000", tone, gray/(tone_gray || 1)) - else return BlendRGB(tone, "#ffffff", (gray-tone_gray)/((255-tone_gray) || 1)) - // Ported from /tg/station // Creates a single icon from a given /atom or /image. Only the first argument is required. /proc/getFlatIcon(image/A, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) @@ -937,7 +399,7 @@ GLOBAL_LIST_EMPTY(cached_examine_icons) if (!color) return "#FFFFFF" if (!value) return color - var/list/RGB = ReadRGB(color) + var/list/RGB = rgb2num(color) RGB[1] = CLAMP(RGB[1]+value,0,255) RGB[2] = CLAMP(RGB[2]+value,0,255) RGB[3] = CLAMP(RGB[3]+value,0,255) diff --git a/code/_helpers/icons_vr.dm b/code/_helpers/icons_vr.dm index 1b500862b6..1afbeb21f1 100644 --- a/code/_helpers/icons_vr.dm +++ b/code/_helpers/icons_vr.dm @@ -12,14 +12,14 @@ var/final_average if (accurate) //keeping it legible for(var/i = 1 to total) - RGB = ReadRGB(colors[i]) + RGB = rgb2num(colors[i]) colorsum[1] += RGB[1]*RGB[1] colorsum[2] += RGB[2]*RGB[2] colorsum[3] += RGB[3]*RGB[3] final_average = rgb(sqrt(colorsum[1]/total), sqrt(colorsum[2]/total), sqrt(colorsum[3]/total)) else for(var/i = 1 to total) - RGB = ReadRGB(colors[i]) + RGB = rgb2num(colors[i]) colorsum[1] += RGB[1] colorsum[2] += RGB[2] colorsum[3] += RGB[3] @@ -32,7 +32,7 @@ for(var/y_pixel = 1 to I.Height()) var/this_color = I.GetPixel(x_pixel, y_pixel) if(this_color) - if (ignoreGreyscale && ReadHSV(RGBtoHSV(this_color))[2] == 0) //If saturation is 0, must be greyscale + if (ignoreGreyscale && rgb2num(this_color, COLORSPACE_HSV)[2] == 0) //If saturation is 0, must be greyscale continue colors.Add(this_color) return colors diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index 316742e488..ada8eadbc6 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -361,7 +361,7 @@ var/saturation = get_pin_data(IC_INPUT, 2) var/value = get_pin_data(IC_INPUT, 3) if(isnum(hue) && isnum(saturation) && isnum(value)) - result = HSVtoRGB(hsv(AngleToHue(hue),saturation,value)) + result = rgb(h = hue, s = saturation, v = value, space = COLORSPACE_HSV) set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index d616b7dc1e..ac4929b13e 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -177,8 +177,7 @@ var/list/wrapped_species_by_ref = list() last_special = world.time + 50 - var/current = RGBdec2hex(list(r_skin, g_skin, b_skin)) - var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", current) as null|color + var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", rgb(r_skin, g_skin, b_skin)) as null|color if(!new_skin) return shapeshifter_set_colour(new_skin) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e940e154f1..040e152d88 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -348,7 +348,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(husk) base_icon.ColorTone(husk_color_mod) else if(hulk) - var/list/tone = ReadRGB(hulk_color_mod) + var/list/tone = rgb2num(hulk_color_mod) base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) //Handle husk overlay. @@ -1168,13 +1168,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return working /mob/living/carbon/human/proc/get_ears_overlay() - //If you are FBP with ear style and didn't set a custom one - var/datum/robolimb/model = isSynthetic() - if(istype(model) && model.includes_ears && !ear_style) - var/icon/ears_s = new/icon("icon" = synthetic.icon, "icon_state" = "ears") - ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return ears_s - if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) if(ear_style.do_colouration) @@ -1196,7 +1189,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() /mob/living/carbon/human/proc/get_tail_image() //If you are FBP with tail style and didn't set a custom one var/datum/robolimb/model = isSynthetic() - if(istype(model) && model.includes_tail && !tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) + if(istype(model) && model.includes_tail && !tail_style) var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) return image(tail_s) From ab88b2420dc8c272d71ab8685740f5b98a893d24 Mon Sep 17 00:00:00 2001 From: Aronai Sieyes Date: Tue, 20 Jul 2021 19:01:54 -0400 Subject: [PATCH 45/86] Merge pull request #11165 from VOREStation/Arokha/lightport Small light optimizations --- code/datums/components/overlay_lighting.dm | 5 ++++- code/game/turfs/turf_changing.dm | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index b6a812ce9a..8c4046c867 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -182,9 +182,12 @@ if(!current_holder) return var/atom/movable/light_source = GET_LIGHT_SOURCE + . = list() for(var/turf/lit_turf in view(lumcount_range, get_turf(light_source))) lit_turf.dynamic_lumcount += lum_power - LAZYADD(affected_turfs, lit_turf) + . += lit_turf + if(length(.)) + affected_turfs = . ///Clears the old affected turfs and populates the new ones. diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 85292aa2b3..492f3ef65b 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -41,6 +41,7 @@ var/old_directional_opacity = directional_opacity var/old_outdoors = outdoors var/old_dangerous_objects = dangerous_objects + var/old_dynamic_lumcount = dynamic_lumcount var/turf/Ab = GetAbove(src) if(Ab) @@ -111,6 +112,8 @@ lighting_corner_SW = old_lighting_corner_SW lighting_corner_NW = old_lighting_corner_NW + dynamic_lumcount = old_dynamic_lumcount + if(SSlighting.subsystem_initialized) lighting_object = old_lighting_object From 9710a4ed2fc200a446bf9dda49d67d038475868a Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:09:44 -0400 Subject: [PATCH 47/86] powder that makes you say yes --- .../human/species/xenomorphs/alien_powers.dm | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 142d91fb13..60b9dda702 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -79,16 +79,8 @@ // Queen verbs. /mob/living/carbon/human/proc/lay_egg() -<<<<<<< HEAD - set name = "Lay Egg (200)" //CHOMPedit changed number value - set desc = "Lay an egg that hatch into larva." //CHOMPedit -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - set name = "Lay Egg (75)" - set desc = "Lay an egg to produce huggers to impregnate prey with." -======= set name = "Lay Egg (200)" set desc = "Lay an egg to produce huggers to impregnate prey with." ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul set category = "Abilities" if(!config.aliens_allowed) @@ -96,31 +88,13 @@ verbs -= /mob/living/carbon/human/proc/lay_egg return -<<<<<<< HEAD - if(locate(/obj/structure/alien/egg) in get_turf(src)) //CHOMPedit. Changed from obj/effect to obj/structure -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - if(locate(/obj/effect/alien/egg) in get_turf(src)) -======= if(locate(/obj/structure/alien/egg) in get_turf(src)) ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul to_chat(src, "There's already an egg here.") return -<<<<<<< HEAD - if(check_alien_ability(200,1,O_EGG)) //CHOMPedit changed plasma cost from 75 to 200 -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - if(check_alien_ability(75,1,O_EGG)) -======= if(check_alien_ability(200,1,O_EGG)) ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul visible_message("[src] has laid an egg!") -<<<<<<< HEAD - new /obj/structure/alien/egg(loc) //CHOMPedit. Changed from obj/effect to obj/structure -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - new /obj/effect/alien/egg(loc) -======= new /obj/structure/alien/egg(loc) ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul return From 38f2f79eab0c57d0e9a81f5b5dc14361647c9c0c Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:10:34 -0400 Subject: [PATCH 48/86] powder that makes you say yes --- .../carbon/human/species/xenomorphs/alien_powers.dm | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index 60b9dda702..b5271cff96 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -329,13 +329,7 @@ /mob/living/carbon/human/proc/gut() set category = "Abilities" -<<<<<<< HEAD - set name = "Slaughter" //CHOMPedit renamed Gut to Slaughter so its more obvious what it does -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - set name = "Gut" -======= set name = "Slaughter" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul set desc = "While grabbing someone aggressively, rip their guts out or tear them apart." if(last_special > world.time) @@ -351,13 +345,7 @@ return if(G.state < GRAB_AGGRESSIVE) -<<<<<<< HEAD - to_chat(src, "You must have an aggressive grab to slaughter your prey!") //CHOMPedit -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - to_chat(src, "You must have an aggressive grab to gut your prey!") -======= to_chat(src, "You must have an aggressive grab to slaughter your prey!") ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul return last_special = world.time + 50 From 83eabfdf82377d34a1aa0fa32946bfe6db58852e Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:31:04 -0400 Subject: [PATCH 49/86] powder that makes you say yes --- .../human/species/xenomorphs/alien_species.dm | 80 ------------------- 1 file changed, 80 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 9f50a7177f..3f39fc9ef2 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -25,16 +25,8 @@ siemens_coefficient = 0 gluttonous = 2 -<<<<<<< HEAD - brute_mod = 0.65 //CHOMPedit. Edited brute vulnerability - burn_mod = 1.50 //CHOMPedit. Edited burn vulnerability -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - brute_mod = 0.5 // Hardened carapace. - burn_mod = 2 // Weak to fire. -======= brute_mod = 0.6 // Hardened carapace. burn_mod = 1.75 // Weak to fire. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul warning_low_pressure = 50 hazard_low_pressure = -1 @@ -52,13 +44,7 @@ flesh_color = "#282846" gibbed_anim = "gibbed-a" dusted_anim = "dust-a" -<<<<<<< HEAD - death_message = "lets out a piercing multi-toned screech, green blood bubbling from its maw as it ceases." //CHOMPedit. Changed message. -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - death_message = "lets out a waning guttural screech, green blood bubbling from its maw." -======= death_message = "lets out a guttural screech, green blood bubbling from its maw." ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul death_sound = 'sound/voice/hiss6.ogg' damage_overlays = null //CHOMPedit. They don't have overlays yet, if someone wants to add some then be my guest @@ -73,15 +59,9 @@ breath_type = null poison_type = null -<<<<<<< HEAD -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - vision_flags = SEE_SELF|SEE_MOBS - -======= vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS darksight = 10 ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul has_organ = list( O_HEART = /obj/item/organ/internal/heart, O_BRAIN = /obj/item/organ/internal/brain/xeno, @@ -119,13 +99,7 @@ return SPECIES_GENA //CHOMPedit /datum/species/xenos/get_random_name() -<<<<<<< HEAD - return "Genaprawn [caste_name] ([alien_number])" //CHOMPedit -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - return "alien [caste_name] ([alien_number])" -======= return "xenomorph [caste_name] ([alien_number])" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /datum/species/xenos/can_understand(var/mob/other) if(istype(other, /mob/living/carbon/alien/larva)) @@ -143,13 +117,7 @@ H.mind.special_role = "Alien" alien_number++ //Keep track of how many aliens we've had so far. -<<<<<<< HEAD - H.real_name = "Genaprawn [caste_name] ([alien_number])" //CHOMPedit -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - H.real_name = "alien [caste_name] ([alien_number])" -======= H.real_name = "xenomorph [caste_name] ([alien_number])" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul H.name = H.real_name ..() @@ -202,20 +170,6 @@ return 1 return 0 -<<<<<<< HEAD -//CHOMPedit removed infection images, since they do not exist anymore. -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -/* -/datum/species/xenos/handle_login_special(var/mob/living/carbon/human/H) - H.AddInfectionImages() - ..() - -/datum/species/xenos/handle_logout_special(var/mob/living/carbon/human/H) - H.RemoveInfectionImages() - ..() -*/ -======= ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul /datum/species/xenos/drone name = SPECIES_GENA_DRONE //CHOMPedit @@ -321,29 +275,13 @@ /datum/species/xenos/queen -<<<<<<< HEAD - name = SPECIES_GENA_QUEEN //CHOMPedit - total_health = 300 //CHOMPedit. Queen is chonk -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - name = SPECIES_XENO_QUEEN - total_health = 250 -======= name = SPECIES_XENO_QUEEN total_health = 300 ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul weeds_heal_rate = 5 weeds_plasma_rate = 20 caste_name = "queen" -<<<<<<< HEAD - slowdown = 4 - tail = null //CHOMPedit. Set to null -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - slowdown = 4 - tail = "xenos_queen_tail" -======= slowdown = 3 tail = "xenos_queen_tail" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul rarity_value = 10 icobase = 'icons/mob/human_races/xenos/r_xenos_queen.dmi' @@ -381,22 +319,10 @@ ..() // Make sure only one official queen exists at any point. if(!alien_queen_exists(1,H)) -<<<<<<< HEAD - H.real_name = "Genaprawn queen ([alien_number])" //CHOMPedit -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - H.real_name = "alien queen ([alien_number])" -======= H.real_name = "xenomorph queen ([alien_number])" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul H.name = H.real_name else -<<<<<<< HEAD - H.real_name = "Genaprawn princess ([alien_number])" //CHOMPedit -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - H.real_name = "alien princess ([alien_number])" -======= H.real_name = "xenomorph princess ([alien_number])" ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul H.name = H.real_name /datum/hud_data/alien @@ -417,10 +343,4 @@ gear = list( "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store, "state" = "pocket"), "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store, "state" = "pocket"), -<<<<<<< HEAD - ) //CHOMPedit removed head and outer layer item slots, since they caused a slew of problems with xenomorphs -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - ) -======= ) //Removed hat and outer slots, it caused too many problems that required admin intervention. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 0336bd7396a5fb553b328408f64c6fb9427e6600 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:32:05 -0400 Subject: [PATCH 50/86] powder that makes you say yes --- .../human/species/xenomorphs/xenomorphs.dm | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index be18629fa0..6ddcdc9b02 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -25,43 +25,6 @@ /mob/living/carbon/human/xqueen/New(var/new_loc) h_style = "Bald" faction = "xeno" -<<<<<<< HEAD - ..(new_loc, SPECIES_GENA_QUEEN) //CHOMPedit - -//CHOMPedit. Removed AddInfectionImages code, due to it being commented out and not used - -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul - ..(new_loc, SPECIES_XENO_QUEEN) - -// I feel like we should generalize/condense down all the various icon-rendering antag procs. -/*---------------------------------------- -Proc: AddInfectionImages() -Des: Gives the client of the alien an image on each infected mob. -----------------------------------------*/ -/* -/mob/living/carbon/human/proc/AddInfectionImages() - if (client) - for (var/mob/living/C in mob_list) - if(C.status_flags & XENO_HOST) - var/obj/item/alien_embryo/A = locate() in C - var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]") - client.images += I - return -*/ -/*---------------------------------------- -Proc: RemoveInfectionImages() -Des: Removes all infected images from the alien. -----------------------------------------*/ -/* -/mob/living/carbon/human/proc/RemoveInfectionImages() - if (client) - for(var/image/I in client.images) - if(dd_hasprefix_case(I.icon_state, "infected")) - qdel(I) - return -*/ -======= ..(new_loc, SPECIES_XENO_QUEEN) //Removed AddInfectionImages, no longer required. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 2b84f4948e3b94787894039a827dba490abad38f Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:32:58 -0400 Subject: [PATCH 51/86] powder that makes you say yes --- code/modules/surgery/organs_internal.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 62d39f3c48..e5f49cc922 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -14,12 +14,7 @@ return 0 return affected && affected.open == (affected.encased ? 3 : 2) -<<<<<<< HEAD -//CHOMPedit. Removed unused embryo surgery -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -======= //Removed unused Embryo Surgery, derelict and broken. ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul ////////////////////////////////////////////////////////////////// // CHEST INTERNAL ORGAN SURGERY // From 0fa37966e0d271c623f3306cfcc03d44387f74f6 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:33:57 -0400 Subject: [PATCH 52/86] powder that makes you say yes --- .../mountains/crashed_ufo_frigate.dmm | 330 +----------------- 1 file changed, 9 insertions(+), 321 deletions(-) diff --git a/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm b/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm index 151f08fc28..e7cc5b471f 100644 --- a/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm +++ b/maps/submaps/surface_submaps/mountains/crashed_ufo_frigate.dmm @@ -1,9 +1,8 @@ -<<<<<<< HEAD "aa" = (/turf/template_noop,/area/template_noop) "ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) "ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"ae" = (/obj/structure/closet/secure_closet/egg/xenomorph,/obj/item/organ/internal/intestine/xeno{name = "inert xeno larva"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"ae" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) "ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) @@ -12,7 +11,7 @@ "ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) "am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"an" = (/obj/structure/window/phoronreinforced,/obj/structure/closet/secure_closet/egg/xenomorph,/obj/item/organ/internal/intestine/xeno{name = "inert xeno larva"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"an" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) @@ -48,8 +47,8 @@ "aU" = (/obj/machinery/replicator,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "aV" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/drug_den,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "aW" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aX" = (/obj/structure/prop/alien/computer/camera/flipped{dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aY" = (/obj/structure/prop/alien/computer/camera{dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aX" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"aY" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "aZ" = (/obj/machinery/porta_turret/alien/destroyed,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "ba" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/scientific,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "bb" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/nanites,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) @@ -68,7 +67,7 @@ "bo" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "bp" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bq" = (/obj/machinery/implantchair,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"br" = (/obj/structure/prop/alien/computer{dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"br" = (/obj/structure/prop/alien/computer{icon_state = "console-c"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bs" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "bt" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bu" = (/obj/structure/loot_pile/surface/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) @@ -79,14 +78,14 @@ "bz" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bA" = (/obj/item/brokenbug,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) "bB" = (/mob/living/simple_mob/animal/space/alien/sentinel,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bC" = (/obj/structure/prop/alien/computer/camera/flipped{dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bD" = (/obj/structure/prop/alien/computer/camera{dir = 8},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bC" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) +"bD" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "bE" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bF" = (/obj/structure/prop/blackbox/xenofrigate,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bG" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) "bH" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bI" = (/obj/structure/table/alien,/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bJ" = (/obj/structure/window/phoronreinforced{dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bJ" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bK" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bL" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bM" = (/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) @@ -96,7 +95,7 @@ "bQ" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "bR" = (/obj/structure/table/alien,/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bS" = (/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bT" = (/obj/structure/window/phoronreinforced{dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) +"bT" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) "bU" = (/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) "bV" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) "bW" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) @@ -153,314 +152,3 @@ aaaaaabGaxaxadbGaaaaabababacapapapcgapcgapalalalabababaaaaaaadadadadadaxbGaaaa aaaaaaaaaaaxaxadadaaaaaaababababakchaHchakababababaaaaaaadadaxaxbGaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaabGadaaaaaaaaaaaaaaaaaaaa "} -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -"aa" = (/turf/template_noop,/area/template_noop) -"ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) -"ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"ae" = (/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ai" = (/obj/machinery/artifact,/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aj" = (/obj/random/outcrop,/turf/simulated/floor/outdoors/ice,/area/template_noop) -"ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"an" = (/obj/structure/window/phoronreinforced,/obj/effect/alien/egg,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"ar" = (/obj/effect/alien/weeds/node,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"as" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"at" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"au" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"av" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aw" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ax" = (/turf/simulated/floor/outdoors/ice,/area/template_noop) -"ay" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"az" = (/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aA" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aB" = (/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aC" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aD" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aE" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aF" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aG" = (/obj/machinery/vr_sleeper/alien/random_replicant,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aH" = (/obj/structure/prop/alien/pod,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aI" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aJ" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aK" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aL" = (/obj/structure/table/alien,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aM" = (/obj/structure/prop/alien/computer/camera,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aN" = (/obj/structure/prop/alien/computer/camera/flipped,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aO" = (/obj/structure/simple_door/resin,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aP" = (/obj/structure/prop/alien/power,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aQ" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aR" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aS" = (/obj/structure/table/alien,/obj/random/tool/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aT" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aU" = (/obj/machinery/replicator,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aV" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/drug_den,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aW" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aX" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aY" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aZ" = (/obj/machinery/porta_turret/alien/destroyed,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ba" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/scientific,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bb" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/nanites,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bc" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/fresh_medicine,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bd" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/viral,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"be" = (/obj/machinery/door/blast/puzzle,/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bf" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bg" = (/obj/structure/prop/lock/projectile,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bh" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/old_medicine,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bi" = (/obj/structure/prop/alien/dispenser,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bj" = (/obj/effect/decal/remains/xeno,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bk" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bl" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bm" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bn" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bo" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bp" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bq" = (/obj/machinery/implantchair,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"br" = (/obj/structure/prop/alien/computer{icon_state = "console-c"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bs" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bt" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bu" = (/obj/structure/loot_pile/surface/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bv" = (/obj/item/weapon/surgical/bone_clamp/alien,/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bw" = (/obj/structure/prop/alien/computer,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bx" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/accessory/medal/dungeon/alien_ufo{desc = "It vaguely like a star. It looks like something an alien admiral might've worn. Probably."; name = "alien admiral's medal"},/obj/item/weapon/telecube/precursor/mated/zone,/obj/item/clothing/head/helmet/alien/tank,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"by" = (/obj/structure/loot_pile/mecha/gygax/dark,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bz" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bA" = (/obj/item/brokenbug,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"bB" = (/mob/living/simple_mob/animal/space/alien/sentinel,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bC" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bD" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bE" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bF" = (/obj/structure/prop/blackbox/xenofrigate,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bG" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"bH" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bI" = (/obj/structure/table/alien,/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bJ" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bK" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bL" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bM" = (/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bN" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bO" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bP" = (/obj/structure/table/alien,/obj/item/weapon/weldingtool/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bQ" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bR" = (/obj/structure/table/alien,/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bS" = (/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bT" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bU" = (/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bV" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bW" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bX" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bY" = (/obj/structure/foamedmetal,/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bZ" = (/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ca" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cb" = (/obj/structure/prop/alien/power,/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cc" = (/obj/structure/loot_pile/surface/alien/end,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cd" = (/obj/item/prop/alien/junk,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ce" = (/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"cf" = (/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cg" = (/obj/machinery/door/airlock/alien/public,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"ch" = (/turf/simulated/shuttle/wall/alien/hard_corner,/area/submap/cave/crashed_ufo_frigate) - -(1,1,1) = {" -aaaaaaaxbGaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaxaxadaxaxbGaaaaaaaaababababacaeacafaeababababaaaaaaajaxadaaaaadaxajaaaaaa -adbGadadadadaxaxaaaaabababagahababacaiacababacakabababaaaaadaxadadaxaxaaaaaaaa -aaaxaxadadadadaaaaababacalalahahabamamanabacacacacaoababaaaaadbGadadaaaaaaaaaa -aaaaaaadbGadaaaaababaoacacalapapchalalalchapapaqaracasababaaaaaaadadadaxaxadaa -aaaaadadadaaaaababaoacacapapapapatalapapauapapapavalacawababaaaaaaadadadaxajaa -aaadadaxaaaaababaoacayapapapalalchazacaAchaAaBapapaCacacawababaaaaaxadadadaaaa -aaaxaxaaaaababaoacalalapapahaDabababazababababawapapaEacacaBababaaaxadaaaaaaaa -adbGaxaaaaabacacalalapapacaFababaGabababaHabababaIapapaqaAacakabaaajaxaaaaaaaa -aaadaaaaababacacaFapapacacaFabaGacaGabaHalalaJacacacapapacacabababaaaxaaaaaaaa -aaadaaaaabakacacaKapapacacacababaJababawacacchabacaAapapacababaIabaaaaaaaaaaaa -aaaaaaababababaFaFapalalacacaJacacakabaLacaLabababacapapababaIacababaaaaaaaaaa -aaaaaaabaMaNabababalalacacacababaOababaLacaLababababchatchaFalacaPabaaaaaaaaaa -aaaaaaabaFacakacchauchaoacacabaeaQaeabaLacaLabababakapaRabaSalacaPabadaxaaaaaa -aaaaaaabaFacalalapalababaTalababaeabababawababaMaFacapapabahalacaPabadadaaaaaa -aaaaababaFalalapapapacababalaTabababakabababaUacaFacapapatacacababababadaxaaaa -aaaaabaVacapapapapacacakababababacacaWaAacababacacapapapabavababacacabadaxaaaa -aaaaabacapapapapacacacacabababaXacaFaFahalaYababchaRapacabababaZacacabadadadaa -adaaabbaapapacalbbalbcacbdabacacapalalalapapapapbeapacacaIabalalacapchaZadadaa -adaaabalapabababababababababapapapapapapapapapapchaFacbfababbgacapapatacadbAaa -adaaabbhalabbiawabbiapaFabapapaRbjbkacacacaparblabbmacaFabacacapapapchaZadadaa -axaaabalbnbobpacabbiapbqchapalalalaFaFaFacacapalabbfacbmabacapapapalabadadaxaa -axaaabalbnbnbnbrabbibsapatapalagabababababakapapabbtaAbuabalapapalalabadadaxaa -aaadababaFbnapbvababaFaFchapalababbwbxbwababapapabbyacbzabalalapacababadadaaaa -aaaaaaabaFapbBacaYababababapapabbCapapapbDabapapabbEbFbHabalalapacabadaxaaaaaa -aaaaaaabaFapapalalalalababapapabapapaRapapabapapabababababalapapalabadaaaaaaaa -axaaaaabbIaFapapbpalalabacalapbJapbKbLbfapbMapapacabacakbNapapalalabaaaaaaaaaa -axadaaababaFapbnbnacacabagalapbJbOaFapbPbObMapapakabacacbQapapalababaaaaaaaaaa -adbGadaaabbIbRbnapapbSabalalapbTapaRapapalbUapapacabacbVbWapacalabaaaaaaaaaaaa -aaaxaxaaababaFacapapbSababalaRapapapbXalalalaRacababacapapacakababaaaaaaaaaaaa -aaaaaxaaaaabbIaFapapapbSabalapapapapapapapapapacabacapapapacacabaaaaaaaaadadaa -aaaaaaaaaaabababchbYchabababbfbOapapapapapbObfabababchatchabababaaaaaaadbGadaa -aaadaaaaaaaaababbZbZbnapacababaFahalagarcaaFababacapapapacababaaaaaaadadadadaa -aaadaxajaaaaaaababcbbZapapalabababccabccabababacapapapaPababaaaaaaadadadadaaaa -aaadadaxaxbGaaaaababbZapapcdalalabababababacapapapapacababaaaaaaaxaxadadadadaa -aaaaadadadadadaaaaababaPacapapalalchapchceapapalcfaPababaaaaaabGadadadaxaxadaa -aaaaaabGaxaxadbGaaaaabababacapapapcgapcgapalalalabababaaaaaaadadadadadaxbGaaaa -aaaaaaaaaaaxaxadadaaaaaaababababakchaHchakababababaaaaaaadadaxaxbGaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaabGadaaaaaaaaaaaaaaaaaaaa -"} -======= -"aa" = (/turf/template_noop,/area/template_noop) -"ab" = (/turf/simulated/shuttle/wall/alien,/area/submap/cave/crashed_ufo_frigate) -"ac" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ad" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"ae" = (/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"af" = (/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ag" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ah" = (/obj/structure/table/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ai" = (/obj/machinery/artifact,/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aj" = (/obj/random/outcrop,/turf/simulated/floor/outdoors/ice,/area/template_noop) -"ak" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"al" = (/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"am" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"an" = (/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ao" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ap" = (/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aq" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"ar" = (/obj/effect/alien/weeds/node,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"as" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"at" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"au" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"av" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aw" = (/obj/structure/prop/alien/pod/open,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ax" = (/turf/simulated/floor/outdoors/ice,/area/template_noop) -"ay" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"az" = (/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aA" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aB" = (/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aC" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aD" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aE" = (/obj/structure/prop/alien/pod/open,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aF" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aG" = (/obj/machinery/vr_sleeper/alien/random_replicant,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aH" = (/obj/structure/prop/alien/pod,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aI" = (/obj/structure/loot_pile/surface/alien/engineering,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aJ" = (/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aK" = (/obj/structure/table/alien,/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aL" = (/obj/structure/table/alien,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aM" = (/obj/structure/prop/alien/computer/camera,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aN" = (/obj/structure/prop/alien/computer/camera/flipped,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aO" = (/obj/structure/simple_door/resin,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aP" = (/obj/structure/prop/alien/power,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aQ" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aR" = (/obj/effect/alien/weeds/node,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"aS" = (/obj/structure/table/alien,/obj/random/tool/alien,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aT" = (/obj/structure/loot_pile/surface/alien/security,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"aU" = (/obj/machinery/replicator,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aV" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/drug_den,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aW" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aX" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aY" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"aZ" = (/obj/machinery/porta_turret/alien/destroyed,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"ba" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/scientific,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bb" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/nanites,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bc" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/fresh_medicine,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bd" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/viral,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"be" = (/obj/machinery/door/blast/puzzle,/obj/machinery/door/airlock/alien/locked,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bf" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bg" = (/obj/structure/prop/lock/projectile,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bh" = (/obj/structure/closet/alien,/obj/random/unidentified_medicine/old_medicine,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bi" = (/obj/structure/prop/alien/dispenser,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bj" = (/obj/effect/decal/remains/xeno,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bk" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bl" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/under/psysuit,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bm" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bn" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bo" = (/obj/machinery/porta_turret/alien{faction = "xeno"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bp" = (/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bq" = (/obj/machinery/implantchair,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"br" = (/obj/structure/prop/alien/computer{icon_state = "console-c"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bs" = (/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bt" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bu" = (/obj/structure/loot_pile/surface/drone,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bv" = (/obj/item/weapon/surgical/bone_clamp/alien,/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bw" = (/obj/structure/prop/alien/computer,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bx" = (/obj/effect/decal/remains/xeno,/obj/item/clothing/accessory/medal/dungeon/alien_ufo{desc = "It vaguely like a star. It looks like something an alien admiral might've worn. Probably."; name = "alien admiral's medal"},/obj/item/weapon/telecube/precursor/mated/zone,/obj/item/clothing/head/helmet/alien/tank,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"by" = (/obj/structure/loot_pile/mecha/gygax/dark,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bz" = (/obj/structure/mopbucket,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bA" = (/obj/item/brokenbug,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"bB" = (/mob/living/simple_mob/animal/space/alien/sentinel,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bC" = (/obj/structure/prop/alien/computer/camera/flipped{icon_state = "camera_flipped"; dir = 4},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bD" = (/obj/structure/prop/alien/computer/camera{icon_state = "camera"; dir = 8},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bE" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bF" = (/obj/structure/prop/blackbox/xenofrigate,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bG" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/template_noop) -"bH" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bI" = (/obj/structure/table/alien,/obj/structure/loot_pile/surface/alien/medical,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bJ" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bK" = (/obj/structure/table/alien,/obj/item/prop/alien/junk,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bL" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/obj/item/device/gps/internal/poi,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bM" = (/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bN" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bO" = (/obj/structure/table/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bP" = (/obj/structure/table/alien,/obj/item/weapon/weldingtool/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bQ" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bR" = (/obj/structure/table/alien,/obj/structure/foamedmetal,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bS" = (/obj/structure/closet/alien,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bT" = (/obj/structure/window/phoronreinforced{icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alienplating,/area/submap/cave/crashed_ufo_frigate) -"bU" = (/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 4},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bV" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced,/obj/item/weapon/paper/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bW" = (/obj/structure/table/alien,/obj/structure/window/phoronreinforced{dir = 4},/obj/structure/window/phoronreinforced,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bX" = (/mob/living/simple_mob/animal/space/alien,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"bY" = (/obj/structure/foamedmetal,/obj/machinery/door/airlock/alien/locked,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"bZ" = (/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ca" = (/obj/structure/table/alien,/obj/item/weapon/paper/alien{icon_state = "alienpaper_words"; info = "\[i]This tablet has a large collection of symbols that you've never seen before outside this ship. You have no hope of figuring out what any of the mean...\[/i]"},/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cb" = (/obj/structure/prop/alien/power,/obj/structure/foamedmetal,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cc" = (/obj/structure/loot_pile/surface/alien/end,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cd" = (/obj/item/prop/alien/junk,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"ce" = (/obj/random/tech_supply/component,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"cf" = (/obj/random/tech_supply/component,/turf/simulated/floor/outdoors/ice,/area/submap/cave/crashed_ufo_frigate) -"cg" = (/obj/machinery/door/airlock/alien/public,/turf/simulated/shuttle/floor/alien,/area/submap/cave/crashed_ufo_frigate) -"ch" = (/turf/simulated/shuttle/wall/alien/hard_corner,/area/submap/cave/crashed_ufo_frigate) - -(1,1,1) = {" -aaaaaaaxbGaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaxaxadaxaxbGaaaaaaaaababababacaeacafaeababababaaaaaaajaxadaaaaadaxajaaaaaa -adbGadadadadaxaxaaaaabababagahababacaiacababacakabababaaaaadaxadadaxaxaaaaaaaa -aaaxaxadadadadaaaaababacalalahahabamamanabacacacacaoababaaaaadbGadadaaaaaaaaaa -aaaaaaadbGadaaaaababaoacacalapapchalalalchapapaqaracasababaaaaaaadadadaxaxadaa -aaaaadadadaaaaababaoacacapapapapatalapapauapapapavalacawababaaaaaaadadadaxajaa -aaadadaxaaaaababaoacayapapapalalchazacaAchaAaBapapaCacacawababaaaaaxadadadaaaa -aaaxaxaaaaababaoacalalapapahaDabababazababababawapapaEacacaBababaaaxadaaaaaaaa -adbGaxaaaaabacacalalapapacaFababaGabababaHabababaIapapaqaAacakabaaajaxaaaaaaaa -aaadaaaaababacacaFapapacacaFabaGacaGabaHalalaJacacacapapacacabababaaaxaaaaaaaa -aaadaaaaabakacacaKapapacacacababaJababawacacchabacaAapapacababaIabaaaaaaaaaaaa -aaaaaaababababaFaFapalalacacaJacacakabaLacaLabababacapapababaIacababaaaaaaaaaa -aaaaaaabaMaNabababalalacacacababaOababaLacaLababababchatchaFalacaPabaaaaaaaaaa -aaaaaaabaFacakacchauchaoacacabaeaQaeabaLacaLabababakapaRabaSalacaPabadaxaaaaaa -aaaaaaabaFacalalapalababaTalababaeabababawababaMaFacapapabahalacaPabadadaaaaaa -aaaaababaFalalapapapacababalaTabababakabababaUacaFacapapatacacababababadaxaaaa -aaaaabaVacapapapapacacakababababacacaWaAacababacacapapapabavababacacabadaxaaaa -aaaaabacapapapapacacacacabababaXacaFaFahalaYababchaRapacabababaZacacabadadadaa -adaaabbaapapacalbbalbcacbdabacacapalalalapapapapbeapacacaIabalalacapchaZadadaa -adaaabalapabababababababababapapapapapapapapapapchaFacbfababbgacapapatacadbAaa -adaaabbhalabbiawabbiapaFabapapaRbjbkacacacaparblabbmacaFabacacapapapchaZadadaa -axaaabalbnbobpacabbiapbqchapalalalaFaFaFacacapalabbfacbmabacapapapalabadadaxaa -axaaabalbnbnbnbrabbibsapatapalagabababababakapapabbtaAbuabalapapalalabadadaxaa -aaadababaFbnapbvababaFaFchapalababbwbxbwababapapabbyacbzabalalapacababadadaaaa -aaaaaaabaFapbBacaYababababapapabbCapapapbDabapapabbEbFbHabalalapacabadaxaaaaaa -aaaaaaabaFapapalalalalababapapabapapaRapapabapapabababababalapapalabadaaaaaaaa -axaaaaabbIaFapapbpalalabacalapbJapbKbLbfapbMapapacabacakbNapapalalabaaaaaaaaaa -axadaaababaFapbnbnacacabagalapbJbOaFapbPbObMapapakabacacbQapapalababaaaaaaaaaa -adbGadaaabbIbRbnapapbSabalalapbTapaRapapalbUapapacabacbVbWapacalabaaaaaaaaaaaa -aaaxaxaaababaFacapapbSababalaRapapapbXalalalaRacababacapapacakababaaaaaaaaaaaa -aaaaaxaaaaabbIaFapapapbSabalapapapapapapapapapacabacapapapacacabaaaaaaaaadadaa -aaaaaaaaaaabababchbYchabababbfbOapapapapapbObfabababchatchabababaaaaaaadbGadaa -aaadaaaaaaaaababbZbZbnapacababaFahalagarcaaFababacapapapacababaaaaaaadadadadaa -aaadaxajaaaaaaababcbbZapapalabababccabccabababacapapapaPababaaaaaaadadadadaaaa -aaadadaxaxbGaaaaababbZapapcdalalabababababacapapapapacababaaaaaaaxaxadadadadaa -aaaaadadadadadaaaaababaPacapapalalchapchceapapalcfaPababaaaaaabGadadadaxaxadaa -aaaaaabGaxaxadbGaaaaabababacapapapcgapcgapalalalabababaaaaaaadadadadadaxbGaaaa -aaaaaaaaaaaxaxadadaaaaaaababababakchaHchakababababaaaaaaadadaxaxbGaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaabGadaaaaaaaaaaaaaaaaaaaa -"} ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From c7c98a69b2442205ca2ee9ec4b605fa0832b4843 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:34:38 -0400 Subject: [PATCH 53/86] powder that makes you say yes --- .../surface_submaps/mountains/vault4.dmm | 50 +------------------ 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/maps/submaps/surface_submaps/mountains/vault4.dmm b/maps/submaps/surface_submaps/mountains/vault4.dmm index bbd4824422..43939ca317 100644 --- a/maps/submaps/surface_submaps/mountains/vault4.dmm +++ b/maps/submaps/surface_submaps/mountains/vault4.dmm @@ -1,4 +1,3 @@ -<<<<<<< HEAD "a" = (/turf/template_noop,/area/template_noop) "b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) "c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) @@ -8,7 +7,7 @@ "g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) "h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) "i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"j" = (/obj/effect/alien/weeds,/obj/structure/closet/secure_closet/egg/xenomorph,/obj/item/organ/internal/intestine/xeno{name = "inert xeno larva"},/obj/item/organ/internal/intestine/xeno{name = "inert xeno larva"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) +"j" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) (1,1,1) = {" aaaaaaaaa @@ -21,50 +20,3 @@ abbfedbba aabbcbbaa aaaaaaaaa "} -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -"a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"f" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"j" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) - -(1,1,1) = {" -aaaaaaaaa -aabbcbbaa -abbdefbba -abdeeghba -aciejeica -abhgeedba -abbfedbba -aabbcbbaa -aaaaaaaaa -"} -======= -"a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"f" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien/drone,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"g" = (/obj/effect/alien/weeds/node,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"i" = (/obj/effect/alien/weeds,/mob/living/simple_mob/animal/space/alien,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) -"j" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault4) - -(1,1,1) = {" -aaaaaaaaa -aabbcbbaa -abbdefbba -abdeeghba -aciejeica -abhgeedba -abbfedbba -aabbcbbaa -aaaaaaaaa -"} ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 106a37fce8ea552ca1820c43872255bbb473f1a5 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:35:22 -0400 Subject: [PATCH 54/86] powder that makes you say yes --- .../surface_submaps/mountains/vault5.dmm | 52 +------------------ 1 file changed, 1 insertion(+), 51 deletions(-) diff --git a/maps/submaps/surface_submaps/mountains/vault5.dmm b/maps/submaps/surface_submaps/mountains/vault5.dmm index a98b97c720..19b3a3d910 100644 --- a/maps/submaps/surface_submaps/mountains/vault5.dmm +++ b/maps/submaps/surface_submaps/mountains/vault5.dmm @@ -1,4 +1,3 @@ -<<<<<<< HEAD "a" = (/turf/template_noop,/area/template_noop) "b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) @@ -7,7 +6,7 @@ "f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"i" = (/obj/effect/alien/weeds,/obj/structure/closet/secure_closet/egg/xenomorph,/obj/item/organ/internal/intestine/xeno{name = "inert xeno larva"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) +"i" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) "k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) @@ -22,52 +21,3 @@ abbkegbba aabbcbbaa aaaaaaaaa "} -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -"a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/obj/item/weapon/gun/projectile/p92x/large,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"i" = (/obj/effect/alien/weeds,/obj/effect/alien/egg,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) - -(1,1,1) = {" -aaaaaaaaa -aabbcbbaa -abbdefbba -abgeeehba -abiejeiba -abheeegba -abbkegbba -aabbcbbaa -aaaaaaaaa -"} -======= -"a" = (/turf/template_noop,/area/template_noop) -"b" = (/obj/effect/alien/resin/wall,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"c" = (/obj/structure/simple_door/resin,/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"d" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/obj/item/weapon/gun/projectile/p92x/large,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"e" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"f" = (/obj/effect/alien/weeds,/obj/item/clothing/suit/storage/vest/tactical,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"g" = (/obj/effect/alien/weeds,/obj/structure/bed/nest,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"h" = (/obj/effect/alien/weeds,/obj/random/multiple/minevault,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"i" = (/obj/effect/alien/weeds,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"j" = (/obj/effect/alien/weeds,/obj/effect/alien/weeds/node,/mob/living/simple_mob/animal/space/alien/queen/empress,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) -"k" = (/obj/effect/alien/weeds,/obj/item/clothing/head/helmet/tac,/obj/item/weapon/gun/projectile/SVD,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault5) - -(1,1,1) = {" -aaaaaaaaa -aabbcbbaa -abbdefbba -abgeeehba -abiejeiba -abheeegba -abbkegbba -aabbcbbaa -aaaaaaaaa -"} ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From 2036315a55f5aa349a16456a4eba750f1581c73d Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:36:56 -0400 Subject: [PATCH 55/86] powder that makes you say yes --- vorestation.dme | 8118 +---------------------------------------------- 1 file changed, 2 insertions(+), 8116 deletions(-) diff --git a/vorestation.dme b/vorestation.dme index e2ecc486f8..bc3a77b259 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1,4 +1,3 @@ -<<<<<<< HEAD // DM Environment file for baystation12.dme. // All manual changes should be made outside the BEGIN_ and END_ blocks. // New source code should be placed in .dm files: choose File/New --> Code File. @@ -1575,6 +1574,8 @@ #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm" #include "code\game\objects\structures\window_vr.dm" +#include "code\game\objects\structures\alien\alien egg.dm" +#include "code\game\objects\structures\alien\alien.dm" #include "code\game\objects\structures\crates_lockers\__closets.dm" #include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" #include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" @@ -4360,8118 +4361,3 @@ #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE -||||||| parent of eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul -// DM Environment file for baystation12.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. - // New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES -// BEGIN_INCLUDE -#include "code\_away_mission_tests.dm" -#include "code\_macros.dm" -#include "code\_macros_vr.dm" -#include "code\_map_tests.dm" -#include "code\_unit_tests.dm" -#include "code\global.dm" -#include "code\global_init.dm" -#include "code\global_vr.dm" -#include "code\hub.dm" -#include "code\names.dm" -#include "code\stylesheet.dm" -#include "code\world.dm" -#include "code\__datastructures\globals.dm" -#include "code\__defines\__513_compatibility.dm" -#include "code\__defines\_compile_options.dm" -#include "code\__defines\_lists.dm" -#include "code\__defines\_planes+layers.dm" -#include "code\__defines\_planes+layers_vr.dm" -#include "code\__defines\_protect.dm" -#include "code\__defines\_tick.dm" -#include "code\__defines\admin.dm" -#include "code\__defines\admin_vr.dm" -#include "code\__defines\appearance.dm" -#include "code\__defines\atmos.dm" -#include "code\__defines\belly_modes_vr.dm" -#include "code\__defines\callbacks.dm" -#include "code\__defines\chemistry.dm" -#include "code\__defines\chemistry_vr.dm" -#include "code\__defines\color.dm" -#include "code\__defines\construction.dm" -#include "code\__defines\crafting.dm" -#include "code\__defines\damage_organs.dm" -#include "code\__defines\dna.dm" -#include "code\__defines\exosuit_fab.dm" -#include "code\__defines\flags.dm" -#include "code\__defines\gamemode.dm" -#include "code\__defines\holomap.dm" -#include "code\__defines\hoses.dm" -#include "code\__defines\input.dm" -#include "code\__defines\instruments.dm" -#include "code\__defines\integrated_circuits.dm" -#include "code\__defines\inventory_sizes.dm" -#include "code\__defines\is_helpers.dm" -#include "code\__defines\items_clothing.dm" -#include "code\__defines\lighting.dm" -#include "code\__defines\lighting_vr.dm" -#include "code\__defines\machinery.dm" -#include "code\__defines\map.dm" -#include "code\__defines\materials.dm" -#include "code\__defines\math.dm" -#include "code\__defines\math_physics.dm" -#include "code\__defines\MC.dm" -#include "code\__defines\misc.dm" -#include "code\__defines\misc_vr.dm" -#include "code\__defines\mobs.dm" -#include "code\__defines\mobs_vr.dm" -#include "code\__defines\nifsoft.dm" -#include "code\__defines\objects.dm" -#include "code\__defines\overmap.dm" -#include "code\__defines\pda.dm" -#include "code\__defines\planets.dm" -#include "code\__defines\planets_vr.dm" -#include "code\__defines\plants.dm" -#include "code\__defines\preferences.dm" -#include "code\__defines\process_scheduler.dm" -#include "code\__defines\qdel.dm" -#include "code\__defines\research.dm" -#include "code\__defines\roguemining_vr.dm" -#include "code\__defines\rust_g.dm" -#include "code\__defines\shields.dm" -#include "code\__defines\shuttle.dm" -#include "code\__defines\sound.dm" -#include "code\__defines\spaceman_dmm.dm" -#include "code\__defines\species_languages.dm" -#include "code\__defines\species_languages_vr.dm" -#include "code\__defines\sprite_sheets.dm" -#include "code\__defines\sqlite_defines.dm" -#include "code\__defines\stat_tracking.dm" -#include "code\__defines\subsystems.dm" -#include "code\__defines\supply.dm" -#include "code\__defines\targeting.dm" -#include "code\__defines\tgs.config.dm" -#include "code\__defines\tgs.dm" -#include "code\__defines\tgui.dm" -#include "code\__defines\tools.dm" -#include "code\__defines\turfs.dm" -#include "code\__defines\typeids.dm" -#include "code\__defines\unit_tests.dm" -#include "code\__defines\vote.dm" -#include "code\__defines\vv.dm" -#include "code\__defines\webhooks.dm" -#include "code\__defines\wires.dm" -#include "code\__defines\xenoarcheaology.dm" -#include "code\__defines\ZAS.dm" -#include "code\__defines\dcs\flags.dm" -#include "code\__defines\dcs\helpers.dm" -#include "code\__defines\dcs\signals.dm" -#include "code\_global_vars\bitfields.dm" -#include "code\_global_vars\misc.dm" -#include "code\_global_vars\mobs.dm" -#include "code\_global_vars\religion.dm" -#include "code\_global_vars\sensitive.dm" -#include "code\_global_vars\typecache.dm" -#include "code\_global_vars\lists\mapping.dm" -#include "code\_global_vars\lists\misc.dm" -#include "code\_global_vars\lists\species.dm" -#include "code\_helpers\_global_objects.dm" -#include "code\_helpers\_global_objects_vr.dm" -#include "code\_helpers\_lists.dm" -#include "code\_helpers\atmospherics.dm" -#include "code\_helpers\atom_movables.dm" -#include "code\_helpers\events.dm" -#include "code\_helpers\files.dm" -#include "code\_helpers\game.dm" -#include "code\_helpers\global_lists.dm" -#include "code\_helpers\global_lists_vr.dm" -#include "code\_helpers\icons.dm" -#include "code\_helpers\icons_vr.dm" -#include "code\_helpers\lighting.dm" -#include "code\_helpers\logging.dm" -#include "code\_helpers\logging_vr.dm" -#include "code\_helpers\matrices.dm" -#include "code\_helpers\mobs.dm" -#include "code\_helpers\names.dm" -#include "code\_helpers\sanitize_values.dm" -#include "code\_helpers\storage.dm" -#include "code\_helpers\string_lists.dm" -#include "code\_helpers\text.dm" -#include "code\_helpers\time.dm" -#include "code\_helpers\turfs.dm" -#include "code\_helpers\type2type.dm" -#include "code\_helpers\unsorted.dm" -#include "code\_helpers\unsorted_vr.dm" -#include "code\_helpers\view.dm" -#include "code\_helpers\visual_filters.dm" -#include "code\_helpers\sorts\__main.dm" -#include "code\_helpers\sorts\comparators.dm" -#include "code\_helpers\sorts\TimSort.dm" -#include "code\_onclick\_defines.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\rig.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\_defines_vr.dm" -#include "code\_onclick\hud\ability_screen_objects.dm" -#include "code\_onclick\hud\action.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alert_vr.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\gun_mode.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\map_popups.dm" -#include "code\_onclick\hud\minihud.dm" -#include "code\_onclick\hud\minihud_mapper.dm" -#include "code\_onclick\hud\minihud_rigmech.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\other_mobs.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\radial_persistent.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\robot_vr.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\screen_objects_vr.dm" -#include "code\_onclick\hud\skybox.dm" -#include "code\_onclick\hud\soulcatcher_guest.dm" -#include "code\_onclick\hud\spell_screen_objects.dm" -#include "code\ATMOSPHERICS\_atmos_setup.dm" -#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" -#include "code\ATMOSPHERICS\atmospherics.dm" -#include "code\ATMOSPHERICS\datum_pipe_network.dm" -#include "code\ATMOSPHERICS\datum_pipeline.dm" -#include "code\ATMOSPHERICS\components\portables_connector.dm" -#include "code\ATMOSPHERICS\components\shutoff.dm" -#include "code\ATMOSPHERICS\components\tvalve.dm" -#include "code\ATMOSPHERICS\components\valve.dm" -#include "code\ATMOSPHERICS\components\binary_devices\algae_generator_vr.dm" -#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" -#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" -#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" -#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" -#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" -#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" -#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" -#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" -#include "code\ATMOSPHERICS\components\unary\heat_source.dm" -#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" -#include "code\ATMOSPHERICS\components\unary\unary_base.dm" -#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber_vr.dm" -#include "code\ATMOSPHERICS\pipes\cap.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes_vr.dm" -#include "code\ATMOSPHERICS\pipes\manifold.dm" -#include "code\ATMOSPHERICS\pipes\manifold4w.dm" -#include "code\ATMOSPHERICS\pipes\pipe_base.dm" -#include "code\ATMOSPHERICS\pipes\pipe_base_vr.dm" -#include "code\ATMOSPHERICS\pipes\simple.dm" -#include "code\ATMOSPHERICS\pipes\tank.dm" -#include "code\ATMOSPHERICS\pipes\tank_vr.dm" -#include "code\ATMOSPHERICS\pipes\universal.dm" -#include "code\ATMOSPHERICS\pipes\vent.dm" -#include "code\controllers\autotransfer.dm" -#include "code\controllers\communications.dm" -#include "code\controllers\configuration.dm" -#include "code\controllers\configuration_vr.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\emergency_shuttle_controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\master_controller.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\verbs.dm" -#include "code\controllers\observer_listener\atom\observer.dm" -#include "code\controllers\subsystems\ai.dm" -#include "code\controllers\subsystems\aifast.dm" -#include "code\controllers\subsystems\air.dm" -#include "code\controllers\subsystems\airflow.dm" -#include "code\controllers\subsystems\alarm.dm" -#include "code\controllers\subsystems\assets.dm" -#include "code\controllers\subsystems\atoms.dm" -#include "code\controllers\subsystems\character_setup.dm" -#include "code\controllers\subsystems\chat.dm" -#include "code\controllers\subsystems\chemistry.dm" -#include "code\controllers\subsystems\circuits.dm" -#include "code\controllers\subsystems\dcs.dm" -#include "code\controllers\subsystems\events.dm" -#include "code\controllers\subsystems\garbage.dm" -#include "code\controllers\subsystems\holomaps.dm" -#include "code\controllers\subsystems\inactivity.dm" -#include "code\controllers\subsystems\input.dm" -#include "code\controllers\subsystems\job.dm" -#include "code\controllers\subsystems\lighting.dm" -#include "code\controllers\subsystems\machines.dm" -#include "code\controllers\subsystems\mapping.dm" -#include "code\controllers\subsystems\media_tracks.dm" -#include "code\controllers\subsystems\mobs.dm" -#include "code\controllers\subsystems\nightshift.dm" -#include "code\controllers\subsystems\orbits.dm" -#include "code\controllers\subsystems\overlays.dm" -#include "code\controllers\subsystems\persist_vr.dm" -#include "code\controllers\subsystems\persistence.dm" -#include "code\controllers\subsystems\planets.dm" -#include "code\controllers\subsystems\plants.dm" -#include "code\controllers\subsystems\radiation.dm" -#include "code\controllers\subsystems\shuttles.dm" -#include "code\controllers\subsystems\skybox.dm" -#include "code\controllers\subsystems\sounds.dm" -#include "code\controllers\subsystems\sqlite.dm" -#include "code\controllers\subsystems\sun.dm" -#include "code\controllers\subsystems\supply.dm" -#include "code\controllers\subsystems\tgui.dm" -#include "code\controllers\subsystems\ticker.dm" -#include "code\controllers\subsystems\time_track.dm" -#include "code\controllers\subsystems\timer.dm" -#include "code\controllers\subsystems\transcore_vr.dm" -#include "code\controllers\subsystems\vis_overlays.dm" -#include "code\controllers\subsystems\vote.dm" -#include "code\controllers\subsystems\webhooks.dm" -#include "code\controllers\subsystems\xenoarch.dm" -#include "code\controllers\subsystems\processing\bellies_vr.dm" -#include "code\controllers\subsystems\processing\fastprocess.dm" -#include "code\controllers\subsystems\processing\instruments.dm" -#include "code\controllers\subsystems\processing\obj.dm" -#include "code\controllers\subsystems\processing\processing.dm" -#include "code\controllers\subsystems\processing\projectiles.dm" -#include "code\controllers\subsystems\processing\turfs.dm" -#include "code\datums\ai_law_sets.dm" -#include "code\datums\ai_law_sets_vr.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\category.dm" -#include "code\datums\chat_message.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\EPv2.dm" -#include "code\datums\ghost_query.dm" -#include "code\datums\ghost_query_vr.dm" -#include "code\datums\hierarchy.dm" -#include "code\datums\mind.dm" -#include "code\datums\mind_vr.dm" -#include "code\datums\mixed.dm" -#include "code\datums\modules.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\orbit.dm" -#include "code\datums\organs.dm" -#include "code\datums\position_point_vector.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\reference_tracking.dm" -#include "code\datums\riding.dm" -#include "code\datums\soul_link.dm" -#include "code\datums\sun.dm" -#include "code\datums\weakref.dm" -#include "code\datums\autolathe\arms.dm" -#include "code\datums\autolathe\arms_vr.dm" -#include "code\datums\autolathe\autolathe.dm" -#include "code\datums\autolathe\devices.dm" -#include "code\datums\autolathe\devices_vr.dm" -#include "code\datums\autolathe\engineering.dm" -#include "code\datums\autolathe\engineering_vr.dm" -#include "code\datums\autolathe\general.dm" -#include "code\datums\autolathe\general_vr.dm" -#include "code\datums\autolathe\materials.dm" -#include "code\datums\autolathe\medical.dm" -#include "code\datums\autolathe\medical_vr.dm" -#include "code\datums\autolathe\tools.dm" -#include "code\datums\autolathe\tools_vr.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\overlay_lighting.dm" -#include "code\datums\components\resize_guard.dm" -#include "code\datums\components\crafting\crafting.dm" -#include "code\datums\components\crafting\crafting_external.dm" -#include "code\datums\components\crafting\recipes.dm" -#include "code\datums\components\crafting\tool_quality.dm" -#include "code\datums\components\crafting\recipes\primitive.dm" -#include "code\datums\components\crafting\recipes\weapons.dm" -#include "code\datums\elements\_element.dm" -#include "code\datums\elements\light_blocking.dm" -#include "code\datums\elements\turf_transparency.dm" -#include "code\datums\game_masters\_common.dm" -#include "code\datums\helper_datums\construction_datum.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\getrev.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\teleport_vr.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\locations\locations.dm" -#include "code\datums\locations\nyx.dm" -#include "code\datums\locations\qerrvallis.dm" -#include "code\datums\locations\s_randarr.dm" -#include "code\datums\locations\sol.dm" -#include "code\datums\locations\tau_ceti.dm" -#include "code\datums\locations\uueoa_esa.dm" -#include "code\datums\locations\vir.dm" -#include "code\datums\looping_sounds\_looping_sound.dm" -#include "code\datums\looping_sounds\item_sounds.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\sequence.dm" -#include "code\datums\looping_sounds\weather_sounds.dm" -#include "code\datums\managed_browsers\_managed_browser.dm" -#include "code\datums\managed_browsers\feedback_form.dm" -#include "code\datums\managed_browsers\feedback_viewer.dm" -#include "code\datums\observation\_debug.dm" -#include "code\datums\observation\_defines.dm" -#include "code\datums\observation\destroyed.dm" -#include "code\datums\observation\dir_set.dm" -#include "code\datums\observation\equipped.dm" -#include "code\datums\observation\helpers.dm" -#include "code\datums\observation\logged_in.dm" -#include "code\datums\observation\moved.dm" -#include "code\datums\observation\observation.dm" -#include "code\datums\observation\power_change.dm" -#include "code\datums\observation\shuttle_added.dm" -#include "code\datums\observation\shuttle_moved.dm" -#include "code\datums\observation\stat_set.dm" -#include "code\datums\observation\turf_changed.dm" -#include "code\datums\observation\turf_enterexit.dm" -#include "code\datums\observation\unequipped.dm" -#include "code\datums\observation\z_moved.dm" -#include "code\datums\observation\~cleanup.dm" -#include "code\datums\outfits\_defines.dm" -#include "code\datums\outfits\horror_killers.dm" -#include "code\datums\outfits\misc.dm" -#include "code\datums\outfits\nanotrasen.dm" -#include "code\datums\outfits\outfit.dm" -#include "code\datums\outfits\outfit_vr.dm" -#include "code\datums\outfits\pirates.dm" -#include "code\datums\outfits\spec_op.dm" -#include "code\datums\outfits\tournament.dm" -#include "code\datums\outfits\wizardry.dm" -#include "code\datums\outfits\costumes\costume.dm" -#include "code\datums\outfits\costumes\halloween.dm" -#include "code\datums\outfits\jobs\cargo.dm" -#include "code\datums\outfits\jobs\civilian.dm" -#include "code\datums\outfits\jobs\civilian_vr.dm" -#include "code\datums\outfits\jobs\command.dm" -#include "code\datums\outfits\jobs\command_vr.dm" -#include "code\datums\outfits\jobs\engineering.dm" -#include "code\datums\outfits\jobs\job.dm" -#include "code\datums\outfits\jobs\medical.dm" -#include "code\datums\outfits\jobs\medical_vr.dm" -#include "code\datums\outfits\jobs\misc.dm" -#include "code\datums\outfits\jobs\science.dm" -#include "code\datums\outfits\jobs\science_vr.dm" -#include "code\datums\outfits\jobs\security.dm" -#include "code\datums\outfits\jobs\special_vr.dm" -#include "code\datums\outfits\military\fleet.dm" -#include "code\datums\outfits\military\marines.dm" -#include "code\datums\outfits\military\military.dm" -#include "code\datums\outfits\military\sifguard.dm" -#include "code\datums\repositories\ammomaterial.dm" -#include "code\datums\repositories\cameras.dm" -#include "code\datums\repositories\crew.dm" -#include "code\datums\repositories\decls.dm" -#include "code\datums\repositories\repository.dm" -#include "code\datums\repositories\unique.dm" -#include "code\datums\roundstats\_defines_local.dm" -#include "code\datums\roundstats\departmentgoal.dm" -#include "code\datums\roundstats\roundstats.dm" -#include "code\datums\supplypacks\atmospherics.dm" -#include "code\datums\supplypacks\contraband.dm" -#include "code\datums\supplypacks\contraband_vr.dm" -#include "code\datums\supplypacks\costumes.dm" -#include "code\datums\supplypacks\costumes_vr.dm" -#include "code\datums\supplypacks\engineering.dm" -#include "code\datums\supplypacks\engineering_vr.dm" -#include "code\datums\supplypacks\hospitality.dm" -#include "code\datums\supplypacks\hospitality_vr.dm" -#include "code\datums\supplypacks\hydroponics.dm" -#include "code\datums\supplypacks\hydroponics_vr.dm" -#include "code\datums\supplypacks\materials.dm" -#include "code\datums\supplypacks\medical.dm" -#include "code\datums\supplypacks\medical_vr.dm" -#include "code\datums\supplypacks\misc.dm" -#include "code\datums\supplypacks\misc_vr.dm" -#include "code\datums\supplypacks\munitions.dm" -#include "code\datums\supplypacks\munitions_vr.dm" -#include "code\datums\supplypacks\musical.dm" -#include "code\datums\supplypacks\recreation.dm" -#include "code\datums\supplypacks\recreation_vr.dm" -#include "code\datums\supplypacks\robotics.dm" -#include "code\datums\supplypacks\robotics_vr.dm" -#include "code\datums\supplypacks\science.dm" -#include "code\datums\supplypacks\science_vr.dm" -#include "code\datums\supplypacks\security.dm" -#include "code\datums\supplypacks\security_vr.dm" -#include "code\datums\supplypacks\supply.dm" -#include "code\datums\supplypacks\supply_vr.dm" -#include "code\datums\supplypacks\supplypacks.dm" -#include "code\datums\supplypacks\voidsuits.dm" -#include "code\datums\supplypacks\voidsuits_vr.dm" -#include "code\datums\underwear\bottom.dm" -#include "code\datums\underwear\socks.dm" -#include "code\datums\underwear\top.dm" -#include "code\datums\underwear\undershirts.dm" -#include "code\datums\underwear\underwear.dm" -#include "code\datums\uplink\ammunition.dm" -#include "code\datums\uplink\ammunition_vr.dm" -#include "code\datums\uplink\announcements.dm" -#include "code\datums\uplink\armor.dm" -#include "code\datums\uplink\backup.dm" -#include "code\datums\uplink\badassery.dm" -#include "code\datums\uplink\grenades.dm" -#include "code\datums\uplink\hardsuit_modules.dm" -#include "code\datums\uplink\implants.dm" -#include "code\datums\uplink\medical.dm" -#include "code\datums\uplink\medical_vr.dm" -#include "code\datums\uplink\resources.dm" -#include "code\datums\uplink\stealth_items.dm" -#include "code\datums\uplink\stealthy_weapons.dm" -#include "code\datums\uplink\telecrystals.dm" -#include "code\datums\uplink\tools.dm" -#include "code\datums\uplink\tools_vr.dm" -#include "code\datums\uplink\uplink_categories.dm" -#include "code\datums\uplink\uplink_items.dm" -#include "code\datums\uplink\visible_weapons.dm" -#include "code\datums\uplink\visible_weapons_vr.dm" -#include "code\datums\vending\stored_item.dm" -#include "code\datums\vending\vending.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\grid_checker.dm" -#include "code\datums\wires\jukebox.dm" -#include "code\datums\wires\mines.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\seedstorage.dm" -#include "code\datums\wires\shield_generator.dm" -#include "code\datums\wires\smartfridge.dm" -#include "code\datums\wires\smes.dm" -#include "code\datums\wires\suit_storage_unit.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\datums\wires\wires.dm" -#include "code\defines\gases.dm" -#include "code\defines\obj.dm" -#include "code\defines\obj\weapon.dm" -#include "code\defines\procs\announce.dm" -#include "code\defines\procs\AStar.dm" -#include "code\defines\procs\dbcore.dm" -#include "code\defines\procs\radio.dm" -#include "code\defines\procs\statistics.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\atoms_movable_vr.dm" -#include "code\game\base_turf.dm" -#include "code\game\periodic_news.dm" -#include "code\game\response_team.dm" -#include "code\game\response_team_vr.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\skincmd.dm" -#include "code\game\sound.dm" -#include "code\game\trader_visit.dm" -#include "code\game\trader_visit_vr.dm" -#include "code\game\world.dm" -#include "code\game\antagonist\_antagonist_setup.dm" -#include "code\game\antagonist\antagonist.dm" -#include "code\game\antagonist\antagonist_add.dm" -#include "code\game\antagonist\antagonist_create.dm" -#include "code\game\antagonist\antagonist_equip.dm" -#include "code\game\antagonist\antagonist_factions.dm" -#include "code\game\antagonist\antagonist_helpers.dm" -#include "code\game\antagonist\antagonist_objectives.dm" -#include "code\game\antagonist\antagonist_panel.dm" -#include "code\game\antagonist\antagonist_place.dm" -#include "code\game\antagonist\antagonist_print.dm" -#include "code\game\antagonist\antagonist_update.dm" -#include "code\game\antagonist\alien\borer.dm" -#include "code\game\antagonist\alien\xenomorph.dm" -#include "code\game\antagonist\outsider\commando.dm" -#include "code\game\antagonist\outsider\deathsquad.dm" -#include "code\game\antagonist\outsider\ert.dm" -#include "code\game\antagonist\outsider\ert_vr.dm" -#include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\ninja.dm" -#include "code\game\antagonist\outsider\raider.dm" -#include "code\game\antagonist\outsider\technomancer.dm" -#include "code\game\antagonist\outsider\trader.dm" -#include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\changeling.dm" -#include "code\game\antagonist\station\cultist.dm" -#include "code\game\antagonist\station\highlander.dm" -#include "code\game\antagonist\station\infiltrator.dm" -#include "code\game\antagonist\station\loyalist.dm" -#include "code\game\antagonist\station\renegade.dm" -#include "code\game\antagonist\station\revolutionary.dm" -#include "code\game\antagonist\station\rogue_ai.dm" -#include "code\game\antagonist\station\stowaway.dm" -#include "code\game\antagonist\station\thug.dm" -#include "code\game\antagonist\station\traitor.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\areas_vr.dm" -#include "code\game\area\asteroid_areas.dm" -#include "code\game\area\Away Mission areas.dm" -#include "code\game\area\Space Station 13 areas.dm" -#include "code\game\area\Space Station 13 areas_vr.dm" -#include "code\game\area\ss13_deprecated_areas.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\dna_modifier.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\powers.dm" -#include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\game_mode_latespawn.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\calamity\calamity.dm" -#include "code\game\gamemodes\changeling\absorbed_dna.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\changeling_powers.dm" -#include "code\game\gamemodes\changeling\generic_equip_procs.dm" -#include "code\game\gamemodes\changeling\modularchangling.dm" -#include "code\game\gamemodes\changeling\powers\absorb.dm" -#include "code\game\gamemodes\changeling\powers\armblade.dm" -#include "code\game\gamemodes\changeling\powers\armor.dm" -#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" -#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" -#include "code\game\gamemodes\changeling\powers\blind_sting.dm" -#include "code\game\gamemodes\changeling\powers\boost_range.dm" -#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" -#include "code\game\gamemodes\changeling\powers\darkvision.dm" -#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" -#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" -#include "code\game\gamemodes\changeling\powers\digital_camo.dm" -#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" -#include "code\game\gamemodes\changeling\powers\endoarmor.dm" -#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" -#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" -#include "code\game\gamemodes\changeling\powers\enrage.dm" -#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" -#include "code\game\gamemodes\changeling\powers\escape_restraints.dm" -#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" -#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" -#include "code\game\gamemodes\changeling\powers\fake_death.dm" -#include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" -#include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" -#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" -#include "code\game\gamemodes\changeling\powers\respec.dm" -#include "code\game\gamemodes\changeling\powers\revive.dm" -#include "code\game\gamemodes\changeling\powers\self_respiration.dm" -#include "code\game\gamemodes\changeling\powers\shriek.dm" -#include "code\game\gamemodes\changeling\powers\silence_sting.dm" -#include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" -#include "code\game\gamemodes\cult\construct_spells.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\hell_universe.dm" -#include "code\game\gamemodes\cult\narsie.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\soulstone.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\cult\cultify\mob.dm" -#include "code\game\gamemodes\cult\cultify\obj.dm" -#include "code\game\gamemodes\cult\cultify\turf.dm" -#include "code\game\gamemodes\endgame\endgame.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" -#include "code\game\gamemodes\events\black_hole.dm" -#include "code\game\gamemodes\events\clang.dm" -#include "code\game\gamemodes\events\dust.dm" -#include "code\game\gamemodes\events\power_failure.dm" -#include "code\game\gamemodes\events\wormholes.dm" -#include "code\game\gamemodes\events\holidays\Christmas.dm" -#include "code\game\gamemodes\events\holidays\Holidays.dm" -#include "code\game\gamemodes\events\holidays\Other.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\infiltrator\infiltrator.dm" -#include "code\game\gamemodes\malfunction\malf_hardware.dm" -#include "code\game\gamemodes\malfunction\malf_research.dm" -#include "code\game\gamemodes\malfunction\malf_research_ability.dm" -#include "code\game\gamemodes\malfunction\malfunction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\meteor\meteors_vr.dm" -#include "code\game\gamemodes\mixed\conflux.dm" -#include "code\game\gamemodes\mixed\infestation.dm" -#include "code\game\gamemodes\mixed\intrigue.dm" -#include "code\game\gamemodes\mixed\lizard.dm" -#include "code\game\gamemodes\mixed\mercrenegade.dm" -#include "code\game\gamemodes\mixed\mercwiz.dm" -#include "code\game\gamemodes\mixed\paranoia.dm" -#include "code\game\gamemodes\mixed\traitorling.dm" -#include "code\game\gamemodes\mixed\traitorrenegade.dm" -#include "code\game\gamemodes\mixed\uprising.dm" -#include "code\game\gamemodes\mixed\visitors.dm" -#include "code\game\gamemodes\ninja\ninja.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\nuclear\pinpointer.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\technomancer\catalog.dm" -#include "code\game\gamemodes\technomancer\clothing.dm" -#include "code\game\gamemodes\technomancer\core_obj.dm" -#include "code\game\gamemodes\technomancer\equipment.dm" -#include "code\game\gamemodes\technomancer\instability.dm" -#include "code\game\gamemodes\technomancer\spell_objs.dm" -#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" -#include "code\game\gamemodes\technomancer\technomancer.dm" -#include "code\game\gamemodes\technomancer\assistance\assistance.dm" -#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" -#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" -#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" -#include "code\game\gamemodes\technomancer\devices\hypos.dm" -#include "code\game\gamemodes\technomancer\devices\implants.dm" -#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" -#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" -#include "code\game\gamemodes\technomancer\spells\abjuration.dm" -#include "code\game\gamemodes\technomancer\spells\apportation.dm" -#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" -#include "code\game\gamemodes\technomancer\spells\blink.dm" -#include "code\game\gamemodes\technomancer\spells\chroma.dm" -#include "code\game\gamemodes\technomancer\spells\condensation.dm" -#include "code\game\gamemodes\technomancer\spells\control.dm" -#include "code\game\gamemodes\technomancer\spells\dispel.dm" -#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" -#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" -#include "code\game\gamemodes\technomancer\spells\gambit.dm" -#include "code\game\gamemodes\technomancer\spells\illusion.dm" -#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" -#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" -#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" -#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" -#include "code\game\gamemodes\technomancer\spells\passwall.dm" -#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" -#include "code\game\gamemodes\technomancer\spells\radiance.dm" -#include "code\game\gamemodes\technomancer\spells\reflect.dm" -#include "code\game\gamemodes\technomancer\spells\resurrect.dm" -#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" -#include "code\game\gamemodes\technomancer\spells\shield.dm" -#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" -#include "code\game\gamemodes\technomancer\spells\track.dm" -#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" -#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_all.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\purify.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\lesser_chain_lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon_ward.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\jobs\_access_defs.dm" -#include "code\game\jobs\access.dm" -#include "code\game\jobs\access_datum.dm" -#include "code\game\jobs\access_datum_vr.dm" -#include "code\game\jobs\job_controller.dm" -#include "code\game\jobs\jobs.dm" -#include "code\game\jobs\whitelist.dm" -#include "code\game\jobs\whitelist_vr.dm" -#include "code\game\jobs\job\_alt_title.dm" -#include "code\game\jobs\job\assistant.dm" -#include "code\game\jobs\job\assistant_vr.dm" -#include "code\game\jobs\job\captain.dm" -#include "code\game\jobs\job\captain_vr.dm" -#include "code\game\jobs\job\civilian.dm" -#include "code\game\jobs\job\civilian_chaplain.dm" -#include "code\game\jobs\job\civilian_vr.dm" -#include "code\game\jobs\job\department.dm" -#include "code\game\jobs\job\department_vr.dm" -#include "code\game\jobs\job\engineering.dm" -#include "code\game\jobs\job\engineering_vr.dm" -#include "code\game\jobs\job\exploration_vr.dm" -#include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\job_vr.dm" -#include "code\game\jobs\job\medical.dm" -#include "code\game\jobs\job\medical_vr.dm" -#include "code\game\jobs\job\offduty_vr.dm" -#include "code\game\jobs\job\science.dm" -#include "code\game\jobs\job\science_vr.dm" -#include "code\game\jobs\job\security.dm" -#include "code\game\jobs\job\security_vr.dm" -#include "code\game\jobs\job\silicon.dm" -#include "code\game\jobs\job\silicon_vr.dm" -#include "code\game\jobs\job\special_vr.dm" -#include "code\game\machinery\adv_med.dm" -#include "code\game\machinery\adv_med_vr.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\air_alarm.dm" -#include "code\game\machinery\airconditioner_vr.dm" -#include "code\game\machinery\atmo_control.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\biogenerator.dm" -#include "code\game\machinery\bioprinter.dm" -#include "code\game\machinery\bomb_tester_vr.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\buttons_vr.dm" -#include "code\game\machinery\CableLayer.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\cryo.dm" -#include "code\game\machinery\cryopod.dm" -#include "code\game\machinery\cryopod_vr.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\deployable_vr.dm" -#include "code\game\machinery\door_control.dm" -#include "code\game\machinery\doorbell_vr.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\exonet_node.dm" -#include "code\game\machinery\fire_alarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\floodlight.dm" -#include "code\game\machinery\floor_light.dm" -#include "code\game\machinery\floorlayer.dm" -#include "code\game\machinery\frame.dm" -#include "code\game\machinery\gear_dispenser.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\holoposter.dm" -#include "code\game\machinery\holosign.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\jukebox.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\machinery.dm" -#include "code\game\machinery\machinery_power.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\neonsign.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\nuclear_bomb.dm" -#include "code\game\machinery\OpTable.dm" -#include "code\game\machinery\overview.dm" -#include "code\game\machinery\oxygen_pump.dm" -#include "code\game\machinery\painter_vr.dm" -#include "code\game\machinery\partslathe_vr.dm" -#include "code\game\machinery\pda_multicaster.dm" -#include "code\game\machinery\pointdefense.dm" -#include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\portable_turret_vr.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\requests_console_vr.dm" -#include "code\game\machinery\robot_fabricator.dm" -#include "code\game\machinery\seed_extractor.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\status_display_ai.dm" -#include "code\game\machinery\suit_cycler_datums.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\suit_storage_unit_vr.dm" -#include "code\game\machinery\supply_display.dm" -#include "code\game\machinery\supplybeacon.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebeacon_vr.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transportpod.dm" -#include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\vending_machines_vr.dm" -#include "code\game\machinery\vitals_monitor.dm" -#include "code\game\machinery\wall_frames.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer_vr.dm" -#include "code\game\machinery\atmoalter\canister.dm" -#include "code\game\machinery\atmoalter\clamp.dm" -#include "code\game\machinery\atmoalter\meter.dm" -#include "code\game\machinery\atmoalter\portable_atmospherics.dm" -#include "code\game\machinery\atmoalter\pump.dm" -#include "code\game\machinery\atmoalter\pump_vr.dm" -#include "code\game\machinery\atmoalter\scrubber.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\camera_vr.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\ai_core.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\arcade_vr.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_vr.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\guestpass.dm" -#include "code\game\machinery\computer\id_restorer_vr.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\message.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\prisoner.dm" -#include "code\game\machinery\computer\prisonshuttle.dm" -#include "code\game\machinery\computer\RCON_Console.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\shutoff_monitor.dm" -#include "code\game\machinery\computer\shuttle.dm" -#include "code\game\machinery\computer\skills.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\supply.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer\timeclock_vr.dm" -#include "code\game\machinery\computer\~computer_vr.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_control.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_vr.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\blast_door.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\door_vr.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\firedoor_assembly.dm" -#include "code\game\machinery\doors\firedoor_vr.dm" -#include "code\game\machinery\doors\multi_tile.dm" -#include "code\game\machinery\doors\multi_tile_vr.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" -#include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\docking_program.dm" -#include "code\game\machinery\embedded_controller\docking_program_multi.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\embedded_controller\mapping_helpers.dm" -#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" -#include "code\game\machinery\event\stage_vr.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\pipe\pipe_recipes.dm" -#include "code\game\machinery\pipe\pipelayer.dm" -#include "code\game\machinery\reagents\pump.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\broadcaster_vr.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\presets.dm" -#include "code\game\machinery\telecomms\presets_vr.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" -#include "code\game\machinery\virtual_reality\ar_console.dm" -#include "code\game\machinery\virtual_reality\vr_console.dm" -#include "code\game\magic\Uristrunes.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mech_prosthetics.dm" -#include "code\game\mecha\mech_sensor.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_appearance.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_helpers.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_vr.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\fighter.dm" -#include "code\game\mecha\combat\gorilla.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\components\_component.dm" -#include "code\game\mecha\components\actuators.dm" -#include "code\game\mecha\components\armor.dm" -#include "code\game\mecha\components\electrical.dm" -#include "code\game\mecha\components\hull.dm" -#include "code\game\mecha\components\lifesupport.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm" -#include "code\game\mecha\equipment\tools\armor_melee.dm" -#include "code\game\mecha\equipment\tools\armor_ranged.dm" -#include "code\game\mecha\equipment\tools\cable_layer.dm" -#include "code\game\mecha\equipment\tools\catapult.dm" -#include "code\game\mecha\equipment\tools\clamp.dm" -#include "code\game\mecha\equipment\tools\cloak.dm" -#include "code\game\mecha\equipment\tools\drill.dm" -#include "code\game\mecha\equipment\tools\energy_relay.dm" -#include "code\game\mecha\equipment\tools\extinguisher.dm" -#include "code\game\mecha\equipment\tools\generator.dm" -#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" -#include "code\game\mecha\equipment\tools\inflatables.dm" -#include "code\game\mecha\equipment\tools\jetpack.dm" -#include "code\game\mecha\equipment\tools\medigun_vr.dm" -#include "code\game\mecha\equipment\tools\orescanner.dm" -#include "code\game\mecha\equipment\tools\passenger.dm" -#include "code\game\mecha\equipment\tools\powertool.dm" -#include "code\game\mecha\equipment\tools\rcd.dm" -#include "code\game\mecha\equipment\tools\repair_droid.dm" -#include "code\game\mecha\equipment\tools\running_board.dm" -#include "code\game\mecha\equipment\tools\shield.dm" -#include "code\game\mecha\equipment\tools\shield_omni.dm" -#include "code\game\mecha\equipment\tools\sleeper.dm" -#include "code\game\mecha\equipment\tools\speedboost.dm" -#include "code\game\mecha\equipment\tools\syringe_gun.dm" -#include "code\game\mecha\equipment\tools\teleporter.dm" -#include "code\game\mecha\equipment\tools\tools.dm" -#include "code\game\mecha\equipment\tools\weldinglaser.dm" -#include "code\game\mecha\equipment\tools\wormhole.dm" -#include "code\game\mecha\equipment\weapons\honk.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm" -#include "code\game\mecha\equipment\weapons\ballistic\ballistic.dm" -#include "code\game\mecha\equipment\weapons\ballistic\mortar.dm" -#include "code\game\mecha\equipment\weapons\ballistic\shotgun.dm" -#include "code\game\mecha\equipment\weapons\defense\shocker.dm" -#include "code\game\mecha\equipment\weapons\energy\energy.dm" -#include "code\game\mecha\equipment\weapons\energy\ion.dm" -#include "code\game\mecha\equipment\weapons\energy\laser.dm" -#include "code\game\mecha\equipment\weapons\energy\phased.dm" -#include "code\game\mecha\equipment\weapons\energy\pulse.dm" -#include "code\game\mecha\equipment\weapons\energy\stun.dm" -#include "code\game\mecha\equipment\weapons\explosive\grenade.dm" -#include "code\game\mecha\equipment\weapons\explosive\missile.dm" -#include "code\game\mecha\equipment\weapons\fire\flamethrower.dm" -#include "code\game\mecha\equipment\weapons\fire\incendiary.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\medical\odysseus_vr.dm" -#include "code\game\mecha\micro\mecha_construction_paths_vr.dm" -#include "code\game\mecha\micro\mecha_parts_vr.dm" -#include "code\game\mecha\micro\mecha_vr.dm" -#include "code\game\mecha\micro\mechfab_designs_vr.dm" -#include "code\game\mecha\micro\micro.dm" -#include "code\game\mecha\micro\micro_equipment.dm" -#include "code\game\mecha\micro\security.dm" -#include "code\game\mecha\micro\utility.dm" -#include "code\game\mecha\space\hoverpod.dm" -#include "code\game\mecha\space\shuttle.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\ripley_vr.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\banners.dm" -#include "code\game\objects\banners_vr.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\explosion.dm" -#include "code\game\objects\explosion_recursive.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\mob_spawner_vr.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\stumble_into_vr.dm" -#include "code\game\objects\weapons.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\confetti_vr.dm" -#include "code\game\objects\effects\effect_system.dm" -#include "code\game\objects\effects\explosion_particles.dm" -#include "code\game\objects\effects\gibs.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\item_pickup_ghost.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\landmarks_vr.dm" -#include "code\game\objects\effects\manifest.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\semirandom_mobs_vr.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\spiders_vr.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\zone_divider.dm" -#include "code\game\objects\effects\alien\aliens.dm" -#include "code\game\objects\effects\chem\chemsmoke.dm" -#include "code\game\objects\effects\chem\coating.dm" -#include "code\game\objects\effects\chem\foam.dm" -#include "code\game\objects\effects\chem\foam_vr.dm" -#include "code\game\objects\effects\chem\water.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\warning_stripes.dm" -#include "code\game\objects\effects\decals\Cleanable\aliens.dm" -#include "code\game\objects\effects\decals\Cleanable\fuel.dm" -#include "code\game\objects\effects\decals\Cleanable\humans.dm" -#include "code\game\objects\effects\decals\Cleanable\misc.dm" -#include "code\game\objects\effects\decals\Cleanable\robots.dm" -#include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\posters\bs12.dm" -#include "code\game\objects\effects\decals\posters\polarisposters.dm" -#include "code\game\objects\effects\decals\posters\polarisposters_vr.dm" -#include "code\game\objects\effects\decals\posters\posters.dm" -#include "code\game\objects\effects\decals\posters\tgposters.dm" -#include "code\game\objects\effects\decals\posters\voreposters_vr.dm" -#include "code\game\objects\effects\map_effects\beam_point.dm" -#include "code\game\objects\effects\map_effects\effect_emitter.dm" -#include "code\game\objects\effects\map_effects\map_effects.dm" -#include "code\game\objects\effects\map_effects\perma_light.dm" -#include "code\game\objects\effects\map_effects\portal.dm" -#include "code\game\objects\effects\map_effects\radiation_emitter.dm" -#include "code\game\objects\effects\map_effects\screen_shaker.dm" -#include "code\game\objects\effects\map_effects\sound_emitter.dm" -#include "code\game\objects\effects\prop\columnblast.dm" -#include "code\game\objects\effects\prop\snake.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\graffiti.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "code\game\objects\items\antag_spawners.dm" -#include "code\game\objects\items\apc_frame.dm" -#include "code\game\objects\items\bells.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\contraband_vr.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\falling_object_vr.dm" -#include "code\game\objects\items\glassjar.dm" -#include "code\game\objects\items\gunbox.dm" -#include "code\game\objects\items\gunbox_vr.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\paintkit.dm" -#include "code\game\objects\items\pizza_voucher_vr.dm" -#include "code\game\objects\items\poi_items.dm" -#include "code\game\objects\items\robobag.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\tailoring.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\trash_material.dm" -#include "code\game\objects\items\trash_vr.dm" -#include "code\game\objects\items\uav.dm" -#include "code\game\objects\items\devices\advnifrepair.dm" -#include "code\game\objects\items\devices\ai_detector.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\binoculars.dm" -#include "code\game\objects\items\devices\body_snatcher_vr.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\debugger.dm" -#include "code\game\objects\items\devices\defib.dm" -#include "code\game\objects\items\devices\denecrotizer_vr.dm" -#include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flash_vr.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\flashlight_vr.dm" -#include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\geiger.dm" -#include "code\game\objects\items\devices\gps.dm" -#include "code\game\objects\items\devices\hacktool.dm" -#include "code\game\objects\items\devices\holowarrant.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\modkit.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\scanners_vr.dm" -#include "code\game\objects\items\devices\spy_bug.dm" -#include "code\game\objects\items\devices\suit_cooling.dm" -#include "code\game\objects\items\devices\t_scanner.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\text_to_speech.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\translator.dm" -#include "code\game\objects\items\devices\translocator_vr.dm" -#include "code\game\objects\items\devices\tvcamera.dm" -#include "code\game\objects\items\devices\uplink.dm" -#include "code\game\objects\items\devices\uplink_random_lists.dm" -#include "code\game\objects\items\devices\whistle.dm" -#include "code\game\objects\items\devices\communicator\communicator.dm" -#include "code\game\objects\items\devices\communicator\helper.dm" -#include "code\game\objects\items\devices\communicator\integrated.dm" -#include "code\game\objects\items\devices\communicator\messaging.dm" -#include "code\game\objects\items\devices\communicator\phone.dm" -#include "code\game\objects\items\devices\communicator\UI_tgui.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\headset_vr.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\jammer.dm" -#include "code\game\objects\items\devices\radio\jammer_vr.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\devices\radio\radio_vr.dm" -#include "code\game\objects\items\devices\radio\radiopack.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\robot\robot_upgrades_vr.dm" -#include "code\game\objects\items\stacks\marker_beacons.dm" -#include "code\game\objects\items\stacks\matter_synth.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\medical_vr.dm" -#include "code\game\objects\items\stacks\nanopaste.dm" -#include "code\game\objects\items\stacks\nanopaste_vr.dm" -#include "code\game\objects\items\stacks\sandbags.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\tickets.dm" -#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\toys\balls_vr.dm" -#include "code\game\objects\items\toys\godfigures.dm" -#include "code\game\objects\items\toys\mech_toys.dm" -#include "code\game\objects\items\toys\toys.dm" -#include "code\game\objects\items\toys\toys_vr.dm" -#include "code\game\objects\items\weapons\AI_modules.dm" -#include "code\game\objects\items\weapons\AI_modules_vr.dm" -#include "code\game\objects\items\weapons\augment_items.dm" -#include "code\game\objects\items\weapons\autopsy.dm" -#include "code\game\objects\items\weapons\bones.dm" -#include "code\game\objects\items\weapons\candle.dm" -#include "code\game\objects\items\weapons\canes.dm" -#include "code\game\objects\items\weapons\cards_ids_vr.dm" -#include "code\game\objects\items\weapons\chewables.dm" -#include "code\game\objects\items\weapons\cigs_lighters.dm" -#include "code\game\objects\items\weapons\clown_items.dm" -#include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\dna_injector.dm" -#include "code\game\objects\items\weapons\ecigs.dm" -#include "code\game\objects\items\weapons\explosives.dm" -#include "code\game\objects\items\weapons\explosives_vr.dm" -#include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" -#include "code\game\objects\items\weapons\handcuffs.dm" -#include "code\game\objects\items\weapons\handcuffs_vr.dm" -#include "code\game\objects\items\weapons\improvised_components.dm" -#include "code\game\objects\items\weapons\inducer_vr.dm" -#include "code\game\objects\items\weapons\manuals.dm" -#include "code\game\objects\items\weapons\manuals_vr.dm" -#include "code\game\objects\items\weapons\mop.dm" -#include "code\game\objects\items\weapons\mop_deploy.dm" -#include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\paiwire.dm" -#include "code\game\objects\items\weapons\policetape.dm" -#include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RCD_vr.dm" -#include "code\game\objects\items\weapons\RMS_vr.dm" -#include "code\game\objects\items\weapons\RPD_vr.dm" -#include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shields.dm" -#include "code\game\objects\items\weapons\shields_vr.dm" -#include "code\game\objects\items\weapons\stunbaton.dm" -#include "code\game\objects\items\weapons\surgery_tools.dm" -#include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\syndie.dm" -#include "code\game\objects\items\weapons\tape.dm" -#include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\towels.dm" -#include "code\game\objects\items\weapons\traps.dm" -#include "code\game\objects\items\weapons\traps_vr.dm" -#include "code\game\objects\items\weapons\trays.dm" -#include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\weldbackpack.dm" -#include "code\game\objects\items\weapons\circuitboards\broken.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" -#include "code\game\objects\items\weapons\circuitboards\frame.dm" -#include "code\game\objects\items\weapons\circuitboards\mecha.dm" -#include "code\game\objects\items\weapons\circuitboards\other.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\fluidpump.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" -#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" -#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" -#include "code\game\objects\items\weapons\grenades\concussion.dm" -#include "code\game\objects\items\weapons\grenades\emgrenade.dm" -#include "code\game\objects\items\weapons\grenades\explosive.dm" -#include "code\game\objects\items\weapons\grenades\flashbang.dm" -#include "code\game\objects\items\weapons\grenades\grenade.dm" -#include "code\game\objects\items\weapons\grenades\projectile.dm" -#include "code\game\objects\items\weapons\grenades\smokebomb.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade_vr.dm" -#include "code\game\objects\items\weapons\grenades\supermatter.dm" -#include "code\game\objects\items\weapons\id cards\cards.dm" -#include "code\game\objects\items\weapons\id cards\cards_vr.dm" -#include "code\game\objects\items\weapons\id cards\id_stacks.dm" -#include "code\game\objects\items\weapons\id cards\id_stacks_vr.dm" -#include "code\game\objects\items\weapons\id cards\station_ids.dm" -#include "code\game\objects\items\weapons\id cards\station_ids_vr.dm" -#include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implant_vr.dm" -#include "code\game\objects\items\weapons\implants\implantaugment.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantcase_vr.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implantcircuits.dm" -#include "code\game\objects\items\weapons\implants\implantdud.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implanter_vr.dm" -#include "code\game\objects\items\weapons\implants\implantfreedom.dm" -#include "code\game\objects\items\weapons\implants\implantlanguage.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" -#include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" -#include "code\game\objects\items\weapons\implants\implantuplink.dm" -#include "code\game\objects\items\weapons\implants\neuralbasic.dm" -#include "code\game\objects\items\weapons\material\ashtray.dm" -#include "code\game\objects\items\weapons\material\bats.dm" -#include "code\game\objects\items\weapons\material\chainsaw.dm" -#include "code\game\objects\items\weapons\material\foam.dm" -#include "code\game\objects\items\weapons\material\gravemarker.dm" -#include "code\game\objects\items\weapons\material\kitchen.dm" -#include "code\game\objects\items\weapons\material\knives.dm" -#include "code\game\objects\items\weapons\material\knives_vr.dm" -#include "code\game\objects\items\weapons\material\material_armor.dm" -#include "code\game\objects\items\weapons\material\material_weapons.dm" -#include "code\game\objects\items\weapons\material\misc.dm" -#include "code\game\objects\items\weapons\material\shards.dm" -#include "code\game\objects\items\weapons\material\shards_vr.dm" -#include "code\game\objects\items\weapons\material\swords.dm" -#include "code\game\objects\items\weapons\material\thrown.dm" -#include "code\game\objects\items\weapons\material\twohanded.dm" -#include "code\game\objects\items\weapons\material\twohanded_vr.dm" -#include "code\game\objects\items\weapons\material\whetstone.dm" -#include "code\game\objects\items\weapons\melee\deflect.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\energy_vr.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" -#include "code\game\objects\items\weapons\melee\misc_vr.dm" -#include "code\game\objects\items\weapons\storage\backpack.dm" -#include "code\game\objects\items\weapons\storage\backpack_vr.dm" -#include "code\game\objects\items\weapons\storage\bags.dm" -#include "code\game\objects\items\weapons\storage\bags_vr.dm" -#include "code\game\objects\items\weapons\storage\belt.dm" -#include "code\game\objects\items\weapons\storage\belt_vr.dm" -#include "code\game\objects\items\weapons\storage\bible.dm" -#include "code\game\objects\items\weapons\storage\boxes.dm" -#include "code\game\objects\items\weapons\storage\boxes_vr.dm" -#include "code\game\objects\items\weapons\storage\briefcase.dm" -#include "code\game\objects\items\weapons\storage\egg_vr.dm" -#include "code\game\objects\items\weapons\storage\fancy.dm" -#include "code\game\objects\items\weapons\storage\firstaid.dm" -#include "code\game\objects\items\weapons\storage\firstaid_vr.dm" -#include "code\game\objects\items\weapons\storage\internal.dm" -#include "code\game\objects\items\weapons\storage\laundry_basket.dm" -#include "code\game\objects\items\weapons\storage\lockbox.dm" -#include "code\game\objects\items\weapons\storage\misc.dm" -#include "code\game\objects\items\weapons\storage\mre.dm" -#include "code\game\objects\items\weapons\storage\pouches.dm" -#include "code\game\objects\items\weapons\storage\quickdraw.dm" -#include "code\game\objects\items\weapons\storage\secure.dm" -#include "code\game\objects\items\weapons\storage\storage.dm" -#include "code\game\objects\items\weapons\storage\toolbox.dm" -#include "code\game\objects\items\weapons\storage\toolbox_vr.dm" -#include "code\game\objects\items\weapons\storage\uplink_kits.dm" -#include "code\game\objects\items\weapons\storage\wallets.dm" -#include "code\game\objects\items\weapons\tanks\jetpack.dm" -#include "code\game\objects\items\weapons\tanks\tank_types.dm" -#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" -#include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\items\weapons\tools\crowbar.dm" -#include "code\game\objects\items\weapons\tools\crowbar_vr.dm" -#include "code\game\objects\items\weapons\tools\screwdriver.dm" -#include "code\game\objects\items\weapons\tools\weldingtool.dm" -#include "code\game\objects\items\weapons\tools\wirecutters.dm" -#include "code\game\objects\items\weapons\tools\wrench.dm" -#include "code\game\objects\random\_random.dm" -#include "code\game\objects\random\guns_and_ammo.dm" -#include "code\game\objects\random\maintenance.dm" -#include "code\game\objects\random\mapping.dm" -#include "code\game\objects\random\mapping_vr.dm" -#include "code\game\objects\random\mechs.dm" -#include "code\game\objects\random\misc.dm" -#include "code\game\objects\random\misc_vr.dm" -#include "code\game\objects\random\mob.dm" -#include "code\game\objects\random\mob_vr.dm" -#include "code\game\objects\random\spacesuits.dm" -#include "code\game\objects\random\unidentified\medicine.dm" -#include "code\game\objects\structures\artstuff.dm" -#include "code\game\objects\structures\barricades.dm" -#include "code\game\objects\structures\barsign.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\bedsheet_bin_vr.dm" -#include "code\game\objects\structures\bonfire.dm" -#include "code\game\objects\structures\catwalk.dm" -#include "code\game\objects\structures\cliff.dm" -#include "code\game\objects\structures\coathanger.dm" -#include "code\game\objects\structures\curtains.dm" -#include "code\game\objects\structures\dancepole_vr.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\dogbed.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\fence.dm" -#include "code\game\objects\structures\fireaxe.dm" -#include "code\game\objects\structures\fitness.dm" -#include "code\game\objects\structures\fitness_vr.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\gravemarker.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\handrail.dm" -#include "code\game\objects\structures\holoplant.dm" -#include "code\game\objects\structures\inflatable.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_foodcart_vr.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\ledges.dm" -#include "code\game\objects\structures\lightpost.dm" -#include "code\game\objects\structures\loot_piles.dm" -#include "code\game\objects\structures\map_blocker_vr.dm" -#include "code\game\objects\structures\medical_stand_vr.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\morgue_vr.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\railing.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\salvageable.dm" -#include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\signs_vr.dm" -#include "code\game\objects\structures\simple_doors.dm" -#include "code\game\objects\structures\simple_doors_vr.dm" -#include "code\game\objects\structures\snowman.dm" -#include "code\game\objects\structures\stasis_cage.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\transit_tubes.dm" -#include "code\game\objects\structures\trash_pile_vr.dm" -#include "code\game\objects\structures\under_wardrobe.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\watercloset_vr.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\window_spawner.dm" -#include "code\game\objects\structures\window_vr.dm" -#include "code\game\objects\structures\crates_lockers\__closets.dm" -#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" -#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\crates_vr.dm" -#include "code\game\objects\structures\crates_lockers\largecrate.dm" -#include "code\game\objects\structures\crates_lockers\largecrate_vr.dm" -#include "code\game\objects\structures\crates_lockers\vehiclecage.dm" -#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" -#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\egg_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" -#include "code\game\objects\structures\crates_lockers\closets\misc_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\statue.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" -#include "code\game\objects\structures\flora\flora.dm" -#include "code\game\objects\structures\flora\flora_vr.dm" -#include "code\game\objects\structures\flora\grass.dm" -#include "code\game\objects\structures\flora\moretrees_vr.dm" -#include "code\game\objects\structures\flora\trees.dm" -#include "code\game\objects\structures\ghost_pods\event_vr.dm" -#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" -#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" -#include "code\game\objects\structures\ghost_pods\human.dm" -#include "code\game\objects\structures\ghost_pods\mysterious.dm" -#include "code\game\objects\structures\ghost_pods\silicon.dm" -#include "code\game\objects\structures\ghost_pods\silicon_vr.dm" -#include "code\game\objects\structures\props\alien_props.dm" -#include "code\game\objects\structures\props\alien_props_vr.dm" -#include "code\game\objects\structures\props\beam_prism.dm" -#include "code\game\objects\structures\props\blackbox.dm" -#include "code\game\objects\structures\props\fake_ai.dm" -#include "code\game\objects\structures\props\nest.dm" -#include "code\game\objects\structures\props\projectile_lock.dm" -#include "code\game\objects\structures\props\prop.dm" -#include "code\game\objects\structures\props\puzzledoor.dm" -#include "code\game\objects\structures\props\rocks.dm" -#include "code\game\objects\structures\props\swarm.dm" -#include "code\game\objects\structures\props\transmitter.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs_vr.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" -#include "code\game\turfs\simulated.dm" -#include "code\game\turfs\simulated_vr.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\turf_changing.dm" -#include "code\game\turfs\turf_flick_animations.dm" -#include "code\game\turfs\unsimulated.dm" -#include "code\game\turfs\flooring\flooring.dm" -#include "code\game\turfs\flooring\flooring_decals.dm" -#include "code\game\turfs\flooring\flooring_decals_vr.dm" -#include "code\game\turfs\flooring\flooring_premade.dm" -#include "code\game\turfs\flooring\flooring_vr.dm" -#include "code\game\turfs\flooring\shuttle_vr.dm" -#include "code\game\turfs\initialization\init.dm" -#include "code\game\turfs\initialization\maintenance.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\floor_acts.dm" -#include "code\game\turfs\simulated\floor_attackby.dm" -#include "code\game\turfs\simulated\floor_damage.dm" -#include "code\game\turfs\simulated\floor_icon.dm" -#include "code\game\turfs\simulated\floor_static.dm" -#include "code\game\turfs\simulated\floor_types.dm" -#include "code\game\turfs\simulated\floor_types_eris.dm" -#include "code\game\turfs\simulated\floor_types_vr.dm" -#include "code\game\turfs\simulated\lava.dm" -#include "code\game\turfs\simulated\wall_attacks.dm" -#include "code\game\turfs\simulated\wall_icon.dm" -#include "code\game\turfs\simulated\wall_types.dm" -#include "code\game\turfs\simulated\wall_types_vr.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\water.dm" -#include "code\game\turfs\simulated\water_vr.dm" -#include "code\game\turfs\simulated\dungeon\floor.dm" -#include "code\game\turfs\simulated\dungeon\wall.dm" -#include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" -#include "code\game\turfs\simulated\outdoors\dirt.dm" -#include "code\game\turfs\simulated\outdoors\grass.dm" -#include "code\game\turfs\simulated\outdoors\ironsand_vr.dm" -#include "code\game\turfs\simulated\outdoors\outdoors.dm" -#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" -#include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" -#include "code\game\turfs\simulated\outdoors\sky.dm" -#include "code\game\turfs\simulated\outdoors\snow.dm" -#include "code\game\turfs\snow\snow.dm" -#include "code\game\turfs\space\cracked_asteroid.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\game\turfs\unsimulated\beach.dm" -#include "code\game\turfs\unsimulated\beach_vr.dm" -#include "code\game\turfs\unsimulated\floor.dm" -#include "code\game\turfs\unsimulated\planetary.dm" -#include "code\game\turfs\unsimulated\planetary_vr.dm" -#include "code\game\turfs\unsimulated\shuttle.dm" -#include "code\game\turfs\unsimulated\sky_vr.dm" -#include "code\game\turfs\unsimulated\walls.dm" -#include "code\js\byjax.dm" -#include "code\js\menus.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_attack_log.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_secrets.dm" -#include "code\modules\admin\admin_tools.dm" -#include "code\modules\admin\admin_verb_lists_vr.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\admin_vr.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\ckey_vr.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\map_capture.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\news.dm" -#include "code\modules\admin\persistence.dm" -#include "code\modules\admin\player_notes.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" -#include "code\modules\admin\callproc\callproc.dm" -#include "code\modules\admin\DB ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" -#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" -#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" -#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" -#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" -#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" -#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" -#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" -#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" -#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" -#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" -#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" -#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" -#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" -#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" -#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\only_one.dm" -#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" -#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm" -#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" -#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" -#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" -#include "code\modules\admin\secrets\random_events\gravity_vr.dm" -#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" -#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminhelp_vr.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\antag-ooc.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\buildmode.dm" -#include "code\modules\admin\verbs\change_appearance.dm" -#include "code\modules\admin\verbs\check_customitem_activity.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\custom_event.dm" -#include "code\modules\admin\verbs\dbcon_fix.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\debug_vr.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\fps.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\grief_fixers.dm" -#include "code\modules\admin\verbs\lightning_strike.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\panicbunker.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\randomverbs_vr.dm" -#include "code\modules\admin\verbs\resize.dm" -#include "code\modules\admin\verbs\smite.dm" -#include "code\modules\admin\verbs\smite_vr.dm" -#include "code\modules\admin\verbs\striketeam.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" -#include "code\modules\admin\view_variables\admin_delete.dm" -#include "code\modules\admin\view_variables\debug_variables.dm" -#include "code\modules\admin\view_variables\get_variables.dm" -#include "code\modules\admin\view_variables\helpers.dm" -#include "code\modules\admin\view_variables\mass_edit_variables.dm" -#include "code\modules\admin\view_variables\modify_variables.dm" -#include "code\modules\admin\view_variables\topic.dm" -#include "code\modules\admin\view_variables\topic_list.dm" -#include "code\modules\admin\view_variables\view_variables.dm" -#include "code\modules\admin\view_variables\view_variables_global.dm" -#include "code\modules\ai\_defines.dm" -#include "code\modules\ai\ai_holder.dm" -#include "code\modules\ai\ai_holder_combat.dm" -#include "code\modules\ai\ai_holder_combat_unseen.dm" -#include "code\modules\ai\ai_holder_communication.dm" -#include "code\modules\ai\ai_holder_cooperation.dm" -#include "code\modules\ai\ai_holder_debug.dm" -#include "code\modules\ai\ai_holder_disabled.dm" -#include "code\modules\ai\ai_holder_fleeing.dm" -#include "code\modules\ai\ai_holder_follow.dm" -#include "code\modules\ai\ai_holder_movement.dm" -#include "code\modules\ai\ai_holder_pathfinding.dm" -#include "code\modules\ai\ai_holder_targeting.dm" -#include "code\modules\ai\ai_holder_targeting_vr.dm" -#include "code\modules\ai\interfaces.dm" -#include "code\modules\ai\say_list.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" -#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" -#include "code\modules\alarm\alarm.dm" -#include "code\modules\alarm\alarm_handler.dm" -#include "code\modules\alarm\atmosphere_alarm.dm" -#include "code\modules\alarm\camera_alarm.dm" -#include "code\modules\alarm\fire_alarm.dm" -#include "code\modules\alarm\motion_alarm.dm" -#include "code\modules\alarm\power_alarm.dm" -#include "code\modules\artifice\cursedform.dm" -#include "code\modules\artifice\deadringer.dm" -#include "code\modules\artifice\telecube.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\asset_cache\asset_cache.dm" -#include "code\modules\asset_cache\asset_cache_client.dm" -#include "code\modules\asset_cache\asset_cache_item.dm" -#include "code\modules\asset_cache\asset_list.dm" -#include "code\modules\asset_cache\asset_list_items.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\gateway_vr.dm" -#include "code\modules\awaymissions\loot.dm" -#include "code\modules\awaymissions\loot_vr.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\trigger.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\blob\blob.dm" -#include "code\modules\blob2\_defines.dm" -#include "code\modules\blob2\core_chunk.dm" -#include "code\modules\blob2\blobs\base_blob.dm" -#include "code\modules\blob2\blobs\core.dm" -#include "code\modules\blob2\blobs\factory.dm" -#include "code\modules\blob2\blobs\node.dm" -#include "code\modules\blob2\blobs\normal.dm" -#include "code\modules\blob2\blobs\resource.dm" -#include "code\modules\blob2\blobs\shield.dm" -#include "code\modules\blob2\overmind\overmind.dm" -#include "code\modules\blob2\overmind\powers.dm" -#include "code\modules\blob2\overmind\types.dm" -#include "code\modules\blob2\overmind\types\blazing_oil.dm" -#include "code\modules\blob2\overmind\types\classic.dm" -#include "code\modules\blob2\overmind\types\cryogenic_goo.dm" -#include "code\modules\blob2\overmind\types\ectoplasmic_horror.dm" -#include "code\modules\blob2\overmind\types\electromagnetic_web.dm" -#include "code\modules\blob2\overmind\types\energized_jelly.dm" -#include "code\modules\blob2\overmind\types\explosive_lattice.dm" -#include "code\modules\blob2\overmind\types\fabrication_swarm.dm" -#include "code\modules\blob2\overmind\types\fulminant_organism.dm" -#include "code\modules\blob2\overmind\types\fungal_bloom.dm" -#include "code\modules\blob2\overmind\types\grey_goo.dm" -#include "code\modules\blob2\overmind\types\pressurized_slime.dm" -#include "code\modules\blob2\overmind\types\radioactive_ooze.dm" -#include "code\modules\blob2\overmind\types\ravenous_macrophage.dm" -#include "code\modules\blob2\overmind\types\reactive_spines.dm" -#include "code\modules\blob2\overmind\types\roiling_mold.dm" -#include "code\modules\blob2\overmind\types\shifting_fragments.dm" -#include "code\modules\blob2\overmind\types\synchronous_mesh.dm" -#include "code\modules\blob2\overmind\types\volatile_alluvium.dm" -#include "code\modules\busy_space_vr\air_traffic.dm" -#include "code\modules\busy_space_vr\loremaster.dm" -#include "code\modules\busy_space_vr\organizations.dm" -#include "code\modules\catalogue\atoms.dm" -#include "code\modules\catalogue\catalogue_data.dm" -#include "code\modules\catalogue\catalogue_data_vr.dm" -#include "code\modules\catalogue\cataloguer.dm" -#include "code\modules\catalogue\cataloguer_visuals.dm" -#include "code\modules\catalogue\cataloguer_vr.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" -#include "code\modules\client\client procs_vr.dm" -#include "code\modules\client\movement.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_factions.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_toggle_procs.dm" -#include "code\modules\client\preferences_vr.dm" -#include "code\modules\client\spam_prevention.dm" -#include "code\modules\client\ui_style.dm" -#include "code\modules\client\preference_setup\_defines.dm" -#include "code\modules\client\preference_setup\preference_setup.dm" -#include "code\modules\client\preference_setup\preference_setup_vr.dm" -#include "code\modules\client\preference_setup\antagonism\01_basic.dm" -#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" -#include "code\modules\client\preference_setup\general\01_basic.dm" -#include "code\modules\client\preference_setup\general\02_language.dm" -#include "code\modules\client\preference_setup\general\03_body.dm" -#include "code\modules\client\preference_setup\general\04_equipment.dm" -#include "code\modules\client\preference_setup\general\05_background.dm" -#include "code\modules\client\preference_setup\general\06_flavor.dm" -#include "code\modules\client\preference_setup\global\01_ui.dm" -#include "code\modules\client\preference_setup\global\02_settings.dm" -#include "code\modules\client\preference_setup\global\03_pai.dm" -#include "code\modules\client\preference_setup\global\04_ooc.dm" -#include "code\modules\client\preference_setup\global\setting_datums.dm" -#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" -#include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout.dm" -#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" -#include "code\modules\client\preference_setup\loadout\loadout_accessories_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cosmetics_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" -#include "code\modules\client\preference_setup\loadout\loadout_ears.dm" -#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" -#include "code\modules\client\preference_setup\loadout\loadout_eyes_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_general.dm" -#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" -#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_head.dm" -#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_mask.dm" -#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" -#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" -#include "code\modules\client\preference_setup\loadout\loadout_suit.dm" -#include "code\modules\client\preference_setup\loadout\loadout_suit_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" -#include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_utility.dm" -#include "code\modules\client\preference_setup\loadout\loadout_utility_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" -#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" -#include "code\modules\client\preference_setup\occupation\occupation.dm" -#include "code\modules\client\preference_setup\skills\skills.dm" -#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" -#include "code\modules\client\preference_setup\volume_sliders\02_media.dm" -#include "code\modules\client\preference_setup\vore\01_ears.dm" -#include "code\modules\client\preference_setup\vore\02_size.dm" -#include "code\modules\client\preference_setup\vore\03_egg.dm" -#include "code\modules\client\preference_setup\vore\04_resleeving.dm" -#include "code\modules\client\preference_setup\vore\05_persistence.dm" -#include "code\modules\client\preference_setup\vore\06_vantag.dm" -#include "code\modules\client\preference_setup\vore\07_traits.dm" -#include "code\modules\client\preference_setup\vore\08_nif.dm" -#include "code\modules\client\preference_setup\vore\09_misc.dm" -#include "code\modules\client\verbs\advanced_who.dm" -#include "code\modules\client\verbs\character_directory.dm" -#include "code\modules\client\verbs\ignore.dm" -#include "code\modules\client\verbs\ooc.dm" -#include "code\modules\client\verbs\ping.dm" -#include "code\modules\client\verbs\suicide.dm" -#include "code\modules\client\verbs\who.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\clothing_accessories.dm" -#include "code\modules\clothing\clothing_icons.dm" -#include "code\modules\clothing\clothing_vr.dm" -#include "code\modules\clothing\ears\earrings.dm" -#include "code\modules\clothing\ears\ears.dm" -#include "code\modules\clothing\glasses\glasses.dm" -#include "code\modules\clothing\glasses\glasses_vr.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\glasses\hud_vr.dm" -#include "code\modules\clothing\gloves\antagonist.dm" -#include "code\modules\clothing\gloves\arm_guards.dm" -#include "code\modules\clothing\gloves\arm_guards_vr.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\gauntlets.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\miscellaneous_vr.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\flowercrowns.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\helmet_vr.dm" -#include "code\modules\clothing\head\hood.dm" -#include "code\modules\clothing\head\hood_vr.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\jobs_vr.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\misc_vr.dm" -#include "code\modules\clothing\head\pilot_helmet.dm" -#include "code\modules\clothing\head\pilot_helmet_vr.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\head\solgov.dm" -#include "code\modules\clothing\head\solgov_vr.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\breath_vr.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\gasmask_vr.dm" -#include "code\modules\clothing\masks\hailer.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\shiny_vr.dm" -#include "code\modules\clothing\masks\voice.dm" -#include "code\modules\clothing\rings\material.dm" -#include "code\modules\clothing\rings\rings.dm" -#include "code\modules\clothing\rings\rings_vr.dm" -#include "code\modules\clothing\shoes\boots.dm" -#include "code\modules\clothing\shoes\boots_vr.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\leg_guards.dm" -#include "code\modules\clothing\shoes\leg_guards_vr.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\shoes\miscellaneous_vr.dm" -#include "code\modules\clothing\spacesuits\alien.dm" -#include "code\modules\clothing\spacesuits\breaches.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\spacesuits.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\rig\rig.dm" -#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" -#include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" -#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" -#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" -#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" -#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" -#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm" -#include "code\modules\clothing\spacesuits\rig\suits\light.dm" -#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" -#include "code\modules\clothing\spacesuits\void\ert_vr.dm" -#include "code\modules\clothing\spacesuits\void\event.dm" -#include "code\modules\clothing\spacesuits\void\event_vr.dm" -#include "code\modules\clothing\spacesuits\void\merc.dm" -#include "code\modules\clothing\spacesuits\void\military_vr.dm" -#include "code\modules\clothing\spacesuits\void\station.dm" -#include "code\modules\clothing\spacesuits\void\station_vr.dm" -#include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\void_vr.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" -#include "code\modules\clothing\spacesuits\void\zaddat.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\armor_vr.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\bio_vr.dm" -#include "code\modules\clothing\suits\hooded.dm" -#include "code\modules\clothing\suits\hooded_vr.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\jobs_vr.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\labcoat_vr.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\miscellaneous_vr.dm" -#include "code\modules\clothing\suits\solgov.dm" -#include "code\modules\clothing\suits\solgov_vr.dm" -#include "code\modules\clothing\suits\storage.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\utility_vr.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\suits\aliens\tajara.dm" -#include "code\modules\clothing\suits\aliens\teshari.dm" -#include "code\modules\clothing\suits\aliens\unathi.dm" -#include "code\modules\clothing\suits\aliens\vox.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\imperial_vr.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\miscellaneous_vr.dm" -#include "code\modules\clothing\under\nanotrasen_vr.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shiny_vr.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\solgov.dm" -#include "code\modules\clothing\under\solgov_vr.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\accessory_vr.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\armor.dm" -#include "code\modules\clothing\under\accessories\badges.dm" -#include "code\modules\clothing\under\accessories\clothing.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\holster_vr.dm" -#include "code\modules\clothing\under\accessories\lockets.dm" -#include "code\modules\clothing\under\accessories\permits.dm" -#include "code\modules\clothing\under\accessories\permits_vr.dm" -#include "code\modules\clothing\under\accessories\shiny_vr.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\accessories\storage_vr.dm" -#include "code\modules\clothing\under\accessories\torch.dm" -#include "code\modules\clothing\under\accessories\torch_vr.dm" -#include "code\modules\clothing\under\accessories\temperature\poncho.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\clothing\under\xenos\teshari.dm" -#include "code\modules\clothing\under\xenos\vox.dm" -#include "code\modules\compass\_compass.dm" -#include "code\modules\compass\compass_holder.dm" -#include "code\modules\compass\compass_waypoint.dm" -#include "code\modules\compass\~compass.dm" -#include "code\modules\customitems\item_spawning.dm" -#include "code\modules\detectivework\footprints.dm" -#include "code\modules\detectivework\forensics.dm" -#include "code\modules\detectivework\microscope\dnascanner.dm" -#include "code\modules\detectivework\microscope\microscope.dm" -#include "code\modules\detectivework\tools\crimekit.dm" -#include "code\modules\detectivework\tools\evidencebag.dm" -#include "code\modules\detectivework\tools\luminol.dm" -#include "code\modules\detectivework\tools\rag.dm" -#include "code\modules\detectivework\tools\sample_kits.dm" -#include "code\modules\detectivework\tools\scanner.dm" -#include "code\modules\detectivework\tools\storage.dm" -#include "code\modules\detectivework\tools\swabs.dm" -#include "code\modules\detectivework\tools\uvlight.dm" -#include "code\modules\economy\Accounts.dm" -#include "code\modules\economy\Accounts_DB.dm" -#include "code\modules\economy\ATM.dm" -#include "code\modules\economy\cash.dm" -#include "code\modules\economy\cash_register.dm" -#include "code\modules\economy\coins.dm" -#include "code\modules\economy\coins_vr.dm" -#include "code\modules\economy\economy_misc.dm" -#include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\Events.dm" -#include "code\modules\economy\Events_Mundane.dm" -#include "code\modules\economy\lorenews.dm" -#include "code\modules\economy\mint.dm" -#include "code\modules\economy\money_bag.dm" -#include "code\modules\economy\price_list.dm" -#include "code\modules\economy\retail_scanner.dm" -#include "code\modules\economy\TradeDestinations.dm" -#include "code\modules\economy\vending.dm" -#include "code\modules\economy\vending_machines.dm" -#include "code\modules\emotes\emote_define.dm" -#include "code\modules\emotes\emote_mob.dm" -#include "code\modules\emotes\definitions\_mob.dm" -#include "code\modules\emotes\definitions\_species.dm" -#include "code\modules\emotes\definitions\audible.dm" -#include "code\modules\emotes\definitions\audible_cough.dm" -#include "code\modules\emotes\definitions\audible_furry_vr.dm" -#include "code\modules\emotes\definitions\audible_scream.dm" -#include "code\modules\emotes\definitions\audible_scream_vr.dm" -#include "code\modules\emotes\definitions\audible_slap.dm" -#include "code\modules\emotes\definitions\audible_snap.dm" -#include "code\modules\emotes\definitions\audible_sneeze.dm" -#include "code\modules\emotes\definitions\audible_whistle.dm" -#include "code\modules\emotes\definitions\exertion.dm" -#include "code\modules\emotes\definitions\helpers_vr.dm" -#include "code\modules\emotes\definitions\human.dm" -#include "code\modules\emotes\definitions\slimes.dm" -#include "code\modules\emotes\definitions\synthetics.dm" -#include "code\modules\emotes\definitions\visible.dm" -#include "code\modules\emotes\definitions\visible_animated.dm" -#include "code\modules\emotes\definitions\visible_vomit.dm" -#include "code\modules\emotes\definitions\visible_vr.dm" -#include "code\modules\entopics_vr\alternate_appearance.dm" -#include "code\modules\entopics_vr\entopics.dm" -#include "code\modules\error_handler\_defines.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\error_handler\~defines.dm" -#include "code\modules\events\apc_damage.dm" -#include "code\modules\events\atmos_leak.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\camera_damage.dm" -#include "code\modules\events\canister_leak.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\comms_blackout.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\drone_pod_vr.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\event.dm" -#include "code\modules\events\event_container.dm" -#include "code\modules\events\event_container_vr.dm" -#include "code\modules\events\event_dynamic.dm" -#include "code\modules\events\event_manager.dm" -#include "code\modules\events\gravity_vr.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\grubinfestation_vr.dm" -#include "code\modules\events\ian_storm_vr.dm" -#include "code\modules\events\infestation.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\maintenance_predator_vr.dm" -#include "code\modules\events\meteor_strike_vr.dm" -#include "code\modules\events\meteors.dm" -#include "code\modules\events\money_hacker.dm" -#include "code\modules\events\money_lotto.dm" -#include "code\modules\events\money_spam.dm" -#include "code\modules\events\morph_spawn_vr.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\random_antagonist.dm" -#include "code\modules\events\rogue_drones.dm" -#include "code\modules\events\shipping_error.dm" -#include "code\modules\events\solar_storm.dm" -#include "code\modules\events\space_ninja.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\spontaneous_appendicitis_vr.dm" -#include "code\modules\events\supply_demand_vr.dm" -#include "code\modules\events\wallrot.dm" -#include "code\modules\examine\examine.dm" -#include "code\modules\examine\stat_icons.dm" -#include "code\modules\examine\descriptions\armor.dm" -#include "code\modules\examine\descriptions\atmospherics.dm" -#include "code\modules\examine\descriptions\containers.dm" -#include "code\modules\examine\descriptions\devices.dm" -#include "code\modules\examine\descriptions\engineering.dm" -#include "code\modules\examine\descriptions\machines.dm" -#include "code\modules\examine\descriptions\medical.dm" -#include "code\modules\examine\descriptions\mobs.dm" -#include "code\modules\examine\descriptions\paperwork.dm" -#include "code\modules\examine\descriptions\stacks.dm" -#include "code\modules\examine\descriptions\structures.dm" -#include "code\modules\examine\descriptions\telecomms.dm" -#include "code\modules\examine\descriptions\turfs.dm" -#include "code\modules\examine\descriptions\weapons.dm" -#include "code\modules\ext_scripts\irc.dm" -#include "code\modules\ext_scripts\python.dm" -#include "code\modules\fishing\fishing.dm" -#include "code\modules\fishing\fishing_net.dm" -#include "code\modules\fishing\fishing_rod.dm" -#include "code\modules\fishing\fishing_rod_vr.dm" -#include "code\modules\fishing\fishing_vr.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\look_up.dm" -#include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food\food.dm" -#include "code\modules\food\recipe.dm" -#include "code\modules\food\recipe_dump.dm" -#include "code\modules\food\recipes_fryer.dm" -#include "code\modules\food\recipes_fryer_vr.dm" -#include "code\modules\food\recipes_grill.dm" -#include "code\modules\food\recipes_microwave.dm" -#include "code\modules\food\recipes_microwave_vr.dm" -#include "code\modules\food\recipes_oven.dm" -#include "code\modules\food\recipes_oven_vr.dm" -#include "code\modules\food\drinkingglass\drinkingglass.dm" -#include "code\modules\food\drinkingglass\extras.dm" -#include "code\modules\food\drinkingglass\glass_boxes.dm" -#include "code\modules\food\drinkingglass\glass_types.dm" -#include "code\modules\food\drinkingglass\metaglass.dm" -#include "code\modules\food\drinkingglass\metaglass_vr.dm" -#include "code\modules\food\drinkingglass\serving_glasses.dm" -#include "code\modules\food\drinkingglass\shaker.dm" -#include "code\modules\food\drinkingglass\shaker_vr.dm" -#include "code\modules\food\food\cans.dm" -#include "code\modules\food\food\cans_vr.dm" -#include "code\modules\food\food\condiment.dm" -#include "code\modules\food\food\drinks.dm" -#include "code\modules\food\food\drinks_vr.dm" -#include "code\modules\food\food\lunch.dm" -#include "code\modules\food\food\sandwich.dm" -#include "code\modules\food\food\snacks.dm" -#include "code\modules\food\food\snacks_vr.dm" -#include "code\modules\food\food\thecake.dm" -#include "code\modules\food\food\z_custom_food_vr.dm" -#include "code\modules\food\food\drinks\bottle.dm" -#include "code\modules\food\food\drinks\cup.dm" -#include "code\modules\food\food\drinks\drinkingglass.dm" -#include "code\modules\food\food\drinks\jar.dm" -#include "code\modules\food\food\drinks\bottle\robot.dm" -#include "code\modules\food\food\snacks\meat.dm" -#include "code\modules\food\glass\bottle.dm" -#include "code\modules\food\glass\bottle_vr.dm" -#include "code\modules\food\glass\bottle\robot.dm" -#include "code\modules\food\kitchen\gibber.dm" -#include "code\modules\food\kitchen\icecream.dm" -#include "code\modules\food\kitchen\microwave.dm" -#include "code\modules\food\kitchen\cooking_machines\_appliance.dm" -#include "code\modules\food\kitchen\cooking_machines\_cooker.dm" -#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm" -#include "code\modules\food\kitchen\cooking_machines\_mixer.dm" -#include "code\modules\food\kitchen\cooking_machines\candy.dm" -#include "code\modules\food\kitchen\cooking_machines\cereal.dm" -#include "code\modules\food\kitchen\cooking_machines\container.dm" -#include "code\modules\food\kitchen\cooking_machines\fryer.dm" -#include "code\modules\food\kitchen\cooking_machines\grill.dm" -#include "code\modules\food\kitchen\cooking_machines\oven.dm" -#include "code\modules\food\kitchen\smartfridge\drying_rack.dm" -#include "code\modules\food\kitchen\smartfridge\engineering.dm" -#include "code\modules\food\kitchen\smartfridge\hydroponics.dm" -#include "code\modules\food\kitchen\smartfridge\medical.dm" -#include "code\modules\food\kitchen\smartfridge\smartfridge.dm" -#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm" -#include "code\modules\gamemaster\defines.dm" -#include "code\modules\gamemaster\event2\event.dm" -#include "code\modules\gamemaster\event2\meta.dm" -#include "code\modules\gamemaster\event2\events\ghost_pod_spawner.dm" -#include "code\modules\gamemaster\event2\events\mob_spawning.dm" -#include "code\modules\gamemaster\event2\events\cargo\shipping_error.dm" -#include "code\modules\gamemaster\event2\events\command\manifest_malfunction.dm" -#include "code\modules\gamemaster\event2\events\command\money_hacker.dm" -#include "code\modules\gamemaster\event2\events\command\raise_funds.dm" -#include "code\modules\gamemaster\event2\events\engineering\airlock_failure.dm" -#include "code\modules\gamemaster\event2\events\engineering\blob.dm" -#include "code\modules\gamemaster\event2\events\engineering\brand_intelligence.dm" -#include "code\modules\gamemaster\event2\events\engineering\camera_damage.dm" -#include "code\modules\gamemaster\event2\events\engineering\canister_leak.dm" -#include "code\modules\gamemaster\event2\events\engineering\dust.dm" -#include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" -#include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" -#include "code\modules\gamemaster\event2\events\engineering\meteor_defense.dm" -#include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" -#include "code\modules\gamemaster\event2\events\engineering\wallrot.dm" -#include "code\modules\gamemaster\event2\events\engineering\window_break.dm" -#include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" -#include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" -#include "code\modules\gamemaster\event2\events\everyone\gravity_vr.dm" -#include "code\modules\gamemaster\event2\events\everyone\infestation.dm" -#include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" -#include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" -#include "code\modules\gamemaster\event2\events\everyone\random_antag.dm" -#include "code\modules\gamemaster\event2\events\everyone\solar_storm.dm" -#include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" -#include "code\modules\gamemaster\event2\events\legacy\legacy.dm" -#include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" -#include "code\modules\gamemaster\event2\events\medical\virus.dm" -#include "code\modules\gamemaster\event2\events\security\carp_migration.dm" -#include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" -#include "code\modules\gamemaster\event2\events\security\prison_break.dm" -#include "code\modules\gamemaster\event2\events\security\rogue_drones.dm" -#include "code\modules\gamemaster\event2\events\security\security_advisement.dm" -#include "code\modules\gamemaster\event2\events\security\spider_infestation.dm" -#include "code\modules\gamemaster\event2\events\security\stowaway.dm" -#include "code\modules\gamemaster\event2\events\security\surprise_carp.dm" -#include "code\modules\gamemaster\event2\events\security\swarm_boarder.dm" -#include "code\modules\gamemaster\event2\events\synthetic\ion_storm.dm" -#include "code\modules\games\cah.dm" -#include "code\modules\games\cah_black_cards.dm" -#include "code\modules\games\cah_white_cards.dm" -#include "code\modules\games\cardemon.dm" -#include "code\modules\games\cards.dm" -#include "code\modules\games\dice.dm" -#include "code\modules\games\spaceball_cards.dm" -#include "code\modules\games\tarot.dm" -#include "code\modules\genetics\side_effects.dm" -#include "code\modules\ghosttrap\trap.dm" -#include "code\modules\holodeck\HolodeckControl.dm" -#include "code\modules\holodeck\HolodeckObjects.dm" -#include "code\modules\holodeck\HolodeckPrograms.dm" -#include "code\modules\holomap\generate_holomap.dm" -#include "code\modules\holomap\holomap_area.dm" -#include "code\modules\holomap\holomap_datum.dm" -#include "code\modules\holomap\mapper.dm" -#include "code\modules\holomap\station_holomap.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\grown_inedible.dm" -#include "code\modules\hydroponics\grown_predefined.dm" -#include "code\modules\hydroponics\seed.dm" -#include "code\modules\hydroponics\seed_datums_vr.dm" -#include "code\modules\hydroponics\seed_gene_mut.dm" -#include "code\modules\hydroponics\seed_machines.dm" -#include "code\modules\hydroponics\seed_mobs.dm" -#include "code\modules\hydroponics\seed_packets.dm" -#include "code\modules\hydroponics\seed_packets_vr.dm" -#include "code\modules\hydroponics\seed_storage.dm" -#include "code\modules\hydroponics\seed_storage_vr.dm" -#include "code\modules\hydroponics\beekeeping\beehive.dm" -#include "code\modules\hydroponics\seedtypes\amauri.dm" -#include "code\modules\hydroponics\seedtypes\ambrosia.dm" -#include "code\modules\hydroponics\seedtypes\apples.dm" -#include "code\modules\hydroponics\seedtypes\banana.dm" -#include "code\modules\hydroponics\seedtypes\berries.dm" -#include "code\modules\hydroponics\seedtypes\cabbage.dm" -#include "code\modules\hydroponics\seedtypes\carrots.dm" -#include "code\modules\hydroponics\seedtypes\celery.dm" -#include "code\modules\hydroponics\seedtypes\cherries.dm" -#include "code\modules\hydroponics\seedtypes\chili.dm" -#include "code\modules\hydroponics\seedtypes\citrus.dm" -#include "code\modules\hydroponics\seedtypes\cocoa.dm" -#include "code\modules\hydroponics\seedtypes\corn.dm" -#include "code\modules\hydroponics\seedtypes\diona.dm" -#include "code\modules\hydroponics\seedtypes\durian.dm" -#include "code\modules\hydroponics\seedtypes\eggplant.dm" -#include "code\modules\hydroponics\seedtypes\flowers.dm" -#include "code\modules\hydroponics\seedtypes\gelthi.dm" -#include "code\modules\hydroponics\seedtypes\gnomes.dm" -#include "code\modules\hydroponics\seedtypes\grapes.dm" -#include "code\modules\hydroponics\seedtypes\grass.dm" -#include "code\modules\hydroponics\seedtypes\jurlmah.dm" -#include "code\modules\hydroponics\seedtypes\kudzu.dm" -#include "code\modules\hydroponics\seedtypes\lettuce.dm" -#include "code\modules\hydroponics\seedtypes\malanitear.dm" -#include "code\modules\hydroponics\seedtypes\mushrooms.dm" -#include "code\modules\hydroponics\seedtypes\nettles.dm" -#include "code\modules\hydroponics\seedtypes\onion.dm" -#include "code\modules\hydroponics\seedtypes\peanuts.dm" -#include "code\modules\hydroponics\seedtypes\pineapple.dm" -#include "code\modules\hydroponics\seedtypes\potato.dm" -#include "code\modules\hydroponics\seedtypes\pumpkin.dm" -#include "code\modules\hydroponics\seedtypes\rhubarb.dm" -#include "code\modules\hydroponics\seedtypes\rice.dm" -#include "code\modules\hydroponics\seedtypes\selemhand.dm" -#include "code\modules\hydroponics\seedtypes\soybean.dm" -#include "code\modules\hydroponics\seedtypes\sugarcane.dm" -#include "code\modules\hydroponics\seedtypes\surik.dm" -#include "code\modules\hydroponics\seedtypes\telriis.dm" -#include "code\modules\hydroponics\seedtypes\thaadra.dm" -#include "code\modules\hydroponics\seedtypes\tobacco.dm" -#include "code\modules\hydroponics\seedtypes\tomatoes.dm" -#include "code\modules\hydroponics\seedtypes\vale.dm" -#include "code\modules\hydroponics\seedtypes\vanilla.dm" -#include "code\modules\hydroponics\seedtypes\wabback.dm" -#include "code\modules\hydroponics\seedtypes\watermelon.dm" -#include "code\modules\hydroponics\seedtypes\weeds.dm" -#include "code\modules\hydroponics\seedtypes\wheat.dm" -#include "code\modules\hydroponics\seedtypes\whitebeets.dm" -#include "code\modules\hydroponics\seedtypes\wurmwoad.dm" -#include "code\modules\hydroponics\seedtypes\xeno.dm" -#include "code\modules\hydroponics\spreading\spreading.dm" -#include "code\modules\hydroponics\spreading\spreading_growth.dm" -#include "code\modules\hydroponics\spreading\spreading_response.dm" -#include "code\modules\hydroponics\trays\tray.dm" -#include "code\modules\hydroponics\trays\tray_process.dm" -#include "code\modules\hydroponics\trays\tray_reagents.dm" -#include "code\modules\hydroponics\trays\tray_soil.dm" -#include "code\modules\hydroponics\trays\tray_tools.dm" -#include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\identification\identification.dm" -#include "code\modules\identification\item_procs.dm" -#include "code\modules\instruments\items.dm" -#include "code\modules\instruments\stationary.dm" -#include "code\modules\instruments\instrument_data\_instrument_data.dm" -#include "code\modules\instruments\instrument_data\_instrument_key.dm" -#include "code\modules\instruments\instrument_data\brass.dm" -#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" -#include "code\modules\instruments\instrument_data\fun.dm" -#include "code\modules\instruments\instrument_data\guitar.dm" -#include "code\modules\instruments\instrument_data\hardcoded.dm" -#include "code\modules\instruments\instrument_data\organ.dm" -#include "code\modules\instruments\instrument_data\piano.dm" -#include "code\modules\instruments\instrument_data\synth_tones.dm" -#include "code\modules\instruments\songs\_song.dm" -#include "code\modules\instruments\songs\editor.dm" -#include "code\modules\instruments\songs\play_legacy.dm" -#include "code\modules\instruments\songs\play_synthesized.dm" -#include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\core\assemblies.dm" -#include "code\modules\integrated_electronics\core\detailer.dm" -#include "code\modules\integrated_electronics\core\helpers.dm" -#include "code\modules\integrated_electronics\core\integrated_circuit.dm" -#include "code\modules\integrated_electronics\core\pins.dm" -#include "code\modules\integrated_electronics\core\printer.dm" -#include "code\modules\integrated_electronics\core\tools.dm" -#include "code\modules\integrated_electronics\core\assemblies\clothing.dm" -#include "code\modules\integrated_electronics\core\assemblies\device.dm" -#include "code\modules\integrated_electronics\core\assemblies\generic.dm" -#include "code\modules\integrated_electronics\core\assemblies\implant.dm" -#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" -#include "code\modules\integrated_electronics\passive\passive.dm" -#include "code\modules\integrated_electronics\passive\power.dm" -#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" -#include "code\modules\integrated_electronics\subtypes\built_in.dm" -#include "code\modules\integrated_electronics\subtypes\converters.dm" -#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" -#include "code\modules\integrated_electronics\subtypes\input.dm" -#include "code\modules\integrated_electronics\subtypes\lists.dm" -#include "code\modules\integrated_electronics\subtypes\logic.dm" -#include "code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "code\modules\integrated_electronics\subtypes\memory.dm" -#include "code\modules\integrated_electronics\subtypes\output.dm" -#include "code\modules\integrated_electronics\subtypes\power.dm" -#include "code\modules\integrated_electronics\subtypes\reagents.dm" -#include "code\modules\integrated_electronics\subtypes\smart.dm" -#include "code\modules\integrated_electronics\subtypes\time.dm" -#include "code\modules\integrated_electronics\subtypes\trig.dm" -#include "code\modules\integrated_electronics\~defines\~defines.dm" -#include "code\modules\keybindings\bindings_atom.dm" -#include "code\modules\keybindings\bindings_movekeys.dm" -#include "code\modules\keybindings\setup.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\lib_readme.dm" -#include "code\modules\library\hardcode_library\_library.dm" -#include "code\modules\library\hardcode_library\fiction\APsychonaut.dm" -#include "code\modules\library\hardcode_library\fiction\battlefieldcommander.dm" -#include "code\modules\library\hardcode_library\fiction\PortedBooks.dm" -#include "code\modules\library\hardcode_library\fiction\schnayy.dm" -#include "code\modules\library\hardcode_library\non-fiction\PortedBooks.dm" -#include "code\modules\library\hardcode_library\reference\PortedBooks.dm" -#include "code\modules\library\hardcode_library\reference\Schnayy.dm" -#include "code\modules\library\hardcode_library\religious\PortedBooks.dm" -#include "code\modules\lighting\emissive_blocker.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_fake_sun_vr.dm" -#include "code\modules\lighting\lighting_overlay.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\looking_glass\lg_area.dm" -#include "code\modules\looking_glass\lg_console.dm" -#include "code\modules\looking_glass\lg_imageholder.dm" -#include "code\modules\looking_glass\lg_turfs.dm" -#include "code\modules\lore_codex\codex.dm" -#include "code\modules\lore_codex\codex_tree.dm" -#include "code\modules\lore_codex\pages.dm" -#include "code\modules\lore_codex\lore_data_vr\important_locations.dm" -#include "code\modules\lore_codex\lore_data_vr\main.dm" -#include "code\modules\lore_codex\lore_data_vr\orgs.dm" -#include "code\modules\lore_codex\lore_data_vr\political_parties.dm" -#include "code\modules\lore_codex\lore_data_vr\species.dm" -#include "code\modules\lore_codex\news_data\main.dm" -#include "code\modules\lore_codex\robutt_data\bybrand.dm" -#include "code\modules\lore_codex\robutt_data\main_robutts.dm" -#include "code\modules\lore_codex\robutt_data\more.dm" -#include "code\modules\makeup\nailpolish.dm" -#include "code\modules\maps\tg\dmm_suite.dm" -#include "code\modules\maps\tg\map_template.dm" -#include "code\modules\maps\tg\map_template_vr.dm" -#include "code\modules\maps\tg\reader.dm" -#include "code\modules\materials\fifty_spawner.dm" -#include "code\modules\materials\fifty_spawner_mats.dm" -#include "code\modules\materials\fifty_spawner_mats_vr.dm" -#include "code\modules\materials\material_synth.dm" -#include "code\modules\materials\materials\_materials.dm" -#include "code\modules\materials\materials\_materials_vr.dm" -#include "code\modules\materials\materials\alien_alloy.dm" -#include "code\modules\materials\materials\cult.dm" -#include "code\modules\materials\materials\gems.dm" -#include "code\modules\materials\materials\glass.dm" -#include "code\modules\materials\materials\glass_vr.dm" -#include "code\modules\materials\materials\holographic.dm" -#include "code\modules\materials\materials\other_vr.dm" -#include "code\modules\materials\materials\plastic.dm" -#include "code\modules\materials\materials\snow.dm" -#include "code\modules\materials\materials\stone.dm" -#include "code\modules\materials\materials\supermatter.dm" -#include "code\modules\materials\materials\metals\hull.dm" -#include "code\modules\materials\materials\metals\hull_vr.dm" -#include "code\modules\materials\materials\metals\metals.dm" -#include "code\modules\materials\materials\metals\metals_vr.dm" -#include "code\modules\materials\materials\metals\plasteel.dm" -#include "code\modules\materials\materials\metals\plasteel_vr.dm" -#include "code\modules\materials\materials\metals\steel.dm" -#include "code\modules\materials\materials\metals\steel_vr.dm" -#include "code\modules\materials\materials\organic\animal_products.dm" -#include "code\modules\materials\materials\organic\cloth.dm" -#include "code\modules\materials\materials\organic\leather.dm" -#include "code\modules\materials\materials\organic\resin.dm" -#include "code\modules\materials\materials\organic\wood.dm" -#include "code\modules\materials\sheets\_sheets.dm" -#include "code\modules\materials\sheets\gems.dm" -#include "code\modules\materials\sheets\glass.dm" -#include "code\modules\materials\sheets\glass_vr.dm" -#include "code\modules\materials\sheets\plastic.dm" -#include "code\modules\materials\sheets\snow.dm" -#include "code\modules\materials\sheets\stone.dm" -#include "code\modules\materials\sheets\supermatter.dm" -#include "code\modules\materials\sheets\metals\hull.dm" -#include "code\modules\materials\sheets\metals\hull_vr.dm" -#include "code\modules\materials\sheets\metals\metal.dm" -#include "code\modules\materials\sheets\metals\metal_vr.dm" -#include "code\modules\materials\sheets\metals\rods.dm" -#include "code\modules\materials\sheets\organic\animal_products.dm" -#include "code\modules\materials\sheets\organic\resin.dm" -#include "code\modules\materials\sheets\organic\textiles.dm" -#include "code\modules\materials\sheets\organic\wood.dm" -#include "code\modules\materials\sheets\organic\tanning\hide.dm" -#include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" -#include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" -#include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" -#include "code\modules\media\juke_remote.dm" -#include "code\modules\media\media_machinery.dm" -#include "code\modules\media\media_player_html5.dm" -#include "code\modules\media\media_player_vlc.dm" -#include "code\modules\media\media_player_wmp.dm" -#include "code\modules\media\media_tracks.dm" -#include "code\modules\media\mediamanager.dm" -#include "code\modules\media\walkpod.dm" -#include "code\modules\metric\activity.dm" -#include "code\modules\metric\count.dm" -#include "code\modules\metric\department.dm" -#include "code\modules\metric\metric.dm" -#include "code\modules\mining\abandonedcrates.dm" -#include "code\modules\mining\abandonedcrates_vr.dm" -#include "code\modules\mining\alloys.dm" -#include "code\modules\mining\alloys_vr.dm" -#include "code\modules\mining\fulton.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\mine_items_vr.dm" -#include "code\modules\mining\mine_outcrops.dm" -#include "code\modules\mining\mine_turfs.dm" -#include "code\modules\mining\mine_turfs_vr.dm" -#include "code\modules\mining\mineral_effect.dm" -#include "code\modules\mining\ore.dm" -#include "code\modules\mining\ore_box.dm" -#include "code\modules\mining\ore_datum.dm" -#include "code\modules\mining\resonator_vr.dm" -#include "code\modules\mining\shelter_atoms_vr.dm" -#include "code\modules\mining\shelters_vr.dm" -#include "code\modules\mining\drilling\drill.dm" -#include "code\modules\mining\drilling\scanner.dm" -#include "code\modules\mining\machinery\machine_input_output_plates.dm" -#include "code\modules\mining\machinery\machine_processing.dm" -#include "code\modules\mining\machinery\machine_stacking.dm" -#include "code\modules\mining\machinery\machine_unloading.dm" -#include "code\modules\mining\ore_redemption_machine\construction.dm" -#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm" -#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm" -#include "code\modules\mining\ore_redemption_machine\survey_vendor.dm" -#include "code\modules\mob\animations.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\gender.dm" -#include "code\modules\mob\gender_vr.dm" -#include "code\modules\mob\hear_say.dm" -#include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\login_vr.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_defines_vr.dm" -#include "code\modules\mob\mob_grab.dm" -#include "code\modules\mob\mob_grab_specials.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_helpers_vr.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_planes.dm" -#include "code\modules\mob\mob_planes_vr.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\say_vr.dm" -#include "code\modules\mob\skillset.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\_modifiers\aura.dm" -#include "code\modules\mob\_modifiers\changeling.dm" -#include "code\modules\mob\_modifiers\cloning.dm" -#include "code\modules\mob\_modifiers\feysight.dm" -#include "code\modules\mob\_modifiers\fire.dm" -#include "code\modules\mob\_modifiers\medical.dm" -#include "code\modules\mob\_modifiers\modifiers.dm" -#include "code\modules\mob\_modifiers\modifiers_misc.dm" -#include "code\modules\mob\_modifiers\traits.dm" -#include "code\modules\mob\_modifiers\traits_phobias.dm" -#include "code\modules\mob\_modifiers\unholy.dm" -#include "code\modules\mob\dead\corpse.dm" -#include "code\modules\mob\dead\corpse_vr.dm" -#include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\free_vr.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\observer_vr.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\freelook\chunk.dm" -#include "code\modules\mob\freelook\eye.dm" -#include "code\modules\mob\freelook\life.dm" -#include "code\modules\mob\freelook\update_triggers.dm" -#include "code\modules\mob\freelook\visualnet.dm" -#include "code\modules\mob\freelook\ai\cameranet.dm" -#include "code\modules\mob\freelook\ai\chunk.dm" -#include "code\modules\mob\freelook\ai\eye.dm" -#include "code\modules\mob\freelook\ai\update_triggers.dm" -#include "code\modules\mob\freelook\mask\chunk.dm" -#include "code\modules\mob\freelook\mask\cultnet.dm" -#include "code\modules\mob\freelook\mask\eye.dm" -#include "code\modules\mob\freelook\mask\update_triggers.dm" -#include "code\modules\mob\language\generic.dm" -#include "code\modules\mob\language\language.dm" -#include "code\modules\mob\language\monkey.dm" -#include "code\modules\mob\language\outsider.dm" -#include "code\modules\mob\language\station.dm" -#include "code\modules\mob\language\station_vr.dm" -#include "code\modules\mob\language\synthetic.dm" -#include "code\modules\mob\living\autohiss.dm" -#include "code\modules\mob\living\butchering.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\inventory.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\living_defines_vr.dm" -#include "code\modules\mob\living\living_movement.dm" -#include "code\modules\mob\living\living_powers.dm" -#include "code\modules\mob\living\living_vr.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\organs.dm" -#include "code\modules\mob\living\riding.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\status_indicators.dm" -#include "code\modules\mob\living\bot\bot.dm" -#include "code\modules\mob\living\bot\bot_vr.dm" -#include "code\modules\mob\living\bot\cleanbot.dm" -#include "code\modules\mob\living\bot\ed209bot.dm" -#include "code\modules\mob\living\bot\edCLNbot.dm" -#include "code\modules\mob\living\bot\farmbot.dm" -#include "code\modules\mob\living\bot\floorbot.dm" -#include "code\modules\mob\living\bot\medbot.dm" -#include "code\modules\mob\living\bot\mulebot.dm" -#include "code\modules\mob\living\bot\mulebot_vr.dm" -#include "code\modules\mob\living\bot\secbot.dm" -#include "code\modules\mob\living\bot\SLed209bot.dm" -#include "code\modules\mob\living\carbon\breathe.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_powers.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\lick_wounds.dm" -#include "code\modules\mob\living\carbon\resist.dm" -#include "code\modules\mob\living\carbon\shock.dm" -#include "code\modules\mob\living\carbon\taste.dm" -#include "code\modules\mob\living\carbon\viruses.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" -#include "code\modules\mob\living\carbon\alien\alien_damage.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\progression.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" -#include "code\modules\mob\living\carbon\alien\diona\life.dm" -#include "code\modules\mob\living\carbon\alien\diona\progression.dm" -#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" -#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\progression.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\robot.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\death_vr.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\emote_vr.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\examine_vr.dm" -#include "code\modules\mob\living\carbon\human\gradient.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_defines_vr.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" -#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\human_powers.dm" -#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" -#include "code\modules\mob\living\carbon\human\human_resist.dm" -#include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\human_species_vr.dm" -#include "code\modules\mob\living\carbon\human\human_vr.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\life_vr.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\stripping.dm" -#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm" -#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" -#include "code\modules\mob\living\carbon\human\species\species.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_helpers.dm" -#include "code\modules\mob\living\carbon\human\species\species_hud.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_vr.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\event.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" -#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\golem.dm" -#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" -#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" -#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\emote.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_vr.dm" -#include "code\modules\mob\living\silicon\subystems.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_movement.dm" -#include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" -#include "code\modules\mob\living\silicon\ai\ai_vr.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\icons.dm" -#include "code\modules\mob\living\silicon\ai\latejoin.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\malf.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\admin.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\examine.dm" -#include "code\modules\mob\living\silicon\pai\life.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\pai_vr.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\recruit.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" -#include "code\modules\mob\living\silicon\robot\analyzer.dm" -#include "code\modules\mob\living\silicon\robot\component.dm" -#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\examine_vr.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\photos.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_damage.dm" -#include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" -#include "code\modules\mob\living\silicon\robot\robot_vr.dm" -#include "code\modules\mob\living\silicon\robot\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\event_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" -#include "code\modules\mob\living\simple_mob\appearance.dm" -#include "code\modules\mob\living\simple_mob\butchering.dm" -#include "code\modules\mob\living\simple_mob\combat.dm" -#include "code\modules\mob\living\simple_mob\defense.dm" -#include "code\modules\mob\living\simple_mob\donteatpets_vr.dm" -#include "code\modules\mob\living\simple_mob\hands.dm" -#include "code\modules\mob\living\simple_mob\harvesting.dm" -#include "code\modules\mob\living\simple_mob\life.dm" -#include "code\modules\mob\living\simple_mob\on_click.dm" -#include "code\modules\mob\living\simple_mob\simple_hud.dm" -#include "code\modules\mob\living\simple_mob\simple_mob.dm" -#include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" -#include "code\modules\mob\living\simple_mob\taming.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_powers.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\chicken.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\giant_spider_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\pepper.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\phorogenic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\thermic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\jerboa_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\fox_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\fluffy_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" -#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" -#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\wahlem_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\hoverpod.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\marauder.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\mecha.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\odysseus.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\phazon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\ripley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\monitor_ward.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\ward.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" -#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" -#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\slime_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\weretiger.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\xeno_vore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bus.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\busclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\c_shift.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Clowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\hespawner.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" -#include "code\modules\mob\living\voice\voice.dm" -#include "code\modules\mob\living\voice\voice_vr.dm" -#include "code\modules\mob\new_player\login.dm" -#include "code\modules\mob\new_player\login_vr.dm" -#include "code\modules\mob\new_player\logout.dm" -#include "code\modules\mob\new_player\new_player.dm" -#include "code\modules\mob\new_player\new_player_vr.dm" -#include "code\modules\mob\new_player\news.dm" -#include "code\modules\mob\new_player\poll.dm" -#include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\preferences_setup_vr.dm" -#include "code\modules\mob\new_player\skill.dm" -#include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories_ear.dm" -#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_extra.dm" -#include "code\modules\mob\new_player\sprite_accessories_extra_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_tail.dm" -#include "code\modules\mob\new_player\sprite_accessories_tail_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_taur.dm" -#include "code\modules\mob\new_player\sprite_accessories_taur_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_wing.dm" -#include "code\modules\mob\new_player\sprite_accessories_wing_vr.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\modular_computer\core.dm" -#include "code\modules\modular_computers\computers\modular_computer\damage.dm" -#include "code\modules\modular_computers\computers\modular_computer\hardware.dm" -#include "code\modules\modular_computers\computers\modular_computer\interaction.dm" -#include "code\modules\modular_computers\computers\modular_computer\power.dm" -#include "code\modules\modular_computers\computers\modular_computer\ui.dm" -#include "code\modules\modular_computers\computers\modular_computer\variables.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_console.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_console.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_laptop_vr.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_tablet_vr.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\news_article.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\file_system\programs\command\card.dm" -#include "code\modules\modular_computers\file_system\programs\command\comm.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\alarm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\atmos_control.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\shutoff_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\generic\camera.dm" -#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\game.dm" -#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" -#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" -#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" -#include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" -#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" -#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm" -#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\nano_printer.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" -#include "code\modules\modular_computers\hardware\processor_unit.dm" -#include "code\modules\modular_computers\hardware\tesla_link.dm" -#include "code\modules\modular_computers\NTNet\NTNet.dm" -#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" -#include "code\modules\modular_computers\NTNet\emails\email_account.dm" -#include "code\modules\modular_computers\NTNet\emails\email_message.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\multi-tile\multi-tile.dm" -#include "code\modules\multiz\_stubs.dm" -#include "code\modules\multiz\admin_upload.dm" -#include "code\modules\multiz\basic.dm" -#include "code\modules\multiz\hoist.dm" -#include "code\modules\multiz\ladder_assembly_vr.dm" -#include "code\modules\multiz\ladders.dm" -#include "code\modules\multiz\ladders_vr.dm" -#include "code\modules\multiz\movement.dm" -#include "code\modules\multiz\movement_vr.dm" -#include "code\modules\multiz\pipes.dm" -#include "code\modules\multiz\stairs.dm" -#include "code\modules\multiz\turf.dm" -#include "code\modules\news\news_init.dm" -#include "code\modules\news\newspaper.dm" -#include "code\modules\news\newspaper_layout.dm" -#include "code\modules\nifsoft\nif.dm" -#include "code\modules\nifsoft\nif_softshop.dm" -#include "code\modules\nifsoft\nif_tgui.dm" -#include "code\modules\nifsoft\nifsoft.dm" -#include "code\modules\nifsoft\software\01_vision.dm" -#include "code\modules\nifsoft\software\05_health.dm" -#include "code\modules\nifsoft\software\06_screens.dm" -#include "code\modules\nifsoft\software\10_combat.dm" -#include "code\modules\nifsoft\software\13_soulcatcher.dm" -#include "code\modules\nifsoft\software\14_commlink.dm" -#include "code\modules\nifsoft\software\15_misc.dm" -#include "code\modules\organs\blood.dm" -#include "code\modules\organs\misc.dm" -#include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_external.dm" -#include "code\modules\organs\organ_external_vr.dm" -#include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_stump.dm" -#include "code\modules\organs\pain.dm" -#include "code\modules\organs\robolimbs.dm" -#include "code\modules\organs\robolimbs_custom.dm" -#include "code\modules\organs\robolimbs_vr.dm" -#include "code\modules\organs\wound.dm" -#include "code\modules\organs\internal\_organ_internal.dm" -#include "code\modules\organs\internal\appendix.dm" -#include "code\modules\organs\internal\augment.dm" -#include "code\modules\organs\internal\brain.dm" -#include "code\modules\organs\internal\eyes.dm" -#include "code\modules\organs\internal\heart.dm" -#include "code\modules\organs\internal\intestine.dm" -#include "code\modules\organs\internal\kidneys.dm" -#include "code\modules\organs\internal\liver.dm" -#include "code\modules\organs\internal\lungs.dm" -#include "code\modules\organs\internal\spleen.dm" -#include "code\modules\organs\internal\stomach.dm" -#include "code\modules\organs\internal\voicebox.dm" -#include "code\modules\organs\internal\augment\armmounted.dm" -#include "code\modules\organs\internal\augment\bio.dm" -#include "code\modules\organs\internal\robotic\diagnostic.dm" -#include "code\modules\organs\internal\robotic\heatsink.dm" -#include "code\modules\organs\internal\robotic\robotic.dm" -#include "code\modules\organs\subtypes\diona.dm" -#include "code\modules\organs\subtypes\indestructible.dm" -#include "code\modules\organs\subtypes\machine.dm" -#include "code\modules\organs\subtypes\nano.dm" -#include "code\modules\organs\subtypes\replicant.dm" -#include "code\modules\organs\subtypes\shadekin.dm" -#include "code\modules\organs\subtypes\shadekin_vr.dm" -#include "code\modules\organs\subtypes\slime.dm" -#include "code\modules\organs\subtypes\slime_vr.dm" -#include "code\modules\organs\subtypes\standard.dm" -#include "code\modules\organs\subtypes\standard_vr.dm" -#include "code\modules\organs\subtypes\teshari.dm" -#include "code\modules\organs\subtypes\unathi.dm" -#include "code\modules\organs\subtypes\unbreakable.dm" -#include "code\modules\organs\subtypes\unseverable.dm" -#include "code\modules\organs\subtypes\vox.dm" -#include "code\modules\organs\subtypes\vox_vr.dm" -#include "code\modules\organs\subtypes\xenos.dm" -#include "code\modules\overmap\abductor_vr.dm" -#include "code\modules\overmap\bluespace_rift_vr.dm" -#include "code\modules\overmap\champagne.dm" -#include "code\modules\overmap\helpers.dm" -#include "code\modules\overmap\overmap_object.dm" -#include "code\modules\overmap\overmap_planet.dm" -#include "code\modules\overmap\overmap_shuttle.dm" -#include "code\modules\overmap\sectors.dm" -#include "code\modules\overmap\spacetravel.dm" -#include "code\modules\overmap\turfs.dm" -#include "code\modules\overmap\disperser\disperser.dm" -#include "code\modules\overmap\disperser\disperser_charge.dm" -#include "code\modules\overmap\disperser\disperser_circuit.dm" -#include "code\modules\overmap\disperser\disperser_console.dm" -#include "code\modules\overmap\disperser\disperser_fire.dm" -#include "code\modules\overmap\events\event_handler.dm" -#include "code\modules\overmap\events\generation.dm" -#include "code\modules\overmap\events\overmap_event.dm" -#include "code\modules\overmap\ships\landable.dm" -#include "code\modules\overmap\ships\panicbutton.dm" -#include "code\modules\overmap\ships\ship.dm" -#include "code\modules\overmap\ships\computers\computer_shims.dm" -#include "code\modules\overmap\ships\computers\engine_control.dm" -#include "code\modules\overmap\ships\computers\helm.dm" -#include "code\modules\overmap\ships\computers\sensors.dm" -#include "code\modules\overmap\ships\computers\ship.dm" -#include "code\modules\overmap\ships\computers\ship_vr.dm" -#include "code\modules\overmap\ships\computers\shuttle.dm" -#include "code\modules\overmap\ships\engines\engine.dm" -#include "code\modules\overmap\ships\engines\gas_thruster.dm" -#include "code\modules\overmap\ships\engines\gas_thruster_vr.dm" -#include "code\modules\overmap\ships\engines\ion_thruster.dm" -#include "code\modules\paperwork\adminpaper.dm" -#include "code\modules\paperwork\carbonpaper.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\faxmachine.dm" -#include "code\modules\paperwork\faxmachine_vr.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_bundle.dm" -#include "code\modules\paperwork\paper_sticky.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\papershredder.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" -#include "code\modules\paperwork\silicon_photography.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\pda\ai.dm" -#include "code\modules\pda\app.dm" -#include "code\modules\pda\cart.dm" -#include "code\modules\pda\cart_apps.dm" -#include "code\modules\pda\cart_vr.dm" -#include "code\modules\pda\core_apps.dm" -#include "code\modules\pda\messenger.dm" -#include "code\modules\pda\messenger_plugins.dm" -#include "code\modules\pda\pda.dm" -#include "code\modules\pda\pda_subtypes.dm" -#include "code\modules\pda\pda_tgui.dm" -#include "code\modules\pda\pda_vr.dm" -#include "code\modules\pda\radio.dm" -#include "code\modules\pda\utilities.dm" -#include "code\modules\persistence\filth.dm" -#include "code\modules\persistence\graffiti.dm" -#include "code\modules\persistence\noticeboard.dm" -#include "code\modules\persistence\paintings.dm" -#include "code\modules\persistence\serialize.dm" -#include "code\modules\persistence\datum\persistence_datum.dm" -#include "code\modules\persistence\effects\filth.dm" -#include "code\modules\persistence\effects\graffiti.dm" -#include "code\modules\persistence\effects\paper.dm" -#include "code\modules\persistence\effects\paper_sticky.dm" -#include "code\modules\persistence\effects\trash.dm" -#include "code\modules\persistence\storage\smartfridge.dm" -#include "code\modules\persistence\storage\storage.dm" -#include "code\modules\planet\planet.dm" -#include "code\modules\planet\sun.dm" -#include "code\modules\planet\time.dm" -#include "code\modules\planet\virgo3b_vr.dm" -#include "code\modules\planet\virgo4_vr.dm" -#include "code\modules\planet\weather.dm" -#include "code\modules\planet\weather_vr.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\apc_vr.dm" -#include "code\modules\power\batteryrack.dm" -#include "code\modules\power\batteryrack_vr.dm" -#include "code\modules\power\breaker_box.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cable_ender.dm" -#include "code\modules\power\cable_heavyduty.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\debug_items.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\gravitygenerator_vr.dm" -#include "code\modules\power\grid_checker.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\lighting_vr.dm" -#include "code\modules\power\lightswitch_vr.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\port_gen_vr.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\smes_construction.dm" -#include "code\modules\power\smes_vr.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\antimatter\containment_jar.dm" -#include "code\modules\power\antimatter\control.dm" -#include "code\modules\power\antimatter\shielding.dm" -#include "code\modules\power\cells\device_cells.dm" -#include "code\modules\power\cells\device_cells_vr.dm" -#include "code\modules\power\cells\esoteric_cells.dm" -#include "code\modules\power\cells\power_cells.dm" -#include "code\modules\power\fusion\_setup.dm" -#include "code\modules\power\fusion\fusion_circuits.dm" -#include "code\modules\power\fusion\fusion_particle_catcher.dm" -#include "code\modules\power\fusion\fusion_reactions.dm" -#include "code\modules\power\fusion\magpower.dm" -#include "code\modules\power\fusion\core\_core.dm" -#include "code\modules\power\fusion\core\core_control.dm" -#include "code\modules\power\fusion\core\core_field.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_assembly.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_compressor.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_control.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_injector.dm" -#include "code\modules\power\fusion\gyrotron\gyrotron.dm" -#include "code\modules\power\fusion\gyrotron\gyrotron_control.dm" -#include "code\modules\power\sensors\powernet_sensor.dm" -#include "code\modules\power\sensors\sensor_monitoring.dm" -#include "code\modules\power\singularity\act.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\emitter_vr.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm" -#include "code\modules\power\supermatter\setup_supermatter.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\power\tesla\telsa_construction.dm" -#include "code\modules\power\tesla\tesla_act.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\broken.dm" -#include "code\modules\projectiles\dnalocking.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\magazines.dm" -#include "code\modules\projectiles\ammunition\magazines_vr.dm" -#include "code\modules\projectiles\ammunition\magnetic.dm" -#include "code\modules\projectiles\ammunition\rounds.dm" -#include "code\modules\projectiles\ammunition\smartmag.dm" -#include "code\modules\projectiles\brokenguns\energy.dm" -#include "code\modules\projectiles\brokenguns\launcher.dm" -#include "code\modules\projectiles\brokenguns\magnetic.dm" -#include "code\modules\projectiles\brokenguns\projectile.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\launcher.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\modular_guns.dm" -#include "code\modules\projectiles\guns\projectile.dm" -#include "code\modules\projectiles\guns\vox.dm" -#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" -#include "code\modules\projectiles\guns\energy\crestrose_vr.dm" -#include "code\modules\projectiles\guns\energy\dominator_vr.dm" -#include "code\modules\projectiles\guns\energy\gunsword_vr.dm" -#include "code\modules\projectiles\guns\energy\hooklauncher.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\laser_vr.dm" -#include "code\modules\projectiles\guns\energy\netgun_vr.dm" -#include "code\modules\projectiles\guns\energy\nuclear.dm" -#include "code\modules\projectiles\guns\energy\nuclear_vr.dm" -#include "code\modules\projectiles\guns\energy\particle.dm" -#include "code\modules\projectiles\guns\energy\phase.dm" -#include "code\modules\projectiles\guns\energy\protector_vr.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\pummeler_vr.dm" -#include "code\modules\projectiles\guns\energy\sickshot_vr.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\special_vr.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\energy\stun_vr.dm" -#include "code\modules\projectiles\guns\energy\temperature.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\cell_loaded.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m_cells.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon_cells.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw_cells.dm" -#include "code\modules\projectiles\guns\launcher\bows.dm" -#include "code\modules\projectiles\guns\launcher\crossbow.dm" -#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" -#include "code\modules\projectiles\guns\launcher\pneumatic.dm" -#include "code\modules\projectiles\guns\launcher\rocket.dm" -#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" -#include "code\modules\projectiles\guns\magic\fireball.dm" -#include "code\modules\projectiles\guns\magnetic\bore.dm" -#include "code\modules\projectiles\guns\magnetic\gasthrower.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\automatic.dm" -#include "code\modules\projectiles\guns\projectile\automatic_vr.dm" -#include "code\modules\projectiles\guns\projectile\boltaction.dm" -#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm" -#include "code\modules\projectiles\guns\projectile\caseless.dm" -#include "code\modules\projectiles\guns\projectile\contender.dm" -#include "code\modules\projectiles\guns\projectile\dartgun.dm" -#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\pistol.dm" -#include "code\modules\projectiles\guns\projectile\pistol_vr.dm" -#include "code\modules\projectiles\guns\projectile\revolver.dm" -#include "code\modules\projectiles\guns\projectile\revolver_vr.dm" -#include "code\modules\projectiles\guns\projectile\semiauto.dm" -#include "code\modules\projectiles\guns\projectile\shotgun.dm" -#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\sniper.dm" -#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" -#include "code\modules\projectiles\projectile\arc.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\beams_vr.dm" -#include "code\modules\projectiles\projectile\blob.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\bullets_vr.dm" -#include "code\modules\projectiles\projectile\change.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\energy_vr.dm" -#include "code\modules\projectiles\projectile\explosive.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\hook.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\magnetic.dm" -#include "code\modules\projectiles\projectile\pellets.dm" -#include "code\modules\projectiles\projectile\scatter.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\projectiles\projectile\trace.dm" -#include "code\modules\projectiles\targeting\targeting_client.dm" -#include "code\modules\projectiles\targeting\targeting_gun.dm" -#include "code\modules\projectiles\targeting\targeting_mob.dm" -#include "code\modules\projectiles\targeting\targeting_overlay.dm" -#include "code\modules\projectiles\targeting\targeting_triggers.dm" -#include "code\modules\radiation\radiation.dm" -#include "code\modules\random_map\_random_map_setup.dm" -#include "code\modules\random_map\random_map.dm" -#include "code\modules\random_map\random_map_verbs.dm" -#include "code\modules\random_map\automata\automata.dm" -#include "code\modules\random_map\automata\caves.dm" -#include "code\modules\random_map\building\building.dm" -#include "code\modules\random_map\drop\drop_types.dm" -#include "code\modules\random_map\drop\droppod.dm" -#include "code\modules\random_map\drop\droppod_doors.dm" -#include "code\modules\random_map\drop\supply.dm" -#include "code\modules\random_map\mazes\maze.dm" -#include "code\modules\random_map\mazes\maze_cell.dm" -#include "code\modules\random_map\noise\desert.dm" -#include "code\modules\random_map\noise\noise.dm" -#include "code\modules\random_map\noise\ore.dm" -#include "code\modules\random_map\noise\tundra.dm" -#include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Logging.dm" -#include "code\modules\reagents\Chemistry-Metabolism.dm" -#include "code\modules\reagents\holder\distilling.dm" -#include "code\modules\reagents\holder\holder.dm" -#include "code\modules\reagents\hoses\connector.dm" -#include "code\modules\reagents\hoses\hose.dm" -#include "code\modules\reagents\hoses\hose_connector.dm" -#include "code\modules\reagents\machinery\chem_master.dm" -#include "code\modules\reagents\machinery\chemalyzer.dm" -#include "code\modules\reagents\machinery\distillery.dm" -#include "code\modules\reagents\machinery\grinder.dm" -#include "code\modules\reagents\machinery\dispenser\_defines.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser2.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm" -#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" -#include "code\modules\reagents\machinery\dispenser\supply.dm" -#include "code\modules\reagents\reactions\_reactions.dm" -#include "code\modules\reagents\reactions\distilling\distilling.dm" -#include "code\modules\reagents\reactions\fusion\fusion.dm" -#include "code\modules\reagents\reactions\instant\drinks.dm" -#include "code\modules\reagents\reactions\instant\drinks_vr.dm" -#include "code\modules\reagents\reactions\instant\food.dm" -#include "code\modules\reagents\reactions\instant\food_vr.dm" -#include "code\modules\reagents\reactions\instant\instant.dm" -#include "code\modules\reagents\reactions\instant\instant_vr.dm" -#include "code\modules\reagents\reagent_containers\_reagent_containers.dm" -#include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" -#include "code\modules\reagents\reagent_containers\borghypo.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\glass_vr.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\hypospray_vr.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\pill_vr.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\spray_vr.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\reagents\reagent_containers\syringes_vr.dm" -#include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" -#include "code\modules\reagents\reagents\_helpers.dm" -#include "code\modules\reagents\reagents\_reagents.dm" -#include "code\modules\reagents\reagents\core.dm" -#include "code\modules\reagents\reagents\dispenser.dm" -#include "code\modules\reagents\reagents\food_drinks.dm" -#include "code\modules\reagents\reagents\food_drinks_vr.dm" -#include "code\modules\reagents\reagents\medicine.dm" -#include "code\modules\reagents\reagents\medicine_vr.dm" -#include "code\modules\reagents\reagents\modifiers.dm" -#include "code\modules\reagents\reagents\other.dm" -#include "code\modules\reagents\reagents\other_vr.dm" -#include "code\modules\reagents\reagents\toxins.dm" -#include "code\modules\reagents\reagents\vore_vr.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\mechfab_designs.dm" -#include "code\modules\research\message_server.dm" -#include "code\modules\research\prosfab_designs.dm" -#include "code\modules\research\prosfab_designs_vr.dm" -#include "code\modules\research\protolathe.dm" -#include "code\modules\research\rd-readme.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdconsole_tgui.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\teleport_vr.dm" -#include "code\modules\research\designs\ai_holders.dm" -#include "code\modules\research\designs\bag_of_holding.dm" -#include "code\modules\research\designs\beakers.dm" -#include "code\modules\research\designs\bio_devices.dm" -#include "code\modules\research\designs\bio_devices_vr.dm" -#include "code\modules\research\designs\circuit_assembly.dm" -#include "code\modules\research\designs\engineering.dm" -#include "code\modules\research\designs\HUDs.dm" -#include "code\modules\research\designs\HUDs_vr.dm" -#include "code\modules\research\designs\implants.dm" -#include "code\modules\research\designs\implants_vr.dm" -#include "code\modules\research\designs\locator_devices.dm" -#include "code\modules\research\designs\medical.dm" -#include "code\modules\research\designs\medical_vr.dm" -#include "code\modules\research\designs\mining_toys.dm" -#include "code\modules\research\designs\misc.dm" -#include "code\modules\research\designs\misc_vr.dm" -#include "code\modules\research\designs\modular_computer.dm" -#include "code\modules\research\designs\pdas.dm" -#include "code\modules\research\designs\power_cells.dm" -#include "code\modules\research\designs\precursor.dm" -#include "code\modules\research\designs\stock_parts.dm" -#include "code\modules\research\designs\subspace_parts.dm" -#include "code\modules\research\designs\tech_disks.dm" -#include "code\modules\research\designs\weapons.dm" -#include "code\modules\research\designs\weapons_vr.dm" -#include "code\modules\research\designs\xenoarch_toys.dm" -#include "code\modules\research\designs\xenobio_toys.dm" -#include "code\modules\research\designs\circuits\ai_modules.dm" -#include "code\modules\research\designs\circuits\ai_modules_vr.dm" -#include "code\modules\research\designs\circuits\circuits.dm" -#include "code\modules\research\designs\circuits\circuits_vr.dm" -#include "code\modules\research\designs\circuits\disks.dm" -#include "code\modules\resleeving\circuitboards.dm" -#include "code\modules\resleeving\computers.dm" -#include "code\modules\resleeving\designer.dm" -#include "code\modules\resleeving\documents.dm" -#include "code\modules\resleeving\implant.dm" -#include "code\modules\resleeving\infocore_records.dm" -#include "code\modules\resleeving\infomorph.dm" -#include "code\modules\resleeving\infomorph_software.dm" -#include "code\modules\resleeving\machines.dm" -#include "code\modules\resleeving\machines_vr.dm" -#include "code\modules\resleeving\resleeving_sickness.dm" -#include "code\modules\resleeving\sleevecard.dm" -#include "code\modules\rogueminer_vr\asteroid.dm" -#include "code\modules\rogueminer_vr\controller.dm" -#include "code\modules\rogueminer_vr\debug.dm" -#include "code\modules\rogueminer_vr\landmarks.dm" -#include "code\modules\rogueminer_vr\roguemines_mobs.dm" -#include "code\modules\rogueminer_vr\wrappers.dm" -#include "code\modules\rogueminer_vr\zone_console.dm" -#include "code\modules\rogueminer_vr\zonemaster.dm" -#include "code\modules\scripting\Errors.dm" -#include "code\modules\scripting\IDE.dm" -#include "code\modules\scripting\Options.dm" -#include "code\modules\scripting\stack.dm" -#include "code\modules\scripting\AST\AST Nodes.dm" -#include "code\modules\scripting\AST\Blocks.dm" -#include "code\modules\scripting\AST\Statements.dm" -#include "code\modules\scripting\AST\Operators\Binary Operators.dm" -#include "code\modules\scripting\AST\Operators\Unary Operators.dm" -#include "code\modules\scripting\Implementations\_Logic.dm" -#include "code\modules\scripting\Implementations\Telecomms.dm" -#include "code\modules\scripting\Interpreter\Evaluation.dm" -#include "code\modules\scripting\Interpreter\Interaction.dm" -#include "code\modules\scripting\Interpreter\Interpreter.dm" -#include "code\modules\scripting\Interpreter\Scope.dm" -#include "code\modules\scripting\Parser\Expressions.dm" -#include "code\modules\scripting\Parser\Keywords.dm" -#include "code\modules\scripting\Parser\Parser.dm" -#include "code\modules\scripting\Scanner\Scanner.dm" -#include "code\modules\scripting\Scanner\Tokens.dm" -#include "code\modules\security levels\keycard authentication.dm" -#include "code\modules\security levels\security levels.dm" -#include "code\modules\shieldgen\directional_shield.dm" -#include "code\modules\shieldgen\emergency_shield.dm" -#include "code\modules\shieldgen\energy_field.dm" -#include "code\modules\shieldgen\energy_shield.dm" -#include "code\modules\shieldgen\handheld_defuser.dm" -#include "code\modules\shieldgen\sheldwallgen.dm" -#include "code\modules\shieldgen\shield_capacitor.dm" -#include "code\modules\shieldgen\shield_diffuser.dm" -#include "code\modules\shieldgen\shield_gen.dm" -#include "code\modules\shieldgen\shield_gen_external.dm" -#include "code\modules\shieldgen\shield_generator.dm" -#include "code\modules\shieldgen\shield_modes.dm" -#include "code\modules\shuttles\antagonist.dm" -#include "code\modules\shuttles\crashes.dm" -#include "code\modules\shuttles\departmental.dm" -#include "code\modules\shuttles\escape_pods.dm" -#include "code\modules\shuttles\landmarks.dm" -#include "code\modules\shuttles\shuttle.dm" -#include "code\modules\shuttles\shuttle_autodock.dm" -#include "code\modules\shuttles\shuttle_console.dm" -#include "code\modules\shuttles\shuttle_console_multi.dm" -#include "code\modules\shuttles\shuttle_emergency.dm" -#include "code\modules\shuttles\shuttle_ferry.dm" -#include "code\modules\shuttles\shuttle_specops.dm" -#include "code\modules\shuttles\shuttle_supply.dm" -#include "code\modules\shuttles\shuttles_multi.dm" -#include "code\modules\shuttles\shuttles_vr.dm" -#include "code\modules\shuttles\shuttles_web.dm" -#include "code\modules\shuttles\web_datums.dm" -#include "code\modules\spells\artifacts.dm" -#include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" -#include "code\modules\spells\spells.dm" -#include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" -#include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\construct.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\rune_write.dm" -#include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\harvest.dm" -#include "code\modules\spells\targeted\mind_transfer.dm" -#include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\surgery\_defines.dm" -#include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\external_repair.dm" -#include "code\modules\surgery\face.dm" -#include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\implant.dm" -#include "code\modules\surgery\limb_reattach.dm" -#include "code\modules\surgery\neck.dm" -#include "code\modules\surgery\organs_internal.dm" -#include "code\modules\surgery\other.dm" -#include "code\modules\surgery\robotics.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\~defines.dm" -#include "code\modules\tables\bench.dm" -#include "code\modules\tables\flipping.dm" -#include "code\modules\tables\interactions.dm" -#include "code\modules\tables\presets.dm" -#include "code\modules\tables\presets_vr.dm" -#include "code\modules\tables\rack.dm" -#include "code\modules\tables\rack_vr.dm" -#include "code\modules\tables\tables.dm" -#include "code\modules\tables\update_triggers.dm" -#include "code\modules\telesci\bscyrstal.dm" -#include "code\modules\telesci\construction.dm" -#include "code\modules\telesci\gps_advanced.dm" -#include "code\modules\telesci\quantum_pad.dm" -#include "code\modules\telesci\telepad.dm" -#include "code\modules\telesci\telesci_computer.dm" -#include "code\modules\tension\tension.dm" -#include "code\modules\tgs\includes.dm" -#include "code\modules\tgui\external.dm" -#include "code\modules\tgui\modal.dm" -#include "code\modules\tgui\states.dm" -#include "code\modules\tgui\tgui.dm" -#include "code\modules\tgui\tgui_alert.dm" -#include "code\modules\tgui\tgui_input_list.dm" -#include "code\modules\tgui\tgui_input_text.dm" -#include "code\modules\tgui\tgui_window.dm" -#include "code\modules\tgui\modules\_base.dm" -#include "code\modules\tgui\modules\admin_shuttle_controller.dm" -#include "code\modules\tgui\modules\agentcard.dm" -#include "code\modules\tgui\modules\alarm.dm" -#include "code\modules\tgui\modules\appearance_changer.dm" -#include "code\modules\tgui\modules\appearance_changer_vr.dm" -#include "code\modules\tgui\modules\atmos_control.dm" -#include "code\modules\tgui\modules\camera.dm" -#include "code\modules\tgui\modules\communications.dm" -#include "code\modules\tgui\modules\crew_manifest.dm" -#include "code\modules\tgui\modules\crew_monitor.dm" -#include "code\modules\tgui\modules\gyrotron_control.dm" -#include "code\modules\tgui\modules\law_manager.dm" -#include "code\modules\tgui\modules\overmap.dm" -#include "code\modules\tgui\modules\power_monitor.dm" -#include "code\modules\tgui\modules\rcon.dm" -#include "code\modules\tgui\modules\rustcore_monitor.dm" -#include "code\modules\tgui\modules\rustfuel_control.dm" -#include "code\modules\tgui\modules\shutoff_monitor.dm" -#include "code\modules\tgui\modules\supermatter_monitor.dm" -#include "code\modules\tgui\modules\teleporter.dm" -#include "code\modules\tgui\modules\ntos-only\cardmod.dm" -#include "code\modules\tgui\modules\ntos-only\configurator.dm" -#include "code\modules\tgui\modules\ntos-only\email.dm" -#include "code\modules\tgui\modules\ntos-only\uav.dm" -#include "code\modules\tgui\states\admin.dm" -#include "code\modules\tgui\states\always.dm" -#include "code\modules\tgui\states\conscious.dm" -#include "code\modules\tgui\states\contained.dm" -#include "code\modules\tgui\states\deep_inventory.dm" -#include "code\modules\tgui\states\default.dm" -#include "code\modules\tgui\states\hands.dm" -#include "code\modules\tgui\states\human_adjacent.dm" -#include "code\modules\tgui\states\inventory.dm" -#include "code\modules\tgui\states\inventory_vr.dm" -#include "code\modules\tgui\states\not_incapacitated.dm" -#include "code\modules\tgui\states\notcontained.dm" -#include "code\modules\tgui\states\observer.dm" -#include "code\modules\tgui\states\physical.dm" -#include "code\modules\tgui\states\self.dm" -#include "code\modules\tgui\states\vorepanel_vr.dm" -#include "code\modules\tgui\states\zlevel.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\turbolift\_turbolift.dm" -#include "code\modules\turbolift\turbolift.dm" -#include "code\modules\turbolift\turbolift_areas.dm" -#include "code\modules\turbolift\turbolift_console.dm" -#include "code\modules\turbolift\turbolift_console_vr.dm" -#include "code\modules\turbolift\turbolift_door.dm" -#include "code\modules\turbolift\turbolift_door_vr.dm" -#include "code\modules\turbolift\turbolift_floor.dm" -#include "code\modules\turbolift\turbolift_map.dm" -#include "code\modules\turbolift\turbolift_turfs.dm" -#include "code\modules\vchat\vchat_client.dm" -#include "code\modules\vchat\vchat_db.dm" -#include "code\modules\vehicles\bike.dm" -#include "code\modules\vehicles\boat.dm" -#include "code\modules\vehicles\cargo_train.dm" -#include "code\modules\vehicles\construction.dm" -#include "code\modules\vehicles\quad.dm" -#include "code\modules\vehicles\train.dm" -#include "code\modules\vehicles\vehicle.dm" -#include "code\modules\ventcrawl\ventcrawl.dm" -#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" -#include "code\modules\ventcrawl\ventcrawl_multiz.dm" -#include "code\modules\ventcrawl\ventcrawl_verb.dm" -#include "code\modules\virus2\admin.dm" -#include "code\modules\virus2\analyser.dm" -#include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\centrifuge.dm" -#include "code\modules\virus2\curer.dm" -#include "code\modules\virus2\disease2.dm" -#include "code\modules\virus2\diseasesplicer.dm" -#include "code\modules\virus2\dishincubator.dm" -#include "code\modules\virus2\effect.dm" -#include "code\modules\virus2\effect_vr.dm" -#include "code\modules\virus2\helpers.dm" -#include "code\modules\virus2\isolator.dm" -#include "code\modules\virus2\items_devices.dm" -#include "code\modules\vore\hook-defs_vr.dm" -#include "code\modules\vore\trycatch_vr.dm" -#include "code\modules\vore\appearance\preferences_vr.dm" -#include "code\modules\vore\appearance\update_icons_vr.dm" -#include "code\modules\vore\eating\belly_dat_vr.dm" -#include "code\modules\vore\eating\belly_obj_vr.dm" -#include "code\modules\vore\eating\bellymodes_datum_vr.dm" -#include "code\modules\vore\eating\bellymodes_vr.dm" -#include "code\modules\vore\eating\contaminate_vr.dm" -#include "code\modules\vore\eating\digest_act_vr.dm" -#include "code\modules\vore\eating\leave_remains_vr.dm" -#include "code\modules\vore\eating\living_vr.dm" -#include "code\modules\vore\eating\silicon_vr.dm" -#include "code\modules\vore\eating\simple_animal_vr.dm" -#include "code\modules\vore\eating\transforming_vr.dm" -#include "code\modules\vore\eating\vore_vr.dm" -#include "code\modules\vore\eating\vorehooks_vr.dm" -#include "code\modules\vore\eating\vorepanel_vr.dm" -#include "code\modules\vore\fluffstuff\custom_boxes_vr.dm" -#include "code\modules\vore\fluffstuff\custom_clothes_vr.dm" -#include "code\modules\vore\fluffstuff\custom_items_vr.dm" -#include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" -#include "code\modules\vore\fluffstuff\custom_permits_vr.dm" -#include "code\modules\vore\persist\persist_vr.dm" -#include "code\modules\vore\resizing\grav_pull_vr.dm" -#include "code\modules\vore\resizing\holder_micro_vr.dm" -#include "code\modules\vore\resizing\resize_vr.dm" -#include "code\modules\vore\resizing\sizegun_vr.dm" -#include "code\modules\vore\smoleworld\smoleworld_vr.dm" -#include "code\modules\vore\weight\fitness_machines_vr.dm" -#include "code\modules\webhooks\_webhook.dm" -#include "code\modules\webhooks\webhook_ahelp2discord.dm" -#include "code\modules\webhooks\webhook_custom_event.dm" -#include "code\modules\webhooks\webhook_fax2discord.dm" -#include "code\modules\webhooks\webhook_roundend.dm" -#include "code\modules\webhooks\webhook_roundprep.dm" -#include "code\modules\webhooks\webhook_roundstart.dm" -#include "code\modules\xenoarcheaology\anomaly_container.dm" -#include "code\modules\xenoarcheaology\boulder.dm" -#include "code\modules\xenoarcheaology\effect.dm" -#include "code\modules\xenoarcheaology\manuals.dm" -#include "code\modules\xenoarcheaology\misc.dm" -#include "code\modules\xenoarcheaology\sampling.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact_vr.dm" -#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" -#include "code\modules\xenoarcheaology\artifacts\crystal.dm" -#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" -#include "code\modules\xenoarcheaology\artifacts\replicator.dm" -#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm" -#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm" -#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm" -#include "code\modules\xenoarcheaology\effects\badfeeling.dm" -#include "code\modules\xenoarcheaology\effects\berserk.dm" -#include "code\modules\xenoarcheaology\effects\cannibal.dm" -#include "code\modules\xenoarcheaology\effects\cellcharge.dm" -#include "code\modules\xenoarcheaology\effects\celldrain.dm" -#include "code\modules\xenoarcheaology\effects\cold.dm" -#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" -#include "code\modules\xenoarcheaology\effects\electric_field.dm" -#include "code\modules\xenoarcheaology\effects\emp.dm" -#include "code\modules\xenoarcheaology\effects\feysight.dm" -#include "code\modules\xenoarcheaology\effects\forcefield.dm" -#include "code\modules\xenoarcheaology\effects\gaia.dm" -#include "code\modules\xenoarcheaology\effects\gasco2.dm" -#include "code\modules\xenoarcheaology\effects\gasnitro.dm" -#include "code\modules\xenoarcheaology\effects\gasoxy.dm" -#include "code\modules\xenoarcheaology\effects\gasphoron.dm" -#include "code\modules\xenoarcheaology\effects\gassleeping.dm" -#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" -#include "code\modules\xenoarcheaology\effects\gravitational_waves.dm" -#include "code\modules\xenoarcheaology\effects\heal.dm" -#include "code\modules\xenoarcheaology\effects\heat.dm" -#include "code\modules\xenoarcheaology\effects\hurt.dm" -#include "code\modules\xenoarcheaology\effects\poltergeist.dm" -#include "code\modules\xenoarcheaology\effects\radiate.dm" -#include "code\modules\xenoarcheaology\effects\resurrect.dm" -#include "code\modules\xenoarcheaology\effects\roboheal.dm" -#include "code\modules\xenoarcheaology\effects\robohurt.dm" -#include "code\modules\xenoarcheaology\effects\sleepy.dm" -#include "code\modules\xenoarcheaology\effects\stun.dm" -#include "code\modules\xenoarcheaology\effects\teleport.dm" -#include "code\modules\xenoarcheaology\effects\vampire.dm" -#include "code\modules\xenoarcheaology\finds\eguns.dm" -#include "code\modules\xenoarcheaology\finds\eguns_vr.dm" -#include "code\modules\xenoarcheaology\finds\find_spawning.dm" -#include "code\modules\xenoarcheaology\finds\finds.dm" -#include "code\modules\xenoarcheaology\finds\finds_defines.dm" -#include "code\modules\xenoarcheaology\finds\fossils.dm" -#include "code\modules\xenoarcheaology\finds\misc.dm" -#include "code\modules\xenoarcheaology\finds\special.dm" -#include "code\modules\xenoarcheaology\finds\talking.dm" -#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" -#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" -#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" -#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" -#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" -#include "code\modules\xenoarcheaology\tools\equipment.dm" -#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" -#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" -#include "code\modules\xenoarcheaology\tools\tools.dm" -#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" -#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" -#include "code\modules\xenoarcheaology\tools\tools_vr.dm" -#include "code\modules\xenobio\items\extracts.dm" -#include "code\modules\xenobio\items\slime_objects.dm" -#include "code\modules\xenobio\items\slimepotions.dm" -#include "code\modules\xenobio\items\weapons.dm" -#include "code\modules\xenobio\machinery\processor.dm" -#include "code\modules\xgm\xgm_gas_data.dm" -#include "code\modules\xgm\xgm_gas_mixture.dm" -#include "code\unit_tests\decl_tests.dm" -#include "code\unit_tests\language_tests.dm" -#include "code\unit_tests\loadout_tests.dm" -#include "code\unit_tests\map_tests.dm" -#include "code\unit_tests\material_tests.dm" -#include "code\unit_tests\mob_tests.dm" -#include "code\unit_tests\recipe_tests.dm" -#include "code\unit_tests\research_tests.dm" -#include "code\unit_tests\sqlite_tests.dm" -#include "code\unit_tests\subsystem_tests.dm" -#include "code\unit_tests\unit_test.dm" -#include "code\unit_tests\unit_test_vr.dm" -#include "code\unit_tests\vore_tests_vr.dm" -#include "code\unit_tests\zas_tests.dm" -#include "code\unit_tests\integrated_circuits\arithmetic.dm" -#include "code\unit_tests\integrated_circuits\circuits.dm" -#include "code\unit_tests\integrated_circuits\converter.dm" -#include "code\unit_tests\integrated_circuits\logic.dm" -#include "code\unit_tests\integrated_circuits\trig.dm" -#include "code\ZAS\Airflow.dm" -#include "code\ZAS\Atom.dm" -#include "code\ZAS\Connection.dm" -#include "code\ZAS\ConnectionGroup.dm" -#include "code\ZAS\ConnectionManager.dm" -#include "code\ZAS\Controller.dm" -#include "code\ZAS\Debug.dm" -#include "code\ZAS\Diagnostic.dm" -#include "code\ZAS\Fire.dm" -#include "code\ZAS\Phoron.dm" -#include "code\ZAS\Turf.dm" -#include "code\ZAS\Variable Settings.dm" -#include "code\ZAS\Zone.dm" -#include "interface\interface.dm" -#include "interface\skin.dmf" -#include "maps\gateway_archive_vr\blackmarketpackers.dm" -#include "maps\offmap_vr\om_ships\abductor.dm" -#include "maps\southern_cross\items\clothing\sc_accessory.dm" -#include "maps\southern_cross\items\clothing\sc_suit.dm" -#include "maps\southern_cross\items\clothing\sc_under.dm" -#include "maps\southern_cross\loadout\loadout_suit.dm" -#include "maps\southern_cross\loadout\loadout_uniform.dm" -#include "maps\southern_cross\loadout\loadout_vr.dm" -#include "maps\submaps\_helpers.dm" -#include "maps\submaps\_readme.dm" -#include "maps\submaps\engine_submaps\engine.dm" -#include "maps\submaps\engine_submaps\engine_areas.dm" -#include "maps\submaps\engine_submaps_vr\tether\_engine_submaps.dm" -#include "maps\submaps\space_submaps\space.dm" -#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" -#include "maps\submaps\surface_submaps\mountains\mountains.dm" -#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" -#include "maps\submaps\surface_submaps\mountains\mountains_areas_vr.dm" -#include "maps\submaps\surface_submaps\plains\plains.dm" -#include "maps\submaps\surface_submaps\plains\plains_areas.dm" -#include "maps\submaps\surface_submaps\wilderness\wilderness.dm" -#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" -#include "maps\tether\tether.dm" -#include "maps\~map_system\maps.dm" -// END_INCLUDE -======= -// DM Environment file for baystation12.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. - // New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES -// BEGIN_INCLUDE -#include "code\_away_mission_tests.dm" -#include "code\_macros.dm" -#include "code\_macros_vr.dm" -#include "code\_map_tests.dm" -#include "code\_unit_tests.dm" -#include "code\global.dm" -#include "code\global_init.dm" -#include "code\global_vr.dm" -#include "code\hub.dm" -#include "code\names.dm" -#include "code\stylesheet.dm" -#include "code\world.dm" -#include "code\__datastructures\globals.dm" -#include "code\__defines\__513_compatibility.dm" -#include "code\__defines\_compile_options.dm" -#include "code\__defines\_lists.dm" -#include "code\__defines\_planes+layers.dm" -#include "code\__defines\_planes+layers_vr.dm" -#include "code\__defines\_protect.dm" -#include "code\__defines\_tick.dm" -#include "code\__defines\admin.dm" -#include "code\__defines\admin_vr.dm" -#include "code\__defines\appearance.dm" -#include "code\__defines\atmos.dm" -#include "code\__defines\belly_modes_vr.dm" -#include "code\__defines\callbacks.dm" -#include "code\__defines\chemistry.dm" -#include "code\__defines\chemistry_vr.dm" -#include "code\__defines\color.dm" -#include "code\__defines\construction.dm" -#include "code\__defines\crafting.dm" -#include "code\__defines\damage_organs.dm" -#include "code\__defines\dna.dm" -#include "code\__defines\exosuit_fab.dm" -#include "code\__defines\flags.dm" -#include "code\__defines\gamemode.dm" -#include "code\__defines\holomap.dm" -#include "code\__defines\hoses.dm" -#include "code\__defines\input.dm" -#include "code\__defines\instruments.dm" -#include "code\__defines\integrated_circuits.dm" -#include "code\__defines\inventory_sizes.dm" -#include "code\__defines\is_helpers.dm" -#include "code\__defines\items_clothing.dm" -#include "code\__defines\lighting.dm" -#include "code\__defines\lighting_vr.dm" -#include "code\__defines\machinery.dm" -#include "code\__defines\map.dm" -#include "code\__defines\materials.dm" -#include "code\__defines\math.dm" -#include "code\__defines\math_physics.dm" -#include "code\__defines\MC.dm" -#include "code\__defines\misc.dm" -#include "code\__defines\misc_vr.dm" -#include "code\__defines\mobs.dm" -#include "code\__defines\mobs_vr.dm" -#include "code\__defines\nifsoft.dm" -#include "code\__defines\objects.dm" -#include "code\__defines\overmap.dm" -#include "code\__defines\pda.dm" -#include "code\__defines\planets.dm" -#include "code\__defines\planets_vr.dm" -#include "code\__defines\plants.dm" -#include "code\__defines\preferences.dm" -#include "code\__defines\process_scheduler.dm" -#include "code\__defines\qdel.dm" -#include "code\__defines\research.dm" -#include "code\__defines\roguemining_vr.dm" -#include "code\__defines\rust_g.dm" -#include "code\__defines\shields.dm" -#include "code\__defines\shuttle.dm" -#include "code\__defines\sound.dm" -#include "code\__defines\spaceman_dmm.dm" -#include "code\__defines\species_languages.dm" -#include "code\__defines\species_languages_vr.dm" -#include "code\__defines\sprite_sheets.dm" -#include "code\__defines\sqlite_defines.dm" -#include "code\__defines\stat_tracking.dm" -#include "code\__defines\subsystems.dm" -#include "code\__defines\supply.dm" -#include "code\__defines\targeting.dm" -#include "code\__defines\tgs.config.dm" -#include "code\__defines\tgs.dm" -#include "code\__defines\tgui.dm" -#include "code\__defines\tools.dm" -#include "code\__defines\turfs.dm" -#include "code\__defines\typeids.dm" -#include "code\__defines\unit_tests.dm" -#include "code\__defines\vote.dm" -#include "code\__defines\vv.dm" -#include "code\__defines\webhooks.dm" -#include "code\__defines\wires.dm" -#include "code\__defines\xenoarcheaology.dm" -#include "code\__defines\ZAS.dm" -#include "code\__defines\dcs\flags.dm" -#include "code\__defines\dcs\helpers.dm" -#include "code\__defines\dcs\signals.dm" -#include "code\_global_vars\bitfields.dm" -#include "code\_global_vars\misc.dm" -#include "code\_global_vars\mobs.dm" -#include "code\_global_vars\religion.dm" -#include "code\_global_vars\sensitive.dm" -#include "code\_global_vars\typecache.dm" -#include "code\_global_vars\lists\mapping.dm" -#include "code\_global_vars\lists\misc.dm" -#include "code\_global_vars\lists\species.dm" -#include "code\_helpers\_global_objects.dm" -#include "code\_helpers\_global_objects_vr.dm" -#include "code\_helpers\_lists.dm" -#include "code\_helpers\atmospherics.dm" -#include "code\_helpers\atom_movables.dm" -#include "code\_helpers\events.dm" -#include "code\_helpers\files.dm" -#include "code\_helpers\game.dm" -#include "code\_helpers\global_lists.dm" -#include "code\_helpers\global_lists_vr.dm" -#include "code\_helpers\icons.dm" -#include "code\_helpers\icons_vr.dm" -#include "code\_helpers\lighting.dm" -#include "code\_helpers\logging.dm" -#include "code\_helpers\logging_vr.dm" -#include "code\_helpers\matrices.dm" -#include "code\_helpers\mobs.dm" -#include "code\_helpers\names.dm" -#include "code\_helpers\sanitize_values.dm" -#include "code\_helpers\storage.dm" -#include "code\_helpers\string_lists.dm" -#include "code\_helpers\text.dm" -#include "code\_helpers\time.dm" -#include "code\_helpers\turfs.dm" -#include "code\_helpers\type2type.dm" -#include "code\_helpers\unsorted.dm" -#include "code\_helpers\unsorted_vr.dm" -#include "code\_helpers\view.dm" -#include "code\_helpers\visual_filters.dm" -#include "code\_helpers\sorts\__main.dm" -#include "code\_helpers\sorts\comparators.dm" -#include "code\_helpers\sorts\TimSort.dm" -#include "code\_onclick\_defines.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\rig.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\_defines_vr.dm" -#include "code\_onclick\hud\ability_screen_objects.dm" -#include "code\_onclick\hud\action.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alert_vr.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\gun_mode.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\map_popups.dm" -#include "code\_onclick\hud\minihud.dm" -#include "code\_onclick\hud\minihud_mapper.dm" -#include "code\_onclick\hud\minihud_rigmech.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\other_mobs.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\radial_persistent.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\robot_vr.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\screen_objects_vr.dm" -#include "code\_onclick\hud\skybox.dm" -#include "code\_onclick\hud\soulcatcher_guest.dm" -#include "code\_onclick\hud\spell_screen_objects.dm" -#include "code\ATMOSPHERICS\_atmos_setup.dm" -#include "code\ATMOSPHERICS\_atmospherics_helpers.dm" -#include "code\ATMOSPHERICS\atmospherics.dm" -#include "code\ATMOSPHERICS\datum_pipe_network.dm" -#include "code\ATMOSPHERICS\datum_pipeline.dm" -#include "code\ATMOSPHERICS\components\portables_connector.dm" -#include "code\ATMOSPHERICS\components\shutoff.dm" -#include "code\ATMOSPHERICS\components\tvalve.dm" -#include "code\ATMOSPHERICS\components\valve.dm" -#include "code\ATMOSPHERICS\components\binary_devices\algae_generator_vr.dm" -#include "code\ATMOSPHERICS\components\binary_devices\binary_atmos_base.dm" -#include "code\ATMOSPHERICS\components\binary_devices\circulator.dm" -#include "code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate.dm" -#include "code\ATMOSPHERICS\components\binary_devices\passive_gate_vr.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pipeturbine.dm" -#include "code\ATMOSPHERICS\components\binary_devices\pump.dm" -#include "code\ATMOSPHERICS\components\binary_devices\volume_pump.dm" -#include "code\ATMOSPHERICS\components\omni_devices\_omni_extras.dm" -#include "code\ATMOSPHERICS\components\omni_devices\filter.dm" -#include "code\ATMOSPHERICS\components\omni_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\omni_devices\omni_base.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\filter.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\mixer.dm" -#include "code\ATMOSPHERICS\components\trinary_devices\trinary_base.dm" -#include "code\ATMOSPHERICS\components\unary\cold_sink.dm" -#include "code\ATMOSPHERICS\components\unary\heat_exchanger.dm" -#include "code\ATMOSPHERICS\components\unary\heat_source.dm" -#include "code\ATMOSPHERICS\components\unary\outlet_injector.dm" -#include "code\ATMOSPHERICS\components\unary\unary_base.dm" -#include "code\ATMOSPHERICS\components\unary\vent_pump.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber.dm" -#include "code\ATMOSPHERICS\components\unary\vent_scrubber_vr.dm" -#include "code\ATMOSPHERICS\pipes\cap.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes.dm" -#include "code\ATMOSPHERICS\pipes\he_pipes_vr.dm" -#include "code\ATMOSPHERICS\pipes\manifold.dm" -#include "code\ATMOSPHERICS\pipes\manifold4w.dm" -#include "code\ATMOSPHERICS\pipes\pipe_base.dm" -#include "code\ATMOSPHERICS\pipes\pipe_base_vr.dm" -#include "code\ATMOSPHERICS\pipes\simple.dm" -#include "code\ATMOSPHERICS\pipes\tank.dm" -#include "code\ATMOSPHERICS\pipes\tank_vr.dm" -#include "code\ATMOSPHERICS\pipes\universal.dm" -#include "code\ATMOSPHERICS\pipes\vent.dm" -#include "code\controllers\autotransfer.dm" -#include "code\controllers\communications.dm" -#include "code\controllers\configuration.dm" -#include "code\controllers\configuration_vr.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\emergency_shuttle_controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\master_controller.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\verbs.dm" -#include "code\controllers\observer_listener\atom\observer.dm" -#include "code\controllers\subsystems\ai.dm" -#include "code\controllers\subsystems\aifast.dm" -#include "code\controllers\subsystems\air.dm" -#include "code\controllers\subsystems\airflow.dm" -#include "code\controllers\subsystems\alarm.dm" -#include "code\controllers\subsystems\assets.dm" -#include "code\controllers\subsystems\atoms.dm" -#include "code\controllers\subsystems\character_setup.dm" -#include "code\controllers\subsystems\chat.dm" -#include "code\controllers\subsystems\chemistry.dm" -#include "code\controllers\subsystems\circuits.dm" -#include "code\controllers\subsystems\dcs.dm" -#include "code\controllers\subsystems\events.dm" -#include "code\controllers\subsystems\garbage.dm" -#include "code\controllers\subsystems\holomaps.dm" -#include "code\controllers\subsystems\inactivity.dm" -#include "code\controllers\subsystems\input.dm" -#include "code\controllers\subsystems\job.dm" -#include "code\controllers\subsystems\lighting.dm" -#include "code\controllers\subsystems\machines.dm" -#include "code\controllers\subsystems\mapping.dm" -#include "code\controllers\subsystems\media_tracks.dm" -#include "code\controllers\subsystems\mobs.dm" -#include "code\controllers\subsystems\nightshift.dm" -#include "code\controllers\subsystems\orbits.dm" -#include "code\controllers\subsystems\overlays.dm" -#include "code\controllers\subsystems\persist_vr.dm" -#include "code\controllers\subsystems\persistence.dm" -#include "code\controllers\subsystems\planets.dm" -#include "code\controllers\subsystems\plants.dm" -#include "code\controllers\subsystems\radiation.dm" -#include "code\controllers\subsystems\shuttles.dm" -#include "code\controllers\subsystems\skybox.dm" -#include "code\controllers\subsystems\sounds.dm" -#include "code\controllers\subsystems\sqlite.dm" -#include "code\controllers\subsystems\sun.dm" -#include "code\controllers\subsystems\supply.dm" -#include "code\controllers\subsystems\tgui.dm" -#include "code\controllers\subsystems\ticker.dm" -#include "code\controllers\subsystems\time_track.dm" -#include "code\controllers\subsystems\timer.dm" -#include "code\controllers\subsystems\transcore_vr.dm" -#include "code\controllers\subsystems\vis_overlays.dm" -#include "code\controllers\subsystems\vote.dm" -#include "code\controllers\subsystems\webhooks.dm" -#include "code\controllers\subsystems\xenoarch.dm" -#include "code\controllers\subsystems\processing\bellies_vr.dm" -#include "code\controllers\subsystems\processing\fastprocess.dm" -#include "code\controllers\subsystems\processing\instruments.dm" -#include "code\controllers\subsystems\processing\obj.dm" -#include "code\controllers\subsystems\processing\processing.dm" -#include "code\controllers\subsystems\processing\projectiles.dm" -#include "code\controllers\subsystems\processing\turfs.dm" -#include "code\datums\ai_law_sets.dm" -#include "code\datums\ai_law_sets_vr.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\category.dm" -#include "code\datums\chat_message.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\EPv2.dm" -#include "code\datums\ghost_query.dm" -#include "code\datums\ghost_query_vr.dm" -#include "code\datums\hierarchy.dm" -#include "code\datums\mind.dm" -#include "code\datums\mind_vr.dm" -#include "code\datums\mixed.dm" -#include "code\datums\modules.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\orbit.dm" -#include "code\datums\organs.dm" -#include "code\datums\position_point_vector.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\reference_tracking.dm" -#include "code\datums\riding.dm" -#include "code\datums\soul_link.dm" -#include "code\datums\sun.dm" -#include "code\datums\weakref.dm" -#include "code\datums\autolathe\arms.dm" -#include "code\datums\autolathe\arms_vr.dm" -#include "code\datums\autolathe\autolathe.dm" -#include "code\datums\autolathe\devices.dm" -#include "code\datums\autolathe\devices_vr.dm" -#include "code\datums\autolathe\engineering.dm" -#include "code\datums\autolathe\engineering_vr.dm" -#include "code\datums\autolathe\general.dm" -#include "code\datums\autolathe\general_vr.dm" -#include "code\datums\autolathe\materials.dm" -#include "code\datums\autolathe\medical.dm" -#include "code\datums\autolathe\medical_vr.dm" -#include "code\datums\autolathe\tools.dm" -#include "code\datums\autolathe\tools_vr.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\overlay_lighting.dm" -#include "code\datums\components\resize_guard.dm" -#include "code\datums\components\crafting\crafting.dm" -#include "code\datums\components\crafting\crafting_external.dm" -#include "code\datums\components\crafting\recipes.dm" -#include "code\datums\components\crafting\tool_quality.dm" -#include "code\datums\components\crafting\recipes\primitive.dm" -#include "code\datums\components\crafting\recipes\weapons.dm" -#include "code\datums\elements\_element.dm" -#include "code\datums\elements\light_blocking.dm" -#include "code\datums\elements\turf_transparency.dm" -#include "code\datums\game_masters\_common.dm" -#include "code\datums\helper_datums\construction_datum.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\getrev.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\teleport_vr.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\locations\locations.dm" -#include "code\datums\locations\nyx.dm" -#include "code\datums\locations\qerrvallis.dm" -#include "code\datums\locations\s_randarr.dm" -#include "code\datums\locations\sol.dm" -#include "code\datums\locations\tau_ceti.dm" -#include "code\datums\locations\uueoa_esa.dm" -#include "code\datums\locations\vir.dm" -#include "code\datums\looping_sounds\_looping_sound.dm" -#include "code\datums\looping_sounds\item_sounds.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\sequence.dm" -#include "code\datums\looping_sounds\weather_sounds.dm" -#include "code\datums\managed_browsers\_managed_browser.dm" -#include "code\datums\managed_browsers\feedback_form.dm" -#include "code\datums\managed_browsers\feedback_viewer.dm" -#include "code\datums\observation\_debug.dm" -#include "code\datums\observation\_defines.dm" -#include "code\datums\observation\destroyed.dm" -#include "code\datums\observation\dir_set.dm" -#include "code\datums\observation\equipped.dm" -#include "code\datums\observation\helpers.dm" -#include "code\datums\observation\logged_in.dm" -#include "code\datums\observation\moved.dm" -#include "code\datums\observation\observation.dm" -#include "code\datums\observation\power_change.dm" -#include "code\datums\observation\shuttle_added.dm" -#include "code\datums\observation\shuttle_moved.dm" -#include "code\datums\observation\stat_set.dm" -#include "code\datums\observation\turf_changed.dm" -#include "code\datums\observation\turf_enterexit.dm" -#include "code\datums\observation\unequipped.dm" -#include "code\datums\observation\z_moved.dm" -#include "code\datums\observation\~cleanup.dm" -#include "code\datums\outfits\_defines.dm" -#include "code\datums\outfits\horror_killers.dm" -#include "code\datums\outfits\misc.dm" -#include "code\datums\outfits\nanotrasen.dm" -#include "code\datums\outfits\outfit.dm" -#include "code\datums\outfits\outfit_vr.dm" -#include "code\datums\outfits\pirates.dm" -#include "code\datums\outfits\spec_op.dm" -#include "code\datums\outfits\tournament.dm" -#include "code\datums\outfits\wizardry.dm" -#include "code\datums\outfits\costumes\costume.dm" -#include "code\datums\outfits\costumes\halloween.dm" -#include "code\datums\outfits\jobs\cargo.dm" -#include "code\datums\outfits\jobs\civilian.dm" -#include "code\datums\outfits\jobs\civilian_vr.dm" -#include "code\datums\outfits\jobs\command.dm" -#include "code\datums\outfits\jobs\command_vr.dm" -#include "code\datums\outfits\jobs\engineering.dm" -#include "code\datums\outfits\jobs\job.dm" -#include "code\datums\outfits\jobs\medical.dm" -#include "code\datums\outfits\jobs\medical_vr.dm" -#include "code\datums\outfits\jobs\misc.dm" -#include "code\datums\outfits\jobs\science.dm" -#include "code\datums\outfits\jobs\science_vr.dm" -#include "code\datums\outfits\jobs\security.dm" -#include "code\datums\outfits\jobs\special_vr.dm" -#include "code\datums\outfits\military\fleet.dm" -#include "code\datums\outfits\military\marines.dm" -#include "code\datums\outfits\military\military.dm" -#include "code\datums\outfits\military\sifguard.dm" -#include "code\datums\repositories\ammomaterial.dm" -#include "code\datums\repositories\cameras.dm" -#include "code\datums\repositories\crew.dm" -#include "code\datums\repositories\decls.dm" -#include "code\datums\repositories\repository.dm" -#include "code\datums\repositories\unique.dm" -#include "code\datums\roundstats\_defines_local.dm" -#include "code\datums\roundstats\departmentgoal.dm" -#include "code\datums\roundstats\roundstats.dm" -#include "code\datums\supplypacks\atmospherics.dm" -#include "code\datums\supplypacks\contraband.dm" -#include "code\datums\supplypacks\contraband_vr.dm" -#include "code\datums\supplypacks\costumes.dm" -#include "code\datums\supplypacks\costumes_vr.dm" -#include "code\datums\supplypacks\engineering.dm" -#include "code\datums\supplypacks\engineering_vr.dm" -#include "code\datums\supplypacks\hospitality.dm" -#include "code\datums\supplypacks\hospitality_vr.dm" -#include "code\datums\supplypacks\hydroponics.dm" -#include "code\datums\supplypacks\hydroponics_vr.dm" -#include "code\datums\supplypacks\materials.dm" -#include "code\datums\supplypacks\medical.dm" -#include "code\datums\supplypacks\medical_vr.dm" -#include "code\datums\supplypacks\misc.dm" -#include "code\datums\supplypacks\misc_vr.dm" -#include "code\datums\supplypacks\munitions.dm" -#include "code\datums\supplypacks\munitions_vr.dm" -#include "code\datums\supplypacks\musical.dm" -#include "code\datums\supplypacks\recreation.dm" -#include "code\datums\supplypacks\recreation_vr.dm" -#include "code\datums\supplypacks\robotics.dm" -#include "code\datums\supplypacks\robotics_vr.dm" -#include "code\datums\supplypacks\science.dm" -#include "code\datums\supplypacks\science_vr.dm" -#include "code\datums\supplypacks\security.dm" -#include "code\datums\supplypacks\security_vr.dm" -#include "code\datums\supplypacks\supply.dm" -#include "code\datums\supplypacks\supply_vr.dm" -#include "code\datums\supplypacks\supplypacks.dm" -#include "code\datums\supplypacks\voidsuits.dm" -#include "code\datums\supplypacks\voidsuits_vr.dm" -#include "code\datums\underwear\bottom.dm" -#include "code\datums\underwear\socks.dm" -#include "code\datums\underwear\top.dm" -#include "code\datums\underwear\undershirts.dm" -#include "code\datums\underwear\underwear.dm" -#include "code\datums\uplink\ammunition.dm" -#include "code\datums\uplink\ammunition_vr.dm" -#include "code\datums\uplink\announcements.dm" -#include "code\datums\uplink\armor.dm" -#include "code\datums\uplink\backup.dm" -#include "code\datums\uplink\badassery.dm" -#include "code\datums\uplink\grenades.dm" -#include "code\datums\uplink\hardsuit_modules.dm" -#include "code\datums\uplink\implants.dm" -#include "code\datums\uplink\medical.dm" -#include "code\datums\uplink\medical_vr.dm" -#include "code\datums\uplink\resources.dm" -#include "code\datums\uplink\stealth_items.dm" -#include "code\datums\uplink\stealthy_weapons.dm" -#include "code\datums\uplink\telecrystals.dm" -#include "code\datums\uplink\tools.dm" -#include "code\datums\uplink\tools_vr.dm" -#include "code\datums\uplink\uplink_categories.dm" -#include "code\datums\uplink\uplink_items.dm" -#include "code\datums\uplink\visible_weapons.dm" -#include "code\datums\uplink\visible_weapons_vr.dm" -#include "code\datums\vending\stored_item.dm" -#include "code\datums\vending\vending.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\alarm.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\camera.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\grid_checker.dm" -#include "code\datums\wires\jukebox.dm" -#include "code\datums\wires\mines.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\seedstorage.dm" -#include "code\datums\wires\shield_generator.dm" -#include "code\datums\wires\smartfridge.dm" -#include "code\datums\wires\smes.dm" -#include "code\datums\wires\suit_storage_unit.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\datums\wires\wires.dm" -#include "code\defines\gases.dm" -#include "code\defines\obj.dm" -#include "code\defines\obj\weapon.dm" -#include "code\defines\procs\announce.dm" -#include "code\defines\procs\AStar.dm" -#include "code\defines\procs\dbcore.dm" -#include "code\defines\procs\radio.dm" -#include "code\defines\procs\statistics.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\atoms_movable_vr.dm" -#include "code\game\base_turf.dm" -#include "code\game\periodic_news.dm" -#include "code\game\response_team.dm" -#include "code\game\response_team_vr.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\skincmd.dm" -#include "code\game\sound.dm" -#include "code\game\trader_visit.dm" -#include "code\game\trader_visit_vr.dm" -#include "code\game\world.dm" -#include "code\game\antagonist\_antagonist_setup.dm" -#include "code\game\antagonist\antagonist.dm" -#include "code\game\antagonist\antagonist_add.dm" -#include "code\game\antagonist\antagonist_create.dm" -#include "code\game\antagonist\antagonist_equip.dm" -#include "code\game\antagonist\antagonist_factions.dm" -#include "code\game\antagonist\antagonist_helpers.dm" -#include "code\game\antagonist\antagonist_objectives.dm" -#include "code\game\antagonist\antagonist_panel.dm" -#include "code\game\antagonist\antagonist_place.dm" -#include "code\game\antagonist\antagonist_print.dm" -#include "code\game\antagonist\antagonist_update.dm" -#include "code\game\antagonist\alien\borer.dm" -#include "code\game\antagonist\alien\xenomorph.dm" -#include "code\game\antagonist\outsider\commando.dm" -#include "code\game\antagonist\outsider\deathsquad.dm" -#include "code\game\antagonist\outsider\ert.dm" -#include "code\game\antagonist\outsider\ert_vr.dm" -#include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\ninja.dm" -#include "code\game\antagonist\outsider\raider.dm" -#include "code\game\antagonist\outsider\technomancer.dm" -#include "code\game\antagonist\outsider\trader.dm" -#include "code\game\antagonist\outsider\wizard.dm" -#include "code\game\antagonist\station\changeling.dm" -#include "code\game\antagonist\station\cultist.dm" -#include "code\game\antagonist\station\highlander.dm" -#include "code\game\antagonist\station\infiltrator.dm" -#include "code\game\antagonist\station\loyalist.dm" -#include "code\game\antagonist\station\renegade.dm" -#include "code\game\antagonist\station\revolutionary.dm" -#include "code\game\antagonist\station\rogue_ai.dm" -#include "code\game\antagonist\station\stowaway.dm" -#include "code\game\antagonist\station\thug.dm" -#include "code\game\antagonist\station\traitor.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\areas_vr.dm" -#include "code\game\area\asteroid_areas.dm" -#include "code\game\area\Away Mission areas.dm" -#include "code\game\area\Space Station 13 areas.dm" -#include "code\game\area\Space Station 13 areas_vr.dm" -#include "code\game\area\ss13_deprecated_areas.dm" -#include "code\game\dna\dna2.dm" -#include "code\game\dna\dna2_domutcheck.dm" -#include "code\game\dna\dna2_helpers.dm" -#include "code\game\dna\dna_modifier.dm" -#include "code\game\dna\genes\disabilities.dm" -#include "code\game\dna\genes\gene.dm" -#include "code\game\dna\genes\powers.dm" -#include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\game_mode_latespawn.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\setupgame.dm" -#include "code\game\gamemodes\calamity\calamity.dm" -#include "code\game\gamemodes\changeling\absorbed_dna.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\changeling_powers.dm" -#include "code\game\gamemodes\changeling\generic_equip_procs.dm" -#include "code\game\gamemodes\changeling\modularchangling.dm" -#include "code\game\gamemodes\changeling\powers\absorb.dm" -#include "code\game\gamemodes\changeling\powers\armblade.dm" -#include "code\game\gamemodes\changeling\powers\armor.dm" -#include "code\game\gamemodes\changeling\powers\augmented_eyesight.dm" -#include "code\game\gamemodes\changeling\powers\bioelectrogenesis.dm" -#include "code\game\gamemodes\changeling\powers\blind_sting.dm" -#include "code\game\gamemodes\changeling\powers\boost_range.dm" -#include "code\game\gamemodes\changeling\powers\cryo_sting.dm" -#include "code\game\gamemodes\changeling\powers\darkvision.dm" -#include "code\game\gamemodes\changeling\powers\deaf_sting.dm" -#include "code\game\gamemodes\changeling\powers\delayed_toxin_sting.dm" -#include "code\game\gamemodes\changeling\powers\digital_camo.dm" -#include "code\game\gamemodes\changeling\powers\electric_lockpick.dm" -#include "code\game\gamemodes\changeling\powers\endoarmor.dm" -#include "code\game\gamemodes\changeling\powers\enfeebling_string.dm" -#include "code\game\gamemodes\changeling\powers\engorged_glands.dm" -#include "code\game\gamemodes\changeling\powers\enrage.dm" -#include "code\game\gamemodes\changeling\powers\epinephrine_overdose.dm" -#include "code\game\gamemodes\changeling\powers\escape_restraints.dm" -#include "code\game\gamemodes\changeling\powers\extract_dna_sting.dm" -#include "code\game\gamemodes\changeling\powers\fabricate_clothing.dm" -#include "code\game\gamemodes\changeling\powers\fake_death.dm" -#include "code\game\gamemodes\changeling\powers\fleshmend.dm" -#include "code\game\gamemodes\changeling\powers\hivemind.dm" -#include "code\game\gamemodes\changeling\powers\mimic_voice.dm" -#include "code\game\gamemodes\changeling\powers\panacea.dm" -#include "code\game\gamemodes\changeling\powers\rapid_regen.dm" -#include "code\game\gamemodes\changeling\powers\recursive_enhancement.dm" -#include "code\game\gamemodes\changeling\powers\respec.dm" -#include "code\game\gamemodes\changeling\powers\revive.dm" -#include "code\game\gamemodes\changeling\powers\self_respiration.dm" -#include "code\game\gamemodes\changeling\powers\shriek.dm" -#include "code\game\gamemodes\changeling\powers\silence_sting.dm" -#include "code\game\gamemodes\changeling\powers\transform.dm" -#include "code\game\gamemodes\changeling\powers\visible_camouflage.dm" -#include "code\game\gamemodes\cult\construct_spells.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\cult\cult_items.dm" -#include "code\game\gamemodes\cult\cult_structures.dm" -#include "code\game\gamemodes\cult\hell_universe.dm" -#include "code\game\gamemodes\cult\narsie.dm" -#include "code\game\gamemodes\cult\ritual.dm" -#include "code\game\gamemodes\cult\runes.dm" -#include "code\game\gamemodes\cult\soulstone.dm" -#include "code\game\gamemodes\cult\talisman.dm" -#include "code\game\gamemodes\cult\cultify\mob.dm" -#include "code\game\gamemodes\cult\cultify\obj.dm" -#include "code\game\gamemodes\cult\cultify\turf.dm" -#include "code\game\gamemodes\endgame\endgame.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\blob.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" -#include "code\game\gamemodes\events\black_hole.dm" -#include "code\game\gamemodes\events\clang.dm" -#include "code\game\gamemodes\events\dust.dm" -#include "code\game\gamemodes\events\power_failure.dm" -#include "code\game\gamemodes\events\wormholes.dm" -#include "code\game\gamemodes\events\holidays\Christmas.dm" -#include "code\game\gamemodes\events\holidays\Holidays.dm" -#include "code\game\gamemodes\events\holidays\Other.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\heist\heist.dm" -#include "code\game\gamemodes\infiltrator\infiltrator.dm" -#include "code\game\gamemodes\malfunction\malf_hardware.dm" -#include "code\game\gamemodes\malfunction\malf_research.dm" -#include "code\game\gamemodes\malfunction\malf_research_ability.dm" -#include "code\game\gamemodes\malfunction\malfunction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm" -#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\meteor\meteors_vr.dm" -#include "code\game\gamemodes\mixed\conflux.dm" -#include "code\game\gamemodes\mixed\infestation.dm" -#include "code\game\gamemodes\mixed\intrigue.dm" -#include "code\game\gamemodes\mixed\lizard.dm" -#include "code\game\gamemodes\mixed\mercrenegade.dm" -#include "code\game\gamemodes\mixed\mercwiz.dm" -#include "code\game\gamemodes\mixed\paranoia.dm" -#include "code\game\gamemodes\mixed\traitorling.dm" -#include "code\game\gamemodes\mixed\traitorrenegade.dm" -#include "code\game\gamemodes\mixed\uprising.dm" -#include "code\game\gamemodes\mixed\visitors.dm" -#include "code\game\gamemodes\ninja\ninja.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\nuclear\pinpointer.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\technomancer\catalog.dm" -#include "code\game\gamemodes\technomancer\clothing.dm" -#include "code\game\gamemodes\technomancer\core_obj.dm" -#include "code\game\gamemodes\technomancer\equipment.dm" -#include "code\game\gamemodes\technomancer\instability.dm" -#include "code\game\gamemodes\technomancer\spell_objs.dm" -#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" -#include "code\game\gamemodes\technomancer\technomancer.dm" -#include "code\game\gamemodes\technomancer\assistance\assistance.dm" -#include "code\game\gamemodes\technomancer\devices\boots_of_speed.dm" -#include "code\game\gamemodes\technomancer\devices\disposable_teleporter.dm" -#include "code\game\gamemodes\technomancer\devices\gloves_of_regen.dm" -#include "code\game\gamemodes\technomancer\devices\hypos.dm" -#include "code\game\gamemodes\technomancer\devices\implants.dm" -#include "code\game\gamemodes\technomancer\devices\shield_armor.dm" -#include "code\game\gamemodes\technomancer\devices\tesla_armor.dm" -#include "code\game\gamemodes\technomancer\spells\abjuration.dm" -#include "code\game\gamemodes\technomancer\spells\apportation.dm" -#include "code\game\gamemodes\technomancer\spells\audible_deception.dm" -#include "code\game\gamemodes\technomancer\spells\blink.dm" -#include "code\game\gamemodes\technomancer\spells\chroma.dm" -#include "code\game\gamemodes\technomancer\spells\condensation.dm" -#include "code\game\gamemodes\technomancer\spells\control.dm" -#include "code\game\gamemodes\technomancer\spells\dispel.dm" -#include "code\game\gamemodes\technomancer\spells\energy_siphon.dm" -#include "code\game\gamemodes\technomancer\spells\flame_tongue.dm" -#include "code\game\gamemodes\technomancer\spells\gambit.dm" -#include "code\game\gamemodes\technomancer\spells\illusion.dm" -#include "code\game\gamemodes\technomancer\spells\instability_tap.dm" -#include "code\game\gamemodes\technomancer\spells\mark_recall.dm" -#include "code\game\gamemodes\technomancer\spells\mend_organs.dm" -#include "code\game\gamemodes\technomancer\spells\oxygenate.dm" -#include "code\game\gamemodes\technomancer\spells\passwall.dm" -#include "code\game\gamemodes\technomancer\spells\phase_shift.dm" -#include "code\game\gamemodes\technomancer\spells\radiance.dm" -#include "code\game\gamemodes\technomancer\spells\reflect.dm" -#include "code\game\gamemodes\technomancer\spells\resurrect.dm" -#include "code\game\gamemodes\technomancer\spells\shared_burden.dm" -#include "code\game\gamemodes\technomancer\spells\shield.dm" -#include "code\game\gamemodes\technomancer\spells\targeting_matrix.dm" -#include "code\game\gamemodes\technomancer\spells\track.dm" -#include "code\game\gamemodes\technomancer\spells\warp_strike.dm" -#include "code\game\gamemodes\technomancer\spells\aura\aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\biomed_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\fire_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" -#include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_all.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_life.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\mend_synthetic.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\purify.dm" -#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\ionic_bolt.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\lesser_chain_lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\lightning.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\overload.dm" -#include "code\game\gamemodes\technomancer\spells\projectile\projectile.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\darkness.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\destablize.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\fire_blast.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\pulsar.dm" -#include "code\game\gamemodes\technomancer\spells\spawner\spawner.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon_creature.dm" -#include "code\game\gamemodes\technomancer\spells\summon\summon_ward.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\jobs\_access_defs.dm" -#include "code\game\jobs\access.dm" -#include "code\game\jobs\access_datum.dm" -#include "code\game\jobs\access_datum_vr.dm" -#include "code\game\jobs\job_controller.dm" -#include "code\game\jobs\jobs.dm" -#include "code\game\jobs\whitelist.dm" -#include "code\game\jobs\whitelist_vr.dm" -#include "code\game\jobs\job\_alt_title.dm" -#include "code\game\jobs\job\assistant.dm" -#include "code\game\jobs\job\assistant_vr.dm" -#include "code\game\jobs\job\captain.dm" -#include "code\game\jobs\job\captain_vr.dm" -#include "code\game\jobs\job\civilian.dm" -#include "code\game\jobs\job\civilian_chaplain.dm" -#include "code\game\jobs\job\civilian_vr.dm" -#include "code\game\jobs\job\department.dm" -#include "code\game\jobs\job\department_vr.dm" -#include "code\game\jobs\job\engineering.dm" -#include "code\game\jobs\job\engineering_vr.dm" -#include "code\game\jobs\job\exploration_vr.dm" -#include "code\game\jobs\job\job.dm" -#include "code\game\jobs\job\job_vr.dm" -#include "code\game\jobs\job\medical.dm" -#include "code\game\jobs\job\medical_vr.dm" -#include "code\game\jobs\job\offduty_vr.dm" -#include "code\game\jobs\job\science.dm" -#include "code\game\jobs\job\science_vr.dm" -#include "code\game\jobs\job\security.dm" -#include "code\game\jobs\job\security_vr.dm" -#include "code\game\jobs\job\silicon.dm" -#include "code\game\jobs\job\silicon_vr.dm" -#include "code\game\jobs\job\special_vr.dm" -#include "code\game\machinery\adv_med.dm" -#include "code\game\machinery\adv_med_vr.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\air_alarm.dm" -#include "code\game\machinery\airconditioner_vr.dm" -#include "code\game\machinery\atmo_control.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\biogenerator.dm" -#include "code\game\machinery\bioprinter.dm" -#include "code\game\machinery\bomb_tester_vr.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\buttons_vr.dm" -#include "code\game\machinery\CableLayer.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\cryo.dm" -#include "code\game\machinery\cryopod.dm" -#include "code\game\machinery\cryopod_vr.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\deployable_vr.dm" -#include "code\game\machinery\door_control.dm" -#include "code\game\machinery\doorbell_vr.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\exonet_node.dm" -#include "code\game\machinery\fire_alarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\floodlight.dm" -#include "code\game\machinery\floor_light.dm" -#include "code\game\machinery\floorlayer.dm" -#include "code\game\machinery\frame.dm" -#include "code\game\machinery\gear_dispenser.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\holoposter.dm" -#include "code\game\machinery\holosign.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\jukebox.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\machinery.dm" -#include "code\game\machinery\machinery_power.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\neonsign.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\nuclear_bomb.dm" -#include "code\game\machinery\OpTable.dm" -#include "code\game\machinery\overview.dm" -#include "code\game\machinery\oxygen_pump.dm" -#include "code\game\machinery\painter_vr.dm" -#include "code\game\machinery\partslathe_vr.dm" -#include "code\game\machinery\pda_multicaster.dm" -#include "code\game\machinery\pointdefense.dm" -#include "code\game\machinery\portable_turret.dm" -#include "code\game\machinery\portable_turret_vr.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\requests_console_vr.dm" -#include "code\game\machinery\robot_fabricator.dm" -#include "code\game\machinery\seed_extractor.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\status_display_ai.dm" -#include "code\game\machinery\suit_cycler_datums.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\suit_storage_unit_vr.dm" -#include "code\game\machinery\supply_display.dm" -#include "code\game\machinery\supplybeacon.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebeacon_vr.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transportpod.dm" -#include "code\game\machinery\turret_control.dm" -#include "code\game\machinery\vending_machines_vr.dm" -#include "code\game\machinery\vitals_monitor.dm" -#include "code\game\machinery\wall_frames.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer.dm" -#include "code\game\machinery\atmoalter\area_atmos_computer_vr.dm" -#include "code\game\machinery\atmoalter\canister.dm" -#include "code\game\machinery\atmoalter\clamp.dm" -#include "code\game\machinery\atmoalter\meter.dm" -#include "code\game\machinery\atmoalter\portable_atmospherics.dm" -#include "code\game\machinery\atmoalter\pump.dm" -#include "code\game\machinery\atmoalter\pump_vr.dm" -#include "code\game\machinery\atmoalter\scrubber.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\camera_vr.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\ai_core.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\arcade_vr.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_vr.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\computer.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\guestpass.dm" -#include "code\game\machinery\computer\id_restorer_vr.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\message.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\prisoner.dm" -#include "code\game\machinery\computer\prisonshuttle.dm" -#include "code\game\machinery\computer\RCON_Console.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\shutoff_monitor.dm" -#include "code\game\machinery\computer\shuttle.dm" -#include "code\game\machinery\computer\skills.dm" -#include "code\game\machinery\computer\specops_shuttle.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\supply.dm" -#include "code\game\machinery\computer\syndicate_specops_shuttle.dm" -#include "code\game\machinery\computer\timeclock_vr.dm" -#include "code\game\machinery\computer\~computer_vr.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_control.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_vr.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\blast_door.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\door_vr.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\firedoor_assembly.dm" -#include "code\game\machinery\doors\firedoor_vr.dm" -#include "code\game\machinery\doors\multi_tile.dm" -#include "code\game\machinery\doors\multi_tile_vr.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\airlock_controllers.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" -#include "code\game\machinery\embedded_controller\airlock_program.dm" -#include "code\game\machinery\embedded_controller\docking_program.dm" -#include "code\game\machinery\embedded_controller\docking_program_multi.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\embedded_program_base.dm" -#include "code\game\machinery\embedded_controller\mapping_helpers.dm" -#include "code\game\machinery\embedded_controller\simple_docking_controller.dm" -#include "code\game\machinery\event\stage_vr.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\pipe\pipe_recipes.dm" -#include "code\game\machinery\pipe\pipelayer.dm" -#include "code\game\machinery\reagents\pump.dm" -#include "code\game\machinery\telecomms\broadcaster.dm" -#include "code\game\machinery\telecomms\broadcaster_vr.dm" -#include "code\game\machinery\telecomms\logbrowser.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\presets.dm" -#include "code\game\machinery\telecomms\presets_vr.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" -#include "code\game\machinery\virtual_reality\ar_console.dm" -#include "code\game\machinery\virtual_reality\vr_console.dm" -#include "code\game\magic\Uristrunes.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mech_prosthetics.dm" -#include "code\game\mecha\mech_sensor.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_appearance.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_helpers.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_vr.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\fighter.dm" -#include "code\game\mecha\combat\gorilla.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\components\_component.dm" -#include "code\game\mecha\components\actuators.dm" -#include "code\game\mecha\components\armor.dm" -#include "code\game\mecha\components\electrical.dm" -#include "code\game\mecha\components\hull.dm" -#include "code\game\mecha\components\lifesupport.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\mecha_equipment_dynamicprocs.dm" -#include "code\game\mecha\equipment\tools\armor_melee.dm" -#include "code\game\mecha\equipment\tools\armor_ranged.dm" -#include "code\game\mecha\equipment\tools\cable_layer.dm" -#include "code\game\mecha\equipment\tools\catapult.dm" -#include "code\game\mecha\equipment\tools\clamp.dm" -#include "code\game\mecha\equipment\tools\cloak.dm" -#include "code\game\mecha\equipment\tools\drill.dm" -#include "code\game\mecha\equipment\tools\energy_relay.dm" -#include "code\game\mecha\equipment\tools\extinguisher.dm" -#include "code\game\mecha\equipment\tools\generator.dm" -#include "code\game\mecha\equipment\tools\hardpoint_actuator.dm" -#include "code\game\mecha\equipment\tools\inflatables.dm" -#include "code\game\mecha\equipment\tools\jetpack.dm" -#include "code\game\mecha\equipment\tools\medigun_vr.dm" -#include "code\game\mecha\equipment\tools\orescanner.dm" -#include "code\game\mecha\equipment\tools\passenger.dm" -#include "code\game\mecha\equipment\tools\powertool.dm" -#include "code\game\mecha\equipment\tools\rcd.dm" -#include "code\game\mecha\equipment\tools\repair_droid.dm" -#include "code\game\mecha\equipment\tools\running_board.dm" -#include "code\game\mecha\equipment\tools\shield.dm" -#include "code\game\mecha\equipment\tools\shield_omni.dm" -#include "code\game\mecha\equipment\tools\sleeper.dm" -#include "code\game\mecha\equipment\tools\speedboost.dm" -#include "code\game\mecha\equipment\tools\syringe_gun.dm" -#include "code\game\mecha\equipment\tools\teleporter.dm" -#include "code\game\mecha\equipment\tools\tools.dm" -#include "code\game\mecha\equipment\tools\weldinglaser.dm" -#include "code\game\mecha\equipment\tools\wormhole.dm" -#include "code\game\mecha\equipment\weapons\honk.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\equipment\weapons\ballistic\automatic.dm" -#include "code\game\mecha\equipment\weapons\ballistic\ballistic.dm" -#include "code\game\mecha\equipment\weapons\ballistic\mortar.dm" -#include "code\game\mecha\equipment\weapons\ballistic\shotgun.dm" -#include "code\game\mecha\equipment\weapons\defense\shocker.dm" -#include "code\game\mecha\equipment\weapons\energy\energy.dm" -#include "code\game\mecha\equipment\weapons\energy\ion.dm" -#include "code\game\mecha\equipment\weapons\energy\laser.dm" -#include "code\game\mecha\equipment\weapons\energy\phased.dm" -#include "code\game\mecha\equipment\weapons\energy\pulse.dm" -#include "code\game\mecha\equipment\weapons\energy\stun.dm" -#include "code\game\mecha\equipment\weapons\explosive\grenade.dm" -#include "code\game\mecha\equipment\weapons\explosive\missile.dm" -#include "code\game\mecha\equipment\weapons\fire\flamethrower.dm" -#include "code\game\mecha\equipment\weapons\fire\incendiary.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\medical\odysseus_vr.dm" -#include "code\game\mecha\micro\mecha_construction_paths_vr.dm" -#include "code\game\mecha\micro\mecha_parts_vr.dm" -#include "code\game\mecha\micro\mecha_vr.dm" -#include "code\game\mecha\micro\mechfab_designs_vr.dm" -#include "code\game\mecha\micro\micro.dm" -#include "code\game\mecha\micro\micro_equipment.dm" -#include "code\game\mecha\micro\security.dm" -#include "code\game\mecha\micro\utility.dm" -#include "code\game\mecha\space\hoverpod.dm" -#include "code\game\mecha\space\shuttle.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\ripley_vr.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\banners.dm" -#include "code\game\objects\banners_vr.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\explosion.dm" -#include "code\game\objects\explosion_recursive.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\mob_spawner_vr.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\stumble_into_vr.dm" -#include "code\game\objects\weapons.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\confetti_vr.dm" -#include "code\game\objects\effects\effect_system.dm" -#include "code\game\objects\effects\explosion_particles.dm" -#include "code\game\objects\effects\gibs.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\item_pickup_ghost.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\landmarks_vr.dm" -#include "code\game\objects\effects\manifest.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\semirandom_mobs_vr.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\spiders_vr.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\zone_divider.dm" -#include "code\game\objects\effects\alien\aliens.dm" -#include "code\game\objects\effects\chem\chemsmoke.dm" -#include "code\game\objects\effects\chem\coating.dm" -#include "code\game\objects\effects\chem\foam.dm" -#include "code\game\objects\effects\chem\foam_vr.dm" -#include "code\game\objects\effects\chem\water.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\warning_stripes.dm" -#include "code\game\objects\effects\decals\Cleanable\aliens.dm" -#include "code\game\objects\effects\decals\Cleanable\fuel.dm" -#include "code\game\objects\effects\decals\Cleanable\humans.dm" -#include "code\game\objects\effects\decals\Cleanable\misc.dm" -#include "code\game\objects\effects\decals\Cleanable\robots.dm" -#include "code\game\objects\effects\decals\Cleanable\tracks.dm" -#include "code\game\objects\effects\decals\posters\bs12.dm" -#include "code\game\objects\effects\decals\posters\polarisposters.dm" -#include "code\game\objects\effects\decals\posters\polarisposters_vr.dm" -#include "code\game\objects\effects\decals\posters\posters.dm" -#include "code\game\objects\effects\decals\posters\tgposters.dm" -#include "code\game\objects\effects\decals\posters\voreposters_vr.dm" -#include "code\game\objects\effects\map_effects\beam_point.dm" -#include "code\game\objects\effects\map_effects\effect_emitter.dm" -#include "code\game\objects\effects\map_effects\map_effects.dm" -#include "code\game\objects\effects\map_effects\perma_light.dm" -#include "code\game\objects\effects\map_effects\portal.dm" -#include "code\game\objects\effects\map_effects\radiation_emitter.dm" -#include "code\game\objects\effects\map_effects\screen_shaker.dm" -#include "code\game\objects\effects\map_effects\sound_emitter.dm" -#include "code\game\objects\effects\prop\columnblast.dm" -#include "code\game\objects\effects\prop\snake.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\graffiti.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "code\game\objects\items\antag_spawners.dm" -#include "code\game\objects\items\apc_frame.dm" -#include "code\game\objects\items\bells.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\contraband_vr.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\falling_object_vr.dm" -#include "code\game\objects\items\glassjar.dm" -#include "code\game\objects\items\gunbox.dm" -#include "code\game\objects\items\gunbox_vr.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\paintkit.dm" -#include "code\game\objects\items\pizza_voucher_vr.dm" -#include "code\game\objects\items\poi_items.dm" -#include "code\game\objects\items\robobag.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\tailoring.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\trash_material.dm" -#include "code\game\objects\items\trash_vr.dm" -#include "code\game\objects\items\uav.dm" -#include "code\game\objects\items\devices\advnifrepair.dm" -#include "code\game\objects\items\devices\ai_detector.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\binoculars.dm" -#include "code\game\objects\items\devices\body_snatcher_vr.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\debugger.dm" -#include "code\game\objects\items\devices\defib.dm" -#include "code\game\objects\items\devices\denecrotizer_vr.dm" -#include "code\game\objects\items\devices\flash.dm" -#include "code\game\objects\items\devices\flash_vr.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\flashlight_vr.dm" -#include "code\game\objects\items\devices\floor_painter.dm" -#include "code\game\objects\items\devices\geiger.dm" -#include "code\game\objects\items\devices\gps.dm" -#include "code\game\objects\items\devices\hacktool.dm" -#include "code\game\objects\items\devices\holowarrant.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\modkit.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\scanners_vr.dm" -#include "code\game\objects\items\devices\spy_bug.dm" -#include "code\game\objects\items\devices\suit_cooling.dm" -#include "code\game\objects\items\devices\t_scanner.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\text_to_speech.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\translator.dm" -#include "code\game\objects\items\devices\translocator_vr.dm" -#include "code\game\objects\items\devices\tvcamera.dm" -#include "code\game\objects\items\devices\uplink.dm" -#include "code\game\objects\items\devices\uplink_random_lists.dm" -#include "code\game\objects\items\devices\whistle.dm" -#include "code\game\objects\items\devices\communicator\communicator.dm" -#include "code\game\objects\items\devices\communicator\helper.dm" -#include "code\game\objects\items\devices\communicator\integrated.dm" -#include "code\game\objects\items\devices\communicator\messaging.dm" -#include "code\game\objects\items\devices\communicator\phone.dm" -#include "code\game\objects\items\devices\communicator\UI_tgui.dm" -#include "code\game\objects\items\devices\radio\beacon.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\encryptionkey_vr.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\headset_vr.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\jammer.dm" -#include "code\game\objects\items\devices\radio\jammer_vr.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\devices\radio\radio_vr.dm" -#include "code\game\objects\items\devices\radio\radiopack.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\robot\robot_upgrades_vr.dm" -#include "code\game\objects\items\stacks\marker_beacons.dm" -#include "code\game\objects\items\stacks\matter_synth.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\medical_vr.dm" -#include "code\game\objects\items\stacks\nanopaste.dm" -#include "code\game\objects\items\stacks\nanopaste_vr.dm" -#include "code\game\objects\items\stacks\sandbags.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\tickets.dm" -#include "code\game\objects\items\stacks\tiles\fifty_spawner_tiles.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\toys\balls_vr.dm" -#include "code\game\objects\items\toys\godfigures.dm" -#include "code\game\objects\items\toys\mech_toys.dm" -#include "code\game\objects\items\toys\toys.dm" -#include "code\game\objects\items\toys\toys_vr.dm" -#include "code\game\objects\items\weapons\AI_modules.dm" -#include "code\game\objects\items\weapons\AI_modules_vr.dm" -#include "code\game\objects\items\weapons\augment_items.dm" -#include "code\game\objects\items\weapons\autopsy.dm" -#include "code\game\objects\items\weapons\bones.dm" -#include "code\game\objects\items\weapons\candle.dm" -#include "code\game\objects\items\weapons\canes.dm" -#include "code\game\objects\items\weapons\cards_ids_vr.dm" -#include "code\game\objects\items\weapons\chewables.dm" -#include "code\game\objects\items\weapons\cigs_lighters.dm" -#include "code\game\objects\items\weapons\clown_items.dm" -#include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\dna_injector.dm" -#include "code\game\objects\items\weapons\ecigs.dm" -#include "code\game\objects\items\weapons\explosives.dm" -#include "code\game\objects\items\weapons\explosives_vr.dm" -#include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\flamethrower.dm" -#include "code\game\objects\items\weapons\gift_wrappaper.dm" -#include "code\game\objects\items\weapons\handcuffs.dm" -#include "code\game\objects\items\weapons\handcuffs_vr.dm" -#include "code\game\objects\items\weapons\improvised_components.dm" -#include "code\game\objects\items\weapons\inducer_vr.dm" -#include "code\game\objects\items\weapons\manuals.dm" -#include "code\game\objects\items\weapons\manuals_vr.dm" -#include "code\game\objects\items\weapons\mop.dm" -#include "code\game\objects\items\weapons\mop_deploy.dm" -#include "code\game\objects\items\weapons\paint.dm" -#include "code\game\objects\items\weapons\paiwire.dm" -#include "code\game\objects\items\weapons\policetape.dm" -#include "code\game\objects\items\weapons\RCD.dm" -#include "code\game\objects\items\weapons\RCD_vr.dm" -#include "code\game\objects\items\weapons\RMS_vr.dm" -#include "code\game\objects\items\weapons\RPD_vr.dm" -#include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" -#include "code\game\objects\items\weapons\shields.dm" -#include "code\game\objects\items\weapons\shields_vr.dm" -#include "code\game\objects\items\weapons\stunbaton.dm" -#include "code\game\objects\items\weapons\surgery_tools.dm" -#include "code\game\objects\items\weapons\swords_axes_etc.dm" -#include "code\game\objects\items\weapons\syndie.dm" -#include "code\game\objects\items\weapons\tape.dm" -#include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\towels.dm" -#include "code\game\objects\items\weapons\traps.dm" -#include "code\game\objects\items\weapons\traps_vr.dm" -#include "code\game\objects\items\weapons\trays.dm" -#include "code\game\objects\items\weapons\weaponry.dm" -#include "code\game\objects\items\weapons\weldbackpack.dm" -#include "code\game\objects\items\weapons\circuitboards\broken.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm" -#include "code\game\objects\items\weapons\circuitboards\circuitboards_vr.dm" -#include "code\game\objects\items\weapons\circuitboards\frame.dm" -#include "code\game\objects\items\weapons\circuitboards\mecha.dm" -#include "code\game\objects\items\weapons\circuitboards\other.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\camera_monitor.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\computer.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\research.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\shuttle.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\supply.dm" -#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\fluidpump.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\kitchen_appliances.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\telecomms.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\unary_atmos.dm" -#include "code\game\objects\items\weapons\grenades\anti_photon_grenade.dm" -#include "code\game\objects\items\weapons\grenades\chem_grenade.dm" -#include "code\game\objects\items\weapons\grenades\concussion.dm" -#include "code\game\objects\items\weapons\grenades\emgrenade.dm" -#include "code\game\objects\items\weapons\grenades\explosive.dm" -#include "code\game\objects\items\weapons\grenades\flashbang.dm" -#include "code\game\objects\items\weapons\grenades\grenade.dm" -#include "code\game\objects\items\weapons\grenades\projectile.dm" -#include "code\game\objects\items\weapons\grenades\smokebomb.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\spawnergrenade_vr.dm" -#include "code\game\objects\items\weapons\grenades\supermatter.dm" -#include "code\game\objects\items\weapons\id cards\cards.dm" -#include "code\game\objects\items\weapons\id cards\cards_vr.dm" -#include "code\game\objects\items\weapons\id cards\id_stacks.dm" -#include "code\game\objects\items\weapons\id cards\id_stacks_vr.dm" -#include "code\game\objects\items\weapons\id cards\station_ids.dm" -#include "code\game\objects\items\weapons\id cards\station_ids_vr.dm" -#include "code\game\objects\items\weapons\id cards\syndicate_ids.dm" -#include "code\game\objects\items\weapons\implants\implant.dm" -#include "code\game\objects\items\weapons\implants\implant_vr.dm" -#include "code\game\objects\items\weapons\implants\implantaugment.dm" -#include "code\game\objects\items\weapons\implants\implantcase.dm" -#include "code\game\objects\items\weapons\implants\implantcase_vr.dm" -#include "code\game\objects\items\weapons\implants\implantchair.dm" -#include "code\game\objects\items\weapons\implants\implantcircuits.dm" -#include "code\game\objects\items\weapons\implants\implantdud.dm" -#include "code\game\objects\items\weapons\implants\implanter.dm" -#include "code\game\objects\items\weapons\implants\implanter_vr.dm" -#include "code\game\objects\items\weapons\implants\implantfreedom.dm" -#include "code\game\objects\items\weapons\implants\implantlanguage.dm" -#include "code\game\objects\items\weapons\implants\implantpad.dm" -#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" -#include "code\game\objects\items\weapons\implants\implantrestrainingbolt.dm" -#include "code\game\objects\items\weapons\implants\implantuplink.dm" -#include "code\game\objects\items\weapons\implants\neuralbasic.dm" -#include "code\game\objects\items\weapons\material\ashtray.dm" -#include "code\game\objects\items\weapons\material\bats.dm" -#include "code\game\objects\items\weapons\material\chainsaw.dm" -#include "code\game\objects\items\weapons\material\foam.dm" -#include "code\game\objects\items\weapons\material\gravemarker.dm" -#include "code\game\objects\items\weapons\material\kitchen.dm" -#include "code\game\objects\items\weapons\material\knives.dm" -#include "code\game\objects\items\weapons\material\knives_vr.dm" -#include "code\game\objects\items\weapons\material\material_armor.dm" -#include "code\game\objects\items\weapons\material\material_weapons.dm" -#include "code\game\objects\items\weapons\material\misc.dm" -#include "code\game\objects\items\weapons\material\shards.dm" -#include "code\game\objects\items\weapons\material\shards_vr.dm" -#include "code\game\objects\items\weapons\material\swords.dm" -#include "code\game\objects\items\weapons\material\thrown.dm" -#include "code\game\objects\items\weapons\material\twohanded.dm" -#include "code\game\objects\items\weapons\material\twohanded_vr.dm" -#include "code\game\objects\items\weapons\material\whetstone.dm" -#include "code\game\objects\items\weapons\melee\deflect.dm" -#include "code\game\objects\items\weapons\melee\energy.dm" -#include "code\game\objects\items\weapons\melee\energy_vr.dm" -#include "code\game\objects\items\weapons\melee\misc.dm" -#include "code\game\objects\items\weapons\melee\misc_vr.dm" -#include "code\game\objects\items\weapons\storage\backpack.dm" -#include "code\game\objects\items\weapons\storage\backpack_vr.dm" -#include "code\game\objects\items\weapons\storage\bags.dm" -#include "code\game\objects\items\weapons\storage\bags_vr.dm" -#include "code\game\objects\items\weapons\storage\belt.dm" -#include "code\game\objects\items\weapons\storage\belt_vr.dm" -#include "code\game\objects\items\weapons\storage\bible.dm" -#include "code\game\objects\items\weapons\storage\boxes.dm" -#include "code\game\objects\items\weapons\storage\boxes_vr.dm" -#include "code\game\objects\items\weapons\storage\briefcase.dm" -#include "code\game\objects\items\weapons\storage\egg_vr.dm" -#include "code\game\objects\items\weapons\storage\fancy.dm" -#include "code\game\objects\items\weapons\storage\firstaid.dm" -#include "code\game\objects\items\weapons\storage\firstaid_vr.dm" -#include "code\game\objects\items\weapons\storage\internal.dm" -#include "code\game\objects\items\weapons\storage\laundry_basket.dm" -#include "code\game\objects\items\weapons\storage\lockbox.dm" -#include "code\game\objects\items\weapons\storage\misc.dm" -#include "code\game\objects\items\weapons\storage\mre.dm" -#include "code\game\objects\items\weapons\storage\pouches.dm" -#include "code\game\objects\items\weapons\storage\quickdraw.dm" -#include "code\game\objects\items\weapons\storage\secure.dm" -#include "code\game\objects\items\weapons\storage\storage.dm" -#include "code\game\objects\items\weapons\storage\toolbox.dm" -#include "code\game\objects\items\weapons\storage\toolbox_vr.dm" -#include "code\game\objects\items\weapons\storage\uplink_kits.dm" -#include "code\game\objects\items\weapons\storage\wallets.dm" -#include "code\game\objects\items\weapons\tanks\jetpack.dm" -#include "code\game\objects\items\weapons\tanks\tank_types.dm" -#include "code\game\objects\items\weapons\tanks\tank_types_vr.dm" -#include "code\game\objects\items\weapons\tanks\tanks.dm" -#include "code\game\objects\items\weapons\tools\crowbar.dm" -#include "code\game\objects\items\weapons\tools\crowbar_vr.dm" -#include "code\game\objects\items\weapons\tools\screwdriver.dm" -#include "code\game\objects\items\weapons\tools\weldingtool.dm" -#include "code\game\objects\items\weapons\tools\wirecutters.dm" -#include "code\game\objects\items\weapons\tools\wrench.dm" -#include "code\game\objects\random\_random.dm" -#include "code\game\objects\random\guns_and_ammo.dm" -#include "code\game\objects\random\maintenance.dm" -#include "code\game\objects\random\mapping.dm" -#include "code\game\objects\random\mapping_vr.dm" -#include "code\game\objects\random\mechs.dm" -#include "code\game\objects\random\misc.dm" -#include "code\game\objects\random\misc_vr.dm" -#include "code\game\objects\random\mob.dm" -#include "code\game\objects\random\mob_vr.dm" -#include "code\game\objects\random\spacesuits.dm" -#include "code\game\objects\random\unidentified\medicine.dm" -#include "code\game\objects\structures\artstuff.dm" -#include "code\game\objects\structures\barricades.dm" -#include "code\game\objects\structures\barsign.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\bedsheet_bin_vr.dm" -#include "code\game\objects\structures\bonfire.dm" -#include "code\game\objects\structures\catwalk.dm" -#include "code\game\objects\structures\cliff.dm" -#include "code\game\objects\structures\coathanger.dm" -#include "code\game\objects\structures\curtains.dm" -#include "code\game\objects\structures\dancepole_vr.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\dogbed.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\fence.dm" -#include "code\game\objects\structures\fireaxe.dm" -#include "code\game\objects\structures\fitness.dm" -#include "code\game\objects\structures\fitness_vr.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\gravemarker.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\handrail.dm" -#include "code\game\objects\structures\holoplant.dm" -#include "code\game\objects\structures\inflatable.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_foodcart_vr.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\ledges.dm" -#include "code\game\objects\structures\lightpost.dm" -#include "code\game\objects\structures\loot_piles.dm" -#include "code\game\objects\structures\map_blocker_vr.dm" -#include "code\game\objects\structures\medical_stand_vr.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\morgue_vr.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\railing.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\salvageable.dm" -#include "code\game\objects\structures\signs.dm" -#include "code\game\objects\structures\signs_vr.dm" -#include "code\game\objects\structures\simple_doors.dm" -#include "code\game\objects\structures\simple_doors_vr.dm" -#include "code\game\objects\structures\snowman.dm" -#include "code\game\objects\structures\stasis_cage.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\transit_tubes.dm" -#include "code\game\objects\structures\trash_pile_vr.dm" -#include "code\game\objects\structures\under_wardrobe.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\watercloset_vr.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\window_spawner.dm" -#include "code\game\objects\structures\window_vr.dm" -#include "code\game\objects\structures\alien\alien egg.dm" -#include "code\game\objects\structures\alien\alien.dm" -#include "code\game\objects\structures\crates_lockers\__closets.dm" -#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm" -#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions_vr.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\crates_vr.dm" -#include "code\game\objects\structures\crates_lockers\largecrate.dm" -#include "code\game\objects\structures\crates_lockers\largecrate_vr.dm" -#include "code\game\objects\structures\crates_lockers\vehiclecage.dm" -#include "code\game\objects\structures\crates_lockers\closets\coffin.dm" -#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\egg_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\malfunction.dm" -#include "code\game\objects\structures\crates_lockers\closets\misc_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\statue.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\walllocker.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\guncabinet.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical_vr.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security_vr.dm" -#include "code\game\objects\structures\flora\flora.dm" -#include "code\game\objects\structures\flora\flora_vr.dm" -#include "code\game\objects\structures\flora\grass.dm" -#include "code\game\objects\structures\flora\moretrees_vr.dm" -#include "code\game\objects\structures\flora\trees.dm" -#include "code\game\objects\structures\ghost_pods\event_vr.dm" -#include "code\game\objects\structures\ghost_pods\ghost_pods.dm" -#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" -#include "code\game\objects\structures\ghost_pods\human.dm" -#include "code\game\objects\structures\ghost_pods\mysterious.dm" -#include "code\game\objects\structures\ghost_pods\silicon.dm" -#include "code\game\objects\structures\ghost_pods\silicon_vr.dm" -#include "code\game\objects\structures\props\alien_props.dm" -#include "code\game\objects\structures\props\alien_props_vr.dm" -#include "code\game\objects\structures\props\beam_prism.dm" -#include "code\game\objects\structures\props\blackbox.dm" -#include "code\game\objects\structures\props\fake_ai.dm" -#include "code\game\objects\structures\props\nest.dm" -#include "code\game\objects\structures\props\projectile_lock.dm" -#include "code\game\objects\structures\props\prop.dm" -#include "code\game\objects\structures\props\puzzledoor.dm" -#include "code\game\objects\structures\props\rocks.dm" -#include "code\game\objects\structures\props\swarm.dm" -#include "code\game\objects\structures\props\transmitter.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\alien_nests.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\bed.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\chairs_vr.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" -#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" -#include "code\game\turfs\simulated.dm" -#include "code\game\turfs\simulated_vr.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\turf_changing.dm" -#include "code\game\turfs\turf_flick_animations.dm" -#include "code\game\turfs\unsimulated.dm" -#include "code\game\turfs\flooring\flooring.dm" -#include "code\game\turfs\flooring\flooring_decals.dm" -#include "code\game\turfs\flooring\flooring_decals_vr.dm" -#include "code\game\turfs\flooring\flooring_premade.dm" -#include "code\game\turfs\flooring\flooring_vr.dm" -#include "code\game\turfs\flooring\shuttle_vr.dm" -#include "code\game\turfs\initialization\init.dm" -#include "code\game\turfs\initialization\maintenance.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\floor_acts.dm" -#include "code\game\turfs\simulated\floor_attackby.dm" -#include "code\game\turfs\simulated\floor_damage.dm" -#include "code\game\turfs\simulated\floor_icon.dm" -#include "code\game\turfs\simulated\floor_static.dm" -#include "code\game\turfs\simulated\floor_types.dm" -#include "code\game\turfs\simulated\floor_types_eris.dm" -#include "code\game\turfs\simulated\floor_types_vr.dm" -#include "code\game\turfs\simulated\lava.dm" -#include "code\game\turfs\simulated\wall_attacks.dm" -#include "code\game\turfs\simulated\wall_icon.dm" -#include "code\game\turfs\simulated\wall_types.dm" -#include "code\game\turfs\simulated\wall_types_vr.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\water.dm" -#include "code\game\turfs\simulated\water_vr.dm" -#include "code\game\turfs\simulated\dungeon\floor.dm" -#include "code\game\turfs\simulated\dungeon\wall.dm" -#include "code\game\turfs\simulated\outdoors\atmoscaves_vr.dm" -#include "code\game\turfs\simulated\outdoors\dirt.dm" -#include "code\game\turfs\simulated\outdoors\grass.dm" -#include "code\game\turfs\simulated\outdoors\ironsand_vr.dm" -#include "code\game\turfs\simulated\outdoors\outdoors.dm" -#include "code\game\turfs\simulated\outdoors\outdoors_attackby.dm" -#include "code\game\turfs\simulated\outdoors\outdoors_vr.dm" -#include "code\game\turfs\simulated\outdoors\sky.dm" -#include "code\game\turfs\simulated\outdoors\snow.dm" -#include "code\game\turfs\snow\snow.dm" -#include "code\game\turfs\space\cracked_asteroid.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\game\turfs\unsimulated\beach.dm" -#include "code\game\turfs\unsimulated\beach_vr.dm" -#include "code\game\turfs\unsimulated\floor.dm" -#include "code\game\turfs\unsimulated\planetary.dm" -#include "code\game\turfs\unsimulated\planetary_vr.dm" -#include "code\game\turfs\unsimulated\shuttle.dm" -#include "code\game\turfs\unsimulated\sky_vr.dm" -#include "code\game\turfs\unsimulated\walls.dm" -#include "code\js\byjax.dm" -#include "code\js\menus.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_attack_log.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_memo.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_secrets.dm" -#include "code\modules\admin\admin_tools.dm" -#include "code\modules\admin\admin_verb_lists_vr.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\admin_vr.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\ckey_vr.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\map_capture.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\news.dm" -#include "code\modules\admin\persistence.dm" -#include "code\modules\admin\player_notes.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\ToRban.dm" -#include "code\modules\admin\callproc\callproc.dm" -#include "code\modules\admin\DB ban\functions.dm" -#include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm" -#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm" -#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm" -#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm" -#include "code\modules\admin\secrets\admin_secrets\list_dna.dm" -#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm" -#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm" -#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm" -#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm" -#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm" -#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm" -#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm" -#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm" -#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm" -#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm" -#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm" -#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm" -#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\only_one.dm" -#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" -#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm" -#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm" -#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm" -#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm" -#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm" -#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm" -#include "code\modules\admin\secrets\random_events\gravity_vr.dm" -#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm" -#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminhelp_vr.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\antag-ooc.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\buildmode.dm" -#include "code\modules\admin\verbs\change_appearance.dm" -#include "code\modules\admin\verbs\check_customitem_activity.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\custom_event.dm" -#include "code\modules\admin\verbs\dbcon_fix.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\debug_vr.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\fps.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\grief_fixers.dm" -#include "code\modules\admin\verbs\lightning_strike.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\panicbunker.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\randomverbs_vr.dm" -#include "code\modules\admin\verbs\resize.dm" -#include "code\modules\admin\verbs\smite.dm" -#include "code\modules\admin\verbs\smite_vr.dm" -#include "code\modules\admin\verbs\striketeam.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" -#include "code\modules\admin\view_variables\admin_delete.dm" -#include "code\modules\admin\view_variables\debug_variables.dm" -#include "code\modules\admin\view_variables\get_variables.dm" -#include "code\modules\admin\view_variables\helpers.dm" -#include "code\modules\admin\view_variables\mass_edit_variables.dm" -#include "code\modules\admin\view_variables\modify_variables.dm" -#include "code\modules\admin\view_variables\topic.dm" -#include "code\modules\admin\view_variables\topic_list.dm" -#include "code\modules\admin\view_variables\view_variables.dm" -#include "code\modules\admin\view_variables\view_variables_global.dm" -#include "code\modules\ai\_defines.dm" -#include "code\modules\ai\ai_holder.dm" -#include "code\modules\ai\ai_holder_combat.dm" -#include "code\modules\ai\ai_holder_combat_unseen.dm" -#include "code\modules\ai\ai_holder_communication.dm" -#include "code\modules\ai\ai_holder_cooperation.dm" -#include "code\modules\ai\ai_holder_debug.dm" -#include "code\modules\ai\ai_holder_disabled.dm" -#include "code\modules\ai\ai_holder_fleeing.dm" -#include "code\modules\ai\ai_holder_follow.dm" -#include "code\modules\ai\ai_holder_movement.dm" -#include "code\modules\ai\ai_holder_pathfinding.dm" -#include "code\modules\ai\ai_holder_targeting.dm" -#include "code\modules\ai\ai_holder_targeting_vr.dm" -#include "code\modules\ai\interfaces.dm" -#include "code\modules\ai\say_list.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm" -#include "code\modules\ai\ai_holder_subtypes\simple_mob_ai_vr.dm" -#include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm" -#include "code\modules\alarm\alarm.dm" -#include "code\modules\alarm\alarm_handler.dm" -#include "code\modules\alarm\atmosphere_alarm.dm" -#include "code\modules\alarm\camera_alarm.dm" -#include "code\modules\alarm\fire_alarm.dm" -#include "code\modules\alarm\motion_alarm.dm" -#include "code\modules\alarm\power_alarm.dm" -#include "code\modules\artifice\cursedform.dm" -#include "code\modules\artifice\deadringer.dm" -#include "code\modules\artifice\telecube.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\asset_cache\asset_cache.dm" -#include "code\modules\asset_cache\asset_cache_client.dm" -#include "code\modules\asset_cache\asset_cache_item.dm" -#include "code\modules\asset_cache\asset_list.dm" -#include "code\modules\asset_cache\asset_list_items.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\gateway_vr.dm" -#include "code\modules\awaymissions\loot.dm" -#include "code\modules\awaymissions\loot_vr.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\trigger.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\blob\blob.dm" -#include "code\modules\blob2\_defines.dm" -#include "code\modules\blob2\core_chunk.dm" -#include "code\modules\blob2\blobs\base_blob.dm" -#include "code\modules\blob2\blobs\core.dm" -#include "code\modules\blob2\blobs\factory.dm" -#include "code\modules\blob2\blobs\node.dm" -#include "code\modules\blob2\blobs\normal.dm" -#include "code\modules\blob2\blobs\resource.dm" -#include "code\modules\blob2\blobs\shield.dm" -#include "code\modules\blob2\overmind\overmind.dm" -#include "code\modules\blob2\overmind\powers.dm" -#include "code\modules\blob2\overmind\types.dm" -#include "code\modules\blob2\overmind\types\blazing_oil.dm" -#include "code\modules\blob2\overmind\types\classic.dm" -#include "code\modules\blob2\overmind\types\cryogenic_goo.dm" -#include "code\modules\blob2\overmind\types\ectoplasmic_horror.dm" -#include "code\modules\blob2\overmind\types\electromagnetic_web.dm" -#include "code\modules\blob2\overmind\types\energized_jelly.dm" -#include "code\modules\blob2\overmind\types\explosive_lattice.dm" -#include "code\modules\blob2\overmind\types\fabrication_swarm.dm" -#include "code\modules\blob2\overmind\types\fulminant_organism.dm" -#include "code\modules\blob2\overmind\types\fungal_bloom.dm" -#include "code\modules\blob2\overmind\types\grey_goo.dm" -#include "code\modules\blob2\overmind\types\pressurized_slime.dm" -#include "code\modules\blob2\overmind\types\radioactive_ooze.dm" -#include "code\modules\blob2\overmind\types\ravenous_macrophage.dm" -#include "code\modules\blob2\overmind\types\reactive_spines.dm" -#include "code\modules\blob2\overmind\types\roiling_mold.dm" -#include "code\modules\blob2\overmind\types\shifting_fragments.dm" -#include "code\modules\blob2\overmind\types\synchronous_mesh.dm" -#include "code\modules\blob2\overmind\types\volatile_alluvium.dm" -#include "code\modules\busy_space_vr\air_traffic.dm" -#include "code\modules\busy_space_vr\loremaster.dm" -#include "code\modules\busy_space_vr\organizations.dm" -#include "code\modules\catalogue\atoms.dm" -#include "code\modules\catalogue\catalogue_data.dm" -#include "code\modules\catalogue\catalogue_data_vr.dm" -#include "code\modules\catalogue\cataloguer.dm" -#include "code\modules\catalogue\cataloguer_visuals.dm" -#include "code\modules\catalogue\cataloguer_vr.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" -#include "code\modules\client\client procs_vr.dm" -#include "code\modules\client\movement.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_factions.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_toggle_procs.dm" -#include "code\modules\client\preferences_vr.dm" -#include "code\modules\client\spam_prevention.dm" -#include "code\modules\client\ui_style.dm" -#include "code\modules\client\preference_setup\_defines.dm" -#include "code\modules\client\preference_setup\preference_setup.dm" -#include "code\modules\client\preference_setup\preference_setup_vr.dm" -#include "code\modules\client\preference_setup\antagonism\01_basic.dm" -#include "code\modules\client\preference_setup\antagonism\02_candidacy.dm" -#include "code\modules\client\preference_setup\general\01_basic.dm" -#include "code\modules\client\preference_setup\general\02_language.dm" -#include "code\modules\client\preference_setup\general\03_body.dm" -#include "code\modules\client\preference_setup\general\04_equipment.dm" -#include "code\modules\client\preference_setup\general\05_background.dm" -#include "code\modules\client\preference_setup\general\06_flavor.dm" -#include "code\modules\client\preference_setup\global\01_ui.dm" -#include "code\modules\client\preference_setup\global\02_settings.dm" -#include "code\modules\client\preference_setup\global\03_pai.dm" -#include "code\modules\client\preference_setup\global\04_ooc.dm" -#include "code\modules\client\preference_setup\global\setting_datums.dm" -#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" -#include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout.dm" -#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" -#include "code\modules\client\preference_setup\loadout\loadout_accessories_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cosmetics_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm" -#include "code\modules\client\preference_setup\loadout\loadout_ears.dm" -#include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" -#include "code\modules\client\preference_setup\loadout\loadout_eyes_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_fluffitems_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_general.dm" -#include "code\modules\client\preference_setup\loadout\loadout_general_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_gloves.dm" -#include "code\modules\client\preference_setup\loadout\loadout_gloves_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_head.dm" -#include "code\modules\client\preference_setup\loadout\loadout_head_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_mask.dm" -#include "code\modules\client\preference_setup\loadout\loadout_shoes.dm" -#include "code\modules\client\preference_setup\loadout\loadout_shoes_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_smoking.dm" -#include "code\modules\client\preference_setup\loadout\loadout_suit.dm" -#include "code\modules\client\preference_setup\loadout\loadout_suit_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm" -#include "code\modules\client\preference_setup\loadout\loadout_uniform_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_utility.dm" -#include "code\modules\client\preference_setup\loadout\loadout_utility_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_vr.dm" -#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm" -#include "code\modules\client\preference_setup\loadout\loadout_xeno_vr.dm" -#include "code\modules\client\preference_setup\occupation\occupation.dm" -#include "code\modules\client\preference_setup\skills\skills.dm" -#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" -#include "code\modules\client\preference_setup\volume_sliders\02_media.dm" -#include "code\modules\client\preference_setup\vore\01_ears.dm" -#include "code\modules\client\preference_setup\vore\02_size.dm" -#include "code\modules\client\preference_setup\vore\03_egg.dm" -#include "code\modules\client\preference_setup\vore\04_resleeving.dm" -#include "code\modules\client\preference_setup\vore\05_persistence.dm" -#include "code\modules\client\preference_setup\vore\06_vantag.dm" -#include "code\modules\client\preference_setup\vore\07_traits.dm" -#include "code\modules\client\preference_setup\vore\08_nif.dm" -#include "code\modules\client\preference_setup\vore\09_misc.dm" -#include "code\modules\client\verbs\advanced_who.dm" -#include "code\modules\client\verbs\character_directory.dm" -#include "code\modules\client\verbs\ignore.dm" -#include "code\modules\client\verbs\ooc.dm" -#include "code\modules\client\verbs\ping.dm" -#include "code\modules\client\verbs\suicide.dm" -#include "code\modules\client\verbs\who.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\clothing_accessories.dm" -#include "code\modules\clothing\clothing_icons.dm" -#include "code\modules\clothing\clothing_vr.dm" -#include "code\modules\clothing\ears\earrings.dm" -#include "code\modules\clothing\ears\ears.dm" -#include "code\modules\clothing\glasses\glasses.dm" -#include "code\modules\clothing\glasses\glasses_vr.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\glasses\hud_vr.dm" -#include "code\modules\clothing\gloves\antagonist.dm" -#include "code\modules\clothing\gloves\arm_guards.dm" -#include "code\modules\clothing\gloves\arm_guards_vr.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\gauntlets.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\miscellaneous_vr.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\flowercrowns.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\helmet_vr.dm" -#include "code\modules\clothing\head\hood.dm" -#include "code\modules\clothing\head\hood_vr.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\jobs_vr.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\misc_vr.dm" -#include "code\modules\clothing\head\pilot_helmet.dm" -#include "code\modules\clothing\head\pilot_helmet_vr.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\head\solgov.dm" -#include "code\modules\clothing\head\solgov_vr.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\breath_vr.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\gasmask_vr.dm" -#include "code\modules\clothing\masks\hailer.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\shiny_vr.dm" -#include "code\modules\clothing\masks\voice.dm" -#include "code\modules\clothing\rings\material.dm" -#include "code\modules\clothing\rings\rings.dm" -#include "code\modules\clothing\rings\rings_vr.dm" -#include "code\modules\clothing\shoes\boots.dm" -#include "code\modules\clothing\shoes\boots_vr.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\leg_guards.dm" -#include "code\modules\clothing\shoes\leg_guards_vr.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\shoes\miscellaneous_vr.dm" -#include "code\modules\clothing\spacesuits\alien.dm" -#include "code\modules\clothing\spacesuits\breaches.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\spacesuits.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\rig\rig.dm" -#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm" -#include "code\modules\clothing\spacesuits\rig\rig_pieces_vr.dm" -#include "code\modules\clothing\spacesuits\rig\rig_tgui.dm" -#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" -#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" -#include "code\modules\clothing\spacesuits\rig\modules\modules.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\cloak.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\datajack.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\device.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\electrowarfare.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\grenade_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\inhand_fabricator.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\jetpack.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\metalfoam_launcher.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\mounted_gun_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\pat_module_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\powersink.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\rescue_pharm_vr.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\self_destruct.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\sprinter.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\teleporter.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\vision.dm" -#include "code\modules\clothing\spacesuits\rig\modules\specific\voice.dm" -#include "code\modules\clothing\spacesuits\rig\suits\alien.dm" -#include "code\modules\clothing\spacesuits\rig\suits\combat.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert.dm" -#include "code\modules\clothing\spacesuits\rig\suits\ert_vr.dm" -#include "code\modules\clothing\spacesuits\rig\suits\light.dm" -#include "code\modules\clothing\spacesuits\rig\suits\merc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\pmc.dm" -#include "code\modules\clothing\spacesuits\rig\suits\robotics.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station.dm" -#include "code\modules\clothing\spacesuits\rig\suits\station_vr.dm" -#include "code\modules\clothing\spacesuits\void\ert_vr.dm" -#include "code\modules\clothing\spacesuits\void\event.dm" -#include "code\modules\clothing\spacesuits\void\event_vr.dm" -#include "code\modules\clothing\spacesuits\void\merc.dm" -#include "code\modules\clothing\spacesuits\void\military_vr.dm" -#include "code\modules\clothing\spacesuits\void\station.dm" -#include "code\modules\clothing\spacesuits\void\station_vr.dm" -#include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\void_vr.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" -#include "code\modules\clothing\spacesuits\void\zaddat.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\armor_vr.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\bio_vr.dm" -#include "code\modules\clothing\suits\hooded.dm" -#include "code\modules\clothing\suits\hooded_vr.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\jobs_vr.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\labcoat_vr.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\miscellaneous_vr.dm" -#include "code\modules\clothing\suits\solgov.dm" -#include "code\modules\clothing\suits\solgov_vr.dm" -#include "code\modules\clothing\suits\storage.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\utility_vr.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\suits\aliens\tajara.dm" -#include "code\modules\clothing\suits\aliens\teshari.dm" -#include "code\modules\clothing\suits\aliens\unathi.dm" -#include "code\modules\clothing\suits\aliens\vox.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\imperial_vr.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\miscellaneous_vr.dm" -#include "code\modules\clothing\under\nanotrasen_vr.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shiny_vr.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\solgov.dm" -#include "code\modules\clothing\under\solgov_vr.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\accessories\accessory.dm" -#include "code\modules\clothing\under\accessories\accessory_vr.dm" -#include "code\modules\clothing\under\accessories\armband.dm" -#include "code\modules\clothing\under\accessories\armor.dm" -#include "code\modules\clothing\under\accessories\badges.dm" -#include "code\modules\clothing\under\accessories\clothing.dm" -#include "code\modules\clothing\under\accessories\holster.dm" -#include "code\modules\clothing\under\accessories\holster_vr.dm" -#include "code\modules\clothing\under\accessories\lockets.dm" -#include "code\modules\clothing\under\accessories\permits.dm" -#include "code\modules\clothing\under\accessories\permits_vr.dm" -#include "code\modules\clothing\under\accessories\shiny_vr.dm" -#include "code\modules\clothing\under\accessories\storage.dm" -#include "code\modules\clothing\under\accessories\storage_vr.dm" -#include "code\modules\clothing\under\accessories\torch.dm" -#include "code\modules\clothing\under\accessories\torch_vr.dm" -#include "code\modules\clothing\under\accessories\temperature\poncho.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\clothing\under\xenos\teshari.dm" -#include "code\modules\clothing\under\xenos\vox.dm" -#include "code\modules\compass\_compass.dm" -#include "code\modules\compass\compass_holder.dm" -#include "code\modules\compass\compass_waypoint.dm" -#include "code\modules\compass\~compass.dm" -#include "code\modules\customitems\item_spawning.dm" -#include "code\modules\detectivework\footprints.dm" -#include "code\modules\detectivework\forensics.dm" -#include "code\modules\detectivework\microscope\dnascanner.dm" -#include "code\modules\detectivework\microscope\microscope.dm" -#include "code\modules\detectivework\tools\crimekit.dm" -#include "code\modules\detectivework\tools\evidencebag.dm" -#include "code\modules\detectivework\tools\luminol.dm" -#include "code\modules\detectivework\tools\rag.dm" -#include "code\modules\detectivework\tools\sample_kits.dm" -#include "code\modules\detectivework\tools\scanner.dm" -#include "code\modules\detectivework\tools\storage.dm" -#include "code\modules\detectivework\tools\swabs.dm" -#include "code\modules\detectivework\tools\uvlight.dm" -#include "code\modules\economy\Accounts.dm" -#include "code\modules\economy\Accounts_DB.dm" -#include "code\modules\economy\ATM.dm" -#include "code\modules\economy\cash.dm" -#include "code\modules\economy\cash_register.dm" -#include "code\modules\economy\coins.dm" -#include "code\modules\economy\coins_vr.dm" -#include "code\modules\economy\economy_misc.dm" -#include "code\modules\economy\EFTPOS.dm" -#include "code\modules\economy\Events.dm" -#include "code\modules\economy\Events_Mundane.dm" -#include "code\modules\economy\lorenews.dm" -#include "code\modules\economy\mint.dm" -#include "code\modules\economy\money_bag.dm" -#include "code\modules\economy\price_list.dm" -#include "code\modules\economy\retail_scanner.dm" -#include "code\modules\economy\TradeDestinations.dm" -#include "code\modules\economy\vending.dm" -#include "code\modules\economy\vending_machines.dm" -#include "code\modules\emotes\emote_define.dm" -#include "code\modules\emotes\emote_mob.dm" -#include "code\modules\emotes\definitions\_mob.dm" -#include "code\modules\emotes\definitions\_species.dm" -#include "code\modules\emotes\definitions\audible.dm" -#include "code\modules\emotes\definitions\audible_cough.dm" -#include "code\modules\emotes\definitions\audible_furry_vr.dm" -#include "code\modules\emotes\definitions\audible_scream.dm" -#include "code\modules\emotes\definitions\audible_scream_vr.dm" -#include "code\modules\emotes\definitions\audible_slap.dm" -#include "code\modules\emotes\definitions\audible_snap.dm" -#include "code\modules\emotes\definitions\audible_sneeze.dm" -#include "code\modules\emotes\definitions\audible_whistle.dm" -#include "code\modules\emotes\definitions\exertion.dm" -#include "code\modules\emotes\definitions\helpers_vr.dm" -#include "code\modules\emotes\definitions\human.dm" -#include "code\modules\emotes\definitions\slimes.dm" -#include "code\modules\emotes\definitions\synthetics.dm" -#include "code\modules\emotes\definitions\visible.dm" -#include "code\modules\emotes\definitions\visible_animated.dm" -#include "code\modules\emotes\definitions\visible_vomit.dm" -#include "code\modules\emotes\definitions\visible_vr.dm" -#include "code\modules\entopics_vr\alternate_appearance.dm" -#include "code\modules\entopics_vr\entopics.dm" -#include "code\modules\error_handler\_defines.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\error_handler\~defines.dm" -#include "code\modules\events\apc_damage.dm" -#include "code\modules\events\atmos_leak.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\camera_damage.dm" -#include "code\modules\events\canister_leak.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\comms_blackout.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\drone_pod_vr.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\event.dm" -#include "code\modules\events\event_container.dm" -#include "code\modules\events\event_container_vr.dm" -#include "code\modules\events\event_dynamic.dm" -#include "code\modules\events\event_manager.dm" -#include "code\modules\events\gravity_vr.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\grubinfestation_vr.dm" -#include "code\modules\events\ian_storm_vr.dm" -#include "code\modules\events\infestation.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\maintenance_predator_vr.dm" -#include "code\modules\events\meteor_strike_vr.dm" -#include "code\modules\events\meteors.dm" -#include "code\modules\events\money_hacker.dm" -#include "code\modules\events\money_lotto.dm" -#include "code\modules\events\money_spam.dm" -#include "code\modules\events\morph_spawn_vr.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\random_antagonist.dm" -#include "code\modules\events\rogue_drones.dm" -#include "code\modules\events\shipping_error.dm" -#include "code\modules\events\solar_storm.dm" -#include "code\modules\events\space_ninja.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\spontaneous_appendicitis_vr.dm" -#include "code\modules\events\supply_demand_vr.dm" -#include "code\modules\events\wallrot.dm" -#include "code\modules\examine\examine.dm" -#include "code\modules\examine\stat_icons.dm" -#include "code\modules\examine\descriptions\armor.dm" -#include "code\modules\examine\descriptions\atmospherics.dm" -#include "code\modules\examine\descriptions\containers.dm" -#include "code\modules\examine\descriptions\devices.dm" -#include "code\modules\examine\descriptions\engineering.dm" -#include "code\modules\examine\descriptions\machines.dm" -#include "code\modules\examine\descriptions\medical.dm" -#include "code\modules\examine\descriptions\mobs.dm" -#include "code\modules\examine\descriptions\paperwork.dm" -#include "code\modules\examine\descriptions\stacks.dm" -#include "code\modules\examine\descriptions\structures.dm" -#include "code\modules\examine\descriptions\telecomms.dm" -#include "code\modules\examine\descriptions\turfs.dm" -#include "code\modules\examine\descriptions\weapons.dm" -#include "code\modules\ext_scripts\irc.dm" -#include "code\modules\ext_scripts\python.dm" -#include "code\modules\fishing\fishing.dm" -#include "code\modules\fishing\fishing_net.dm" -#include "code\modules\fishing\fishing_rod.dm" -#include "code\modules\fishing\fishing_rod_vr.dm" -#include "code\modules\fishing\fishing_vr.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\flufftext\look_up.dm" -#include "code\modules\flufftext\TextFilters.dm" -#include "code\modules\food\food.dm" -#include "code\modules\food\recipe.dm" -#include "code\modules\food\recipe_dump.dm" -#include "code\modules\food\recipes_fryer.dm" -#include "code\modules\food\recipes_fryer_vr.dm" -#include "code\modules\food\recipes_grill.dm" -#include "code\modules\food\recipes_microwave.dm" -#include "code\modules\food\recipes_microwave_vr.dm" -#include "code\modules\food\recipes_oven.dm" -#include "code\modules\food\recipes_oven_vr.dm" -#include "code\modules\food\drinkingglass\drinkingglass.dm" -#include "code\modules\food\drinkingglass\extras.dm" -#include "code\modules\food\drinkingglass\glass_boxes.dm" -#include "code\modules\food\drinkingglass\glass_types.dm" -#include "code\modules\food\drinkingglass\metaglass.dm" -#include "code\modules\food\drinkingglass\metaglass_vr.dm" -#include "code\modules\food\drinkingglass\serving_glasses.dm" -#include "code\modules\food\drinkingglass\shaker.dm" -#include "code\modules\food\drinkingglass\shaker_vr.dm" -#include "code\modules\food\food\cans.dm" -#include "code\modules\food\food\cans_vr.dm" -#include "code\modules\food\food\condiment.dm" -#include "code\modules\food\food\drinks.dm" -#include "code\modules\food\food\drinks_vr.dm" -#include "code\modules\food\food\lunch.dm" -#include "code\modules\food\food\sandwich.dm" -#include "code\modules\food\food\snacks.dm" -#include "code\modules\food\food\snacks_vr.dm" -#include "code\modules\food\food\thecake.dm" -#include "code\modules\food\food\z_custom_food_vr.dm" -#include "code\modules\food\food\drinks\bottle.dm" -#include "code\modules\food\food\drinks\cup.dm" -#include "code\modules\food\food\drinks\drinkingglass.dm" -#include "code\modules\food\food\drinks\jar.dm" -#include "code\modules\food\food\drinks\bottle\robot.dm" -#include "code\modules\food\food\snacks\meat.dm" -#include "code\modules\food\glass\bottle.dm" -#include "code\modules\food\glass\bottle_vr.dm" -#include "code\modules\food\glass\bottle\robot.dm" -#include "code\modules\food\kitchen\gibber.dm" -#include "code\modules\food\kitchen\icecream.dm" -#include "code\modules\food\kitchen\microwave.dm" -#include "code\modules\food\kitchen\cooking_machines\_appliance.dm" -#include "code\modules\food\kitchen\cooking_machines\_cooker.dm" -#include "code\modules\food\kitchen\cooking_machines\_cooker_output.dm" -#include "code\modules\food\kitchen\cooking_machines\_mixer.dm" -#include "code\modules\food\kitchen\cooking_machines\candy.dm" -#include "code\modules\food\kitchen\cooking_machines\cereal.dm" -#include "code\modules\food\kitchen\cooking_machines\container.dm" -#include "code\modules\food\kitchen\cooking_machines\fryer.dm" -#include "code\modules\food\kitchen\cooking_machines\grill.dm" -#include "code\modules\food\kitchen\cooking_machines\oven.dm" -#include "code\modules\food\kitchen\smartfridge\drying_rack.dm" -#include "code\modules\food\kitchen\smartfridge\engineering.dm" -#include "code\modules\food\kitchen\smartfridge\hydroponics.dm" -#include "code\modules\food\kitchen\smartfridge\medical.dm" -#include "code\modules\food\kitchen\smartfridge\smartfridge.dm" -#include "code\modules\food\kitchen\smartfridge\smartfridge_vr.dm" -#include "code\modules\gamemaster\defines.dm" -#include "code\modules\gamemaster\event2\event.dm" -#include "code\modules\gamemaster\event2\meta.dm" -#include "code\modules\gamemaster\event2\events\ghost_pod_spawner.dm" -#include "code\modules\gamemaster\event2\events\mob_spawning.dm" -#include "code\modules\gamemaster\event2\events\cargo\shipping_error.dm" -#include "code\modules\gamemaster\event2\events\command\manifest_malfunction.dm" -#include "code\modules\gamemaster\event2\events\command\money_hacker.dm" -#include "code\modules\gamemaster\event2\events\command\raise_funds.dm" -#include "code\modules\gamemaster\event2\events\engineering\airlock_failure.dm" -#include "code\modules\gamemaster\event2\events\engineering\blob.dm" -#include "code\modules\gamemaster\event2\events\engineering\brand_intelligence.dm" -#include "code\modules\gamemaster\event2\events\engineering\camera_damage.dm" -#include "code\modules\gamemaster\event2\events\engineering\canister_leak.dm" -#include "code\modules\gamemaster\event2\events\engineering\dust.dm" -#include "code\modules\gamemaster\event2\events\engineering\gas_leak.dm" -#include "code\modules\gamemaster\event2\events\engineering\grid_check.dm" -#include "code\modules\gamemaster\event2\events\engineering\meteor_defense.dm" -#include "code\modules\gamemaster\event2\events\engineering\spacevine.dm" -#include "code\modules\gamemaster\event2\events\engineering\wallrot.dm" -#include "code\modules\gamemaster\event2\events\engineering\window_break.dm" -#include "code\modules\gamemaster\event2\events\everyone\comms_blackout.dm" -#include "code\modules\gamemaster\event2\events\everyone\electrical_fault.dm" -#include "code\modules\gamemaster\event2\events\everyone\gravity_vr.dm" -#include "code\modules\gamemaster\event2\events\everyone\infestation.dm" -#include "code\modules\gamemaster\event2\events\everyone\pda_spam.dm" -#include "code\modules\gamemaster\event2\events\everyone\radiation_storm.dm" -#include "code\modules\gamemaster\event2\events\everyone\random_antag.dm" -#include "code\modules\gamemaster\event2\events\everyone\solar_storm.dm" -#include "code\modules\gamemaster\event2\events\everyone\sudden_weather_shift.dm" -#include "code\modules\gamemaster\event2\events\legacy\legacy.dm" -#include "code\modules\gamemaster\event2\events\medical\appendicitis.dm" -#include "code\modules\gamemaster\event2\events\medical\virus.dm" -#include "code\modules\gamemaster\event2\events\security\carp_migration.dm" -#include "code\modules\gamemaster\event2\events\security\drill_announcement.dm" -#include "code\modules\gamemaster\event2\events\security\prison_break.dm" -#include "code\modules\gamemaster\event2\events\security\rogue_drones.dm" -#include "code\modules\gamemaster\event2\events\security\security_advisement.dm" -#include "code\modules\gamemaster\event2\events\security\spider_infestation.dm" -#include "code\modules\gamemaster\event2\events\security\stowaway.dm" -#include "code\modules\gamemaster\event2\events\security\surprise_carp.dm" -#include "code\modules\gamemaster\event2\events\security\swarm_boarder.dm" -#include "code\modules\gamemaster\event2\events\synthetic\ion_storm.dm" -#include "code\modules\games\cah.dm" -#include "code\modules\games\cah_black_cards.dm" -#include "code\modules\games\cah_white_cards.dm" -#include "code\modules\games\cardemon.dm" -#include "code\modules\games\cards.dm" -#include "code\modules\games\dice.dm" -#include "code\modules\games\spaceball_cards.dm" -#include "code\modules\games\tarot.dm" -#include "code\modules\genetics\side_effects.dm" -#include "code\modules\ghosttrap\trap.dm" -#include "code\modules\holodeck\HolodeckControl.dm" -#include "code\modules\holodeck\HolodeckObjects.dm" -#include "code\modules\holodeck\HolodeckPrograms.dm" -#include "code\modules\holomap\generate_holomap.dm" -#include "code\modules\holomap\holomap_area.dm" -#include "code\modules\holomap\holomap_datum.dm" -#include "code\modules\holomap\mapper.dm" -#include "code\modules\holomap\station_holomap.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\grown_inedible.dm" -#include "code\modules\hydroponics\grown_predefined.dm" -#include "code\modules\hydroponics\seed.dm" -#include "code\modules\hydroponics\seed_datums_vr.dm" -#include "code\modules\hydroponics\seed_gene_mut.dm" -#include "code\modules\hydroponics\seed_machines.dm" -#include "code\modules\hydroponics\seed_mobs.dm" -#include "code\modules\hydroponics\seed_packets.dm" -#include "code\modules\hydroponics\seed_packets_vr.dm" -#include "code\modules\hydroponics\seed_storage.dm" -#include "code\modules\hydroponics\seed_storage_vr.dm" -#include "code\modules\hydroponics\beekeeping\beehive.dm" -#include "code\modules\hydroponics\seedtypes\amauri.dm" -#include "code\modules\hydroponics\seedtypes\ambrosia.dm" -#include "code\modules\hydroponics\seedtypes\apples.dm" -#include "code\modules\hydroponics\seedtypes\banana.dm" -#include "code\modules\hydroponics\seedtypes\berries.dm" -#include "code\modules\hydroponics\seedtypes\cabbage.dm" -#include "code\modules\hydroponics\seedtypes\carrots.dm" -#include "code\modules\hydroponics\seedtypes\celery.dm" -#include "code\modules\hydroponics\seedtypes\cherries.dm" -#include "code\modules\hydroponics\seedtypes\chili.dm" -#include "code\modules\hydroponics\seedtypes\citrus.dm" -#include "code\modules\hydroponics\seedtypes\cocoa.dm" -#include "code\modules\hydroponics\seedtypes\corn.dm" -#include "code\modules\hydroponics\seedtypes\diona.dm" -#include "code\modules\hydroponics\seedtypes\durian.dm" -#include "code\modules\hydroponics\seedtypes\eggplant.dm" -#include "code\modules\hydroponics\seedtypes\flowers.dm" -#include "code\modules\hydroponics\seedtypes\gelthi.dm" -#include "code\modules\hydroponics\seedtypes\gnomes.dm" -#include "code\modules\hydroponics\seedtypes\grapes.dm" -#include "code\modules\hydroponics\seedtypes\grass.dm" -#include "code\modules\hydroponics\seedtypes\jurlmah.dm" -#include "code\modules\hydroponics\seedtypes\kudzu.dm" -#include "code\modules\hydroponics\seedtypes\lettuce.dm" -#include "code\modules\hydroponics\seedtypes\malanitear.dm" -#include "code\modules\hydroponics\seedtypes\mushrooms.dm" -#include "code\modules\hydroponics\seedtypes\nettles.dm" -#include "code\modules\hydroponics\seedtypes\onion.dm" -#include "code\modules\hydroponics\seedtypes\peanuts.dm" -#include "code\modules\hydroponics\seedtypes\pineapple.dm" -#include "code\modules\hydroponics\seedtypes\potato.dm" -#include "code\modules\hydroponics\seedtypes\pumpkin.dm" -#include "code\modules\hydroponics\seedtypes\rhubarb.dm" -#include "code\modules\hydroponics\seedtypes\rice.dm" -#include "code\modules\hydroponics\seedtypes\selemhand.dm" -#include "code\modules\hydroponics\seedtypes\soybean.dm" -#include "code\modules\hydroponics\seedtypes\sugarcane.dm" -#include "code\modules\hydroponics\seedtypes\surik.dm" -#include "code\modules\hydroponics\seedtypes\telriis.dm" -#include "code\modules\hydroponics\seedtypes\thaadra.dm" -#include "code\modules\hydroponics\seedtypes\tobacco.dm" -#include "code\modules\hydroponics\seedtypes\tomatoes.dm" -#include "code\modules\hydroponics\seedtypes\vale.dm" -#include "code\modules\hydroponics\seedtypes\vanilla.dm" -#include "code\modules\hydroponics\seedtypes\wabback.dm" -#include "code\modules\hydroponics\seedtypes\watermelon.dm" -#include "code\modules\hydroponics\seedtypes\weeds.dm" -#include "code\modules\hydroponics\seedtypes\wheat.dm" -#include "code\modules\hydroponics\seedtypes\whitebeets.dm" -#include "code\modules\hydroponics\seedtypes\wurmwoad.dm" -#include "code\modules\hydroponics\seedtypes\xeno.dm" -#include "code\modules\hydroponics\spreading\spreading.dm" -#include "code\modules\hydroponics\spreading\spreading_growth.dm" -#include "code\modules\hydroponics\spreading\spreading_response.dm" -#include "code\modules\hydroponics\trays\tray.dm" -#include "code\modules\hydroponics\trays\tray_process.dm" -#include "code\modules\hydroponics\trays\tray_reagents.dm" -#include "code\modules\hydroponics\trays\tray_soil.dm" -#include "code\modules\hydroponics\trays\tray_tools.dm" -#include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\identification\identification.dm" -#include "code\modules\identification\item_procs.dm" -#include "code\modules\instruments\items.dm" -#include "code\modules\instruments\stationary.dm" -#include "code\modules\instruments\instrument_data\_instrument_data.dm" -#include "code\modules\instruments\instrument_data\_instrument_key.dm" -#include "code\modules\instruments\instrument_data\brass.dm" -#include "code\modules\instruments\instrument_data\chromatic_percussion.dm" -#include "code\modules\instruments\instrument_data\fun.dm" -#include "code\modules\instruments\instrument_data\guitar.dm" -#include "code\modules\instruments\instrument_data\hardcoded.dm" -#include "code\modules\instruments\instrument_data\organ.dm" -#include "code\modules\instruments\instrument_data\piano.dm" -#include "code\modules\instruments\instrument_data\synth_tones.dm" -#include "code\modules\instruments\songs\_song.dm" -#include "code\modules\instruments\songs\editor.dm" -#include "code\modules\instruments\songs\play_legacy.dm" -#include "code\modules\instruments\songs\play_synthesized.dm" -#include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\core\assemblies.dm" -#include "code\modules\integrated_electronics\core\detailer.dm" -#include "code\modules\integrated_electronics\core\helpers.dm" -#include "code\modules\integrated_electronics\core\integrated_circuit.dm" -#include "code\modules\integrated_electronics\core\pins.dm" -#include "code\modules\integrated_electronics\core\printer.dm" -#include "code\modules\integrated_electronics\core\tools.dm" -#include "code\modules\integrated_electronics\core\assemblies\clothing.dm" -#include "code\modules\integrated_electronics\core\assemblies\device.dm" -#include "code\modules\integrated_electronics\core\assemblies\generic.dm" -#include "code\modules\integrated_electronics\core\assemblies\implant.dm" -#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" -#include "code\modules\integrated_electronics\passive\passive.dm" -#include "code\modules\integrated_electronics\passive\power.dm" -#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" -#include "code\modules\integrated_electronics\subtypes\built_in.dm" -#include "code\modules\integrated_electronics\subtypes\converters.dm" -#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" -#include "code\modules\integrated_electronics\subtypes\input.dm" -#include "code\modules\integrated_electronics\subtypes\lists.dm" -#include "code\modules\integrated_electronics\subtypes\logic.dm" -#include "code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "code\modules\integrated_electronics\subtypes\memory.dm" -#include "code\modules\integrated_electronics\subtypes\output.dm" -#include "code\modules\integrated_electronics\subtypes\power.dm" -#include "code\modules\integrated_electronics\subtypes\reagents.dm" -#include "code\modules\integrated_electronics\subtypes\smart.dm" -#include "code\modules\integrated_electronics\subtypes\time.dm" -#include "code\modules\integrated_electronics\subtypes\trig.dm" -#include "code\modules\integrated_electronics\~defines\~defines.dm" -#include "code\modules\keybindings\bindings_atom.dm" -#include "code\modules\keybindings\bindings_movekeys.dm" -#include "code\modules\keybindings\setup.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\lib_readme.dm" -#include "code\modules\library\hardcode_library\_library.dm" -#include "code\modules\library\hardcode_library\fiction\APsychonaut.dm" -#include "code\modules\library\hardcode_library\fiction\battlefieldcommander.dm" -#include "code\modules\library\hardcode_library\fiction\PortedBooks.dm" -#include "code\modules\library\hardcode_library\fiction\schnayy.dm" -#include "code\modules\library\hardcode_library\non-fiction\PortedBooks.dm" -#include "code\modules\library\hardcode_library\reference\PortedBooks.dm" -#include "code\modules\library\hardcode_library\reference\Schnayy.dm" -#include "code\modules\library\hardcode_library\religious\PortedBooks.dm" -#include "code\modules\lighting\emissive_blocker.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_fake_sun_vr.dm" -#include "code\modules\lighting\lighting_overlay.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\looking_glass\lg_area.dm" -#include "code\modules\looking_glass\lg_console.dm" -#include "code\modules\looking_glass\lg_imageholder.dm" -#include "code\modules\looking_glass\lg_turfs.dm" -#include "code\modules\lore_codex\codex.dm" -#include "code\modules\lore_codex\codex_tree.dm" -#include "code\modules\lore_codex\pages.dm" -#include "code\modules\lore_codex\lore_data_vr\important_locations.dm" -#include "code\modules\lore_codex\lore_data_vr\main.dm" -#include "code\modules\lore_codex\lore_data_vr\orgs.dm" -#include "code\modules\lore_codex\lore_data_vr\political_parties.dm" -#include "code\modules\lore_codex\lore_data_vr\species.dm" -#include "code\modules\lore_codex\news_data\main.dm" -#include "code\modules\lore_codex\robutt_data\bybrand.dm" -#include "code\modules\lore_codex\robutt_data\main_robutts.dm" -#include "code\modules\lore_codex\robutt_data\more.dm" -#include "code\modules\makeup\nailpolish.dm" -#include "code\modules\maps\tg\dmm_suite.dm" -#include "code\modules\maps\tg\map_template.dm" -#include "code\modules\maps\tg\map_template_vr.dm" -#include "code\modules\maps\tg\reader.dm" -#include "code\modules\materials\fifty_spawner.dm" -#include "code\modules\materials\fifty_spawner_mats.dm" -#include "code\modules\materials\fifty_spawner_mats_vr.dm" -#include "code\modules\materials\material_synth.dm" -#include "code\modules\materials\materials\_materials.dm" -#include "code\modules\materials\materials\_materials_vr.dm" -#include "code\modules\materials\materials\alien_alloy.dm" -#include "code\modules\materials\materials\cult.dm" -#include "code\modules\materials\materials\gems.dm" -#include "code\modules\materials\materials\glass.dm" -#include "code\modules\materials\materials\glass_vr.dm" -#include "code\modules\materials\materials\holographic.dm" -#include "code\modules\materials\materials\other_vr.dm" -#include "code\modules\materials\materials\plastic.dm" -#include "code\modules\materials\materials\snow.dm" -#include "code\modules\materials\materials\stone.dm" -#include "code\modules\materials\materials\supermatter.dm" -#include "code\modules\materials\materials\metals\hull.dm" -#include "code\modules\materials\materials\metals\hull_vr.dm" -#include "code\modules\materials\materials\metals\metals.dm" -#include "code\modules\materials\materials\metals\metals_vr.dm" -#include "code\modules\materials\materials\metals\plasteel.dm" -#include "code\modules\materials\materials\metals\plasteel_vr.dm" -#include "code\modules\materials\materials\metals\steel.dm" -#include "code\modules\materials\materials\metals\steel_vr.dm" -#include "code\modules\materials\materials\organic\animal_products.dm" -#include "code\modules\materials\materials\organic\cloth.dm" -#include "code\modules\materials\materials\organic\leather.dm" -#include "code\modules\materials\materials\organic\resin.dm" -#include "code\modules\materials\materials\organic\wood.dm" -#include "code\modules\materials\sheets\_sheets.dm" -#include "code\modules\materials\sheets\gems.dm" -#include "code\modules\materials\sheets\glass.dm" -#include "code\modules\materials\sheets\glass_vr.dm" -#include "code\modules\materials\sheets\plastic.dm" -#include "code\modules\materials\sheets\snow.dm" -#include "code\modules\materials\sheets\stone.dm" -#include "code\modules\materials\sheets\supermatter.dm" -#include "code\modules\materials\sheets\metals\hull.dm" -#include "code\modules\materials\sheets\metals\hull_vr.dm" -#include "code\modules\materials\sheets\metals\metal.dm" -#include "code\modules\materials\sheets\metals\metal_vr.dm" -#include "code\modules\materials\sheets\metals\rods.dm" -#include "code\modules\materials\sheets\organic\animal_products.dm" -#include "code\modules\materials\sheets\organic\resin.dm" -#include "code\modules\materials\sheets\organic\textiles.dm" -#include "code\modules\materials\sheets\organic\wood.dm" -#include "code\modules\materials\sheets\organic\tanning\hide.dm" -#include "code\modules\materials\sheets\organic\tanning\hide_hairless.dm" -#include "code\modules\materials\sheets\organic\tanning\leather_wet.dm" -#include "code\modules\materials\sheets\organic\tanning\tanning_rack.dm" -#include "code\modules\media\juke_remote.dm" -#include "code\modules\media\media_machinery.dm" -#include "code\modules\media\media_player_html5.dm" -#include "code\modules\media\media_player_vlc.dm" -#include "code\modules\media\media_player_wmp.dm" -#include "code\modules\media\media_tracks.dm" -#include "code\modules\media\mediamanager.dm" -#include "code\modules\media\walkpod.dm" -#include "code\modules\metric\activity.dm" -#include "code\modules\metric\count.dm" -#include "code\modules\metric\department.dm" -#include "code\modules\metric\metric.dm" -#include "code\modules\mining\abandonedcrates.dm" -#include "code\modules\mining\abandonedcrates_vr.dm" -#include "code\modules\mining\alloys.dm" -#include "code\modules\mining\alloys_vr.dm" -#include "code\modules\mining\fulton.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\mine_items_vr.dm" -#include "code\modules\mining\mine_outcrops.dm" -#include "code\modules\mining\mine_turfs.dm" -#include "code\modules\mining\mine_turfs_vr.dm" -#include "code\modules\mining\mineral_effect.dm" -#include "code\modules\mining\ore.dm" -#include "code\modules\mining\ore_box.dm" -#include "code\modules\mining\ore_datum.dm" -#include "code\modules\mining\resonator_vr.dm" -#include "code\modules\mining\shelter_atoms_vr.dm" -#include "code\modules\mining\shelters_vr.dm" -#include "code\modules\mining\drilling\drill.dm" -#include "code\modules\mining\drilling\scanner.dm" -#include "code\modules\mining\machinery\machine_input_output_plates.dm" -#include "code\modules\mining\machinery\machine_processing.dm" -#include "code\modules\mining\machinery\machine_stacking.dm" -#include "code\modules\mining\machinery\machine_unloading.dm" -#include "code\modules\mining\ore_redemption_machine\construction.dm" -#include "code\modules\mining\ore_redemption_machine\equipment_vendor.dm" -#include "code\modules\mining\ore_redemption_machine\mine_point_items.dm" -#include "code\modules\mining\ore_redemption_machine\survey_vendor.dm" -#include "code\modules\mob\animations.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\gender.dm" -#include "code\modules\mob\gender_vr.dm" -#include "code\modules\mob\hear_say.dm" -#include "code\modules\mob\holder.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\login_vr.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_defines_vr.dm" -#include "code\modules\mob\mob_grab.dm" -#include "code\modules\mob\mob_grab_specials.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_helpers_vr.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_planes.dm" -#include "code\modules\mob\mob_planes_vr.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\say_vr.dm" -#include "code\modules\mob\skillset.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\_modifiers\aura.dm" -#include "code\modules\mob\_modifiers\changeling.dm" -#include "code\modules\mob\_modifiers\cloning.dm" -#include "code\modules\mob\_modifiers\feysight.dm" -#include "code\modules\mob\_modifiers\fire.dm" -#include "code\modules\mob\_modifiers\medical.dm" -#include "code\modules\mob\_modifiers\modifiers.dm" -#include "code\modules\mob\_modifiers\modifiers_misc.dm" -#include "code\modules\mob\_modifiers\traits.dm" -#include "code\modules\mob\_modifiers\traits_phobias.dm" -#include "code\modules\mob\_modifiers\unholy.dm" -#include "code\modules\mob\dead\corpse.dm" -#include "code\modules\mob\dead\corpse_vr.dm" -#include "code\modules\mob\dead\death.dm" -#include "code\modules\mob\dead\observer\free_vr.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\observer_vr.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\freelook\chunk.dm" -#include "code\modules\mob\freelook\eye.dm" -#include "code\modules\mob\freelook\life.dm" -#include "code\modules\mob\freelook\update_triggers.dm" -#include "code\modules\mob\freelook\visualnet.dm" -#include "code\modules\mob\freelook\ai\cameranet.dm" -#include "code\modules\mob\freelook\ai\chunk.dm" -#include "code\modules\mob\freelook\ai\eye.dm" -#include "code\modules\mob\freelook\ai\update_triggers.dm" -#include "code\modules\mob\freelook\mask\chunk.dm" -#include "code\modules\mob\freelook\mask\cultnet.dm" -#include "code\modules\mob\freelook\mask\eye.dm" -#include "code\modules\mob\freelook\mask\update_triggers.dm" -#include "code\modules\mob\language\generic.dm" -#include "code\modules\mob\language\language.dm" -#include "code\modules\mob\language\monkey.dm" -#include "code\modules\mob\language\outsider.dm" -#include "code\modules\mob\language\station.dm" -#include "code\modules\mob\language\station_vr.dm" -#include "code\modules\mob\language\synthetic.dm" -#include "code\modules\mob\living\autohiss.dm" -#include "code\modules\mob\living\butchering.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\default_language.dm" -#include "code\modules\mob\living\inventory.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\living_defines_vr.dm" -#include "code\modules\mob\living\living_movement.dm" -#include "code\modules\mob\living\living_powers.dm" -#include "code\modules\mob\living\living_vr.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\organs.dm" -#include "code\modules\mob\living\riding.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\status_indicators.dm" -#include "code\modules\mob\living\bot\bot.dm" -#include "code\modules\mob\living\bot\bot_vr.dm" -#include "code\modules\mob\living\bot\cleanbot.dm" -#include "code\modules\mob\living\bot\ed209bot.dm" -#include "code\modules\mob\living\bot\edCLNbot.dm" -#include "code\modules\mob\living\bot\farmbot.dm" -#include "code\modules\mob\living\bot\floorbot.dm" -#include "code\modules\mob\living\bot\medbot.dm" -#include "code\modules\mob\living\bot\mulebot.dm" -#include "code\modules\mob\living\bot\mulebot_vr.dm" -#include "code\modules\mob\living\bot\secbot.dm" -#include "code\modules\mob\living\bot\SLed209bot.dm" -#include "code\modules\mob\living\carbon\breathe.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_powers.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\lick_wounds.dm" -#include "code\modules\mob\living\carbon\resist.dm" -#include "code\modules\mob\living\carbon\shock.dm" -#include "code\modules\mob\living\carbon\taste.dm" -#include "code\modules\mob\living\carbon\viruses.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_attacks.dm" -#include "code\modules\mob\living\carbon\alien\alien_damage.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\progression.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_attacks.dm" -#include "code\modules\mob\living\carbon\alien\diona\diona_powers.dm" -#include "code\modules\mob\living\carbon\alien\diona\life.dm" -#include "code\modules\mob\living\carbon\alien\diona\progression.dm" -#include "code\modules\mob\living\carbon\alien\diona\say_understands.dm" -#include "code\modules\mob\living\carbon\alien\diona\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\progression.dm" -#include "code\modules\mob\living\carbon\brain\brain.dm" -#include "code\modules\mob\living\carbon\brain\death.dm" -#include "code\modules\mob\living\carbon\brain\emote.dm" -#include "code\modules\mob\living\carbon\brain\life.dm" -#include "code\modules\mob\living\carbon\brain\login.dm" -#include "code\modules\mob\living\carbon\brain\MMI.dm" -#include "code\modules\mob\living\carbon\brain\robot.dm" -#include "code\modules\mob\living\carbon\brain\say.dm" -#include "code\modules\mob\living\carbon\human\appearance.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\death_vr.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\emote_vr.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\examine_vr.dm" -#include "code\modules\mob\living\carbon\human\gradient.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_attackhand.dm" -#include "code\modules\mob\living\carbon\human\human_damage.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_defines_vr.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" -#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\human_organs.dm" -#include "code\modules\mob\living\carbon\human\human_powers.dm" -#include "code\modules\mob\living\carbon\human\human_powers_vr.dm" -#include "code\modules\mob\living\carbon\human\human_resist.dm" -#include "code\modules\mob\living\carbon\human\human_species.dm" -#include "code\modules\mob\living\carbon\human\human_species_vr.dm" -#include "code\modules\mob\living\carbon\human\human_vr.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\life_vr.dm" -#include "code\modules\mob\living\carbon\human\login.dm" -#include "code\modules\mob\living\carbon\human\logout.dm" -#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm" -#include "code\modules\mob\living\carbon\human\npcs.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\stripping.dm" -#include "code\modules\mob\living\carbon\human\unarmed_attack.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm" -#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm" -#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" -#include "code\modules\mob\living\carbon\human\species\species.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_helpers.dm" -#include "code\modules\mob\living\carbon\human\species\species_hud.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_vr.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\event.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\_defines.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" -#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\alraune.dm" -#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\golem.dm" -#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" -#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" -#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_species.dm" -#include "code\modules\mob\living\carbon\human\species\xenomorphs\xenomorphs.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\emote.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_vr.dm" -#include "code\modules\mob\living\silicon\subystems.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_movement.dm" -#include "code\modules\mob\living\silicon\ai\ai_remote_control.dm" -#include "code\modules\mob\living\silicon\ai\ai_vr.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\icons.dm" -#include "code\modules\mob\living\silicon\ai\latejoin.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\malf.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\decoy\death.dm" -#include "code\modules\mob\living\silicon\decoy\decoy.dm" -#include "code\modules\mob\living\silicon\decoy\life.dm" -#include "code\modules\mob\living\silicon\pai\admin.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\examine.dm" -#include "code\modules\mob\living\silicon\pai\life.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\pai_vr.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\recruit.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" -#include "code\modules\mob\living\silicon\robot\analyzer.dm" -#include "code\modules\mob\living\silicon\robot\component.dm" -#include "code\modules\mob\living\silicon\robot\custom_sprites.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\examine_vr.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\photos.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_damage.dm" -#include "code\modules\mob\living\silicon\robot\robot_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm" -#include "code\modules\mob\living\silicon\robot\robot_vr.dm" -#include "code\modules\mob\living\silicon\robot\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm" -#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" -#include "code\modules\mob\living\silicon\robot\drone\drone_vr.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm_abilities.dm" -#include "code\modules\mob\living\silicon\robot\drone\swarm_items.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\event.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\event_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\station.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\station_vr.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\swarm.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\gravekeeper.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" -#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" -#include "code\modules\mob\living\simple_mob\appearance.dm" -#include "code\modules\mob\living\simple_mob\butchering.dm" -#include "code\modules\mob\living\simple_mob\combat.dm" -#include "code\modules\mob\living\simple_mob\defense.dm" -#include "code\modules\mob\living\simple_mob\donteatpets_vr.dm" -#include "code\modules\mob\living\simple_mob\hands.dm" -#include "code\modules\mob\living\simple_mob\harvesting.dm" -#include "code\modules\mob\living\simple_mob\life.dm" -#include "code\modules\mob\living\simple_mob\on_click.dm" -#include "code\modules\mob\living\simple_mob\simple_hud.dm" -#include "code\modules\mob\living\simple_mob\simple_mob.dm" -#include "code\modules\mob\living\simple_mob\simple_mob_vr.dm" -#include "code\modules\mob\living\simple_mob\taming.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\animal.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_captive.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\borer\borer_powers.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\chicken.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\cow.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\farm animals\goat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\_giant_spider.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\carrier.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\electric.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\frost.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\giant_spider_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\hunter.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\lurker.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\nurse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\pepper.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\phorogenic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\thermic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\tunneler.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\giant_spider\webslinger.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\crab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\fish_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\jerboa_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\lizard.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\misc.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\dog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\fox_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\pets\parrot.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\diyaab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\duck.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\fluffy_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\frostfly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\glitterfly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hare.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\hooligan_crab.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\kururak.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\leech.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\moth.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\pillbug.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\racoon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\sif\siffet.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\gaslamp_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\goose_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\snake_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" -#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" -#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Eddy.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\horror .dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Master.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Rickey.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\sally.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\shittytim.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Smiley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Steve.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\timling.dm" -#include "code\modules\mob\living\simple_mob\subtypes\horror\Willy.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\russian.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\humanoid\mercs\mercs_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\illusion\illusion.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\corrupt_maint_drone_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\disbot_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\golem_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mechanical_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\viscerator.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\wahlem_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\combat_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\drones\mining_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\hivebot_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\ranged_damage_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\support_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\hivebot\tank.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\adv_dark_gygax_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\combat_mecha.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\durand.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\gygax.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\hoverpod.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\marauder.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\mecha.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\odysseus.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\phazon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\mecha\ripley.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\monitor_ward.dm" -#include "code\modules\mob\living\simple_mob\subtypes\mechanical\ward\ward.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\creature.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\faithless.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\_construct.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\artificer.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\harvester.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\juggernaut.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\shade.dm" -#include "code\modules\mob\living\simple_mob\subtypes\occult\constructs\wraith.dm" -#include "code\modules\mob\living\simple_mob\subtypes\plant\tomato.dm" -#include "code\modules\mob\living\simple_mob\subtypes\plant\tree.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\slime.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\slime_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\feral\feral_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\combat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\consumption.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\defense.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\discipline.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\subtypes_vr.dm" -#include "code\modules\mob\living\simple_mob\subtypes\slime\xenobio\xenobio.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\bee.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\c_pet.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\catgirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\cookiegirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\corrupt_hounds.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\fennix.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\frog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\hippo.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\rat.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\redpanda.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_drone.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\sect_queen.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\snake.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\softdog.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\solargrub_larva.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\vore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\weretiger.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\xeno_vore.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Big.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bigclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\bus.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\busclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\c_shift.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\Clowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\hespawner.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\honkelemental.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\mobs_monsters\clowns\regularclowns.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_procs.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\shadekin.dm" -#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\types.dm" -#include "code\modules\mob\living\voice\voice.dm" -#include "code\modules\mob\living\voice\voice_vr.dm" -#include "code\modules\mob\new_player\login.dm" -#include "code\modules\mob\new_player\login_vr.dm" -#include "code\modules\mob\new_player\logout.dm" -#include "code\modules\mob\new_player\new_player.dm" -#include "code\modules\mob\new_player\new_player_vr.dm" -#include "code\modules\mob\new_player\news.dm" -#include "code\modules\mob\new_player\poll.dm" -#include "code\modules\mob\new_player\preferences_setup.dm" -#include "code\modules\mob\new_player\preferences_setup_vr.dm" -#include "code\modules\mob\new_player\skill.dm" -#include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\mob\new_player\sprite_accessories_ear.dm" -#include "code\modules\mob\new_player\sprite_accessories_ear_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_extra.dm" -#include "code\modules\mob\new_player\sprite_accessories_extra_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_tail.dm" -#include "code\modules\mob\new_player\sprite_accessories_tail_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_taur.dm" -#include "code\modules\mob\new_player\sprite_accessories_taur_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_vr.dm" -#include "code\modules\mob\new_player\sprite_accessories_wing.dm" -#include "code\modules\mob\new_player\sprite_accessories_wing_vr.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\modular_computer\core.dm" -#include "code\modules\modular_computers\computers\modular_computer\damage.dm" -#include "code\modules\modular_computers\computers\modular_computer\hardware.dm" -#include "code\modules\modular_computers\computers\modular_computer\interaction.dm" -#include "code\modules\modular_computers\computers\modular_computer\power.dm" -#include "code\modules\modular_computers\computers\modular_computer\ui.dm" -#include "code\modules\modular_computers\computers\modular_computer\variables.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_console.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_laptop.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_tablet.dm" -#include "code\modules\modular_computers\computers\subtypes\dev_telescreen.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_console.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_laptop.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_laptop_vr.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_tablet.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_tablet_vr.dm" -#include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\news_article.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\file_system\programs\command\card.dm" -#include "code\modules\modular_computers\file_system\programs\command\comm.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\alarm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\atmos_control.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\power_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\shutoff_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\generic\camera.dm" -#include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\game.dm" -#include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\generic\uav.dm" -#include "code\modules\modular_computers\file_system\programs\generic\wordprocessor.dm" -#include "code\modules\modular_computers\file_system\programs\medical\suit_sensors.dm" -#include "code\modules\modular_computers\file_system\programs\research\email_administration.dm" -#include "code\modules\modular_computers\file_system\programs\research\ntmonitor.dm" -#include "code\modules\modular_computers\file_system\programs\security\alarm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\security\digitalwarrant.dm" -#include "code\modules\modular_computers\file_system\programs\ships\navigation.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\nano_printer.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_hard_drive.dm" -#include "code\modules\modular_computers\hardware\processor_unit.dm" -#include "code\modules\modular_computers\hardware\tesla_link.dm" -#include "code\modules\modular_computers\NTNet\NTNet.dm" -#include "code\modules\modular_computers\NTNet\NTNet_relay.dm" -#include "code\modules\modular_computers\NTNet\emails\email_account.dm" -#include "code\modules\modular_computers\NTNet\emails\email_message.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\multi-tile\multi-tile.dm" -#include "code\modules\multiz\_stubs.dm" -#include "code\modules\multiz\admin_upload.dm" -#include "code\modules\multiz\basic.dm" -#include "code\modules\multiz\hoist.dm" -#include "code\modules\multiz\ladder_assembly_vr.dm" -#include "code\modules\multiz\ladders.dm" -#include "code\modules\multiz\ladders_vr.dm" -#include "code\modules\multiz\movement.dm" -#include "code\modules\multiz\movement_vr.dm" -#include "code\modules\multiz\pipes.dm" -#include "code\modules\multiz\stairs.dm" -#include "code\modules\multiz\turf.dm" -#include "code\modules\news\news_init.dm" -#include "code\modules\news\newspaper.dm" -#include "code\modules\news\newspaper_layout.dm" -#include "code\modules\nifsoft\nif.dm" -#include "code\modules\nifsoft\nif_softshop.dm" -#include "code\modules\nifsoft\nif_tgui.dm" -#include "code\modules\nifsoft\nifsoft.dm" -#include "code\modules\nifsoft\software\01_vision.dm" -#include "code\modules\nifsoft\software\05_health.dm" -#include "code\modules\nifsoft\software\06_screens.dm" -#include "code\modules\nifsoft\software\10_combat.dm" -#include "code\modules\nifsoft\software\13_soulcatcher.dm" -#include "code\modules\nifsoft\software\14_commlink.dm" -#include "code\modules\nifsoft\software\15_misc.dm" -#include "code\modules\organs\blood.dm" -#include "code\modules\organs\misc.dm" -#include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_external.dm" -#include "code\modules\organs\organ_external_vr.dm" -#include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_stump.dm" -#include "code\modules\organs\pain.dm" -#include "code\modules\organs\robolimbs.dm" -#include "code\modules\organs\robolimbs_custom.dm" -#include "code\modules\organs\robolimbs_vr.dm" -#include "code\modules\organs\wound.dm" -#include "code\modules\organs\internal\_organ_internal.dm" -#include "code\modules\organs\internal\appendix.dm" -#include "code\modules\organs\internal\augment.dm" -#include "code\modules\organs\internal\brain.dm" -#include "code\modules\organs\internal\eyes.dm" -#include "code\modules\organs\internal\heart.dm" -#include "code\modules\organs\internal\intestine.dm" -#include "code\modules\organs\internal\kidneys.dm" -#include "code\modules\organs\internal\liver.dm" -#include "code\modules\organs\internal\lungs.dm" -#include "code\modules\organs\internal\spleen.dm" -#include "code\modules\organs\internal\stomach.dm" -#include "code\modules\organs\internal\voicebox.dm" -#include "code\modules\organs\internal\augment\armmounted.dm" -#include "code\modules\organs\internal\augment\bio.dm" -#include "code\modules\organs\internal\robotic\diagnostic.dm" -#include "code\modules\organs\internal\robotic\heatsink.dm" -#include "code\modules\organs\internal\robotic\robotic.dm" -#include "code\modules\organs\subtypes\diona.dm" -#include "code\modules\organs\subtypes\indestructible.dm" -#include "code\modules\organs\subtypes\machine.dm" -#include "code\modules\organs\subtypes\nano.dm" -#include "code\modules\organs\subtypes\replicant.dm" -#include "code\modules\organs\subtypes\shadekin.dm" -#include "code\modules\organs\subtypes\shadekin_vr.dm" -#include "code\modules\organs\subtypes\slime.dm" -#include "code\modules\organs\subtypes\slime_vr.dm" -#include "code\modules\organs\subtypes\standard.dm" -#include "code\modules\organs\subtypes\standard_vr.dm" -#include "code\modules\organs\subtypes\teshari.dm" -#include "code\modules\organs\subtypes\unathi.dm" -#include "code\modules\organs\subtypes\unbreakable.dm" -#include "code\modules\organs\subtypes\unseverable.dm" -#include "code\modules\organs\subtypes\vox.dm" -#include "code\modules\organs\subtypes\vox_vr.dm" -#include "code\modules\organs\subtypes\xenos.dm" -#include "code\modules\overmap\abductor_vr.dm" -#include "code\modules\overmap\bluespace_rift_vr.dm" -#include "code\modules\overmap\champagne.dm" -#include "code\modules\overmap\helpers.dm" -#include "code\modules\overmap\overmap_object.dm" -#include "code\modules\overmap\overmap_planet.dm" -#include "code\modules\overmap\overmap_shuttle.dm" -#include "code\modules\overmap\sectors.dm" -#include "code\modules\overmap\spacetravel.dm" -#include "code\modules\overmap\turfs.dm" -#include "code\modules\overmap\disperser\disperser.dm" -#include "code\modules\overmap\disperser\disperser_charge.dm" -#include "code\modules\overmap\disperser\disperser_circuit.dm" -#include "code\modules\overmap\disperser\disperser_console.dm" -#include "code\modules\overmap\disperser\disperser_fire.dm" -#include "code\modules\overmap\events\event_handler.dm" -#include "code\modules\overmap\events\generation.dm" -#include "code\modules\overmap\events\overmap_event.dm" -#include "code\modules\overmap\ships\landable.dm" -#include "code\modules\overmap\ships\panicbutton.dm" -#include "code\modules\overmap\ships\ship.dm" -#include "code\modules\overmap\ships\computers\computer_shims.dm" -#include "code\modules\overmap\ships\computers\engine_control.dm" -#include "code\modules\overmap\ships\computers\helm.dm" -#include "code\modules\overmap\ships\computers\sensors.dm" -#include "code\modules\overmap\ships\computers\ship.dm" -#include "code\modules\overmap\ships\computers\ship_vr.dm" -#include "code\modules\overmap\ships\computers\shuttle.dm" -#include "code\modules\overmap\ships\engines\engine.dm" -#include "code\modules\overmap\ships\engines\gas_thruster.dm" -#include "code\modules\overmap\ships\engines\gas_thruster_vr.dm" -#include "code\modules\overmap\ships\engines\ion_thruster.dm" -#include "code\modules\paperwork\adminpaper.dm" -#include "code\modules\paperwork\carbonpaper.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\faxmachine.dm" -#include "code\modules\paperwork\faxmachine_vr.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_bundle.dm" -#include "code\modules\paperwork\paper_sticky.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\papershredder.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\photography.dm" -#include "code\modules\paperwork\silicon_photography.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\pda\ai.dm" -#include "code\modules\pda\app.dm" -#include "code\modules\pda\cart.dm" -#include "code\modules\pda\cart_apps.dm" -#include "code\modules\pda\cart_vr.dm" -#include "code\modules\pda\core_apps.dm" -#include "code\modules\pda\messenger.dm" -#include "code\modules\pda\messenger_plugins.dm" -#include "code\modules\pda\pda.dm" -#include "code\modules\pda\pda_subtypes.dm" -#include "code\modules\pda\pda_tgui.dm" -#include "code\modules\pda\pda_vr.dm" -#include "code\modules\pda\radio.dm" -#include "code\modules\pda\utilities.dm" -#include "code\modules\persistence\filth.dm" -#include "code\modules\persistence\graffiti.dm" -#include "code\modules\persistence\noticeboard.dm" -#include "code\modules\persistence\paintings.dm" -#include "code\modules\persistence\serialize.dm" -#include "code\modules\persistence\datum\persistence_datum.dm" -#include "code\modules\persistence\effects\filth.dm" -#include "code\modules\persistence\effects\graffiti.dm" -#include "code\modules\persistence\effects\paper.dm" -#include "code\modules\persistence\effects\paper_sticky.dm" -#include "code\modules\persistence\effects\trash.dm" -#include "code\modules\persistence\storage\smartfridge.dm" -#include "code\modules\persistence\storage\storage.dm" -#include "code\modules\planet\planet.dm" -#include "code\modules\planet\sun.dm" -#include "code\modules\planet\time.dm" -#include "code\modules\planet\virgo3b_vr.dm" -#include "code\modules\planet\virgo4_vr.dm" -#include "code\modules\planet\weather.dm" -#include "code\modules\planet\weather_vr.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\apc_vr.dm" -#include "code\modules\power\batteryrack.dm" -#include "code\modules\power\batteryrack_vr.dm" -#include "code\modules\power\breaker_box.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cable_ender.dm" -#include "code\modules\power\cable_heavyduty.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\debug_items.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\gravitygenerator_vr.dm" -#include "code\modules\power\grid_checker.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\lighting_vr.dm" -#include "code\modules\power\lightswitch_vr.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\port_gen_vr.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\smes_construction.dm" -#include "code\modules\power\smes_vr.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\antimatter\containment_jar.dm" -#include "code\modules\power\antimatter\control.dm" -#include "code\modules\power\antimatter\shielding.dm" -#include "code\modules\power\cells\device_cells.dm" -#include "code\modules\power\cells\device_cells_vr.dm" -#include "code\modules\power\cells\esoteric_cells.dm" -#include "code\modules\power\cells\power_cells.dm" -#include "code\modules\power\fusion\_setup.dm" -#include "code\modules\power\fusion\fusion_circuits.dm" -#include "code\modules\power\fusion\fusion_particle_catcher.dm" -#include "code\modules\power\fusion\fusion_reactions.dm" -#include "code\modules\power\fusion\magpower.dm" -#include "code\modules\power\fusion\core\_core.dm" -#include "code\modules\power\fusion\core\core_control.dm" -#include "code\modules\power\fusion\core\core_field.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_assembly.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_compressor.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_control.dm" -#include "code\modules\power\fusion\fuel_assembly\fuel_injector.dm" -#include "code\modules\power\fusion\gyrotron\gyrotron.dm" -#include "code\modules\power\fusion\gyrotron\gyrotron_control.dm" -#include "code\modules\power\sensors\powernet_sensor.dm" -#include "code\modules\power\sensors\sensor_monitoring.dm" -#include "code\modules\power\singularity\act.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\emitter_vr.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_chamber.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_power.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_smasher.dm" -#include "code\modules\power\supermatter\setup_supermatter.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\power\tesla\telsa_construction.dm" -#include "code\modules\power\tesla\tesla_act.dm" -#include "code\modules\projectiles\ammunition.dm" -#include "code\modules\projectiles\broken.dm" -#include "code\modules\projectiles\dnalocking.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\magazines.dm" -#include "code\modules\projectiles\ammunition\magazines_vr.dm" -#include "code\modules\projectiles\ammunition\magnetic.dm" -#include "code\modules\projectiles\ammunition\rounds.dm" -#include "code\modules\projectiles\ammunition\smartmag.dm" -#include "code\modules\projectiles\brokenguns\energy.dm" -#include "code\modules\projectiles\brokenguns\launcher.dm" -#include "code\modules\projectiles\brokenguns\magnetic.dm" -#include "code\modules\projectiles\brokenguns\projectile.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\launcher.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\modular_guns.dm" -#include "code\modules\projectiles\guns\projectile.dm" -#include "code\modules\projectiles\guns\vox.dm" -#include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" -#include "code\modules\projectiles\guns\energy\crestrose_vr.dm" -#include "code\modules\projectiles\guns\energy\dominator_vr.dm" -#include "code\modules\projectiles\guns\energy\gunsword_vr.dm" -#include "code\modules\projectiles\guns\energy\hooklauncher.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator_vr.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\laser_vr.dm" -#include "code\modules\projectiles\guns\energy\netgun_vr.dm" -#include "code\modules\projectiles\guns\energy\nuclear.dm" -#include "code\modules\projectiles\guns\energy\nuclear_vr.dm" -#include "code\modules\projectiles\guns\energy\particle.dm" -#include "code\modules\projectiles\guns\energy\phase.dm" -#include "code\modules\projectiles\guns\energy\protector_vr.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\pummeler_vr.dm" -#include "code\modules\projectiles\guns\energy\sickshot_vr.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\special_vr.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\energy\stun_vr.dm" -#include "code\modules\projectiles\guns\energy\temperature.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\cell_loaded.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\ml3m_cells.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\multi_cannon_cells.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw.dm" -#include "code\modules\projectiles\guns\energy\cell_loaded_vr\nsfw_cells.dm" -#include "code\modules\projectiles\guns\launcher\bows.dm" -#include "code\modules\projectiles\guns\launcher\crossbow.dm" -#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" -#include "code\modules\projectiles\guns\launcher\pneumatic.dm" -#include "code\modules\projectiles\guns\launcher\rocket.dm" -#include "code\modules\projectiles\guns\launcher\syringe_gun.dm" -#include "code\modules\projectiles\guns\magic\fireball.dm" -#include "code\modules\projectiles\guns\magnetic\bore.dm" -#include "code\modules\projectiles\guns\magnetic\gasthrower.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\automatic.dm" -#include "code\modules\projectiles\guns\projectile\automatic_vr.dm" -#include "code\modules\projectiles\guns\projectile\boltaction.dm" -#include "code\modules\projectiles\guns\projectile\boltaction_vr.dm" -#include "code\modules\projectiles\guns\projectile\caseless.dm" -#include "code\modules\projectiles\guns\projectile\contender.dm" -#include "code\modules\projectiles\guns\projectile\dartgun.dm" -#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\pistol.dm" -#include "code\modules\projectiles\guns\projectile\pistol_vr.dm" -#include "code\modules\projectiles\guns\projectile\revolver.dm" -#include "code\modules\projectiles\guns\projectile\revolver_vr.dm" -#include "code\modules\projectiles\guns\projectile\semiauto.dm" -#include "code\modules\projectiles\guns\projectile\shotgun.dm" -#include "code\modules\projectiles\guns\projectile\shotgun_vr.dm" -#include "code\modules\projectiles\guns\projectile\sniper.dm" -#include "code\modules\projectiles\guns\projectile\sniper\collapsible_sniper.dm" -#include "code\modules\projectiles\projectile\arc.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\beams_vr.dm" -#include "code\modules\projectiles\projectile\blob.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\bullets_vr.dm" -#include "code\modules\projectiles\projectile\change.dm" -#include "code\modules\projectiles\projectile\energy.dm" -#include "code\modules\projectiles\projectile\energy_vr.dm" -#include "code\modules\projectiles\projectile\explosive.dm" -#include "code\modules\projectiles\projectile\force.dm" -#include "code\modules\projectiles\projectile\hook.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\magnetic.dm" -#include "code\modules\projectiles\projectile\pellets.dm" -#include "code\modules\projectiles\projectile\scatter.dm" -#include "code\modules\projectiles\projectile\special.dm" -#include "code\modules\projectiles\projectile\trace.dm" -#include "code\modules\projectiles\targeting\targeting_client.dm" -#include "code\modules\projectiles\targeting\targeting_gun.dm" -#include "code\modules\projectiles\targeting\targeting_mob.dm" -#include "code\modules\projectiles\targeting\targeting_overlay.dm" -#include "code\modules\projectiles\targeting\targeting_triggers.dm" -#include "code\modules\radiation\radiation.dm" -#include "code\modules\random_map\_random_map_setup.dm" -#include "code\modules\random_map\random_map.dm" -#include "code\modules\random_map\random_map_verbs.dm" -#include "code\modules\random_map\automata\automata.dm" -#include "code\modules\random_map\automata\caves.dm" -#include "code\modules\random_map\building\building.dm" -#include "code\modules\random_map\drop\drop_types.dm" -#include "code\modules\random_map\drop\droppod.dm" -#include "code\modules\random_map\drop\droppod_doors.dm" -#include "code\modules\random_map\drop\supply.dm" -#include "code\modules\random_map\mazes\maze.dm" -#include "code\modules\random_map\mazes\maze_cell.dm" -#include "code\modules\random_map\noise\desert.dm" -#include "code\modules\random_map\noise\noise.dm" -#include "code\modules\random_map\noise\ore.dm" -#include "code\modules\random_map\noise\tundra.dm" -#include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Logging.dm" -#include "code\modules\reagents\Chemistry-Metabolism.dm" -#include "code\modules\reagents\holder\distilling.dm" -#include "code\modules\reagents\holder\holder.dm" -#include "code\modules\reagents\hoses\connector.dm" -#include "code\modules\reagents\hoses\hose.dm" -#include "code\modules\reagents\hoses\hose_connector.dm" -#include "code\modules\reagents\machinery\chem_master.dm" -#include "code\modules\reagents\machinery\chemalyzer.dm" -#include "code\modules\reagents\machinery\distillery.dm" -#include "code\modules\reagents\machinery\grinder.dm" -#include "code\modules\reagents\machinery\dispenser\_defines.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_presets.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_presets_vr.dm" -#include "code\modules\reagents\machinery\dispenser\cartridge_spawn.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser2.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser2_energy.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser_presets.dm" -#include "code\modules\reagents\machinery\dispenser\dispenser_presets_vr.dm" -#include "code\modules\reagents\machinery\dispenser\reagent_tank.dm" -#include "code\modules\reagents\machinery\dispenser\supply.dm" -#include "code\modules\reagents\reactions\_reactions.dm" -#include "code\modules\reagents\reactions\distilling\distilling.dm" -#include "code\modules\reagents\reactions\fusion\fusion.dm" -#include "code\modules\reagents\reactions\instant\drinks.dm" -#include "code\modules\reagents\reactions\instant\drinks_vr.dm" -#include "code\modules\reagents\reactions\instant\food.dm" -#include "code\modules\reagents\reactions\instant\food_vr.dm" -#include "code\modules\reagents\reactions\instant\instant.dm" -#include "code\modules\reagents\reactions\instant\instant_vr.dm" -#include "code\modules\reagents\reagent_containers\_reagent_containers.dm" -#include "code\modules\reagents\reagent_containers\blood_pack.dm" -#include "code\modules\reagents\reagent_containers\blood_pack_vr.dm" -#include "code\modules\reagents\reagent_containers\borghypo.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\glass_vr.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\hypospray_vr.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\pill_vr.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\spray_vr.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\reagents\reagent_containers\syringes_vr.dm" -#include "code\modules\reagents\reagent_containers\unidentified_hypospray.dm" -#include "code\modules\reagents\reagents\_helpers.dm" -#include "code\modules\reagents\reagents\_reagents.dm" -#include "code\modules\reagents\reagents\core.dm" -#include "code\modules\reagents\reagents\dispenser.dm" -#include "code\modules\reagents\reagents\food_drinks.dm" -#include "code\modules\reagents\reagents\food_drinks_vr.dm" -#include "code\modules\reagents\reagents\medicine.dm" -#include "code\modules\reagents\reagents\medicine_vr.dm" -#include "code\modules\reagents\reagents\modifiers.dm" -#include "code\modules\reagents\reagents\other.dm" -#include "code\modules\reagents\reagents\other_vr.dm" -#include "code\modules\reagents\reagents\toxins.dm" -#include "code\modules\reagents\reagents\vore_vr.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\disposal-construction.dm" -#include "code\modules\recycling\disposal.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\research\circuitprinter.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\mechfab_designs.dm" -#include "code\modules\research\message_server.dm" -#include "code\modules\research\prosfab_designs.dm" -#include "code\modules\research\prosfab_designs_vr.dm" -#include "code\modules\research\protolathe.dm" -#include "code\modules\research\rd-readme.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdconsole_tgui.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\teleport_vr.dm" -#include "code\modules\research\designs\ai_holders.dm" -#include "code\modules\research\designs\bag_of_holding.dm" -#include "code\modules\research\designs\beakers.dm" -#include "code\modules\research\designs\bio_devices.dm" -#include "code\modules\research\designs\bio_devices_vr.dm" -#include "code\modules\research\designs\circuit_assembly.dm" -#include "code\modules\research\designs\engineering.dm" -#include "code\modules\research\designs\HUDs.dm" -#include "code\modules\research\designs\HUDs_vr.dm" -#include "code\modules\research\designs\implants.dm" -#include "code\modules\research\designs\implants_vr.dm" -#include "code\modules\research\designs\locator_devices.dm" -#include "code\modules\research\designs\medical.dm" -#include "code\modules\research\designs\medical_vr.dm" -#include "code\modules\research\designs\mining_toys.dm" -#include "code\modules\research\designs\misc.dm" -#include "code\modules\research\designs\misc_vr.dm" -#include "code\modules\research\designs\modular_computer.dm" -#include "code\modules\research\designs\pdas.dm" -#include "code\modules\research\designs\power_cells.dm" -#include "code\modules\research\designs\precursor.dm" -#include "code\modules\research\designs\stock_parts.dm" -#include "code\modules\research\designs\subspace_parts.dm" -#include "code\modules\research\designs\tech_disks.dm" -#include "code\modules\research\designs\weapons.dm" -#include "code\modules\research\designs\weapons_vr.dm" -#include "code\modules\research\designs\xenoarch_toys.dm" -#include "code\modules\research\designs\xenobio_toys.dm" -#include "code\modules\research\designs\circuits\ai_modules.dm" -#include "code\modules\research\designs\circuits\ai_modules_vr.dm" -#include "code\modules\research\designs\circuits\circuits.dm" -#include "code\modules\research\designs\circuits\circuits_vr.dm" -#include "code\modules\research\designs\circuits\disks.dm" -#include "code\modules\resleeving\circuitboards.dm" -#include "code\modules\resleeving\computers.dm" -#include "code\modules\resleeving\designer.dm" -#include "code\modules\resleeving\documents.dm" -#include "code\modules\resleeving\implant.dm" -#include "code\modules\resleeving\infocore_records.dm" -#include "code\modules\resleeving\infomorph.dm" -#include "code\modules\resleeving\infomorph_software.dm" -#include "code\modules\resleeving\machines.dm" -#include "code\modules\resleeving\machines_vr.dm" -#include "code\modules\resleeving\resleeving_sickness.dm" -#include "code\modules\resleeving\sleevecard.dm" -#include "code\modules\rogueminer_vr\asteroid.dm" -#include "code\modules\rogueminer_vr\controller.dm" -#include "code\modules\rogueminer_vr\debug.dm" -#include "code\modules\rogueminer_vr\landmarks.dm" -#include "code\modules\rogueminer_vr\roguemines_mobs.dm" -#include "code\modules\rogueminer_vr\wrappers.dm" -#include "code\modules\rogueminer_vr\zone_console.dm" -#include "code\modules\rogueminer_vr\zonemaster.dm" -#include "code\modules\scripting\Errors.dm" -#include "code\modules\scripting\IDE.dm" -#include "code\modules\scripting\Options.dm" -#include "code\modules\scripting\stack.dm" -#include "code\modules\scripting\AST\AST Nodes.dm" -#include "code\modules\scripting\AST\Blocks.dm" -#include "code\modules\scripting\AST\Statements.dm" -#include "code\modules\scripting\AST\Operators\Binary Operators.dm" -#include "code\modules\scripting\AST\Operators\Unary Operators.dm" -#include "code\modules\scripting\Implementations\_Logic.dm" -#include "code\modules\scripting\Implementations\Telecomms.dm" -#include "code\modules\scripting\Interpreter\Evaluation.dm" -#include "code\modules\scripting\Interpreter\Interaction.dm" -#include "code\modules\scripting\Interpreter\Interpreter.dm" -#include "code\modules\scripting\Interpreter\Scope.dm" -#include "code\modules\scripting\Parser\Expressions.dm" -#include "code\modules\scripting\Parser\Keywords.dm" -#include "code\modules\scripting\Parser\Parser.dm" -#include "code\modules\scripting\Scanner\Scanner.dm" -#include "code\modules\scripting\Scanner\Tokens.dm" -#include "code\modules\security levels\keycard authentication.dm" -#include "code\modules\security levels\security levels.dm" -#include "code\modules\shieldgen\directional_shield.dm" -#include "code\modules\shieldgen\emergency_shield.dm" -#include "code\modules\shieldgen\energy_field.dm" -#include "code\modules\shieldgen\energy_shield.dm" -#include "code\modules\shieldgen\handheld_defuser.dm" -#include "code\modules\shieldgen\sheldwallgen.dm" -#include "code\modules\shieldgen\shield_capacitor.dm" -#include "code\modules\shieldgen\shield_diffuser.dm" -#include "code\modules\shieldgen\shield_gen.dm" -#include "code\modules\shieldgen\shield_gen_external.dm" -#include "code\modules\shieldgen\shield_generator.dm" -#include "code\modules\shieldgen\shield_modes.dm" -#include "code\modules\shuttles\antagonist.dm" -#include "code\modules\shuttles\crashes.dm" -#include "code\modules\shuttles\departmental.dm" -#include "code\modules\shuttles\escape_pods.dm" -#include "code\modules\shuttles\landmarks.dm" -#include "code\modules\shuttles\shuttle.dm" -#include "code\modules\shuttles\shuttle_autodock.dm" -#include "code\modules\shuttles\shuttle_console.dm" -#include "code\modules\shuttles\shuttle_console_multi.dm" -#include "code\modules\shuttles\shuttle_emergency.dm" -#include "code\modules\shuttles\shuttle_ferry.dm" -#include "code\modules\shuttles\shuttle_specops.dm" -#include "code\modules\shuttles\shuttle_supply.dm" -#include "code\modules\shuttles\shuttles_multi.dm" -#include "code\modules\shuttles\shuttles_vr.dm" -#include "code\modules\shuttles\shuttles_web.dm" -#include "code\modules\shuttles\web_datums.dm" -#include "code\modules\spells\artifacts.dm" -#include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" -#include "code\modules\spells\spells.dm" -#include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" -#include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\construct.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\rune_write.dm" -#include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\harvest.dm" -#include "code\modules\spells\targeted\mind_transfer.dm" -#include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\surgery\_defines.dm" -#include "code\modules\surgery\bones.dm" -#include "code\modules\surgery\encased.dm" -#include "code\modules\surgery\external_repair.dm" -#include "code\modules\surgery\face.dm" -#include "code\modules\surgery\generic.dm" -#include "code\modules\surgery\implant.dm" -#include "code\modules\surgery\limb_reattach.dm" -#include "code\modules\surgery\neck.dm" -#include "code\modules\surgery\organs_internal.dm" -#include "code\modules\surgery\other.dm" -#include "code\modules\surgery\robotics.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\~defines.dm" -#include "code\modules\tables\bench.dm" -#include "code\modules\tables\flipping.dm" -#include "code\modules\tables\interactions.dm" -#include "code\modules\tables\presets.dm" -#include "code\modules\tables\presets_vr.dm" -#include "code\modules\tables\rack.dm" -#include "code\modules\tables\rack_vr.dm" -#include "code\modules\tables\tables.dm" -#include "code\modules\tables\update_triggers.dm" -#include "code\modules\telesci\bscyrstal.dm" -#include "code\modules\telesci\construction.dm" -#include "code\modules\telesci\gps_advanced.dm" -#include "code\modules\telesci\quantum_pad.dm" -#include "code\modules\telesci\telepad.dm" -#include "code\modules\telesci\telesci_computer.dm" -#include "code\modules\tension\tension.dm" -#include "code\modules\tgs\includes.dm" -#include "code\modules\tgui\external.dm" -#include "code\modules\tgui\modal.dm" -#include "code\modules\tgui\states.dm" -#include "code\modules\tgui\tgui.dm" -#include "code\modules\tgui\tgui_alert.dm" -#include "code\modules\tgui\tgui_input_list.dm" -#include "code\modules\tgui\tgui_input_text.dm" -#include "code\modules\tgui\tgui_window.dm" -#include "code\modules\tgui\modules\_base.dm" -#include "code\modules\tgui\modules\admin_shuttle_controller.dm" -#include "code\modules\tgui\modules\agentcard.dm" -#include "code\modules\tgui\modules\alarm.dm" -#include "code\modules\tgui\modules\appearance_changer.dm" -#include "code\modules\tgui\modules\appearance_changer_vr.dm" -#include "code\modules\tgui\modules\atmos_control.dm" -#include "code\modules\tgui\modules\camera.dm" -#include "code\modules\tgui\modules\communications.dm" -#include "code\modules\tgui\modules\crew_manifest.dm" -#include "code\modules\tgui\modules\crew_monitor.dm" -#include "code\modules\tgui\modules\gyrotron_control.dm" -#include "code\modules\tgui\modules\law_manager.dm" -#include "code\modules\tgui\modules\overmap.dm" -#include "code\modules\tgui\modules\power_monitor.dm" -#include "code\modules\tgui\modules\rcon.dm" -#include "code\modules\tgui\modules\rustcore_monitor.dm" -#include "code\modules\tgui\modules\rustfuel_control.dm" -#include "code\modules\tgui\modules\shutoff_monitor.dm" -#include "code\modules\tgui\modules\supermatter_monitor.dm" -#include "code\modules\tgui\modules\teleporter.dm" -#include "code\modules\tgui\modules\ntos-only\cardmod.dm" -#include "code\modules\tgui\modules\ntos-only\configurator.dm" -#include "code\modules\tgui\modules\ntos-only\email.dm" -#include "code\modules\tgui\modules\ntos-only\uav.dm" -#include "code\modules\tgui\states\admin.dm" -#include "code\modules\tgui\states\always.dm" -#include "code\modules\tgui\states\conscious.dm" -#include "code\modules\tgui\states\contained.dm" -#include "code\modules\tgui\states\deep_inventory.dm" -#include "code\modules\tgui\states\default.dm" -#include "code\modules\tgui\states\hands.dm" -#include "code\modules\tgui\states\human_adjacent.dm" -#include "code\modules\tgui\states\inventory.dm" -#include "code\modules\tgui\states\inventory_vr.dm" -#include "code\modules\tgui\states\not_incapacitated.dm" -#include "code\modules\tgui\states\notcontained.dm" -#include "code\modules\tgui\states\observer.dm" -#include "code\modules\tgui\states\physical.dm" -#include "code\modules\tgui\states\self.dm" -#include "code\modules\tgui\states\vorepanel_vr.dm" -#include "code\modules\tgui\states\zlevel.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\turbolift\_turbolift.dm" -#include "code\modules\turbolift\turbolift.dm" -#include "code\modules\turbolift\turbolift_areas.dm" -#include "code\modules\turbolift\turbolift_console.dm" -#include "code\modules\turbolift\turbolift_console_vr.dm" -#include "code\modules\turbolift\turbolift_door.dm" -#include "code\modules\turbolift\turbolift_door_vr.dm" -#include "code\modules\turbolift\turbolift_floor.dm" -#include "code\modules\turbolift\turbolift_map.dm" -#include "code\modules\turbolift\turbolift_turfs.dm" -#include "code\modules\vchat\vchat_client.dm" -#include "code\modules\vchat\vchat_db.dm" -#include "code\modules\vehicles\bike.dm" -#include "code\modules\vehicles\boat.dm" -#include "code\modules\vehicles\cargo_train.dm" -#include "code\modules\vehicles\construction.dm" -#include "code\modules\vehicles\quad.dm" -#include "code\modules\vehicles\train.dm" -#include "code\modules\vehicles\vehicle.dm" -#include "code\modules\ventcrawl\ventcrawl.dm" -#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" -#include "code\modules\ventcrawl\ventcrawl_multiz.dm" -#include "code\modules\ventcrawl\ventcrawl_verb.dm" -#include "code\modules\virus2\admin.dm" -#include "code\modules\virus2\analyser.dm" -#include "code\modules\virus2\antibodies.dm" -#include "code\modules\virus2\centrifuge.dm" -#include "code\modules\virus2\curer.dm" -#include "code\modules\virus2\disease2.dm" -#include "code\modules\virus2\diseasesplicer.dm" -#include "code\modules\virus2\dishincubator.dm" -#include "code\modules\virus2\effect.dm" -#include "code\modules\virus2\effect_vr.dm" -#include "code\modules\virus2\helpers.dm" -#include "code\modules\virus2\isolator.dm" -#include "code\modules\virus2\items_devices.dm" -#include "code\modules\vore\hook-defs_vr.dm" -#include "code\modules\vore\trycatch_vr.dm" -#include "code\modules\vore\appearance\preferences_vr.dm" -#include "code\modules\vore\appearance\update_icons_vr.dm" -#include "code\modules\vore\eating\belly_dat_vr.dm" -#include "code\modules\vore\eating\belly_obj_vr.dm" -#include "code\modules\vore\eating\bellymodes_datum_vr.dm" -#include "code\modules\vore\eating\bellymodes_vr.dm" -#include "code\modules\vore\eating\contaminate_vr.dm" -#include "code\modules\vore\eating\digest_act_vr.dm" -#include "code\modules\vore\eating\leave_remains_vr.dm" -#include "code\modules\vore\eating\living_vr.dm" -#include "code\modules\vore\eating\silicon_vr.dm" -#include "code\modules\vore\eating\simple_animal_vr.dm" -#include "code\modules\vore\eating\transforming_vr.dm" -#include "code\modules\vore\eating\vore_vr.dm" -#include "code\modules\vore\eating\vorehooks_vr.dm" -#include "code\modules\vore\eating\vorepanel_vr.dm" -#include "code\modules\vore\fluffstuff\custom_boxes_vr.dm" -#include "code\modules\vore\fluffstuff\custom_clothes_vr.dm" -#include "code\modules\vore\fluffstuff\custom_items_vr.dm" -#include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" -#include "code\modules\vore\fluffstuff\custom_permits_vr.dm" -#include "code\modules\vore\persist\persist_vr.dm" -#include "code\modules\vore\resizing\grav_pull_vr.dm" -#include "code\modules\vore\resizing\holder_micro_vr.dm" -#include "code\modules\vore\resizing\resize_vr.dm" -#include "code\modules\vore\resizing\sizegun_vr.dm" -#include "code\modules\vore\smoleworld\smoleworld_vr.dm" -#include "code\modules\vore\weight\fitness_machines_vr.dm" -#include "code\modules\webhooks\_webhook.dm" -#include "code\modules\webhooks\webhook_ahelp2discord.dm" -#include "code\modules\webhooks\webhook_custom_event.dm" -#include "code\modules\webhooks\webhook_fax2discord.dm" -#include "code\modules\webhooks\webhook_roundend.dm" -#include "code\modules\webhooks\webhook_roundprep.dm" -#include "code\modules\webhooks\webhook_roundstart.dm" -#include "code\modules\xenoarcheaology\anomaly_container.dm" -#include "code\modules\xenoarcheaology\boulder.dm" -#include "code\modules\xenoarcheaology\effect.dm" -#include "code\modules\xenoarcheaology\manuals.dm" -#include "code\modules\xenoarcheaology\misc.dm" -#include "code\modules\xenoarcheaology\sampling.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" -#include "code\modules\xenoarcheaology\artifacts\artifact_vr.dm" -#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" -#include "code\modules\xenoarcheaology\artifacts\crystal.dm" -#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" -#include "code\modules\xenoarcheaology\artifacts\replicator.dm" -#include "code\modules\xenoarcheaology\artifacts\predefined\_predefined.dm" -#include "code\modules\xenoarcheaology\artifacts\predefined\hungry_statue.dm" -#include "code\modules\xenoarcheaology\effects\animate_anomaly.dm" -#include "code\modules\xenoarcheaology\effects\badfeeling.dm" -#include "code\modules\xenoarcheaology\effects\berserk.dm" -#include "code\modules\xenoarcheaology\effects\cannibal.dm" -#include "code\modules\xenoarcheaology\effects\cellcharge.dm" -#include "code\modules\xenoarcheaology\effects\celldrain.dm" -#include "code\modules\xenoarcheaology\effects\cold.dm" -#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" -#include "code\modules\xenoarcheaology\effects\electric_field.dm" -#include "code\modules\xenoarcheaology\effects\emp.dm" -#include "code\modules\xenoarcheaology\effects\feysight.dm" -#include "code\modules\xenoarcheaology\effects\forcefield.dm" -#include "code\modules\xenoarcheaology\effects\gaia.dm" -#include "code\modules\xenoarcheaology\effects\gasco2.dm" -#include "code\modules\xenoarcheaology\effects\gasnitro.dm" -#include "code\modules\xenoarcheaology\effects\gasoxy.dm" -#include "code\modules\xenoarcheaology\effects\gasphoron.dm" -#include "code\modules\xenoarcheaology\effects\gassleeping.dm" -#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" -#include "code\modules\xenoarcheaology\effects\gravitational_waves.dm" -#include "code\modules\xenoarcheaology\effects\heal.dm" -#include "code\modules\xenoarcheaology\effects\heat.dm" -#include "code\modules\xenoarcheaology\effects\hurt.dm" -#include "code\modules\xenoarcheaology\effects\poltergeist.dm" -#include "code\modules\xenoarcheaology\effects\radiate.dm" -#include "code\modules\xenoarcheaology\effects\resurrect.dm" -#include "code\modules\xenoarcheaology\effects\roboheal.dm" -#include "code\modules\xenoarcheaology\effects\robohurt.dm" -#include "code\modules\xenoarcheaology\effects\sleepy.dm" -#include "code\modules\xenoarcheaology\effects\stun.dm" -#include "code\modules\xenoarcheaology\effects\teleport.dm" -#include "code\modules\xenoarcheaology\effects\vampire.dm" -#include "code\modules\xenoarcheaology\finds\eguns.dm" -#include "code\modules\xenoarcheaology\finds\eguns_vr.dm" -#include "code\modules\xenoarcheaology\finds\find_spawning.dm" -#include "code\modules\xenoarcheaology\finds\finds.dm" -#include "code\modules\xenoarcheaology\finds\finds_defines.dm" -#include "code\modules\xenoarcheaology\finds\fossils.dm" -#include "code\modules\xenoarcheaology\finds\misc.dm" -#include "code\modules\xenoarcheaology\finds\special.dm" -#include "code\modules\xenoarcheaology\finds\talking.dm" -#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" -#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" -#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" -#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" -#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" -#include "code\modules\xenoarcheaology\tools\equipment.dm" -#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" -#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" -#include "code\modules\xenoarcheaology\tools\tools.dm" -#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" -#include "code\modules\xenoarcheaology\tools\tools_pickaxe_vr.dm" -#include "code\modules\xenoarcheaology\tools\tools_vr.dm" -#include "code\modules\xenobio\items\extracts.dm" -#include "code\modules\xenobio\items\slime_objects.dm" -#include "code\modules\xenobio\items\slimepotions.dm" -#include "code\modules\xenobio\items\weapons.dm" -#include "code\modules\xenobio\machinery\processor.dm" -#include "code\modules\xgm\xgm_gas_data.dm" -#include "code\modules\xgm\xgm_gas_mixture.dm" -#include "code\unit_tests\decl_tests.dm" -#include "code\unit_tests\language_tests.dm" -#include "code\unit_tests\loadout_tests.dm" -#include "code\unit_tests\map_tests.dm" -#include "code\unit_tests\material_tests.dm" -#include "code\unit_tests\mob_tests.dm" -#include "code\unit_tests\recipe_tests.dm" -#include "code\unit_tests\research_tests.dm" -#include "code\unit_tests\sqlite_tests.dm" -#include "code\unit_tests\subsystem_tests.dm" -#include "code\unit_tests\unit_test.dm" -#include "code\unit_tests\unit_test_vr.dm" -#include "code\unit_tests\vore_tests_vr.dm" -#include "code\unit_tests\zas_tests.dm" -#include "code\unit_tests\integrated_circuits\arithmetic.dm" -#include "code\unit_tests\integrated_circuits\circuits.dm" -#include "code\unit_tests\integrated_circuits\converter.dm" -#include "code\unit_tests\integrated_circuits\logic.dm" -#include "code\unit_tests\integrated_circuits\trig.dm" -#include "code\ZAS\Airflow.dm" -#include "code\ZAS\Atom.dm" -#include "code\ZAS\Connection.dm" -#include "code\ZAS\ConnectionGroup.dm" -#include "code\ZAS\ConnectionManager.dm" -#include "code\ZAS\Controller.dm" -#include "code\ZAS\Debug.dm" -#include "code\ZAS\Diagnostic.dm" -#include "code\ZAS\Fire.dm" -#include "code\ZAS\Phoron.dm" -#include "code\ZAS\Turf.dm" -#include "code\ZAS\Variable Settings.dm" -#include "code\ZAS\Zone.dm" -#include "interface\interface.dm" -#include "interface\skin.dmf" -#include "maps\gateway_archive_vr\blackmarketpackers.dm" -#include "maps\offmap_vr\om_ships\abductor.dm" -#include "maps\southern_cross\items\clothing\sc_accessory.dm" -#include "maps\southern_cross\items\clothing\sc_suit.dm" -#include "maps\southern_cross\items\clothing\sc_under.dm" -#include "maps\southern_cross\loadout\loadout_suit.dm" -#include "maps\southern_cross\loadout\loadout_uniform.dm" -#include "maps\southern_cross\loadout\loadout_vr.dm" -#include "maps\submaps\_helpers.dm" -#include "maps\submaps\_readme.dm" -#include "maps\submaps\engine_submaps\engine.dm" -#include "maps\submaps\engine_submaps\engine_areas.dm" -#include "maps\submaps\engine_submaps_vr\tether\_engine_submaps.dm" -#include "maps\submaps\space_submaps\space.dm" -#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" -#include "maps\submaps\surface_submaps\mountains\mountains.dm" -#include "maps\submaps\surface_submaps\mountains\mountains_areas.dm" -#include "maps\submaps\surface_submaps\mountains\mountains_areas_vr.dm" -#include "maps\submaps\surface_submaps\plains\plains.dm" -#include "maps\submaps\surface_submaps\plains\plains_areas.dm" -#include "maps\submaps\surface_submaps\wilderness\wilderness.dm" -#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" -#include "maps\tether\tether.dm" -#include "maps\~map_system\maps.dm" -// END_INCLUDE ->>>>>>> eb76662be1... Merge pull request #11112 from MisterGrimm/XenomorphOverhaul From b6c96f375aea5d68423d836fdeeb33a309523b5d Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:39:11 -0400 Subject: [PATCH 56/86] powder that makes you say yes --- code/modules/clothing/clothing.dm | 2130 ----------------------------- 1 file changed, 2130 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d55902f268..bf81706f3f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /obj/item/clothing name = "clothing" siemens_coefficient = 0.9 @@ -17,13 +16,6 @@ var/list/enables_planes //Enables these planes in the wearing mob's plane_holder var/list/plane_slots //But only if it's equipped into this specific slot - /* - Sprites used when the clothing item is refit. This is done by setting icon_override. - For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. - Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), - while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). - */ - var/list/sprite_sheets_refit = null var/ear_protection = 0 var/blood_sprite_state @@ -164,9 +156,6 @@ species_restricted = list(target_species) //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) icon = sprite_sheets_obj[target_species] else @@ -212,9 +201,6 @@ species_restricted = list(target_species) //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) icon = sprite_sheets_obj[target_species] else @@ -1060,2119 +1046,3 @@ /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() -||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks -/obj/item/clothing - name = "clothing" - siemens_coefficient = 0.9 - drop_sound = 'sound/items/drop/clothing.ogg' - pickup_sound = 'sound/items/pickup/clothing.ogg' - var/list/species_restricted = null //Only these species can wear this kit. - var/gunshot_residue //Used by forensics. - - var/list/accessories - var/list/valid_accessory_slots - var/list/restricted_accessory_slots - var/list/starting_accessories - - var/flash_protection = FLASH_PROTECTION_NONE - var/tint = TINT_NONE - var/list/enables_planes //Enables these planes in the wearing mob's plane_holder - var/list/plane_slots //But only if it's equipped into this specific slot - - /* - Sprites used when the clothing item is refit. This is done by setting icon_override. - For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. - Ideally, sprite_sheets_refit should be used for "hard" clothing items that can't change shape very well to fit the wearer (e.g. helmets, hardsuits), - while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. aliens wearing jumpsuits). - */ - var/list/sprite_sheets_refit = null - var/ear_protection = 0 - var/blood_sprite_state - - var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing - - var/polychromic = FALSE //VOREStation edit - -//Updates the icons of the mob wearing the clothing item, if any. -/obj/item/clothing/proc/update_clothing_icon() - return - -// Aurora forensics port. -/obj/item/clothing/clean_blood() - . = ..() - gunshot_residue = null - - -/obj/item/clothing/New() - ..() - if(starting_accessories) - for(var/T in starting_accessories) - var/obj/item/clothing/accessory/tie = new T(src) - src.attach_accessory(null, tie) - set_clothing_index() - - //VOREStation edit start - if(polychromic) - verbs |= /obj/item/clothing/proc/change_color - //VOREStation edit start - -/obj/item/clothing/update_icon() - cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. - if(blood_DNA) - add_blood() - . = ..() - -/obj/item/clothing/equipped(var/mob/user,var/slot) - ..() - if(enables_planes) - user.recalculate_vis() - -/obj/item/clothing/dropped(var/mob/user) - ..() - if(enables_planes) - user.recalculate_vis() - -//BS12: Species-restricted clothing check. -/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) - - //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) - if (!..()) - return 0 - - if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) - var/exclusive = null - var/wearable = null - var/mob/living/carbon/human/H = M - - if("exclude" in species_restricted) - exclusive = 1 - - if(H.species) - if(exclusive) - if(!(H.species.get_bodytype(H) in species_restricted)) - wearable = 1 - else - if(H.species.get_bodytype(H) in species_restricted) - wearable = 1 - - if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) - to_chat(H, "Your species cannot wear [src].") - return 0 - return 1 - -/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - . = ..() - if((. == 0) && LAZYLEN(accessories)) - for(var/obj/item/I in accessories) - var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) - - if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. - . = check - break - -// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. -/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_low_temperature(tempcheck)) - . = TRUE - - if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) - . = TRUE - -/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_high_temperature(tempcheck)) - . = TRUE - - if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) - . = TRUE - -// Returns the relative flag-vars for covered protection. -/obj/item/clothing/proc/get_cold_protection_flags() - . = cold_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_cold_protection_flags() - -/obj/item/clothing/proc/get_heat_protection_flags() - . = heat_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_heat_protection_flags() - -/obj/item/clothing/proc/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -//VOREStation edit start -/obj/item/clothing/proc/change_color() - set name = "Change Color" - set category = "Object" - set desc = "Change the color of the clothing." - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - var/new_color = input(usr, "Pick a new color", "Color", color) as color|null - - if(new_color && (new_color != color)) - color = new_color - update_icon() - update_clothing_icon() -//VOREStation edit end - -/obj/item/clothing/head/helmet/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN) - species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_SKRELL) - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_refit && (target_species in sprite_sheets_refit)) - LAZYSET(sprite_sheets, target_species, sprite_sheets_refit[target_species]) - - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -/////////////////////////////////////////////////////////////////////// -// Ears: headsets, earmuffs and tiny objects -/obj/item/clothing/ears - name = "ears" - w_class = ITEMSIZE_TINY - throwforce = 2 - slot_flags = SLOT_EARS - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') - -/obj/item/clothing/ears/attack_hand(mob/user as mob) - if (!user) return - - if (src.loc != user || !istype(user,/mob/living/carbon/human)) - ..() - return - - var/mob/living/carbon/human/H = user - if(H.l_ear != src && H.r_ear != src) - ..() - return - - if(!canremove) - return - - var/obj/item/clothing/ears/O - if(slot_flags & SLOT_TWOEARS ) - O = (H.l_ear == src ? H.r_ear : H.l_ear) - user.u_equip(O) - if(!istype(src,/obj/item/clothing/ears/offear)) - qdel(O) - O = src - else - O = src - - user.unEquip(src) - - if (O) - user.put_in_hands(O) - O.add_fingerprint(user) - - if(istype(src,/obj/item/clothing/ears/offear)) - qdel(src) - -/obj/item/clothing/ears/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_ears() - -/obj/item/clothing/ears/MouseDrop(var/obj/over_object) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one - if(slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) - if(istype(src, /obj/item/clothing/ears/offear)) - . = O.MouseDrop(over_object) - H.drop_from_inventory(src) - qdel(src) - else - . = ..() - H.drop_from_inventory(O) - qdel(O) - else - . = ..() - - -/obj/item/clothing/ears/offear - name = "Other ear" - w_class = ITEMSIZE_HUGE - icon = 'icons/mob/screen1_Midnight.dmi' - icon_state = "block" - slot_flags = SLOT_EARS | SLOT_TWOEARS - -/obj/item/clothing/ears/offear/New(var/obj/O) - name = O.name - desc = O.desc - icon = O.icon - icon_state = O.icon_state - set_dir(O.dir) - -//////////////////////////////////////////////////////////////////////////////////////// -//Gloves -/obj/item/clothing/gloves - name = "gloves" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', - ) - gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = ITEMSIZE_SMALL - icon = 'icons/inventory/hands/item.dmi' - siemens_coefficient = 0.9 - blood_sprite_state = "bloodyhands" - var/wired = 0 - var/obj/item/weapon/cell/cell = 0 - var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through - var/obj/item/clothing/gloves/ring = null //Covered ring - var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping - var/glove_level = 2 //What "layer" the glove is on - var/overgloves = 0 //Used by gauntlets and arm_guards - var/punch_force = 0 //How much damage do these gloves add to a punch? - var/punch_damtype = BRUTE //What type of damage does this make fists be? - body_parts_covered = HANDS - slot_flags = SLOT_GLOVES - attack_verb = list("challenged") - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/gloves.ogg' - pickup_sound = 'sound/items/pickup/gloves.ogg' - -/obj/item/clothing/proc/set_clothing_index() - return - -/obj/item/clothing/gloves/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_gloves() - -/obj/item/clothing/gloves/emp_act(severity) - if(cell) - cell.emp_act(severity) - if(ring) - ring.emp_act(severity) - ..() - -// Called just before an attack_hand(), in mob/UnarmedAttack() -/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) - return 0 // return 1 to cancel attack_hand() - -/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) - if (clipped) - to_chat(user, "The [src] have already been clipped!") - update_icon() - return - - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") - - clipped = 1 - name = "modified [name]" - desc = "[desc]
    They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= SPECIES_UNATHI - species_restricted -= SPECIES_TAJ - return -*/ - -/obj/item/clothing/gloves/clean_blood() - . = ..() - transfer_blood = 0 - update_icon() - -/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) - var/mob/living/carbon/human/H = user - - if(slot && slot == slot_gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G)) - ring = H.gloves - if(ring.glove_level >= src.glove_level) - to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") - ring = null - return 0 - else - H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. - ring.forceMove(src) - to_chat(user, "You slip \the [src] on over \the [src.ring].") - if(!(flags & THICKMATERIAL)) - punch_force += ring.punch_force - else - ring = null - - if(!..()) - if(ring) //Put the ring back on if the check fails. - if(H.equip_to_slot_if_possible(ring, slot_gloves)) - src.ring = null - punch_force = initial(punch_force) - return 0 - - wearer = H //TODO clean this when magboots are cleaned - return 1 - -/obj/item/clothing/gloves/dropped() - ..() - - if(!wearer) - return - - var/mob/living/carbon/human/H = wearer - if(ring && istype(H)) - if(!H.equip_to_slot_if_possible(ring, slot_gloves)) - ring.forceMove(get_turf(src)) - src.ring = null - punch_force = initial(punch_force) - wearer = null - -/obj/item/clothing/gloves - var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? - var/special_attack_type = null - -/obj/item/clothing/gloves/New() - ..() - if(special_attack_type && ispath(special_attack_type)) - special_attack = new special_attack_type - - - -///////////////////////////////////////////////////////////////////// -//Rings - -/obj/item/clothing/gloves/ring - name = "ring" - w_class = ITEMSIZE_TINY - icon = 'icons/inventory/hands/item.dmi' - gender = NEUTER - species_restricted = list("exclude", SPECIES_DIONA) - siemens_coefficient = 1 - glove_level = 1 - fingerprint_chance = 100 - punch_force = 2 - body_parts_covered = 0 - drop_sound = 'sound/items/drop/ring.ogg' - pickup_sound = 'sound/items/pickup/ring.ogg' - -/////////////////////////////////////////////////////////////////////// -//Head -/obj/item/clothing/head - name = "head" - icon = 'icons/inventory/head/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_HEAD - w_class = ITEMSIZE_SMALL - blood_sprite_state = "helmetblood" - - light_system = MOVABLE_LIGHT_DIRECTIONAL - light_cone_y_offset = 11 - - var/light_overlay = "helmet_light" - var/image/helmet_light - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/hat.ogg' - pickup_sound = 'sound/items/pickup/hat.ogg' - -/obj/item/clothing/head/attack_self(mob/user) - if(light_range) - if(!isturf(user.loc)) - to_chat(user, "You cannot toggle the light while in this [user.loc]") - return - update_flashlight(user) - to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") - else - return ..(user) - -/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) - set_light_on(!light_on) - - if(light_system == STATIC_LIGHT) - update_light() - - update_icon(user) - user.update_action_buttons() - -/obj/item/clothing/head/attack_ai(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/attack_generic(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) - if(!Adjacent(user)) - return 0 - var/success - if(istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - else if(istype(user, /mob/living/carbon/alien/diona)) - var/mob/living/carbon/alien/diona/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - - if(!success) - return 0 - else if(success == 2) - to_chat(user, "You are already wearing a hat.") - else if(success == 1) - to_chat(user, "You crawl under \the [src].") - return 1 - -/obj/item/clothing/head/update_icon(var/mob/user) - var/mob/living/carbon/human/H - if(ishuman(user)) - H = user - - if(light_on) - // Generate object icon. - if(!light_overlay_cache["[light_overlay]_icon"]) - light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") - helmet_light = light_overlay_cache["[light_overlay]_icon"] - add_overlay(helmet_light) - - // Generate and cache the on-mob icon, which is used in update_inv_head(). - var/body_type = (H && H.species.get_bodytype(H)) - var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" - if(!light_overlay_cache[cache_key]) - var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' - light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") - - else if(helmet_light) - cut_overlay(helmet_light) - helmet_light = null - - user.update_inv_head() //Will redraw the helmet with the light on the mob - -/obj/item/clothing/head/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_head() - -/////////////////////////////////////////////////////////////////////// -//Mask -/obj/item/clothing/mask - name = "mask" - icon = 'icons/inventory/face/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_MASK - body_parts_covered = FACE|EYES - blood_sprite_state = "maskblood" - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', - SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', - SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' - ) - - var/voicechange = 0 - var/list/say_messages - var/list/say_verbs - - drop_sound = "generic_drop" - pickup_sound = "generic_pickup" - -/obj/item/clothing/mask/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_mask() - -/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) - return - -/////////////////////////////////////////////////////////////////////// -//Shoes -/obj/item/clothing/shoes - name = "shoes" - icon = 'icons/inventory/feet/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', - ) - desc = "Comfortable-looking shoes." - gender = PLURAL //Carn: for grammarically correct text-parsing - siemens_coefficient = 0.9 - body_parts_covered = FEET - slot_flags = SLOT_FEET - blood_sprite_state = "shoeblood" - - var/can_hold_knife = 0 - var/obj/item/holding - - var/shoes_under_pants = 0 - - var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed - var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed - var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. - - var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are - - permeability_coefficient = 0.50 - slowdown = SHOES_SLOWDOWN - force = 2 - var/overshoes = 0 - species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/shoes.ogg' - pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/clothing/shoes/proc/draw_knife() - set name = "Draw Boot Knife" - set desc = "Pull out your boot knife." - set category = "IC" - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - holding.forceMove(get_turf(usr)) - - if(usr.put_in_hands(holding)) - usr.visible_message("\The [usr] pulls a knife out of their boot!") - playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) - holding = null - cut_overlay("[icon_state]_knife") - else - to_chat(usr, "Your need an empty, unbroken hand to do that.") - holding.forceMove(src) - - if(!holding) - verbs -= /obj/item/clothing/shoes/proc/draw_knife - - update_icon() - return - -/obj/item/clothing/shoes/attack_hand(var/mob/living/M) - if(can_hold_knife == 1 && holding && src.loc == M) - draw_knife() - return - ..() - -/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) - if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ - istype(I, /obj/item/weapon/material/butterfly) || \ - istype(I, /obj/item/weapon/material/kitchen/utensil) || \ - istype(I, /obj/item/weapon/material/knife/tacknife))) - if(holding) - to_chat(user, "\The [src] is already holding \a [holding].") - return - user.unEquip(I) - I.forceMove(src) - holding = I - user.visible_message("\The [user] shoves \the [I] into \the [src].") - verbs |= /obj/item/clothing/shoes/proc/draw_knife - update_icon() - else - return ..() - -/obj/item/clothing/shoes/verb/toggle_layer() - set name = "Switch Shoe Layer" - set category = "Object" - - if(shoes_under_pants == -1) - to_chat(usr, "\The [src] cannot be worn above your suit!") - return - shoes_under_pants = !shoes_under_pants - update_icon() - -/obj/item/clothing/shoes/update_icon() - . = ..() - if(holding) - add_overlay("[icon_state]_knife") - if(contaminated) - add_overlay(contamination_overlay) - if(gurgled) //VOREStation Edit Start - decontaminate() - gurgle_contaminate() //VOREStation Edit End - if(ismob(usr)) - var/mob/M = usr - M.update_inv_shoes() - -/obj/item/clothing/shoes/clean_blood() - update_icon() - return ..() - -/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) - if(prob(1) && !recent_squish) //VOREStation edit begin - recent_squish = 1 - spawn(100) - recent_squish = 0 - for(var/mob/living/M in contents) - var/emote = pick(inside_emotes) - to_chat(M,emote) //VOREStation edit end - return - -/obj/item/clothing/shoes/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_shoes() - - -/////////////////////////////////////////////////////////////////////// -//Suit -/obj/item/clothing/suit - icon = 'icons/inventory/suit/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', - ) - name = "suit" - var/fire_resist = T0C+100 - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - allowed = list(/obj/item/weapon/tank/emergency/oxygen) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) - slot_flags = SLOT_OCLOTHING - var/blood_overlay_type = "suit" - blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. - - var/taurized = FALSE - siemens_coefficient = 0.9 - w_class = ITEMSIZE_NORMAL - preserve_item = 1 - equip_sound = 'sound/items/jumpsuit_equip.ogg' - - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' - ) - - valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) - restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_suit() - -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/taurtail = istaurtail(H.tail_style) - if((taurized && !taurtail) || (!taurized && taurtail)) - taurize(user, taurtail) - - return ..() - -/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) - if(has_taur_tail) - var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - taurized = TRUE - // means that if a taur puts on an already taurized suit without a taur sprite - // for their taur type, but the previous taur type had a sprite, it stays - // taurized and they end up with that taur style which is funny - else - taurized = FALSE - - if(!taurized) - icon_override = initial(icon_override) - taurized = FALSE - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - - -/////////////////////////////////////////////////////////////////////// -//Under clothing -/obj/item/clothing/under - icon = 'icons/inventory/uniform/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', - ) - name = "under" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - permeability_coefficient = 0.90 - slot_flags = SLOT_ICLOTHING - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - equip_sound = 'sound/items/jumpsuit_equip.ogg' - w_class = ITEMSIZE_NORMAL - show_messages = 1 - blood_sprite_state = "uniformblood" - - var/has_sensor = 1 //For the crew computer 2 = unable to change mode - var/sensor_mode = 0 - /* - 1 = Report living/dead - 2 = Report detailed damages - 3 = Report location - */ - var/displays_id = 1 - var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' - ) - - //convenience var for defining the icon state for the overlay used when the clothing is worn. - //Also used by rolling/unrolling. - var/worn_state = null - valid_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_DECOR\ - |ACCESSORY_SLOT_MEDAL\ - |ACCESSORY_SLOT_INSIGNIA\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - restricted_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - - var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' - var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' - -/obj/item/clothing/under/attack_hand(var/mob/user) - if(LAZYLEN(accessories)) - ..() - if ((ishuman(usr) || issmall(usr)) && src.loc == user) - return - ..() - -/obj/item/clothing/under/New() - ..() - if(worn_state) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - worn_state = icon_state - - //autodetect rollability - if(rolled_down < 0) - if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) - rolled_down = 0 - - if(rolled_down == -1) - verbs -= /obj/item/clothing/under/verb/rollsuit - if(rolled_sleeves == -1) - verbs -= /obj/item/clothing/under/verb/rollsleeves - -/obj/item/clothing/under/proc/update_rolldown_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_icon)) - under_icon = rolled_down_icon - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) - if(rolled_down != 1) - rolled_down = 0 - else - rolled_down = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/proc/update_rollsleeves_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) - under_icon = rolled_down_sleeves_icon - else - under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) - if(rolled_sleeves != 1) - rolled_sleeves = 0 - else - rolled_sleeves = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_w_uniform() - - set_clothing_index() - - -/obj/item/clothing/under/examine(mob/user) - . = ..() - switch(src.sensor_mode) - if(0) - . += "Its sensors appear to be disabled." - if(1) - . += "Its binary life sensors appear to be enabled." - if(2) - . += "Its vital tracker appears to be enabled." - if(3) - . += "Its vital tracker and tracking beacon appear to be enabled." - -/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) - var/mob/M = usr - if (istype(M, /mob/observer)) return - if (usr.stat || usr.restrained()) return - if(has_sensor >= 2) - to_chat(usr, "The controls are locked.") - return 0 - if(has_sensor <= 0) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") - var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away.") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") - if(1) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") - if(2) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") - if(3) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") - - else if (istype(src.loc, /mob)) - usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") - -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - set_sensors(usr) - -/obj/item/clothing/under/verb/rollsuit() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rolldown_status() - if(rolled_down == -1) - to_chat(usr, "You cannot roll down [src]!") - return - if((rolled_sleeves == 1) && !(rolled_down)) - rolled_sleeves = 0 - - rolled_down = !rolled_down - if(rolled_down) - body_parts_covered = initial(body_parts_covered) - body_parts_covered &= ~(UPPER_TORSO|ARMS) - if(worn_state in cached_icon_states(rolled_down_icon)) - icon_override = rolled_down_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") - - to_chat(usr, "You roll down your [src].") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll up your [src].") - update_clothing_icon() - -/obj/item/clothing/under/verb/rollsleeves() - set name = "Roll Up Sleeves" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rollsleeves_status() - if(rolled_sleeves == -1) - to_chat(usr, "You cannot roll up your [src]'s sleeves!") - return - if(rolled_down == 1) - to_chat(usr, "You must roll up your [src] first!") - return - - rolled_sleeves = !rolled_sleeves - if(rolled_sleeves) - body_parts_covered &= ~(ARMS) - if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) - icon_override = rolled_down_sleeves_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") - to_chat(usr, "You roll up your [src]'s sleeves.") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_sleeves_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll down your [src]'s sleeves.") - update_clothing_icon() - -/obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) - ..() -======= -/obj/item/clothing - name = "clothing" - siemens_coefficient = 0.9 - drop_sound = 'sound/items/drop/clothing.ogg' - pickup_sound = 'sound/items/pickup/clothing.ogg' - var/list/species_restricted = null //Only these species can wear this kit. - var/gunshot_residue //Used by forensics. - - var/list/accessories - var/list/valid_accessory_slots - var/list/restricted_accessory_slots - var/list/starting_accessories - - var/flash_protection = FLASH_PROTECTION_NONE - var/tint = TINT_NONE - var/list/enables_planes //Enables these planes in the wearing mob's plane_holder - var/list/plane_slots //But only if it's equipped into this specific slot - - var/ear_protection = 0 - var/blood_sprite_state - - var/update_icon_define = null // Only needed if you've got multiple files for the same type of clothing - - var/polychromic = FALSE //VOREStation edit - -//Updates the icons of the mob wearing the clothing item, if any. -/obj/item/clothing/proc/update_clothing_icon() - return - -// Aurora forensics port. -/obj/item/clothing/clean_blood() - . = ..() - gunshot_residue = null - - -/obj/item/clothing/New() - ..() - if(starting_accessories) - for(var/T in starting_accessories) - var/obj/item/clothing/accessory/tie = new T(src) - src.attach_accessory(null, tie) - set_clothing_index() - - //VOREStation edit start - if(polychromic) - verbs |= /obj/item/clothing/proc/change_color - //VOREStation edit start - -/obj/item/clothing/update_icon() - cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. - if(blood_DNA) - add_blood() - . = ..() - -/obj/item/clothing/equipped(var/mob/user,var/slot) - ..() - if(enables_planes) - user.recalculate_vis() - -/obj/item/clothing/dropped(var/mob/user) - ..() - if(enables_planes) - user.recalculate_vis() - -//BS12: Species-restricted clothing check. -/obj/item/clothing/mob_can_equip(M as mob, slot, disable_warning = FALSE) - - //if we can't equip the item anyway, don't bother with species_restricted (cuts down on spam) - if (!..()) - return 0 - - if(LAZYLEN(species_restricted) && istype(M,/mob/living/carbon/human)) - var/exclusive = null - var/wearable = null - var/mob/living/carbon/human/H = M - - if("exclude" in species_restricted) - exclusive = 1 - - if(H.species) - if(exclusive) - if(!(H.species.get_bodytype(H) in species_restricted)) - wearable = 1 - else - if(H.species.get_bodytype(H) in species_restricted) - wearable = 1 - - if(!wearable && !(slot in list(slot_l_store, slot_r_store, slot_s_store))) - to_chat(H, "Your species cannot wear [src].") - return 0 - return 1 - -/obj/item/clothing/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - . = ..() - if((. == 0) && LAZYLEN(accessories)) - for(var/obj/item/I in accessories) - var/check = I.handle_shield(user, damage, damage_source, attacker, def_zone, attack_text) - - if(check != 0) // Projectiles sometimes use negatives IIRC, 0 is only returned if something is not blocked. - . = check - break - -// For now, these two temp procs only return TRUE or FALSE if they can provide resistance to a given temperature. -/obj/item/clothing/proc/handle_low_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_low_temperature(tempcheck)) - . = TRUE - - if(min_cold_protection_temperature && min_cold_protection_temperature <= tempcheck) - . = TRUE - -/obj/item/clothing/proc/handle_high_temperature(var/tempcheck = T20C) - . = FALSE - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - if(C.handle_high_temperature(tempcheck)) - . = TRUE - - if(max_heat_protection_temperature && max_heat_protection_temperature >= tempcheck) - . = TRUE - -// Returns the relative flag-vars for covered protection. -/obj/item/clothing/proc/get_cold_protection_flags() - . = cold_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_cold_protection_flags() - -/obj/item/clothing/proc/get_heat_protection_flags() - . = heat_protection - - if(LAZYLEN(accessories)) - for(var/obj/item/clothing/C in accessories) - . |= C.get_heat_protection_flags() - -/obj/item/clothing/proc/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN, SPECIES_SKRELL) //humanoid bodytypes - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -//VOREStation edit start -/obj/item/clothing/proc/change_color() - set name = "Change Color" - set category = "Object" - set desc = "Change the color of the clothing." - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - var/new_color = input(usr, "Pick a new color", "Color", color) as color|null - - if(new_color && (new_color != color)) - color = new_color - update_icon() - update_clothing_icon() -//VOREStation edit end - -/obj/item/clothing/head/helmet/refit_for_species(var/target_species) - if(!species_restricted) - return //this item doesn't use the species_restricted system - - //Set species_restricted list - switch(target_species) - //VOREStation Edit Start - if(SPECIES_HUMAN) - species_restricted = list(SPECIES_HUMAN, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_SKRELL) - species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_RAPALA, SPECIES_VASILISSAN, SPECIES_ALRAUNE, SPECIES_PROMETHEAN, SPECIES_XENOCHIMERA) - if(SPECIES_UNATHI) - species_restricted = list(SPECIES_UNATHI, SPECIES_XENOHYBRID) - if(SPECIES_VULPKANIN) - species_restricted = list(SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_FENNEC) - if(SPECIES_SERGAL) - species_restricted = list(SPECIES_SERGAL, SPECIES_NEVREAN) - //VOREStation Edit End - else - species_restricted = list(target_species) - - //Set icon - if (sprite_sheets_obj && (target_species in sprite_sheets_obj)) - icon = sprite_sheets_obj[target_species] - else - icon = initial(icon) - -/////////////////////////////////////////////////////////////////////// -// Ears: headsets, earmuffs and tiny objects -/obj/item/clothing/ears - name = "ears" - w_class = ITEMSIZE_TINY - throwforce = 2 - slot_flags = SLOT_EARS - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/ears/mob_teshari.dmi') - -/obj/item/clothing/ears/attack_hand(mob/user as mob) - if (!user) return - - if (src.loc != user || !istype(user,/mob/living/carbon/human)) - ..() - return - - var/mob/living/carbon/human/H = user - if(H.l_ear != src && H.r_ear != src) - ..() - return - - if(!canremove) - return - - var/obj/item/clothing/ears/O - if(slot_flags & SLOT_TWOEARS ) - O = (H.l_ear == src ? H.r_ear : H.l_ear) - user.u_equip(O) - if(!istype(src,/obj/item/clothing/ears/offear)) - qdel(O) - O = src - else - O = src - - user.unEquip(src) - - if (O) - user.put_in_hands(O) - O.add_fingerprint(user) - - if(istype(src,/obj/item/clothing/ears/offear)) - qdel(src) - -/obj/item/clothing/ears/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_ears() - -/obj/item/clothing/ears/MouseDrop(var/obj/over_object) - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - // If this covers both ears, we want to return the result of unequipping the primary object, and kill the off-ear one - if(slot_flags & SLOT_TWOEARS) - var/obj/item/clothing/ears/O = (H.l_ear == src ? H.r_ear : H.l_ear) - if(istype(src, /obj/item/clothing/ears/offear)) - . = O.MouseDrop(over_object) - H.drop_from_inventory(src) - qdel(src) - else - . = ..() - H.drop_from_inventory(O) - qdel(O) - else - . = ..() - - -/obj/item/clothing/ears/offear - name = "Other ear" - w_class = ITEMSIZE_HUGE - icon = 'icons/mob/screen1_Midnight.dmi' - icon_state = "block" - slot_flags = SLOT_EARS | SLOT_TWOEARS - -/obj/item/clothing/ears/offear/New(var/obj/O) - name = O.name - desc = O.desc - icon = O.icon - icon_state = O.icon_state - set_dir(O.dir) - -//////////////////////////////////////////////////////////////////////////////////////// -//Gloves -/obj/item/clothing/gloves - name = "gloves" - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', - ) - gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = ITEMSIZE_SMALL - icon = 'icons/inventory/hands/item.dmi' - siemens_coefficient = 0.9 - blood_sprite_state = "bloodyhands" - var/wired = 0 - var/obj/item/weapon/cell/cell = 0 - var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through - var/obj/item/clothing/gloves/ring = null //Covered ring - var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping - var/glove_level = 2 //What "layer" the glove is on - var/overgloves = 0 //Used by gauntlets and arm_guards - var/punch_force = 0 //How much damage do these gloves add to a punch? - var/punch_damtype = BRUTE //What type of damage does this make fists be? - body_parts_covered = HANDS - slot_flags = SLOT_GLOVES - attack_verb = list("challenged") - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/hands/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/gloves.ogg' - pickup_sound = 'sound/items/pickup/gloves.ogg' - -/obj/item/clothing/proc/set_clothing_index() - return - -/obj/item/clothing/gloves/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_gloves() - -/obj/item/clothing/gloves/emp_act(severity) - if(cell) - cell.emp_act(severity) - if(ring) - ring.emp_act(severity) - ..() - -// Called just before an attack_hand(), in mob/UnarmedAttack() -/obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) - return 0 // return 1 to cancel attack_hand() - -/*/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user) - if(W.is_wirecutter() || istype(W, /obj/item/weapon/scalpel)) - if (clipped) - to_chat(user, "The [src] have already been clipped!") - update_icon() - return - - playsound(src, W.usesound, 50, 1) - user.visible_message("[user] cuts the fingertips off of the [src].","You cut the fingertips off of the [src].") - - clipped = 1 - name = "modified [name]" - desc = "[desc]
    They have had the fingertips cut off of them." - if("exclude" in species_restricted) - species_restricted -= SPECIES_UNATHI - species_restricted -= SPECIES_TAJ - return -*/ - -/obj/item/clothing/gloves/clean_blood() - . = ..() - transfer_blood = 0 - update_icon() - -/obj/item/clothing/gloves/mob_can_equip(mob/user, slot, disable_warning = FALSE) - var/mob/living/carbon/human/H = user - - if(slot && slot == slot_gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G)) - ring = H.gloves - if(ring.glove_level >= src.glove_level) - to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") - ring = null - return 0 - else - H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves. - ring.forceMove(src) - to_chat(user, "You slip \the [src] on over \the [src.ring].") - if(!(flags & THICKMATERIAL)) - punch_force += ring.punch_force - else - ring = null - - if(!..()) - if(ring) //Put the ring back on if the check fails. - if(H.equip_to_slot_if_possible(ring, slot_gloves)) - src.ring = null - punch_force = initial(punch_force) - return 0 - - wearer = H //TODO clean this when magboots are cleaned - return 1 - -/obj/item/clothing/gloves/dropped() - ..() - - if(!wearer) - return - - var/mob/living/carbon/human/H = wearer - if(ring && istype(H)) - if(!H.equip_to_slot_if_possible(ring, slot_gloves)) - ring.forceMove(get_turf(src)) - src.ring = null - punch_force = initial(punch_force) - wearer = null - -/obj/item/clothing/gloves - var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? - var/special_attack_type = null - -/obj/item/clothing/gloves/New() - ..() - if(special_attack_type && ispath(special_attack_type)) - special_attack = new special_attack_type - - - -///////////////////////////////////////////////////////////////////// -//Rings - -/obj/item/clothing/gloves/ring - name = "ring" - w_class = ITEMSIZE_TINY - icon = 'icons/inventory/hands/item.dmi' - gender = NEUTER - species_restricted = list("exclude", SPECIES_DIONA) - siemens_coefficient = 1 - glove_level = 1 - fingerprint_chance = 100 - punch_force = 2 - body_parts_covered = 0 - drop_sound = 'sound/items/drop/ring.ogg' - pickup_sound = 'sound/items/pickup/ring.ogg' - -/////////////////////////////////////////////////////////////////////// -//Head -/obj/item/clothing/head - name = "head" - icon = 'icons/inventory/head/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_hats.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_hats.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_HEAD - w_class = ITEMSIZE_SMALL - blood_sprite_state = "helmetblood" - - light_system = MOVABLE_LIGHT_DIRECTIONAL - light_cone_y_offset = 11 - - var/light_overlay = "helmet_light" - var/image/helmet_light - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/head/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/hat.ogg' - pickup_sound = 'sound/items/pickup/hat.ogg' - -/obj/item/clothing/head/attack_self(mob/user) - if(light_range) - if(!isturf(user.loc)) - to_chat(user, "You cannot toggle the light while in this [user.loc]") - return - update_flashlight(user) - to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") - else - return ..(user) - -/obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) - set_light_on(!light_on) - - if(light_system == STATIC_LIGHT) - update_light() - - update_icon(user) - user.update_action_buttons() - -/obj/item/clothing/head/attack_ai(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/attack_generic(var/mob/user) - if(!mob_wear_hat(user)) - return ..() - -/obj/item/clothing/head/proc/mob_wear_hat(var/mob/user) - if(!Adjacent(user)) - return 0 - var/success - if(istype(user, /mob/living/silicon/robot/drone)) - var/mob/living/silicon/robot/drone/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - else if(istype(user, /mob/living/carbon/alien/diona)) - var/mob/living/carbon/alien/diona/D = user - if(D.hat) - success = 2 - else - D.wear_hat(src) - success = 1 - - if(!success) - return 0 - else if(success == 2) - to_chat(user, "You are already wearing a hat.") - else if(success == 1) - to_chat(user, "You crawl under \the [src].") - return 1 - -/obj/item/clothing/head/update_icon(var/mob/user) - var/mob/living/carbon/human/H - if(ishuman(user)) - H = user - - if(light_on) - // Generate object icon. - if(!light_overlay_cache["[light_overlay]_icon"]) - light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]") - helmet_light = light_overlay_cache["[light_overlay]_icon"] - add_overlay(helmet_light) - - // Generate and cache the on-mob icon, which is used in update_inv_head(). - var/body_type = (H && H.species.get_bodytype(H)) - var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]" - if(!light_overlay_cache[cache_key]) - var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi' - light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]") - - else if(helmet_light) - cut_overlay(helmet_light) - helmet_light = null - - user.update_inv_head() //Will redraw the helmet with the light on the mob - -/obj/item/clothing/head/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_head() - -/////////////////////////////////////////////////////////////////////// -//Mask -/obj/item/clothing/mask - name = "mask" - icon = 'icons/inventory/face/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_masks.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_masks.dmi', - ) - body_parts_covered = HEAD - slot_flags = SLOT_MASK - body_parts_covered = FACE|EYES - blood_sprite_state = "maskblood" - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/face/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/face/mob_vox.dmi', - SPECIES_TAJ = 'icons/inventory/face/mob_tajaran.dmi', - SPECIES_UNATHI = 'icons/inventory/face/mob_unathi.dmi' - ) - - var/voicechange = 0 - var/list/say_messages - var/list/say_verbs - - drop_sound = "generic_drop" - pickup_sound = "generic_pickup" - -/obj/item/clothing/mask/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_mask() - -/obj/item/clothing/mask/proc/filter_air(datum/gas_mixture/air) - return - -/////////////////////////////////////////////////////////////////////// -//Shoes -/obj/item/clothing/shoes - name = "shoes" - icon = 'icons/inventory/feet/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_shoes.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_shoes.dmi', - ) - desc = "Comfortable-looking shoes." - gender = PLURAL //Carn: for grammarically correct text-parsing - siemens_coefficient = 0.9 - body_parts_covered = FEET - slot_flags = SLOT_FEET - blood_sprite_state = "shoeblood" - - var/can_hold_knife = 0 - var/obj/item/holding - - var/shoes_under_pants = 0 - - var/water_speed = 0 //Speed boost/decrease in water, lower/negative values mean more speed - var/snow_speed = 0 //Speed boost/decrease on snow, lower/negative values mean more speed - var/rock_climbing = FALSE // If true, allows climbing cliffs with clickdrag. - - var/step_volume_mod = 1 //How quiet or loud footsteps in this shoe are - - permeability_coefficient = 0.50 - slowdown = SHOES_SLOWDOWN - force = 2 - var/overshoes = 0 - species_restricted = list("exclude",SPECIES_TESHARI, SPECIES_VOX) - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/feet/mob_vox.dmi' - ) - drop_sound = 'sound/items/drop/shoes.ogg' - pickup_sound = 'sound/items/pickup/shoes.ogg' - -/obj/item/clothing/shoes/proc/draw_knife() - set name = "Draw Boot Knife" - set desc = "Pull out your boot knife." - set category = "IC" - set src in usr - - if(usr.stat || usr.restrained() || usr.incapacitated()) - return - - holding.forceMove(get_turf(usr)) - - if(usr.put_in_hands(holding)) - usr.visible_message("\The [usr] pulls a knife out of their boot!") - playsound(src, 'sound/weapons/holster/sheathout.ogg', 25) - holding = null - cut_overlay("[icon_state]_knife") - else - to_chat(usr, "Your need an empty, unbroken hand to do that.") - holding.forceMove(src) - - if(!holding) - verbs -= /obj/item/clothing/shoes/proc/draw_knife - - update_icon() - return - -/obj/item/clothing/shoes/attack_hand(var/mob/living/M) - if(can_hold_knife == 1 && holding && src.loc == M) - draw_knife() - return - ..() - -/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) - if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ - istype(I, /obj/item/weapon/material/butterfly) || \ - istype(I, /obj/item/weapon/material/kitchen/utensil) || \ - istype(I, /obj/item/weapon/material/knife/tacknife))) - if(holding) - to_chat(user, "\The [src] is already holding \a [holding].") - return - user.unEquip(I) - I.forceMove(src) - holding = I - user.visible_message("\The [user] shoves \the [I] into \the [src].") - verbs |= /obj/item/clothing/shoes/proc/draw_knife - update_icon() - else - return ..() - -/obj/item/clothing/shoes/verb/toggle_layer() - set name = "Switch Shoe Layer" - set category = "Object" - - if(shoes_under_pants == -1) - to_chat(usr, "\The [src] cannot be worn above your suit!") - return - shoes_under_pants = !shoes_under_pants - update_icon() - -/obj/item/clothing/shoes/update_icon() - . = ..() - if(holding) - add_overlay("[icon_state]_knife") - if(contaminated) - add_overlay(contamination_overlay) - if(gurgled) //VOREStation Edit Start - decontaminate() - gurgle_contaminate() //VOREStation Edit End - if(ismob(usr)) - var/mob/M = usr - M.update_inv_shoes() - -/obj/item/clothing/shoes/clean_blood() - update_icon() - return ..() - -/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) - if(prob(1) && !recent_squish) //VOREStation edit begin - recent_squish = 1 - spawn(100) - recent_squish = 0 - for(var/mob/living/M in contents) - var/emote = pick(inside_emotes) - to_chat(M,emote) //VOREStation edit end - return - -/obj/item/clothing/shoes/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_shoes() - - -/////////////////////////////////////////////////////////////////////// -//Suit -/obj/item/clothing/suit - icon = 'icons/inventory/suit/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_suits.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_suits.dmi', - ) - name = "suit" - var/fire_resist = T0C+100 - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - allowed = list(/obj/item/weapon/tank/emergency/oxygen) - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0) - slot_flags = SLOT_OCLOTHING - var/blood_overlay_type = "suit" - blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. - - var/taurized = FALSE - siemens_coefficient = 0.9 - w_class = ITEMSIZE_NORMAL - preserve_item = 1 - equip_sound = 'sound/items/jumpsuit_equip.ogg' - - - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/suit/mob_vox.dmi' - ) - - valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND) - restricted_accessory_slots = (ACCESSORY_SLOT_ARMBAND) - -/obj/item/clothing/suit/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_wear_suit() - -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - var/taurtail = istaurtail(H.tail_style) - if((taurized && !taurtail) || (!taurized && taurtail)) - taurize(user, taurtail) - - return ..() - -/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur, has_taur_tail = FALSE) - if(has_taur_tail) - var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - taurized = TRUE - // means that if a taur puts on an already taurized suit without a taur sprite - // for their taur type, but the previous taur type had a sprite, it stays - // taurized and they end up with that taur style which is funny - else - taurized = FALSE - - if(!taurized) - icon_override = initial(icon_override) - taurized = FALSE - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - - -/////////////////////////////////////////////////////////////////////// -//Under clothing -/obj/item/clothing/under - icon = 'icons/inventory/uniform/item.dmi' - item_icons = list( - slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', - slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', - ) - name = "under" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - permeability_coefficient = 0.90 - slot_flags = SLOT_ICLOTHING - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - equip_sound = 'sound/items/jumpsuit_equip.ogg' - w_class = ITEMSIZE_NORMAL - show_messages = 1 - blood_sprite_state = "uniformblood" - - var/has_sensor = 1 //For the crew computer 2 = unable to change mode - var/sensor_mode = 0 - /* - 1 = Report living/dead - 2 = Report detailed damages - 3 = Report location - */ - var/displays_id = 1 - var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled - sprite_sheets = list( - SPECIES_TESHARI = 'icons/inventory/uniform/mob_teshari.dmi', - SPECIES_VOX = 'icons/inventory/uniform/mob_vox.dmi' - ) - - //convenience var for defining the icon state for the overlay used when the clothing is worn. - //Also used by rolling/unrolling. - var/worn_state = null - valid_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_DECOR\ - |ACCESSORY_SLOT_MEDAL\ - |ACCESSORY_SLOT_INSIGNIA\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - restricted_accessory_slots = (\ - ACCESSORY_SLOT_UTILITY\ - |ACCESSORY_SLOT_WEAPON\ - |ACCESSORY_SLOT_ARMBAND\ - |ACCESSORY_SLOT_TIE\ - |ACCESSORY_SLOT_RANK\ - |ACCESSORY_SLOT_DEPT\ - |ACCESSORY_SLOT_OVER) - - var/icon/rolled_down_icon = 'icons/inventory/uniform/mob_rolled_down.dmi' - var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi' - -/obj/item/clothing/under/attack_hand(var/mob/user) - if(LAZYLEN(accessories)) - ..() - if ((ishuman(usr) || issmall(usr)) && src.loc == user) - return - ..() - -/obj/item/clothing/under/New() - ..() - if(worn_state) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - worn_state = icon_state - - //autodetect rollability - if(rolled_down < 0) - if(("[worn_state]_d" in cached_icon_states(icon)) || (worn_state in cached_icon_states(rolled_down_icon)) || ("[worn_state]_d" in cached_icon_states(icon_override))) - rolled_down = 0 - - if(rolled_down == -1) - verbs -= /obj/item/clothing/under/verb/rollsuit - if(rolled_sleeves == -1) - verbs -= /obj/item/clothing/under/verb/rollsleeves - -/obj/item/clothing/under/proc/update_rolldown_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_icon)) - under_icon = rolled_down_icon - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_d" in cached_icon_states(under_icon))) - if(rolled_down != 1) - rolled_down = 0 - else - rolled_down = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/proc/update_rollsleeves_status() - var/mob/living/carbon/human/H - if(istype(src.loc, /mob/living/carbon/human)) - H = src.loc - - var/icon/under_icon - if(icon_override) - under_icon = icon_override - else if(H && LAZYACCESS(sprite_sheets, H.species.get_bodytype(H))) - under_icon = sprite_sheets[H.species.get_bodytype(H)] - else if(LAZYACCESS(item_icons, slot_w_uniform_str)) - under_icon = item_icons[slot_w_uniform_str] - else if (worn_state in cached_icon_states(rolled_down_sleeves_icon)) - under_icon = rolled_down_sleeves_icon - else - under_icon = new /icon(INV_W_UNIFORM_DEF_ICON) - - // The _s is because the icon update procs append it. - if((under_icon == rolled_down_sleeves_icon && ("[worn_state]" in cached_icon_states(under_icon))) || ("[worn_state]_r" in cached_icon_states(under_icon))) - if(rolled_sleeves != 1) - rolled_sleeves = 0 - else - rolled_sleeves = -1 - if(H) update_clothing_icon() - -/obj/item/clothing/under/update_clothing_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_w_uniform() - - set_clothing_index() - - -/obj/item/clothing/under/examine(mob/user) - . = ..() - switch(src.sensor_mode) - if(0) - . += "Its sensors appear to be disabled." - if(1) - . += "Its binary life sensors appear to be enabled." - if(2) - . += "Its vital tracker appears to be enabled." - if(3) - . += "Its vital tracker and tracking beacon appear to be enabled." - -/obj/item/clothing/under/proc/set_sensors(mob/usr as mob) - var/mob/M = usr - if (istype(M, /mob/observer)) return - if (usr.stat || usr.restrained()) return - if(has_sensor >= 2) - to_chat(usr, "The controls are locked.") - return 0 - if(has_sensor <= 0) - to_chat(usr, "This suit does not have any sensors.") - return 0 - - var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon") - var/switchMode = tgui_input_list(usr, "Select a sensor mode:", "Suit Sensor Mode", modes) - if(get_dist(usr, src) > 1) - to_chat(usr, "You have moved too far away.") - return - sensor_mode = modes.Find(switchMode) - 1 - - if (src.loc == usr) - switch(sensor_mode) - if(0) - usr.visible_message("[usr] adjusts their sensors.", "You disable your suit's remote sensing equipment.") - if(1) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report whether you are live or dead.") - if(2) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns.") - if(3) - usr.visible_message("[usr] adjusts their sensors.", "Your suit will now report your vital lifesigns as well as your coordinate position.") - - else if (istype(src.loc, /mob)) - usr.visible_message("[usr] adjusts [src.loc]'s sensors.", "You adjust [src.loc]'s sensors.") - -/obj/item/clothing/under/verb/toggle() - set name = "Toggle Suit Sensors" - set category = "Object" - set src in usr - set_sensors(usr) - -/obj/item/clothing/under/verb/rollsuit() - set name = "Roll Down Jumpsuit" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rolldown_status() - if(rolled_down == -1) - to_chat(usr, "You cannot roll down [src]!") - return - if((rolled_sleeves == 1) && !(rolled_down)) - rolled_sleeves = 0 - - rolled_down = !rolled_down - if(rolled_down) - body_parts_covered = initial(body_parts_covered) - body_parts_covered &= ~(UPPER_TORSO|ARMS) - if(worn_state in cached_icon_states(rolled_down_icon)) - icon_override = rolled_down_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_d") - - to_chat(usr, "You roll down your [src].") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll up your [src].") - update_clothing_icon() - -/obj/item/clothing/under/verb/rollsleeves() - set name = "Roll Up Sleeves" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - - update_rollsleeves_status() - if(rolled_sleeves == -1) - to_chat(usr, "You cannot roll up your [src]'s sleeves!") - return - if(rolled_down == 1) - to_chat(usr, "You must roll up your [src] first!") - return - - rolled_sleeves = !rolled_sleeves - if(rolled_sleeves) - body_parts_covered &= ~(ARMS) - if(worn_state in cached_icon_states(rolled_down_sleeves_icon)) - icon_override = rolled_down_sleeves_icon - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - else - LAZYSET(item_state_slots, slot_w_uniform_str, "[worn_state]_r") - to_chat(usr, "You roll up your [src]'s sleeves.") - else - body_parts_covered = initial(body_parts_covered) - if(icon_override == rolled_down_sleeves_icon) - icon_override = initial(icon_override) - LAZYSET(item_state_slots, slot_w_uniform_str, worn_state) - to_chat(usr, "You roll down your [src]'s sleeves.") - update_clothing_icon() - -/obj/item/clothing/under/rank/New() - sensor_mode = pick(0,1,2,3) - ..() ->>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks From a8bb6baf59b1073544157bfc1486f4916172d681 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:39:42 -0400 Subject: [PATCH 57/86] powder that makes you say yes --- code/modules/clothing/spacesuits/void/ert_vr.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm index 47094c4f98..0393b4ecf7 100644 --- a/code/modules/clothing/spacesuits/void/ert_vr.dm +++ b/code/modules/clothing/spacesuits/void/ert_vr.dm @@ -239,9 +239,3 @@ SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi', SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi' ) -<<<<<<< HEAD - sprite_sheets_refit = list() //have to nullify this as well just to be thorough -||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks - sprite_sheets_refit = list() //have to nullify this as well just to be thorough -======= ->>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks From c9e382f86ad25a4767a9a76f846cbc7c0be149f1 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:40:21 -0400 Subject: [PATCH 58/86] powder that makes you say yes --- code/modules/clothing/spacesuits/void/void_vr.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 4f166e61e8..57774c8d2d 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -151,11 +151,3 @@ default_worn_icon = 'icons/inventory/head/mob_vr.dmi' sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB sprite_sheets_obj = null -<<<<<<< HEAD - sprite_sheets_refit = null -||||||| parent of 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks - sprite_sheets_refit = null - -======= - ->>>>>>> 9b03341473... Merge pull request #11162 from VOREStation/Arokha/cycletweaks From 33111d164c0a96f8a80d15aa6f4e8c25352d0733 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 19:42:54 -0400 Subject: [PATCH 59/86] powder that makes you say yes --- code/game/machinery/doors/airlock.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b75ac86df7..279efa36a5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -89,7 +89,7 @@ visible_message("\The [user] begins tearing into \the [src] internals!") src.do_animate("deny") if(do_after(user,15 SECONDS,src)) - visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!" + visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") src.do_animate("spark") playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) src.locked = 0 From c75527784d744cca2434f6cd9be76a6c70110f29 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:26:55 -0400 Subject: [PATCH 60/86] powder that makes you say yes --- vorestation.dme | 2 -- 1 file changed, 2 deletions(-) diff --git a/vorestation.dme b/vorestation.dme index bc3a77b259..82d31db07c 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1143,8 +1143,6 @@ #include "code\game\objects\effects\zone_divider.dm" #include "code\game\objects\effects\zz_portals_ch.dm" #include "code\game\objects\effects\zz_triggers_ch.dm" -#include "code\game\objects\effects\alien\alien egg.dm" -#include "code\game\objects\effects\alien\alien.dm" #include "code\game\objects\effects\alien\aliens.dm" #include "code\game\objects\effects\chem\chemsmoke.dm" #include "code\game\objects\effects\chem\coating.dm" From 5cb877a1d2ae4c494d8236cb731858530d58270a Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:31:27 -0400 Subject: [PATCH 61/86] powder that makes you say yes --- .../human/species/station/station_vr.dm | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 03b9987385..25f7eb890e 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -32,7 +32,7 @@ lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \ legendary General Rain Silves who is claimed to have lived to 5000." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Sergal" catalogue_data = list(/datum/category_item/catalogue/fauna/sergal) @@ -100,7 +100,7 @@ surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \ after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Akula" catalogue_data = list(/datum/category_item/catalogue/fauna/akula) @@ -150,7 +150,7 @@ over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \ tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Nevrean" catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean) @@ -251,7 +251,7 @@ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Vulpkanin" catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) @@ -339,7 +339,7 @@ H.equip_to_slot_or_del(L, slot_in_backpack) /datum/species/diona - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit TFF 20/1/20 - restore whitelist requirement + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit: restore whitelist requirement min_age = 18 wikilink="https://wiki.chompstation13.net/index.php?title=Diona" //CHOMPedit genders = list(MALE, FEMALE, PLURAL, NEUTER) @@ -372,16 +372,8 @@ /datum/species/vox gluttonous = 0 -<<<<<<< HEAD - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE //CHOMPStation Edit - min_age = 18 -||||||| parent of e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE - min_age = 18 -======= spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE min_age = 18 ->>>>>>> e5c49f772b... Merge pull request #11173 from Heroman3003/waterbreath inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' @@ -420,7 +412,7 @@ who are known for having massive winged arms and talons as feet. They've been clocked at speeds of over 35 miler per hour chasing the planet's many fish-like fauna.\ The Rapalan's home-world 'Verita' is a strangely habitable gas giant, while no physical earth exists, there are fertile floating islands orbiting around the planet from past asteroid activity." -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink="https://www.yawn.ocry.com/Rapala" catalogue_data = list(/datum/category_item/catalogue/fauna/rapala) @@ -450,7 +442,7 @@ documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \ taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something more fitting for black-eyes -//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed +//CHOMPStation Removal // wikilink = "https://wiki.vore-station.net/Shadekin" catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin) From afed66bf348c28ae4baaf6c2cde4f1fecf91e815 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:34:51 -0400 Subject: [PATCH 62/86] powder that makes you say yes --- code/_helpers/global_lists_vr.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 7224522352..47107f6888 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -507,11 +507,11 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, SPECIES_MONKEY_NEVREAN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_VULPKANIN, - SPECIES_GENA, //Same for xenos, CHOMPedit - SPECIES_GENA_DRONE, - SPECIES_GENA_HUNTER, - SPECIES_GENA_SENTINEL, - SPECIES_GENA_QUEEN, //CHOMPedit end + SPECIES_XENO, //Same for xenos, + SPECIES_XENO_DRONE, + SPECIES_XENO_HUNTER, + SPECIES_XENO_SENTINEL, + SPECIES_XENO_QUEEN, SPECIES_SHADOW, SPECIES_GOLEM, //Some special species that may or may not be ever used in event too, SPECIES_SHADEKIN) //Shadefluffers just poof away From f5c21e41bc9bdc9be10d61f2291591bdb682b019 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:36:52 -0400 Subject: [PATCH 63/86] powder that makes you say yes --- code/modules/mob/dead/observer/observer.dm | 2005 +------------------- 1 file changed, 5 insertions(+), 2000 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7566448252..90bbd85beb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,4 @@ -<<<<<<< HEAD +<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -342,6 +342,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/area/A = areas[key] if(A.z in using_map?.secret_levels) areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key return areas @@ -354,6 +356,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/mobz = get_z(mobs[key]) if(mobz in using_map?.secret_levels) mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key return mobs @@ -995,2002 +999,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() -||||||| parent of bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = TRUE // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - observer_mob_list += src - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(!.) - M.stop_following() - - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - observer_mob_list -= src - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

    Crew Manifest

    " - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit - PP.add_overlay("pai-ghostalert") - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() -======= -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = TRUE // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - observer_mob_list += src - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - if(A.z in using_map?.hidden_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - if(mobz in using_map?.hidden_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(!.) - M.stop_following() - - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - observer_mob_list -= src - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

    Crew Manifest

    " - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit - PP.add_overlay("pai-ghostalert") - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() ->>>>>>> bb3b3d6214... Merge pull request #11176 from Very-Soft/ghosties From a32eef0ea93f21d534c72ba777d76ca76bfefab7 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:39:23 -0400 Subject: [PATCH 64/86] powder that makes you say yes --- code/__defines/mobs.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 8bc561b4a6..d9a5f7a847 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -319,13 +319,13 @@ #define SPECIES_VR_SKELETON "Virtual Reality Skeleton" #define SPECIES_VR_VOX "Virtual Reality Vox" -// Ayyy IDs. CHOMPedit -#define SPECIES_GENA "Genaprawn" -#define SPECIES_GENA_DRONE "Genaprawn Drone" -#define SPECIES_GENA_HUNTER "Genaprawn Hunter" -#define SPECIES_GENA_SENTINEL "Genaprawn Sentinel" -#define SPECIES_GENA_QUEEN "Genaprawn Queen" -//CHOMPedit end +// Ayyy IDs. +#define SPECIES_XENO "Xenomorph" +#define SPECIES_XENO_DRONE "Xenomorph Drone" +#define SPECIES_XENO_HUNTER "Xenomorph Hunter" +#define SPECIES_XENO_SENTINEL "Xenomorph Sentinel" +#define SPECIES_XENO_QUEEN "Xenomorph Queen" + // Misc species. Mostly unused but might as well be complete. #define SPECIES_SHADOW "Shadow" #define SPECIES_SKELETON "Skeleton" From 942f4eeb485cff6dd52ecc79bc5c28a61a521240 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:39:48 -0400 Subject: [PATCH 65/86] powder that makes you say yes --- code/modules/mob/dead/observer/observer.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 90bbd85beb..d87c8074ea 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" From ebdde089fab36ca06d7e2cd2122b9ae8aff882eb Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:45:46 -0400 Subject: [PATCH 66/86] powder that makes you say yes --- .../living/carbon/human/species/xenomorphs/alien_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm index b5271cff96..27e1df5b5a 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm @@ -2,7 +2,7 @@ for(var/mob/living/carbon/human/Q in living_mob_list) if(self && ignore_self && self == Q) continue - if(Q.species.name != SPECIES_GENA_QUEEN) //CHOMPedit + if(Q.species.name != SPECIES_XENO_QUEEN) continue if(!Q.key || !Q.client || Q.stat) continue @@ -110,7 +110,7 @@ if(check_alien_ability(500)) visible_message("[src] begins to twist and contort!", "You begin to evolve!") - src.set_species("Genaprawn Queen") //CHOMPedit + src.set_species("Xenomorph Queen") return From 38ba2eea0178386d6c80bd69263edaeb1dfcf965 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:46:54 -0400 Subject: [PATCH 67/86] powder that makes you say yes --- .../human/species/xenomorphs/alien_species.dm | 39 ++++++------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm index 3f39fc9ef2..ac85b0314a 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm @@ -1,26 +1,15 @@ //Stand-in until this is made more lore-friendly. /datum/species/xenos - name = SPECIES_GENA //CHOMPedit - name_plural = "Genaprawns" //CHOMPedit + name = SPECIES_XENO + name_plural = "Xenomorphs" - default_language = "Xenolingua" //CHOMPedit + default_language = "Xenomorph" language = "Hivemind" assisted_langs = list() unarmed_types = list(/datum/unarmed_attack/claws/strong/xeno, /datum/unarmed_attack/bite/strong/xeno) hud_type = /datum/hud_data/alien rarity_value = 3 - male_scream_sound = list('sound/effects/mob_effects/x_scream1.ogg','sound/effects/mob_effects/x_scream2.ogg','sound/effects/mob_effects/x_scream3.ogg') //CHOMPedit SCREE - female_scream_sound = list('sound/effects/mob_effects/x_scream1.ogg','sound/effects/mob_effects/x_scream2.ogg','sound/effects/mob_effects/x_scream3.ogg') //CHOMPedit SCREE - - darksight = 10 //CHOMPedit. Added darksight - vision_flags = SEE_SELF|SEE_MOBS|SEE_TURFS //CHOMPedit trying to make xenos see properly - - pixel_offset_x = -16 //CHOMPedit. I literally had to make a different form of pixel_x just for this species, fuck my life - - - icon_template = 'icons/mob/human_races/xenos/template.dmi' //CHOMPedit. Add icon template for 64x64 sprites - has_fine_manipulation = 0 siemens_coefficient = 0 gluttonous = 2 @@ -47,10 +36,6 @@ death_message = "lets out a guttural screech, green blood bubbling from its maw." death_sound = 'sound/voice/hiss6.ogg' - damage_overlays = null //CHOMPedit. They don't have overlays yet, if someone wants to add some then be my guest - damage_mask = null //CHOMPedit. - blood_mask = null //CHOMPedit. - speech_sounds = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') speech_chance = 75 @@ -96,7 +81,7 @@ ) /datum/species/xenos/get_bodytype() - return SPECIES_GENA //CHOMPedit + return SPECIES_XENO /datum/species/xenos/get_random_name() return "xenomorph [caste_name] ([alien_number])" @@ -107,8 +92,8 @@ return FALSE /datum/species/xenos/hug(var/mob/living/carbon/human/H,var/mob/living/target) - H.visible_message("[H] caresses [target] with its eldritch arm.", \ - "You caress [target] with your eldritch arm.") //CHOMPedit. Changed messages + H.visible_message("[H] caresses [target] with its scythe-like arm.", \ + "You caress [target] with your scythe-like arm.") /datum/species/xenos/handle_post_spawn(var/mob/living/carbon/human/H) @@ -172,11 +157,11 @@ return 0 /datum/species/xenos/drone - name = SPECIES_GENA_DRONE //CHOMPedit + name = SPECIES_XENO_DRONE caste_name = "drone" weeds_plasma_rate = 15 slowdown = 1 - tail = null //CHOMPedit. Set to null + tail = "xenos_drone_tail" rarity_value = 5 icobase = 'icons/mob/human_races/xenos/r_xenos_drone.dmi' @@ -212,12 +197,12 @@ ..() /datum/species/xenos/hunter - name = SPECIES_GENA_HUNTER //CHOMPedit + name = SPECIES_XENO_HUNTER weeds_plasma_rate = 5 caste_name = "hunter" slowdown = -1 total_health = 150 - tail = null //CHOMPedit. Set to null + tail = "xenos_hunter_tail" icobase = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi' deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi' @@ -242,12 +227,12 @@ ) /datum/species/xenos/sentinel - name = SPECIES_GENA_SENTINEL //CHOMPedit + name = SPECIES_XENO_SENTINEL weeds_plasma_rate = 10 caste_name = "sentinel" slowdown = 0 total_health = 200 - tail = null //CHOMPedit. Set to null + tail = "xenos_sentinel_tail" icobase = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi' deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi' From cc6c719eb7a09535f64117e34294536b0849f61b Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:50:25 -0400 Subject: [PATCH 68/86] powder that makes you say yes --- code/modules/mob/dead/observer/observer.dm | 2008 +------------------- 1 file changed, 2 insertions(+), 2006 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6b50a6e273..0cf9aa812e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -357,7 +356,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return mobs -/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) +/mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas()) set name = "Teleport" set category = "Ghost" set desc = "Teleport to a location." @@ -384,7 +383,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) usr.on_mob_jump() -/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) +/mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs()) set name = "Follow" set category = "Ghost" set desc = "Follow and haunt a mob." @@ -995,2006 +994,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() -||||||| parent of 55de23fab7... Merge pull request #11180 from Very-Soft/updootgateways -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = TRUE // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - observer_mob_list += src - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - if(A.z in using_map?.hidden_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - if(mobz in using_map?.hidden_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as null|anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as null|anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(!.) - M.stop_following() - - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - observer_mob_list -= src - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

    Crew Manifest

    " - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit - PP.add_overlay("pai-ghostalert") - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() -======= -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = TRUE // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - observer_mob_list += src - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = tgui_alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", list("Ghost", "Admin Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Ghost", "Stay in body")) // VOREStation edit because we don't make players stay dead for 30 minutes. - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - if(A.z in using_map?.hidden_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - if(mobz in using_map?.hidden_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(get_z(target) in using_map?.secret_levels) - to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go.")) - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(!.) - M.stop_following() - - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - observer_mob_list -= src - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!")) - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "

    Crew Manifest

    " - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(input(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - seedarkness = !seedarkness - updateghostsight() - to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master. - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - if(usr.client.prefs?.be_special & BE_PAI) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit - PP.add_overlay("pai-ghostalert") - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() ->>>>>>> 55de23fab7... Merge pull request #11180 from Very-Soft/updootgateways From ea9d852968f601e362a6645bce167bcc864750f4 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:53:01 -0400 Subject: [PATCH 69/86] powder that makes you say yes --- .../living/carbon/human/species/xenomorphs/xenomorphs.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm index 6ddcdc9b02..6c73c18430 100644 --- a/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm +++ b/code/modules/mob/living/carbon/human/species/xenomorphs/xenomorphs.dm @@ -4,23 +4,23 @@ if(!target || !alien_caste) return var/mob/living/carbon/human/new_alien = new(target) - new_alien.set_species("Genaprawn [alien_caste]") //CHOMPedit + new_alien.set_species("Xenomorph [alien_caste]") return new_alien /mob/living/carbon/human/xdrone/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_GENA_DRONE) //CHOMPedit + ..(new_loc, SPECIES_XENO_DRONE) /mob/living/carbon/human/xsentinel/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_GENA_SENTINEL) //CHOMPedit + ..(new_loc, SPECIES_XENO_SENTINEL) /mob/living/carbon/human/xhunter/New(var/new_loc) h_style = "Bald" faction = "xeno" - ..(new_loc, SPECIES_GENA_HUNTER) //CHOMPedit + ..(new_loc, SPECIES_XENO_HUNTER) /mob/living/carbon/human/xqueen/New(var/new_loc) h_style = "Bald" From 9861e0769b9946cd69f16503ca6a81a32cee7986 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 20:54:03 -0400 Subject: [PATCH 70/86] powder that makes you say yes --- code/modules/paperwork/photocopier.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 74cceb11f6..72eca4beb4 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -286,7 +286,7 @@ temp_img = icon('icons/obj/butts_vr.dmi', "machine") if(SPECIES_WEREBEAST) temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // Give Werewolves their own thicc'er than a boal of oatmeal ass sprite someday? - if(SPECIES_XENOHYBRID, SPECIES_GENA, SPECIES_GENA_DRONE, SPECIES_GENA_HUNTER, SPECIES_GENA_QUEEN, SPECIES_GENA_SENTINEL) // Xenos + Xenohybrids have their own asses, thanks to Pybro. CHOMPedit + if(SPECIES_XENOHYBRID, SPECIES_XENO, SPECIES_XENO_DRONE, SPECIES_XENO_HUNTER, SPECIES_XENO_QUEEN, SPECIES_XENO_SENTINEL) // Xenos + Xenohybrids have their own asses, thanks to Pybro. temp_img = icon('icons/obj/butts_vr.dmi', "xeno") if(SPECIES_ZORREN_HIGH) temp_img = icon('icons/obj/butts_vr.dmi', "vulp") // placeholder until we get zorren butts. From 1231fc32f7ff8581b97e64b4cdd9b5f8ddcc9928 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:01:08 -0400 Subject: [PATCH 71/86] powder that makes you say yes --- code/controllers/configuration.dm | 2292 +---------------------------- 1 file changed, 1 insertion(+), 2291 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 9a3e28e584..c519f0319c 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD var/list/gamemode_cache = list() /datum/configuration @@ -301,7 +300,7 @@ var/list/gamemode_cache = list() var/static/list/jukebox_track_files /datum/configuration/New() - var/list/L = typesof(/datum/game_mode) - /datum/game_mode + var/list/L = subtypesof(/datum/game_mode) for (var/T in L) // I wish I didn't have to instance the game modes in order to look up // their information, but it is the only way (at least that I know of). @@ -1150,2292 +1149,3 @@ var/list/gamemode_cache = list() config.python_path = "/usr/bin/env python2" else //probably windows, if not this should work anyway config.python_path = "python" -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt -var/list/gamemode_cache = list() - -/datum/configuration - var/static/server_name = null // server name (for world name / status) - var/static/server_suffix = 0 // generate numeric suffix based on server port - - var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located - - var/static/log_ooc = 0 // log OOC channel - var/static/log_access = 0 // log login/logout - var/static/log_say = 0 // log client say - var/static/log_admin = 0 // log admin actions - var/static/log_debug = 1 // log debug output - var/static/log_game = 0 // log game events - var/static/log_vote = 0 // log voting - var/static/log_whisper = 0 // log client whisper - var/static/log_emote = 0 // log emotes - var/static/log_attack = 0 // log attack messages - var/static/log_adminchat = 0 // log admin chat messages - var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such - var/static/log_pda = 0 // log pda messages - var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits - var/static/log_runtime = 0 // logs world.log to a file - var/static/log_world_output = 0 // log to_world_log(messages) - var/static/log_graffiti = 0 // logs graffiti - var/static/sql_enabled = 0 // for sql switching - var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour - var/static/allow_vote_restart = 0 // allow votes to restart - var/static/ert_admin_call_only = 0 - var/static/allow_vote_mode = 0 // allow votes to change mode - var/static/allow_admin_jump = 1 // allows admin jumping - var/static/allow_admin_spawning = 1 // allows admin item spawning - var/static/allow_admin_rev = 1 // allows admin revives - var/static/pregame_time = 180 // pregame time in seconds - var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) - var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) - var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called - var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote - var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). - var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) - var/static/vote_no_dead = 0 // dead people can't vote (tbi) -// var/static/enable_authentication = 0 // goon authentication - var/static/del_new_on_log = 1 // del's new players if they log before they spawn in - var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players - var/static/objectives_disabled = 0 //if objectives are disabled or not - var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/static/allow_Metadata = 0 // Metadata is supported. - var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/static/fps = 20 - var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling - var/static/Tickcomp = 0 - var/static/socket_talk = 0 // use socket_talk to communicate with other processes - var/static/list/resource_urls = null - var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. - var/static/list/mode_names = list() - var/static/list/modes = list() // allowed modes - var/static/list/votable_modes = list() // votable modes - var/static/list/probabilities = list() // relative probability of each mode - var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. - var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. - var/static/humans_need_surnames = 0 - var/static/allow_random_events = 0 // enables random events mid-round when set to 1 - var/static/enable_game_master = 0 // enables the 'smart' event system. - var/static/allow_ai = 1 // allow ai job - var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. - var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell - var/static/hostedby = null - - var/static/respawn = 1 - var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) - var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" - - var/static/guest_jobban = 1 - var/static/usewhitelist = 0 - var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 - var/static/show_mods = 0 - var/static/show_devs = 0 - var/static/show_event_managers = 0 - var/static/mods_can_tempban = 0 - var/static/mods_can_job_tempban = 0 - var/static/mod_tempban_max = 1440 - var/static/mod_job_tempban_max = 1440 - var/static/load_jobs_from_txt = 0 - var/static/ToRban = 0 - var/static/automute_on = 0 //enables automuting/spam prevention - var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. - - var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... - var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. - - var/static/character_slots = 10 // The number of available character slots - var/static/loadout_slots = 3 // The number of loadout slots per character - - var/static/max_maint_drones = 5 //This many drones can spawn, - var/static/allow_drone_spawn = 1 //assuming the admin allow them to. - var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. - - var/static/disable_player_mice = 0 - var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech - - var/static/usealienwhitelist = 0 - var/static/limitalienplayers = 0 - var/static/alien_to_human_ratio = 0.5 - var/static/allow_extra_antags = 0 - var/static/guests_allowed = 1 - var/static/debugparanoid = 0 - var/static/panic_bunker = 0 - var/static/paranoia_logging = 0 - - var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. - var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. - var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). - var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. - var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. - var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. - - var/static/serverurl - var/static/server - var/static/banappeals - var/static/wikiurl - var/static/wikisearchurl - var/static/forumurl - var/static/githuburl - var/static/discordurl - var/static/rulesurl - var/static/mapurl - - //Alert level description - var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." - var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." - var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - - var/static/forbid_singulo_possession = 0 - - //game_options.txt configs - - var/static/health_threshold_softcrit = 0 - var/static/health_threshold_crit = 0 - var/static/health_threshold_dead = -100 - - var/static/organ_health_multiplier = 1 - var/static/organ_regeneration_multiplier = 1 - var/static/organs_decay - var/static/default_brain_health = 400 - var/static/allow_headgibs = FALSE - - //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, - //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. - var/static/organ_damage_spillover_multiplier = 0.5 - - var/static/bones_can_break = 0 - var/static/limbs_can_break = 0 - - var/static/revival_pod_plants = 1 - var/static/revival_cloning = 1 - var/static/revival_brain_life = -1 - - var/static/use_loyalty_implants = 0 - - var/static/welder_vision = 1 - var/static/generate_map = 0 - var/static/no_click_cooldown = 0 - - //Used for modifying movement speed for mobs. - //Unversal modifiers - var/static/run_speed = 0 - var/static/walk_speed = 0 - - //Mob specific modifiers. NOTE: These will affect different mob types in different ways - var/static/human_delay = 0 - var/static/robot_delay = 0 - var/static/monkey_delay = 0 - var/static/alien_delay = 0 - var/static/slime_delay = 0 - var/static/animal_delay = 0 - - var/static/footstep_volume = 0 - - var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt - var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt - var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database - var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database - - var/static/simultaneous_pm_warning_timeout = 100 - - var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. - var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. - - var/static/assistant_maint = 0 //Do assistants get maint access? - var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. - var/static/ghost_interaction = 0 - - var/static/comms_password = "" - - var/static/enter_allowed = 1 - - var/use_irc_bot = 0 - var/use_node_bot = 0 - var/irc_bot_port = 0 - var/irc_bot_host = "" - var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge - var/main_irc = "" - var/admin_irc = "" - var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix - var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. - var/use_overmap = 0 - - var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. - - // Event settings - var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours - // If the first delay has a custom start time - // No custom time, no custom time, between 80 to 100 minutes respectively. - var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) - // The lowest delay until next event - // 10, 30, 50 minutes respectively - var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) - // The upper delay until next event - // 15, 45, 70 minutes respectively - var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - - var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. - var/static/ninjas_allowed = 0 - var/static/abandon_allowed = 1 - var/static/ooc_allowed = 1 - var/static/looc_allowed = 1 - var/static/dooc_allowed = 1 - var/static/dsay_allowed = 1 - - var/persistence_disabled = FALSE - var/persistence_ignore_mapload = FALSE - - var/allow_byond_links = 0 - var/allow_discord_links = 0 - var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations - - var/starlight = 0 // Whether space turfs have ambient light or not - - var/static/list/ert_species = list(SPECIES_HUMAN) - - var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" - - var/static/aggressive_changelog = 0 - - var/static/list/language_prefixes = list(",","#")//Default language prefixes - - var/static/show_human_death_message = 1 - - var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf - var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick - var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit - var/static/radiation_material_resistance_divisor = 1 - var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. - - var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. - var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. - - // New shiny SQLite stuff. - // The basics. - var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. - - // In-Game Feedback. - var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. - var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. - var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. - var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. - var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. - - var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. - var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. - - // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. - var/static/disable_cid_warn_popup = FALSE - - // whether or not to use the nightshift subsystem to perform lighting changes - var/static/enable_night_shifts = FALSE - - // How strictly the loadout enforces object species whitelists - var/loadout_whitelist = LOADOUT_WHITELIST_LAX - - var/static/vgs_access_identifier = null // VOREStation Edit - VGS - var/static/vgs_server_port = null // VOREStation Edit - VGS - - var/disable_webhook_embeds = FALSE - - var/static/list/jukebox_track_files - -/datum/configuration/New() - var/list/L = typesof(/datum/game_mode) - /datum/game_mode - for (var/T in L) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - if (M.config_tag) - gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. - if(!(M.config_tag in modes)) // ensure each mode is added only once - log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - player_requirements[M.config_tag] = M.required_players - player_requirements_secret[M.config_tag] = M.required_players_secret - if (M.votable) - src.votable_modes += M.config_tag - src.votable_modes += "secret" - -/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) - - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - if(type == "config") - switch (name) - if ("resource_urls") - config.resource_urls = splittext(value, " ") - - if ("admin_legacy_system") - config.admin_legacy_system = 1 - - if ("ban_legacy_system") - config.ban_legacy_system = 1 - - if ("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 - - if ("use_age_restriction_for_antags") - config.use_age_restriction_for_antags = 1 - - if ("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 - - if ("use_recursive_explosions") - use_recursive_explosions = 1 - - if ("multi_z_explosion_scalar") - multi_z_explosion_scalar = text2num(value) - - if ("log_ooc") - config.log_ooc = 1 - - if ("log_access") - config.log_access = 1 - - if ("sql_enabled") - config.sql_enabled = 1 - - if ("log_say") - config.log_say = 1 - - if ("debug_paranoid") - config.debugparanoid = 1 - - if ("log_admin") - config.log_admin = 1 - - if ("log_debug") - config.log_debug = text2num(value) - - if ("log_game") - config.log_game = 1 - - if ("log_vote") - config.log_vote = 1 - - if ("log_whisper") - config.log_whisper = 1 - - if ("log_attack") - config.log_attack = 1 - - if ("log_emote") - config.log_emote = 1 - - if ("log_adminchat") - config.log_adminchat = 1 - - if ("log_adminwarn") - config.log_adminwarn = 1 - - if ("log_pda") - config.log_pda = 1 - - if ("log_world_output") - config.log_world_output = 1 - - if ("log_hrefs") - config.log_hrefs = 1 - - if ("log_runtime") - config.log_runtime = 1 - - if ("log_graffiti") - config.log_graffiti = 1 - - if ("generate_map") - config.generate_map = 1 - - if ("no_click_cooldown") - config.no_click_cooldown = 1 - - if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 - - if ("allow_vote_restart") - config.allow_vote_restart = 1 - - if ("allow_vote_mode") - config.allow_vote_mode = 1 - - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("allow_byond_links") - allow_byond_links = 1 - - if ("allow_discord_links") - allow_discord_links = 1 - - if ("allow_url_links") - allow_url_links = 1 - - if ("no_dead_vote") - config.vote_no_dead = 1 - - if ("default_no_vote") - config.vote_no_default = 1 - - if ("pregame_time") - config.pregame_time = text2num(value) - - if ("vote_delay") - config.vote_delay = text2num(value) - - if ("vote_period") - config.vote_period = text2num(value) - - if ("vote_autotransfer_initial") - config.vote_autotransfer_initial = text2num(value) - - if ("vote_autotransfer_interval") - config.vote_autotransfer_interval = text2num(value) - - if ("vote_autogamemode_timeleft") - config.vote_autogamemode_timeleft = text2num(value) - - if("ert_admin_only") - config.ert_admin_call_only = 1 - - if ("allow_ai") - config.allow_ai = 1 - - if ("allow_ai_shells") - config.allow_ai_shells = TRUE - - if("give_free_ai_shell") - config.give_free_ai_shell = TRUE - -// if ("authentication") -// config.enable_authentication = 1 - - if ("norespawn") - config.respawn = 0 - - if ("respawn_time") - var/raw_minutes = text2num(value) - config.respawn_time = raw_minutes MINUTES - - if ("respawn_message") - config.respawn_message = "[value]" - - if ("servername") - config.server_name = value - - if ("serversuffix") - config.server_suffix = 1 - - if ("nudge_script_path") - config.nudge_script_path = value - - if ("hostedby") - config.hostedby = value - - if ("serverurl") - config.serverurl = value - - if ("server") - config.server = value - - if ("banappeals") - config.banappeals = value - - if ("wikiurl") - config.wikiurl = value - - if ("wikisearchurl") - config.wikisearchurl = value - - if ("forumurl") - config.forumurl = value - - if ("rulesurl") - config.rulesurl = value - - if ("mapurl") - config.mapurl = value - - if ("githuburl") - config.githuburl = value - - if ("discordurl") - config.discordurl = value - - if ("guest_jobban") - config.guest_jobban = 1 - - if ("guest_ban") - config.guests_allowed = 0 - - if ("disable_ooc") - config.ooc_allowed = 0 - config.looc_allowed = 0 - - if ("disable_entry") - config.enter_allowed = 0 - - if ("disable_dead_ooc") - config.dooc_allowed = 0 - - if ("disable_dsay") - config.dsay_allowed = 0 - - if ("disable_respawn") - config.abandon_allowed = 0 - - if ("usewhitelist") - config.usewhitelist = 1 - - if ("feature_object_spell_system") - config.feature_object_spell_system = 1 - - if ("allow_metadata") - config.allow_Metadata = 1 - - if ("traitor_scaling") - config.traitor_scaling = 1 - - if ("aliens_allowed") - config.aliens_allowed = 1 - - if ("ninjas_allowed") - config.ninjas_allowed = 1 - - if ("objectives_disabled") - config.objectives_disabled = 1 - - if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 - - if("persistence_disabled") - config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. - - if("persistence_ignore_mapload") - config.persistence_ignore_mapload = TRUE - - if ("probability") - var/prob_pos = findtext(value, " ") - var/prob_name = null - var/prob_value = null - - if (prob_pos) - prob_name = lowertext(copytext(value, 1, prob_pos)) - prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) - else - log_misc("Unknown game mode probability configuration definition: [prob_name].") - else - log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") - - if ("required_players", "required_players_secret") - var/req_pos = findtext(value, " ") - var/req_name = null - var/req_value = null - var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. - - if(req_pos) - req_name = lowertext(copytext(value, 1, req_pos)) - req_value = copytext(value, req_pos + 1) - if(req_name in config.modes) - if(is_secret_override) - config.player_requirements_secret[req_name] = text2num(req_value) - else - config.player_requirements[req_name] = text2num(req_value) - else - log_misc("Unknown game mode player requirement configuration definition: [req_name].") - else - log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") - - if("allow_random_events") - config.allow_random_events = 1 - - if("enable_game_master") - config.enable_game_master = 1 - - if("kick_inactive") - config.kick_inactive = text2num(value) - - if("show_mods") - config.show_mods = 1 - - if("show_devs") - config.show_devs = 1 - - if("show_event_managers") - config.show_event_managers = 1 - - if("mods_can_tempban") - config.mods_can_tempban = 1 - - if("mods_can_job_tempban") - config.mods_can_job_tempban = 1 - - if("mod_tempban_max") - config.mod_tempban_max = text2num(value) - - if("mod_job_tempban_max") - config.mod_job_tempban_max = text2num(value) - - if("load_jobs_from_txt") - load_jobs_from_txt = 1 - - if("alert_red_upto") - config.alert_desc_red_upto = value - - if("alert_red_downto") - config.alert_desc_red_downto = value - - if("alert_blue_downto") - config.alert_desc_blue_downto = value - - if("alert_blue_upto") - config.alert_desc_blue_upto = value - - if("alert_green") - config.alert_desc_green = value - - if("alert_delta") - config.alert_desc_delta = value - - if("forbid_singulo_possession") - forbid_singulo_possession = 1 - - if("popup_admin_pm") - config.popup_admin_pm = 1 - - if("allow_holidays") - Holiday = 1 - - if("use_irc_bot") - use_irc_bot = 1 - - if("use_node_bot") - use_node_bot = 1 - - if("irc_bot_port") - config.irc_bot_port = value - - if("irc_bot_export") - irc_bot_export = 1 - - if("ticklag") - var/ticklag = text2num(value) - if(ticklag > 0) - fps = 10 / ticklag - - if("tick_limit_mc_init") - tick_limit_mc_init = text2num(value) - - if("allow_antag_hud") - config.antag_hud_allowed = 1 - if("antag_hud_restricted") - config.antag_hud_restricted = 1 - - if("socket_talk") - socket_talk = text2num(value) - - if("tickcomp") - Tickcomp = 1 - - if("humans_need_surnames") - humans_need_surnames = 1 - - if("tor_ban") - ToRban = 1 - - if("automute_on") - automute_on = 1 - - if("usealienwhitelist") - usealienwhitelist = 1 - - if("alien_player_ratio") - limitalienplayers = 1 - alien_to_human_ratio = text2num(value) - - if("assistant_maint") - config.assistant_maint = 1 - - if("gateway_delay") - config.gateway_delay = text2num(value) - - if("continuous_rounds") - config.continous_rounds = 1 - - if("ghost_interaction") - config.ghost_interaction = 1 - - if("disable_player_mice") - config.disable_player_mice = 1 - - if("uneducated_mice") - config.uneducated_mice = 1 - - if("comms_password") - config.comms_password = value - - if("irc_bot_host") - config.irc_bot_host = value - - if("main_irc") - config.main_irc = value - - if("admin_irc") - config.admin_irc = value - - if("python_path") - if(value) - config.python_path = value - - if("use_lib_nudge") - config.use_lib_nudge = 1 - - if("allow_cult_ghostwriter") - config.cult_ghostwriter = 1 - - if("req_cult_ghostwriter") - config.cult_ghostwriter_req_cultists = text2num(value) - - if("character_slots") - config.character_slots = text2num(value) - - if("loadout_slots") - config.loadout_slots = text2num(value) - - if("allow_drone_spawn") - config.allow_drone_spawn = text2num(value) - - if("drone_build_time") - config.drone_build_time = text2num(value) - - if("max_maint_drones") - config.max_maint_drones = text2num(value) - - if("use_overmap") - config.use_overmap = 1 - - if("engine_map") - config.engine_map = splittext(value, ",") -/* - if("station_levels") - using_map.station_levels = text2numlist(value, ";") - - if("admin_levels") - using_map.admin_levels = text2numlist(value, ";") - - if("contact_levels") - using_map.contact_levels = text2numlist(value, ";") - - if("player_levels") - using_map.player_levels = text2numlist(value, ";") -*/ - if("expected_round_length") - config.expected_round_length = MinutesToTicks(text2num(value)) - - if("disable_welder_vision") - config.welder_vision = 0 - - if("allow_extra_antags") - config.allow_extra_antags = 1 - - if("event_custom_start_mundane") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_moderate") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_major") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_delay_lower") - var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("event_delay_upper") - var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("starlight") - value = text2num(value) - config.starlight = value >= 0 ? value : 0 - - if("ert_species") - config.ert_species = splittext(value, ";") - if(!config.ert_species.len) - config.ert_species += SPECIES_HUMAN - - if("law_zero") - law_zero = value - - if("aggressive_changelog") - config.aggressive_changelog = 1 - - if("default_language_prefixes") - var/list/values = splittext(value, " ") - if(values.len > 0) - language_prefixes = values - - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - - if("radiation_resistance_calc_divide") - radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV - - if("radiation_resistance_calc_subtract") - radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB - - if("radiation_resistance_multiplier") - radiation_resistance_multiplier = text2num(value) - - if("radiation_material_resistance_divisor") - radiation_material_resistance_divisor = text2num(value) - - if("radiation_decay_rate") - radiation_decay_rate = text2num(value) - - if ("panic_bunker") - config.panic_bunker = 1 - - if ("paranoia_logging") - config.paranoia_logging = 1 - - if("ip_reputation") - config.ip_reputation = 1 - - if("ipr_email") - config.ipr_email = value - - if("ipr_block_bad_ips") - config.ipr_block_bad_ips = 1 - - if("ipr_bad_score") - config.ipr_bad_score = text2num(value) - - if("ipr_allow_existing") - config.ipr_allow_existing = 1 - - if("ipr_minimum_age") - config.ipr_minimum_age = text2num(value) - - if("random_submap_orientation") - config.random_submap_orientation = 1 - - if("autostart_solars") - config.autostart_solars = TRUE - - if("sqlite_enabled") - config.sqlite_enabled = TRUE - - if("sqlite_feedback") - config.sqlite_feedback = TRUE - - if("sqlite_feedback_topics") - config.sqlite_feedback_topics = splittext(value, ";") - if(!config.sqlite_feedback_topics.len) - config.sqlite_feedback_topics += "General" - - if("sqlite_feedback_privacy") - config.sqlite_feedback_privacy = TRUE - - if("sqlite_feedback_cooldown") - config.sqlite_feedback_cooldown = text2num(value) - - if("defib_timer") - config.defib_timer = text2num(value) - - if("defib_braindamage_timer") - config.defib_braindamage_timer = text2num(value) - - if("disable_cid_warn_popup") - config.disable_cid_warn_popup = TRUE - - if("enable_night_shifts") - config.enable_night_shifts = TRUE - - if("jukebox_track_files") - config.jukebox_track_files = splittext(value, ";") - - // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. - if("vgs_access_identifier") - config.vgs_access_identifier = value - if("vgs_server_port") - config.vgs_server_port = text2num(value) - // VOREStation Edit End - - else - log_misc("Unknown setting in configuration: '[name]'") - - else if(type == "game_options") - if(!value) - log_misc("Unknown value for setting [name] in [filename].") - value = text2num(value) - - switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_softcrit") - config.health_threshold_softcrit = value - if("health_threshold_dead") - config.health_threshold_dead = value - if("show_human_death_message") - config.show_human_death_message = 1 - if("revival_pod_plants") - config.revival_pod_plants = value - if("revival_cloning") - config.revival_cloning = value - if("revival_brain_life") - config.revival_brain_life = value - if("organ_health_multiplier") - config.organ_health_multiplier = value / 100 - if("organ_regeneration_multiplier") - config.organ_regeneration_multiplier = value / 100 - if("organ_damage_spillover_multiplier") - config.organ_damage_spillover_multiplier = value / 100 - if("organs_can_decay") - config.organs_decay = 1 - if("default_brain_health") - config.default_brain_health = text2num(value) - if(!config.default_brain_health || config.default_brain_health < 1) - config.default_brain_health = initial(config.default_brain_health) - if("bones_can_break") - config.bones_can_break = value - if("limbs_can_break") - config.limbs_can_break = value - if("allow_headgibs") - config.allow_headgibs = TRUE - - if("run_speed") - config.run_speed = value - if("walk_speed") - config.walk_speed = value - - if("human_delay") - config.human_delay = value - if("robot_delay") - config.robot_delay = value - if("monkey_delay") - config.monkey_delay = value - if("alien_delay") - config.alien_delay = value - if("slime_delay") - config.slime_delay = value - if("animal_delay") - config.animal_delay = value - - if("footstep_volume") - config.footstep_volume = text2num(value) - - if("use_loyalty_implants") - config.use_loyalty_implants = 1 - - if("loadout_whitelist") - config.loadout_whitelist = text2num(value) - - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - sqladdress = value - if ("port") - sqlport = value - if ("database") - sqldb = value - if ("login") - sqllogin = value - if ("password") - sqlpass = value - if ("feedback_database") - sqlfdbkdb = value - if ("feedback_login") - sqlfdbklogin = value - if ("feedback_password") - sqlfdbkpass = value - if ("enable_stat_tracking") - sqllogging = 1 - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadforumsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - forumsqladdress = value - if ("port") - forumsqlport = value - if ("database") - forumsqldb = value - if ("login") - forumsqllogin = value - if ("password") - forumsqlpass = value - if ("activatedgroup") - forum_activated_group = value - if ("authenticatedgroup") - forum_authenticated_group = value - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - for (var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if (M.config_tag && M.config_tag == mode_name) - return M - return gamemode_cache["extended"] - -/datum/configuration/proc/get_runnable_modes() - var/list/runnable_modes = list() - for(var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) - runnable_modes |= M - return runnable_modes - -/datum/configuration/proc/post_load() - //apply a default value to config.python_path, if needed - if (!config.python_path) - if(world.system_type == UNIX) - config.python_path = "/usr/bin/env python2" - else //probably windows, if not this should work anyway - config.python_path = "python" -======= -var/list/gamemode_cache = list() - -/datum/configuration - var/static/server_name = null // server name (for world name / status) - var/static/server_suffix = 0 // generate numeric suffix based on server port - - var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located - - var/static/log_ooc = 0 // log OOC channel - var/static/log_access = 0 // log login/logout - var/static/log_say = 0 // log client say - var/static/log_admin = 0 // log admin actions - var/static/log_debug = 1 // log debug output - var/static/log_game = 0 // log game events - var/static/log_vote = 0 // log voting - var/static/log_whisper = 0 // log client whisper - var/static/log_emote = 0 // log emotes - var/static/log_attack = 0 // log attack messages - var/static/log_adminchat = 0 // log admin chat messages - var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such - var/static/log_pda = 0 // log pda messages - var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits - var/static/log_runtime = 0 // logs world.log to a file - var/static/log_world_output = 0 // log to_world_log(messages) - var/static/log_graffiti = 0 // logs graffiti - var/static/sql_enabled = 0 // for sql switching - var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour - var/static/allow_vote_restart = 0 // allow votes to restart - var/static/ert_admin_call_only = 0 - var/static/allow_vote_mode = 0 // allow votes to change mode - var/static/allow_admin_jump = 1 // allows admin jumping - var/static/allow_admin_spawning = 1 // allows admin item spawning - var/static/allow_admin_rev = 1 // allows admin revives - var/static/pregame_time = 180 // pregame time in seconds - var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) - var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) - var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called - var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote - var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). - var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) - var/static/vote_no_dead = 0 // dead people can't vote (tbi) -// var/static/enable_authentication = 0 // goon authentication - var/static/del_new_on_log = 1 // del's new players if they log before they spawn in - var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard - var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players - var/static/objectives_disabled = 0 //if objectives are disabled or not - var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. - var/static/allow_Metadata = 0 // Metadata is supported. - var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/static/fps = 20 - var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling - var/static/Tickcomp = 0 - var/static/socket_talk = 0 // use socket_talk to communicate with other processes - var/static/list/resource_urls = null - var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. - var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. - var/static/list/mode_names = list() - var/static/list/modes = list() // allowed modes - var/static/list/votable_modes = list() // votable modes - var/static/list/probabilities = list() // relative probability of each mode - var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. - var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. - var/static/humans_need_surnames = 0 - var/static/allow_random_events = 0 // enables random events mid-round when set to 1 - var/static/enable_game_master = 0 // enables the 'smart' event system. - var/static/allow_ai = 1 // allow ai job - var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. - var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell - var/static/hostedby = null - - var/static/respawn = 1 - var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) - var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" - - var/static/guest_jobban = 1 - var/static/usewhitelist = 0 - var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 - var/static/show_mods = 0 - var/static/show_devs = 0 - var/static/show_event_managers = 0 - var/static/mods_can_tempban = 0 - var/static/mods_can_job_tempban = 0 - var/static/mod_tempban_max = 1440 - var/static/mod_job_tempban_max = 1440 - var/static/load_jobs_from_txt = 0 - var/static/ToRban = 0 - var/static/automute_on = 0 //enables automuting/spam prevention - var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. - - var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... - var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. - - var/static/character_slots = 10 // The number of available character slots - var/static/loadout_slots = 3 // The number of loadout slots per character - - var/static/max_maint_drones = 5 //This many drones can spawn, - var/static/allow_drone_spawn = 1 //assuming the admin allow them to. - var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. - - var/static/disable_player_mice = 0 - var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech - - var/static/usealienwhitelist = 0 - var/static/limitalienplayers = 0 - var/static/alien_to_human_ratio = 0.5 - var/static/allow_extra_antags = 0 - var/static/guests_allowed = 1 - var/static/debugparanoid = 0 - var/static/panic_bunker = 0 - var/static/paranoia_logging = 0 - - var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. - var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. - var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). - var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. - var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. - var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. - - var/static/serverurl - var/static/server - var/static/banappeals - var/static/wikiurl - var/static/wikisearchurl - var/static/forumurl - var/static/githuburl - var/static/discordurl - var/static/rulesurl - var/static/mapurl - - //Alert level description - var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." - var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." - var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." - var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." - var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." - var/static/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - var/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - var/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - - var/static/forbid_singulo_possession = 0 - - //game_options.txt configs - - var/static/health_threshold_softcrit = 0 - var/static/health_threshold_crit = 0 - var/static/health_threshold_dead = -100 - - var/static/organ_health_multiplier = 1 - var/static/organ_regeneration_multiplier = 1 - var/static/organs_decay - var/static/default_brain_health = 400 - var/static/allow_headgibs = FALSE - - //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, - //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. - var/static/organ_damage_spillover_multiplier = 0.5 - - var/static/bones_can_break = 0 - var/static/limbs_can_break = 0 - - var/static/revival_pod_plants = 1 - var/static/revival_cloning = 1 - var/static/revival_brain_life = -1 - - var/static/use_loyalty_implants = 0 - - var/static/welder_vision = 1 - var/static/generate_map = 0 - var/static/no_click_cooldown = 0 - - //Used for modifying movement speed for mobs. - //Unversal modifiers - var/static/run_speed = 0 - var/static/walk_speed = 0 - - //Mob specific modifiers. NOTE: These will affect different mob types in different ways - var/static/human_delay = 0 - var/static/robot_delay = 0 - var/static/monkey_delay = 0 - var/static/alien_delay = 0 - var/static/slime_delay = 0 - var/static/animal_delay = 0 - - var/static/footstep_volume = 0 - - var/static/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt - var/static/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt - var/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database - var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database - - var/static/simultaneous_pm_warning_timeout = 100 - - var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. - var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. - - var/static/assistant_maint = 0 //Do assistants get maint access? - var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. - var/static/ghost_interaction = 0 - - var/static/comms_password = "" - - var/static/enter_allowed = 1 - - var/use_irc_bot = 0 - var/use_node_bot = 0 - var/irc_bot_port = 0 - var/irc_bot_host = "" - var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge - var/main_irc = "" - var/admin_irc = "" - var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix - var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. - var/use_overmap = 0 - - var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. - - // Event settings - var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours - // If the first delay has a custom start time - // No custom time, no custom time, between 80 to 100 minutes respectively. - var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) - // The lowest delay until next event - // 10, 30, 50 minutes respectively - var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) - // The upper delay until next event - // 15, 45, 70 minutes respectively - var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) - - var/static/aliens_allowed = 1 //Changed to 1 so player xenos can lay eggs. - var/static/ninjas_allowed = 0 - var/static/abandon_allowed = 1 - var/static/ooc_allowed = 1 - var/static/looc_allowed = 1 - var/static/dooc_allowed = 1 - var/static/dsay_allowed = 1 - - var/persistence_disabled = FALSE - var/persistence_ignore_mapload = FALSE - - var/allow_byond_links = 0 - var/allow_discord_links = 0 - var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations - - var/starlight = 0 // Whether space turfs have ambient light or not - - var/static/list/ert_species = list(SPECIES_HUMAN) - - var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" - - var/static/aggressive_changelog = 0 - - var/static/list/language_prefixes = list(",","#")//Default language prefixes - - var/static/show_human_death_message = 1 - - var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf - var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick - var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit - var/static/radiation_material_resistance_divisor = 1 - var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. - - var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. - var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. - - // New shiny SQLite stuff. - // The basics. - var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. - - // In-Game Feedback. - var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. - var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. - var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. - var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. - var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. - - var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. - var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. - - // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. - var/static/disable_cid_warn_popup = FALSE - - // whether or not to use the nightshift subsystem to perform lighting changes - var/static/enable_night_shifts = FALSE - - // How strictly the loadout enforces object species whitelists - var/loadout_whitelist = LOADOUT_WHITELIST_LAX - - var/static/vgs_access_identifier = null // VOREStation Edit - VGS - var/static/vgs_server_port = null // VOREStation Edit - VGS - - var/disable_webhook_embeds = FALSE - - var/static/list/jukebox_track_files - -/datum/configuration/New() - var/list/L = subtypesof(/datum/game_mode) - for (var/T in L) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - var/datum/game_mode/M = new T() - if (M.config_tag) - gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. - if(!(M.config_tag in modes)) // ensure each mode is added only once - log_misc("Adding game mode [M.name] ([M.config_tag]) to configuration.") - modes += M.config_tag - mode_names[M.config_tag] = M.name - probabilities[M.config_tag] = M.probability - player_requirements[M.config_tag] = M.required_players - player_requirements_secret[M.config_tag] = M.required_players_secret - if (M.votable) - src.votable_modes += M.config_tag - src.votable_modes += "secret" - -/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist - var/list/Lines = file2list(filename) - - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - if(type == "config") - switch (name) - if ("resource_urls") - config.resource_urls = splittext(value, " ") - - if ("admin_legacy_system") - config.admin_legacy_system = 1 - - if ("ban_legacy_system") - config.ban_legacy_system = 1 - - if ("use_age_restriction_for_jobs") - config.use_age_restriction_for_jobs = 1 - - if ("use_age_restriction_for_antags") - config.use_age_restriction_for_antags = 1 - - if ("jobs_have_minimal_access") - config.jobs_have_minimal_access = 1 - - if ("use_recursive_explosions") - use_recursive_explosions = 1 - - if ("multi_z_explosion_scalar") - multi_z_explosion_scalar = text2num(value) - - if ("log_ooc") - config.log_ooc = 1 - - if ("log_access") - config.log_access = 1 - - if ("sql_enabled") - config.sql_enabled = 1 - - if ("log_say") - config.log_say = 1 - - if ("debug_paranoid") - config.debugparanoid = 1 - - if ("log_admin") - config.log_admin = 1 - - if ("log_debug") - config.log_debug = text2num(value) - - if ("log_game") - config.log_game = 1 - - if ("log_vote") - config.log_vote = 1 - - if ("log_whisper") - config.log_whisper = 1 - - if ("log_attack") - config.log_attack = 1 - - if ("log_emote") - config.log_emote = 1 - - if ("log_adminchat") - config.log_adminchat = 1 - - if ("log_adminwarn") - config.log_adminwarn = 1 - - if ("log_pda") - config.log_pda = 1 - - if ("log_world_output") - config.log_world_output = 1 - - if ("log_hrefs") - config.log_hrefs = 1 - - if ("log_runtime") - config.log_runtime = 1 - - if ("log_graffiti") - config.log_graffiti = 1 - - if ("generate_map") - config.generate_map = 1 - - if ("no_click_cooldown") - config.no_click_cooldown = 1 - - if("allow_admin_ooccolor") - config.allow_admin_ooccolor = 1 - - if ("allow_vote_restart") - config.allow_vote_restart = 1 - - if ("allow_vote_mode") - config.allow_vote_mode = 1 - - if ("allow_admin_jump") - config.allow_admin_jump = 1 - - if("allow_admin_rev") - config.allow_admin_rev = 1 - - if ("allow_admin_spawning") - config.allow_admin_spawning = 1 - - if ("allow_byond_links") - allow_byond_links = 1 - - if ("allow_discord_links") - allow_discord_links = 1 - - if ("allow_url_links") - allow_url_links = 1 - - if ("no_dead_vote") - config.vote_no_dead = 1 - - if ("default_no_vote") - config.vote_no_default = 1 - - if ("pregame_time") - config.pregame_time = text2num(value) - - if ("vote_delay") - config.vote_delay = text2num(value) - - if ("vote_period") - config.vote_period = text2num(value) - - if ("vote_autotransfer_initial") - config.vote_autotransfer_initial = text2num(value) - - if ("vote_autotransfer_interval") - config.vote_autotransfer_interval = text2num(value) - - if ("vote_autogamemode_timeleft") - config.vote_autogamemode_timeleft = text2num(value) - - if("ert_admin_only") - config.ert_admin_call_only = 1 - - if ("allow_ai") - config.allow_ai = 1 - - if ("allow_ai_shells") - config.allow_ai_shells = TRUE - - if("give_free_ai_shell") - config.give_free_ai_shell = TRUE - -// if ("authentication") -// config.enable_authentication = 1 - - if ("norespawn") - config.respawn = 0 - - if ("respawn_time") - var/raw_minutes = text2num(value) - config.respawn_time = raw_minutes MINUTES - - if ("respawn_message") - config.respawn_message = "[value]" - - if ("servername") - config.server_name = value - - if ("serversuffix") - config.server_suffix = 1 - - if ("nudge_script_path") - config.nudge_script_path = value - - if ("hostedby") - config.hostedby = value - - if ("serverurl") - config.serverurl = value - - if ("server") - config.server = value - - if ("banappeals") - config.banappeals = value - - if ("wikiurl") - config.wikiurl = value - - if ("wikisearchurl") - config.wikisearchurl = value - - if ("forumurl") - config.forumurl = value - - if ("rulesurl") - config.rulesurl = value - - if ("mapurl") - config.mapurl = value - - if ("githuburl") - config.githuburl = value - - if ("discordurl") - config.discordurl = value - - if ("guest_jobban") - config.guest_jobban = 1 - - if ("guest_ban") - config.guests_allowed = 0 - - if ("disable_ooc") - config.ooc_allowed = 0 - config.looc_allowed = 0 - - if ("disable_entry") - config.enter_allowed = 0 - - if ("disable_dead_ooc") - config.dooc_allowed = 0 - - if ("disable_dsay") - config.dsay_allowed = 0 - - if ("disable_respawn") - config.abandon_allowed = 0 - - if ("usewhitelist") - config.usewhitelist = 1 - - if ("feature_object_spell_system") - config.feature_object_spell_system = 1 - - if ("allow_metadata") - config.allow_Metadata = 1 - - if ("traitor_scaling") - config.traitor_scaling = 1 - - if ("aliens_allowed") - config.aliens_allowed = 1 - - if ("ninjas_allowed") - config.ninjas_allowed = 1 - - if ("objectives_disabled") - config.objectives_disabled = 1 - - if("protect_roles_from_antagonist") - config.protect_roles_from_antagonist = 1 - - if("persistence_disabled") - config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. - - if("persistence_ignore_mapload") - config.persistence_ignore_mapload = TRUE - - if ("probability") - var/prob_pos = findtext(value, " ") - var/prob_name = null - var/prob_value = null - - if (prob_pos) - prob_name = lowertext(copytext(value, 1, prob_pos)) - prob_value = copytext(value, prob_pos + 1) - if (prob_name in config.modes) - config.probabilities[prob_name] = text2num(prob_value) - else - log_misc("Unknown game mode probability configuration definition: [prob_name].") - else - log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") - - if ("required_players", "required_players_secret") - var/req_pos = findtext(value, " ") - var/req_name = null - var/req_value = null - var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. - - if(req_pos) - req_name = lowertext(copytext(value, 1, req_pos)) - req_value = copytext(value, req_pos + 1) - if(req_name in config.modes) - if(is_secret_override) - config.player_requirements_secret[req_name] = text2num(req_value) - else - config.player_requirements[req_name] = text2num(req_value) - else - log_misc("Unknown game mode player requirement configuration definition: [req_name].") - else - log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") - - if("allow_random_events") - config.allow_random_events = 1 - - if("enable_game_master") - config.enable_game_master = 1 - - if("kick_inactive") - config.kick_inactive = text2num(value) - - if("show_mods") - config.show_mods = 1 - - if("show_devs") - config.show_devs = 1 - - if("show_event_managers") - config.show_event_managers = 1 - - if("mods_can_tempban") - config.mods_can_tempban = 1 - - if("mods_can_job_tempban") - config.mods_can_job_tempban = 1 - - if("mod_tempban_max") - config.mod_tempban_max = text2num(value) - - if("mod_job_tempban_max") - config.mod_job_tempban_max = text2num(value) - - if("load_jobs_from_txt") - load_jobs_from_txt = 1 - - if("alert_red_upto") - config.alert_desc_red_upto = value - - if("alert_red_downto") - config.alert_desc_red_downto = value - - if("alert_blue_downto") - config.alert_desc_blue_downto = value - - if("alert_blue_upto") - config.alert_desc_blue_upto = value - - if("alert_green") - config.alert_desc_green = value - - if("alert_delta") - config.alert_desc_delta = value - - if("forbid_singulo_possession") - forbid_singulo_possession = 1 - - if("popup_admin_pm") - config.popup_admin_pm = 1 - - if("allow_holidays") - Holiday = 1 - - if("use_irc_bot") - use_irc_bot = 1 - - if("use_node_bot") - use_node_bot = 1 - - if("irc_bot_port") - config.irc_bot_port = value - - if("irc_bot_export") - irc_bot_export = 1 - - if("ticklag") - var/ticklag = text2num(value) - if(ticklag > 0) - fps = 10 / ticklag - - if("tick_limit_mc_init") - tick_limit_mc_init = text2num(value) - - if("allow_antag_hud") - config.antag_hud_allowed = 1 - if("antag_hud_restricted") - config.antag_hud_restricted = 1 - - if("socket_talk") - socket_talk = text2num(value) - - if("tickcomp") - Tickcomp = 1 - - if("humans_need_surnames") - humans_need_surnames = 1 - - if("tor_ban") - ToRban = 1 - - if("automute_on") - automute_on = 1 - - if("usealienwhitelist") - usealienwhitelist = 1 - - if("alien_player_ratio") - limitalienplayers = 1 - alien_to_human_ratio = text2num(value) - - if("assistant_maint") - config.assistant_maint = 1 - - if("gateway_delay") - config.gateway_delay = text2num(value) - - if("continuous_rounds") - config.continous_rounds = 1 - - if("ghost_interaction") - config.ghost_interaction = 1 - - if("disable_player_mice") - config.disable_player_mice = 1 - - if("uneducated_mice") - config.uneducated_mice = 1 - - if("comms_password") - config.comms_password = value - - if("irc_bot_host") - config.irc_bot_host = value - - if("main_irc") - config.main_irc = value - - if("admin_irc") - config.admin_irc = value - - if("python_path") - if(value) - config.python_path = value - - if("use_lib_nudge") - config.use_lib_nudge = 1 - - if("allow_cult_ghostwriter") - config.cult_ghostwriter = 1 - - if("req_cult_ghostwriter") - config.cult_ghostwriter_req_cultists = text2num(value) - - if("character_slots") - config.character_slots = text2num(value) - - if("loadout_slots") - config.loadout_slots = text2num(value) - - if("allow_drone_spawn") - config.allow_drone_spawn = text2num(value) - - if("drone_build_time") - config.drone_build_time = text2num(value) - - if("max_maint_drones") - config.max_maint_drones = text2num(value) - - if("use_overmap") - config.use_overmap = 1 - - if("engine_map") - config.engine_map = splittext(value, ",") -/* - if("station_levels") - using_map.station_levels = text2numlist(value, ";") - - if("admin_levels") - using_map.admin_levels = text2numlist(value, ";") - - if("contact_levels") - using_map.contact_levels = text2numlist(value, ";") - - if("player_levels") - using_map.player_levels = text2numlist(value, ";") -*/ - if("expected_round_length") - config.expected_round_length = MinutesToTicks(text2num(value)) - - if("disable_welder_vision") - config.welder_vision = 0 - - if("allow_extra_antags") - config.allow_extra_antags = 1 - - if("event_custom_start_mundane") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_moderate") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_custom_start_major") - var/values = text2numlist(value, ";") - config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) - - if("event_delay_lower") - var/values = text2numlist(value, ";") - config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("event_delay_upper") - var/values = text2numlist(value, ";") - config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) - config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) - config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) - - if("starlight") - value = text2num(value) - config.starlight = value >= 0 ? value : 0 - - if("ert_species") - config.ert_species = splittext(value, ";") - if(!config.ert_species.len) - config.ert_species += SPECIES_HUMAN - - if("law_zero") - law_zero = value - - if("aggressive_changelog") - config.aggressive_changelog = 1 - - if("default_language_prefixes") - var/list/values = splittext(value, " ") - if(values.len > 0) - language_prefixes = values - - if("radiation_lower_limit") - radiation_lower_limit = text2num(value) - - if("radiation_resistance_calc_divide") - radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV - - if("radiation_resistance_calc_subtract") - radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB - - if("radiation_resistance_multiplier") - radiation_resistance_multiplier = text2num(value) - - if("radiation_material_resistance_divisor") - radiation_material_resistance_divisor = text2num(value) - - if("radiation_decay_rate") - radiation_decay_rate = text2num(value) - - if ("panic_bunker") - config.panic_bunker = 1 - - if ("paranoia_logging") - config.paranoia_logging = 1 - - if("ip_reputation") - config.ip_reputation = 1 - - if("ipr_email") - config.ipr_email = value - - if("ipr_block_bad_ips") - config.ipr_block_bad_ips = 1 - - if("ipr_bad_score") - config.ipr_bad_score = text2num(value) - - if("ipr_allow_existing") - config.ipr_allow_existing = 1 - - if("ipr_minimum_age") - config.ipr_minimum_age = text2num(value) - - if("random_submap_orientation") - config.random_submap_orientation = 1 - - if("autostart_solars") - config.autostart_solars = TRUE - - if("sqlite_enabled") - config.sqlite_enabled = TRUE - - if("sqlite_feedback") - config.sqlite_feedback = TRUE - - if("sqlite_feedback_topics") - config.sqlite_feedback_topics = splittext(value, ";") - if(!config.sqlite_feedback_topics.len) - config.sqlite_feedback_topics += "General" - - if("sqlite_feedback_privacy") - config.sqlite_feedback_privacy = TRUE - - if("sqlite_feedback_cooldown") - config.sqlite_feedback_cooldown = text2num(value) - - if("defib_timer") - config.defib_timer = text2num(value) - - if("defib_braindamage_timer") - config.defib_braindamage_timer = text2num(value) - - if("disable_cid_warn_popup") - config.disable_cid_warn_popup = TRUE - - if("enable_night_shifts") - config.enable_night_shifts = TRUE - - if("jukebox_track_files") - config.jukebox_track_files = splittext(value, ";") - - // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. - if("vgs_access_identifier") - config.vgs_access_identifier = value - if("vgs_server_port") - config.vgs_server_port = text2num(value) - // VOREStation Edit End - - else - log_misc("Unknown setting in configuration: '[name]'") - - else if(type == "game_options") - if(!value) - log_misc("Unknown value for setting [name] in [filename].") - value = text2num(value) - - switch(name) - if("health_threshold_crit") - config.health_threshold_crit = value - if("health_threshold_softcrit") - config.health_threshold_softcrit = value - if("health_threshold_dead") - config.health_threshold_dead = value - if("show_human_death_message") - config.show_human_death_message = 1 - if("revival_pod_plants") - config.revival_pod_plants = value - if("revival_cloning") - config.revival_cloning = value - if("revival_brain_life") - config.revival_brain_life = value - if("organ_health_multiplier") - config.organ_health_multiplier = value / 100 - if("organ_regeneration_multiplier") - config.organ_regeneration_multiplier = value / 100 - if("organ_damage_spillover_multiplier") - config.organ_damage_spillover_multiplier = value / 100 - if("organs_can_decay") - config.organs_decay = 1 - if("default_brain_health") - config.default_brain_health = text2num(value) - if(!config.default_brain_health || config.default_brain_health < 1) - config.default_brain_health = initial(config.default_brain_health) - if("bones_can_break") - config.bones_can_break = value - if("limbs_can_break") - config.limbs_can_break = value - if("allow_headgibs") - config.allow_headgibs = TRUE - - if("run_speed") - config.run_speed = value - if("walk_speed") - config.walk_speed = value - - if("human_delay") - config.human_delay = value - if("robot_delay") - config.robot_delay = value - if("monkey_delay") - config.monkey_delay = value - if("alien_delay") - config.alien_delay = value - if("slime_delay") - config.slime_delay = value - if("animal_delay") - config.animal_delay = value - - if("footstep_volume") - config.footstep_volume = text2num(value) - - if("use_loyalty_implants") - config.use_loyalty_implants = 1 - - if("loadout_whitelist") - config.loadout_whitelist = text2num(value) - - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - sqladdress = value - if ("port") - sqlport = value - if ("database") - sqldb = value - if ("login") - sqllogin = value - if ("password") - sqlpass = value - if ("feedback_database") - sqlfdbkdb = value - if ("feedback_login") - sqlfdbklogin = value - if ("feedback_password") - sqlfdbkpass = value - if ("enable_stat_tracking") - sqllogging = 1 - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/loadforumsql(filename) // -- TLE - var/list/Lines = file2list(filename) - for(var/t in Lines) - if(!t) continue - - t = trim(t) - if (length(t) == 0) - continue - else if (copytext(t, 1, 2) == "#") - continue - - var/pos = findtext(t, " ") - var/name = null - var/value = null - - if (pos) - name = lowertext(copytext(t, 1, pos)) - value = copytext(t, pos + 1) - else - name = lowertext(t) - - if (!name) - continue - - switch (name) - if ("address") - forumsqladdress = value - if ("port") - forumsqlport = value - if ("database") - forumsqldb = value - if ("login") - forumsqllogin = value - if ("password") - forumsqlpass = value - if ("activatedgroup") - forum_activated_group = value - if ("authenticatedgroup") - forum_authenticated_group = value - else - log_misc("Unknown setting in configuration: '[name]'") - -/datum/configuration/proc/pick_mode(mode_name) - // I wish I didn't have to instance the game modes in order to look up - // their information, but it is the only way (at least that I know of). - for (var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if (M.config_tag && M.config_tag == mode_name) - return M - return gamemode_cache["extended"] - -/datum/configuration/proc/get_runnable_modes() - var/list/runnable_modes = list() - for(var/game_mode in gamemode_cache) - var/datum/game_mode/M = gamemode_cache[game_mode] - if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) - runnable_modes |= M - return runnable_modes - -/datum/configuration/proc/post_load() - //apply a default value to config.python_path, if needed - if (!config.python_path) - if(world.system_type == UNIX) - config.python_path = "/usr/bin/env python2" - else //probably windows, if not this should work anyway - config.python_path = "python" ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt From 429eebf5fe6f1e57463816e9af6a171dcb6113df Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:03:34 -0400 Subject: [PATCH 72/86] powder that makes you say yes --- code/datums/helper_datums/getrev.dm | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 4533abbe1c..68aa27e2d1 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -45,18 +45,8 @@ GLOBAL_DATUM(revdata, /datum/getrev) return if(header) . += "The following pull requests are currently test merged:" -<<<<<<< HEAD - for(var/line in testmerge) - var/datum/tgs_revision_information/test_merge/tm = line - var/cm = tm.head_commit //CHOMPStation Edit TGS4 -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt - for(var/line in testmerge) - var/datum/tgs_revision_information/test_merge/tm = line - var/cm = tm.pull_request_commit -======= for(var/datum/tgs_revision_information/test_merge/tm as anything in testmerge) - var/cm = tm.pull_request_commit ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + var/cm = tm.head_commit //CHOMPStation Edit TGS4 var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11)) if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder)) continue From 4cb45618a0a2415289635e5914b7a1f891c0795a Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:06:36 -0400 Subject: [PATCH 73/86] powder that makes you say yes --- .../objects/structures/alien/alien egg.dm | 79 ++++++++++++------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/code/game/objects/structures/alien/alien egg.dm b/code/game/objects/structures/alien/alien egg.dm index 90319e8a83..7ca4bd37b7 100644 --- a/code/game/objects/structures/alien/alien egg.dm +++ b/code/game/objects/structures/alien/alien egg.dm @@ -37,55 +37,76 @@ /obj/structure/alien/egg/update_icon() if(progress == -1) - icon_state = "egg_hatched" + icon_state = "egg_opened" else if(progress < MAX_PROGRESS) icon_state = "egg_growing" else icon_state = "egg" -/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user) - if(progress == -1) //Egg has been hatched. - return + // Ghostjoinable icon + var/static/image/I + if(!I) + I = image('icons/mob/hud_vr.dmi', "ghostjoin") + I.invisibility = INVISIBILITY_OBSERVER + I.plane = PLANE_GHOSTS + I.appearance_flags = KEEP_APART|RESET_TRANSFORM + + if(progress >= MAX_PROGRESS) + add_overlay(I) + else + cut_overlay(I) - if(progress < MAX_PROGRESS) - to_chat(user, "\The [src] has not yet matured.") - return - if(!user.MayRespawn(1)) +/obj/structure/alien/egg/attack_ghost(var/mob/observer/dead/user) + // Still a ghost? + if(!istype(user)) + tgui_alert_async(user, "You have to be an observer to join as this Xenomorph larva.") return - + // Check for bans properly. if(jobban_isbanned(user, "Xenomorph")) - to_chat(user, "You are banned from playing a Xenomorph.") + tgui_alert_async(user, "You are banned from playing a Xenomorph, so you can't join as this Xenomorph larva.") + return + + // Check for respawn + if(!user.MayRespawn(1)) + tgui_alert_async(user, "You aren't allowed to respawn, so you can't join as this Xenomorph larva.") + return + + if(progress == -1) + tgui_alert_async(user, "That egg has already hatched.") + else if(progress >= MAX_PROGRESS) + tgui_alert_async(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", list("Yes","No"), CALLBACK(src, .proc/ghost_dunk), 20 SECONDS) + else + tgui_alert_async(user, "\The [src] has not yet matured.") + +/obj/structure/alien/egg/proc/ghost_dunk(choice) + if(choice != "Yes") + return + var/mob/observer/dead/user = usr + if(progress < MAX_PROGRESS || !istype(user)) return - var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") - - if(!src || confirm != "Yes") - return - - if(!user || !user.ckey) - return - - if(progress == -1) //Egg has been hatched. - to_chat(user, "Too slow...") - return - - flick("egg_opening",src) progress = -1 // No harvesting pls. - sleep(5) + flick("egg_opening",src) + sleep(5) //5ds animation - if(!src || !user) + if(!src || !istype(user)) visible_message("\The [src] writhes with internal motion, but nothing comes out.") progress = MAX_PROGRESS // Someone else can have a go. return // What a pain. // Create the mob, transfer over key. var/mob/living/carbon/alien/larva/larva = new(get_turf(src)) - larva.ckey = user.ckey - spawn(-1) - if(user) qdel(user) // Remove the keyless ghost if it exists. - + + // Move the ghost in + if(user.mind) + user.mind.active = TRUE + user.mind.transfer_to(larva) + else + larva.ckey = user.ckey + qdel(user) + visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!") // Turn us into a hatched egg. From f2633453de1fcd0445b678b2f015fc92c75c67a9 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:08:30 -0400 Subject: [PATCH 74/86] powder that makes you say yes --- code/game/objects/effects/alien/alien egg.dm | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/code/game/objects/effects/alien/alien egg.dm b/code/game/objects/effects/alien/alien egg.dm index ad06e1f73d..b512c83bad 100644 --- a/code/game/objects/effects/alien/alien egg.dm +++ b/code/game/objects/effects/alien/alien egg.dm @@ -64,33 +64,13 @@ return // Check for bans properly. -<<<<<<< HEAD:code/game/objects/effects/alien/alien egg.dm - if(jobban_isbanned(user, MODE_XENOMORPH)) - to_chat(user, "You are banned from playing a Genaprawn.") //CHOMPedit -||||||| parent of b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm - if(jobban_isbanned(user, "Xenomorph")) - to_chat(user, "You are banned from playing a Xenomorph.") -======= if(jobban_isbanned(user, "Xenomorph")) tgui_alert_async(user, "You are banned from playing a Xenomorph, so you can't join as this Xenomorph larva.") ->>>>>>> b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm return -<<<<<<< HEAD:code/game/objects/effects/alien/alien egg.dm - - var/confirm = alert(user, "Are you sure you want to join as a Genaprawn larva?", "Become Larva", "No", "Yes") //CHOMPedit - - if(!src || confirm != "Yes") -||||||| parent of b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm - - var/confirm = alert(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", "No", "Yes") - - if(!src || confirm != "Yes") -======= // Check for respawn if(!user.MayRespawn(1)) tgui_alert_async(user, "You aren't allowed to respawn, so you can't join as this Xenomorph larva.") ->>>>>>> b004256516... Merge pull request #11163 from VOREStation/Arokha/alientweaks:code/game/objects/structures/alien/alien egg.dm return if(progress == -1) From 170ad8680ed553560a4ae5c6bf38bd5a6c3e0ed4 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:09:46 -0400 Subject: [PATCH 75/86] powder that makes you say yes --- code/game/objects/effects/alien/alien egg.dm | 83 ++++++++------------ 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/code/game/objects/effects/alien/alien egg.dm b/code/game/objects/effects/alien/alien egg.dm index b512c83bad..da12ae3f16 100644 --- a/code/game/objects/effects/alien/alien egg.dm +++ b/code/game/objects/effects/alien/alien egg.dm @@ -37,76 +37,55 @@ /obj/structure/alien/egg/update_icon() if(progress == -1) - icon_state = "egg_opened" + icon_state = "egg_hatched" else if(progress < MAX_PROGRESS) icon_state = "egg_growing" else icon_state = "egg" - // Ghostjoinable icon - var/static/image/I - if(!I) - I = image('icons/mob/hud_vr.dmi', "ghostjoin") - I.invisibility = INVISIBILITY_OBSERVER - I.plane = PLANE_GHOSTS - I.appearance_flags = KEEP_APART|RESET_TRANSFORM - - if(progress >= MAX_PROGRESS) - add_overlay(I) - else - cut_overlay(I) - - -/obj/structure/alien/egg/attack_ghost(var/mob/observer/dead/user) - // Still a ghost? - if(!istype(user)) - tgui_alert_async(user, "You have to be an observer to join as this Xenomorph larva.") +/obj/structure/alien/egg/attack_ghost(var/mob/observer/ghost/user) + if(progress == -1) //Egg has been hatched. return - - // Check for bans properly. - if(jobban_isbanned(user, "Xenomorph")) - tgui_alert_async(user, "You are banned from playing a Xenomorph, so you can't join as this Xenomorph larva.") + + if(progress < MAX_PROGRESS) + to_chat(user, "\The [src] has not yet matured.") return - - // Check for respawn + if(!user.MayRespawn(1)) - tgui_alert_async(user, "You aren't allowed to respawn, so you can't join as this Xenomorph larva.") - return - - if(progress == -1) - tgui_alert_async(user, "That egg has already hatched.") - else if(progress >= MAX_PROGRESS) - tgui_alert_async(user, "Are you sure you want to join as a Xenomorph larva?", "Become Larva", list("Yes","No"), CALLBACK(src, .proc/ghost_dunk), 20 SECONDS) - else - tgui_alert_async(user, "\The [src] has not yet matured.") - -/obj/structure/alien/egg/proc/ghost_dunk(choice) - if(choice != "Yes") - return - var/mob/observer/dead/user = usr - if(progress < MAX_PROGRESS || !istype(user)) return - progress = -1 // No harvesting pls. + // Check for bans properly. + if(jobban_isbanned(user, MODE_XENOMORPH)) + to_chat(user, "You are banned from playing a Genaprawn.") //CHOMPedit + return + + var/confirm = alert(user, "Are you sure you want to join as a Genaprawn larva?", "Become Larva", "No", "Yes") //CHOMPedit + + if(!src || confirm != "Yes") + return + + if(!user || !user.ckey) + return + + if(progress == -1) //Egg has been hatched. + to_chat(user, "Too slow...") + return + flick("egg_opening",src) - sleep(5) //5ds animation + progress = -1 // No harvesting pls. + sleep(5) - if(!src || !istype(user)) + if(!src || !user) visible_message("\The [src] writhes with internal motion, but nothing comes out.") progress = MAX_PROGRESS // Someone else can have a go. return // What a pain. // Create the mob, transfer over key. var/mob/living/carbon/alien/larva/larva = new(get_turf(src)) - - // Move the ghost in - if(user.mind) - user.mind.active = TRUE - user.mind.transfer_to(larva) - else - larva.ckey = user.ckey - qdel(user) - + larva.ckey = user.ckey + spawn(-1) + if(user) qdel(user) // Remove the keyless ghost if it exists. + visible_message("\The [src] splits open with a wet slithering noise, and \the [larva] writhes free!") // Turn us into a hatched egg. From a5485ef8f1a24b6846d086fc6c6b659139687c06 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:14:18 -0400 Subject: [PATCH 76/86] powder that makes you say yes --- code/game/machinery/doors/airlock.dm | 3077 +------------------------- 1 file changed, 3 insertions(+), 3074 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e08c48caaf..aa7795e7e7 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1,4 +1,4 @@ -<<<<<<< HEAD +<<<<<<< HEAD //VOREStation Edit - Redone a lot of airlock things: /* - Specific department maintenance doors @@ -1223,8 +1223,7 @@ About the new airlock wires panel: use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator - for(var/P in player_list) - var/mob/M = P + for(var/mob/M as anything in player_list) if(!M || !M.client) continue var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) @@ -1352,8 +1351,7 @@ About the new airlock wires panel: use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people has_beeped = 0 - for(var/P in player_list) - var/mob/M = P + for(var/mob/M as anything in player_list) if(!M || !M.client) continue var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) @@ -1535,3072 +1533,3 @@ About the new airlock wires panel: qdel(src) return TRUE return FALSE -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt -//VOREStation Edit - Redone a lot of airlock things: -/* -- Specific department maintenance doors -- Named doors properly according to type -- Gave them default access levels with the access constants -- Improper'd all of the names in the new() -*/ - -/obj/machinery/door/airlock - name = "Airlock" - icon = 'icons/obj/doors/Doorint.dmi' - icon_state = "door_closed" - power_channel = ENVIRON - - explosion_resistance = 10 - - // Doors do their own stuff - bullet_vulnerability = 0 - - blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime - - var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - var/hackProof = 0 // if 1, this door can't be hacked by the AI - var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. - var/main_power_lost_until = 0 //World time when main power is restored. - var/backup_power_lost_until = -1 //World time when backup power is restored. - var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. - var/spawnPowerRestoreRunning = 0 - var/welded = null - var/locked = 0 - var/lights = 1 // bolt lights show by default - var/aiDisabledIdScanner = 0 - var/aiHacking = 0 - var/obj/machinery/door/airlock/closeOther = null - var/closeOtherId = null - var/lockdownbyai = 0 - autoclose = 1 - var/assembly_type = /obj/structure/door_assembly - var/mineral = null - var/justzap = 0 - var/safe = 1 - normalspeed = 1 - var/obj/item/weapon/airlock_electronics/electronics = null - var/hasShocked = 0 //Prevents multiple shocks from happening - var/secured_wires = 0 - var/datum/wires/airlock/wires = null - - var/open_sound_powered = 'sound/machines/door/covert1o.ogg' - var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' - var/close_sound_powered = 'sound/machines/door/covert1c.ogg' - var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' - var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' - var/department_open_powered = null - var/department_close_powered = null - var/denied_sound = 'sound/machines/deniedbeep.ogg' - var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' - var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' - -/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) - if(stat & (BROKEN|NOPOWER)) - if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) - if(src.locked || src.welded) - visible_message("\The [user] begins breaking into \the [src] internals!") - user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. - if(do_after(user,10 SECONDS,src)) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - if(prob(25)) - src.shock(user, 100) - user.set_AI_busy(FALSE) - else if(src.density) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - if(src.locked || src.welded) - visible_message("\The [user] begins tearing into \the [src] internals!") - src.do_animate("deny") - if(do_after(user,15 SECONDS,src)) - visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") - src.do_animate("spark") - playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - src.set_broken() //These aren't emags, these be CLAWS - else if(src.density) - visible_message("\The [user] begins forcing \the [src] open!") - if(do_after(user, 5 SECONDS,src)) - playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - src.do_animate("deny") - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/get_material() - if(mineral) - return get_material_by_name(mineral) - return get_material_by_name(MAT_STEEL) - -/obj/machinery/door/airlock/command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcom.dmi' - req_one_access = list(access_heads) - assembly_type = /obj/structure/door_assembly/door_assembly_com - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd3o.ogg' - department_close_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsec.dmi' - req_one_access = list(access_security) - assembly_type = /obj/structure/door_assembly/door_assembly_sec - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Dooreng.dmi' - req_one_access = list(access_engine) - assembly_type = /obj/structure/door_assembly/door_assembly_eng - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmos.dmi' - req_one_access = list(access_atmospherics) - assembly_type = /obj/structure/door_assembly/door_assembly_eat - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormed.dmi' - req_one_access = list(access_medical) - assembly_type = /obj/structure/door_assembly/door_assembly_med - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/maintenance - name = "Maintenance Access" - icon = 'icons/obj/doors/Doormaint.dmi' - //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access - assembly_type = /obj/structure/door_assembly/door_assembly_mai - open_sound_powered = 'sound/machines/door/door2o.ogg' - close_sound_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/cargo - icon = 'icons/obj/doors/Doormaint_cargo.dmi' - req_one_access = list(access_cargo) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/door2o.ogg' - department_close_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/command - icon = 'icons/obj/doors/Doormaint_command.dmi' - req_one_access = list(access_heads) - -/obj/machinery/door/airlock/maintenance/common - icon = 'icons/obj/doors/Doormaint_common.dmi' - open_sound_powered = 'sound/machines/door/hall3o.ogg' - close_sound_powered = 'sound/machines/door/hall3c.ogg' - -/obj/machinery/door/airlock/maintenance/engi - icon = 'icons/obj/doors/Doormaint_engi.dmi' - req_one_access = list(access_engine) - -/obj/machinery/door/airlock/maintenance/int - icon = 'icons/obj/doors/Doormaint_int.dmi' - -/obj/machinery/door/airlock/maintenance/medical - icon = 'icons/obj/doors/Doormaint_med.dmi' - req_one_access = list(access_medical) - -/obj/machinery/door/airlock/maintenance/rnd - icon = 'icons/obj/doors/Doormaint_rnd.dmi' - req_one_access = list(access_research) - -/obj/machinery/door/airlock/maintenance/sec - icon = 'icons/obj/doors/Doormaint_sec.dmi' - req_one_access = list(access_security) - -/obj/machinery/door/airlock/external - name = "External Airlock" - icon = 'icons/obj/doors/Doorext.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/external/bolted - icon_state = "door_locked" // So it looks visibly bolted in map editor - locked = 1 - -// For convenience in making docking ports: one that is pre-bolted with frequency set! -/obj/machinery/door/airlock/external/bolted/cycling - frequency = 1379 - -/obj/machinery/door/airlock/glass_external - name = "External Airlock" - icon = 'icons/obj/doors/Doorextglass.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - opacity = 0 - glass = 1 - req_one_access = list(access_external_airlocks) - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/glass - name = "Glass Airlock" - icon = 'icons/obj/doors/Doorglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - open_sound_powered = 'sound/machines/door/hall1o.ogg' - close_sound_powered = 'sound/machines/door/hall1c.ogg' - legacy_open_powered = 'sound/machines/door/windowdoor.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - glass = 1 - -/obj/machinery/door/airlock/centcom - name = "Centcom Airlock" - icon = 'icons/obj/doors/Doorele.dmi' - req_one_access = list(access_cent_general) - opacity = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/glass_centcom - name = "Airlock" - icon = 'icons/obj/doors/Dooreleglass.dmi' - opacity = 0 - glass = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/vault - name = "Vault" - icon = 'icons/obj/doors/vault.dmi' - explosion_resistance = 20 - opacity = 1 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/vault1o.ogg' - close_sound_powered = 'sound/machines/door/vault1c.ogg' - -/obj/machinery/door/airlock/vault/bolted - icon_state = "door_locked" - locked = 1 - -/obj/machinery/door/airlock/freezer - name = "Freezer Airlock" - icon = 'icons/obj/doors/Doorfreezer.dmi' - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/hatch - name = "Airtight Hatch" - icon = 'icons/obj/doors/Doorhatchele.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_hatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/maintenance_hatch - name = "Maintenance Hatch" - icon = 'icons/obj/doors/Doorhatchmaint2.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_mhatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/glass_command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcomglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_com - glass = 1 - req_one_access = list(access_heads) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd1o.ogg' - department_close_powered = 'sound/machines/door/cmd1c.ogg' - -/obj/machinery/door/airlock/glass_engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Doorengglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eng - glass = 1 - req_one_access = list(access_engine) - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eat - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsecglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_sec - glass = 1 - req_one_access = list(access_security) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/glass_medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormedglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_med - glass = 1 - req_one_access = list(access_medical) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doormining.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_min - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmo.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearch.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_research - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearchglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_research - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doorminingglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_min - glass = 1 - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/glass_atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/gold - name = "Gold Airlock" - icon = 'icons/obj/doors/Doorgold.dmi' - mineral = "gold" - -/obj/machinery/door/airlock/silver - name = "Silver Airlock" - icon = 'icons/obj/doors/Doorsilver.dmi' - mineral = "silver" - -/obj/machinery/door/airlock/diamond - name = "Diamond Airlock" - icon = 'icons/obj/doors/Doordiamond.dmi' - mineral = "diamond" - -/obj/machinery/door/airlock/uranium - name = "Uranium Airlock" - desc = "And they said I was crazy." - icon = 'icons/obj/doors/Dooruranium.dmi' - mineral = "uranium" - var/last_event = 0 - var/rad_power = 7.5 - -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() - - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - - if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) - . = PROCESS_KILL - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - SSradiation.radiate(src, rad_power) - last_event = world.time - ..() - -/obj/machinery/door/airlock/phoron - name = "Phoron Airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/Doorphoron.dmi' - mineral = "phoron" - -/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) - for(var/turf/simulated/floor/target_tile in range(2,loc)) - target_tile.assume_gas("phoron", 35, 400+T0C) - spawn (0) target_tile.hotspot_expose(temperature, 400) - for(var/turf/simulated/wall/W in range(3,src)) - W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame - for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) - D.ignite(temperature/4) - new/obj/structure/door_assembly( src.loc ) - qdel(src) - -/obj/machinery/door/airlock/sandstone - name = "Sandstone Airlock" - icon = 'icons/obj/doors/Doorsand.dmi' - mineral = "sandstone" - -/obj/machinery/door/airlock/science - name = "Research Airlock" - icon = 'icons/obj/doors/Doorsci.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_science - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_science - name = "Glass Airlocks" - icon = 'icons/obj/doors/Doorsciglass.dmi' - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_science - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/highsecurity - name = "Secure Airlock" - icon = 'icons/obj/doors/hightechsecurity.dmi' - explosion_resistance = 20 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/secure1o.ogg' - close_sound_powered = 'sound/machines/door/secure1c.ogg' - -/obj/machinery/door/airlock/voidcraft - name = "voidcraft hatch" - desc = "It's an extra resilient airlock intended for spacefaring vessels." - icon = 'icons/obj/doors/shuttledoors.dmi' - explosion_resistance = 20 - opacity = 0 - glass = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - -// Airlock opens from top-bottom instead of left-right. -/obj/machinery/door/airlock/voidcraft/vertical - icon = 'icons/obj/doors/shuttledoors_vertical.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - - -/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock - name = "Precursor Alpha Object - Doors" - desc = "This object appears to be used in order to restrict or allow access to \ - rooms based on its physical state. In other words, a door. \ - Despite being designed and created by unknown ancient alien hands, this door has \ - a large number of similarities to the conventional airlock, such as being driven by \ - electricity, opening and closing by physically moving, and being air tight. \ - It also operates by responding to signals through internal electrical conduits. \ - These characteristics make it possible for one with experience with a multitool \ - to manipulate the door.\ -

    \ - The symbol on the door does not match any living species' patterns, giving further \ - implications that this door is very old, and yet it remains operational after \ - thousands of years. It is unknown if that is due to superb construction, or \ - unseen autonomous maintenance having been performed." - value = CATALOGUER_REWARD_EASY - -/obj/machinery/door/airlock/alien - name = "alien airlock" - desc = "You're fairly sure this is a door." - catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) - icon = 'icons/obj/doors/Dooralien.dmi' - explosion_resistance = 20 - secured_wires = TRUE - hackProof = TRUE - assembly_type = /obj/structure/door_assembly/door_assembly_alien - req_one_access = list(access_alien) - -/obj/machinery/door/airlock/alien/locked - icon_state = "door_locked" - locked = TRUE - -/obj/machinery/door/airlock/alien/public // Entry to UFO. - req_one_access = list() - normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. - hackProof = TRUE //VOREStation Edit - No borgos - -/* -About the new airlock wires panel: -* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. -* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) -* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. -* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. -* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. -* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. -* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. -* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) -* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. -* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. -*/ - - - -/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite - if(!issilicon(usr)) - if(src.isElectrified()) - if(!src.justzap) - if(src.shock(user, 100)) - src.justzap = 1 - spawn (10) - src.justzap = 0 - return - else /*if(src.justzap)*/ - return - else if(user.hallucination > 50 && prob(10) && src.operating == 0) - to_chat(user, "You feel a powerful shock course through your body!") - user.halloss += 10 - user.stunned += 10 - return - ..(user) - -/obj/machinery/door/airlock/proc/isElectrified() - if(src.electrified_until != 0) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/canAIControl() - return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/canAIHack() - return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/arePowerSystemsOn() - if (stat & (NOPOWER|BROKEN)) - return 0 - return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) - -/obj/machinery/door/airlock/requiresID() - return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) - -/obj/machinery/door/airlock/proc/isAllPowerLoss() - if(stat & (NOPOWER|BROKEN)) - return 1 - if(mainPowerCablesCut() && backupPowerCablesCut()) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/mainPowerCablesCut() - return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) - -/obj/machinery/door/airlock/proc/backupPowerCablesCut() - return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) - -/obj/machinery/door/airlock/proc/loseMainPower() - main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running - if(backup_power_lost_until == -1 && !backupPowerCablesCut()) - backup_power_lost_until = world.time + SecondsToTicks(10) - - if(main_power_lost_until > 0 || backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/loseBackupPower() - backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - if(backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/regainMainPower() - if(!mainPowerCablesCut()) - main_power_lost_until = 0 - // If backup power is currently active then disable, otherwise let it count down and disable itself later - if(!backup_power_lost_until) - backup_power_lost_until = -1 - - update_icon() - -/obj/machinery/door/airlock/proc/regainBackupPower() - if(!backupPowerCablesCut()) - // Restore backup power only if main power is offline, otherwise permanently disable - backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 - - update_icon() - -/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) - message = text("The electrification wire is cut - Door permanently electrified.") - src.electrified_until = -1 - else if(duration && !arePowerSystemsOn()) - message = text("The door is unpowered - Cannot electrify the door.") - src.electrified_until = 0 - else if(!duration && electrified_until != 0) - message = "The door is now un-electrified." - src.electrified_until = 0 - else if(duration) //electrify door for the given duration seconds - if(usr) - shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") - add_attack_logs(usr,name,"Electrified a door") - else - shockedby += text("\[[time_stamp()]\] - EMP)") - message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." - src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) - - if(electrified_until > 0) - START_MACHINE_PROCESSING(src) - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_IDSCAN)) - message = "The IdScan wire is cut - IdScan feature permanently disabled." - else if(activate && src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 0 - message = "IdScan feature has been enabled." - else if(!activate && !src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 1 - message = "IdScan feature has been disabled." - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) - var/message = "" - // Safeties! We don't need no stinking safeties! - if (wires.is_cut(WIRE_SAFETY)) - message = text("The safety wire is cut - Cannot enable safeties.") - else if (!activate && src.safe) - safe = 0 - else if (activate && !src.safe) - safe = 1 - - if(feedback && message) - to_chat(usr,message) - -// shock user with probability prb (if all connections & power are working) -// returns 1 if shocked, 0 otherwise -// The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/shock(mob/user, prb) - if(!arePowerSystemsOn()) - return 0 - if(hasShocked) - return 0 //Already shocked someone recently? - if(..()) - hasShocked = 1 - sleep(10) - hasShocked = 0 - return 1 - else - return 0 - - -/obj/machinery/door/airlock/update_icon() - cut_overlays() - if(density) - if(locked && lights && src.arePowerSystemsOn()) - icon_state = "door_locked" - else - icon_state = "door_closed" - if(p_open || welded) - if(p_open) - add_overlay("panel_open") - if (!(stat & NOPOWER)) - if(stat & BROKEN) - add_overlay("sparks_broken") - else if (health < maxhealth * 3/4) - add_overlay("sparks_damaged") - if(welded) - add_overlay("welded") - else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) - add_overlay("sparks_damaged") - else - icon_state = "door_open" - if((stat & BROKEN) && !(stat & NOPOWER)) - add_overlay("sparks_open") - return - -/obj/machinery/door/airlock/do_animate(animation) - switch(animation) - if("opening") - cut_overlay() - if(p_open) - spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. - flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking - update_icon() - else - flick("door_opening", src)//[stat ? "_stat":] - update_icon() - if("closing") - cut_overlay() - if(p_open) - spawn(2) - flick("o_door_closing", src) - update_icon() - else - flick("door_closing", src) - update_icon() - if("spark") - if(density) - flick("door_spark", src) - if("deny") - if(density && src.arePowerSystemsOn()) - flick("door_deny", src) - playsound(src, denied_sound, 50, 0, 3) - return - -/obj/machinery/door/airlock/attack_ai(mob/user as mob) - tgui_interact(user) - -/obj/machinery/door/airlock/attack_ghost(mob/user) - tgui_interact(user) - -/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiAirlock", name) - ui.open() - if(custom_state) - ui.set_state(custom_state) - return TRUE - -/obj/machinery/door/airlock/tgui_data(mob/user) - var/list/data = list() - - var/list/power = list() - power["main"] = main_power_lost_until > 0 ? 0 : 2 - power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) - power["backup"] = backup_power_lost_until > 0 ? 0 : 2 - power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) - data["power"] = power - - data["shock"] = (electrified_until == 0) ? 2 : 0 - data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) - data["id_scanner"] = !aiDisabledIdScanner - data["locked"] = locked // bolted - data["lights"] = lights // bolt lights - data["safe"] = safe // safeties - data["speed"] = normalspeed // safe speed - data["welded"] = welded // welded - data["opened"] = !density // opened - - var/list/wire = list() - wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) - wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) - wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) - wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) - wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) - wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) - wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) - wire["safe"] = !wires.is_cut(WIRE_SAFETY) - wire["timing"] = !wires.is_cut(WIRE_SPEED) - - data["wires"] = wire - return data - -/obj/machinery/door/airlock/proc/hack(mob/user as mob) - if(src.aiHacking==0) - src.aiHacking=1 - spawn(20) - //TODO: Make this take a minute - to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") - sleep(50) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") - sleep(20) - to_chat(user, "Attempting to hack into airlock. This may take some time.") - sleep(200) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Upload access confirmed. Loading control program into airlock software.") - sleep(170) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Transfer complete. Forcing airlock to execute program.") - sleep(50) - //disable blocked control - src.aiControlDisabled = 2 - to_chat(user, "Receiving control information from airlock.") - sleep(10) - //bring up airlock dialog - src.aiHacking = 0 - if (user) - src.attack_ai(user) - -/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) - if (src.isElectrified()) - if (istype(mover, /obj/item)) - var/obj/item/i = mover - if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return ..() - -/obj/machinery/door/airlock/attack_hand(mob/user as mob) - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 100)) - return - - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - src.attack_alien(user) - return - - if(src.p_open) - user.set_machine(src) - wires.Interact(user) - else - ..(user) - return - -/obj/machinery/door/airlock/tgui_act(action, params) - if(..()) - return TRUE - if(!user_allowed(usr)) - return TRUE - - switch(action) - if("disrupt-main") - if(!main_power_lost_until) - loseMainPower() - update_icon() - else - to_chat(usr, "Main power is already offline.") - . = TRUE - if("disrupt-backup") - if(!backup_power_lost_until) - loseBackupPower() - update_icon() - else - to_chat(usr, "Backup power is already offline.") - . = TRUE - if("shock-restore") - electrify(0, 1) - . = TRUE - if("shock-temp") - electrify(30, 1) - . = TRUE - if("shock-perm") - electrify(-1, 1) - . = TRUE - if("idscan-toggle") - set_idscan(aiDisabledIdScanner, 1) - . = TRUE - // if("emergency-toggle") - // toggle_emergency(usr) - // . = TRUE - if("bolt-toggle") - toggle_bolt(usr) - . = TRUE - if("light-toggle") - if(wires.is_cut(WIRE_BOLT_LIGHT)) - to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") - return - lights = !lights - update_icon() - . = TRUE - if("safe-toggle") - set_safeties(!safe, 1) - . = TRUE - if("speed-toggle") - if(wires.is_cut(WIRE_SPEED)) - to_chat(usr, "The timing wire is cut - Cannot alter timing.") - return - normalspeed = !normalspeed - . = TRUE - if("open-close") - user_toggle_open(usr) - . = TRUE - - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/user_allowed(mob/user) - var/allowed = (issilicon(user) && canAIControl(user)) - if(!allowed && isobserver(user)) - var/mob/observer/dead/D = user - if(D.can_admin_interact()) - allowed = TRUE - return allowed - -/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_DOOR_BOLTS)) - to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") - return - if(locked) - if(!arePowerSystemsOn()) - to_chat(user, "The door has no power - you can't raise the door bolts.") - else - unlock() - to_chat(user, "The door bolts have been raised.") - // log_combat(user, src, "unbolted") - else - lock() - to_chat(user, "The door bolts have been dropped.") - // log_combat(user, src, "bolted") - -/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) - if(!user_allowed(user)) - return - if(welded) - to_chat(user, text("The airlock has been welded shut!")) - else if(locked) - to_chat(user, text("The door bolts are down!")) - else if(!density) - close() - else - open() - -/obj/machinery/door/airlock/proc/can_remove_electronics() - return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) - -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) - //to_world("airlock attackby src [src] obj [C] mob [user]") - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 75)) - return - if(istype(C, /obj/item/taperoll)) - return - - src.add_fingerprint(user) - if (attempt_vr(src,"attackby_vr",list(C, user))) return - if(istype(C, /mob/living)) - ..() - return - if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) - var/obj/item/weapon/weldingtool/W = C - if(W.remove_fuel(0,user)) - if(!src.welded) - src.welded = 1 - else - src.welded = null - playsound(src, C.usesound, 75, 1) - src.update_icon() - return - else - return - else if(C.is_screwdriver()) - if (src.p_open) - if (stat & BROKEN) - to_chat(usr, "The panel is broken and cannot be closed.") - else - src.p_open = 0 - playsound(src, C.usesound, 50, 1) - else - src.p_open = 1 - playsound(src, C.usesound, 50, 1) - src.update_icon() - else if(C.is_wirecutter()) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/multitool)) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/assembly/signaler)) - return src.attack_hand(user) - else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE - var/obj/item/weapon/pai_cable/cable = C - cable.plugin(src, user) - else if(!repairing && C.is_crowbar()) - if(can_remove_electronics()) - playsound(src, C.usesound, 75, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") - if(do_after(user,40 * C.toolspeed)) - to_chat(user, "You removed the airlock electronics!") - - var/obj/structure/door_assembly/da = new assembly_type(src.loc) - if (istype(da, /obj/structure/door_assembly/multi_tile)) - da.set_dir(src.dir) - - da.anchored = TRUE - if(mineral) - da.glass = mineral - //else if(glass) - else if(glass && !da.glass) - da.glass = 1 - da.state = 1 - da.created_name = src.name - da.update_state() - - if(operating == -1 || (stat & BROKEN)) - new /obj/item/weapon/circuitboard/broken(src.loc) - operating = 0 - else - if (!electronics) create_electronics() - - electronics.loc = src.loc - electronics = null - - qdel(src) - return - else if(arePowerSystemsOn()) - to_chat(user, "The airlock's motors resist your efforts to force it.") - else if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else - if(density) - spawn(0) open(1) - else - spawn(0) close(1) - - // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). - else if(istype(C, /obj/item/weapon)) - var/obj/item/weapon/W = C - if((W.pry == 1) && !arePowerSystemsOn()) - if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else if( !welded && !operating ) - if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. - var/obj/item/weapon/material/twohanded/fireaxe/F = C - if(!F.wielded) - to_chat(user, "You need to be wielding \the [F] to do that.") - return - // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. - if(density) - spawn(0) - open(1) - else - spawn(0) - close(1) - else - ..() - else - ..() - return - -/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) - if(C) - ignite(is_hot(C)) - ..() - -/obj/machinery/door/airlock/set_broken() - src.p_open = 1 - stat |= BROKEN - if (secured_wires) - lock() - for (var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - update_icon() - return - -/obj/machinery/door/airlock/open(var/forced=0) - if(!can_open(forced)) - return 0 - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - - //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator - for(var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. - if(arePowerSystemsOn()) - sound = legacy_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else // Else, play these. - if(arePowerSystemsOn()) - sound = open_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - - if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) - src.closeOther.close() - return ..() - -/obj/machinery/door/airlock/can_open(var/forced=0) - if(!forced) - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - if(locked || welded) - return 0 - return ..() - -/obj/machinery/door/airlock/can_close(var/forced=0) - if(locked || welded) - return 0 - - if(!forced) - //despite the name, this wire is for general door control. - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - return ..() - -/atom/movable/proc/blocks_airlock() - return density - -/obj/machinery/door/blocks_airlock() - return 0 - -/obj/machinery/mech_sensor/blocks_airlock() - return 0 - -/mob/living/blocks_airlock() - return 1 - -/atom/movable/proc/airlock_crush(var/crush_damage) - return 0 - -/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) - . = ..() - health -= crush_damage - healthcheck() - -/obj/effect/energy_field/airlock_crush(var/crush_damage) - adjust_strength(crush_damage) - -/obj/structure/closet/airlock_crush(var/crush_damage) - ..() - damage(crush_damage) - for(var/atom/movable/AM in src) - AM.airlock_crush() - return 1 - -/mob/living/airlock_crush(var/crush_damage) - . = ..() - adjustBruteLoss(crush_damage) - SetStunned(5) - SetWeakened(5) - var/turf/T = get_turf(src) - T.add_blood(src) - return 1 - -/mob/living/carbon/airlock_crush(var/crush_damage) - . = ..() - if(can_feel_pain()) - emote("scream") - -/mob/living/silicon/robot/airlock_crush(var/crush_damage) - adjustBruteLoss(crush_damage) - return 0 - -/obj/machinery/door/airlock/close(var/forced=0) - if(!can_close(forced)) - return 0 - - if(safe) - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.blocks_airlock()) - if(!has_beeped) - playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) - has_beeped = 1 - autoclose_in(6) - return - - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) - take_damage(DOOR_CRUSH_DAMAGE) - - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - has_beeped = 0 - for(var/P in player_list) - var/mob/M = P - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) - if(arePowerSystemsOn()) - sound = legacy_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else - if(arePowerSystemsOn()) - sound = close_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - for(var/turf/turf in locs) - var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) - if(killthis) - killthis.ex_act(2)//Smashin windows - return ..() - -/obj/machinery/door/airlock/proc/lock(var/forced=0) - if(locked) - return 0 - - if (operating && !forced) return 0 - - src.locked = 1 - playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/unlock(var/forced=0) - if(!src.locked) - return - - if (!forced) - if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return - - src.locked = 0 - playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/allowed(mob/M) - if(locked) - return 0 - return ..(M) - -/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) - ..() - - //if assembly is given, create the new door from the assembly - if (assembly && istype(assembly)) - assembly_type = assembly.type - - electronics = assembly.electronics - electronics.loc = src - - //update the door's access to match the electronics' - secured_wires = electronics.secure - if(electronics.one_access) - LAZYCLEARLIST(req_access) - req_one_access = src.electronics.conf_access - else - LAZYCLEARLIST(req_one_access) - req_access = src.electronics.conf_access - - //get the name from the assembly - if(assembly.created_name) - name = assembly.created_name - else - name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" - - //get the dir from the assembly - set_dir(assembly.dir) - - //wires - var/turf/T = get_turf(newloc) - if(T && (T.z in using_map.admin_levels)) - secured_wires = 1 - if (secured_wires) - wires = new/datum/wires/airlock/secure(src) - else - wires = new/datum/wires/airlock(src) - -/obj/machinery/door/airlock/Initialize() - if(src.closeOtherId != null) - for (var/obj/machinery/door/airlock/A in machines) - if(A.closeOtherId == src.closeOtherId && A != src) - src.closeOther = A - break - name = "\improper [name]" - . = ..() - -/obj/machinery/door/airlock/Destroy() - qdel(wires) - wires = null - return ..() - -// Most doors will never be deconstructed over the course of a round, -// so as an optimization defer the creation of electronics until -// the airlock is deconstructed -/obj/machinery/door/airlock/proc/create_electronics() - //create new electronics - if (secured_wires) - src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) - else - src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) - - //update the electronics to match the door's access - if(LAZYLEN(req_access)) - electronics.conf_access = req_access - else if (LAZYLEN(req_one_access)) - electronics.conf_access = req_one_access - electronics.one_access = 1 - -/obj/machinery/door/airlock/emp_act(var/severity) - if(prob(40/severity)) - var/duration = world.time + SecondsToTicks(30 / severity) - if(duration > electrified_until) - electrify(duration) - ..() - -/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason - ..() - if(stat & NOPOWER) - // If we lost power, disable electrification - // Keeping door lights on, runs on internal battery or something. - electrified_until = 0 - update_icon() - -/obj/machinery/door/airlock/proc/prison_open() - if(arePowerSystemsOn()) - src.unlock() - src.open() - src.lock() - return - - -/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - // Old RCD code made it cost 10 units to decon an airlock. - // Now the new one costs ten "sheets". - return list( - RCD_VALUE_MODE = RCD_DECONSTRUCT, - RCD_VALUE_DELAY = 5 SECONDS, - RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 - ) - return FALSE - -/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span("notice", "You deconstruct \the [src].")) - qdel(src) - return TRUE - return FALSE -======= -//VOREStation Edit - Redone a lot of airlock things: -/* -- Specific department maintenance doors -- Named doors properly according to type -- Gave them default access levels with the access constants -- Improper'd all of the names in the new() -*/ - -/obj/machinery/door/airlock - name = "Airlock" - icon = 'icons/obj/doors/Doorint.dmi' - icon_state = "door_closed" - power_channel = ENVIRON - - explosion_resistance = 10 - - // Doors do their own stuff - bullet_vulnerability = 0 - - blocks_emissive = EMISSIVE_BLOCK_GENERIC // Not quite as nice as /tg/'s custom masks. We should make those sometime - - var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. - var/hackProof = 0 // if 1, this door can't be hacked by the AI - var/electrified_until = 0 //World time when the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. - var/main_power_lost_until = 0 //World time when main power is restored. - var/backup_power_lost_until = -1 //World time when backup power is restored. - var/has_beeped = 0 //If 1, will not beep on failed closing attempt. Resets when door closes. - var/spawnPowerRestoreRunning = 0 - var/welded = null - var/locked = 0 - var/lights = 1 // bolt lights show by default - var/aiDisabledIdScanner = 0 - var/aiHacking = 0 - var/obj/machinery/door/airlock/closeOther = null - var/closeOtherId = null - var/lockdownbyai = 0 - autoclose = 1 - var/assembly_type = /obj/structure/door_assembly - var/mineral = null - var/justzap = 0 - var/safe = 1 - normalspeed = 1 - var/obj/item/weapon/airlock_electronics/electronics = null - var/hasShocked = 0 //Prevents multiple shocks from happening - var/secured_wires = 0 - var/datum/wires/airlock/wires = null - - var/open_sound_powered = 'sound/machines/door/covert1o.ogg' - var/open_sound_unpowered = 'sound/machines/door/airlockforced.ogg' - var/close_sound_powered = 'sound/machines/door/covert1c.ogg' - var/legacy_open_powered = 'sound/machines/door/old_airlock.ogg' - var/legacy_close_powered = 'sound/machines/door/old_airlockclose.ogg' - var/department_open_powered = null - var/department_close_powered = null - var/denied_sound = 'sound/machines/deniedbeep.ogg' - var/bolt_up_sound = 'sound/machines/door/boltsup.ogg' - var/bolt_down_sound = 'sound/machines/door/boltsdown.ogg' - -/obj/machinery/door/airlock/attack_generic(var/mob/living/user, var/damage) - if(stat & (BROKEN|NOPOWER)) - if(damage >= STRUCTURE_MIN_DAMAGE_THRESHOLD) - if(src.locked || src.welded) - visible_message("\The [user] begins breaking into \the [src] internals!") - user.set_AI_busy(TRUE) // If the mob doesn't have an AI attached, this won't do anything. - if(do_after(user,10 SECONDS,src)) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - if(prob(25)) - src.shock(user, 100) - user.set_AI_busy(FALSE) - else if(src.density) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/attack_alien(var/mob/user) //Familiar, right? Doors. -Mechoid - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - if(src.locked || src.welded) - visible_message("\The [user] begins tearing into \the [src] internals!") - src.do_animate("deny") - if(do_after(user,15 SECONDS,src)) - visible_message("\The [user] tears \the [src] open, sparks flying from its electronics!") - src.do_animate("spark") - playsound(src, 'sound/machines/door/airlock_tear_apart.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - src.locked = 0 - src.welded = 0 - update_icon() - open(1) - src.set_broken() //These aren't emags, these be CLAWS - else if(src.density) - visible_message("\The [user] begins forcing \the [src] open!") - if(do_after(user, 5 SECONDS,src)) - playsound(src, 'sound/machines/door/airlock_creaking.ogg', 100, 1, volume_channel = VOLUME_CHANNEL_DOORS) - visible_message("\The [user] forces \the [src] open!") - open(1) - else - visible_message("\The [user] forces \the [src] closed!") - close(1) - else - src.do_animate("deny") - visible_message("\The [user] strains fruitlessly to force \the [src] [density ? "open" : "closed"].") - return - ..() - -/obj/machinery/door/airlock/get_material() - if(mineral) - return get_material_by_name(mineral) - return get_material_by_name(MAT_STEEL) - -/obj/machinery/door/airlock/command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcom.dmi' - req_one_access = list(access_heads) - assembly_type = /obj/structure/door_assembly/door_assembly_com - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd3o.ogg' - department_close_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsec.dmi' - req_one_access = list(access_security) - assembly_type = /obj/structure/door_assembly/door_assembly_sec - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Dooreng.dmi' - req_one_access = list(access_engine) - assembly_type = /obj/structure/door_assembly/door_assembly_eng - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmos.dmi' - req_one_access = list(access_atmospherics) - assembly_type = /obj/structure/door_assembly/door_assembly_eat - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormed.dmi' - req_one_access = list(access_medical) - assembly_type = /obj/structure/door_assembly/door_assembly_med - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/maintenance - name = "Maintenance Access" - icon = 'icons/obj/doors/Doormaint.dmi' - //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access - assembly_type = /obj/structure/door_assembly/door_assembly_mai - open_sound_powered = 'sound/machines/door/door2o.ogg' - close_sound_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/cargo - icon = 'icons/obj/doors/Doormaint_cargo.dmi' - req_one_access = list(access_cargo) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/door2o.ogg' - department_close_powered = 'sound/machines/door/door2c.ogg' - -/obj/machinery/door/airlock/maintenance/command - icon = 'icons/obj/doors/Doormaint_command.dmi' - req_one_access = list(access_heads) - -/obj/machinery/door/airlock/maintenance/common - icon = 'icons/obj/doors/Doormaint_common.dmi' - open_sound_powered = 'sound/machines/door/hall3o.ogg' - close_sound_powered = 'sound/machines/door/hall3c.ogg' - -/obj/machinery/door/airlock/maintenance/engi - icon = 'icons/obj/doors/Doormaint_engi.dmi' - req_one_access = list(access_engine) - -/obj/machinery/door/airlock/maintenance/int - icon = 'icons/obj/doors/Doormaint_int.dmi' - -/obj/machinery/door/airlock/maintenance/medical - icon = 'icons/obj/doors/Doormaint_med.dmi' - req_one_access = list(access_medical) - -/obj/machinery/door/airlock/maintenance/rnd - icon = 'icons/obj/doors/Doormaint_rnd.dmi' - req_one_access = list(access_research) - -/obj/machinery/door/airlock/maintenance/sec - icon = 'icons/obj/doors/Doormaint_sec.dmi' - req_one_access = list(access_security) - -/obj/machinery/door/airlock/external - name = "External Airlock" - icon = 'icons/obj/doors/Doorext.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/external/bolted - icon_state = "door_locked" // So it looks visibly bolted in map editor - locked = 1 - -// For convenience in making docking ports: one that is pre-bolted with frequency set! -/obj/machinery/door/airlock/external/bolted/cycling - frequency = 1379 - -/obj/machinery/door/airlock/glass_external - name = "External Airlock" - icon = 'icons/obj/doors/Doorextglass.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_ext - opacity = 0 - glass = 1 - req_one_access = list(access_external_airlocks) - open_sound_powered = 'sound/machines/door/space1o.ogg' - close_sound_powered = 'sound/machines/door/space1c.ogg' - -/obj/machinery/door/airlock/glass - name = "Glass Airlock" - icon = 'icons/obj/doors/Doorglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - open_sound_powered = 'sound/machines/door/hall1o.ogg' - close_sound_powered = 'sound/machines/door/hall1c.ogg' - legacy_open_powered = 'sound/machines/door/windowdoor.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - glass = 1 - -/obj/machinery/door/airlock/centcom - name = "Centcom Airlock" - icon = 'icons/obj/doors/Doorele.dmi' - req_one_access = list(access_cent_general) - opacity = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/glass_centcom - name = "Airlock" - icon = 'icons/obj/doors/Dooreleglass.dmi' - opacity = 0 - glass = 1 - open_sound_powered = 'sound/machines/door/cmd3o.ogg' - close_sound_powered = 'sound/machines/door/cmd3c.ogg' - -/obj/machinery/door/airlock/vault - name = "Vault" - icon = 'icons/obj/doors/vault.dmi' - explosion_resistance = 20 - opacity = 1 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity //Until somebody makes better sprites. - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/vault1o.ogg' - close_sound_powered = 'sound/machines/door/vault1c.ogg' - -/obj/machinery/door/airlock/vault/bolted - icon_state = "door_locked" - locked = 1 - -/obj/machinery/door/airlock/freezer - name = "Freezer Airlock" - icon = 'icons/obj/doors/Doorfreezer.dmi' - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_fre - -/obj/machinery/door/airlock/hatch - name = "Airtight Hatch" - icon = 'icons/obj/doors/Doorhatchele.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_hatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/maintenance_hatch - name = "Maintenance Hatch" - icon = 'icons/obj/doors/Doorhatchmaint2.dmi' - explosion_resistance = 20 - opacity = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_mhatch - req_one_access = list(access_maint_tunnels) - open_sound_powered = 'sound/machines/door/hatchopen.ogg' - close_sound_powered = 'sound/machines/door/hatchclose.ogg' - open_sound_unpowered = 'sound/machines/door/hatchforced.ogg' - -/obj/machinery/door/airlock/glass_command - name = "Command Airlock" - icon = 'icons/obj/doors/Doorcomglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_com - glass = 1 - req_one_access = list(access_heads) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cmd1o.ogg' - department_close_powered = 'sound/machines/door/cmd1c.ogg' - -/obj/machinery/door/airlock/glass_engineering - name = "Engineering Airlock" - icon = 'icons/obj/doors/Doorengglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eng - glass = 1 - req_one_access = list(access_engine) - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_engineeringatmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Doorengatmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_eat - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/glass_security - name = "Security Airlock" - icon = 'icons/obj/doors/Doorsecglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_sec - glass = 1 - req_one_access = list(access_security) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sec1o.ogg' - department_close_powered = 'sound/machines/door/sec1c.ogg' - -/obj/machinery/door/airlock/glass_medical - name = "Medical Airlock" - icon = 'icons/obj/doors/Doormedglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_med - glass = 1 - req_one_access = list(access_medical) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/med1o.ogg' - department_close_powered = 'sound/machines/door/med1c.ogg' - -/obj/machinery/door/airlock/mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doormining.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_min - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmo.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearch.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_research - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_research - name = "Research Airlock" - icon = 'icons/obj/doors/Doorresearchglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_research - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_mining - name = "Mining Airlock" - icon = 'icons/obj/doors/Doorminingglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_min - glass = 1 - req_one_access = list(access_mining) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/cgo1o.ogg' - department_close_powered = 'sound/machines/door/cgo1c.ogg' - -/obj/machinery/door/airlock/glass_atmos - name = "Atmospherics Airlock" - icon = 'icons/obj/doors/Dooratmoglass.dmi' - hitsound = 'sound/effects/Glasshit.ogg' - maxhealth = 300 - explosion_resistance = 5 - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_atmo - glass = 1 - req_one_access = list(access_atmospherics) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/eng1o.ogg' - department_close_powered = 'sound/machines/door/eng1c.ogg' - -/obj/machinery/door/airlock/gold - name = "Gold Airlock" - icon = 'icons/obj/doors/Doorgold.dmi' - mineral = "gold" - -/obj/machinery/door/airlock/silver - name = "Silver Airlock" - icon = 'icons/obj/doors/Doorsilver.dmi' - mineral = "silver" - -/obj/machinery/door/airlock/diamond - name = "Diamond Airlock" - icon = 'icons/obj/doors/Doordiamond.dmi' - mineral = "diamond" - -/obj/machinery/door/airlock/uranium - name = "Uranium Airlock" - desc = "And they said I was crazy." - icon = 'icons/obj/doors/Dooruranium.dmi' - mineral = "uranium" - var/last_event = 0 - var/rad_power = 7.5 - -/obj/machinery/door/airlock/process() - // Deliberate no call to parent. - if(main_power_lost_until > 0 && world.time >= main_power_lost_until) - regainMainPower() - - if(backup_power_lost_until > 0 && world.time >= backup_power_lost_until) - regainBackupPower() - - else if(electrified_until > 0 && world.time >= electrified_until) - electrify(0) - - if (..() == PROCESS_KILL && !(main_power_lost_until > 0 || backup_power_lost_until > 0 || electrified_until > 0)) - . = PROCESS_KILL - -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - SSradiation.radiate(src, rad_power) - last_event = world.time - ..() - -/obj/machinery/door/airlock/phoron - name = "Phoron Airlock" - desc = "No way this can end badly." - icon = 'icons/obj/doors/Doorphoron.dmi' - mineral = "phoron" - -/obj/machinery/door/airlock/phoron/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/ignite(exposed_temperature) - if(exposed_temperature > 300) - PhoronBurn(exposed_temperature) - -/obj/machinery/door/airlock/phoron/proc/PhoronBurn(temperature) - for(var/turf/simulated/floor/target_tile in range(2,loc)) - target_tile.assume_gas("phoron", 35, 400+T0C) - spawn (0) target_tile.hotspot_expose(temperature, 400) - for(var/turf/simulated/wall/W in range(3,src)) - W.burn((temperature/4))//Added so that you can't set off a massive chain reaction with a small flame - for(var/obj/machinery/door/airlock/phoron/D in range(3,src)) - D.ignite(temperature/4) - new/obj/structure/door_assembly( src.loc ) - qdel(src) - -/obj/machinery/door/airlock/sandstone - name = "Sandstone Airlock" - icon = 'icons/obj/doors/Doorsand.dmi' - mineral = "sandstone" - -/obj/machinery/door/airlock/science - name = "Research Airlock" - icon = 'icons/obj/doors/Doorsci.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_science - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/glass_science - name = "Glass Airlocks" - icon = 'icons/obj/doors/Doorsciglass.dmi' - opacity = 0 - assembly_type = /obj/structure/door_assembly/door_assembly_science - glass = 1 - req_one_access = list(access_research) - open_sound_powered = 'sound/machines/door/hall1o.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - close_sound_powered = 'sound/machines/door/hall1c.ogg' // VOREStation Edit: Default door sounds for fancy, department-off. - department_open_powered = 'sound/machines/door/sci1o.ogg' - department_close_powered = 'sound/machines/door/sci1c.ogg' - -/obj/machinery/door/airlock/highsecurity - name = "Secure Airlock" - icon = 'icons/obj/doors/hightechsecurity.dmi' - explosion_resistance = 20 - secured_wires = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity - req_one_access = list(access_heads_vault) - open_sound_powered = 'sound/machines/door/secure1o.ogg' - close_sound_powered = 'sound/machines/door/secure1c.ogg' - -/obj/machinery/door/airlock/voidcraft - name = "voidcraft hatch" - desc = "It's an extra resilient airlock intended for spacefaring vessels." - icon = 'icons/obj/doors/shuttledoors.dmi' - explosion_resistance = 20 - opacity = 0 - glass = 1 - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - -// Airlock opens from top-bottom instead of left-right. -/obj/machinery/door/airlock/voidcraft/vertical - icon = 'icons/obj/doors/shuttledoors_vertical.dmi' - assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft/vertical - open_sound_powered = 'sound/machines/door/shuttle1o.ogg' - close_sound_powered = 'sound/machines/door/shuttle1c.ogg' - - -/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock - name = "Precursor Alpha Object - Doors" - desc = "This object appears to be used in order to restrict or allow access to \ - rooms based on its physical state. In other words, a door. \ - Despite being designed and created by unknown ancient alien hands, this door has \ - a large number of similarities to the conventional airlock, such as being driven by \ - electricity, opening and closing by physically moving, and being air tight. \ - It also operates by responding to signals through internal electrical conduits. \ - These characteristics make it possible for one with experience with a multitool \ - to manipulate the door.\ -

    \ - The symbol on the door does not match any living species' patterns, giving further \ - implications that this door is very old, and yet it remains operational after \ - thousands of years. It is unknown if that is due to superb construction, or \ - unseen autonomous maintenance having been performed." - value = CATALOGUER_REWARD_EASY - -/obj/machinery/door/airlock/alien - name = "alien airlock" - desc = "You're fairly sure this is a door." - catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_airlock) - icon = 'icons/obj/doors/Dooralien.dmi' - explosion_resistance = 20 - secured_wires = TRUE - hackProof = TRUE - assembly_type = /obj/structure/door_assembly/door_assembly_alien - req_one_access = list(access_alien) - -/obj/machinery/door/airlock/alien/locked - icon_state = "door_locked" - locked = TRUE - -/obj/machinery/door/airlock/alien/public // Entry to UFO. - req_one_access = list() - normalspeed = FALSE // So it closes faster and hopefully keeps the warm air inside. - hackProof = TRUE //VOREStation Edit - No borgos - -/* -About the new airlock wires panel: -* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires. -* one wire from the ID scanner. Sending a pulse through this flashes the red light on the door (if the door has power). If you cut this wire, the door will stop recognizing valid IDs. (If the door has 0000 access, it still opens and closes, though) -* two wires for power. Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter). Cutting either one disables the main door power, but unless backup power is also cut, the backup power re-powers the door in 10 seconds. While unpowered, the door may be open, but bolts-raising will not work. Cutting these wires may electrocute the user. -* one wire for door bolts. Sending a pulse through this drops door bolts (whether the door is powered or not) or raises them (if it is). Cutting this wire also drops the door bolts, and mending it does not raise them. If the wire is cut, trying to raise the door bolts will not work. -* two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter). Cutting either one disables the backup door power (allowing it to be crowbarred open, but disabling bolts-raising), but may electocute the user. -* one wire for opening the door. Sending a pulse through this while the door has power makes it open the door if no access is required. -* one wire for AI control. Sending a pulse through this blocks AI control for a second or so (which is enough to see the AI control light on the panel dialog go off and back on again). Cutting this prevents the AI from controlling the door unless it has hacked the door through the power connection (which takes about a minute). If both main and backup power are cut, as well as this wire, then the AI cannot operate or hack the door at all. -* one wire for electrifying the door. Sending a pulse through this electrifies the door for 30 seconds. Cutting this wire electrifies the door, so that the next person to touch the door without insulated gloves gets electrocuted. (Currently it is also STAYING electrified until someone mends the wire) -* one wire for controling door safetys. When active, door does not close on someone. When cut, door will ruin someone's shit. When pulsed, door will immedately ruin someone's shit. -* one wire for controlling door speed. When active, dor closes at normal rate. When cut, door does not close manually. When pulsed, door attempts to close every tick. -*/ - - - -/obj/machinery/door/airlock/bumpopen(mob/living/user as mob) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite - if(!issilicon(usr)) - if(src.isElectrified()) - if(!src.justzap) - if(src.shock(user, 100)) - src.justzap = 1 - spawn (10) - src.justzap = 0 - return - else /*if(src.justzap)*/ - return - else if(user.hallucination > 50 && prob(10) && src.operating == 0) - to_chat(user, "You feel a powerful shock course through your body!") - user.halloss += 10 - user.stunned += 10 - return - ..(user) - -/obj/machinery/door/airlock/proc/isElectrified() - if(src.electrified_until != 0) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/canAIControl() - return ((src.aiControlDisabled!=1) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/canAIHack() - return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss())); - -/obj/machinery/door/airlock/proc/arePowerSystemsOn() - if (stat & (NOPOWER|BROKEN)) - return 0 - return (src.main_power_lost_until==0 || src.backup_power_lost_until==0) - -/obj/machinery/door/airlock/requiresID() - return !(wires.is_cut(WIRE_IDSCAN) || aiDisabledIdScanner) - -/obj/machinery/door/airlock/proc/isAllPowerLoss() - if(stat & (NOPOWER|BROKEN)) - return 1 - if(mainPowerCablesCut() && backupPowerCablesCut()) - return 1 - return 0 - -/obj/machinery/door/airlock/proc/mainPowerCablesCut() - return wires.is_cut(WIRE_MAIN_POWER1) || wires.is_cut(WIRE_MAIN_POWER2) - -/obj/machinery/door/airlock/proc/backupPowerCablesCut() - return wires.is_cut(WIRE_BACKUP_POWER1) || wires.is_cut(WIRE_BACKUP_POWER2) - -/obj/machinery/door/airlock/proc/loseMainPower() - main_power_lost_until = mainPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - // If backup power is permanently disabled then activate in 10 seconds if possible, otherwise it's already enabled or a timer is already running - if(backup_power_lost_until == -1 && !backupPowerCablesCut()) - backup_power_lost_until = world.time + SecondsToTicks(10) - - if(main_power_lost_until > 0 || backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/loseBackupPower() - backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) - - if(backup_power_lost_until > 0) - START_MACHINE_PROCESSING(src) - - // Disable electricity if required - if(electrified_until && isAllPowerLoss()) - electrify(0) - - update_icon() - -/obj/machinery/door/airlock/proc/regainMainPower() - if(!mainPowerCablesCut()) - main_power_lost_until = 0 - // If backup power is currently active then disable, otherwise let it count down and disable itself later - if(!backup_power_lost_until) - backup_power_lost_until = -1 - - update_icon() - -/obj/machinery/door/airlock/proc/regainBackupPower() - if(!backupPowerCablesCut()) - // Restore backup power only if main power is offline, otherwise permanently disable - backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 - - update_icon() - -/obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_ELECTRIFY) && arePowerSystemsOn()) - message = text("The electrification wire is cut - Door permanently electrified.") - src.electrified_until = -1 - else if(duration && !arePowerSystemsOn()) - message = text("The door is unpowered - Cannot electrify the door.") - src.electrified_until = 0 - else if(!duration && electrified_until != 0) - message = "The door is now un-electrified." - src.electrified_until = 0 - else if(duration) //electrify door for the given duration seconds - if(usr) - shockedby += text("\[[time_stamp()]\] - [usr](ckey:[usr.ckey])") - add_attack_logs(usr,name,"Electrified a door") - else - shockedby += text("\[[time_stamp()]\] - EMP)") - message = "The door is now electrified [duration == -1 ? "permanently" : "for [duration] second\s"]." - src.electrified_until = duration == -1 ? -1 : world.time + SecondsToTicks(duration) - - if(electrified_until > 0) - START_MACHINE_PROCESSING(src) - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_idscan(var/activate, var/feedback = 0) - var/message = "" - if(wires.is_cut(WIRE_IDSCAN)) - message = "The IdScan wire is cut - IdScan feature permanently disabled." - else if(activate && src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 0 - message = "IdScan feature has been enabled." - else if(!activate && !src.aiDisabledIdScanner) - src.aiDisabledIdScanner = 1 - message = "IdScan feature has been disabled." - - if(feedback && message) - to_chat(usr,message) - -/obj/machinery/door/airlock/proc/set_safeties(var/activate, var/feedback = 0) - var/message = "" - // Safeties! We don't need no stinking safeties! - if (wires.is_cut(WIRE_SAFETY)) - message = text("The safety wire is cut - Cannot enable safeties.") - else if (!activate && src.safe) - safe = 0 - else if (activate && !src.safe) - safe = 1 - - if(feedback && message) - to_chat(usr,message) - -// shock user with probability prb (if all connections & power are working) -// returns 1 if shocked, 0 otherwise -// The preceding comment was borrowed from the grille's shock script -/obj/machinery/door/airlock/shock(mob/user, prb) - if(!arePowerSystemsOn()) - return 0 - if(hasShocked) - return 0 //Already shocked someone recently? - if(..()) - hasShocked = 1 - sleep(10) - hasShocked = 0 - return 1 - else - return 0 - - -/obj/machinery/door/airlock/update_icon() - cut_overlays() - if(density) - if(locked && lights && src.arePowerSystemsOn()) - icon_state = "door_locked" - else - icon_state = "door_closed" - if(p_open || welded) - if(p_open) - add_overlay("panel_open") - if (!(stat & NOPOWER)) - if(stat & BROKEN) - add_overlay("sparks_broken") - else if (health < maxhealth * 3/4) - add_overlay("sparks_damaged") - if(welded) - add_overlay("welded") - else if (health < maxhealth * 3/4 && !(stat & NOPOWER)) - add_overlay("sparks_damaged") - else - icon_state = "door_open" - if((stat & BROKEN) && !(stat & NOPOWER)) - add_overlay("sparks_open") - return - -/obj/machinery/door/airlock/do_animate(animation) - switch(animation) - if("opening") - cut_overlay() - if(p_open) - spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond. - flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking - update_icon() - else - flick("door_opening", src)//[stat ? "_stat":] - update_icon() - if("closing") - cut_overlay() - if(p_open) - spawn(2) - flick("o_door_closing", src) - update_icon() - else - flick("door_closing", src) - update_icon() - if("spark") - if(density) - flick("door_spark", src) - if("deny") - if(density && src.arePowerSystemsOn()) - flick("door_deny", src) - playsound(src, denied_sound, 50, 0, 3) - return - -/obj/machinery/door/airlock/attack_ai(mob/user as mob) - tgui_interact(user) - -/obj/machinery/door/airlock/attack_ghost(mob/user) - tgui_interact(user) - -/obj/machinery/door/airlock/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui, datum/tgui_state/custom_state) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AiAirlock", name) - ui.open() - if(custom_state) - ui.set_state(custom_state) - return TRUE - -/obj/machinery/door/airlock/tgui_data(mob/user) - var/list/data = list() - - var/list/power = list() - power["main"] = main_power_lost_until > 0 ? 0 : 2 - power["main_timeleft"] = round(main_power_lost_until > 0 ? max(main_power_lost_until - world.time, 0) / 10 : main_power_lost_until, 1) - power["backup"] = backup_power_lost_until > 0 ? 0 : 2 - power["backup_timeleft"] = round(backup_power_lost_until > 0 ? max(backup_power_lost_until - world.time, 0) / 10 : backup_power_lost_until, 1) - data["power"] = power - - data["shock"] = (electrified_until == 0) ? 2 : 0 - data["shock_timeleft"] = round(electrified_until > 0 ? max(electrified_until - world.time, 0) / 10 : electrified_until, 1) - data["id_scanner"] = !aiDisabledIdScanner - data["locked"] = locked // bolted - data["lights"] = lights // bolt lights - data["safe"] = safe // safeties - data["speed"] = normalspeed // safe speed - data["welded"] = welded // welded - data["opened"] = !density // opened - - var/list/wire = list() - wire["main_1"] = !wires.is_cut(WIRE_MAIN_POWER1) - wire["main_2"] = !wires.is_cut(WIRE_MAIN_POWER2) - wire["backup_1"] = !wires.is_cut(WIRE_BACKUP_POWER1) - wire["backup_2"] = !wires.is_cut(WIRE_BACKUP_POWER2) - wire["shock"] = !wires.is_cut(WIRE_ELECTRIFY) - wire["id_scanner"] = !wires.is_cut(WIRE_IDSCAN) - wire["bolts"] = !wires.is_cut(WIRE_DOOR_BOLTS) - wire["lights"] = !wires.is_cut(WIRE_BOLT_LIGHT) - wire["safe"] = !wires.is_cut(WIRE_SAFETY) - wire["timing"] = !wires.is_cut(WIRE_SPEED) - - data["wires"] = wire - return data - -/obj/machinery/door/airlock/proc/hack(mob/user as mob) - if(src.aiHacking==0) - src.aiHacking=1 - spawn(20) - //TODO: Make this take a minute - to_chat(user, "Airlock AI control has been blocked. Beginning fault-detection.") - sleep(50) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Fault confirmed: airlock control wire disabled or cut.") - sleep(20) - to_chat(user, "Attempting to hack into airlock. This may take some time.") - sleep(200) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Upload access confirmed. Loading control program into airlock software.") - sleep(170) - if(src.canAIControl()) - to_chat(user, "Alert cancelled. Airlock control has been restored without our assistance.") - src.aiHacking=0 - return - else if(!src.canAIHack(user)) - to_chat(user, "We've lost our connection! Unable to hack airlock.") - src.aiHacking=0 - return - to_chat(user, "Transfer complete. Forcing airlock to execute program.") - sleep(50) - //disable blocked control - src.aiControlDisabled = 2 - to_chat(user, "Receiving control information from airlock.") - sleep(10) - //bring up airlock dialog - src.aiHacking = 0 - if (user) - src.attack_ai(user) - -/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target) - if (src.isElectrified()) - if (istype(mover, /obj/item)) - var/obj/item/i = mover - if (i.matter && (MAT_STEEL in i.matter) && i.matter[MAT_STEEL] > 0) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - return ..() - -/obj/machinery/door/airlock/attack_hand(mob/user as mob) - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 100)) - return - - if(istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/X = user - if(istype(X.species, /datum/species/xenos)) - src.attack_alien(user) - return - - if(src.p_open) - user.set_machine(src) - wires.Interact(user) - else - ..(user) - return - -/obj/machinery/door/airlock/tgui_act(action, params) - if(..()) - return TRUE - if(!user_allowed(usr)) - return TRUE - - switch(action) - if("disrupt-main") - if(!main_power_lost_until) - loseMainPower() - update_icon() - else - to_chat(usr, "Main power is already offline.") - . = TRUE - if("disrupt-backup") - if(!backup_power_lost_until) - loseBackupPower() - update_icon() - else - to_chat(usr, "Backup power is already offline.") - . = TRUE - if("shock-restore") - electrify(0, 1) - . = TRUE - if("shock-temp") - electrify(30, 1) - . = TRUE - if("shock-perm") - electrify(-1, 1) - . = TRUE - if("idscan-toggle") - set_idscan(aiDisabledIdScanner, 1) - . = TRUE - // if("emergency-toggle") - // toggle_emergency(usr) - // . = TRUE - if("bolt-toggle") - toggle_bolt(usr) - . = TRUE - if("light-toggle") - if(wires.is_cut(WIRE_BOLT_LIGHT)) - to_chat(usr, "The bolt lights wire is cut - The door bolt lights are permanently disabled.") - return - lights = !lights - update_icon() - . = TRUE - if("safe-toggle") - set_safeties(!safe, 1) - . = TRUE - if("speed-toggle") - if(wires.is_cut(WIRE_SPEED)) - to_chat(usr, "The timing wire is cut - Cannot alter timing.") - return - normalspeed = !normalspeed - . = TRUE - if("open-close") - user_toggle_open(usr) - . = TRUE - - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/user_allowed(mob/user) - var/allowed = (issilicon(user) && canAIControl(user)) - if(!allowed && isobserver(user)) - var/mob/observer/dead/D = user - if(D.can_admin_interact()) - allowed = TRUE - return allowed - -/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_DOOR_BOLTS)) - to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") - return - if(locked) - if(!arePowerSystemsOn()) - to_chat(user, "The door has no power - you can't raise the door bolts.") - else - unlock() - to_chat(user, "The door bolts have been raised.") - // log_combat(user, src, "unbolted") - else - lock() - to_chat(user, "The door bolts have been dropped.") - // log_combat(user, src, "bolted") - -/obj/machinery/door/airlock/proc/user_toggle_open(mob/user) - if(!user_allowed(user)) - return - if(welded) - to_chat(user, text("The airlock has been welded shut!")) - else if(locked) - to_chat(user, text("The door bolts are down!")) - else if(!density) - close() - else - open() - -/obj/machinery/door/airlock/proc/can_remove_electronics() - return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) - -/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob) - //to_world("airlock attackby src [src] obj [C] mob [user]") - if(!istype(usr, /mob/living/silicon)) - if(src.isElectrified()) - if(src.shock(user, 75)) - return - if(istype(C, /obj/item/taperoll)) - return - - src.add_fingerprint(user) - if (attempt_vr(src,"attackby_vr",list(C, user))) return - if(istype(C, /mob/living)) - ..() - return - if(!repairing && istype(C, /obj/item/weapon/weldingtool) && !( src.operating > 0 ) && src.density) - var/obj/item/weapon/weldingtool/W = C - if(W.remove_fuel(0,user)) - if(!src.welded) - src.welded = 1 - else - src.welded = null - playsound(src, C.usesound, 75, 1) - src.update_icon() - return - else - return - else if(C.is_screwdriver()) - if (src.p_open) - if (stat & BROKEN) - to_chat(usr, "The panel is broken and cannot be closed.") - else - src.p_open = 0 - playsound(src, C.usesound, 50, 1) - else - src.p_open = 1 - playsound(src, C.usesound, 50, 1) - src.update_icon() - else if(C.is_wirecutter()) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/multitool)) - return src.attack_hand(user) - else if(istype(C, /obj/item/device/assembly/signaler)) - return src.attack_hand(user) - else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE - var/obj/item/weapon/pai_cable/cable = C - cable.plugin(src, user) - else if(!repairing && C.is_crowbar()) - if(can_remove_electronics()) - playsound(src, C.usesound, 75, 1) - user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") - if(do_after(user,40 * C.toolspeed)) - to_chat(user, "You removed the airlock electronics!") - - var/obj/structure/door_assembly/da = new assembly_type(src.loc) - if (istype(da, /obj/structure/door_assembly/multi_tile)) - da.set_dir(src.dir) - - da.anchored = TRUE - if(mineral) - da.glass = mineral - //else if(glass) - else if(glass && !da.glass) - da.glass = 1 - da.state = 1 - da.created_name = src.name - da.update_state() - - if(operating == -1 || (stat & BROKEN)) - new /obj/item/weapon/circuitboard/broken(src.loc) - operating = 0 - else - if (!electronics) create_electronics() - - electronics.loc = src.loc - electronics = null - - qdel(src) - return - else if(arePowerSystemsOn()) - to_chat(user, "The airlock's motors resist your efforts to force it.") - else if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else - if(density) - spawn(0) open(1) - else - spawn(0) close(1) - - // Check if we're using a crowbar or armblade, and if the airlock's unpowered for whatever reason (off, broken, etc). - else if(istype(C, /obj/item/weapon)) - var/obj/item/weapon/W = C - if((W.pry == 1) && !arePowerSystemsOn()) - if(locked) - to_chat(user, "The airlock's bolts prevent it from being forced.") - else if( !welded && !operating ) - if(istype(C, /obj/item/weapon/material/twohanded/fireaxe)) // If this is a fireaxe, make sure it's held in two hands. - var/obj/item/weapon/material/twohanded/fireaxe/F = C - if(!F.wielded) - to_chat(user, "You need to be wielding \the [F] to do that.") - return - // At this point, it's an armblade or a fireaxe that passed the wielded test, let's try to open it. - if(density) - spawn(0) - open(1) - else - spawn(0) - close(1) - else - ..() - else - ..() - return - -/obj/machinery/door/airlock/phoron/attackby(C as obj, mob/user as mob) - if(C) - ignite(is_hot(C)) - ..() - -/obj/machinery/door/airlock/set_broken() - src.p_open = 1 - stat |= BROKEN - if (secured_wires) - lock() - for (var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("[src.name]'s control panel bursts open, sparks spewing out!") - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - - update_icon() - return - -/obj/machinery/door/airlock/open(var/forced=0) - if(!can_open(forced)) - return 0 - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - - //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator - for(var/mob/M as anything in player_list) - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) // Do we have old sounds enabled? Play these even if we have department door sounds enabled. - if(arePowerSystemsOn()) - sound = legacy_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_open_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_open_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else // Else, play these. - if(arePowerSystemsOn()) - sound = open_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - - if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) - src.closeOther.close() - return ..() - -/obj/machinery/door/airlock/can_open(var/forced=0) - if(!forced) - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - if(locked || welded) - return 0 - return ..() - -/obj/machinery/door/airlock/can_close(var/forced=0) - if(locked || welded) - return 0 - - if(!forced) - //despite the name, this wire is for general door control. - if(!arePowerSystemsOn() || wires.is_cut(WIRE_OPEN_DOOR)) - return 0 - - return ..() - -/atom/movable/proc/blocks_airlock() - return density - -/obj/machinery/door/blocks_airlock() - return 0 - -/obj/machinery/mech_sensor/blocks_airlock() - return 0 - -/mob/living/blocks_airlock() - return 1 - -/atom/movable/proc/airlock_crush(var/crush_damage) - return 0 - -/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) - . = ..() - health -= crush_damage - healthcheck() - -/obj/effect/energy_field/airlock_crush(var/crush_damage) - adjust_strength(crush_damage) - -/obj/structure/closet/airlock_crush(var/crush_damage) - ..() - damage(crush_damage) - for(var/atom/movable/AM in src) - AM.airlock_crush() - return 1 - -/mob/living/airlock_crush(var/crush_damage) - . = ..() - adjustBruteLoss(crush_damage) - SetStunned(5) - SetWeakened(5) - var/turf/T = get_turf(src) - T.add_blood(src) - return 1 - -/mob/living/carbon/airlock_crush(var/crush_damage) - . = ..() - if(can_feel_pain()) - emote("scream") - -/mob/living/silicon/robot/airlock_crush(var/crush_damage) - adjustBruteLoss(crush_damage) - return 0 - -/obj/machinery/door/airlock/close(var/forced=0) - if(!can_close(forced)) - return 0 - - if(safe) - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.blocks_airlock()) - if(!has_beeped) - playsound(src, 'sound/machines/buzz-two.ogg', 50, 0) - has_beeped = 1 - autoclose_in(6) - return - - for(var/turf/turf in locs) - for(var/atom/movable/AM in turf) - if(AM.airlock_crush(DOOR_CRUSH_DAMAGE)) - take_damage(DOOR_CRUSH_DAMAGE) - - use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - has_beeped = 0 - for(var/mob/M as anything in player_list) - if(!M || !M.client) - continue - var/old_sounds = M.client.is_preference_enabled(/datum/client_preference/old_door_sounds) - var/department_door_sounds = M.client.is_preference_enabled(/datum/client_preference/department_door_sounds) - var/sound - var/volume - if(old_sounds) - if(arePowerSystemsOn()) - sound = legacy_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else if(!old_sounds && department_door_sounds && src.department_close_powered) // Else, we have old sounds disabled, the door has per-department door sounds, and we have chosen to play department door sounds, use these. - if(arePowerSystemsOn()) - sound = department_close_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - else - if(arePowerSystemsOn()) - sound = close_sound_powered - volume = 50 - else - sound = open_sound_unpowered - volume = 75 - - var/turf/T = get_turf(M) - var/distance = get_dist(T, get_turf(src)) - if(distance <= world.view * 2) - if(T && T.z == get_z(src)) - M.playsound_local(get_turf(src), sound, volume, 1, null, 0, TRUE, sound(sound), volume_channel = VOLUME_CHANNEL_DOORS) - for(var/turf/turf in locs) - var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) - if(killthis) - killthis.ex_act(2)//Smashin windows - return ..() - -/obj/machinery/door/airlock/proc/lock(var/forced=0) - if(locked) - return 0 - - if (operating && !forced) return 0 - - src.locked = 1 - playsound(src, bolt_down_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/proc/unlock(var/forced=0) - if(!src.locked) - return - - if (!forced) - if(operating || !src.arePowerSystemsOn() || wires.is_cut(WIRE_DOOR_BOLTS)) return - - src.locked = 0 - playsound(src, bolt_up_sound, 30, 0, 3, volume_channel = VOLUME_CHANNEL_DOORS) - for(var/mob/M in range(1,src)) - M.show_message("You hear a click from the bottom of the door.", 2) - update_icon() - return 1 - -/obj/machinery/door/airlock/allowed(mob/M) - if(locked) - return 0 - return ..(M) - -/obj/machinery/door/airlock/New(var/newloc, var/obj/structure/door_assembly/assembly=null) - ..() - - //if assembly is given, create the new door from the assembly - if (assembly && istype(assembly)) - assembly_type = assembly.type - - electronics = assembly.electronics - electronics.loc = src - - //update the door's access to match the electronics' - secured_wires = electronics.secure - if(electronics.one_access) - LAZYCLEARLIST(req_access) - req_one_access = src.electronics.conf_access - else - LAZYCLEARLIST(req_one_access) - req_access = src.electronics.conf_access - - //get the name from the assembly - if(assembly.created_name) - name = assembly.created_name - else - name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" - - //get the dir from the assembly - set_dir(assembly.dir) - - //wires - var/turf/T = get_turf(newloc) - if(T && (T.z in using_map.admin_levels)) - secured_wires = 1 - if (secured_wires) - wires = new/datum/wires/airlock/secure(src) - else - wires = new/datum/wires/airlock(src) - -/obj/machinery/door/airlock/Initialize() - if(src.closeOtherId != null) - for (var/obj/machinery/door/airlock/A in machines) - if(A.closeOtherId == src.closeOtherId && A != src) - src.closeOther = A - break - name = "\improper [name]" - . = ..() - -/obj/machinery/door/airlock/Destroy() - qdel(wires) - wires = null - return ..() - -// Most doors will never be deconstructed over the course of a round, -// so as an optimization defer the creation of electronics until -// the airlock is deconstructed -/obj/machinery/door/airlock/proc/create_electronics() - //create new electronics - if (secured_wires) - src.electronics = new/obj/item/weapon/airlock_electronics/secure( src.loc ) - else - src.electronics = new/obj/item/weapon/airlock_electronics( src.loc ) - - //update the electronics to match the door's access - if(LAZYLEN(req_access)) - electronics.conf_access = req_access - else if (LAZYLEN(req_one_access)) - electronics.conf_access = req_one_access - electronics.one_access = 1 - -/obj/machinery/door/airlock/emp_act(var/severity) - if(prob(40/severity)) - var/duration = world.time + SecondsToTicks(30 / severity) - if(duration > electrified_until) - electrify(duration) - ..() - -/obj/machinery/door/airlock/power_change() //putting this is obj/machinery/door itself makes non-airlock doors turn invisible for some reason - ..() - if(stat & NOPOWER) - // If we lost power, disable electrification - // Keeping door lights on, runs on internal battery or something. - electrified_until = 0 - update_icon() - -/obj/machinery/door/airlock/proc/prison_open() - if(arePowerSystemsOn()) - src.unlock() - src.open() - src.lock() - return - - -/obj/machinery/door/airlock/rcd_values(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - // Old RCD code made it cost 10 units to decon an airlock. - // Now the new one costs ten "sheets". - return list( - RCD_VALUE_MODE = RCD_DECONSTRUCT, - RCD_VALUE_DELAY = 5 SECONDS, - RCD_VALUE_COST = RCD_SHEETS_PER_MATTER_UNIT * 10 - ) - return FALSE - -/obj/machinery/door/airlock/rcd_act(mob/living/user, obj/item/weapon/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span("notice", "You deconstruct \the [src].")) - qdel(src) - return TRUE - return FALSE ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt From fa6ec29be61e65c515b543c2791f2d7a572f05f3 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:14:45 -0400 Subject: [PATCH 77/86] powder that makes you say yes --- code/game/machinery/doors/airlock.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index aa7795e7e7..c3d8e4ed0f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD //VOREStation Edit - Redone a lot of airlock things: /* - Specific department maintenance doors From 1902d10543ab60ed56ecc66dbbf0118e9f978fe9 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:16:01 -0400 Subject: [PATCH 78/86] powder that makes you say yes --- code/game/machinery/pointdefense.dm | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 6d4cc34768..4413917d3a 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -25,15 +25,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) . = ..() if(id_tag) //No more than 1 controller please. -<<<<<<< HEAD - for(var/thing in GLOB.pointdefense_controllers) - var/obj/machinery/pointdefense_control/PC = thing -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt - for(var/thing in pointdefense_controllers) - var/obj/machinery/pointdefense_control/PC = thing -======= for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers) ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt if(PC != src && PC.id_tag == id_tag) warning("Two [src] with the same id_tag of [id_tag]") id_tag = null @@ -108,15 +100,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state)) // Check for duplicate controllers with this ID -<<<<<<< HEAD - for(var/thing in GLOB.pointdefense_controllers) - var/obj/machinery/pointdefense_control/PC = thing -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt - for(var/thing in pointdefense_controllers) - var/obj/machinery/pointdefense_control/PC = thing -======= for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers) ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt if(PC != src && PC.id_tag == id_tag) to_chat(user, "The [new_ident] network already has a controller.") return @@ -222,15 +206,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) if(!id_tag) return null var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) -<<<<<<< HEAD - for(var/thing in GLOB.pointdefense_controllers) - var/obj/machinery/pointdefense_control/PDC = thing -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt - for(var/thing in pointdefense_controllers) - var/obj/machinery/pointdefense_control/PDC = thing -======= for(var/obj/machinery/pointdefense_control/PDC as anything in pointdefense_controllers) ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels)) return PDC From 8c992ce355925d1dffaeccc350dd95d821bcc407 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:19:25 -0400 Subject: [PATCH 79/86] powder that makes you say yes --- code/modules/mob/mob.dm | 2480 +-------------------------------------- 1 file changed, 4 insertions(+), 2476 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3b52e76055..be223341b8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game. mob_list -= src dead_mob_list -= src @@ -115,16 +114,13 @@ runemessage = -1 // Symmetry with mob/audible_message, despite the fact this one doesn't call parent. Maybe it should! if(radio_message) - for(var/obj in hearing_objs) - var/obj/O = obj + for(var/obj/O as anything in hearing_objs) O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) else - for(var/obj in hearing_objs) - var/obj/O = obj + for(var/obj/O as anything in hearing_objs) O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) - for(var/mob in hearing_mobs) - var/mob/M = mob + for(var/mob/M as anything in hearing_mobs) var/msg = message if(self_message && M==src) msg = self_message @@ -653,8 +649,7 @@ if(length(GLOB.sdql2_queries)) if(statpanel("SDQL2")) stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) - for(var/i in GLOB.sdql2_queries) - var/datum/SDQL2_query/Q = i + for(var/datum/SDQL2_query/Q as anything in GLOB.sdql2_queries) Q.generate_stat() if(listed_turf && client) @@ -1233,2470 +1228,3 @@ GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list) /mob/proc/grab_ghost(force) if(mind) return mind.grab_ghost(force = force) -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt -/mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game. - mob_list -= src - dead_mob_list -= src - living_mob_list -= src - unset_machine() - qdel(hud_used) - clear_fullscreen() - if(client) - for(var/obj/screen/movable/spell_master/spell_master in spell_masters) - qdel(spell_master) - remove_screen_obj_references() - client.screen = list() - if(mind && mind.current == src) - spellremove(src) - ghostize() - QDEL_NULL(plane_holder) - ..() - return QDEL_HINT_HARDDEL_NOW - -/mob/proc/remove_screen_obj_references() - hands = null - pullin = null - purged = null - internals = null - i_select = null - m_select = null - healths = null - throw_icon = null - pain = null - item_use_icon = null - gun_move_icon = null - gun_setting_icon = null - spell_masters = null - zone_sel = null - -/mob/Initialize() - mob_list += src - if(stat == DEAD) - dead_mob_list += src - else - living_mob_list += src - lastarea = get_area(src) - set_focus(src) // VOREStation Add - Key Handling - hook_vr("mob_new",list(src)) //VOREStation Code - update_transform() // Some mobs may start bigger or smaller than normal. - return ..() - -/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) - - if(!client && !teleop) return - - if (type) - if((type & VISIBLE_MESSAGE) && (is_blind() || paralysis) )//Vision related - if (!( alt )) - return - else - msg = alt - type = alt_type - if ((type & AUDIBLE_MESSAGE) && is_deaf())//Hearing related - if (!( alt )) - return - else - msg = alt - type = alt_type - if ((type & VISIBLE_MESSAGE) && (sdisabilities & BLIND)) - return - // Added voice muffling for Issue 41. - if(stat == UNCONSCIOUS || sleeping > 0) - to_chat(src, "... You can almost hear someone talking ...") - else - to_chat(src,msg) - if(teleop) - to_chat(teleop, create_text_tag("body", "BODY:", teleop) + "[msg]") - return - -// Show a message to all mobs and objects in sight of this one -// This would be for visible actions by the src mob -// message is the message output to anyone who can see e.g. "[src] does something!" -// self_message (optional) is what the src mob sees e.g. "You do something!" -// blind_message (optional) is what blind people will hear e.g. "You hear something!" -/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null, var/range = world.view, var/runemessage) - if(self_message) - if(LAZYLEN(exclude_mobs)) - exclude_mobs |= src - else - exclude_mobs = list(src) - src.show_message(self_message, 1, blind_message, 2) - if(isnull(runemessage)) - runemessage = -1 - . = ..(message, blind_message, exclude_mobs, range, runemessage) // Really not ideal that atom/visible_message has different arg numbering :( - -// Returns an amount of power drawn from the object (-1 if it's not viable). -// If drain_check is set it will not actually drain power, just return a value. -// If surge is set, it will destroy/damage the recipient and not return any power. -// Not sure where to define this, so it can sit here for the rest of time. -/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) - return -1 - -// Show a message to all mobs and objects in earshot of this one -// This would be for audible actions by the src mob -// message is the message output to anyone who can hear. -// self_message (optional) is what the src mob hears. -// deaf_message (optional) is what deaf people will see. -// hearing_distance (optional) is the range, how many tiles away the message can be heard. -/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message, var/radio_message, var/runemessage) - - var/range = hearing_distance || world.view - var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE) - - var/list/hearing_mobs = hear["mobs"] - var/list/hearing_objs = hear["objs"] - - if(isnull(runemessage)) - runemessage = -1 // Symmetry with mob/audible_message, despite the fact this one doesn't call parent. Maybe it should! - - if(radio_message) - for(var/obj in hearing_objs) - var/obj/O = obj - O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) - else - for(var/obj in hearing_objs) - var/obj/O = obj - O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) - - for(var/mob in hearing_mobs) - var/mob/M = mob - var/msg = message - if(self_message && M==src) - msg = self_message - M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) - if(runemessage != -1) - M.create_chat_message(src, "[runemessage || message]", FALSE, list("emote"), audible = FALSE) - -/mob/proc/findname(msg) - for(var/mob/M in mob_list) - if (M.real_name == text("[]", msg)) - return M - return 0 - -/mob/proc/Life() -// if(organStructure) -// organStructure.ProcessOrgans() - return - -#define UNBUCKLED 0 -#define PARTIALLY_BUCKLED 1 -#define FULLY_BUCKLED 2 -/mob/proc/buckled() - // Preliminary work for a future buckle rewrite, - // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting) - if(!buckled) - return UNBUCKLED - return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED - -/mob/proc/is_blind() - return ((sdisabilities & BLIND) || blinded || incapacitated(INCAPACITATION_KNOCKOUT)) - -/mob/proc/is_deaf() - return ((sdisabilities & DEAF) || ear_deaf || incapacitated(INCAPACITATION_KNOCKOUT)) - -/mob/proc/is_physically_disabled() - return incapacitated(INCAPACITATION_DISABLED) - -/mob/proc/cannot_stand() - return incapacitated(INCAPACITATION_KNOCKDOWN) - -/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT) - if ((incapacitation_flags & INCAPACITATION_STUNNED) && stunned) - return 1 - - if ((incapacitation_flags & INCAPACITATION_FORCELYING) && (weakened || resting)) - return 1 - - if ((incapacitation_flags & INCAPACITATION_KNOCKOUT) && (stat || paralysis || sleeping || (status_flags & FAKEDEATH))) - return 1 - - if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained()) - return 1 - - if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY))) - var/buckling = buckled() - if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY)) - return 1 - if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY)) - return 1 - - return 0 - -#undef UNBUCKLED -#undef PARTIALLY_BUCKLED -#undef FULLY_BUCKLED - -/mob/proc/restrained() - return - -/mob/proc/reset_view(atom/A) - if (client) - if (istype(A, /atom/movable)) - client.perspective = EYE_PERSPECTIVE - client.eye = A - else - if (isturf(loc)) - client.eye = client.mob - client.perspective = MOB_PERSPECTIVE - else - client.perspective = EYE_PERSPECTIVE - client.eye = loc - return TRUE - -/mob/verb/pointed(atom/A as mob|obj|turf in view()) - set name = "Point To" - set category = "Object" - - if(!src || !isturf(src.loc) || !(A in view(src.loc))) - return 0 - if(istype(A, /obj/effect/decal/point)) - return 0 - - var/turf/tile = get_turf(A) - if (!tile) - return 0 - - var/turf/our_tile = get_turf(src) - var/obj/visual = new /obj/effect/decal/point(our_tile) - visual.invisibility = invisibility - visual.plane = ABOVE_PLANE - visual.layer = FLY_LAYER - - animate(visual, - pixel_x = (tile.x - our_tile.x) * world.icon_size + A.pixel_x, - pixel_y = (tile.y - our_tile.y) * world.icon_size + A.pixel_y, - time = 1.7, - easing = EASE_OUT) - - QDEL_IN(visual, 2 SECONDS) //Better qdel - - face_atom(A) - return 1 - - -/mob/proc/ret_grab(list/L, flag) - return - -/mob/verb/mode() - set name = "Activate Held Object" - set category = "Object" - set src = usr - - return - -/* -/mob/verb/dump_source() - - var/master = "
    "
    -	for(var/t in typesof(/area))
    -		master += text("[]\n", t)
    -		//Foreach goto(26)
    -	src << browse(master)
    -	return
    -*/
    -
    -/mob/verb/memory()
    -	set name = "Notes"
    -	set category = "IC"
    -	if(mind)
    -		mind.show_memory(src)
    -	else
    -		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    -
    -/mob/verb/add_memory(msg as message)
    -	set name = "Add Note"
    -	set category = "IC"
    -
    -	msg = sanitize(msg)
    -
    -	if(mind)
    -		mind.store_memory(msg)
    -	else
    -		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    -
    -/mob/proc/store_memory(msg as message, popup, sane = 1)
    -	msg = copytext(msg, 1, MAX_MESSAGE_LEN)
    -
    -	if (sane)
    -		msg = sanitize(msg)
    -
    -	if (length(memory) == 0)
    -		memory += msg
    -	else
    -		memory += "
    [msg]" - - if (popup) - memory() - -/mob/proc/update_flavor_text() - set src in usr - if(usr != src) - to_chat(usr, "No.") - var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes - - if(msg != null) - flavor_text = msg - -/mob/proc/warn_flavor_changed() - if(flavor_text && flavor_text != "") // don't spam people that don't use it! - to_chat(src, "

    OOC Warning:

    ") - to_chat(src, "Your flavor text is likely out of date! Change") - -/mob/proc/print_flavor_text() - if (flavor_text && flavor_text != "") - var/msg = replacetext(flavor_text, "\n", " ") - if(length(msg) <= 40) - return "[msg]" - else - return "[copytext_preserve_html(msg, 1, 37)]... More..." - -/* -/mob/verb/help() - set name = "Help" - src << browse('html/help.html', "window=help") - return -*/ - -/mob/proc/set_respawn_timer(var/time) - // Try to figure out what time to use - - // Special cases, can never respawn - if(ticker?.mode?.deny_respawn) - time = -1 - else if(!config.abandon_allowed) - time = -1 - else if(!config.respawn) - time = -1 - - // Special case for observing before game start - else if(ticker?.current_state <= GAME_STATE_SETTING_UP) - time = 1 MINUTE - - // Wasn't given a time, use the config time - else if(!time) - time = config.respawn_time - - var/keytouse = ckey - // Try harder to find a key to use - if(!keytouse && key) - keytouse = ckey(key) - else if(!keytouse && mind?.key) - keytouse = ckey(mind.key) - - GLOB.respawn_timers[keytouse] = world.time + time - -/mob/observer/dead/set_respawn_timer() - if(config.antag_hud_restricted && has_enabled_antagHUD) - ..(-1) - else - return // Don't set it, no need - -/mob/verb/abandon_mob() - set name = "Return to Menu" - set category = "OOC" - - if(stat != DEAD || !ticker) - to_chat(usr, "You must be dead to use this!") - return - - // Final chance to abort "respawning" - if(mind && timeofdeath) // They had spawned before - var/choice = tgui_alert(usr, "Returning to the menu will prevent your character from being revived in-round. Are you sure?", "Confirmation", list("No, wait", "Yes, leave")) - if(choice == "No, wait") - return - - // Beyond this point, you're going to respawn - to_chat(usr, config.respawn_message) - - if(!client) - log_game("[usr.key] AM failed due to disconnect.") - return - client.screen.Cut() - client.screen += client.void - if(!client) - log_game("[usr.key] AM failed due to disconnect.") - return - - announce_ghost_joinleave(client, 0) - - var/mob/new_player/M = new /mob/new_player() - if(!client) - log_game("[usr.key] AM failed due to disconnect.") - qdel(M) - return - - M.key = key - if(M.mind) - M.mind.reset() - return - -/client/verb/changes() - set name = "Changelog" - set category = "OOC" - src << browse('html/changelog.html', "window=changes;size=675x650") - if(prefs.lastchangelog != changelog_hash) - prefs.lastchangelog = changelog_hash - SScharacter_setup.queue_preferences_save(prefs) - winset(src, "rpane.changelog", "background-color=none;font-style=;") - -/mob/verb/observe() - set name = "Observe" - set category = "OOC" - var/is_admin = 0 - - if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT)) - is_admin = 1 - else if(stat != DEAD || istype(src, /mob/new_player)) - to_chat(usr, "You must be observing to use this!") - return - - if(is_admin && stat == DEAD) - is_admin = 0 - - var/list/targets = list() - - - targets += observe_list_format(nuke_disks) - targets += observe_list_format(all_singularities) - targets += getmobs() - targets += observe_list_format(sortAtom(mechas_list)) - targets += observe_list_format(SSshuttles.ships) - - client.perspective = EYE_PERSPECTIVE - - var/eye_name = null - - var/ok = "[is_admin ? "Admin Observe" : "Observe"]" - eye_name = tgui_input_list(usr, "Select something to [ok]:", "Select Target", targets) - - if (!eye_name) - return - - var/mob/mob_eye = targets[eye_name] - - if(client && mob_eye) - client.eye = mob_eye - if (is_admin) - client.adminobs = 1 - if(mob_eye == client.mob || client.eye == client.mob) - client.adminobs = 0 - -/mob/verb/cancel_camera() - set name = "Cancel Camera View" - set category = "OOC" - unset_machine() - reset_view(null) - -/mob/Topic(href, href_list) - if(href_list["mach_close"]) - var/t1 = text("window=[href_list["mach_close"]]") - unset_machine() - src << browse(null, t1) - - if(href_list["flavor_more"]) - usr << browse(text("[][]", name, replacetext(flavor_text, "\n", "
    ")), text("window=[];size=500x200", name)) - onclose(usr, "[name]") - if(href_list["flavor_change"]) - update_flavor_text() -// ..() - return - - -/mob/proc/pull_damage() - return 0 - -/mob/verb/stop_pulling() - - set name = "Stop Pulling" - set category = "IC" - - if(pulling) - if(ishuman(pulling)) - var/mob/living/carbon/human/H = pulling - visible_message(SPAN_WARNING("\The [src] lets go of \the [H]."), SPAN_NOTICE("You let go of \the [H]."), exclude_mobs = list(H)) - if(!H.stat) - to_chat(H, SPAN_WARNING("\The [src] lets go of you.")) - pulling.pulledby = null - pulling = null - if(pullin) - pullin.icon_state = "pull0" - -/mob/proc/start_pulling(var/atom/movable/AM) - - if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! - return - - if (AM.anchored) - to_chat(src, "It won't budge!") - return - - var/mob/M = AM - if(ismob(AM)) - - if(!can_pull_mobs || !can_pull_size) - to_chat(src, "They won't budge!") - return - - if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) - to_chat(src, "[M] is too large for you to move!") - return - - if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) - to_chat(src, "[M] is too heavy for you to move!") - return - - // If your size is larger than theirs and you have some - // kind of mob pull value AT ALL, you will be able to pull - // them, so don't bother checking that explicitly. - - if(M.grabbed_by.len) - // Only start pulling when nobody else has a grab on them - . = 1 - for(var/obj/item/weapon/grab/G in M.grabbed_by) - if(G.assailant != usr) - . = 0 - else - qdel(G) - if(!.) - to_chat(src, "Somebody has a grip on them!") - return - - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = usr - - else if(isobj(AM)) - var/obj/I = AM - if(!can_pull_size || can_pull_size < I.w_class) - to_chat(src, "It won't budge!") - return - - if(pulling) - var/pulling_old = pulling - stop_pulling() - // Are we pulling the same thing twice? Just stop pulling. - if(pulling_old == AM) - return - - src.pulling = AM - AM.pulledby = src - - if(pullin) - pullin.icon_state = "pull1" - - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(H.lying) // If they're on the ground we're probably dragging their arms to move them - visible_message(SPAN_WARNING("\The [src] leans down and grips \the [H]'s arms."), SPAN_NOTICE("You lean down and grip \the [H]'s arms."), exclude_mobs = list(H)) - if(!H.stat) - to_chat(H, SPAN_WARNING("\The [src] leans down and grips your arms.")) - else //Otherwise we're probably just holding their arm to lead them somewhere - visible_message(SPAN_WARNING("\The [src] grips \the [H]'s arm."), SPAN_NOTICE("You grip \the [H]'s arm."), exclude_mobs = list(H)) - if(!H.stat) - to_chat(H, SPAN_WARNING("\The [src] grips your arm.")) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25) //Quieter than hugging/grabbing but we still want some audio feedback - - if(H.pull_damage()) - to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.") - - //Attempted fix for people flying away through space when cuffed and dragged. - if(ismob(AM)) - var/mob/pulled = AM - pulled.inertia_dir = 0 - -/mob/proc/can_use_hands() - return - -/mob/proc/is_active() - return (0 >= usr.stat) - -/mob/proc/is_dead() - return stat == DEAD - -/mob/proc/is_mechanical() - if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI")) - return 1 - return istype(src, /mob/living/silicon) || get_species() == "Machine" - -/mob/proc/is_ready() - return client && !!mind - -/mob/proc/get_gender() - return gender - -/mob/proc/see(message) - if(!is_active()) - return 0 - to_chat(src,message) - return 1 - -/mob/proc/show_viewers(message) - for(var/mob/M in viewers()) - M.see(message) - -/mob/Stat() - ..() - . = (is_client_active(10 MINUTES)) - - if(.) - if(statpanel("Status")) - stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") - if(ticker && ticker.current_state != GAME_STATE_PREGAME) - stat("Station Time", stationtime2text()) - stat("Station Date", stationdate2text()) - stat("Round Duration", roundduration2text()) - - if(client.holder) - if(statpanel("Status")) - stat("Location:", "([x], [y], [z]) [loc]") - stat("CPU:","[world.cpu]") - stat("Instances:","[world.contents.len]") - stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") - stat("Keys Held", keys2text(client.move_keys_held | client.mod_keys_held)) - stat("Next Move ADD", dirs2text(client.next_move_dir_add)) - stat("Next Move SUB", dirs2text(client.next_move_dir_sub)) - - if(statpanel("MC")) - stat("Location:", "([x], [y], [z]) [loc]") - stat("CPU:","[world.cpu]") - stat("Instances:","[world.contents.len]") - stat("World Time:", world.time) - stat("Real time of day:", REALTIMEOFDAY) - stat(null) - if(GLOB) - GLOB.stat_entry() - else - stat("Globals:", "ERROR") - if(Master) - Master.stat_entry() - else - stat("Master Controller:", "ERROR") - if(Failsafe) - Failsafe.stat_entry() - else - stat("Failsafe Controller:", "ERROR") - if(Master) - stat(null) - for(var/datum/controller/subsystem/SS in Master.subsystems) - SS.stat_entry() - - if(statpanel("Tickets")) - GLOB.ahelp_tickets.stat_entry() - - - if(length(GLOB.sdql2_queries)) - if(statpanel("SDQL2")) - stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) - for(var/i in GLOB.sdql2_queries) - var/datum/SDQL2_query/Q = i - Q.generate_stat() - - if(listed_turf && client) - if(!TurfAdjacent(listed_turf)) - listed_turf = null - else - if(statpanel("Turf")) - stat(listed_turf) - for(var/atom/A in listed_turf) - if(!A.mouse_opacity) - continue - if(A.invisibility > see_invisible) - continue - if(is_type_in_list(A, shouldnt_see)) - continue - if(A.plane > plane) - continue - stat(A) - - -// facing verbs -/mob/proc/canface() -// if(!canmove) return 0 //VOREStation Edit. Redundant check that only affects conscious proning, actual inability to turn and shift around handled by actual inabilities. - if(stat) return 0 - if(anchored) return 0 - if(transforming) return 0 - return 1 - -// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet. -/mob/proc/can_stand_overridden() - return 0 - -//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. -/mob/proc/update_canmove() - return canmove - - -/mob/proc/facedir(var/ndir) - if(!canface() || (client && (client.moving || !checkMoveCooldown()))) - DEBUG_INPUT("Denying Facedir for [src] (moving=[client?.moving])") - return 0 - set_dir(ndir) - if(buckled && buckled.buckle_movable) - buckled.set_dir(ndir) - setMoveCooldown(movement_delay()) - return 1 - - -/mob/verb/eastface() - set hidden = 1 - return facedir(client.client_dir(EAST)) - - -/mob/verb/westface() - set hidden = 1 - return facedir(client.client_dir(WEST)) - - -/mob/verb/northface() - set hidden = 1 - return facedir(client.client_dir(NORTH)) - - -/mob/verb/southface() - set hidden = 1 - return facedir(client.client_dir(SOUTH)) - - -//This might need a rename but it should replace the can this mob use things check -/mob/proc/IsAdvancedToolUser() - return 0 - -/mob/proc/Stun(amount) - if(status_flags & CANSTUN) - facing_dir = null - stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" - if(status_flags & CANSTUN) - stunned = max(amount,0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/AdjustStunned(amount) - if(status_flags & CANSTUN) - stunned = max(stunned + amount,0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/Weaken(amount) - if(status_flags & CANWEAKEN) - facing_dir = null - weakened = max(max(weakened,amount),0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/SetWeakened(amount) - if(status_flags & CANWEAKEN) - weakened = max(amount,0) - update_canmove() //can you guess what this does yet? - return - -/mob/proc/AdjustWeakened(amount) - if(status_flags & CANWEAKEN) - weakened = max(weakened + amount,0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/Paralyse(amount) - if(status_flags & CANPARALYSE) - facing_dir = null - paralysis = max(max(paralysis,amount),0) - return - -/mob/proc/SetParalysis(amount) - if(status_flags & CANPARALYSE) - paralysis = max(amount,0) - return - -/mob/proc/AdjustParalysis(amount) - if(status_flags & CANPARALYSE) - paralysis = max(paralysis + amount,0) - return - -/mob/proc/Sleeping(amount) - facing_dir = null - sleeping = max(max(sleeping,amount),0) - return - -/mob/proc/SetSleeping(amount) - sleeping = max(amount,0) - return - -/mob/proc/AdjustSleeping(amount) - sleeping = max(sleeping + amount,0) - return - -/mob/proc/Confuse(amount) - confused = max(max(confused,amount),0) - return - -/mob/proc/SetConfused(amount) - confused = max(amount,0) - return - -/mob/proc/AdjustConfused(amount) - confused = max(confused + amount,0) - return - -/mob/proc/Blind(amount) - eye_blind = max(max(eye_blind,amount),0) - return - -/mob/proc/SetBlinded(amount) - eye_blind = max(amount,0) - return - -/mob/proc/AdjustBlinded(amount) - eye_blind = max(eye_blind + amount,0) - return - -/mob/proc/Resting(amount) - facing_dir = null - resting = max(max(resting,amount),0) - update_canmove() - return - -/mob/proc/SetResting(amount) - resting = max(amount,0) - update_canmove() - return - -/mob/proc/AdjustResting(amount) - resting = max(resting + amount,0) - update_canmove() - return - -/mob/proc/AdjustLosebreath(amount) - losebreath = CLAMP(losebreath + amount, 0, 25) - -/mob/proc/SetLosebreath(amount) - losebreath = CLAMP(amount, 0, 25) - -/mob/proc/get_species() - return "" - -/mob/proc/flash_weak_pain() - flick("weak_pain",pain) - -/mob/proc/get_visible_implants(var/class = 0) - var/list/visible_implants = list() - for(var/obj/item/O in embedded) - if(O.w_class > class) - visible_implants += O - return visible_implants - -/mob/proc/embedded_needs_process() - return (embedded.len > 0) - -/mob/proc/yank_out_object() - set category = "Object" - set name = "Yank out object" - set desc = "Remove an embedded item at the cost of bleeding and pain." - set src in view(1) - - if(!isliving(usr) || !usr.checkClickCooldown()) - return - usr.setClickCooldown(20) - - if(usr.stat == 1) - to_chat(usr, "You are unconcious and cannot do that!") - return - - if(usr.restrained()) - to_chat(usr, "You are restrained and cannot do that!") - return - - var/mob/S = src - var/mob/U = usr - var/list/valid_objects = list() - var/self = null - - if(S == U) - self = 1 // Removing object from yourself. - - valid_objects = get_visible_implants(0) - if(!valid_objects.len) - if(self) - to_chat(src, "You have nothing stuck in your body that is large enough to remove.") - else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") - return - - var/obj/item/weapon/selection = tgui_input_list(usr, "What do you want to yank out?", "Embedded objects", valid_objects) - - if(self) - to_chat(src, "You attempt to get a good grip on [selection] in your body.") - else - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - - if(!do_after(U, 30)) - return - if(!selection || !S || !U) - return - - if(self) - visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") - else - visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") - valid_objects = get_visible_implants(0) - if(valid_objects.len == 1) //Yanking out last object - removing verb. - src.verbs -= /mob/proc/yank_out_object - clear_alert("embeddedobject") - - if(ishuman(src)) - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/affected - - for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant. - for(var/obj/item/O in organ.implants) - if(O == selection) - affected = organ - - affected.implants -= selection - H.shock_stage+=20 - affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction") - - if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-. - var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15)) - affected.wounds += I - H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50) - - if (ishuman(U)) - var/mob/living/carbon/human/human_user = U - human_user.bloody_hands(H) - - else if(issilicon(src)) - var/mob/living/silicon/robot/R = src - R.embedded -= selection - R.adjustBruteLoss(5) - R.adjustFireLoss(10) - - selection.forceMove(get_turf(src)) - U.put_in_hands(selection) - - for(var/obj/item/weapon/O in pinned) - if(O == selection) - pinned -= O - if(!pinned.len) - anchored = FALSE - return 1 - -//Check for brain worms in head. -/mob/proc/has_brain_worms() - - for(var/I in contents) - if(istype(I,/mob/living/simple_mob/animal/borer)) - return I - - return 0 - -/mob/proc/updateicon() - return - -// Please always use this proc, never just set the var directly. -/mob/proc/set_stat(var/new_stat) - . = (stat != new_stat) - stat = new_stat - -/mob/verb/face_direction() - - set name = "Face Direction" - set category = "IC" - set src = usr - - set_face_dir() - - if(!facing_dir) - to_chat(usr, "You are now not facing anything.") - else - to_chat(usr, "You are now facing [dir2text(facing_dir)].") - -/mob/proc/set_face_dir(var/newdir) - if(newdir == facing_dir) - facing_dir = null - else if(newdir) - set_dir(newdir) - facing_dir = newdir - else if(facing_dir) - facing_dir = null - else - set_dir(dir) - facing_dir = dir - -/mob/set_dir() - if(facing_dir) - if(!canface() || lying || buckled || restrained()) - facing_dir = null - else if(dir != facing_dir) - return ..(facing_dir) - else - return ..() - -/mob/verb/northfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(NORTH)) - -/mob/verb/southfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(SOUTH)) - -/mob/verb/eastfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(EAST)) - -/mob/verb/westfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(WEST)) - -// Begin VOREstation edit -/mob/verb/shiftnorth() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_y <= (default_pixel_y + 16)) - pixel_y++ - is_shifted = TRUE - -/mob/verb/shiftsouth() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_y >= (default_pixel_y - 16)) - pixel_y-- - is_shifted = TRUE - -/mob/verb/shiftwest() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_x >= (default_pixel_x - 16)) - pixel_x-- - is_shifted = TRUE - -/mob/verb/shifteast() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_x <= (default_pixel_x + 16)) - pixel_x++ - is_shifted = TRUE -// End VOREstation edit - -/mob/proc/adjustEarDamage() - return - -/mob/proc/setEarDamage() - return - -// Set client view distance (size of client's screen). Returns TRUE if anything changed. -/mob/proc/set_viewsize(var/new_view = world.view) - if (client && new_view != client.view) - client.view = new_view - return TRUE - return FALSE - -//Throwing stuff - -/mob/proc/toggle_throw_mode() - if (src.in_throw_mode) - throw_mode_off() - else - throw_mode_on() - -/mob/proc/throw_mode_off() - src.in_throw_mode = 0 - if(src.throw_icon) //in case we don't have the HUD and we use the hotkey - src.throw_icon.icon_state = "act_throw_off" - -/mob/proc/throw_mode_on() - src.in_throw_mode = 1 - if(src.throw_icon) - src.throw_icon.icon_state = "act_throw_on" - -/mob/proc/isSynthetic() - return 0 - -/mob/proc/is_muzzled() - return 0 - -//Exploitable Info Update - -/mob/proc/amend_exploitable(var/obj/item/I) - if(istype(I)) - exploit_addons |= I - var/exploitmsg = html_decode("\n" + "Has " + I.name + ".") - exploit_record += exploitmsg - -/client/proc/check_has_body_select() - return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) - -/client/verb/body_toggle_head() - set name = "body-toggle-head" - set hidden = 1 - toggle_zone_sel(list(BP_HEAD, O_EYES, O_MOUTH)) - -/client/verb/body_r_arm() - set name = "body-r-arm" - set hidden = 1 - toggle_zone_sel(list(BP_R_ARM,BP_R_HAND)) - -/client/verb/body_l_arm() - set name = "body-l-arm" - set hidden = 1 - toggle_zone_sel(list(BP_L_ARM,BP_L_HAND)) - -/client/verb/body_chest() - set name = "body-chest" - set hidden = 1 - toggle_zone_sel(list(BP_TORSO)) - -/client/verb/body_groin() - set name = "body-groin" - set hidden = 1 - toggle_zone_sel(list(BP_GROIN)) - -/client/verb/body_r_leg() - set name = "body-r-leg" - set hidden = 1 - toggle_zone_sel(list(BP_R_LEG,BP_R_FOOT)) - -/client/verb/body_l_leg() - set name = "body-l-leg" - set hidden = 1 - toggle_zone_sel(list(BP_L_LEG,BP_L_FOOT)) - -/client/proc/toggle_zone_sel(list/zones) - if(!check_has_body_select()) - return - var/obj/screen/zone_sel/selector = mob.zone_sel - selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones)) - -// This handles setting the client's color variable, which makes everything look a specific color. -// This proc is here so it can be called without needing to check if the client exists, or if the client relogs. -// This is for inheritence since /mob/living will serve most cases. If you need ghosts to use this you'll have to implement that yourself. -/mob/proc/update_client_color() - if(client && client.color) - animate(client, color = null, time = 10) - return - -/mob/proc/swap_hand() - return - -//Throwing stuff -/mob/proc/throw_item(atom/target) - return - -/mob/proc/will_show_tooltip() - if(alpha <= EFFECTIVE_INVIS) - return FALSE - return TRUE - -/mob/MouseEntered(location, control, params) - if(usr != src && usr.is_preference_enabled(/datum/client_preference/mob_tooltips) && src.will_show_tooltip()) - openToolTip(user = usr, tip_src = src, params = params, title = get_nametag_name(usr), content = get_nametag_desc(usr)) - - ..() - -/mob/MouseDown() - closeToolTip(usr) //No reason not to, really - - ..() - -/mob/MouseExited() - closeToolTip(usr) //No reason not to, really - - ..() - -// Manages a global list of mobs with clients attached, indexed by z-level. -/mob/proc/update_client_z(new_z) // +1 to register, null to unregister. - if(registered_z != new_z) - if(registered_z) - GLOB.players_by_zlevel[registered_z] -= src - if(client) - if(new_z) - GLOB.players_by_zlevel[new_z] += src - registered_z = new_z - else - registered_z = null - -GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list) -/mob/living/update_client_z(new_z) - var/precall_reg_z = registered_z - . = ..() // will update registered_z if necessary - if(precall_reg_z != registered_z) // parent did work, let's do work too - if(precall_reg_z) - GLOB.living_players_by_zlevel[precall_reg_z] -= src - if(registered_z) - GLOB.living_players_by_zlevel[registered_z] += src - -/mob/onTransitZ(old_z, new_z) - ..() - update_client_z(new_z) - -/mob/cloak() - . = ..() - if(client && cloaked_selfimage) - client.images += cloaked_selfimage - -/mob/uncloak() - if(client && cloaked_selfimage) - client.images -= cloaked_selfimage - return ..() - -/mob/get_cloaked_selfimage() - var/icon/selficon = getCompoundIcon(src) - selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White - var/image/selfimage = image(selficon) - selfimage.color = "#0000FF" - selfimage.alpha = 100 - selfimage.layer = initial(layer) - selfimage.plane = initial(plane) - selfimage.loc = src - - return selfimage - -/mob/proc/GetAltName() - return "" - -/mob/proc/get_ghost(even_if_they_cant_reenter = 0) - if(mind) - return mind.get_ghost(even_if_they_cant_reenter) - -/mob/proc/grab_ghost(force) - if(mind) - return mind.grab_ghost(force = force) -======= -/mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game. - mob_list -= src - dead_mob_list -= src - living_mob_list -= src - unset_machine() - qdel(hud_used) - clear_fullscreen() - if(client) - for(var/obj/screen/movable/spell_master/spell_master in spell_masters) - qdel(spell_master) - remove_screen_obj_references() - client.screen = list() - if(mind && mind.current == src) - spellremove(src) - ghostize() - QDEL_NULL(plane_holder) - ..() - return QDEL_HINT_HARDDEL_NOW - -/mob/proc/remove_screen_obj_references() - hands = null - pullin = null - purged = null - internals = null - i_select = null - m_select = null - healths = null - throw_icon = null - pain = null - item_use_icon = null - gun_move_icon = null - gun_setting_icon = null - spell_masters = null - zone_sel = null - -/mob/Initialize() - mob_list += src - if(stat == DEAD) - dead_mob_list += src - else - living_mob_list += src - lastarea = get_area(src) - set_focus(src) // VOREStation Add - Key Handling - hook_vr("mob_new",list(src)) //VOREStation Code - update_transform() // Some mobs may start bigger or smaller than normal. - return ..() - -/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) - - if(!client && !teleop) return - - if (type) - if((type & VISIBLE_MESSAGE) && (is_blind() || paralysis) )//Vision related - if (!( alt )) - return - else - msg = alt - type = alt_type - if ((type & AUDIBLE_MESSAGE) && is_deaf())//Hearing related - if (!( alt )) - return - else - msg = alt - type = alt_type - if ((type & VISIBLE_MESSAGE) && (sdisabilities & BLIND)) - return - // Added voice muffling for Issue 41. - if(stat == UNCONSCIOUS || sleeping > 0) - to_chat(src, "... You can almost hear someone talking ...") - else - to_chat(src,msg) - if(teleop) - to_chat(teleop, create_text_tag("body", "BODY:", teleop) + "[msg]") - return - -// Show a message to all mobs and objects in sight of this one -// This would be for visible actions by the src mob -// message is the message output to anyone who can see e.g. "[src] does something!" -// self_message (optional) is what the src mob sees e.g. "You do something!" -// blind_message (optional) is what blind people will hear e.g. "You hear something!" -/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null, var/range = world.view, var/runemessage) - if(self_message) - if(LAZYLEN(exclude_mobs)) - exclude_mobs |= src - else - exclude_mobs = list(src) - src.show_message(self_message, 1, blind_message, 2) - if(isnull(runemessage)) - runemessage = -1 - . = ..(message, blind_message, exclude_mobs, range, runemessage) // Really not ideal that atom/visible_message has different arg numbering :( - -// Returns an amount of power drawn from the object (-1 if it's not viable). -// If drain_check is set it will not actually drain power, just return a value. -// If surge is set, it will destroy/damage the recipient and not return any power. -// Not sure where to define this, so it can sit here for the rest of time. -/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) - return -1 - -// Show a message to all mobs and objects in earshot of this one -// This would be for audible actions by the src mob -// message is the message output to anyone who can hear. -// self_message (optional) is what the src mob hears. -// deaf_message (optional) is what deaf people will see. -// hearing_distance (optional) is the range, how many tiles away the message can be heard. -/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message, var/radio_message, var/runemessage) - - var/range = hearing_distance || world.view - var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE) - - var/list/hearing_mobs = hear["mobs"] - var/list/hearing_objs = hear["objs"] - - if(isnull(runemessage)) - runemessage = -1 // Symmetry with mob/audible_message, despite the fact this one doesn't call parent. Maybe it should! - - if(radio_message) - for(var/obj/O as anything in hearing_objs) - O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) - else - for(var/obj/O as anything in hearing_objs) - O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) - - for(var/mob/M as anything in hearing_mobs) - var/msg = message - if(self_message && M==src) - msg = self_message - M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) - if(runemessage != -1) - M.create_chat_message(src, "[runemessage || message]", FALSE, list("emote"), audible = FALSE) - -/mob/proc/findname(msg) - for(var/mob/M in mob_list) - if (M.real_name == text("[]", msg)) - return M - return 0 - -/mob/proc/Life() -// if(organStructure) -// organStructure.ProcessOrgans() - return - -#define UNBUCKLED 0 -#define PARTIALLY_BUCKLED 1 -#define FULLY_BUCKLED 2 -/mob/proc/buckled() - // Preliminary work for a future buckle rewrite, - // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting) - if(!buckled) - return UNBUCKLED - return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED - -/mob/proc/is_blind() - return ((sdisabilities & BLIND) || blinded || incapacitated(INCAPACITATION_KNOCKOUT)) - -/mob/proc/is_deaf() - return ((sdisabilities & DEAF) || ear_deaf || incapacitated(INCAPACITATION_KNOCKOUT)) - -/mob/proc/is_physically_disabled() - return incapacitated(INCAPACITATION_DISABLED) - -/mob/proc/cannot_stand() - return incapacitated(INCAPACITATION_KNOCKDOWN) - -/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT) - if ((incapacitation_flags & INCAPACITATION_STUNNED) && stunned) - return 1 - - if ((incapacitation_flags & INCAPACITATION_FORCELYING) && (weakened || resting)) - return 1 - - if ((incapacitation_flags & INCAPACITATION_KNOCKOUT) && (stat || paralysis || sleeping || (status_flags & FAKEDEATH))) - return 1 - - if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained()) - return 1 - - if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY))) - var/buckling = buckled() - if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY)) - return 1 - if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY)) - return 1 - - return 0 - -#undef UNBUCKLED -#undef PARTIALLY_BUCKLED -#undef FULLY_BUCKLED - -/mob/proc/restrained() - return - -/mob/proc/reset_view(atom/A) - if (client) - if (istype(A, /atom/movable)) - client.perspective = EYE_PERSPECTIVE - client.eye = A - else - if (isturf(loc)) - client.eye = client.mob - client.perspective = MOB_PERSPECTIVE - else - client.perspective = EYE_PERSPECTIVE - client.eye = loc - return TRUE - -/mob/verb/pointed(atom/A as mob|obj|turf in view()) - set name = "Point To" - set category = "Object" - - if(!src || !isturf(src.loc) || !(A in view(src.loc))) - return 0 - if(istype(A, /obj/effect/decal/point)) - return 0 - - var/turf/tile = get_turf(A) - if (!tile) - return 0 - - var/turf/our_tile = get_turf(src) - var/obj/visual = new /obj/effect/decal/point(our_tile) - visual.invisibility = invisibility - visual.plane = ABOVE_PLANE - visual.layer = FLY_LAYER - - animate(visual, - pixel_x = (tile.x - our_tile.x) * world.icon_size + A.pixel_x, - pixel_y = (tile.y - our_tile.y) * world.icon_size + A.pixel_y, - time = 1.7, - easing = EASE_OUT) - - QDEL_IN(visual, 2 SECONDS) //Better qdel - - face_atom(A) - return 1 - - -/mob/proc/ret_grab(list/L, flag) - return - -/mob/verb/mode() - set name = "Activate Held Object" - set category = "Object" - set src = usr - - return - -/* -/mob/verb/dump_source() - - var/master = "
    "
    -	for(var/t in typesof(/area))
    -		master += text("[]\n", t)
    -		//Foreach goto(26)
    -	src << browse(master)
    -	return
    -*/
    -
    -/mob/verb/memory()
    -	set name = "Notes"
    -	set category = "IC"
    -	if(mind)
    -		mind.show_memory(src)
    -	else
    -		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    -
    -/mob/verb/add_memory(msg as message)
    -	set name = "Add Note"
    -	set category = "IC"
    -
    -	msg = sanitize(msg)
    -
    -	if(mind)
    -		mind.store_memory(msg)
    -	else
    -		to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
    -
    -/mob/proc/store_memory(msg as message, popup, sane = 1)
    -	msg = copytext(msg, 1, MAX_MESSAGE_LEN)
    -
    -	if (sane)
    -		msg = sanitize(msg)
    -
    -	if (length(memory) == 0)
    -		memory += msg
    -	else
    -		memory += "
    [msg]" - - if (popup) - memory() - -/mob/proc/update_flavor_text() - set src in usr - if(usr != src) - to_chat(usr, "No.") - var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes - - if(msg != null) - flavor_text = msg - -/mob/proc/warn_flavor_changed() - if(flavor_text && flavor_text != "") // don't spam people that don't use it! - to_chat(src, "

    OOC Warning:

    ") - to_chat(src, "Your flavor text is likely out of date! Change") - -/mob/proc/print_flavor_text() - if (flavor_text && flavor_text != "") - var/msg = replacetext(flavor_text, "\n", " ") - if(length(msg) <= 40) - return "[msg]" - else - return "[copytext_preserve_html(msg, 1, 37)]... More..." - -/* -/mob/verb/help() - set name = "Help" - src << browse('html/help.html', "window=help") - return -*/ - -/mob/proc/set_respawn_timer(var/time) - // Try to figure out what time to use - - // Special cases, can never respawn - if(ticker?.mode?.deny_respawn) - time = -1 - else if(!config.abandon_allowed) - time = -1 - else if(!config.respawn) - time = -1 - - // Special case for observing before game start - else if(ticker?.current_state <= GAME_STATE_SETTING_UP) - time = 1 MINUTE - - // Wasn't given a time, use the config time - else if(!time) - time = config.respawn_time - - var/keytouse = ckey - // Try harder to find a key to use - if(!keytouse && key) - keytouse = ckey(key) - else if(!keytouse && mind?.key) - keytouse = ckey(mind.key) - - GLOB.respawn_timers[keytouse] = world.time + time - -/mob/observer/dead/set_respawn_timer() - if(config.antag_hud_restricted && has_enabled_antagHUD) - ..(-1) - else - return // Don't set it, no need - -/mob/verb/abandon_mob() - set name = "Return to Menu" - set category = "OOC" - - if(stat != DEAD || !ticker) - to_chat(usr, "You must be dead to use this!") - return - - // Final chance to abort "respawning" - if(mind && timeofdeath) // They had spawned before - var/choice = tgui_alert(usr, "Returning to the menu will prevent your character from being revived in-round. Are you sure?", "Confirmation", list("No, wait", "Yes, leave")) - if(choice == "No, wait") - return - - // Beyond this point, you're going to respawn - to_chat(usr, config.respawn_message) - - if(!client) - log_game("[usr.key] AM failed due to disconnect.") - return - client.screen.Cut() - client.screen += client.void - if(!client) - log_game("[usr.key] AM failed due to disconnect.") - return - - announce_ghost_joinleave(client, 0) - - var/mob/new_player/M = new /mob/new_player() - if(!client) - log_game("[usr.key] AM failed due to disconnect.") - qdel(M) - return - - M.key = key - if(M.mind) - M.mind.reset() - return - -/client/verb/changes() - set name = "Changelog" - set category = "OOC" - src << browse('html/changelog.html', "window=changes;size=675x650") - if(prefs.lastchangelog != changelog_hash) - prefs.lastchangelog = changelog_hash - SScharacter_setup.queue_preferences_save(prefs) - winset(src, "rpane.changelog", "background-color=none;font-style=;") - -/mob/verb/observe() - set name = "Observe" - set category = "OOC" - var/is_admin = 0 - - if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT)) - is_admin = 1 - else if(stat != DEAD || istype(src, /mob/new_player)) - to_chat(usr, "You must be observing to use this!") - return - - if(is_admin && stat == DEAD) - is_admin = 0 - - var/list/targets = list() - - - targets += observe_list_format(nuke_disks) - targets += observe_list_format(all_singularities) - targets += getmobs() - targets += observe_list_format(sortAtom(mechas_list)) - targets += observe_list_format(SSshuttles.ships) - - client.perspective = EYE_PERSPECTIVE - - var/eye_name = null - - var/ok = "[is_admin ? "Admin Observe" : "Observe"]" - eye_name = tgui_input_list(usr, "Select something to [ok]:", "Select Target", targets) - - if (!eye_name) - return - - var/mob/mob_eye = targets[eye_name] - - if(client && mob_eye) - client.eye = mob_eye - if (is_admin) - client.adminobs = 1 - if(mob_eye == client.mob || client.eye == client.mob) - client.adminobs = 0 - -/mob/verb/cancel_camera() - set name = "Cancel Camera View" - set category = "OOC" - unset_machine() - reset_view(null) - -/mob/Topic(href, href_list) - if(href_list["mach_close"]) - var/t1 = text("window=[href_list["mach_close"]]") - unset_machine() - src << browse(null, t1) - - if(href_list["flavor_more"]) - usr << browse(text("[][]", name, replacetext(flavor_text, "\n", "
    ")), text("window=[];size=500x200", name)) - onclose(usr, "[name]") - if(href_list["flavor_change"]) - update_flavor_text() -// ..() - return - - -/mob/proc/pull_damage() - return 0 - -/mob/verb/stop_pulling() - - set name = "Stop Pulling" - set category = "IC" - - if(pulling) - if(ishuman(pulling)) - var/mob/living/carbon/human/H = pulling - visible_message(SPAN_WARNING("\The [src] lets go of \the [H]."), SPAN_NOTICE("You let go of \the [H]."), exclude_mobs = list(H)) - if(!H.stat) - to_chat(H, SPAN_WARNING("\The [src] lets go of you.")) - pulling.pulledby = null - pulling = null - if(pullin) - pullin.icon_state = "pull0" - -/mob/proc/start_pulling(var/atom/movable/AM) - - if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! - return - - if (AM.anchored) - to_chat(src, "It won't budge!") - return - - var/mob/M = AM - if(ismob(AM)) - - if(!can_pull_mobs || !can_pull_size) - to_chat(src, "They won't budge!") - return - - if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER)) - to_chat(src, "[M] is too large for you to move!") - return - - if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER)) - to_chat(src, "[M] is too heavy for you to move!") - return - - // If your size is larger than theirs and you have some - // kind of mob pull value AT ALL, you will be able to pull - // them, so don't bother checking that explicitly. - - if(M.grabbed_by.len) - // Only start pulling when nobody else has a grab on them - . = 1 - for(var/obj/item/weapon/grab/G in M.grabbed_by) - if(G.assailant != usr) - . = 0 - else - qdel(G) - if(!.) - to_chat(src, "Somebody has a grip on them!") - return - - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = usr - - else if(isobj(AM)) - var/obj/I = AM - if(!can_pull_size || can_pull_size < I.w_class) - to_chat(src, "It won't budge!") - return - - if(pulling) - var/pulling_old = pulling - stop_pulling() - // Are we pulling the same thing twice? Just stop pulling. - if(pulling_old == AM) - return - - src.pulling = AM - AM.pulledby = src - - if(pullin) - pullin.icon_state = "pull1" - - if(ishuman(AM)) - var/mob/living/carbon/human/H = AM - if(H.lying) // If they're on the ground we're probably dragging their arms to move them - visible_message(SPAN_WARNING("\The [src] leans down and grips \the [H]'s arms."), SPAN_NOTICE("You lean down and grip \the [H]'s arms."), exclude_mobs = list(H)) - if(!H.stat) - to_chat(H, SPAN_WARNING("\The [src] leans down and grips your arms.")) - else //Otherwise we're probably just holding their arm to lead them somewhere - visible_message(SPAN_WARNING("\The [src] grips \the [H]'s arm."), SPAN_NOTICE("You grip \the [H]'s arm."), exclude_mobs = list(H)) - if(!H.stat) - to_chat(H, SPAN_WARNING("\The [src] grips your arm.")) - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25) //Quieter than hugging/grabbing but we still want some audio feedback - - if(H.pull_damage()) - to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.") - - //Attempted fix for people flying away through space when cuffed and dragged. - if(ismob(AM)) - var/mob/pulled = AM - pulled.inertia_dir = 0 - -/mob/proc/can_use_hands() - return - -/mob/proc/is_active() - return (0 >= usr.stat) - -/mob/proc/is_dead() - return stat == DEAD - -/mob/proc/is_mechanical() - if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI")) - return 1 - return istype(src, /mob/living/silicon) || get_species() == "Machine" - -/mob/proc/is_ready() - return client && !!mind - -/mob/proc/get_gender() - return gender - -/mob/proc/see(message) - if(!is_active()) - return 0 - to_chat(src,message) - return 1 - -/mob/proc/show_viewers(message) - for(var/mob/M in viewers()) - M.see(message) - -/mob/Stat() - ..() - . = (is_client_active(10 MINUTES)) - - if(.) - if(statpanel("Status")) - stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") - if(ticker && ticker.current_state != GAME_STATE_PREGAME) - stat("Station Time", stationtime2text()) - stat("Station Date", stationdate2text()) - stat("Round Duration", roundduration2text()) - - if(client.holder) - if(statpanel("Status")) - stat("Location:", "([x], [y], [z]) [loc]") - stat("CPU:","[world.cpu]") - stat("Instances:","[world.contents.len]") - stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") - stat("Keys Held", keys2text(client.move_keys_held | client.mod_keys_held)) - stat("Next Move ADD", dirs2text(client.next_move_dir_add)) - stat("Next Move SUB", dirs2text(client.next_move_dir_sub)) - - if(statpanel("MC")) - stat("Location:", "([x], [y], [z]) [loc]") - stat("CPU:","[world.cpu]") - stat("Instances:","[world.contents.len]") - stat("World Time:", world.time) - stat("Real time of day:", REALTIMEOFDAY) - stat(null) - if(GLOB) - GLOB.stat_entry() - else - stat("Globals:", "ERROR") - if(Master) - Master.stat_entry() - else - stat("Master Controller:", "ERROR") - if(Failsafe) - Failsafe.stat_entry() - else - stat("Failsafe Controller:", "ERROR") - if(Master) - stat(null) - for(var/datum/controller/subsystem/SS in Master.subsystems) - SS.stat_entry() - - if(statpanel("Tickets")) - GLOB.ahelp_tickets.stat_entry() - - - if(length(GLOB.sdql2_queries)) - if(statpanel("SDQL2")) - stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) - for(var/datum/SDQL2_query/Q as anything in GLOB.sdql2_queries) - Q.generate_stat() - - if(listed_turf && client) - if(!TurfAdjacent(listed_turf)) - listed_turf = null - else - if(statpanel("Turf")) - stat(listed_turf) - for(var/atom/A in listed_turf) - if(!A.mouse_opacity) - continue - if(A.invisibility > see_invisible) - continue - if(is_type_in_list(A, shouldnt_see)) - continue - if(A.plane > plane) - continue - stat(A) - - -// facing verbs -/mob/proc/canface() -// if(!canmove) return 0 //VOREStation Edit. Redundant check that only affects conscious proning, actual inability to turn and shift around handled by actual inabilities. - if(stat) return 0 - if(anchored) return 0 - if(transforming) return 0 - return 1 - -// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet. -/mob/proc/can_stand_overridden() - return 0 - -//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. -/mob/proc/update_canmove() - return canmove - - -/mob/proc/facedir(var/ndir) - if(!canface() || (client && (client.moving || !checkMoveCooldown()))) - DEBUG_INPUT("Denying Facedir for [src] (moving=[client?.moving])") - return 0 - set_dir(ndir) - if(buckled && buckled.buckle_movable) - buckled.set_dir(ndir) - setMoveCooldown(movement_delay()) - return 1 - - -/mob/verb/eastface() - set hidden = 1 - return facedir(client.client_dir(EAST)) - - -/mob/verb/westface() - set hidden = 1 - return facedir(client.client_dir(WEST)) - - -/mob/verb/northface() - set hidden = 1 - return facedir(client.client_dir(NORTH)) - - -/mob/verb/southface() - set hidden = 1 - return facedir(client.client_dir(SOUTH)) - - -//This might need a rename but it should replace the can this mob use things check -/mob/proc/IsAdvancedToolUser() - return 0 - -/mob/proc/Stun(amount) - if(status_flags & CANSTUN) - facing_dir = null - stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned" - if(status_flags & CANSTUN) - stunned = max(amount,0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/AdjustStunned(amount) - if(status_flags & CANSTUN) - stunned = max(stunned + amount,0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/Weaken(amount) - if(status_flags & CANWEAKEN) - facing_dir = null - weakened = max(max(weakened,amount),0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/SetWeakened(amount) - if(status_flags & CANWEAKEN) - weakened = max(amount,0) - update_canmove() //can you guess what this does yet? - return - -/mob/proc/AdjustWeakened(amount) - if(status_flags & CANWEAKEN) - weakened = max(weakened + amount,0) - update_canmove() //updates lying, canmove and icons - return - -/mob/proc/Paralyse(amount) - if(status_flags & CANPARALYSE) - facing_dir = null - paralysis = max(max(paralysis,amount),0) - return - -/mob/proc/SetParalysis(amount) - if(status_flags & CANPARALYSE) - paralysis = max(amount,0) - return - -/mob/proc/AdjustParalysis(amount) - if(status_flags & CANPARALYSE) - paralysis = max(paralysis + amount,0) - return - -/mob/proc/Sleeping(amount) - facing_dir = null - sleeping = max(max(sleeping,amount),0) - return - -/mob/proc/SetSleeping(amount) - sleeping = max(amount,0) - return - -/mob/proc/AdjustSleeping(amount) - sleeping = max(sleeping + amount,0) - return - -/mob/proc/Confuse(amount) - confused = max(max(confused,amount),0) - return - -/mob/proc/SetConfused(amount) - confused = max(amount,0) - return - -/mob/proc/AdjustConfused(amount) - confused = max(confused + amount,0) - return - -/mob/proc/Blind(amount) - eye_blind = max(max(eye_blind,amount),0) - return - -/mob/proc/SetBlinded(amount) - eye_blind = max(amount,0) - return - -/mob/proc/AdjustBlinded(amount) - eye_blind = max(eye_blind + amount,0) - return - -/mob/proc/Resting(amount) - facing_dir = null - resting = max(max(resting,amount),0) - update_canmove() - return - -/mob/proc/SetResting(amount) - resting = max(amount,0) - update_canmove() - return - -/mob/proc/AdjustResting(amount) - resting = max(resting + amount,0) - update_canmove() - return - -/mob/proc/AdjustLosebreath(amount) - losebreath = CLAMP(losebreath + amount, 0, 25) - -/mob/proc/SetLosebreath(amount) - losebreath = CLAMP(amount, 0, 25) - -/mob/proc/get_species() - return "" - -/mob/proc/flash_weak_pain() - flick("weak_pain",pain) - -/mob/proc/get_visible_implants(var/class = 0) - var/list/visible_implants = list() - for(var/obj/item/O in embedded) - if(O.w_class > class) - visible_implants += O - return visible_implants - -/mob/proc/embedded_needs_process() - return (embedded.len > 0) - -/mob/proc/yank_out_object() - set category = "Object" - set name = "Yank out object" - set desc = "Remove an embedded item at the cost of bleeding and pain." - set src in view(1) - - if(!isliving(usr) || !usr.checkClickCooldown()) - return - usr.setClickCooldown(20) - - if(usr.stat == 1) - to_chat(usr, "You are unconcious and cannot do that!") - return - - if(usr.restrained()) - to_chat(usr, "You are restrained and cannot do that!") - return - - var/mob/S = src - var/mob/U = usr - var/list/valid_objects = list() - var/self = null - - if(S == U) - self = 1 // Removing object from yourself. - - valid_objects = get_visible_implants(0) - if(!valid_objects.len) - if(self) - to_chat(src, "You have nothing stuck in your body that is large enough to remove.") - else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") - return - - var/obj/item/weapon/selection = tgui_input_list(usr, "What do you want to yank out?", "Embedded objects", valid_objects) - - if(self) - to_chat(src, "You attempt to get a good grip on [selection] in your body.") - else - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - - if(!do_after(U, 30)) - return - if(!selection || !S || !U) - return - - if(self) - visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.") - else - visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") - valid_objects = get_visible_implants(0) - if(valid_objects.len == 1) //Yanking out last object - removing verb. - src.verbs -= /mob/proc/yank_out_object - clear_alert("embeddedobject") - - if(ishuman(src)) - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/affected - - for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant. - for(var/obj/item/O in organ.implants) - if(O == selection) - affected = organ - - affected.implants -= selection - H.shock_stage+=20 - affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction") - - if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-. - var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15)) - affected.wounds += I - H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50) - - if (ishuman(U)) - var/mob/living/carbon/human/human_user = U - human_user.bloody_hands(H) - - else if(issilicon(src)) - var/mob/living/silicon/robot/R = src - R.embedded -= selection - R.adjustBruteLoss(5) - R.adjustFireLoss(10) - - selection.forceMove(get_turf(src)) - U.put_in_hands(selection) - - for(var/obj/item/weapon/O in pinned) - if(O == selection) - pinned -= O - if(!pinned.len) - anchored = FALSE - return 1 - -//Check for brain worms in head. -/mob/proc/has_brain_worms() - - for(var/I in contents) - if(istype(I,/mob/living/simple_mob/animal/borer)) - return I - - return 0 - -/mob/proc/updateicon() - return - -// Please always use this proc, never just set the var directly. -/mob/proc/set_stat(var/new_stat) - . = (stat != new_stat) - stat = new_stat - -/mob/verb/face_direction() - - set name = "Face Direction" - set category = "IC" - set src = usr - - set_face_dir() - - if(!facing_dir) - to_chat(usr, "You are now not facing anything.") - else - to_chat(usr, "You are now facing [dir2text(facing_dir)].") - -/mob/proc/set_face_dir(var/newdir) - if(newdir == facing_dir) - facing_dir = null - else if(newdir) - set_dir(newdir) - facing_dir = newdir - else if(facing_dir) - facing_dir = null - else - set_dir(dir) - facing_dir = dir - -/mob/set_dir() - if(facing_dir) - if(!canface() || lying || buckled || restrained()) - facing_dir = null - else if(dir != facing_dir) - return ..(facing_dir) - else - return ..() - -/mob/verb/northfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(NORTH)) - -/mob/verb/southfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(SOUTH)) - -/mob/verb/eastfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(EAST)) - -/mob/verb/westfaceperm() - set hidden = 1 - set_face_dir(client.client_dir(WEST)) - -// Begin VOREstation edit -/mob/verb/shiftnorth() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_y <= (default_pixel_y + 16)) - pixel_y++ - is_shifted = TRUE - -/mob/verb/shiftsouth() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_y >= (default_pixel_y - 16)) - pixel_y-- - is_shifted = TRUE - -/mob/verb/shiftwest() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_x >= (default_pixel_x - 16)) - pixel_x-- - is_shifted = TRUE - -/mob/verb/shifteast() - set hidden = TRUE - if(!canface()) - return FALSE - if(pixel_x <= (default_pixel_x + 16)) - pixel_x++ - is_shifted = TRUE -// End VOREstation edit - -/mob/proc/adjustEarDamage() - return - -/mob/proc/setEarDamage() - return - -// Set client view distance (size of client's screen). Returns TRUE if anything changed. -/mob/proc/set_viewsize(var/new_view = world.view) - if (client && new_view != client.view) - client.view = new_view - return TRUE - return FALSE - -//Throwing stuff - -/mob/proc/toggle_throw_mode() - if (src.in_throw_mode) - throw_mode_off() - else - throw_mode_on() - -/mob/proc/throw_mode_off() - src.in_throw_mode = 0 - if(src.throw_icon) //in case we don't have the HUD and we use the hotkey - src.throw_icon.icon_state = "act_throw_off" - -/mob/proc/throw_mode_on() - src.in_throw_mode = 1 - if(src.throw_icon) - src.throw_icon.icon_state = "act_throw_on" - -/mob/proc/isSynthetic() - return 0 - -/mob/proc/is_muzzled() - return 0 - -//Exploitable Info Update - -/mob/proc/amend_exploitable(var/obj/item/I) - if(istype(I)) - exploit_addons |= I - var/exploitmsg = html_decode("\n" + "Has " + I.name + ".") - exploit_record += exploitmsg - -/client/proc/check_has_body_select() - return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel) - -/client/verb/body_toggle_head() - set name = "body-toggle-head" - set hidden = 1 - toggle_zone_sel(list(BP_HEAD, O_EYES, O_MOUTH)) - -/client/verb/body_r_arm() - set name = "body-r-arm" - set hidden = 1 - toggle_zone_sel(list(BP_R_ARM,BP_R_HAND)) - -/client/verb/body_l_arm() - set name = "body-l-arm" - set hidden = 1 - toggle_zone_sel(list(BP_L_ARM,BP_L_HAND)) - -/client/verb/body_chest() - set name = "body-chest" - set hidden = 1 - toggle_zone_sel(list(BP_TORSO)) - -/client/verb/body_groin() - set name = "body-groin" - set hidden = 1 - toggle_zone_sel(list(BP_GROIN)) - -/client/verb/body_r_leg() - set name = "body-r-leg" - set hidden = 1 - toggle_zone_sel(list(BP_R_LEG,BP_R_FOOT)) - -/client/verb/body_l_leg() - set name = "body-l-leg" - set hidden = 1 - toggle_zone_sel(list(BP_L_LEG,BP_L_FOOT)) - -/client/proc/toggle_zone_sel(list/zones) - if(!check_has_body_select()) - return - var/obj/screen/zone_sel/selector = mob.zone_sel - selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones)) - -// This handles setting the client's color variable, which makes everything look a specific color. -// This proc is here so it can be called without needing to check if the client exists, or if the client relogs. -// This is for inheritence since /mob/living will serve most cases. If you need ghosts to use this you'll have to implement that yourself. -/mob/proc/update_client_color() - if(client && client.color) - animate(client, color = null, time = 10) - return - -/mob/proc/swap_hand() - return - -//Throwing stuff -/mob/proc/throw_item(atom/target) - return - -/mob/proc/will_show_tooltip() - if(alpha <= EFFECTIVE_INVIS) - return FALSE - return TRUE - -/mob/MouseEntered(location, control, params) - if(usr != src && usr.is_preference_enabled(/datum/client_preference/mob_tooltips) && src.will_show_tooltip()) - openToolTip(user = usr, tip_src = src, params = params, title = get_nametag_name(usr), content = get_nametag_desc(usr)) - - ..() - -/mob/MouseDown() - closeToolTip(usr) //No reason not to, really - - ..() - -/mob/MouseExited() - closeToolTip(usr) //No reason not to, really - - ..() - -// Manages a global list of mobs with clients attached, indexed by z-level. -/mob/proc/update_client_z(new_z) // +1 to register, null to unregister. - if(registered_z != new_z) - if(registered_z) - GLOB.players_by_zlevel[registered_z] -= src - if(client) - if(new_z) - GLOB.players_by_zlevel[new_z] += src - registered_z = new_z - else - registered_z = null - -GLOBAL_LIST_EMPTY_TYPED(living_players_by_zlevel, /list) -/mob/living/update_client_z(new_z) - var/precall_reg_z = registered_z - . = ..() // will update registered_z if necessary - if(precall_reg_z != registered_z) // parent did work, let's do work too - if(precall_reg_z) - GLOB.living_players_by_zlevel[precall_reg_z] -= src - if(registered_z) - GLOB.living_players_by_zlevel[registered_z] += src - -/mob/onTransitZ(old_z, new_z) - ..() - update_client_z(new_z) - -/mob/cloak() - . = ..() - if(client && cloaked_selfimage) - client.images += cloaked_selfimage - -/mob/uncloak() - if(client && cloaked_selfimage) - client.images -= cloaked_selfimage - return ..() - -/mob/get_cloaked_selfimage() - var/icon/selficon = getCompoundIcon(src) - selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White - var/image/selfimage = image(selficon) - selfimage.color = "#0000FF" - selfimage.alpha = 100 - selfimage.layer = initial(layer) - selfimage.plane = initial(plane) - selfimage.loc = src - - return selfimage - -/mob/proc/GetAltName() - return "" - -/mob/proc/get_ghost(even_if_they_cant_reenter = 0) - if(mind) - return mind.get_ghost(even_if_they_cant_reenter) - -/mob/proc/grab_ghost(force) - if(mind) - return mind.grab_ghost(force = force) ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt From f5a64aae10aa197a0ed351910825c8efeb7b4842 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:21:25 -0400 Subject: [PATCH 80/86] powder that makes you say yes --- code/modules/nifsoft/software/05_health.dm | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/code/modules/nifsoft/software/05_health.dm b/code/modules/nifsoft/software/05_health.dm index 83503ee2f1..5e213781fa 100644 --- a/code/modules/nifsoft/software/05_health.dm +++ b/code/modules/nifsoft/software/05_health.dm @@ -115,23 +115,9 @@ //Needs fixing W << 'sound/voice/nifmedsynth_injured.ogg' //CHOMP Add activate() -<<<<<<< HEAD - for(var/eo in nif.human.bad_external_organs) - var/obj/item/organ/external/EO = eo - for(var/w in EO.wounds) - var/datum/wound/W = w - if(W.damage <= 30) // Chomp Edit // The current limb break threshold. -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt - for(var/eo in nif.human.bad_external_organs) - var/obj/item/organ/external/EO = eo - for(var/w in EO.wounds) - var/datum/wound/W = w - if(W.damage <= 5) -======= for(var/obj/item/organ/external/EO as anything in nif.human.bad_external_organs) for(var/datum/wound/W as anything in EO.wounds) - if(W.damage <= 5) ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt + if(W.damage <= 30) // Chomp Edit // The current limb break threshold. W.heal_damage(0.1) EO.update_damages() if(EO.update_icon()) From 6db26de8ce4a09343ec206f08b2d992256adf5e7 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:23:09 -0400 Subject: [PATCH 81/86] powder that makes you say yes --- code/modules/reagents/holder/holder.dm | 1038 +----------------------- 1 file changed, 7 insertions(+), 1031 deletions(-) diff --git a/code/modules/reagents/holder/holder.dm b/code/modules/reagents/holder/holder.dm index 6bde5e8508..75ad9defcb 100644 --- a/code/modules/reagents/holder/holder.dm +++ b/code/modules/reagents/holder/holder.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD #define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times /datum/reagents @@ -86,20 +85,17 @@ var/list/effect_reactions = list() do reaction_occurred = FALSE - for(var/i in reagent_list) - var/datum/reagent/R = i + for(var/datum/reagent/R as anything in reagent_list) if(SSchemistry.instant_reactions_by_reagent[R.id]) eligible_reactions |= SSchemistry.instant_reactions_by_reagent[R.id] - for(var/i in eligible_reactions) - var/decl/chemical_reaction/C = i + for(var/decl/chemical_reaction/C as anything in eligible_reactions) if(C.can_happen(src) && C.process(src)) effect_reactions |= C reaction_occurred = TRUE eligible_reactions.len = 0 while(reaction_occurred) - for(var/i in effect_reactions) - var/decl/chemical_reaction/C = i + for(var/decl/chemical_reaction/C as anything in effect_reactions) C.post_reaction(src) update_total() @@ -146,8 +142,7 @@ return 0 /datum/reagents/proc/isolate_reagent(reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A + for(var/datum/reagent/R as anything in reagent_list) if(R.id != reagent) del_reagent(R.id) update_total() @@ -485,19 +480,17 @@ objs += O if (objs.len) var/objportion = (amount * 0.2) / objs.len - for (var/o in objs) - var/obj/O = o + for(var/obj/O as anything in objs) trans_to(O, objportion, multiplier, copy) amount = min(amount, total_volume) if (mobs.len) var/mobportion = (amount * 0.5) / mobs.len - for (var/m in mobs) - var/mob/M = m + for(var/mob/M as anything in mobs) trans_to(M, mobportion, multiplier, copy) trans_to(T, total_volume, multiplier, copy) if (total_volume <= 0) qdel(src) - + /** * Calls [/datum/reagent/proc/on_update] on every reagent in this holder * @@ -509,1020 +502,3 @@ for(var/datum/reagent/reagent as anything in cached_reagents) reagent.on_update(A) update_total() -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt -#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times - -/datum/reagents - var/list/datum/reagent/reagent_list = list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - -/datum/reagents/New(var/max = 100, atom/A = null) - ..() - maximum_volume = max - my_atom = A - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!SSchemistry.chemical_reagents) - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - var/paths = subtypesof(/datum/reagent) - SSchemistry.chemical_reagents = list() - for(var/path in paths) - var/datum/reagent/D = new path() - if(!D.name) - continue - SSchemistry.chemical_reagents[D.id] = D - -/datum/reagents/Destroy() - for(var/datum/reagent/R in reagent_list) - qdel(R) - reagent_list = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - return ..() - -/* Internal procs */ - -/datum/reagents/proc/get_free_space() // Returns free space. - return maximum_volume - total_volume - -/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume. - var/the_reagent = null - var/the_volume = 0 - - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_reagent = A - - return the_reagent - -/datum/reagents/proc/get_master_reagent_name() // Returns the name of the reagent with the biggest volume. - var/the_name = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_name = A.name - - return the_name - -/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. - var/the_id = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_id = A.id - - return the_id - -/datum/reagents/proc/update_total() // Updates volume. - total_volume = 0 - for(var/datum/reagent/R in reagent_list) - if(R.volume < MINIMUM_CHEMICAL_VOLUME) - del_reagent(R.id) - else - total_volume += R.volume - return - -/datum/reagents/proc/handle_reactions() - if(QDELETED(my_atom)) - return FALSE - if(my_atom.flags & NOREACT) - return FALSE - var/reaction_occurred - var/list/eligible_reactions = list() - var/list/effect_reactions = list() - do - reaction_occurred = FALSE - for(var/i in reagent_list) - var/datum/reagent/R = i - if(SSchemistry.instant_reactions_by_reagent[R.id]) - eligible_reactions |= SSchemistry.instant_reactions_by_reagent[R.id] - - for(var/i in eligible_reactions) - var/decl/chemical_reaction/C = i - if(C.can_happen(src) && C.process(src)) - effect_reactions |= C - reaction_occurred = TRUE - eligible_reactions.len = 0 - while(reaction_occurred) - for(var/i in effect_reactions) - var/decl/chemical_reaction/C = i - C.post_reaction(src) - update_total() - -/* Holder-to-chemical */ - -/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0) - if(!isnum(amount) || amount <= 0) - return 0 - - update_total() - amount = min(amount, get_free_space()) - - - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - if(current.id == "blood") - if(LAZYLEN(data) && !isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container. - continue - - current.volume += amount - if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful - current.mix_data(data, amount) - update_total() - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - var/datum/reagent/D = SSchemistry.chemical_reagents[id] - if(D) - var/datum/reagent/R = new D.type() - reagent_list += R - R.holder = src - R.volume = amount - R.initialize_data(data) - update_total() - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - else - stack_trace("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") - return 0 - -/datum/reagents/proc/isolate_reagent(reagent) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) - if(!isnum(amount)) - return 0 - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - current.volume -= amount // It can go negative, but it doesn't matter - update_total() // Because this proc will delete it then - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - return 0 - -/datum/reagents/proc/del_reagent(var/id) - for(var/datum/reagent/current in reagent_list) - if (current.id == id) - reagent_list -= current - qdel(current) - update_total() - if(my_atom) - my_atom.on_reagent_change() - return 0 - -/datum/reagents/proc/has_reagent(var/id, var/amount = 0) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - if(current.volume >= amount) - return 1 - else - return 0 - return 0 - -/datum/reagents/proc/has_any_reagent(var/list/check_reagents) - for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) - return 1 - else - return 0 - return 0 - -/datum/reagents/proc/has_all_reagents(var/list/check_reagents) - //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list - var/missing = check_reagents.len - for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) - missing-- - return !missing - -/datum/reagents/proc/clear_reagents() - for(var/datum/reagent/current in reagent_list) - del_reagent(current.id) - return - -/datum/reagents/proc/get_reagent_amount(var/id) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - return current.volume - return 0 - -/datum/reagents/proc/get_data(var/id) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - return current.get_data() - return 0 - -/datum/reagents/proc/get_reagents() - . = list() - for(var/datum/reagent/current in reagent_list) - . += "[current.id] ([current.volume])" - return english_list(., "EMPTY", "", ", ", ", ") - -/* Holder-to-holder and similar procs */ - -/datum/reagents/proc/remove_any(var/amount = 1) // Removes up to [amount] of reagents from [src]. Returns actual amount removed. - amount = min(amount, total_volume) - - if(!amount) - return - - var/part = amount / total_volume - - for(var/datum/reagent/current in reagent_list) - var/amount_to_remove = current.volume * part - remove_reagent(current.id, amount_to_remove, 1) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). - if(!target || !istype(target)) - return - - amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier)) - - if(!amount) - return - - var/part = amount / total_volume - - for(var/datum/reagent/current in reagent_list) - var/amount_to_transfer = current.volume * part - target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place - if(!copy) - remove_reagent(current.id, amount_to_transfer, 1) - - if(!copy) - handle_reactions() - target.handle_reactions() - return amount - -/* Holder-to-atom and similar procs */ - -//The general proc for applying reagents to things. This proc assumes the reagents are being applied externally, -//not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). -//If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), -//call the appropriate trans_to_*() proc. -/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) - touch(target) //First, handle mere touch effects - - if(ismob(target)) - return splash_mob(target, amount, copy) - if(isturf(target)) - return trans_to_turf(target, amount, multiplier, copy) - if(isobj(target) && target.is_open_container()) - return trans_to_obj(target, amount, multiplier, copy) - return 0 - -//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. -/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) - var/spill = 0 - if(!isturf(target) && target.loc) - spill = amount*(rand(min_spill, max_spill)/100) - amount -= spill - if(spill) - splash(target.loc, spill, multiplier, copy, min_spill, max_spill) - - if(!trans_to(target, amount, multiplier, copy)) - touch(target, amount) - -/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) - if (!target) - return - - var/datum/reagent/transfering_reagent = get_reagent(rtype) - - if (istype(target, /atom)) - var/atom/A = target - if (!A.reagents || !A.simulated) - return - - amount = min(amount, transfering_reagent.volume) - - if(!amount) - return - - - var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(rtype) - F.add_reagent(rtype, amount, tmpdata) - remove_reagent(rtype, amount) - - - if (istype(target, /atom)) - return F.trans_to(target, amount) // Let this proc check the atom's type - else if (istype(target, /datum/reagents)) - return F.trans_to_holder(target, amount) - -/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) - if (!target || !target.reagents) - return - - amount = min(amount, get_reagent_amount(id)) - - if(!amount) - return - - var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(id) - F.add_reagent(id, amount, tmpdata) - remove_reagent(id, amount) - - return F.trans_to(target, amount) // Let this proc check the atom's type - -// When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. -// This does not handle transferring reagents to things. -// For example, splashing someone with water will get them wet and extinguish them if they are on fire, -// even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. -/datum/reagents/proc/touch(var/atom/target, var/amount) - if(ismob(target)) - touch_mob(target, amount) - if(isturf(target)) - touch_turf(target, amount) - if(isobj(target)) - touch_obj(target, amount) - return - -/datum/reagents/proc/touch_mob(var/mob/target) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_mob(target, current.volume) - - update_total() - -/datum/reagents/proc/touch_turf(var/turf/target, var/amount) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_turf(target, amount) - - update_total() - -/datum/reagents/proc/touch_obj(var/obj/target, var/amount) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_obj(target, amount) - - update_total() - -// Attempts to place a reagent on the mob's skin. -// Reagents are not guaranteed to transfer to the target. -// Do not call this directly, call trans_to() instead. -/datum/reagents/proc/splash_mob(var/mob/target, var/amount = 1, var/copy = 0) - var/perm = 1 - if(isliving(target)) //will we ever even need to tranfer reagents to non-living mobs? - var/mob/living/L = target - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(0, null, null, null, "the spray") == 1) //If they block the spray, it does nothing. - amount = 0 - perm = L.reagent_permeability() - return trans_to_mob(target, amount, CHEM_TOUCH, perm, copy) - -/datum/reagents/proc/trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0) // Transfer after checking into which holder... - if(!target || !istype(target)) - return - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(type == CHEM_BLOOD) - var/datum/reagents/R = C.reagents - return trans_to_holder(R, amount, multiplier, copy) - if(type == CHEM_INGEST) - var/datum/reagents/R = C.ingested - return C.ingest(src, R, amount, multiplier, copy) - if(type == CHEM_TOUCH) - var/datum/reagents/R = C.touching - return trans_to_holder(R, amount, multiplier, copy) - else - var/datum/reagents/R = new /datum/reagents(amount) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_mob(target) - -/datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. - if(!target) - return - - var/datum/reagents/R = new /datum/reagents(amount * multiplier) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_turf(target, amount) - return - -/datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. - if(!target) - return - - if(!target.reagents) - var/datum/reagents/R = new /datum/reagents(amount * multiplier) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_obj(target, amount) - return - - return trans_to_holder(target.reagents, amount, multiplier, copy) - -/* Atom reagent creation - use it all the time */ - -/atom/proc/create_reagents(var/max_vol, var/reagents_type = /datum/reagents) - if(!ispath(reagents_type)) - reagents_type = /datum/reagents - reagents = new reagents_type(max_vol, src) - -// Aurora Cooking Port -/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID - for(var/datum/reagent/A in reagent_list) - if (A.id == id) - return A - - return null - -//Spreads the contents of this reagent holder all over the vicinity of the target turf. -/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0) - var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING) - var/list/turfs = list() - for (var/turf/T in things) - turfs += T - if (!turfs.len) - return//Nowhere to splash to, somehow - //Create a temporary holder to hold all the amount that will be spread - var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier) - trans_to_holder(R, total_volume * portion, multiplier, copy) - //The exact amount that will be given to each turf - var/turfportion = R.total_volume / turfs.len - for (var/turf/T in turfs) - var/datum/reagents/TR = new /datum/reagents(turfportion) - R.trans_to_holder(TR, turfportion, 1, 0) - TR.splash_turf(T) - qdel(R) - - -//Spreads the contents of this reagent holder all over the target turf, dividing among things in it. -//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself -/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0) - if (isnull(amount)) - amount = total_volume - else - amount = min(amount, total_volume) - if (amount <= 0) - return - var/list/mobs = list() - for (var/mob/M in T) - mobs += M - var/list/objs = list() - for (var/obj/O in T) - objs += O - if (objs.len) - var/objportion = (amount * 0.2) / objs.len - for (var/o in objs) - var/obj/O = o - trans_to(O, objportion, multiplier, copy) - amount = min(amount, total_volume) - if (mobs.len) - var/mobportion = (amount * 0.5) / mobs.len - for (var/m in mobs) - var/mob/M = m - trans_to(M, mobportion, multiplier, copy) - trans_to(T, total_volume, multiplier, copy) - if (total_volume <= 0) - qdel(src) - -/** - * Calls [/datum/reagent/proc/on_update] on every reagent in this holder - * - * Arguments: - * * atom/A - passed to on_update - */ -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/reagent as anything in cached_reagents) - reagent.on_update(A) - update_total() -======= -#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times - -/datum/reagents - var/list/datum/reagent/reagent_list = list() - var/total_volume = 0 - var/maximum_volume = 100 - var/atom/my_atom = null - -/datum/reagents/New(var/max = 100, atom/A = null) - ..() - maximum_volume = max - my_atom = A - - //I dislike having these here but map-objects are initialised before world/New() is called. >_> - if(!SSchemistry.chemical_reagents) - //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id - var/paths = subtypesof(/datum/reagent) - SSchemistry.chemical_reagents = list() - for(var/path in paths) - var/datum/reagent/D = new path() - if(!D.name) - continue - SSchemistry.chemical_reagents[D.id] = D - -/datum/reagents/Destroy() - for(var/datum/reagent/R in reagent_list) - qdel(R) - reagent_list = null - if(my_atom && my_atom.reagents == src) - my_atom.reagents = null - return ..() - -/* Internal procs */ - -/datum/reagents/proc/get_free_space() // Returns free space. - return maximum_volume - total_volume - -/datum/reagents/proc/get_master_reagent() // Returns reference to the reagent with the biggest volume. - var/the_reagent = null - var/the_volume = 0 - - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_reagent = A - - return the_reagent - -/datum/reagents/proc/get_master_reagent_name() // Returns the name of the reagent with the biggest volume. - var/the_name = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_name = A.name - - return the_name - -/datum/reagents/proc/get_master_reagent_id() // Returns the id of the reagent with the biggest volume. - var/the_id = null - var/the_volume = 0 - for(var/datum/reagent/A in reagent_list) - if(A.volume > the_volume) - the_volume = A.volume - the_id = A.id - - return the_id - -/datum/reagents/proc/update_total() // Updates volume. - total_volume = 0 - for(var/datum/reagent/R in reagent_list) - if(R.volume < MINIMUM_CHEMICAL_VOLUME) - del_reagent(R.id) - else - total_volume += R.volume - return - -/datum/reagents/proc/handle_reactions() - if(QDELETED(my_atom)) - return FALSE - if(my_atom.flags & NOREACT) - return FALSE - var/reaction_occurred - var/list/eligible_reactions = list() - var/list/effect_reactions = list() - do - reaction_occurred = FALSE - for(var/datum/reagent/R as anything in reagent_list) - if(SSchemistry.instant_reactions_by_reagent[R.id]) - eligible_reactions |= SSchemistry.instant_reactions_by_reagent[R.id] - - for(var/decl/chemical_reaction/C as anything in eligible_reactions) - if(C.can_happen(src) && C.process(src)) - effect_reactions |= C - reaction_occurred = TRUE - eligible_reactions.len = 0 - while(reaction_occurred) - for(var/decl/chemical_reaction/C as anything in effect_reactions) - C.post_reaction(src) - update_total() - -/* Holder-to-chemical */ - -/datum/reagents/proc/add_reagent(var/id, var/amount, var/data = null, var/safety = 0) - if(!isnum(amount) || amount <= 0) - return 0 - - update_total() - amount = min(amount, get_free_space()) - - - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - if(current.id == "blood") - if(LAZYLEN(data) && !isnull(data["species"]) && !isnull(current.data["species"]) && data["species"] != current.data["species"]) // Species bloodtypes are already incompatible, this just stops it from mixing into the one already in a container. - continue - - current.volume += amount - if(!isnull(data)) // For all we know, it could be zero or empty string and meaningful - current.mix_data(data, amount) - update_total() - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - var/datum/reagent/D = SSchemistry.chemical_reagents[id] - if(D) - var/datum/reagent/R = new D.type() - reagent_list += R - R.holder = src - R.volume = amount - R.initialize_data(data) - update_total() - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - else - stack_trace("[my_atom] attempted to add a reagent called '[id]' which doesn't exist. ([usr])") - return 0 - -/datum/reagents/proc/isolate_reagent(reagent) - for(var/datum/reagent/R as anything in reagent_list) - if(R.id != reagent) - del_reagent(R.id) - update_total() - -/datum/reagents/proc/remove_reagent(var/id, var/amount, var/safety = 0) - if(!isnum(amount)) - return 0 - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - current.volume -= amount // It can go negative, but it doesn't matter - update_total() // Because this proc will delete it then - if(!safety) - handle_reactions() - if(my_atom) - my_atom.on_reagent_change() - return 1 - return 0 - -/datum/reagents/proc/del_reagent(var/id) - for(var/datum/reagent/current in reagent_list) - if (current.id == id) - reagent_list -= current - qdel(current) - update_total() - if(my_atom) - my_atom.on_reagent_change() - return 0 - -/datum/reagents/proc/has_reagent(var/id, var/amount = 0) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - if(current.volume >= amount) - return 1 - else - return 0 - return 0 - -/datum/reagents/proc/has_any_reagent(var/list/check_reagents) - for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) - return 1 - else - return 0 - return 0 - -/datum/reagents/proc/has_all_reagents(var/list/check_reagents) - //this only works if check_reagents has no duplicate entries... hopefully okay since it expects an associative list - var/missing = check_reagents.len - for(var/datum/reagent/current in reagent_list) - if(current.id in check_reagents) - if(current.volume >= check_reagents[current.id]) - missing-- - return !missing - -/datum/reagents/proc/clear_reagents() - for(var/datum/reagent/current in reagent_list) - del_reagent(current.id) - return - -/datum/reagents/proc/get_reagent_amount(var/id) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - return current.volume - return 0 - -/datum/reagents/proc/get_data(var/id) - for(var/datum/reagent/current in reagent_list) - if(current.id == id) - return current.get_data() - return 0 - -/datum/reagents/proc/get_reagents() - . = list() - for(var/datum/reagent/current in reagent_list) - . += "[current.id] ([current.volume])" - return english_list(., "EMPTY", "", ", ", ", ") - -/* Holder-to-holder and similar procs */ - -/datum/reagents/proc/remove_any(var/amount = 1) // Removes up to [amount] of reagents from [src]. Returns actual amount removed. - amount = min(amount, total_volume) - - if(!amount) - return - - var/part = amount / total_volume - - for(var/datum/reagent/current in reagent_list) - var/amount_to_remove = current.volume * part - remove_reagent(current.id, amount_to_remove, 1) - - update_total() - handle_reactions() - return amount - -/datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). - if(!target || !istype(target)) - return - - amount = max(0, min(amount, total_volume, target.get_free_space() / multiplier)) - - if(!amount) - return - - var/part = amount / total_volume - - for(var/datum/reagent/current in reagent_list) - var/amount_to_transfer = current.volume * part - target.add_reagent(current.id, amount_to_transfer * multiplier, current.get_data(), safety = 1) // We don't react until everything is in place - if(!copy) - remove_reagent(current.id, amount_to_transfer, 1) - - if(!copy) - handle_reactions() - target.handle_reactions() - return amount - -/* Holder-to-atom and similar procs */ - -//The general proc for applying reagents to things. This proc assumes the reagents are being applied externally, -//not directly injected into the contents. It first calls touch, then the appropriate trans_to_*() or splash_mob(). -//If for some reason touch effects are bypassed (e.g. injecting stuff directly into a reagent container or person), -//call the appropriate trans_to_*() proc. -/datum/reagents/proc/trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0) - touch(target) //First, handle mere touch effects - - if(ismob(target)) - return splash_mob(target, amount, copy) - if(isturf(target)) - return trans_to_turf(target, amount, multiplier, copy) - if(isobj(target) && target.is_open_container()) - return trans_to_obj(target, amount, multiplier, copy) - return 0 - -//Splashing reagents is messier than trans_to, the target's loc gets some of the reagents as well. -/datum/reagents/proc/splash(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/min_spill=0, var/max_spill=60) - var/spill = 0 - if(!isturf(target) && target.loc) - spill = amount*(rand(min_spill, max_spill)/100) - amount -= spill - if(spill) - splash(target.loc, spill, multiplier, copy, min_spill, max_spill) - - if(!trans_to(target, amount, multiplier, copy)) - touch(target, amount) - -/datum/reagents/proc/trans_type_to(var/target, var/rtype, var/amount = 1) - if (!target) - return - - var/datum/reagent/transfering_reagent = get_reagent(rtype) - - if (istype(target, /atom)) - var/atom/A = target - if (!A.reagents || !A.simulated) - return - - amount = min(amount, transfering_reagent.volume) - - if(!amount) - return - - - var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(rtype) - F.add_reagent(rtype, amount, tmpdata) - remove_reagent(rtype, amount) - - - if (istype(target, /atom)) - return F.trans_to(target, amount) // Let this proc check the atom's type - else if (istype(target, /datum/reagents)) - return F.trans_to_holder(target, amount) - -/datum/reagents/proc/trans_id_to(var/atom/target, var/id, var/amount = 1) - if (!target || !target.reagents) - return - - amount = min(amount, get_reagent_amount(id)) - - if(!amount) - return - - var/datum/reagents/F = new /datum/reagents(amount) - var/tmpdata = get_data(id) - F.add_reagent(id, amount, tmpdata) - remove_reagent(id, amount) - - return F.trans_to(target, amount) // Let this proc check the atom's type - -// When applying reagents to an atom externally, touch() is called to trigger any on-touch effects of the reagent. -// This does not handle transferring reagents to things. -// For example, splashing someone with water will get them wet and extinguish them if they are on fire, -// even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. -/datum/reagents/proc/touch(var/atom/target, var/amount) - if(ismob(target)) - touch_mob(target, amount) - if(isturf(target)) - touch_turf(target, amount) - if(isobj(target)) - touch_obj(target, amount) - return - -/datum/reagents/proc/touch_mob(var/mob/target) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_mob(target, current.volume) - - update_total() - -/datum/reagents/proc/touch_turf(var/turf/target, var/amount) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_turf(target, amount) - - update_total() - -/datum/reagents/proc/touch_obj(var/obj/target, var/amount) - if(!target || !istype(target)) - return - - for(var/datum/reagent/current in reagent_list) - current.touch_obj(target, amount) - - update_total() - -// Attempts to place a reagent on the mob's skin. -// Reagents are not guaranteed to transfer to the target. -// Do not call this directly, call trans_to() instead. -/datum/reagents/proc/splash_mob(var/mob/target, var/amount = 1, var/copy = 0) - var/perm = 1 - if(isliving(target)) //will we ever even need to tranfer reagents to non-living mobs? - var/mob/living/L = target - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(0, null, null, null, "the spray") == 1) //If they block the spray, it does nothing. - amount = 0 - perm = L.reagent_permeability() - return trans_to_mob(target, amount, CHEM_TOUCH, perm, copy) - -/datum/reagents/proc/trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0) // Transfer after checking into which holder... - if(!target || !istype(target)) - return - if(iscarbon(target)) - var/mob/living/carbon/C = target - if(type == CHEM_BLOOD) - var/datum/reagents/R = C.reagents - return trans_to_holder(R, amount, multiplier, copy) - if(type == CHEM_INGEST) - var/datum/reagents/R = C.ingested - return C.ingest(src, R, amount, multiplier, copy) - if(type == CHEM_TOUCH) - var/datum/reagents/R = C.touching - return trans_to_holder(R, amount, multiplier, copy) - else - var/datum/reagents/R = new /datum/reagents(amount) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_mob(target) - -/datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. - if(!target) - return - - var/datum/reagents/R = new /datum/reagents(amount * multiplier) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_turf(target, amount) - return - -/datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. - if(!target) - return - - if(!target.reagents) - var/datum/reagents/R = new /datum/reagents(amount * multiplier) - . = trans_to_holder(R, amount, multiplier, copy) - R.touch_obj(target, amount) - return - - return trans_to_holder(target.reagents, amount, multiplier, copy) - -/* Atom reagent creation - use it all the time */ - -/atom/proc/create_reagents(var/max_vol, var/reagents_type = /datum/reagents) - if(!ispath(reagents_type)) - reagents_type = /datum/reagents - reagents = new reagents_type(max_vol, src) - -// Aurora Cooking Port -/datum/reagents/proc/get_reagent(var/id) // Returns reference to reagent matching passed ID - for(var/datum/reagent/A in reagent_list) - if (A.id == id) - return A - - return null - -//Spreads the contents of this reagent holder all over the vicinity of the target turf. -/datum/reagents/proc/splash_area(var/turf/epicentre, var/range = 3, var/portion = 1.0, var/multiplier = 1, var/copy = 0) - var/list/things = dview(range, epicentre, INVISIBILITY_LIGHTING) - var/list/turfs = list() - for (var/turf/T in things) - turfs += T - if (!turfs.len) - return//Nowhere to splash to, somehow - //Create a temporary holder to hold all the amount that will be spread - var/datum/reagents/R = new /datum/reagents(total_volume * portion * multiplier) - trans_to_holder(R, total_volume * portion, multiplier, copy) - //The exact amount that will be given to each turf - var/turfportion = R.total_volume / turfs.len - for (var/turf/T in turfs) - var/datum/reagents/TR = new /datum/reagents(turfportion) - R.trans_to_holder(TR, turfportion, 1, 0) - TR.splash_turf(T) - qdel(R) - - -//Spreads the contents of this reagent holder all over the target turf, dividing among things in it. -//50% is divided between mobs, 20% between objects, and whatever is left on the turf itself -/datum/reagents/proc/splash_turf(var/turf/T, var/amount = null, var/multiplier = 1, var/copy = 0) - if (isnull(amount)) - amount = total_volume - else - amount = min(amount, total_volume) - if (amount <= 0) - return - var/list/mobs = list() - for (var/mob/M in T) - mobs += M - var/list/objs = list() - for (var/obj/O in T) - objs += O - if (objs.len) - var/objportion = (amount * 0.2) / objs.len - for(var/obj/O as anything in objs) - trans_to(O, objportion, multiplier, copy) - amount = min(amount, total_volume) - if (mobs.len) - var/mobportion = (amount * 0.5) / mobs.len - for(var/mob/M as anything in mobs) - trans_to(M, mobportion, multiplier, copy) - trans_to(T, total_volume, multiplier, copy) - if (total_volume <= 0) - qdel(src) - -/** - * Calls [/datum/reagent/proc/on_update] on every reagent in this holder - * - * Arguments: - * * atom/A - passed to on_update - */ -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/reagent as anything in cached_reagents) - reagent.on_update(A) - update_total() ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt From ba26ae8c3ee9fa507025c8725215451e653c1ee2 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:23:57 -0400 Subject: [PATCH 82/86] powder that makes you say yes --- code/modules/shuttles/shuttle_console.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 7371fa71b9..53f8c1b734 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -151,15 +151,7 @@ GLOBAL_LIST_BOILERPLATE(papers_dockingcode, /obj/item/weapon/paper/dockingcodes) /hook/roundstart/proc/populate_dockingcodes() -<<<<<<< HEAD - for(var/paper in GLOB.papers_dockingcode) - var/obj/item/weapon/paper/dockingcodes/dcp = paper -||||||| parent of 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt - for(var/paper in global.papers_dockingcode) - var/obj/item/weapon/paper/dockingcodes/dcp = paper -======= for(var/obj/item/weapon/paper/dockingcodes/dcp as anything in global.papers_dockingcode) ->>>>>>> 0dcdc6d7d5... Merge pull request #11179 from VOREStation/Arokha/opt dcp.populate_info() return TRUE From c399d6a682cca53dc44857388a10568c93a093ce Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:28:09 -0400 Subject: [PATCH 83/86] powder that makes you say yes --- code/game/machinery/pointdefense.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index 4413917d3a..b4cfce40d5 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) . = ..() if(id_tag) //No more than 1 controller please. - for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers) + for(var/obj/machinery/pointdefense_control/PC as anything in GLOB.pointdefense_controllers) if(PC != src && PC.id_tag == id_tag) warning("Two [src] with the same id_tag of [id_tag]") id_tag = null @@ -100,7 +100,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) var/new_ident = input(user, "Enter a new ident tag.", "[src]", id_tag) as null|text if(new_ident && new_ident != id_tag && user.Adjacent(src) && CanInteract(user, GLOB.tgui_physical_state)) // Check for duplicate controllers with this ID - for(var/obj/machinery/pointdefense_control/PC as anything in pointdefense_controllers) + for(var/obj/machinery/pointdefense_control/PC as anything in GLOB.pointdefense_controllers) if(PC != src && PC.id_tag == id_tag) to_chat(user, "The [new_ident] network already has a controller.") return @@ -206,7 +206,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense) if(!id_tag) return null var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) - for(var/obj/machinery/pointdefense_control/PDC as anything in pointdefense_controllers) + for(var/obj/machinery/pointdefense_control/PDC as anything in GLOB.pointdefense_controllers) if(PDC.id_tag == id_tag && (get_z(PDC) in connected_z_levels)) return PDC From 0379d88acb38892315db458fe8e5a2e8e118083f Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Tue, 20 Jul 2021 21:35:28 -0400 Subject: [PATCH 84/86] powder that makes you say yes --- code/modules/shuttles/shuttle_console.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 53f8c1b734..5f4dda17be 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -151,7 +151,7 @@ GLOBAL_LIST_BOILERPLATE(papers_dockingcode, /obj/item/weapon/paper/dockingcodes) /hook/roundstart/proc/populate_dockingcodes() - for(var/obj/item/weapon/paper/dockingcodes/dcp as anything in global.papers_dockingcode) + for(var/obj/item/weapon/paper/dockingcodes/dcp as anything in GLOB.papers_dockingcode) dcp.populate_info() return TRUE From 8ef55d362b647f3200f48e26a576bdcd8b3cafe4 Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Wed, 21 Jul 2021 01:20:44 -0400 Subject: [PATCH 85/86] Merge pull request #11194 from VOREStation/vplk-diagonal-move-falls Fix falling when moving diagonally past an open space. --- code/modules/multiz/movement.dm | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index bcf36f0c43..3c87480a5c 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -265,7 +265,7 @@ return //VOREStation Edit End - if(can_fall()) + if(can_fall() && can_fall_to(below)) // We spawn here to let the current move operation complete before we start falling. fall() is normally called from // Entered() which is part of Move(), by spawn()ing we let that complete. But we want to preserve if we were in client movement // or normal movement so other move behavior can continue. @@ -318,6 +318,18 @@ if(..()) return species.can_fall(src) +// Another check that we probably can just merge into can_fall exept for messing up overrides +/atom/movable/proc/can_fall_to(turf/landing) + // Check if there is anything in our turf we are standing on to prevent falling. + for(var/obj/O in loc) + if(!O.CanFallThru(src, landing)) + return FALSE + // See if something in turf below prevents us from falling into it. + for(var/atom/A in landing) + if(!A.CanPass(src, src.loc, 1, 0)) + return FALSE + return TRUE + // Check if this atom prevents things standing on it from falling. Return TRUE to allow the fall. /obj/proc/CanFallThru(atom/movable/mover as mob|obj, turf/target as turf) if(!isturf(mover.loc)) // VORESTATION EDIT. We clearly didn't have enough backup checks. @@ -357,15 +369,6 @@ /atom/movable/proc/handle_fall(var/turf/landing) var/turf/oldloc = loc - // Check if there is anything in our turf we are standing on to prevent falling. - for(var/obj/O in loc) - if(!O.CanFallThru(src, landing)) - return FALSE - // See if something in turf below prevents us from falling into it. - for(var/atom/A in landing) - if(!A.CanPass(src, src.loc, 1, 0)) - return FALSE - // Now lets move there! if(!Move(landing)) return 1