diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index d2508b3e..858b8dbd 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -113,7 +113,7 @@
name = "Show Buttons"
else
name = "Hide Buttons"
- UpdateIcon()
+ update_icon()
usr.update_action_buttons()
/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user)
@@ -135,9 +135,9 @@
hide_icon = settings["toggle_icon"]
hide_state = settings["toggle_hide"]
show_state = settings["toggle_show"]
- UpdateIcon()
+ update_icon()
-/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon()
+/obj/screen/movable/action_button/hide_toggle/update_icon()
cut_overlays()
add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state))
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 49bdd3f3..93c3b63d 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -195,89 +195,107 @@
// Language menu
using = new /obj/screen/language_menu
using.screen_loc = ui_borg_language_menu
+ using.hud = src
static_inventory += using
//AI core
using = new /obj/screen/ai/aicore()
using.screen_loc = ui_ai_core
+ using.hud = src
static_inventory += using
//Camera list
using = new /obj/screen/ai/camera_list()
using.screen_loc = ui_ai_camera_list
+ using.hud = src
static_inventory += using
//Track
using = new /obj/screen/ai/camera_track()
using.screen_loc = ui_ai_track_with_camera
+ using.hud = src
static_inventory += using
//Camera light
using = new /obj/screen/ai/camera_light()
using.screen_loc = ui_ai_camera_light
+ using.hud = src
static_inventory += using
//Crew Monitoring
using = new /obj/screen/ai/crew_monitor()
using.screen_loc = ui_ai_crew_monitor
+ using.hud = src
static_inventory += using
//Crew Manifest
using = new /obj/screen/ai/crew_manifest()
using.screen_loc = ui_ai_crew_manifest
+ using.hud = src
static_inventory += using
//Alerts
using = new /obj/screen/ai/alerts()
using.screen_loc = ui_ai_alerts
+ using.hud = src
static_inventory += using
//Announcement
using = new /obj/screen/ai/announcement()
using.screen_loc = ui_ai_announcement
+ using.hud = src
static_inventory += using
//Shuttle
using = new /obj/screen/ai/call_shuttle()
using.screen_loc = ui_ai_shuttle
+ using.hud = src
static_inventory += using
//Laws
using = new /obj/screen/ai/state_laws()
using.screen_loc = ui_ai_state_laws
+ using.hud = src
static_inventory += using
//PDA message
using = new /obj/screen/ai/pda_msg_send()
using.screen_loc = ui_ai_pda_send
+ using.hud = src
static_inventory += using
//PDA log
using = new /obj/screen/ai/pda_msg_show()
using.screen_loc = ui_ai_pda_log
+ using.hud = src
static_inventory += using
//Take image
using = new /obj/screen/ai/image_take()
using.screen_loc = ui_ai_take_picture
+ using.hud = src
static_inventory += using
//View images
using = new /obj/screen/ai/image_view()
using.screen_loc = ui_ai_view_images
+ using.hud = src
static_inventory += using
//Medical/Security sensors
using = new /obj/screen/ai/sensors()
using.screen_loc = ui_ai_sensor
+ using.hud = src
static_inventory += using
//Multicamera mode
using = new /obj/screen/ai/multicam()
using.screen_loc = ui_ai_multicam
+ using.hud = src
static_inventory += using
//Add multicamera camera
using = new /obj/screen/ai/add_multicam()
using.screen_loc = ui_ai_add_multicam
+ using.hud = src
static_inventory += using
diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm
index 1f6ba283..94585cbd 100644
--- a/code/_onclick/hud/alien.dm
+++ b/code/_onclick/hud/alien.dm
@@ -43,18 +43,20 @@
using.icon = ui_style
using.icon_state = "swap_1"
using.screen_loc = ui_swaphand_position(owner,1)
+ using.hud = src
static_inventory += using
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
+ using.hud = src
static_inventory += using
- using = new /obj/screen/act_intent/alien()
- using.icon_state = mymob.a_intent
- static_inventory += using
- action_intent = using
+ action_intent = new /obj/screen/act_intent/alien()
+ action_intent.icon_state = mymob.a_intent
+ action_intent.hud = src
+ static_inventory += action_intent
if(isalienhunter(mymob))
var/mob/living/carbon/alien/humanoid/hunter/H = mymob
@@ -64,43 +66,52 @@
using = new/obj/screen/language_menu
using.screen_loc = ui_alien_language_menu
+ using.hud = src
static_inventory += using
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drop_throw
+ using.hud = src
static_inventory += using
using = new /obj/screen/resist()
using.icon = ui_style
using.screen_loc = ui_pull_resist
+ using.hud = src
hotkeybuttons += using
throw_icon = new /obj/screen/throw_catch()
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
+ throw_icon.hud = src
hotkeybuttons += throw_icon
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
+ pull_icon.hud = src
+ pull_icon.update_icon()
pull_icon.screen_loc = ui_pull_resist
static_inventory += pull_icon
//begin indicators
healths = new /obj/screen/healths/alien()
+ healths.hud = src
infodisplay += healths
alien_plasma_display = new /obj/screen/alien/plasma_display()
+ alien_plasma_display.hud = src
infodisplay += alien_plasma_display
if(!isalienqueen(mymob))
alien_queen_finder = new /obj/screen/alien/alien_queen_finder
+ alien_queen_finder.hud = src
infodisplay += alien_queen_finder
zone_select = new /obj/screen/zone_sel/alien()
- zone_select.update_icon(mymob)
+ zone_select.hud = src
+ zone_select.update_icon()
static_inventory += zone_select
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index 3ffdd66f..0f3c6ccf 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -5,26 +5,32 @@
..()
var/obj/screen/using
- using = new /obj/screen/act_intent/alien()
- using.icon_state = mymob.a_intent
- static_inventory += using
- action_intent = using
+ action_intent = new /obj/screen/act_intent/alien()
+ action_intent.icon_state = mymob.a_intent
+ action_intent.hud = src
+ static_inventory += action_intent
healths = new /obj/screen/healths/alien()
+ healths.hud = src
infodisplay += healths
alien_queen_finder = new /obj/screen/alien/alien_queen_finder()
+ alien_queen_finder.hud = src
infodisplay += alien_queen_finder
+
pull_icon = new /obj/screen/pull()
pull_icon.icon = 'icons/mob/screen_alien.dmi'
- pull_icon.update_icon(mymob)
+ pull_icon.hud = src
+ pull_icon.update_icon()
pull_icon.screen_loc = ui_pull_resist
hotkeybuttons += pull_icon
using = new/obj/screen/language_menu
using.screen_loc = ui_alien_language_menu
+ using.hud = src
static_inventory += using
zone_select = new /obj/screen/zone_sel/alien()
- zone_select.update_icon(mymob)
+ zone_select.hud = src
+ zone_select.update_icon()
static_inventory += zone_select
diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index ab8bc459..8257b744 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -133,17 +133,21 @@
blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
blobpwrdisplay.layer = ABOVE_HUD_LAYER
blobpwrdisplay.plane = ABOVE_HUD_PLANE
+ blobpwrdisplay.hud = src
infodisplay += blobpwrdisplay
healths = new /obj/screen/healths/blob()
+ healths.hud = src
infodisplay += healths
using = new /obj/screen/blob/BlobHelp()
using.screen_loc = "WEST:6,NORTH:-3"
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/JumpToNode()
using.screen_loc = ui_inventory
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/JumpToCore()
@@ -153,18 +157,22 @@
using = new /obj/screen/blob/Blobbernaut()
using.screen_loc = ui_belt
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/ResourceBlob()
using.screen_loc = ui_back
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/NodeBlob()
using.screen_loc = ui_hand_position(2)
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/FactoryBlob()
using.screen_loc = ui_hand_position(1)
+ using.hud = src
static_inventory += using
using = new /obj/screen/blob/ReadaptChemical()
@@ -174,4 +182,5 @@
using = new /obj/screen/blob/RelocateCore()
using.screen_loc = ui_storage2
+ using.hud = src
static_inventory += using
diff --git a/code/_onclick/hud/blobbernauthud.dm b/code/_onclick/hud/blobbernauthud.dm
index 17d3b11a..ed45d5b1 100644
--- a/code/_onclick/hud/blobbernauthud.dm
+++ b/code/_onclick/hud/blobbernauthud.dm
@@ -3,7 +3,9 @@
..()
blobpwrdisplay = new /obj/screen/healths/blob/naut/core()
+ blobpwrdisplay.hud = src
infodisplay += blobpwrdisplay
healths = new /obj/screen/healths/blob/naut()
+ healths.hud = src
infodisplay += healths
diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm
index 182495c2..06e657d1 100644
--- a/code/_onclick/hud/constructs.dm
+++ b/code/_onclick/hud/constructs.dm
@@ -5,9 +5,11 @@
..()
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
+ pull_icon.hud = src
+ pull_icon.update_icon()
pull_icon.screen_loc = ui_construct_pull
static_inventory += pull_icon
healths = new /obj/screen/healths/construct()
+ healths.hud = src
infodisplay += healths
diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm
index 40fdc37d..fd214642 100644
--- a/code/_onclick/hud/devil.dm
+++ b/code/_onclick/hud/devil.dm
@@ -9,11 +9,13 @@
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drone_drop
+ using.hud = src
static_inventory += using
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
+ pull_icon.hud = src
+ pull_icon.update_icon()
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
@@ -26,6 +28,7 @@
using.screen_loc = ui_swaphand_position(owner,1)
using.layer = HUD_LAYER
using.plane = HUD_PLANE
+ using.hud = src
static_inventory += using
using = new /obj/screen/inventory()
@@ -35,14 +38,19 @@
using.screen_loc = ui_swaphand_position(owner,2)
using.layer = HUD_LAYER
using.plane = HUD_PLANE
+ using.hud = src
static_inventory += using
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
- zone_select.update_icon(mymob)
+ zone_select.hud = src
+ zone_select.update_icon()
lingchemdisplay = new /obj/screen/ling/chems()
+ lingchemdisplay.hud = src
+
devilsouldisplay = new /obj/screen/devil/soul_counter
+ devilsouldisplay.hud = src
infodisplay += devilsouldisplay
diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm
index ad8eb775..e9f325fb 100644
--- a/code/_onclick/hud/generic_dextrous.dm
+++ b/code/_onclick/hud/generic_dextrous.dm
@@ -6,11 +6,13 @@
using = new /obj/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drone_drop
+ using.hud = src
static_inventory += using
pull_icon = new /obj/screen/pull()
pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
+ pull_icon.hud = src
+ pull_icon.update_icon()
pull_icon.screen_loc = ui_drone_pull
static_inventory += pull_icon
@@ -20,12 +22,14 @@
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand_position(owner,1)
+ using.hud = src
static_inventory += using
using = new /obj/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
+ using.hud = src
static_inventory += using
if(mymob.possible_a_intents)
@@ -36,16 +40,19 @@
action_intent = new /obj/screen/act_intent
action_intent.icon = ui_style
action_intent.icon_state = mymob.a_intent
+ action_intent.hud = src
static_inventory += action_intent
zone_select = new /obj/screen/zone_sel()
zone_select.icon = ui_style
- zone_select.update_icon(mymob)
+ zone_select.hud = src
+ zone_select.update_icon()
static_inventory += zone_select
using = new /obj/screen/area_creator
using.icon = ui_style
+ using.hud = src
static_inventory += using
mymob.client.screen = list()
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index 87c590bb..549b6346 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -1,89 +1,95 @@
-/obj/screen/ghost
- icon = 'icons/mob/screen_ghost.dmi'
-
-/obj/screen/ghost/MouseEntered()
- flick(icon_state + "_anim", src)
-
-/obj/screen/ghost/jumptomob
- name = "Jump to mob"
- icon_state = "jumptomob"
-
-/obj/screen/ghost/jumptomob/Click()
- var/mob/dead/observer/G = usr
- G.jumptomob()
-
-/obj/screen/ghost/orbit
- name = "Orbit"
- icon_state = "orbit"
-
-/obj/screen/ghost/orbit/Click()
- var/mob/dead/observer/G = usr
- G.follow()
-
-/obj/screen/ghost/reenter_corpse
- name = "Reenter corpse"
- icon_state = "reenter_corpse"
-
-/obj/screen/ghost/reenter_corpse/Click()
- var/mob/dead/observer/G = usr
- G.reenter_corpse()
-
-/obj/screen/ghost/teleport
- name = "Teleport"
- icon_state = "teleport"
-
-/obj/screen/ghost/teleport/Click()
- var/mob/dead/observer/G = usr
- G.dead_tele()
-
-/obj/screen/ghost/pai
- name = "pAI Candidate"
- icon_state = "pai"
-
-/obj/screen/ghost/pai/Click()
- var/mob/dead/observer/G = usr
- G.register_pai()
-
-/datum/hud/ghost/New(mob/owner)
- ..()
- var/obj/screen/using
-
- using = new /obj/screen/ghost/jumptomob()
- using.screen_loc = ui_ghost_jumptomob
- static_inventory += using
-
- using = new /obj/screen/ghost/orbit()
- using.screen_loc = ui_ghost_orbit
- static_inventory += using
-
- using = new /obj/screen/ghost/reenter_corpse()
- using.screen_loc = ui_ghost_reenter_corpse
- static_inventory += using
-
- using = new /obj/screen/ghost/teleport()
- using.screen_loc = ui_ghost_teleport
- static_inventory += using
-
- using = new /obj/screen/ghost/pai()
- using.screen_loc = ui_ghost_pai
- static_inventory += using
-
- using = new /obj/screen/language_menu
- using.icon = ui_style
- static_inventory += using
-
-/datum/hud/ghost/show_hud(version = 0, mob/viewmob)
- // don't show this HUD if observing; show the HUD of the observee
- var/mob/dead/observer/O = mymob
- if (istype(O) && O.observetarget)
- plane_masters_update()
- return FALSE
-
- . = ..()
- if(!.)
- return
- var/mob/screenmob = viewmob || mymob
- if(!screenmob.client.prefs.ghost_hud)
- screenmob.client.screen -= static_inventory
- else
- screenmob.client.screen += static_inventory
+/obj/screen/ghost
+ icon = 'icons/mob/screen_ghost.dmi'
+
+/obj/screen/ghost/MouseEntered()
+ flick(icon_state + "_anim", src)
+
+/obj/screen/ghost/jumptomob
+ name = "Jump to mob"
+ icon_state = "jumptomob"
+
+/obj/screen/ghost/jumptomob/Click()
+ var/mob/dead/observer/G = usr
+ G.jumptomob()
+
+/obj/screen/ghost/orbit
+ name = "Orbit"
+ icon_state = "orbit"
+
+/obj/screen/ghost/orbit/Click()
+ var/mob/dead/observer/G = usr
+ G.follow()
+
+/obj/screen/ghost/reenter_corpse
+ name = "Reenter corpse"
+ icon_state = "reenter_corpse"
+
+/obj/screen/ghost/reenter_corpse/Click()
+ var/mob/dead/observer/G = usr
+ G.reenter_corpse()
+
+/obj/screen/ghost/teleport
+ name = "Teleport"
+ icon_state = "teleport"
+
+/obj/screen/ghost/teleport/Click()
+ var/mob/dead/observer/G = usr
+ G.dead_tele()
+
+/obj/screen/ghost/pai
+ name = "pAI Candidate"
+ icon_state = "pai"
+
+/obj/screen/ghost/pai/Click()
+ var/mob/dead/observer/G = usr
+ G.register_pai()
+
+/datum/hud/ghost/New(mob/owner)
+ ..()
+ var/obj/screen/using
+
+ using = new /obj/screen/ghost/jumptomob()
+ using.screen_loc = ui_ghost_jumptomob
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/ghost/orbit()
+ using.screen_loc = ui_ghost_orbit
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/ghost/reenter_corpse()
+ using.screen_loc = ui_ghost_reenter_corpse
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/ghost/teleport()
+ using.screen_loc = ui_ghost_teleport
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/ghost/pai()
+ using.screen_loc = ui_ghost_pai
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/language_menu
+ using.icon = ui_style
+ using.hud = src
+ static_inventory += using
+
+/datum/hud/ghost/show_hud(version = 0, mob/viewmob)
+ // don't show this HUD if observing; show the HUD of the observee
+ var/mob/dead/observer/O = mymob
+ if (istype(O) && O.observetarget)
+ plane_masters_update()
+ return FALSE
+
+ . = ..()
+ if(!.)
+ return
+ var/mob/screenmob = viewmob || mymob
+ if(!screenmob.client.prefs.ghost_hud)
+ screenmob.client.screen -= static_inventory
+ else
+ screenmob.client.screen += static_inventory
diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm
index a6655895..35b40ee5 100644
--- a/code/_onclick/hud/guardian.dm
+++ b/code/_onclick/hud/guardian.dm
@@ -4,26 +4,32 @@
var/obj/screen/using
healths = new /obj/screen/healths/guardian()
+ healths.hud = src
infodisplay += healths
using = new /obj/screen/guardian/Manifest()
using.screen_loc = ui_hand_position(2)
+ using.hud = src
static_inventory += using
using = new /obj/screen/guardian/Recall()
using.screen_loc = ui_hand_position(1)
+ using.hud = src
static_inventory += using
using = new owner.toggle_button_type()
using.screen_loc = ui_storage1
+ using.hud = src
static_inventory += using
using = new /obj/screen/guardian/ToggleLight()
using.screen_loc = ui_inventory
+ using.hud = src
static_inventory += using
using = new /obj/screen/guardian/Communicate()
using.screen_loc = ui_back
+ using.hud = src
static_inventory += using
/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 02e7ff06..5f233437 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -1,295 +1,298 @@
-/*
- The hud datum
- Used to show and hide huds for all the different mob types,
- including inventories and item quick actions.
-*/
-
-// The default UI style is the first one in the list
-GLOBAL_LIST_INIT(available_ui_styles, list(
- "Midnight" = 'icons/mob/screen_midnight.dmi',
- "Retro" = 'icons/mob/screen_retro.dmi',
- "Plasmafire" = 'icons/mob/screen_plasmafire.dmi',
- "Slimecore" = 'icons/mob/screen_slimecore.dmi',
- "Operative" = 'icons/mob/screen_operative.dmi',
- "Clockwork" = 'icons/mob/screen_clockwork.dmi',
- "Kinaris" = 'icons/mob/screen_kinaris.dmi',
-))
-
-/proc/ui_style2icon(ui_style)
- return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]]
-
-/datum/hud
- var/mob/mymob
-
- var/hud_shown = TRUE //Used for the HUD toggle (F12)
- var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD
- var/inventory_shown = FALSE //Equipped item inventory
- var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
-
- var/obj/screen/ling/chems/lingchemdisplay
- var/obj/screen/ling/sting/lingstingdisplay
-
- var/obj/screen/blobpwrdisplay
-
- var/obj/screen/alien_plasma_display
- var/obj/screen/alien_queen_finder
-
- var/obj/screen/devil/soul_counter/devilsouldisplay
-
- var/obj/screen/action_intent
- var/obj/screen/zone_select
- var/obj/screen/pull_icon
- var/obj/screen/rest_icon
- var/obj/screen/throw_icon
- var/obj/screen/module_store_icon
-
- var/list/static_inventory = list() //the screen objects which are static
- var/list/toggleable_inventory = list() //the screen objects which can be hidden
- var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys
- var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...)
- var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...)
- var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID.
- var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object
- var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object
-
- var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle
- var/action_buttons_hidden = FALSE
-
- var/obj/screen/healths
- var/obj/screen/healthdoll
- var/obj/screen/internals
-
- // subtypes can override this to force a specific UI style
- var/ui_style
-
-/datum/hud/New(mob/owner)
- mymob = owner
-
- if (!ui_style)
- // will fall back to the default if any of these are null
- ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style)
-
- hide_actions_toggle = new
- hide_actions_toggle.InitialiseIcon(src)
- if(mymob.client)
- hide_actions_toggle.locked = mymob.client.prefs.buttons_locked
-
- hand_slots = list()
-
- for(var/mytype in subtypesof(/obj/screen/plane_master))
- var/obj/screen/plane_master/instance = new mytype()
- plane_masters["[instance.plane]"] = instance
- instance.backdrop(mymob)
-
-/datum/hud/Destroy()
- if(mymob.hud_used == src)
- mymob.hud_used = null
-
- QDEL_NULL(hide_actions_toggle)
- QDEL_NULL(module_store_icon)
- QDEL_LIST(static_inventory)
-
- inv_slots.Cut()
- action_intent = null
- zone_select = null
- pull_icon = null
-
- QDEL_LIST(toggleable_inventory)
- QDEL_LIST(hotkeybuttons)
- throw_icon = null
- QDEL_LIST(infodisplay)
-
- healths = null
- healthdoll = null
- internals = null
- lingchemdisplay = null
- devilsouldisplay = null
- lingstingdisplay = null
- blobpwrdisplay = null
- alien_plasma_display = null
- alien_queen_finder = null
-
- QDEL_LIST_ASSOC_VAL(plane_masters)
- QDEL_LIST(screenoverlays)
- mymob = null
-
- return ..()
-
-/mob
- var/hud_type = /datum/hud
-
-/mob/proc/create_mob_hud()
- if(!client || hud_used)
- return
- hud_used = new hud_type(src)
- update_sight()
- SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED)
-
-//Version denotes which style should be displayed. blank or 0 means "next version"
-/datum/hud/proc/show_hud(version = 0, mob/viewmob)
- if(!ismob(mymob))
- return FALSE
- var/mob/screenmob = viewmob || mymob
- if(!screenmob.client)
- return FALSE
-
- screenmob.client.screen = list()
- screenmob.client.apply_clickcatcher()
-
- var/display_hud_version = version
- if(!display_hud_version) //If 0 or blank, display the next hud version
- display_hud_version = hud_version + 1
- if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
- display_hud_version = 1
-
- switch(display_hud_version)
- if(HUD_STYLE_STANDARD) //Default HUD
- hud_shown = TRUE //Governs behavior of other procs
- if(static_inventory.len)
- screenmob.client.screen += static_inventory
- if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown)
- screenmob.client.screen += toggleable_inventory
- if(hotkeybuttons.len && !hotkey_ui_hidden)
- screenmob.client.screen += hotkeybuttons
- if(infodisplay.len)
- screenmob.client.screen += infodisplay
-
- screenmob.client.screen += hide_actions_toggle
-
- if(action_intent)
- action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
-
- if(HUD_STYLE_REDUCED) //Reduced HUD
- hud_shown = FALSE //Governs behavior of other procs
- if(static_inventory.len)
- screenmob.client.screen -= static_inventory
- if(toggleable_inventory.len)
- screenmob.client.screen -= toggleable_inventory
- if(hotkeybuttons.len)
- screenmob.client.screen -= hotkeybuttons
- if(infodisplay.len)
- screenmob.client.screen += infodisplay
-
- //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
- for(var/h in hand_slots)
- var/obj/screen/hand = hand_slots[h]
- if(hand)
- screenmob.client.screen += hand
- if(action_intent)
- screenmob.client.screen += action_intent //we want the intent switcher visible
- action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
-
- if(HUD_STYLE_NOHUD) //No HUD
- hud_shown = FALSE //Governs behavior of other procs
- if(static_inventory.len)
- screenmob.client.screen -= static_inventory
- if(toggleable_inventory.len)
- screenmob.client.screen -= toggleable_inventory
- if(hotkeybuttons.len)
- screenmob.client.screen -= hotkeybuttons
- if(infodisplay.len)
- screenmob.client.screen -= infodisplay
-
- hud_version = display_hud_version
- persistent_inventory_update(screenmob)
- screenmob.update_action_buttons(1)
- reorganize_alerts()
- screenmob.reload_fullscreen()
- update_parallax_pref(screenmob)
-
- // ensure observers get an accurate and up-to-date view
- if (!viewmob)
- plane_masters_update()
- for(var/M in mymob.observers)
- show_hud(hud_version, M)
- else if (viewmob.hud_used)
- viewmob.hud_used.plane_masters_update()
-
- return TRUE
-
-/datum/hud/proc/plane_masters_update()
- // Plane masters are always shown to OUR mob, never to observers
- for(var/thing in plane_masters)
- var/obj/screen/plane_master/PM = plane_masters[thing]
- PM.backdrop(mymob)
- mymob.client.screen += PM
-
-/datum/hud/human/show_hud(version = 0,mob/viewmob)
- . = ..()
- if(!.)
- return
- var/mob/screenmob = viewmob || mymob
- hidden_inventory_update(screenmob)
-
-/datum/hud/robot/show_hud(version = 0, mob/viewmob)
- . = ..()
- if(!.)
- return
- update_robot_modules_display()
-
-/datum/hud/proc/hidden_inventory_update()
- return
-
-/datum/hud/proc/persistent_inventory_update(mob/viewer)
- if(!mymob)
- return
-
-/datum/hud/proc/update_ui_style(new_ui_style)
- // do nothing if overridden by a subtype or already on that style
- if (initial(ui_style) || ui_style == new_ui_style)
- return
-
- for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots)
- if (item.icon == ui_style)
- item.icon = new_ui_style
-
- ui_style = new_ui_style
- build_hand_slots()
- hide_actions_toggle.InitialiseIcon(src)
-
-//Triggered when F12 is pressed (Unless someone changed something in the DMF)
-/mob/verb/button_pressed_F12()
- set name = "F12"
- set hidden = TRUE
-
- if(hud_used && client)
- hud_used.show_hud() //Shows the next hud preset
- to_chat(usr, "Switched HUD mode. Press F12 to toggle.")
- else
- to_chat(usr, "This mob type does not use a HUD.")
-
-
-//(re)builds the hand ui slots, throwing away old ones
-//not really worth jugglying existing ones so we just scrap+rebuild
-//9/10 this is only called once per mob and only for 2 hands
-/datum/hud/proc/build_hand_slots()
- for(var/h in hand_slots)
- var/obj/screen/inventory/hand/H = hand_slots[h]
- if(H)
- static_inventory -= H
- hand_slots = list()
- var/obj/screen/inventory/hand/hand_box
- for(var/i in 1 to mymob.held_items.len)
- hand_box = new /obj/screen/inventory/hand()
- hand_box.name = mymob.get_held_index_name(i)
- hand_box.icon = ui_style
- hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]"
- hand_box.screen_loc = ui_hand_position(i)
- hand_box.held_index = i
- hand_slots["[i]"] = hand_box
- hand_box.hud = src
- static_inventory += hand_box
- hand_box.update_icon()
-
- var/i = 1
- for(var/obj/screen/swap_hand/SH in static_inventory)
- SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1)
- i++
- for(var/obj/screen/human/equip/E in static_inventory)
- E.screen_loc = ui_equip_position(mymob)
-
- if(ismob(mymob) && mymob.hud_used == src)
- show_hud(hud_version)
-
-/datum/hud/proc/update_locked_slots()
- return
+/*
+ The hud datum
+ Used to show and hide huds for all the different mob types,
+ including inventories and item quick actions.
+*/
+
+// The default UI style is the first one in the list
+GLOBAL_LIST_INIT(available_ui_styles, list(
+ "Midnight" = 'icons/mob/screen_midnight.dmi',
+ "Retro" = 'icons/mob/screen_retro.dmi',
+ "Plasmafire" = 'icons/mob/screen_plasmafire.dmi',
+ "Slimecore" = 'icons/mob/screen_slimecore.dmi',
+ "Operative" = 'icons/mob/screen_operative.dmi',
+ "Clockwork" = 'icons/mob/screen_clockwork.dmi',
+ "Kinaris" = 'icons/mob/screen_kinaris.dmi',
+))
+
+/proc/ui_style2icon(ui_style)
+ return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]]
+
+/datum/hud
+ var/mob/mymob
+
+ var/hud_shown = TRUE //Used for the HUD toggle (F12)
+ var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD
+ var/inventory_shown = FALSE //Equipped item inventory
+ var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
+
+ var/obj/screen/ling/chems/lingchemdisplay
+ var/obj/screen/ling/sting/lingstingdisplay
+
+ var/obj/screen/blobpwrdisplay
+
+ var/obj/screen/alien_plasma_display
+ var/obj/screen/alien_queen_finder
+
+ var/obj/screen/devil/soul_counter/devilsouldisplay
+
+ var/obj/screen/action_intent
+ var/obj/screen/zone_select
+ var/obj/screen/pull_icon
+ var/obj/screen/rest_icon
+ var/obj/screen/throw_icon
+ var/obj/screen/module_store_icon
+
+ var/list/static_inventory = list() //the screen objects which are static
+ var/list/toggleable_inventory = list() //the screen objects which can be hidden
+ var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys
+ var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...)
+ var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...)
+ var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID.
+ var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object
+ var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object
+
+ var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle
+ var/action_buttons_hidden = FALSE
+
+ var/obj/screen/healths
+ var/obj/screen/healthdoll
+ var/obj/screen/internals
+
+ // subtypes can override this to force a specific UI style
+ var/ui_style
+
+ //Citadel stuff
+ var/obj/screen/arousal
+
+/datum/hud/New(mob/owner)
+ mymob = owner
+
+ if (!ui_style)
+ // will fall back to the default if any of these are null
+ ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style)
+
+ hide_actions_toggle = new
+ hide_actions_toggle.InitialiseIcon(src)
+ if(mymob.client)
+ hide_actions_toggle.locked = mymob.client.prefs.buttons_locked
+
+ hand_slots = list()
+
+ for(var/mytype in subtypesof(/obj/screen/plane_master))
+ var/obj/screen/plane_master/instance = new mytype()
+ plane_masters["[instance.plane]"] = instance
+ instance.backdrop(mymob)
+
+/datum/hud/Destroy()
+ if(mymob.hud_used == src)
+ mymob.hud_used = null
+
+ QDEL_NULL(hide_actions_toggle)
+ QDEL_NULL(module_store_icon)
+ QDEL_LIST(static_inventory)
+
+ inv_slots.Cut()
+ action_intent = null
+ zone_select = null
+ pull_icon = null
+
+ QDEL_LIST(toggleable_inventory)
+ QDEL_LIST(hotkeybuttons)
+ throw_icon = null
+ QDEL_LIST(infodisplay)
+
+ healths = null
+ healthdoll = null
+ internals = null
+ lingchemdisplay = null
+ devilsouldisplay = null
+ lingstingdisplay = null
+ blobpwrdisplay = null
+ alien_plasma_display = null
+ alien_queen_finder = null
+
+ QDEL_LIST_ASSOC_VAL(plane_masters)
+ QDEL_LIST(screenoverlays)
+ mymob = null
+
+ return ..()
+
+/mob
+ var/hud_type = /datum/hud
+
+/mob/proc/create_mob_hud()
+ if(!client || hud_used)
+ return
+ hud_used = new hud_type(src)
+ update_sight()
+ SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED)
+
+//Version denotes which style should be displayed. blank or 0 means "next version"
+/datum/hud/proc/show_hud(version = 0, mob/viewmob)
+ if(!ismob(mymob))
+ return FALSE
+ var/mob/screenmob = viewmob || mymob
+ if(!screenmob.client)
+ return FALSE
+
+ screenmob.client.screen = list()
+ screenmob.client.apply_clickcatcher()
+
+ var/display_hud_version = version
+ if(!display_hud_version) //If 0 or blank, display the next hud version
+ display_hud_version = hud_version + 1
+ if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version
+ display_hud_version = 1
+
+ switch(display_hud_version)
+ if(HUD_STYLE_STANDARD) //Default HUD
+ hud_shown = TRUE //Governs behavior of other procs
+ if(static_inventory.len)
+ screenmob.client.screen += static_inventory
+ if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown)
+ screenmob.client.screen += toggleable_inventory
+ if(hotkeybuttons.len && !hotkey_ui_hidden)
+ screenmob.client.screen += hotkeybuttons
+ if(infodisplay.len)
+ screenmob.client.screen += infodisplay
+
+ screenmob.client.screen += hide_actions_toggle
+
+ if(action_intent)
+ action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
+
+ if(HUD_STYLE_REDUCED) //Reduced HUD
+ hud_shown = FALSE //Governs behavior of other procs
+ if(static_inventory.len)
+ screenmob.client.screen -= static_inventory
+ if(toggleable_inventory.len)
+ screenmob.client.screen -= toggleable_inventory
+ if(hotkeybuttons.len)
+ screenmob.client.screen -= hotkeybuttons
+ if(infodisplay.len)
+ screenmob.client.screen += infodisplay
+
+ //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay
+ for(var/h in hand_slots)
+ var/obj/screen/hand = hand_slots[h]
+ if(hand)
+ screenmob.client.screen += hand
+ if(action_intent)
+ screenmob.client.screen += action_intent //we want the intent switcher visible
+ action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is.
+
+ if(HUD_STYLE_NOHUD) //No HUD
+ hud_shown = FALSE //Governs behavior of other procs
+ if(static_inventory.len)
+ screenmob.client.screen -= static_inventory
+ if(toggleable_inventory.len)
+ screenmob.client.screen -= toggleable_inventory
+ if(hotkeybuttons.len)
+ screenmob.client.screen -= hotkeybuttons
+ if(infodisplay.len)
+ screenmob.client.screen -= infodisplay
+
+ hud_version = display_hud_version
+ persistent_inventory_update(screenmob)
+ screenmob.update_action_buttons(1)
+ reorganize_alerts()
+ screenmob.reload_fullscreen()
+ update_parallax_pref(screenmob)
+
+ // ensure observers get an accurate and up-to-date view
+ if (!viewmob)
+ plane_masters_update()
+ for(var/M in mymob.observers)
+ show_hud(hud_version, M)
+ else if (viewmob.hud_used)
+ viewmob.hud_used.plane_masters_update()
+
+ return TRUE
+
+/datum/hud/proc/plane_masters_update()
+ // Plane masters are always shown to OUR mob, never to observers
+ for(var/thing in plane_masters)
+ var/obj/screen/plane_master/PM = plane_masters[thing]
+ PM.backdrop(mymob)
+ mymob.client.screen += PM
+
+/datum/hud/human/show_hud(version = 0,mob/viewmob)
+ . = ..()
+ if(!.)
+ return
+ var/mob/screenmob = viewmob || mymob
+ hidden_inventory_update(screenmob)
+
+/datum/hud/robot/show_hud(version = 0, mob/viewmob)
+ . = ..()
+ if(!.)
+ return
+ update_robot_modules_display()
+
+/datum/hud/proc/hidden_inventory_update()
+ return
+
+/datum/hud/proc/persistent_inventory_update(mob/viewer)
+ if(!mymob)
+ return
+
+/datum/hud/proc/update_ui_style(new_ui_style)
+ // do nothing if overridden by a subtype or already on that style
+ if (initial(ui_style) || ui_style == new_ui_style)
+ return
+
+ for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots)
+ if (item.icon == ui_style)
+ item.icon = new_ui_style
+
+ ui_style = new_ui_style
+ build_hand_slots()
+ hide_actions_toggle.InitialiseIcon(src)
+
+//Triggered when F12 is pressed (Unless someone changed something in the DMF)
+/mob/verb/button_pressed_F12()
+ set name = "F12"
+ set hidden = TRUE
+
+ if(hud_used && client)
+ hud_used.show_hud() //Shows the next hud preset
+ to_chat(usr, "Switched HUD mode. Press F12 to toggle.")
+ else
+ to_chat(usr, "This mob type does not use a HUD.")
+
+
+//(re)builds the hand ui slots, throwing away old ones
+//not really worth jugglying existing ones so we just scrap+rebuild
+//9/10 this is only called once per mob and only for 2 hands
+/datum/hud/proc/build_hand_slots()
+ for(var/h in hand_slots)
+ var/obj/screen/inventory/hand/H = hand_slots[h]
+ if(H)
+ static_inventory -= H
+ hand_slots = list()
+ var/obj/screen/inventory/hand/hand_box
+ for(var/i in 1 to mymob.held_items.len)
+ hand_box = new /obj/screen/inventory/hand()
+ hand_box.name = mymob.get_held_index_name(i)
+ hand_box.icon = ui_style
+ hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]"
+ hand_box.screen_loc = ui_hand_position(i)
+ hand_box.held_index = i
+ hand_slots["[i]"] = hand_box
+ hand_box.hud = src
+ static_inventory += hand_box
+ hand_box.update_icon()
+
+ var/i = 1
+ for(var/obj/screen/swap_hand/SH in static_inventory)
+ SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1)
+ i++
+ for(var/obj/screen/human/equip/E in static_inventory)
+ E.screen_loc = ui_equip_position(mymob)
+
+ if(ismob(mymob) && mymob.hud_used == src)
+ show_hud(hud_version)
+
+/datum/hud/proc/update_locked_slots()
+ return
diff --git a/code/_onclick/hud/hud_cit.dm b/code/_onclick/hud/hud_cit.dm
deleted file mode 100644
index 18ecf2e9..00000000
--- a/code/_onclick/hud/hud_cit.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/hud
- var/obj/screen/arousal
\ No newline at end of file
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 79c7651f..e54ede38 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -1,490 +1,519 @@
-/obj/screen/human
- icon = 'icons/mob/screen_midnight.dmi'
-
-/obj/screen/human/toggle
- name = "toggle"
- icon_state = "toggle"
-
-/obj/screen/human/toggle/Click()
-
- var/mob/targetmob = usr
-
- if(isobserver(usr))
- if(ishuman(usr.client.eye) && (usr.client.eye != usr))
- var/mob/M = usr.client.eye
- targetmob = M
-
- if(usr.hud_used.inventory_shown && targetmob.hud_used)
- usr.hud_used.inventory_shown = FALSE
- usr.client.screen -= targetmob.hud_used.toggleable_inventory
- else
- usr.hud_used.inventory_shown = TRUE
- usr.client.screen += targetmob.hud_used.toggleable_inventory
-
- targetmob.hud_used.hidden_inventory_update(usr)
-
-/obj/screen/human/equip
- name = "equip"
- icon_state = "act_equip"
-
-/obj/screen/human/equip/Click()
- if(ismecha(usr.loc)) // stops inventory actions in a mech
- return 1
- var/mob/living/carbon/human/H = usr
- H.quick_equip()
-
-/obj/screen/devil
- invisibility = INVISIBILITY_ABSTRACT
-
-/obj/screen/devil/soul_counter
- icon = 'icons/mob/screen_gen.dmi'
- name = "souls owned"
- icon_state = "Devil-6"
- screen_loc = ui_devilsouldisplay
-
-/obj/screen/devil/soul_counter/proc/update_counter(souls = 0)
- invisibility = 0
- maptext = "
[souls]
"
- switch(souls)
- if(0,null)
- icon_state = "Devil-1"
- if(1,2)
- icon_state = "Devil-2"
- if(3 to 5)
- icon_state = "Devil-3"
- if(6 to 8)
- icon_state = "Devil-4"
- if(9 to INFINITY)
- icon_state = "Devil-5"
- else
- icon_state = "Devil-6"
-
-/obj/screen/devil/soul_counter/proc/clear()
- invisibility = INVISIBILITY_ABSTRACT
-
-/obj/screen/ling
- invisibility = INVISIBILITY_ABSTRACT
-
-/obj/screen/ling/sting
- name = "current sting"
- screen_loc = ui_lingstingdisplay
-
-/obj/screen/ling/sting/Click()
- if(isobserver(usr))
- return
- var/mob/living/carbon/U = usr
- U.unset_sting()
-
-/obj/screen/ling/chems
- name = "chemical storage"
- icon_state = "power_display"
- screen_loc = ui_lingchemdisplay
-
-/datum/hud/human/New(mob/living/carbon/human/owner)
- ..()
- owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
-
- var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref
- if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto
- widescreenlayout = FALSE // CIT CHANGE - ditto
-
- var/obj/screen/using
- var/obj/screen/inventory/inv_box
-
- using = new/obj/screen/language_menu
- using.icon = ui_style
- if(!widescreenlayout) // CIT CHANGE
- using.screen_loc = ui_boxlang // CIT CHANGE
- static_inventory += using
-
- using = new /obj/screen/area_creator
- using.icon = ui_style
- if(!widescreenlayout) // CIT CHANGE
- using.screen_loc = ui_boxarea // CIT CHANGE
- static_inventory += using
-
- using = new /obj/screen/voretoggle() //We fancy Vore now
- using.icon = tg_ui_icon_to_cit_ui(ui_style)
- using.screen_loc = ui_voremode
- if(!widescreenlayout)
- using.screen_loc = ui_boxvore
- static_inventory += using
-
- action_intent = new /obj/screen/act_intent/segmented
- action_intent.icon_state = mymob.a_intent
- static_inventory += action_intent
-
- using = new /obj/screen/mov_intent
- using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon
- using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
- using.screen_loc = ui_movi
- static_inventory += using
-
-/* //CITADEL CHANGES - sprint button
- using = new /obj/screen/sprintbutton
- using.icon = tg_ui_icon_to_cit_ui(ui_style)
- using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint")
- using.screen_loc = ui_movi
- static_inventory += using
- //END OF CITADEL CHANGES
-
- //same as above but buffer.
- using = new /obj/screen/sprint_buffer
- using.screen_loc = ui_sprintbufferloc
- sprint_buffer = using
- static_inventory += using
-*/
-
- using = new /obj/screen/drop()
- using.icon = ui_style
- using.screen_loc = ui_drop_throw
- static_inventory += using
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "i_clothing"
- inv_box.icon = ui_style
- inv_box.slot_id = SLOT_W_UNIFORM
- inv_box.icon_state = "uniform"
- inv_box.screen_loc = ui_iclothing
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "o_clothing"
- inv_box.icon = ui_style
- inv_box.slot_id = SLOT_WEAR_SUIT
- inv_box.icon_state = "suit"
- inv_box.screen_loc = ui_oclothing
- toggleable_inventory += inv_box
-
- build_hand_slots()
-
- using = new /obj/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_1"
- using.screen_loc = ui_swaphand_position(owner,1)
- static_inventory += using
-
- using = new /obj/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_2"
- using.screen_loc = ui_swaphand_position(owner,2)
- static_inventory += using
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "id"
- inv_box.icon = ui_style
- inv_box.icon_state = "id"
- inv_box.screen_loc = ui_id
- inv_box.slot_id = SLOT_WEAR_ID
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "mask"
- inv_box.icon = ui_style
- inv_box.icon_state = "mask"
- inv_box.screen_loc = ui_mask
- inv_box.slot_id = SLOT_WEAR_MASK
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "neck"
- inv_box.icon = ui_style
- inv_box.icon_state = "neck"
- inv_box.screen_loc = ui_neck
- inv_box.slot_id = SLOT_NECK
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "back"
- inv_box.icon = ui_style
- inv_box.icon_state = "back"
- inv_box.screen_loc = ui_back
- inv_box.slot_id = SLOT_BACK
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "storage1"
- inv_box.icon = ui_style
- inv_box.icon_state = "pocket"
- inv_box.screen_loc = ui_storage1
- inv_box.slot_id = SLOT_L_STORE
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "storage2"
- inv_box.icon = ui_style
- inv_box.icon_state = "pocket"
- inv_box.screen_loc = ui_storage2
- inv_box.slot_id = SLOT_R_STORE
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "suit storage"
- inv_box.icon = ui_style
- inv_box.icon_state = "suit_storage"
- inv_box.screen_loc = ui_sstore1
- inv_box.slot_id = SLOT_S_STORE
- static_inventory += inv_box
-
- using = new /obj/screen/resist()
- using.icon = ui_style
- using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist
- hotkeybuttons += using
-
- //CIT CHANGES - rest and combat mode buttons
- using = new /obj/screen/restbutton()
- using.icon = tg_ui_icon_to_cit_ui(ui_style)
- using.screen_loc = ui_pull_resist
- static_inventory += using
-
- using = new /obj/screen/combattoggle()
- using.icon = tg_ui_icon_to_cit_ui(ui_style)
- using.screen_loc = ui_combat_toggle
- static_inventory += using
- //END OF CIT CHANGES
-
- using = new /obj/screen/human/toggle()
- using.icon = ui_style
- using.screen_loc = ui_inventory
- static_inventory += using
-
- using = new /obj/screen/human/equip()
- using.icon = ui_style
- using.screen_loc = ui_equip_position(mymob)
- static_inventory += using
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "gloves"
- inv_box.icon = ui_style
- inv_box.icon_state = "gloves"
- inv_box.screen_loc = ui_gloves
- inv_box.slot_id = SLOT_GLOVES
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "eyes"
- inv_box.icon = ui_style
- inv_box.icon_state = "glasses"
- inv_box.screen_loc = ui_glasses
- inv_box.slot_id = SLOT_GLASSES
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "ears"
- inv_box.icon = ui_style
- inv_box.icon_state = "ears"
- inv_box.screen_loc = ui_ears
- inv_box.slot_id = SLOT_EARS
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "head"
- inv_box.icon = ui_style
- inv_box.icon_state = "head"
- inv_box.screen_loc = ui_head
- inv_box.slot_id = SLOT_HEAD
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "shoes"
- inv_box.icon = ui_style
- inv_box.icon_state = "shoes"
- inv_box.screen_loc = ui_shoes
- inv_box.slot_id = SLOT_SHOES
- toggleable_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "belt"
- inv_box.icon = ui_style
- inv_box.icon_state = "belt"
-// inv_box.icon_full = "template_small"
- inv_box.screen_loc = ui_belt
- inv_box.slot_id = SLOT_BELT
- static_inventory += inv_box
-
- throw_icon = new /obj/screen/throw_catch()
- throw_icon.icon = ui_style
- throw_icon.screen_loc = ui_drop_throw
- hotkeybuttons += throw_icon
-
- internals = new /obj/screen/internals()
- infodisplay += internals
-
- healths = new /obj/screen/healths()
- infodisplay += healths
- //CIT CHANGE - adds arousal and stamina to hud
- arousal = new /obj/screen/arousal()
- arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "")
- infodisplay += arousal
-
-// staminas = new /obj/screen/staminas()
-// infodisplay += staminas
-
-// if(!CONFIG_GET(flag/disable_stambuffer))
-// staminabuffer = new /obj/screen/staminabuffer()
-// infodisplay += staminabuffer
- //END OF CIT CHANGES
-
- healthdoll = new /obj/screen/healthdoll()
- infodisplay += healthdoll
-
- pull_icon = new /obj/screen/pull()
- pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
- pull_icon.screen_loc = ui_pull_resist
- static_inventory += pull_icon
-
- lingchemdisplay = new /obj/screen/ling/chems()
- infodisplay += lingchemdisplay
-
- lingstingdisplay = new /obj/screen/ling/sting()
- infodisplay += lingstingdisplay
-
- devilsouldisplay = new /obj/screen/devil/soul_counter
- infodisplay += devilsouldisplay
-
- blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume
- infodisplay += blood_display
- vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank
- infodisplay += vamprank_display
- sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight
- infodisplay += sunlight_display
-
- zone_select = new /obj/screen/zone_sel()
- zone_select.icon = ui_style
- zone_select.update_icon(mymob)
- static_inventory += zone_select
-
- for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
- if(inv.slot_id)
- inv.hud = src
- inv_slots[inv.slot_id] = inv
- inv.update_icon()
-
- update_locked_slots()
-
-/datum/hud/human/update_locked_slots()
- if(!mymob)
- return
- var/mob/living/carbon/human/H = mymob
- if(!istype(H) || !H.dna.species)
- return
- var/datum/species/S = H.dna.species
- for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
- if(inv.slot_id)
- if(inv.slot_id in S.no_equip)
- inv.alpha = 128
- else
- inv.alpha = initial(inv.alpha)
-
-/datum/hud/human/hidden_inventory_update(mob/viewer)
- if(!mymob)
- return
- var/mob/living/carbon/human/H = mymob
-
- var/mob/screenmob = viewer || H
-
- if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown)
- if(H.shoes)
- H.shoes.screen_loc = ui_shoes
- screenmob.client.screen += H.shoes
- if(H.gloves)
- H.gloves.screen_loc = ui_gloves
- screenmob.client.screen += H.gloves
- if(H.ears)
- H.ears.screen_loc = ui_ears
- screenmob.client.screen += H.ears
- if(H.glasses)
- H.glasses.screen_loc = ui_glasses
- screenmob.client.screen += H.glasses
- if(H.w_uniform)
- H.w_uniform.screen_loc = ui_iclothing
- screenmob.client.screen += H.w_uniform
- if(H.wear_suit)
- H.wear_suit.screen_loc = ui_oclothing
- screenmob.client.screen += H.wear_suit
- if(H.wear_mask)
- H.wear_mask.screen_loc = ui_mask
- screenmob.client.screen += H.wear_mask
- if(H.wear_neck)
- H.wear_neck.screen_loc = ui_neck
- screenmob.client.screen += H.wear_neck
- if(H.head)
- H.head.screen_loc = ui_head
- screenmob.client.screen += H.head
- else
- if(H.shoes) screenmob.client.screen -= H.shoes
- if(H.gloves) screenmob.client.screen -= H.gloves
- if(H.ears) screenmob.client.screen -= H.ears
- if(H.glasses) screenmob.client.screen -= H.glasses
- if(H.w_uniform) screenmob.client.screen -= H.w_uniform
- if(H.wear_suit) screenmob.client.screen -= H.wear_suit
- if(H.wear_mask) screenmob.client.screen -= H.wear_mask
- if(H.wear_neck) screenmob.client.screen -= H.wear_neck
- if(H.head) screenmob.client.screen -= H.head
-
-
-
-/datum/hud/human/persistent_inventory_update(mob/viewer)
- if(!mymob)
- return
- ..()
- var/mob/living/carbon/human/H = mymob
-
- var/mob/screenmob = viewer || H
-
- if(screenmob.hud_used)
- if(screenmob.hud_used.hud_shown)
- if(H.s_store)
- H.s_store.screen_loc = ui_sstore1
- screenmob.client.screen += H.s_store
- if(H.wear_id)
- H.wear_id.screen_loc = ui_id
- screenmob.client.screen += H.wear_id
- if(H.belt)
- H.belt.screen_loc = ui_belt
- screenmob.client.screen += H.belt
- if(H.back)
- H.back.screen_loc = ui_back
- screenmob.client.screen += H.back
- if(H.l_store)
- H.l_store.screen_loc = ui_storage1
- screenmob.client.screen += H.l_store
- if(H.r_store)
- H.r_store.screen_loc = ui_storage2
- screenmob.client.screen += H.r_store
- else
- if(H.s_store)
- screenmob.client.screen -= H.s_store
- if(H.wear_id)
- screenmob.client.screen -= H.wear_id
- if(H.belt)
- screenmob.client.screen -= H.belt
- if(H.back)
- screenmob.client.screen -= H.back
- if(H.l_store)
- screenmob.client.screen -= H.l_store
- if(H.r_store)
- screenmob.client.screen -= H.r_store
-
- if(hud_version != HUD_STYLE_NOHUD)
- for(var/obj/item/I in H.held_items)
- I.screen_loc = ui_hand_position(H.get_held_index_of_item(I))
- screenmob.client.screen += I
- else
- for(var/obj/item/I in H.held_items)
- I.screen_loc = null
- screenmob.client.screen -= I
-
-
-/mob/living/carbon/human/verb/toggle_hotkey_verbs()
- set category = "OOC"
- set name = "Toggle hotkey buttons"
- set desc = "This disables or enables the user interface buttons which can be used with hotkeys."
-
- if(hud_used.hotkey_ui_hidden)
- client.screen += hud_used.hotkeybuttons
- hud_used.hotkey_ui_hidden = FALSE
- else
- client.screen -= hud_used.hotkeybuttons
- hud_used.hotkey_ui_hidden = TRUE
+/obj/screen/human
+ icon = 'icons/mob/screen_midnight.dmi'
+
+/obj/screen/human/toggle
+ name = "toggle"
+ icon_state = "toggle"
+
+/obj/screen/human/toggle/Click()
+
+ var/mob/targetmob = usr
+
+ if(isobserver(usr))
+ if(ishuman(usr.client.eye) && (usr.client.eye != usr))
+ var/mob/M = usr.client.eye
+ targetmob = M
+
+ if(usr.hud_used.inventory_shown && targetmob.hud_used)
+ usr.hud_used.inventory_shown = FALSE
+ usr.client.screen -= targetmob.hud_used.toggleable_inventory
+ else
+ usr.hud_used.inventory_shown = TRUE
+ usr.client.screen += targetmob.hud_used.toggleable_inventory
+
+ targetmob.hud_used.hidden_inventory_update(usr)
+
+/obj/screen/human/equip
+ name = "equip"
+ icon_state = "act_equip"
+
+/obj/screen/human/equip/Click()
+ if(ismecha(usr.loc)) // stops inventory actions in a mech
+ return 1
+ var/mob/living/carbon/human/H = usr
+ H.quick_equip()
+
+/obj/screen/devil
+ invisibility = INVISIBILITY_ABSTRACT
+
+/obj/screen/devil/soul_counter
+ icon = 'icons/mob/screen_gen.dmi'
+ name = "souls owned"
+ icon_state = "Devil-6"
+ screen_loc = ui_devilsouldisplay
+
+/obj/screen/devil/soul_counter/proc/update_counter(souls = 0)
+ invisibility = 0
+ maptext = "[souls]
"
+ switch(souls)
+ if(0,null)
+ icon_state = "Devil-1"
+ if(1,2)
+ icon_state = "Devil-2"
+ if(3 to 5)
+ icon_state = "Devil-3"
+ if(6 to 8)
+ icon_state = "Devil-4"
+ if(9 to INFINITY)
+ icon_state = "Devil-5"
+ else
+ icon_state = "Devil-6"
+
+/obj/screen/devil/soul_counter/proc/clear()
+ invisibility = INVISIBILITY_ABSTRACT
+
+/obj/screen/ling
+ invisibility = INVISIBILITY_ABSTRACT
+
+/obj/screen/ling/sting
+ name = "current sting"
+ screen_loc = ui_lingstingdisplay
+
+/obj/screen/ling/sting/Click()
+ if(isobserver(usr))
+ return
+ var/mob/living/carbon/U = usr
+ U.unset_sting()
+
+/obj/screen/ling/chems
+ name = "chemical storage"
+ icon_state = "power_display"
+ screen_loc = ui_lingchemdisplay
+
+/datum/hud/human/New(mob/living/carbon/human/owner)
+ ..()
+ owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness)
+
+ var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref
+ if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto
+ widescreenlayout = FALSE // CIT CHANGE - ditto
+
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ using = new/obj/screen/language_menu
+ using.icon = ui_style
+ if(!widescreenlayout) // CIT CHANGE
+ using.screen_loc = ui_boxlang // CIT CHANGE
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/area_creator
+ using.icon = ui_style
+ if(!widescreenlayout) // CIT CHANGE
+ using.screen_loc = ui_boxarea // CIT CHANGE
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/voretoggle() //We fancy Vore now
+ using.icon = tg_ui_icon_to_cit_ui(ui_style)
+ using.screen_loc = ui_voremode
+ if(!widescreenlayout)
+ using.screen_loc = ui_boxvore
+ using.hud = src
+ static_inventory += using
+
+ action_intent = new /obj/screen/act_intent/segmented
+ action_intent.icon_state = mymob.a_intent
+ action_intent.hud = src
+ static_inventory += action_intent
+
+ using = new /obj/screen/mov_intent
+ using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
+ using.screen_loc = ui_movi
+ using.hud = src
+ static_inventory += using
+
+/* //CITADEL CHANGES - sprint button
+ using = new /obj/screen/sprintbutton
+ using.icon = tg_ui_icon_to_cit_ui(ui_style)
+ using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint")
+ using.screen_loc = ui_movi
+ using.hud = src
+ static_inventory += using
+ //END OF CITADEL CHANGES
+
+ //same as above but buffer.
+ using = new /obj/screen/sprint_buffer
+ using.screen_loc = ui_sprintbufferloc
+ sprint_buffer = using
+ static_inventory += using
+*/
+
+ using = new /obj/screen/drop()
+ using.icon = ui_style
+ using.screen_loc = ui_drop_throw
+ using.hud = src
+ static_inventory += using
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "i_clothing"
+ inv_box.icon = ui_style
+ inv_box.slot_id = SLOT_W_UNIFORM
+ inv_box.icon_state = "uniform"
+ inv_box.screen_loc = ui_iclothing
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "o_clothing"
+ inv_box.icon = ui_style
+ inv_box.slot_id = SLOT_WEAR_SUIT
+ inv_box.icon_state = "suit"
+ inv_box.screen_loc = ui_oclothing
+ toggleable_inventory += inv_box
+
+ build_hand_slots()
+
+ using = new /obj/screen/swap_hand()
+ using.icon = ui_style
+ using.icon_state = "swap_1"
+ using.screen_loc = ui_swaphand_position(owner,1)
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/swap_hand()
+ using.icon = ui_style
+ using.icon_state = "swap_2"
+ using.screen_loc = ui_swaphand_position(owner,2)
+ using.hud = src
+ static_inventory += using
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "id"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "id"
+ inv_box.screen_loc = ui_id
+ inv_box.slot_id = SLOT_WEAR_ID
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "mask"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "mask"
+ inv_box.screen_loc = ui_mask
+ inv_box.slot_id = SLOT_WEAR_MASK
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "neck"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "neck"
+ inv_box.screen_loc = ui_neck
+ inv_box.slot_id = SLOT_NECK
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "back"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "back"
+ inv_box.screen_loc = ui_back
+ inv_box.slot_id = SLOT_BACK
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "storage1"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "pocket"
+ inv_box.screen_loc = ui_storage1
+ inv_box.slot_id = SLOT_L_STORE
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "storage2"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "pocket"
+ inv_box.screen_loc = ui_storage2
+ inv_box.slot_id = SLOT_R_STORE
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "suit storage"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "suit_storage"
+ inv_box.screen_loc = ui_sstore1
+ inv_box.slot_id = SLOT_S_STORE
+ static_inventory += inv_box
+
+ using = new /obj/screen/resist()
+ using.icon = ui_style
+ using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist
+ using.hud = src
+ hotkeybuttons += using
+
+ //CIT CHANGES - rest and combat mode buttons
+ using = new /obj/screen/restbutton()
+ using.icon = tg_ui_icon_to_cit_ui(ui_style)
+ using.screen_loc = ui_pull_resist
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/combattoggle()
+ using.icon = tg_ui_icon_to_cit_ui(ui_style)
+ using.screen_loc = ui_combat_toggle
+ using.hud = src
+ static_inventory += using
+ //END OF CIT CHANGES
+
+ using = new /obj/screen/human/toggle()
+ using.icon = ui_style
+ using.screen_loc = ui_inventory
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/human/equip()
+ using.icon = ui_style
+ using.screen_loc = ui_equip_position(mymob)
+ using.hud = src
+ static_inventory += using
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "gloves"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "gloves"
+ inv_box.screen_loc = ui_gloves
+ inv_box.slot_id = SLOT_GLOVES
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "eyes"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "glasses"
+ inv_box.screen_loc = ui_glasses
+ inv_box.slot_id = SLOT_GLASSES
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "ears"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "ears"
+ inv_box.screen_loc = ui_ears
+ inv_box.slot_id = SLOT_EARS
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "head"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "head"
+ inv_box.screen_loc = ui_head
+ inv_box.slot_id = SLOT_HEAD
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "shoes"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "shoes"
+ inv_box.screen_loc = ui_shoes
+ inv_box.slot_id = SLOT_SHOES
+ toggleable_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "belt"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "belt"
+// inv_box.icon_full = "template_small"
+ inv_box.screen_loc = ui_belt
+ inv_box.slot_id = SLOT_BELT
+ static_inventory += inv_box
+
+ throw_icon = new /obj/screen/throw_catch()
+ throw_icon.icon = ui_style
+ throw_icon.screen_loc = ui_drop_throw
+ throw_icon.hud = src
+ hotkeybuttons += throw_icon
+
+ internals = new /obj/screen/internals()
+ internals.hud = src
+ infodisplay += internals
+
+ healths = new /obj/screen/healths()
+ healths.hud = src
+ infodisplay += healths
+ //CIT CHANGE - adds arousal and stamina to hud
+ arousal = new /obj/screen/arousal()
+ arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "")
+ arousal.hud = src
+ infodisplay += arousal
+
+// staminas = new /obj/screen/staminas()
+// infodisplay += staminas
+
+// if(!CONFIG_GET(flag/disable_stambuffer))
+// staminabuffer = new /obj/screen/staminabuffer()
+// infodisplay += staminabuffer
+ //END OF CIT CHANGES
+
+ healthdoll = new /obj/screen/healthdoll()
+ healthdoll.hud = src
+ infodisplay += healthdoll
+
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = ui_style
+ pull_icon.hud = src
+ pull_icon.update_icon()
+ pull_icon.screen_loc = ui_pull_resist
+ static_inventory += pull_icon
+
+ lingchemdisplay = new /obj/screen/ling/chems()
+ lingchemdisplay.hud = src
+ infodisplay += lingchemdisplay
+
+ lingstingdisplay = new /obj/screen/ling/sting()
+ lingstingdisplay.hud = src
+ infodisplay += lingstingdisplay
+
+ devilsouldisplay = new /obj/screen/devil/soul_counter
+ devilsouldisplay.hud = src
+ infodisplay += devilsouldisplay
+
+ blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume
+ blood_display.hud = src
+ infodisplay += blood_display
+
+ vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank
+ vamprank_display.hud = src
+ infodisplay += vamprank_display
+
+ sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight
+ sunlight_display.hud = src
+ infodisplay += sunlight_display
+
+ zone_select = new /obj/screen/zone_sel()
+ zone_select.icon = ui_style
+ zone_select.hud = src
+ zone_select.update_icon()
+ static_inventory += zone_select
+
+ for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
+ if(inv.slot_id)
+ inv.hud = src
+ inv_slots[inv.slot_id] = inv
+ inv.update_icon()
+
+ update_locked_slots()
+
+/datum/hud/human/update_locked_slots()
+ if(!mymob)
+ return
+ var/mob/living/carbon/human/H = mymob
+ if(!istype(H) || !H.dna.species)
+ return
+ var/datum/species/S = H.dna.species
+ for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
+ if(inv.slot_id)
+ if(inv.slot_id in S.no_equip)
+ inv.alpha = 128
+ else
+ inv.alpha = initial(inv.alpha)
+
+/datum/hud/human/hidden_inventory_update(mob/viewer)
+ if(!mymob)
+ return
+ var/mob/living/carbon/human/H = mymob
+
+ var/mob/screenmob = viewer || H
+
+ if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown)
+ if(H.shoes)
+ H.shoes.screen_loc = ui_shoes
+ screenmob.client.screen += H.shoes
+ if(H.gloves)
+ H.gloves.screen_loc = ui_gloves
+ screenmob.client.screen += H.gloves
+ if(H.ears)
+ H.ears.screen_loc = ui_ears
+ screenmob.client.screen += H.ears
+ if(H.glasses)
+ H.glasses.screen_loc = ui_glasses
+ screenmob.client.screen += H.glasses
+ if(H.w_uniform)
+ H.w_uniform.screen_loc = ui_iclothing
+ screenmob.client.screen += H.w_uniform
+ if(H.wear_suit)
+ H.wear_suit.screen_loc = ui_oclothing
+ screenmob.client.screen += H.wear_suit
+ if(H.wear_mask)
+ H.wear_mask.screen_loc = ui_mask
+ screenmob.client.screen += H.wear_mask
+ if(H.wear_neck)
+ H.wear_neck.screen_loc = ui_neck
+ screenmob.client.screen += H.wear_neck
+ if(H.head)
+ H.head.screen_loc = ui_head
+ screenmob.client.screen += H.head
+ else
+ if(H.shoes) screenmob.client.screen -= H.shoes
+ if(H.gloves) screenmob.client.screen -= H.gloves
+ if(H.ears) screenmob.client.screen -= H.ears
+ if(H.glasses) screenmob.client.screen -= H.glasses
+ if(H.w_uniform) screenmob.client.screen -= H.w_uniform
+ if(H.wear_suit) screenmob.client.screen -= H.wear_suit
+ if(H.wear_mask) screenmob.client.screen -= H.wear_mask
+ if(H.wear_neck) screenmob.client.screen -= H.wear_neck
+ if(H.head) screenmob.client.screen -= H.head
+
+
+
+/datum/hud/human/persistent_inventory_update(mob/viewer)
+ if(!mymob)
+ return
+ ..()
+ var/mob/living/carbon/human/H = mymob
+
+ var/mob/screenmob = viewer || H
+
+ if(screenmob.hud_used)
+ if(screenmob.hud_used.hud_shown)
+ if(H.s_store)
+ H.s_store.screen_loc = ui_sstore1
+ screenmob.client.screen += H.s_store
+ if(H.wear_id)
+ H.wear_id.screen_loc = ui_id
+ screenmob.client.screen += H.wear_id
+ if(H.belt)
+ H.belt.screen_loc = ui_belt
+ screenmob.client.screen += H.belt
+ if(H.back)
+ H.back.screen_loc = ui_back
+ screenmob.client.screen += H.back
+ if(H.l_store)
+ H.l_store.screen_loc = ui_storage1
+ screenmob.client.screen += H.l_store
+ if(H.r_store)
+ H.r_store.screen_loc = ui_storage2
+ screenmob.client.screen += H.r_store
+ else
+ if(H.s_store)
+ screenmob.client.screen -= H.s_store
+ if(H.wear_id)
+ screenmob.client.screen -= H.wear_id
+ if(H.belt)
+ screenmob.client.screen -= H.belt
+ if(H.back)
+ screenmob.client.screen -= H.back
+ if(H.l_store)
+ screenmob.client.screen -= H.l_store
+ if(H.r_store)
+ screenmob.client.screen -= H.r_store
+
+ if(hud_version != HUD_STYLE_NOHUD)
+ for(var/obj/item/I in H.held_items)
+ I.screen_loc = ui_hand_position(H.get_held_index_of_item(I))
+ screenmob.client.screen += I
+ else
+ for(var/obj/item/I in H.held_items)
+ I.screen_loc = null
+ screenmob.client.screen -= I
+
+
+/mob/living/carbon/human/verb/toggle_hotkey_verbs()
+ set category = "OOC"
+ set name = "Toggle hotkey buttons"
+ set desc = "This disables or enables the user interface buttons which can be used with hotkeys."
+
+ if(hud_used.hotkey_ui_hidden)
+ client.screen += hud_used.hotkeybuttons
+ hud_used.hotkey_ui_hidden = FALSE
+ else
+ client.screen -= hud_used.hotkeybuttons
+ hud_used.hotkey_ui_hidden = TRUE
diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm
new file mode 100644
index 00000000..a36d9a0f
--- /dev/null
+++ b/code/_onclick/hud/lavaland_elite.dm
@@ -0,0 +1,16 @@
+/datum/hud/lavaland_elite
+ ui_style = 'icons/mob/screen_elite.dmi'
+
+/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite)
+ ..()
+
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = ui_style
+ pull_icon.hud = src
+ pull_icon.update_icon()
+ pull_icon.screen_loc = ui_living_pull
+ static_inventory += pull_icon
+
+ healths = new /obj/screen/healths/lavaland_elite()
+ healths.hud = src
+ infodisplay += healths
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index 454f762f..3d3c3cf6 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -1,151 +1,165 @@
-/datum/hud/monkey/New(mob/living/carbon/monkey/owner)
- ..()
- var/obj/screen/using
- var/obj/screen/inventory/inv_box
-
- action_intent = new /obj/screen/act_intent()
- action_intent.icon = ui_style
- action_intent.icon_state = mymob.a_intent
- action_intent.screen_loc = ui_acti
- static_inventory += action_intent
-
- using = new /obj/screen/mov_intent()
- using.icon = ui_style
- using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
- using.screen_loc = ui_movi
- static_inventory += using
-
- using = new/obj/screen/language_menu
- using.icon = ui_style
- static_inventory += using
-
- using = new /obj/screen/drop()
- using.icon = ui_style
- using.screen_loc = ui_drop_throw
- static_inventory += using
-
- build_hand_slots()
-
- using = new /obj/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_1_m" //extra wide!
- using.screen_loc = ui_swaphand_position(owner,1)
- static_inventory += using
-
- using = new /obj/screen/swap_hand()
- using.icon = ui_style
- using.icon_state = "swap_2"
- using.screen_loc = ui_swaphand_position(owner,2)
- static_inventory += using
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "mask"
- inv_box.icon = ui_style
- inv_box.icon_state = "mask"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_mask
- inv_box.slot_id = SLOT_WEAR_MASK
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "neck"
- inv_box.icon = ui_style
- inv_box.icon_state = "neck"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_neck
- inv_box.slot_id = SLOT_NECK
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "head"
- inv_box.icon = ui_style
- inv_box.icon_state = "head"
-// inv_box.icon_full = "template"
- inv_box.screen_loc = ui_monkey_head
- inv_box.slot_id = SLOT_HEAD
- static_inventory += inv_box
-
- inv_box = new /obj/screen/inventory()
- inv_box.name = "back"
- inv_box.icon = ui_style
- inv_box.icon_state = "back"
- inv_box.screen_loc = ui_monkey_back
- inv_box.slot_id = SLOT_BACK
- static_inventory += inv_box
-
- throw_icon = new /obj/screen/throw_catch()
- throw_icon.icon = ui_style
- throw_icon.screen_loc = ui_drop_throw
- hotkeybuttons += throw_icon
-
- internals = new /obj/screen/internals()
- infodisplay += internals
-
- healths = new /obj/screen/healths()
- infodisplay += healths
-
- pull_icon = new /obj/screen/pull()
- pull_icon.icon = ui_style
- pull_icon.update_icon(mymob)
- pull_icon.screen_loc = ui_pull_resist
- static_inventory += pull_icon
-
- lingchemdisplay = new /obj/screen/ling/chems()
- infodisplay += lingchemdisplay
-
- lingstingdisplay = new /obj/screen/ling/sting()
- infodisplay += lingstingdisplay
-
-
- zone_select = new /obj/screen/zone_sel()
- zone_select.icon = ui_style
- zone_select.update_icon(mymob)
- static_inventory += zone_select
-
- mymob.client.screen = list()
-
- using = new /obj/screen/resist()
- using.icon = ui_style
- using.screen_loc = ui_pull_resist
- hotkeybuttons += using
-
- for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
- if(inv.slot_id)
- inv.hud = src
- inv_slots[inv.slot_id] = inv
- inv.update_icon()
-
-/datum/hud/monkey/persistent_inventory_update()
- if(!mymob)
- return
- var/mob/living/carbon/monkey/M = mymob
-
- if(hud_shown)
- if(M.back)
- M.back.screen_loc = ui_monkey_back
- M.client.screen += M.back
- if(M.wear_mask)
- M.wear_mask.screen_loc = ui_monkey_mask
- M.client.screen += M.wear_mask
- if(M.wear_neck)
- M.wear_neck.screen_loc = ui_monkey_neck
- M.client.screen += M.wear_neck
- if(M.head)
- M.head.screen_loc = ui_monkey_head
- M.client.screen += M.head
- else
- if(M.back)
- M.back.screen_loc = null
- if(M.wear_mask)
- M.wear_mask.screen_loc = null
- if(M.head)
- M.head.screen_loc = null
-
- if(hud_version != HUD_STYLE_NOHUD)
- for(var/obj/item/I in M.held_items)
- I.screen_loc = ui_hand_position(M.get_held_index_of_item(I))
- M.client.screen += I
- else
- for(var/obj/item/I in M.held_items)
- I.screen_loc = null
- M.client.screen -= I
+/datum/hud/monkey/New(mob/living/carbon/monkey/owner)
+ ..()
+ var/obj/screen/using
+ var/obj/screen/inventory/inv_box
+
+ action_intent = new /obj/screen/act_intent()
+ action_intent.icon = ui_style
+ action_intent.icon_state = mymob.a_intent
+ action_intent.screen_loc = ui_acti
+ action_intent.hud = src
+ static_inventory += action_intent
+
+ using = new /obj/screen/mov_intent()
+ using.icon = ui_style
+ using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
+ using.screen_loc = ui_movi
+ using.hud = src
+ static_inventory += using
+
+ using = new/obj/screen/language_menu
+ using.icon = ui_style
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/drop()
+ using.icon = ui_style
+ using.screen_loc = ui_drop_throw
+ using.hud = src
+ static_inventory += using
+
+ build_hand_slots()
+
+ using = new /obj/screen/swap_hand()
+ using.icon = ui_style
+ using.icon_state = "swap_1_m" //extra wide!
+ using.screen_loc = ui_swaphand_position(owner,1)
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/swap_hand()
+ using.icon = ui_style
+ using.icon_state = "swap_2"
+ using.screen_loc = ui_swaphand_position(owner,2)
+ using.hud = src
+ static_inventory += using
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "mask"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "mask"
+// inv_box.icon_full = "template"
+ inv_box.screen_loc = ui_monkey_mask
+ inv_box.slot_id = SLOT_WEAR_MASK
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "neck"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "neck"
+// inv_box.icon_full = "template"
+ inv_box.screen_loc = ui_monkey_neck
+ inv_box.slot_id = SLOT_NECK
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "head"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "head"
+// inv_box.icon_full = "template"
+ inv_box.screen_loc = ui_monkey_head
+ inv_box.slot_id = SLOT_HEAD
+ static_inventory += inv_box
+
+ inv_box = new /obj/screen/inventory()
+ inv_box.name = "back"
+ inv_box.icon = ui_style
+ inv_box.icon_state = "back"
+ inv_box.screen_loc = ui_monkey_back
+ inv_box.slot_id = SLOT_BACK
+ static_inventory += inv_box
+
+ throw_icon = new /obj/screen/throw_catch()
+ throw_icon.icon = ui_style
+ throw_icon.screen_loc = ui_drop_throw
+ throw_icon.hud = src
+ hotkeybuttons += throw_icon
+
+ internals = new /obj/screen/internals()
+ internals.hud = src
+ infodisplay += internals
+
+ healths = new /obj/screen/healths()
+ healths.hud = src
+ infodisplay += healths
+
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = ui_style
+ pull_icon.screen_loc = ui_pull_resist
+ pull_icon.hud = src
+ pull_icon.update_icon()
+ static_inventory += pull_icon
+
+ lingchemdisplay = new /obj/screen/ling/chems()
+ lingchemdisplay.hud = src
+ infodisplay += lingchemdisplay
+
+ lingstingdisplay = new /obj/screen/ling/sting()
+ lingstingdisplay.hud = src
+ infodisplay += lingstingdisplay
+
+
+ zone_select = new /obj/screen/zone_sel()
+ zone_select.icon = ui_style
+ zone_select.hud = src
+ zone_select.update_icon()
+ static_inventory += zone_select
+
+ mymob.client.screen = list()
+
+ using = new /obj/screen/resist()
+ using.icon = ui_style
+ using.screen_loc = ui_pull_resist
+ using.hud = src
+ hotkeybuttons += using
+
+ for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
+ if(inv.slot_id)
+ inv.hud = src
+ inv_slots[inv.slot_id] = inv
+ inv.update_icon()
+
+/datum/hud/monkey/persistent_inventory_update()
+ if(!mymob)
+ return
+ var/mob/living/carbon/monkey/M = mymob
+
+ if(hud_shown)
+ if(M.back)
+ M.back.screen_loc = ui_monkey_back
+ M.client.screen += M.back
+ if(M.wear_mask)
+ M.wear_mask.screen_loc = ui_monkey_mask
+ M.client.screen += M.wear_mask
+ if(M.wear_neck)
+ M.wear_neck.screen_loc = ui_monkey_neck
+ M.client.screen += M.wear_neck
+ if(M.head)
+ M.head.screen_loc = ui_monkey_head
+ M.client.screen += M.head
+ else
+ if(M.back)
+ M.back.screen_loc = null
+ if(M.wear_mask)
+ M.wear_mask.screen_loc = null
+ if(M.head)
+ M.head.screen_loc = null
+
+ if(hud_version != HUD_STYLE_NOHUD)
+ for(var/obj/item/I in M.held_items)
+ I.screen_loc = ui_hand_position(M.get_held_index_of_item(I))
+ M.client.screen += I
+ else
+ for(var/obj/item/I in M.held_items)
+ I.screen_loc = null
+ M.client.screen -= I
diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm
index bc8a2bde..93693139 100644
--- a/code/_onclick/hud/revenanthud.dm
+++ b/code/_onclick/hud/revenanthud.dm
@@ -3,4 +3,5 @@
..()
healths = new /obj/screen/healths/revenant()
+ healths.hud = src
infodisplay += healths
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index ee18f147..61b10c4f 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -1,272 +1,287 @@
-/obj/screen/robot
- icon = 'icons/mob/screen_cyborg.dmi'
-
-/obj/screen/robot/module
- name = "cyborg module"
- icon_state = "nomod"
-
-/obj/screen/robot/Click()
- if(isobserver(usr))
- return 1
-
-/obj/screen/robot/module/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- if(R.module.type != /obj/item/robot_module)
- R.hud_used.toggle_show_robot_modules()
- return 1
- R.pick_module()
-
-/obj/screen/robot/module1
- name = "module1"
- icon_state = "inv1"
-
-/obj/screen/robot/module1/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.toggle_module(1)
-
-/obj/screen/robot/module2
- name = "module2"
- icon_state = "inv2"
-
-/obj/screen/robot/module2/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.toggle_module(2)
-
-/obj/screen/robot/module3
- name = "module3"
- icon_state = "inv3"
-
-/obj/screen/robot/module3/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.toggle_module(3)
-
-/obj/screen/robot/radio
- name = "radio"
- icon_state = "radio"
-
-/obj/screen/robot/radio/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.radio.interact(R)
-
-/obj/screen/robot/store
- name = "store"
- icon_state = "store"
-
-/obj/screen/robot/store/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.uneq_active()
-
-/obj/screen/robot/lamp
- name = "headlamp"
- icon_state = "lamp0"
-
-/obj/screen/robot/lamp/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.control_headlamp()
-
-/obj/screen/robot/thrusters
- name = "ion thrusters"
- icon_state = "ionpulse0"
-
-/obj/screen/robot/thrusters/Click()
- if(..())
- return
- var/mob/living/silicon/robot/R = usr
- R.toggle_ionpulse()
-
-/datum/hud/robot
- ui_style = 'icons/mob/screen_cyborg.dmi'
-
-/datum/hud/robot/New(mob/owner)
- ..()
- var/mob/living/silicon/robot/mymobR = mymob
- var/obj/screen/using
-
- using = new/obj/screen/language_menu
- using.screen_loc = ui_borg_language_menu
- static_inventory += using
-
-//Radio
- using = new /obj/screen/robot/radio()
- using.screen_loc = ui_borg_radio
- static_inventory += using
-
-//Module select
- using = new /obj/screen/robot/module1()
- using.screen_loc = ui_inv1
- static_inventory += using
- mymobR.inv1 = using
-
- using = new /obj/screen/robot/module2()
- using.screen_loc = ui_inv2
- static_inventory += using
- mymobR.inv2 = using
-
- using = new /obj/screen/robot/module3()
- using.screen_loc = ui_inv3
- static_inventory += using
- mymobR.inv3 = using
-
-//End of module select
-
-//Photography stuff
- using = new /obj/screen/ai/image_take()
- using.screen_loc = ui_borg_camera
- static_inventory += using
-
- using = new /obj/screen/ai/image_view()
- using.screen_loc = ui_borg_album
- static_inventory += using
-
-//Sec/Med HUDs
- using = new /obj/screen/ai/sensors()
- using.screen_loc = ui_borg_sensor
- static_inventory += using
-
-//Headlamp control
- using = new /obj/screen/robot/lamp()
- using.screen_loc = ui_borg_lamp
- static_inventory += using
- mymobR.lamp_button = using
-
-//Thrusters
- using = new /obj/screen/robot/thrusters()
- using.screen_loc = ui_borg_thrusters
- static_inventory += using
- mymobR.thruster_button = using
-
-//Intent
- action_intent = new /obj/screen/act_intent/robot()
- action_intent.icon_state = mymob.a_intent
- static_inventory += action_intent
-
-//Health
- healths = new /obj/screen/healths/robot()
- infodisplay += healths
-
-//Installed Module
- mymobR.hands = new /obj/screen/robot/module()
- mymobR.hands.screen_loc = ui_borg_module
- static_inventory += mymobR.hands
-
-//Store
- module_store_icon = new /obj/screen/robot/store()
- module_store_icon.screen_loc = ui_borg_store
-
- pull_icon = new /obj/screen/pull()
- pull_icon.icon = 'icons/mob/screen_cyborg.dmi'
- pull_icon.update_icon(mymob)
- pull_icon.screen_loc = ui_borg_pull
- hotkeybuttons += pull_icon
-
-
- zone_select = new /obj/screen/zone_sel/robot()
- zone_select.update_icon(mymob)
- static_inventory += zone_select
-
-
-/datum/hud/proc/toggle_show_robot_modules()
- if(!iscyborg(mymob))
- return
-
- var/mob/living/silicon/robot/R = mymob
-
- R.shown_robot_modules = !R.shown_robot_modules
- update_robot_modules_display()
-
-/datum/hud/proc/update_robot_modules_display(mob/viewer)
- if(!iscyborg(mymob))
- return
-
- var/mob/living/silicon/robot/R = mymob
-
- var/mob/screenmob = viewer || R
-
- if(!R.module)
- return
-
- if(!R.client)
- return
-
- if(R.shown_robot_modules && screenmob.hud_used.hud_shown)
- //Modules display is shown
- screenmob.client.screen += module_store_icon //"store" icon
-
- if(!R.module.modules)
- to_chat(usr, "Selected module has no modules to select")
- return
-
- if(!R.robot_modules_background)
- return
-
- var/display_rows = CEILING(length(R.module.get_inactive_modules()) / 8, 1)
- R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
- screenmob.client.screen += R.robot_modules_background
-
- var/x = -4 //Start at CENTER-4,SOUTH+1
- var/y = 1
-
- for(var/atom/movable/A in R.module.get_inactive_modules())
- //Module is not currently active
- screenmob.client.screen += A
- if(x < 0)
- A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
- else
- A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
- A.layer = ABOVE_HUD_LAYER
- A.plane = ABOVE_HUD_PLANE
-
- x++
- if(x == 4)
- x = -4
- y++
-
- else
- //Modules display is hidden
- screenmob.client.screen -= module_store_icon //"store" icon
-
- for(var/atom/A in R.module.get_inactive_modules())
- //Module is not currently active
- screenmob.client.screen -= A
- R.shown_robot_modules = 0
- screenmob.client.screen -= R.robot_modules_background
-
-/datum/hud/robot/persistent_inventory_update(mob/viewer)
- if(!mymob)
- return
- var/mob/living/silicon/robot/R = mymob
-
- var/mob/screenmob = viewer || R
-
- if(screenmob.hud_used)
- if(screenmob.hud_used.hud_shown)
- for(var/i in 1 to R.held_items.len)
- var/obj/item/I = R.held_items[i]
- if(I)
- switch(i)
- if(1)
- I.screen_loc = ui_inv1
- if(2)
- I.screen_loc = ui_inv2
- if(3)
- I.screen_loc = ui_inv3
- else
- return
- screenmob.client.screen += I
- else
- for(var/obj/item/I in R.held_items)
- screenmob.client.screen -= I
+/obj/screen/robot
+ icon = 'icons/mob/screen_cyborg.dmi'
+
+/obj/screen/robot/module
+ name = "cyborg module"
+ icon_state = "nomod"
+
+/obj/screen/robot/Click()
+ if(isobserver(usr))
+ return 1
+
+/obj/screen/robot/module/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ if(R.module.type != /obj/item/robot_module)
+ R.hud_used.toggle_show_robot_modules()
+ return 1
+ R.pick_module()
+
+/obj/screen/robot/module1
+ name = "module1"
+ icon_state = "inv1"
+
+/obj/screen/robot/module1/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.toggle_module(1)
+
+/obj/screen/robot/module2
+ name = "module2"
+ icon_state = "inv2"
+
+/obj/screen/robot/module2/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.toggle_module(2)
+
+/obj/screen/robot/module3
+ name = "module3"
+ icon_state = "inv3"
+
+/obj/screen/robot/module3/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.toggle_module(3)
+
+/obj/screen/robot/radio
+ name = "radio"
+ icon_state = "radio"
+
+/obj/screen/robot/radio/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.radio.interact(R)
+
+/obj/screen/robot/store
+ name = "store"
+ icon_state = "store"
+
+/obj/screen/robot/store/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.uneq_active()
+
+/obj/screen/robot/lamp
+ name = "headlamp"
+ icon_state = "lamp0"
+
+/obj/screen/robot/lamp/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.control_headlamp()
+
+/obj/screen/robot/thrusters
+ name = "ion thrusters"
+ icon_state = "ionpulse0"
+
+/obj/screen/robot/thrusters/Click()
+ if(..())
+ return
+ var/mob/living/silicon/robot/R = usr
+ R.toggle_ionpulse()
+
+/datum/hud/robot
+ ui_style = 'icons/mob/screen_cyborg.dmi'
+
+/datum/hud/robot/New(mob/owner)
+ ..()
+ var/mob/living/silicon/robot/mymobR = mymob
+ var/obj/screen/using
+
+ using = new/obj/screen/language_menu
+ using.screen_loc = ui_borg_language_menu
+ using.hud = src
+ static_inventory += using
+
+//Radio
+ using = new /obj/screen/robot/radio()
+ using.screen_loc = ui_borg_radio
+ using.hud = src
+ static_inventory += using
+
+//Module select
+ using = new /obj/screen/robot/module1()
+ using.screen_loc = ui_inv1
+ using.hud = src
+ static_inventory += using
+ mymobR.inv1 = using
+
+ using = new /obj/screen/robot/module2()
+ using.screen_loc = ui_inv2
+ using.hud = src
+ static_inventory += using
+ mymobR.inv2 = using
+
+ using = new /obj/screen/robot/module3()
+ using.screen_loc = ui_inv3
+ using.hud = src
+ static_inventory += using
+ mymobR.inv3 = using
+
+//End of module select
+
+//Photography stuff
+ using = new /obj/screen/ai/image_take()
+ using.screen_loc = ui_borg_camera
+ using.hud = src
+ static_inventory += using
+
+ using = new /obj/screen/ai/image_view()
+ using.screen_loc = ui_borg_album
+ using.hud = src
+ static_inventory += using
+
+//Sec/Med HUDs
+ using = new /obj/screen/ai/sensors()
+ using.screen_loc = ui_borg_sensor
+ using.hud = src
+ static_inventory += using
+
+//Headlamp control
+ using = new /obj/screen/robot/lamp()
+ using.screen_loc = ui_borg_lamp
+ using.hud = src
+ static_inventory += using
+ mymobR.lamp_button = using
+
+//Thrusters
+ using = new /obj/screen/robot/thrusters()
+ using.screen_loc = ui_borg_thrusters
+ using.hud = src
+ static_inventory += using
+ mymobR.thruster_button = using
+
+//Intent
+ action_intent = new /obj/screen/act_intent/robot()
+ action_intent.icon_state = mymob.a_intent
+ action_intent.hud = src
+ static_inventory += action_intent
+
+//Health
+ healths = new /obj/screen/healths/robot()
+ healths.hud = src
+ infodisplay += healths
+
+//Installed Module
+ mymobR.hands = new /obj/screen/robot/module()
+ mymobR.hands.screen_loc = ui_borg_module
+ static_inventory += mymobR.hands
+
+//Store
+ module_store_icon = new /obj/screen/robot/store()
+ module_store_icon.hud = src
+ module_store_icon.screen_loc = ui_borg_store
+
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = 'icons/mob/screen_cyborg.dmi'
+ pull_icon.hud = src
+ pull_icon.update_icon()
+ pull_icon.screen_loc = ui_borg_pull
+ hotkeybuttons += pull_icon
+
+
+ zone_select = new /obj/screen/zone_sel/robot()
+ zone_select.hud = src
+ zone_select.update_icon()
+ static_inventory += zone_select
+
+
+/datum/hud/proc/toggle_show_robot_modules()
+ if(!iscyborg(mymob))
+ return
+
+ var/mob/living/silicon/robot/R = mymob
+
+ R.shown_robot_modules = !R.shown_robot_modules
+ update_robot_modules_display()
+
+/datum/hud/proc/update_robot_modules_display(mob/viewer)
+ if(!iscyborg(mymob))
+ return
+
+ var/mob/living/silicon/robot/R = mymob
+
+ var/mob/screenmob = viewer || R
+
+ if(!R.module)
+ return
+
+ if(!R.client)
+ return
+
+ if(R.shown_robot_modules && screenmob.hud_used.hud_shown)
+ //Modules display is shown
+ screenmob.client.screen += module_store_icon //"store" icon
+
+ if(!R.module.modules)
+ to_chat(usr, "Selected module has no modules to select")
+ return
+
+ if(!R.robot_modules_background)
+ return
+
+ var/display_rows = CEILING(length(R.module.get_inactive_modules()) / 8, 1)
+ R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
+ screenmob.client.screen += R.robot_modules_background
+
+ var/x = -4 //Start at CENTER-4,SOUTH+1
+ var/y = 1
+
+ for(var/atom/movable/A in R.module.get_inactive_modules())
+ //Module is not currently active
+ screenmob.client.screen += A
+ if(x < 0)
+ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
+ else
+ A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
+ A.layer = ABOVE_HUD_LAYER
+ A.plane = ABOVE_HUD_PLANE
+
+ x++
+ if(x == 4)
+ x = -4
+ y++
+
+ else
+ //Modules display is hidden
+ screenmob.client.screen -= module_store_icon //"store" icon
+
+ for(var/atom/A in R.module.get_inactive_modules())
+ //Module is not currently active
+ screenmob.client.screen -= A
+ R.shown_robot_modules = 0
+ screenmob.client.screen -= R.robot_modules_background
+
+/datum/hud/robot/persistent_inventory_update(mob/viewer)
+ if(!mymob)
+ return
+ var/mob/living/silicon/robot/R = mymob
+
+ var/mob/screenmob = viewer || R
+
+ if(screenmob.hud_used)
+ if(screenmob.hud_used.hud_shown)
+ for(var/i in 1 to R.held_items.len)
+ var/obj/item/I = R.held_items[i]
+ if(I)
+ switch(i)
+ if(1)
+ I.screen_loc = ui_inv1
+ if(2)
+ I.screen_loc = ui_inv2
+ if(3)
+ I.screen_loc = ui_inv3
+ else
+ return
+ screenmob.client.screen += I
+ else
+ for(var/obj/item/I in R.held_items)
+ screenmob.client.screen -= I
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 5c946dc5..00f84851 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -1,705 +1,704 @@
-/*
- Screen objects
- Todo: improve/re-implement
-
- Screen objects are only used for the hud and should not appear anywhere "in-game".
- They are used with the client/screen list and the screen_loc var.
- For more information, see the byond documentation on the screen_loc and screen vars.
-*/
-/obj/screen
- name = ""
- icon = 'icons/mob/screen_gen.dmi'
- layer = HUD_LAYER
- plane = HUD_PLANE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- appearance_flags = APPEARANCE_UI
- var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
- var/datum/hud/hud = null // A reference to the owner HUD, if any.
-
-/obj/screen/take_damage()
- return
-
-/obj/screen/Destroy()
- master = null
- hud = null
- return ..()
-
-/obj/screen/examine(mob/user)
- return list()
-
-/obj/screen/orbit()
- return
-
-/obj/screen/proc/component_click(obj/screen/component_button/component, params)
- return
-
-/obj/screen/text
- icon = null
- icon_state = null
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- screen_loc = "CENTER-7,CENTER-7"
- maptext_height = 480
- maptext_width = 480
-
-/obj/screen/swap_hand
- layer = HUD_LAYER
- plane = HUD_PLANE
- name = "swap hand"
-
-/obj/screen/swap_hand/Click()
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return 1
-
- if(usr.incapacitated())
- return 1
-
- if(ismob(usr))
- var/mob/M = usr
- M.swap_hand()
- return 1
-
-/obj/screen/craft
- name = "crafting menu"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "craft"
- screen_loc = ui_crafting
-
-/obj/screen/area_creator
- name = "create new area"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "area_edit"
- screen_loc = ui_building
-
-/obj/screen/area_creator/Click()
- if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr)))
- return TRUE
- var/area/A = get_area(usr)
- if(!A.outdoors)
- to_chat(usr, "There is already a defined structure here.")
- return TRUE
- create_area(usr)
-
-/obj/screen/language_menu
- name = "language menu"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "talk_wheel"
- screen_loc = ui_language_menu
-
-/obj/screen/language_menu/Click()
- var/mob/M = usr
- var/datum/language_holder/H = M.get_language_holder()
- H.open_language_menu(usr)
-
-/obj/screen/inventory
- var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
- var/icon_empty // Icon when empty. For now used only by humans.
- var/icon_full // Icon when contains an item. For now used only by humans.
- var/list/object_overlays = list()
- layer = HUD_LAYER
- plane = HUD_PLANE
-
-/obj/screen/inventory/Click(location, control, params)
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return 1
-
- if(usr.incapacitated())
- return 1
- if(ismecha(usr.loc)) // stops inventory actions in a mech
- return 1
-
- if(hud && hud.mymob && slot_id)
- var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
- if(inv_item)
- return inv_item.Click(location, control, params)
-
- if(usr.attack_ui(slot_id))
- usr.update_inv_hands()
- return 1
-
-/obj/screen/inventory/MouseEntered()
- ..()
- add_overlays()
-
-/obj/screen/inventory/MouseExited()
- ..()
- cut_overlay(object_overlays)
- object_overlays.Cut()
-
-/obj/screen/inventory/update_icon()
- if(!icon_empty)
- icon_empty = icon_state
-
- if(hud && hud.mymob && slot_id && icon_full)
- if(hud.mymob.get_item_by_slot(slot_id))
- icon_state = icon_full
- else
- icon_state = icon_empty
-
-/obj/screen/inventory/proc/add_overlays()
- var/mob/user = hud.mymob
-
- if(hud && user && slot_id)
- var/obj/item/holding = user.get_active_held_item()
-
- if(!holding || user.get_item_by_slot(slot_id))
- return
-
- var/image/item_overlay = image(holding)
- item_overlay.alpha = 92
-
- if(!user.can_equip(holding, slot_id, disable_warning = TRUE))
- item_overlay.color = "#FF0000"
- else
- item_overlay.color = "#00ff00"
-
- object_overlays += item_overlay
- add_overlay(object_overlays)
-
-/obj/screen/inventory/hand
- var/mutable_appearance/handcuff_overlay
- var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked")
- var/held_index = 0
-
-/obj/screen/inventory/hand/update_icon()
- ..()
-
- if(!handcuff_overlay)
- var/state = (!(held_index % 2)) ? "markus" : "gabrielle"
- handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state)
-
- cut_overlays()
-
- if(hud && hud.mymob)
- if(iscarbon(hud.mymob))
- var/mob/living/carbon/C = hud.mymob
- if(C.handcuffed)
- add_overlay(handcuff_overlay)
-
- if(held_index)
- if(!C.has_hand_for_held_index(held_index))
- add_overlay(blocked_overlay)
-
- if(held_index == hud.mymob.active_hand_index)
- add_overlay("hand_active")
-
-
-/obj/screen/inventory/hand/Click(location, control, params)
- // At this point in client Click() code we have passed the 1/10 sec check and little else
- // We don't even know if it's a middle click
- if(world.time <= usr.next_move)
- return 1
- if(usr.incapacitated() || isobserver(usr))
- return 1
- if (ismecha(usr.loc)) // stops inventory actions in a mech
- return 1
-
- if(hud.mymob.active_hand_index == held_index)
- var/obj/item/I = hud.mymob.get_active_held_item()
- if(I)
- I.Click(location, control, params)
- else
- hud.mymob.swap_hand(held_index)
- return 1
-
-/obj/screen/close
- name = "close"
- layer = ABOVE_HUD_LAYER
- plane = ABOVE_HUD_PLANE
- icon_state = "backpack_close"
-
-/obj/screen/close/Initialize(mapload, new_master)
- . = ..()
- master = new_master
-
-/obj/screen/close/Click()
- var/datum/component/storage/S = master
- S.hide_from(usr)
- return TRUE
-
-/obj/screen/drop
- name = "drop"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "act_drop"
- layer = HUD_LAYER
- plane = HUD_PLANE
-
-/obj/screen/drop/Click()
- if(usr.stat == CONSCIOUS)
- usr.dropItemToGround(usr.get_active_held_item())
-
-/obj/screen/act_intent
- name = "intent"
- icon_state = "help"
- screen_loc = ui_acti
-
-/obj/screen/act_intent/Click(location, control, params)
- usr.a_intent_change(INTENT_HOTKEY_RIGHT)
-
-/obj/screen/act_intent/segmented/Click(location, control, params)
- if(usr.client.prefs.toggles & INTENT_STYLE)
- var/_x = text2num(params2list(params)["icon-x"])
- var/_y = text2num(params2list(params)["icon-y"])
-
- if(_x<=16 && _y<=16)
- usr.a_intent_change(INTENT_HARM)
-
- else if(_x<=16 && _y>=17)
- usr.a_intent_change(INTENT_HELP)
-
- else if(_x>=17 && _y<=16)
- usr.a_intent_change(INTENT_GRAB)
-
- else if(_x>=17 && _y>=17)
- usr.a_intent_change(INTENT_DISARM)
- else
- return ..()
-
-/obj/screen/act_intent/alien
- icon = 'icons/mob/screen_alien.dmi'
- screen_loc = ui_movi
-
-/obj/screen/act_intent/robot
- icon = 'icons/mob/screen_cyborg.dmi'
- screen_loc = ui_borg_intents
-
-/obj/screen/internals
- name = "toggle internals"
- icon_state = "internal0"
- screen_loc = ui_internal
-
-/obj/screen/internals/Click()
- if(!iscarbon(usr))
- return
- var/mob/living/carbon/C = usr
- if(C.incapacitated())
- return
-
- if(C.internal)
- C.internal = null
- to_chat(C, "You are no longer running on internals.")
- icon_state = "internal0"
- else
- if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- var/obj/item/clothing/check
- var/internals = FALSE
-
- for(check in GET_INTERNAL_SLOTS(C))
- if(istype(check, /obj/item/clothing/mask))
- var/obj/item/clothing/mask/M = check
- if(M.mask_adjusted)
- M.adjustmask(C)
- if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
- internals = TRUE
- if(!internals)
- to_chat(C, "You are not wearing an internals mask!")
- return
-
- var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
- if(I)
- to_chat(C, "You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))].")
- C.internal = I
- else if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(istype(H.s_store, /obj/item/tank))
- to_chat(H, "You are now running on internals from [H.s_store] on your [H.wear_suit.name].")
- H.internal = H.s_store
- else if(istype(H.belt, /obj/item/tank))
- to_chat(H, "You are now running on internals from [H.belt] on your belt.")
- H.internal = H.belt
- else if(istype(H.l_store, /obj/item/tank))
- to_chat(H, "You are now running on internals from [H.l_store] in your left pocket.")
- H.internal = H.l_store
- else if(istype(H.r_store, /obj/item/tank))
- to_chat(H, "You are now running on internals from [H.r_store] in your right pocket.")
- H.internal = H.r_store
-
- //Separate so CO2 jetpacks are a little less cumbersome.
- if(!C.internal && istype(C.back, /obj/item/tank))
- to_chat(C, "You are now running on internals from [C.back] on your back.")
- C.internal = C.back
-
- if(C.internal)
- icon_state = "internal1"
- else
- to_chat(C, "You don't have an oxygen tank!")
- return
- C.update_action_buttons_icon()
-
-/obj/screen/mov_intent
- name = "run/walk toggle"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "running"
-
-/obj/screen/mov_intent/Click()
- toggle(usr)
-
-/obj/screen/mov_intent/update_icon(mob/user)
- if(!user && hud)
- user = hud.mymob
- if(!user)
- return
- switch(user.m_intent)
- if(MOVE_INTENT_WALK)
- icon_state = "walking"
-
- if(MOVE_INTENT_RUN)
- icon_state = "running"
-
-/obj/screen/mov_intent/proc/toggle(mob/user)
- if(isobserver(user))
- return
- user.toggle_move_intent(user)
-
-/obj/screen/pull
- name = "stop pulling"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "pull"
-
-/obj/screen/pull/Click()
- if(isobserver(usr))
- return
- usr.stop_pulling()
-
-/obj/screen/pull/update_icon(mob/mymob)
- if(!mymob)
- return
- if(mymob.pulling)
- icon_state = "pull"
- else
- icon_state = "pull0"
-
-/obj/screen/resist
- name = "resist"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "act_resist"
- layer = HUD_LAYER
- plane = HUD_PLANE
-
-/obj/screen/resist/Click()
- if(isliving(usr))
- var/mob/living/L = usr
- L.resist()
-
-/obj/screen/rest
- name = "rest"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "act_rest"
- layer = HUD_LAYER
- plane = HUD_PLANE
-
-/obj/screen/rest/Click()
- if(isliving(usr))
- var/mob/living/L = usr
- L.lay_down()
-
-/obj/screen/rest/update_icon(mob/mymob)
- if(!isliving(mymob))
- return
- var/mob/living/L = mymob
- if(!L.resting)
- icon_state = "act_rest"
- else
- icon_state = "act_rest0"
-
-/obj/screen/storage
- name = "storage"
- icon_state = "block"
- screen_loc = "7,7 to 10,8"
- layer = HUD_LAYER
- plane = HUD_PLANE
-
-/obj/screen/storage/Initialize(mapload, new_master)
- . = ..()
- master = new_master
-
-/obj/screen/storage/Click(location, control, params)
- if(world.time <= usr.next_move)
- return TRUE
- if(usr.incapacitated())
- return TRUE
- if (ismecha(usr.loc)) // stops inventory actions in a mech
- return TRUE
- if(master)
- var/obj/item/I = usr.get_active_held_item()
- if(I)
- master.attackby(null, I, usr, params)
- return TRUE
-
-/obj/screen/throw_catch
- name = "throw/catch"
- icon = 'icons/mob/screen_midnight.dmi'
- icon_state = "act_throw_off"
-
-/obj/screen/throw_catch/Click()
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- C.toggle_throw_mode()
-
-/obj/screen/zone_sel
- name = "damage zone"
- icon_state = "zone_sel"
- screen_loc = ui_zonesel
- var/selecting = BODY_ZONE_CHEST
- var/static/list/hover_overlays_cache = list()
- var/hovering
-
-/obj/screen/zone_sel/Click(location, control,params)
- if(isobserver(usr))
- return
-
- var/list/PL = params2list(params)
- var/icon_x = text2num(PL["icon-x"])
- var/icon_y = text2num(PL["icon-y"])
- var/choice = get_zone_at(icon_x, icon_y)
- if (!choice)
- return 1
-
- return set_selected_zone(choice, usr)
-
-/obj/screen/zone_sel/MouseEntered(location, control, params)
- MouseMove(location, control, params)
-
-/obj/screen/zone_sel/MouseMove(location, control, params)
- if(isobserver(usr))
- return
-
- var/list/PL = params2list(params)
- var/icon_x = text2num(PL["icon-x"])
- var/icon_y = text2num(PL["icon-y"])
- var/choice = get_zone_at(icon_x, icon_y)
-
- if(hovering == choice)
- return
- vis_contents -= hover_overlays_cache[hovering]
- hovering = choice
-
- var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice]
- if(!overlay_object)
- overlay_object = new
- overlay_object.icon_state = "[choice]"
- hover_overlays_cache[choice] = overlay_object
- vis_contents += overlay_object
-
-/obj/effect/overlay/zone_sel
- icon = 'icons/mob/screen_gen.dmi'
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- alpha = 128
- anchored = TRUE
- layer = ABOVE_HUD_LAYER
- plane = ABOVE_HUD_PLANE
-
-/obj/screen/zone_sel/MouseExited(location, control, params)
- if(!isobserver(usr) && hovering)
- vis_contents -= hover_overlays_cache[hovering]
- hovering = null
-
-/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y)
- switch(icon_y)
- if(1 to 9) //Legs
- switch(icon_x)
- if(10 to 15)
- return BODY_ZONE_R_LEG
- if(17 to 22)
- return BODY_ZONE_L_LEG
- if(10 to 13) //Hands and groin
- switch(icon_x)
- if(8 to 11)
- return BODY_ZONE_R_ARM
- if(12 to 20)
- return BODY_ZONE_PRECISE_GROIN
- if(21 to 24)
- return BODY_ZONE_L_ARM
- if(14 to 22) //Chest and arms to shoulders
- switch(icon_x)
- if(8 to 11)
- return BODY_ZONE_R_ARM
- if(12 to 20)
- return BODY_ZONE_CHEST
- if(21 to 24)
- return BODY_ZONE_L_ARM
- if(23 to 30) //Head, but we need to check for eye or mouth
- if(icon_x in 12 to 20)
- switch(icon_y)
- if(23 to 24)
- if(icon_x in 15 to 17)
- return BODY_ZONE_PRECISE_MOUTH
- if(26) //Eyeline, eyes are on 15 and 17
- if(icon_x in 14 to 18)
- return BODY_ZONE_PRECISE_EYES
- if(25 to 27)
- if(icon_x in 15 to 17)
- return BODY_ZONE_PRECISE_EYES
- return BODY_ZONE_HEAD
-
-/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user)
- if(isobserver(user))
- return
-
- if(choice != selecting)
- selecting = choice
- update_icon(usr)
- return 1
-
-/obj/screen/zone_sel/update_icon(mob/user)
- cut_overlays()
- add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]"))
- user.zone_selected = selecting
-
-/obj/screen/zone_sel/alien
- icon = 'icons/mob/screen_alien.dmi'
-
-/obj/screen/zone_sel/alien/update_icon(mob/user)
- cut_overlays()
- add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]"))
- user.zone_selected = selecting
-
-/obj/screen/zone_sel/robot
- icon = 'icons/mob/screen_cyborg.dmi'
-
-
-/obj/screen/flash
- name = "flash"
- icon_state = "blank"
- blend_mode = BLEND_ADD
- screen_loc = "WEST,SOUTH to EAST,NORTH"
- layer = FLASH_LAYER
- plane = FULLSCREEN_PLANE
-
-/obj/screen/damageoverlay
- icon = 'icons/mob/screen_full.dmi'
- icon_state = "oxydamageoverlay0"
- name = "dmg"
- blend_mode = BLEND_MULTIPLY
- screen_loc = "CENTER-7,CENTER-7"
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- layer = UI_DAMAGE_LAYER
- plane = FULLSCREEN_PLANE
-
-/obj/screen/healths
- name = "health"
- icon_state = "health0"
- screen_loc = ui_health
-
-/obj/screen/healths/alien
- icon = 'icons/mob/screen_alien.dmi'
- screen_loc = ui_alien_health
-
-/obj/screen/healths/robot
- icon = 'icons/mob/screen_cyborg.dmi'
- screen_loc = ui_borg_health
-
-/obj/screen/healths/blob
- name = "blob health"
- icon_state = "block"
- screen_loc = ui_internal
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/obj/screen/healths/blob/naut
- name = "health"
- icon = 'icons/mob/blob.dmi'
- icon_state = "nauthealth"
-
-/obj/screen/healths/blob/naut/core
- name = "overmind health"
- screen_loc = ui_health
- icon_state = "corehealth"
-
-/obj/screen/healths/guardian
- name = "summoner health"
- icon = 'icons/mob/guardian.dmi'
- icon_state = "base"
- screen_loc = ui_health
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/obj/screen/healths/clock
- icon = 'icons/mob/actions.dmi'
- icon_state = "bg_clock"
- screen_loc = ui_health
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/obj/screen/healths/clock/gear
- icon = 'icons/mob/clockwork_mobs.dmi'
- icon_state = "bg_gear"
- screen_loc = ui_internal
-
-/obj/screen/healths/revenant
- name = "essence"
- icon = 'icons/mob/actions.dmi'
- icon_state = "bg_revenant"
- screen_loc = ui_health
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/obj/screen/healths/construct
- icon = 'icons/mob/screen_construct.dmi'
- icon_state = "artificer_health0"
- screen_loc = ui_construct_health
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
-
-/obj/screen/healthdoll
- name = "health doll"
- screen_loc = ui_healthdoll
-
-/obj/screen/mood
- name = "mood"
- icon_state = "mood5"
- screen_loc = ui_mood
-
-/obj/screen/splash
- icon = 'icons/blank_title.png'
- icon_state = ""
- screen_loc = "1,1"
- layer = SPLASHSCREEN_LAYER
- plane = SPLASHSCREEN_PLANE
- var/client/holder
-
-/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy
- . = ..()
-
- holder = C
-
- if(!visible)
- alpha = 0
-
- if(!use_previous_title)
- if(SStitle.icon)
- icon = SStitle.icon
- else
- if(!SStitle.previous_icon)
- qdel(src)
- return
- icon = SStitle.previous_icon
-
- holder.screen += src
-
-/obj/screen/splash/proc/Fade(out, qdel_after = TRUE)
- if(QDELETED(src))
- return
- if(out)
- animate(src, alpha = 0, time = 30)
- else
- alpha = 0
- animate(src, alpha = 255, time = 30)
- if(qdel_after)
- QDEL_IN(src, 30)
-
-/obj/screen/splash/Destroy()
- if(holder)
- holder.screen -= src
- holder = null
- return ..()
-
-
-/obj/screen/component_button
- var/obj/screen/parent
-
-/obj/screen/component_button/Initialize(mapload, obj/screen/parent)
- . = ..()
- src.parent = parent
-
-/obj/screen/component_button/Click(params)
- if(parent)
- parent.component_click(src, params)
+/*
+ Screen objects
+ Todo: improve/re-implement
+
+ Screen objects are only used for the hud and should not appear anywhere "in-game".
+ They are used with the client/screen list and the screen_loc var.
+ For more information, see the byond documentation on the screen_loc and screen vars.
+*/
+/obj/screen
+ name = ""
+ icon = 'icons/mob/screen_gen.dmi'
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ appearance_flags = APPEARANCE_UI
+ var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
+ var/datum/hud/hud = null // A reference to the owner HUD, if any.
+
+/obj/screen/take_damage()
+ return
+
+/obj/screen/Destroy()
+ master = null
+ hud = null
+ return ..()
+
+/obj/screen/examine(mob/user)
+ return list()
+
+/obj/screen/orbit()
+ return
+
+/obj/screen/proc/component_click(obj/screen/component_button/component, params)
+ return
+
+/obj/screen/text
+ icon = null
+ icon_state = null
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ screen_loc = "CENTER-7,CENTER-7"
+ maptext_height = 480
+ maptext_width = 480
+
+/obj/screen/swap_hand
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+ name = "swap hand"
+
+/obj/screen/swap_hand/Click()
+ // At this point in client Click() code we have passed the 1/10 sec check and little else
+ // We don't even know if it's a middle click
+ if(world.time <= usr.next_move)
+ return 1
+
+ if(usr.incapacitated())
+ return 1
+
+ if(ismob(usr))
+ var/mob/M = usr
+ M.swap_hand()
+ return 1
+
+/obj/screen/craft
+ name = "crafting menu"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "craft"
+ screen_loc = ui_crafting
+
+/obj/screen/area_creator
+ name = "create new area"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "area_edit"
+ screen_loc = ui_building
+
+/obj/screen/area_creator/Click()
+ if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr)))
+ return TRUE
+ var/area/A = get_area(usr)
+ if(!A.outdoors)
+ to_chat(usr, "There is already a defined structure here.")
+ return TRUE
+ create_area(usr)
+
+/obj/screen/language_menu
+ name = "language menu"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "talk_wheel"
+ screen_loc = ui_language_menu
+
+/obj/screen/language_menu/Click()
+ var/mob/M = usr
+ var/datum/language_holder/H = M.get_language_holder()
+ H.open_language_menu(usr)
+
+/obj/screen/inventory
+ var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
+ var/icon_empty // Icon when empty. For now used only by humans.
+ var/icon_full // Icon when contains an item. For now used only by humans.
+ var/list/object_overlays = list()
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+
+/obj/screen/inventory/Click(location, control, params)
+ // At this point in client Click() code we have passed the 1/10 sec check and little else
+ // We don't even know if it's a middle click
+ if(world.time <= usr.next_move)
+ return TRUE
+
+ if(usr.incapacitated())
+ return TRUE
+ if(ismecha(usr.loc)) // stops inventory actions in a mech
+ return TRUE
+
+ if(hud?.mymob && slot_id)
+ var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id)
+ if(inv_item)
+ return inv_item.Click(location, control, params)
+
+ if(usr.attack_ui(slot_id))
+ usr.update_inv_hands()
+ return TRUE
+
+/obj/screen/inventory/MouseEntered()
+ ..()
+ add_overlays()
+
+/obj/screen/inventory/MouseExited()
+ ..()
+ cut_overlay(object_overlays)
+ object_overlays.Cut()
+
+/obj/screen/inventory/update_icon_state()
+ if(!icon_empty)
+ icon_empty = icon_state
+
+ if(hud?.mymob && slot_id && icon_full)
+ if(hud.mymob.get_item_by_slot(slot_id))
+ icon_state = icon_full
+ else
+ icon_state = icon_empty
+
+/obj/screen/inventory/proc/add_overlays()
+ var/mob/user = hud?.mymob
+
+ if(!user || !slot_id)
+ return
+
+ var/obj/item/holding = user.get_active_held_item()
+
+ if(!holding || user.get_item_by_slot(slot_id))
+ return
+
+ var/image/item_overlay = image(holding)
+ item_overlay.alpha = 92
+
+ if(!user.can_equip(holding, slot_id, TRUE))
+ item_overlay.color = "#FF0000"
+ else
+ item_overlay.color = "#00ff00"
+
+ object_overlays += item_overlay
+ add_overlay(object_overlays)
+
+/obj/screen/inventory/hand
+ var/mutable_appearance/handcuff_overlay
+ var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked")
+ var/held_index = 0
+
+/obj/screen/inventory/hand/update_icon()
+ . = ..()
+
+ if(!handcuff_overlay)
+ var/state = (!(held_index % 2)) ? "markus" : "gabrielle"
+ handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state)
+
+ cut_overlay(list(handcuff_overlay, blocked_overlay, "hand_active"))
+
+ if(!hud?.mymob)
+ return
+
+ if(iscarbon(hud.mymob))
+ var/mob/living/carbon/C = hud.mymob
+ if(C.handcuffed)
+ add_overlay(handcuff_overlay)
+
+ if(held_index)
+ if(!C.has_hand_for_held_index(held_index))
+ add_overlay(blocked_overlay)
+
+ if(held_index == hud.mymob.active_hand_index)
+ add_overlay("hand_active")
+
+
+/obj/screen/inventory/hand/Click(location, control, params)
+ // At this point in client Click() code we have passed the 1/10 sec check and little else
+ // We don't even know if it's a middle click
+ var/mob/user = hud?.mymob
+ if(usr != user)
+ return TRUE
+ if(world.time <= user.next_move)
+ return TRUE
+ if(user.incapacitated())
+ return TRUE
+ if (ismecha(user.loc)) // stops inventory actions in a mech
+ return TRUE
+
+ if(user.active_hand_index == held_index)
+ var/obj/item/I = user.get_active_held_item()
+ if(I)
+ I.Click(location, control, params)
+ else
+ user.swap_hand(held_index)
+ return TRUE
+
+/obj/screen/close
+ name = "close"
+ layer = ABOVE_HUD_LAYER
+ plane = ABOVE_HUD_PLANE
+ icon_state = "backpack_close"
+
+/obj/screen/close/Initialize(mapload, new_master)
+ . = ..()
+ master = new_master
+
+/obj/screen/close/Click()
+ var/datum/component/storage/S = master
+ S.hide_from(usr)
+ return TRUE
+
+/obj/screen/drop
+ name = "drop"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "act_drop"
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+
+/obj/screen/drop/Click()
+ if(usr.stat == CONSCIOUS)
+ usr.dropItemToGround(usr.get_active_held_item())
+
+/obj/screen/act_intent
+ name = "intent"
+ icon_state = "help"
+ screen_loc = ui_acti
+
+/obj/screen/act_intent/Click(location, control, params)
+ usr.a_intent_change(INTENT_HOTKEY_RIGHT)
+
+/obj/screen/act_intent/segmented/Click(location, control, params)
+ if(usr.client.prefs.toggles & INTENT_STYLE)
+ var/_x = text2num(params2list(params)["icon-x"])
+ var/_y = text2num(params2list(params)["icon-y"])
+
+ if(_x<=16 && _y<=16)
+ usr.a_intent_change(INTENT_HARM)
+
+ else if(_x<=16 && _y>=17)
+ usr.a_intent_change(INTENT_HELP)
+
+ else if(_x>=17 && _y<=16)
+ usr.a_intent_change(INTENT_GRAB)
+
+ else if(_x>=17 && _y>=17)
+ usr.a_intent_change(INTENT_DISARM)
+ else
+ return ..()
+
+/obj/screen/act_intent/alien
+ icon = 'icons/mob/screen_alien.dmi'
+ screen_loc = ui_movi
+
+/obj/screen/act_intent/robot
+ icon = 'icons/mob/screen_cyborg.dmi'
+ screen_loc = ui_borg_intents
+
+/obj/screen/internals
+ name = "toggle internals"
+ icon_state = "internal0"
+ screen_loc = ui_internal
+
+/obj/screen/internals/Click()
+ if(!iscarbon(usr))
+ return
+ var/mob/living/carbon/C = usr
+ if(C.incapacitated())
+ return
+
+ if(C.internal)
+ C.internal = null
+ to_chat(C, "You are no longer running on internals.")
+ icon_state = "internal0"
+ else
+ if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
+ var/obj/item/clothing/check
+ var/internals = FALSE
+
+ for(check in GET_INTERNAL_SLOTS(C))
+ if(istype(check, /obj/item/clothing/mask))
+ var/obj/item/clothing/mask/M = check
+ if(M.mask_adjusted)
+ M.adjustmask(C)
+ if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS))
+ internals = TRUE
+ if(!internals)
+ to_chat(C, "You are not wearing an internals mask!")
+ return
+
+ var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
+ if(I)
+ to_chat(C, "You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))].")
+ C.internal = I
+ else if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(istype(H.s_store, /obj/item/tank))
+ to_chat(H, "You are now running on internals from [H.s_store] on your [H.wear_suit.name].")
+ H.internal = H.s_store
+ else if(istype(H.belt, /obj/item/tank))
+ to_chat(H, "You are now running on internals from [H.belt] on your belt.")
+ H.internal = H.belt
+ else if(istype(H.l_store, /obj/item/tank))
+ to_chat(H, "You are now running on internals from [H.l_store] in your left pocket.")
+ H.internal = H.l_store
+ else if(istype(H.r_store, /obj/item/tank))
+ to_chat(H, "You are now running on internals from [H.r_store] in your right pocket.")
+ H.internal = H.r_store
+
+ //Separate so CO2 jetpacks are a little less cumbersome.
+ if(!C.internal && istype(C.back, /obj/item/tank))
+ to_chat(C, "You are now running on internals from [C.back] on your back.")
+ C.internal = C.back
+
+ if(C.internal)
+ icon_state = "internal1"
+ else
+ to_chat(C, "You don't have an oxygen tank!")
+ return
+ C.update_action_buttons_icon()
+
+/obj/screen/mov_intent
+ name = "run/walk toggle"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "running"
+
+/obj/screen/mov_intent/Click()
+ toggle(usr)
+
+/obj/screen/mov_intent/update_icon_state()
+ switch(hud?.mymob?.m_intent)
+ if(MOVE_INTENT_WALK)
+ icon_state = "walking"
+
+ if(MOVE_INTENT_RUN)
+ icon_state = "running"
+
+/obj/screen/mov_intent/proc/toggle(mob/user)
+ if(isobserver(user))
+ return
+ user.toggle_move_intent(user)
+
+/obj/screen/pull
+ name = "stop pulling"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "pull"
+
+/obj/screen/pull/Click()
+ if(isobserver(usr))
+ return
+ usr.stop_pulling()
+
+/obj/screen/pull/update_icon_state()
+ if(hud?.mymob?.pulling)
+ icon_state = "pull"
+ else
+ icon_state = "pull0"
+
+/obj/screen/resist
+ name = "resist"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "act_resist"
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+
+/obj/screen/resist/Click()
+ if(isliving(usr))
+ var/mob/living/L = usr
+ L.resist()
+
+/obj/screen/rest
+ name = "rest"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "act_rest"
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+
+/obj/screen/rest/Click()
+ if(isliving(usr))
+ var/mob/living/L = usr
+ L.lay_down()
+
+/obj/screen/rest/update_icon_state()
+ var/mob/living/user = hud?.mymob
+ if(!istype(user))
+ return
+ if(!user.resting)
+ icon_state = "act_rest"
+ else
+ icon_state = "act_rest0"
+
+/obj/screen/storage
+ name = "storage"
+ icon_state = "block"
+ screen_loc = "7,7 to 10,8"
+ layer = HUD_LAYER
+ plane = HUD_PLANE
+
+/obj/screen/storage/Initialize(mapload, new_master)
+ . = ..()
+ master = new_master
+
+/obj/screen/storage/Click(location, control, params)
+ if(world.time <= usr.next_move)
+ return TRUE
+ if(usr.incapacitated())
+ return TRUE
+ if (ismecha(usr.loc)) // stops inventory actions in a mech
+ return TRUE
+ if(master)
+ var/obj/item/I = usr.get_active_held_item()
+ if(I)
+ master.attackby(null, I, usr, params)
+ return TRUE
+
+/obj/screen/throw_catch
+ name = "throw/catch"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "act_throw_off"
+
+/obj/screen/throw_catch/Click()
+ if(iscarbon(usr))
+ var/mob/living/carbon/C = usr
+ C.toggle_throw_mode()
+
+/obj/screen/zone_sel
+ name = "damage zone"
+ icon_state = "zone_sel"
+ screen_loc = ui_zonesel
+ var/overlay_icon = 'icons/mob/screen_gen.dmi'
+ var/static/list/hover_overlays_cache = list()
+ var/hovering
+
+/obj/screen/zone_sel/Click(location, control,params)
+ if(isobserver(usr))
+ return
+
+ var/list/PL = params2list(params)
+ var/icon_x = text2num(PL["icon-x"])
+ var/icon_y = text2num(PL["icon-y"])
+ var/choice = get_zone_at(icon_x, icon_y)
+ if (!choice)
+ return 1
+
+ return set_selected_zone(choice, usr)
+
+/obj/screen/zone_sel/MouseEntered(location, control, params)
+ MouseMove(location, control, params)
+
+/obj/screen/zone_sel/MouseMove(location, control, params)
+ if(isobserver(usr))
+ return
+
+ var/list/PL = params2list(params)
+ var/icon_x = text2num(PL["icon-x"])
+ var/icon_y = text2num(PL["icon-y"])
+ var/choice = get_zone_at(icon_x, icon_y)
+
+ if(hovering == choice)
+ return
+ vis_contents -= hover_overlays_cache[hovering]
+ hovering = choice
+
+ var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice]
+ if(!overlay_object)
+ overlay_object = new
+ overlay_object.icon_state = "[choice]"
+ hover_overlays_cache[choice] = overlay_object
+ vis_contents += overlay_object
+
+/obj/effect/overlay/zone_sel
+ icon = 'icons/mob/screen_gen.dmi'
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ alpha = 128
+ anchored = TRUE
+ layer = ABOVE_HUD_LAYER
+ plane = ABOVE_HUD_PLANE
+
+/obj/screen/zone_sel/MouseExited(location, control, params)
+ if(!isobserver(usr) && hovering)
+ vis_contents -= hover_overlays_cache[hovering]
+ hovering = null
+
+/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y)
+ switch(icon_y)
+ if(1 to 9) //Legs
+ switch(icon_x)
+ if(10 to 15)
+ return BODY_ZONE_R_LEG
+ if(17 to 22)
+ return BODY_ZONE_L_LEG
+ if(10 to 13) //Hands and groin
+ switch(icon_x)
+ if(8 to 11)
+ return BODY_ZONE_R_ARM
+ if(12 to 20)
+ return BODY_ZONE_PRECISE_GROIN
+ if(21 to 24)
+ return BODY_ZONE_L_ARM
+ if(14 to 22) //Chest and arms to shoulders
+ switch(icon_x)
+ if(8 to 11)
+ return BODY_ZONE_R_ARM
+ if(12 to 20)
+ return BODY_ZONE_CHEST
+ if(21 to 24)
+ return BODY_ZONE_L_ARM
+ if(23 to 30) //Head, but we need to check for eye or mouth
+ if(icon_x in 12 to 20)
+ switch(icon_y)
+ if(23 to 24)
+ if(icon_x in 15 to 17)
+ return BODY_ZONE_PRECISE_MOUTH
+ if(26) //Eyeline, eyes are on 15 and 17
+ if(icon_x in 14 to 18)
+ return BODY_ZONE_PRECISE_EYES
+ if(25 to 27)
+ if(icon_x in 15 to 17)
+ return BODY_ZONE_PRECISE_EYES
+ return BODY_ZONE_HEAD
+
+/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user)
+ if(user != hud?.mymob)
+ return
+
+ if(choice != hud.mymob.zone_selected)
+ hud.mymob.zone_selected = choice
+ update_icon()
+
+ return TRUE
+
+/obj/screen/zone_sel/update_overlays()
+ . = ..()
+ if(!hud?.mymob)
+ return
+ . += mutable_appearance(overlay_icon, "[hud.mymob.zone_selected]")
+
+/obj/screen/zone_sel/alien
+ icon = 'icons/mob/screen_alien.dmi'
+ overlay_icon = 'icons/mob/screen_alien.dmi'
+
+/obj/screen/zone_sel/robot
+ icon = 'icons/mob/screen_cyborg.dmi'
+
+
+/obj/screen/flash
+ name = "flash"
+ icon_state = "blank"
+ blend_mode = BLEND_ADD
+ screen_loc = "WEST,SOUTH to EAST,NORTH"
+ layer = FLASH_LAYER
+ plane = FULLSCREEN_PLANE
+
+/obj/screen/damageoverlay
+ icon = 'icons/mob/screen_full.dmi'
+ icon_state = "oxydamageoverlay0"
+ name = "dmg"
+ blend_mode = BLEND_MULTIPLY
+ screen_loc = "CENTER-7,CENTER-7"
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ layer = UI_DAMAGE_LAYER
+ plane = FULLSCREEN_PLANE
+
+/obj/screen/healths
+ name = "health"
+ icon_state = "health0"
+ screen_loc = ui_health
+
+/obj/screen/healths/alien
+ icon = 'icons/mob/screen_alien.dmi'
+ screen_loc = ui_alien_health
+
+/obj/screen/healths/robot
+ icon = 'icons/mob/screen_cyborg.dmi'
+ screen_loc = ui_borg_health
+
+/obj/screen/healths/blob
+ name = "blob health"
+ icon_state = "block"
+ screen_loc = ui_internal
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/obj/screen/healths/blob/naut
+ name = "health"
+ icon = 'icons/mob/blob.dmi'
+ icon_state = "nauthealth"
+
+/obj/screen/healths/blob/naut/core
+ name = "overmind health"
+ screen_loc = ui_health
+ icon_state = "corehealth"
+
+/obj/screen/healths/guardian
+ name = "summoner health"
+ icon = 'icons/mob/guardian.dmi'
+ icon_state = "base"
+ screen_loc = ui_health
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/obj/screen/healths/clock
+ icon = 'icons/mob/actions.dmi'
+ icon_state = "bg_clock"
+ screen_loc = ui_health
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/obj/screen/healths/clock/gear
+ icon = 'icons/mob/clockwork_mobs.dmi'
+ icon_state = "bg_gear"
+ screen_loc = ui_internal
+
+/obj/screen/healths/revenant
+ name = "essence"
+ icon = 'icons/mob/actions.dmi'
+ icon_state = "bg_revenant"
+ screen_loc = ui_health
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/obj/screen/healths/construct
+ icon = 'icons/mob/screen_construct.dmi'
+ icon_state = "artificer_health0"
+ screen_loc = ui_construct_health
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
+/obj/screen/healthdoll
+ name = "health doll"
+ screen_loc = ui_healthdoll
+
+/obj/screen/mood
+ name = "mood"
+ icon_state = "mood5"
+ screen_loc = ui_mood
+
+/obj/screen/splash
+ icon = 'icons/blank_title.png'
+ icon_state = ""
+ screen_loc = "1,1"
+ layer = SPLASHSCREEN_LAYER
+ plane = SPLASHSCREEN_PLANE
+ var/client/holder
+
+/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy
+ . = ..()
+
+ holder = C
+
+ if(!visible)
+ alpha = 0
+
+ if(!use_previous_title)
+ if(SStitle.icon)
+ icon = SStitle.icon
+ else
+ if(!SStitle.previous_icon)
+ qdel(src)
+ return
+ icon = SStitle.previous_icon
+
+ holder.screen += src
+
+/obj/screen/splash/proc/Fade(out, qdel_after = TRUE)
+ if(QDELETED(src))
+ return
+ if(out)
+ animate(src, alpha = 0, time = 30)
+ else
+ alpha = 0
+ animate(src, alpha = 255, time = 30)
+ if(qdel_after)
+ QDEL_IN(src, 30)
+
+/obj/screen/splash/Destroy()
+ if(holder)
+ holder.screen -= src
+ holder = null
+ return ..()
+
+
+/obj/screen/component_button
+ var/obj/screen/parent
+
+/obj/screen/component_button/Initialize(mapload, obj/screen/parent)
+ . = ..()
+ src.parent = parent
+
+/obj/screen/component_button/Click(params)
+ if(parent)
+ parent.component_click(src, params)
diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm
index 6cf4c73e..80cc01c3 100644
--- a/code/_onclick/hud/swarmer.dm
+++ b/code/_onclick/hud/swarmer.dm
@@ -69,24 +69,30 @@
using = new /obj/screen/swarmer/FabricateTrap()
using.screen_loc = ui_hand_position(2)
+ using.hud = src
static_inventory += using
using = new /obj/screen/swarmer/Barricade()
using.screen_loc = ui_hand_position(1)
+ using.hud = src
static_inventory += using
using = new /obj/screen/swarmer/Replicate()
using.screen_loc = ui_zonesel
+ using.hud = src
static_inventory += using
using = new /obj/screen/swarmer/RepairSelf()
using.screen_loc = ui_storage1
+ using.hud = src
static_inventory += using
using = new /obj/screen/swarmer/ToggleLight()
using.screen_loc = ui_back
+ using.hud = src
static_inventory += using
using = new /obj/screen/swarmer/ContactSwarmers()
using.screen_loc = ui_inventory
+ using.hud = src
static_inventory += using
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 801e8c8c..3a5feabb 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -175,9 +175,8 @@
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
block_chance = 50
-/obj/item/twohanded/bostaff/update_icon()
+/obj/item/twohanded/bostaff/update_icon_state()
icon_state = "bostaff[wielded]"
- return
/obj/item/twohanded/bostaff/attack(mob/target, mob/living/user)
add_fingerprint(user)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 544d7983..142d38db 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -334,8 +334,13 @@ GLOBAL_LIST_EMPTY(teleportlocs)
F.update_fire_light(fire)
for(var/obj/machinery/light/L in src)
L.update()
-
-/area/proc/updateicon()
+/**
+ * Update the icon state of the area
+ *
+ * Im not sure what the heck this does, somethign to do with weather being able to set icon
+ * states on areas?? where the heck would that even display?
+ */
+/area/update_icon_state()
var/weather_icon
for(var/V in SSweather.processing)
var/datum/weather/W = V
@@ -345,7 +350,10 @@ GLOBAL_LIST_EMPTY(teleportlocs)
if(!weather_icon)
icon_state = null
-/area/space/updateicon()
+/**
+ * Update the icon of the area (overridden to always be null for space
+ */
+/area/space/update_icon_state()
icon_state = null
/*
@@ -378,7 +386,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/proc/power_change()
for(var/obj/machinery/M in src) // for each machine in the area
M.power_change() // reverify power status (to update icons etc.)
- updateicon()
+ update_icon()
/area/proc/usage(chan)
var/used = 0
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 575c65fa..5661ad71 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1,901 +1,927 @@
-/atom
- layer = TURF_LAYER
- plane = GAME_PLANE
- var/level = 2
- var/article // If non-null, overrides a/an/some in all cases
-
- var/flags_1 = NONE
- var/interaction_flags_atom = NONE
- var/datum/reagents/reagents = null
-
- //This atom's HUD (med/sec, etc) images. Associative list.
- var/list/image/hud_list = null
- //HUD images that this atom can provide.
- var/list/hud_possible
-
- /// Last name used to calculate a color for the chatmessage overlays
- var/chat_color_name
- /// Last color calculated for the the chatmessage overlays
- var/chat_color
- /// A luminescence-shifted value of the last color calculated for chatmessage overlays
- var/chat_color_darkened
-
- //Value used to increment ex_act() if reactionary_explosions is on
- var/explosion_block = 0
-
- var/list/atom_colours //used to store the different colors on an atom
- //its inherent color, the colored paint applied on it, special color effect etc...
-
- var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
- var/list/remove_overlays // a very temporary list of overlays to remove
- var/list/add_overlays // a very temporary list of overlays to add
-
- var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays
- var/list/managed_overlays
- var/datum/proximity_monitor/proximity_monitor
- var/buckle_message_cooldown = 0
- var/fingerprintslast
-
- var/list/filter_data //For handling persistent filters
-
- var/datum/component/orbiter/orbiters
-
- var/rad_flags = NONE // Will move to flags_1 when i can be arsed to
- var/rad_insulation = RAD_NO_INSULATION
-
- var/icon/blood_splatter_icon
- var/icon/cum_splatter_icon
- var/list/fingerprints
- var/list/fingerprintshidden
- var/list/blood_DNA
- var/list/suit_fibers
-
-/atom/New(loc, ...)
- //atom creation method that preloads variables at creation
- if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
- world.preloader_load(src)
-
- if(datum_flags & DF_USE_TAG)
- GenerateTag()
-
- var/do_initialize = SSatoms.initialized
- if(do_initialize != INITIALIZATION_INSSATOMS)
- args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
- if(SSatoms.InitAtom(src, args))
- //we were deleted
- return
-
-//Called after New if the map is being loaded. mapload = TRUE
-//Called from base of New if the map is not being loaded. mapload = FALSE
-//This base must be called or derivatives must set initialized to TRUE
-//must not sleep
-//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE
-//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm
-
-//Note: the following functions don't call the base for optimization and must copypasta:
-// /turf/Initialize
-// /turf/open/space/Initialize
-
-/atom/proc/Initialize(mapload, ...)
- if(flags_1 & INITIALIZED_1)
- stack_trace("Warning: [src]([type]) initialized multiple times!")
- flags_1 |= INITIALIZED_1
-
- //atom color stuff
- if(color)
- add_atom_colour(color, FIXED_COLOUR_PRIORITY)
-
- if (light_power && light_range)
- update_light()
-
- if (opacity && isturf(loc))
- var/turf/T = loc
- T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways.
-
- if (canSmoothWith)
- canSmoothWith = typelist("canSmoothWith", canSmoothWith)
-
- ComponentInitialize()
-
- return INITIALIZE_HINT_NORMAL
-
-//called if Initialize returns INITIALIZE_HINT_LATELOAD
-/atom/proc/LateInitialize()
- return
-
-// Put your AddComponent() calls here
-/atom/proc/ComponentInitialize()
- return
-
-/atom/Destroy()
- if(alternate_appearances)
- for(var/K in alternate_appearances)
- var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K]
- AA.remove_from_hud(src)
-
- if(reagents)
- qdel(reagents)
-
- LAZYCLEARLIST(overlays)
- LAZYCLEARLIST(priority_overlays)
-
- QDEL_NULL(light)
-
- return ..()
-
-/atom/proc/handle_ricochet(obj/item/projectile/P)
- return
-
-/atom/proc/CanPass(atom/movable/mover, turf/target)
- return !density
-
-/atom/proc/onCentCom()
- var/turf/T = get_turf(src)
- if(!T)
- return FALSE
-
- if(is_reserved_level(T.z))
- for(var/A in SSshuttle.mobile)
- var/obj/docking_port/mobile/M = A
- if(M.launch_status == ENDGAME_TRANSIT)
- for(var/place in M.shuttle_areas)
- var/area/shuttle/shuttle_area = place
- if(T in shuttle_area)
- return TRUE
-
- if(!is_centcom_level(T.z))//if not, don't bother
- return FALSE
-
- //Check for centcom itself
- if(istype(T.loc, /area/centcom))
- return TRUE
-
- //Check for centcom shuttles
- for(var/A in SSshuttle.mobile)
- var/obj/docking_port/mobile/M = A
- if(M.launch_status == ENDGAME_LAUNCHED)
- for(var/place in M.shuttle_areas)
- var/area/shuttle/shuttle_area = place
- if(T in shuttle_area)
- return TRUE
-
-/atom/proc/onSyndieBase()
- var/turf/T = get_turf(src)
- if(!T)
- return FALSE
-
- if(!is_centcom_level(T.z))//if not, don't bother
- return FALSE
-
- if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership) || istype(T.loc, /area/shuttle/assault_pod))
- return TRUE
-
- return FALSE
-
-/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
- SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
- if(does_attack_animation)
- user.changeNext_move(CLICK_CD_MELEE)
- log_combat(user, src, "punched", "hulk powers")
- user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
-
-/atom/proc/CheckParts(list/parts_list)
- for(var/A in parts_list)
- if(istype(A, /datum/reagent))
- if(!reagents)
- reagents = new()
- reagents.reagent_list.Add(A)
- reagents.conditional_update()
- else if(ismovableatom(A))
- var/atom/movable/M = A
- if(isliving(M.loc))
- var/mob/living/L = M.loc
- L.transferItemToLoc(M, src)
- else
- M.forceMove(src)
-
-//common name
-/atom/proc/update_multiz(prune_on_fail = FALSE)
- return FALSE
-
-/atom/proc/assume_air(datum/gas_mixture/giver)
- qdel(giver)
- return null
-
-/atom/proc/remove_air(amount)
- return null
-
-/atom/proc/return_air()
- if(loc)
- return loc.return_air()
- else
- return null
-
-/atom/proc/check_eye(mob/user)
- return
-
-/atom/proc/Bumped(atom/movable/AM)
- set waitfor = FALSE
-
-// Convenience procs to see if a container is open for chemistry handling
-/atom/proc/is_open_container()
- return is_refillable() && is_drainable()
-
-/atom/proc/is_injectable(allowmobs = TRUE)
- return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE))
-
-/atom/proc/is_drawable(allowmobs = TRUE)
- return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE))
-
-/atom/proc/is_refillable()
- return reagents && (reagents.reagents_holder_flags & REFILLABLE)
-
-/atom/proc/is_drainable()
- return reagents && (reagents.reagents_holder_flags & DRAINABLE)
-
-
-/atom/proc/AllowDrop()
- return FALSE
-
-/atom/proc/CheckExit()
- return TRUE
-
-/atom/proc/HasProximity(atom/movable/AM as mob|obj)
- return
-
-/atom/proc/emp_act(severity)
- var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity)
- if(!(protection & EMP_PROTECT_WIRES) && istype(wires))
- wires.emp_pulse()
- return protection // Pass the protection value collected here upwards
-
-/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
- SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
- . = P.on_hit(src, 0, def_zone)
-
-//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it.
-// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first.
-/atom/proc/shove_act(mob/living/target, mob/living/user)
- return FALSE
-
-/atom/proc/in_contents_of(container)//can take class or object instance as argument
- if(ispath(container))
- if(istype(src.loc, container))
- return TRUE
- else if(src in container)
- return TRUE
- return FALSE
-
-/atom/proc/update_icon_state()
-
-/atom/proc/update_overlaysb()
- SHOULD_CALL_PARENT(1)
- . = list()
- SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
-
-/atom/proc/update_iconb()
- var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON)
-
- if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE))
- update_icon_state()
-
- if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS))
- var/list/new_overlays = update_overlaysb()
- if(managed_overlays)
- cut_overlay(managed_overlays)
- managed_overlays = null
- if(length(new_overlays))
- managed_overlays = new_overlays
- add_overlay(new_overlays)
-
-/atom/proc/get_examine_name(mob/user)
- . = "\a [src]"
- var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]")
- if(article)
- . = "[article] [src]"
- override[EXAMINE_POSITION_ARTICLE] = article
-
- var/should_override = FALSE
-
- if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
- should_override = TRUE
-
-
- if(blood_DNA && !istype(src, /obj/effect/decal))
- override[EXAMINE_POSITION_BEFORE] = " blood-stained "
- should_override = TRUE
-
- if(should_override)
- . = override.Join("")
-
-///Generate the full examine string of this atom (including icon for goonchat)
-/atom/proc/get_examine_string(mob/user, thats = FALSE)
- return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
-
-/atom/proc/examine(mob/user)
- . = list("[get_examine_string(user, TRUE)].")
-
- if(!isliving(src))
- user.visible_message("[user] examines [src].",\
- "You examine [src].")
- if(desc)
- . += desc
-
- if(reagents)
- if(reagents.reagents_holder_flags & TRANSPARENT)
- . += "It contains:"
- if(length(reagents.reagent_list))
- if(user.can_see_reagents()) //Show each individual reagent
- for(var/datum/reagent/R in reagents.reagent_list)
- . += "[R.volume] units of [R.name]"
- else //Otherwise, just show the total volume
- var/total_volume = 0
- for(var/datum/reagent/R in reagents.reagent_list)
- total_volume += R.volume
- . += "[total_volume] units of various reagents"
- else
- . += "Nothing."
- else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE)
- if(reagents.total_volume)
- . += "It has [reagents.total_volume] unit\s left."
- else
- . += "It's empty."
- SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
-
-/atom/proc/relaymove(mob/user)
- if(buckle_message_cooldown <= world.time)
- buckle_message_cooldown = world.time + 50
- to_chat(user, "You can't move while buckled to [src]!")
- return
-
-/atom/proc/contents_explosion(severity, target)
- return //For handling the effects of explosions on contents that would not normally be effected
-
-/atom/proc/ex_act(severity, target)
- set waitfor = FALSE
- contents_explosion(severity, target)
- SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
-
-/atom/proc/blob_act(obj/structure/blob/B)
- SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
- return
-
-/atom/proc/fire_act(exposed_temperature, exposed_volume)
- SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
- return
-
-/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
- if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...).
- addtimer(CALLBACK(src, .proc/hitby_react, AM), 2)
-
-/atom/proc/hitby_react(atom/movable/AM)
- if(AM && isturf(AM.loc))
- step(AM, turn(AM.dir, 180))
-
-/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube)
- return
-
-//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
-/mob/living/proc/get_blood_dna_list()
- var/blood_id = get_blood_id()
- if(!(blood_id in GLOB.blood_reagent_types))
- return
- return list("ANIMAL DNA" = "Y-")
-
-/mob/living/carbon/get_blood_dna_list()
- var/blood_id = get_blood_id()
- if(!(blood_id in GLOB.blood_reagent_types))
- return
- var/list/blood_dna = list()
- if(dna)
- blood_dna[dna.unique_enzymes] = dna.blood_type
- else
- blood_dna["UNKNOWN DNA"] = "X*"
- return blood_dna
-
-/mob/living/carbon/alien/get_blood_dna_list()
- return list("UNKNOWN DNA" = "X*")
-
-//to add a mob's dna info into an object's blood_DNA list.
-/atom/proc/transfer_mob_blood_dna(mob/living/L)
- // Returns 0 if we have that blood already
- var/new_blood_dna = L.get_blood_dna_list()
- if(!new_blood_dna)
- return FALSE
- LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it.
- var/old_length = blood_DNA.len
- blood_DNA |= new_blood_dna
- if(blood_DNA.len == old_length)
- return FALSE
- return TRUE
-
-//to add blood dna info to the object's blood_DNA list
-/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases)
- LAZYINITLIST(blood_DNA)
- var/old_length = blood_DNA.len
- blood_DNA |= blood_dna
- if(blood_DNA.len > old_length)
- return TRUE
- //some new blood DNA was added
-
-//to add blood from a mob onto something, and transfer their dna info
-/atom/proc/add_mob_blood(mob/living/M)
- var/list/blood_dna = M.get_blood_dna_list()
- if(!blood_dna)
- return FALSE
- return add_blood_DNA(blood_dna, M.diseases)
-
-//to add blood onto something, with blood dna info to include.
-/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- return FALSE
-
-/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- return transfer_blood_dna(blood_dna, diseases)
-
-/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- . = ..()
- if(!.)
- return
- add_blood_overlay()
-
-/obj/item/proc/add_blood_overlay()
- if(!blood_DNA.len)
- return
- if(initial(icon) && initial(icon_state))
- blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
- blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
- blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
- blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY)
- add_overlay(blood_splatter_icon)
-
-/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- . = ..()
- transfer_blood = rand(2, 4)
-
-/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
- if(!B)
- B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
- B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal.
- return TRUE //we bloodied the floor
-
-/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
- if(head)
- head.add_blood_DNA(blood_dna, diseases)
- update_inv_head()
- else if(wear_mask)
- wear_mask.add_blood_DNA(blood_dna, diseases)
- update_inv_wear_mask()
- if(wear_neck)
- wear_neck.add_blood_DNA(blood_dna, diseases)
- update_inv_neck()
- if(wear_suit)
- wear_suit.add_blood_DNA(blood_dna, diseases)
- update_inv_wear_suit()
- else if(w_uniform)
- w_uniform.add_blood_DNA(blood_dna, diseases)
- update_inv_w_uniform()
- if(gloves)
- var/obj/item/clothing/gloves/G = gloves
- G.add_blood_DNA(blood_dna, diseases)
- else
- transfer_blood_dna(blood_dna, diseases)
- bloody_hands = rand(2, 4)
- update_inv_gloves() //handles bloody hands overlays and updating
- return TRUE
-
-/atom/proc/blood_DNA_to_color()
- var/list/colors = list()//first we make a list of all bloodtypes present
- for(var/bloop in blood_DNA)
- if(colors[blood_DNA[bloop]])
- colors[blood_DNA[bloop]]++
- else
- colors[blood_DNA[bloop]] = 1
-
- var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up
-
- if(colors.len)
- var/sum = 0 //this is all shitcode, but it works; trust me
- final_rgb = bloodtype_to_color(colors[1])
- sum = colors[colors[1]]
- if(colors.len > 1)
- var/i = 2
- while(i <= colors.len)
- var/tmp = colors[colors[i]]
- final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum))
- sum += tmp
- i++
-
- return final_rgb
-
-/atom/proc/clean_blood()
- . = blood_DNA? TRUE : FALSE
- blood_DNA = null
-
-/atom/proc/wash_cream()
- return TRUE
-
-/atom/proc/isinspace()
- if(isspaceturf(get_turf(src)))
- return TRUE
- else
- return FALSE
-
-/atom/proc/handle_fall()
- return
-
-/atom/proc/singularity_act()
- return
-
-/atom/proc/singularity_pull(obj/singularity/S, current_size)
- SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size)
-
-/atom/proc/acid_act(acidpwr, acid_volume)
- SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
-
-/atom/proc/emag_act()
- SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
-
-/atom/proc/rad_act(strength)
- if(istype(get_turf(src), /turf/open/pool))
- var/turf/open/pool/PL = get_turf(src)
- if(PL.filled == TRUE)
- strength *= 0.15
- SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
-
-/atom/proc/narsie_act()
- SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT)
-
-/atom/proc/ratvar_act()
- SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT)
-
-/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
- return FALSE
-
-/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
- SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
- return FALSE
-
-/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
- if(GetComponent(/datum/component/storage))
- return component_storage_contents_dump_act(src_object, user)
- return FALSE
-
-/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user)
- var/list/things = src_object.contents()
- var/datum/progressbar/progress = new(user, things.len, src)
- var/datum/component/storage/STR = GetComponent(/datum/component/storage)
- while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress)))
- stoplag(1)
- qdel(progress)
- to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.")
- STR.orient2hud(user)
- src_object.orient2hud(user)
- if(user.active_storage) //refresh the HUD to show the transfered contents
- user.active_storage.close(user)
- user.active_storage.show_to(user)
- return TRUE
-
-/atom/proc/get_dumping_location(obj/item/storage/source,mob/user)
- return null
-
-//This proc is called on the location of an atom when the atom is Destroy()'d
-/atom/proc/handle_atom_del(atom/A)
- SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A)
-
-//called when the turf the atom resides on is ChangeTurfed
-/atom/proc/HandleTurfChange(turf/T)
- for(var/a in src)
- var/atom/A = a
- A.HandleTurfChange(T)
-
-//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it)
-/atom/proc/get_remote_view_fullscreens(mob/user)
- return
-
-//the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera)
-/atom/proc/update_remote_sight(mob/living/user)
- return
-
-
-//Hook for running code when a dir change occurs
-/atom/proc/setDir(newdir)
- SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
- dir = newdir
-
-/atom/proc/mech_melee_attack(obj/mecha/M)
- return
-
-//If a mob logouts/logins in side of an object you can use this proc
-/atom/proc/on_log(login)
- if(loc)
- loc.on_log(login)
-
-
-/*
- Atom Colour Priority System
- A System that gives finer control over which atom colour to colour the atom with.
- The "highest priority" one is always displayed as opposed to the default of
- "whichever was set last is displayed"
-*/
-
-
-/*
- Adds an instance of colour_type to the atom's atom_colours list
-*/
-/atom/proc/add_atom_colour(coloration, colour_priority)
- if(!atom_colours || !atom_colours.len)
- atom_colours = list()
- atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
- if(!coloration)
- return
- if(colour_priority > atom_colours.len)
- return
- atom_colours[colour_priority] = coloration
- update_atom_colour()
-
-
-/*
- Removes an instance of colour_type from the atom's atom_colours list
-*/
-/atom/proc/remove_atom_colour(colour_priority, coloration)
- if(!atom_colours)
- atom_colours = list()
- atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
- if(colour_priority > atom_colours.len)
- return
- if(coloration && atom_colours[colour_priority] != coloration)
- return //if we don't have the expected color (for a specific priority) to remove, do nothing
- atom_colours[colour_priority] = null
- update_atom_colour()
-
-
-/*
- Resets the atom's color to null, and then sets it to the highest priority
- colour available
-*/
-/atom/proc/update_atom_colour()
- if(!atom_colours)
- atom_colours = list()
- atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
- color = null
- for(var/C in atom_colours)
- if(islist(C))
- var/list/L = C
- if(L.len)
- color = L
- return
- else if(C)
- color = C
- return
-
-/atom/vv_edit_var(var_name, var_value)
- if(!GLOB.Debug2)
- flags_1 |= ADMIN_SPAWNED_1
- . = ..()
- switch(var_name)
- if("color")
- add_atom_colour(color, ADMIN_COLOUR_PRIORITY)
-
-/atom/vv_get_dropdown()
- . = ..()
- . += "---"
- var/turf/curturf = get_turf(src)
- if (curturf)
- .["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]"
- .["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]"
- .["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]"
- .["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]"
- .["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]"
-
-/atom/proc/drop_location()
- var/atom/L = loc
- if(!L)
- return null
- return L.AllowDrop() ? L : L.drop_location()
-
-/atom/Entered(atom/movable/AM, atom/oldLoc)
- SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
-
-/atom/Exit(atom/movable/AM, atom/newLoc)
- . = ..()
- if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT)
- return FALSE
-
-/atom/Exited(atom/movable/AM, atom/newLoc)
- SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc)
-
-/atom/proc/return_temperature()
- return
-
-// Tool behavior procedure. Redirects to tool-specific procs by default.
-// You can override it to catch all tool interactions, for use in complex deconstruction procs.
-// Just don't forget to return ..() in the end.
-/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type)
- switch(tool_type)
- if(TOOL_CROWBAR)
- return crowbar_act(user, I)
- if(TOOL_MULTITOOL)
- return multitool_act(user, I)
- if(TOOL_SCREWDRIVER)
- return screwdriver_act(user, I)
- if(TOOL_WRENCH)
- return wrench_act(user, I)
- if(TOOL_WIRECUTTER)
- return wirecutter_act(user, I)
- if(TOOL_WELDER)
- return welder_act(user, I)
- if(TOOL_ANALYZER)
- return analyzer_act(user, I)
-
-// Tool-specific behavior procs. To be overridden in subtypes.
-/atom/proc/crowbar_act(mob/living/user, obj/item/I)
- return
-
-/atom/proc/multitool_act(mob/living/user, obj/item/I)
- return
-
-/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE)
- if(!istype(I, /obj/item/multitool))
- if(user && !silent)
- to_chat(user, "[I] has no data buffer!")
- return FALSE
- return TRUE
-
-/atom/proc/screwdriver_act(mob/living/user, obj/item/I)
- SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I)
-
-/atom/proc/wrench_act(mob/living/user, obj/item/I)
- return
-
-/atom/proc/wirecutter_act(mob/living/user, obj/item/I)
- return
-
-/atom/proc/welder_act(mob/living/user, obj/item/I)
- return
-
-/atom/proc/analyzer_act(mob/living/user, obj/item/I)
- return
-
-/atom/proc/GenerateTag()
- return
-
-// Generic logging helper
-/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE)
- if(!log_globally)
- return
-
- var/log_text = "[key_name(src)] [message] [loc_name(src)]"
- switch(message_type)
- if(LOG_ATTACK)
- log_attack(log_text)
- if(LOG_SAY)
- log_say(log_text)
- if(LOG_WHISPER)
- log_whisper(log_text)
- if(LOG_EMOTE)
- log_emote(log_text)
- if(LOG_DSAY)
- log_dsay(log_text)
- if(LOG_PDA)
- log_pda(log_text)
- if(LOG_CHAT)
- log_chat(log_text)
- if(LOG_COMMENT)
- log_comment(log_text)
- if(LOG_TELECOMMS)
- log_telecomms(log_text)
- if(LOG_OOC)
- log_ooc(log_text)
- if(LOG_ADMIN)
- log_admin(log_text)
- if(LOG_ADMIN_PRIVATE)
- log_admin_private(log_text)
- if(LOG_ASAY)
- log_adminsay(log_text)
- if(LOG_OWNERSHIP)
- log_game(log_text)
- if(LOG_GAME)
- log_game(log_text)
- else
- stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).")
- log_game(log_text)
-
-// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements)
-/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null)
- var/prefix = tag ? "([tag]) " : ""
- var/suffix = forced_by ? " FORCED by [forced_by]" : ""
- log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally)
-
-// Helper for logging of messages with only one sender and receiver
-/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag)
- if(!tag)
- stack_trace("Unspecified tag for private message")
- tag = "UNKNOWN"
-
- source.log_talk(message, message_type, tag="[tag] to [key_name(target)]")
- if(source != target)
- target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE)
-
-/*
-Proc for attack log creation, because really why not
-1 argument is the actor performing the action
-2 argument is the target of the action
-3 is a verb describing the action (e.g. punched, throwed, kicked, etc.)
-4 is a tool with which the action was made (usually an item)
-5 is any additional text, which will be appended to the rest of the log line
-*/
-
-/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null)
- var/ssource = key_name(user)
- var/starget = key_name(target)
-
- var/mob/living/living_target = target
- var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : ""
-
- var/sobject = ""
- if(object)
- sobject = " with [key_name(object)]"
- var/saddition = ""
- if(addition)
- saddition = " [addition]"
-
- var/postfix = "[sobject][saddition][hp]"
-
- var/message = "has [what_done] [starget][postfix]"
- user.log_message(message, LOG_ATTACK, color="red")
-
- if(user != target)
- var/reverse_message = "has been [what_done] by [ssource][postfix]"
- target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE)
-
-// Filter stuff
-/atom/movable/proc/add_filter(name,priority,list/params)
- if(!filter_data)
- filter_data = list()
- var/list/p = params.Copy()
- p["priority"] = priority
- filter_data[name] = p
- update_filters()
-
-/atom/movable/proc/update_filters()
- filters = null
- sortTim(filter_data,associative = TRUE)
- for(var/f in filter_data)
- var/list/data = filter_data[f]
- var/list/arguments = data.Copy()
- arguments -= "priority"
- filters += filter(arglist(arguments))
-
-/atom/movable/proc/get_filter(name)
- if(filter_data)
- if(filter_data[name])
- return filters[filter_data.Find(name)]
-
-/atom/movable/proc/remove_filter(name)
- if(filter_data)
- if(filter_data[name])
- filter_data -= name
- update_filters()
- return TRUE
-
-/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
- . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
-
-///Passes Stat Browser Panel clicks to the game and calls client click on an atom
-/atom/Topic(href, list/href_list)
- . = ..()
- if(!usr?.client)
- return
- var/client/usr_client = usr.client
- var/list/paramslist = list()
- if(href_list["statpanel_item_shiftclick"])
- paramslist["shift"] = "1"
- if(href_list["statpanel_item_ctrlclick"])
- paramslist["ctrl"] = "1"
- if(href_list["statpanel_item_altclick"])
- paramslist["alt"] = "1"
- if(href_list["statpanel_item_click"])
- // first of all make sure we valid
- var/mouseparams = list2params(paramslist)
- usr_client.Click(src, loc, null, mouseparams)
+/atom
+ layer = TURF_LAYER
+ plane = GAME_PLANE
+ var/level = 2
+ var/article // If non-null, overrides a/an/some in all cases
+
+ var/flags_1 = NONE
+ var/interaction_flags_atom = NONE
+ var/datum/reagents/reagents = null
+
+ //This atom's HUD (med/sec, etc) images. Associative list.
+ var/list/image/hud_list = null
+ //HUD images that this atom can provide.
+ var/list/hud_possible
+
+ /// Last name used to calculate a color for the chatmessage overlays
+ var/chat_color_name
+ /// Last color calculated for the the chatmessage overlays
+ var/chat_color
+ /// A luminescence-shifted value of the last color calculated for chatmessage overlays
+ var/chat_color_darkened
+
+ //Value used to increment ex_act() if reactionary_explosions is on
+ var/explosion_block = 0
+
+ var/list/atom_colours //used to store the different colors on an atom
+ //its inherent color, the colored paint applied on it, special color effect etc...
+
+ var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
+ var/list/remove_overlays // a very temporary list of overlays to remove
+ var/list/add_overlays // a very temporary list of overlays to add
+
+ var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays
+ ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc
+ var/list/managed_overlays
+
+ var/datum/proximity_monitor/proximity_monitor
+ var/buckle_message_cooldown = 0
+ var/fingerprintslast
+
+ var/list/filter_data //For handling persistent filters
+
+ var/datum/component/orbiter/orbiters
+
+ var/rad_flags = NONE // Will move to flags_1 when i can be arsed to
+ var/rad_insulation = RAD_NO_INSULATION
+
+ var/icon/blood_splatter_icon
+ var/icon/cum_splatter_icon
+ var/list/fingerprints
+ var/list/fingerprintshidden
+ var/list/blood_DNA
+ var/list/suit_fibers
+
+/atom/New(loc, ...)
+ //atom creation method that preloads variables at creation
+ if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
+ world.preloader_load(src)
+
+ if(datum_flags & DF_USE_TAG)
+ GenerateTag()
+
+ var/do_initialize = SSatoms.initialized
+ if(do_initialize != INITIALIZATION_INSSATOMS)
+ args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
+ if(SSatoms.InitAtom(src, args))
+ //we were deleted
+ return
+
+//Called after New if the map is being loaded. mapload = TRUE
+//Called from base of New if the map is not being loaded. mapload = FALSE
+//This base must be called or derivatives must set initialized to TRUE
+//must not sleep
+//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE
+//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm
+
+//Note: the following functions don't call the base for optimization and must copypasta:
+// /turf/Initialize
+// /turf/open/space/Initialize
+
+/atom/proc/Initialize(mapload, ...)
+ if(flags_1 & INITIALIZED_1)
+ stack_trace("Warning: [src]([type]) initialized multiple times!")
+ flags_1 |= INITIALIZED_1
+
+ //atom color stuff
+ if(color)
+ add_atom_colour(color, FIXED_COLOUR_PRIORITY)
+
+ if (light_power && light_range)
+ update_light()
+
+ if (opacity && isturf(loc))
+ var/turf/T = loc
+ T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways.
+
+ if (canSmoothWith)
+ canSmoothWith = typelist("canSmoothWith", canSmoothWith)
+
+ ComponentInitialize()
+
+ return INITIALIZE_HINT_NORMAL
+
+//called if Initialize returns INITIALIZE_HINT_LATELOAD
+/atom/proc/LateInitialize()
+ return
+
+// Put your AddComponent() calls here
+/atom/proc/ComponentInitialize()
+ return
+
+/atom/Destroy()
+ if(alternate_appearances)
+ for(var/K in alternate_appearances)
+ var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K]
+ AA.remove_from_hud(src)
+
+ if(reagents)
+ qdel(reagents)
+
+ LAZYCLEARLIST(overlays)
+ LAZYCLEARLIST(priority_overlays)
+
+ QDEL_NULL(light)
+
+ return ..()
+
+/atom/proc/handle_ricochet(obj/item/projectile/P)
+ return
+
+/atom/proc/CanPass(atom/movable/mover, turf/target)
+ return !density
+
+/atom/proc/onCentCom()
+ var/turf/T = get_turf(src)
+ if(!T)
+ return FALSE
+
+ if(is_reserved_level(T.z))
+ for(var/A in SSshuttle.mobile)
+ var/obj/docking_port/mobile/M = A
+ if(M.launch_status == ENDGAME_TRANSIT)
+ for(var/place in M.shuttle_areas)
+ var/area/shuttle/shuttle_area = place
+ if(T in shuttle_area)
+ return TRUE
+
+ if(!is_centcom_level(T.z))//if not, don't bother
+ return FALSE
+
+ //Check for centcom itself
+ if(istype(T.loc, /area/centcom))
+ return TRUE
+
+ //Check for centcom shuttles
+ for(var/A in SSshuttle.mobile)
+ var/obj/docking_port/mobile/M = A
+ if(M.launch_status == ENDGAME_LAUNCHED)
+ for(var/place in M.shuttle_areas)
+ var/area/shuttle/shuttle_area = place
+ if(T in shuttle_area)
+ return TRUE
+
+/atom/proc/onSyndieBase()
+ var/turf/T = get_turf(src)
+ if(!T)
+ return FALSE
+
+ if(!is_centcom_level(T.z))//if not, don't bother
+ return FALSE
+
+ if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership) || istype(T.loc, /area/shuttle/assault_pod))
+ return TRUE
+
+ return FALSE
+
+/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
+ SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user)
+ if(does_attack_animation)
+ user.changeNext_move(CLICK_CD_MELEE)
+ log_combat(user, src, "punched", "hulk powers")
+ user.do_attack_animation(src, ATTACK_EFFECT_SMASH)
+
+/atom/proc/CheckParts(list/parts_list)
+ for(var/A in parts_list)
+ if(istype(A, /datum/reagent))
+ if(!reagents)
+ reagents = new()
+ reagents.reagent_list.Add(A)
+ reagents.conditional_update()
+ else if(ismovableatom(A))
+ var/atom/movable/M = A
+ if(isliving(M.loc))
+ var/mob/living/L = M.loc
+ L.transferItemToLoc(M, src)
+ else
+ M.forceMove(src)
+
+//common name
+/atom/proc/update_multiz(prune_on_fail = FALSE)
+ return FALSE
+
+/atom/proc/assume_air(datum/gas_mixture/giver)
+ qdel(giver)
+ return null
+
+/atom/proc/remove_air(amount)
+ return null
+
+/atom/proc/return_air()
+ if(loc)
+ return loc.return_air()
+ else
+ return null
+
+/atom/proc/check_eye(mob/user)
+ return
+
+/atom/proc/Bumped(atom/movable/AM)
+ set waitfor = FALSE
+
+// Convenience procs to see if a container is open for chemistry handling
+/atom/proc/is_open_container()
+ return is_refillable() && is_drainable()
+
+/atom/proc/is_injectable(allowmobs = TRUE)
+ return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE))
+
+/atom/proc/is_drawable(allowmobs = TRUE)
+ return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE))
+
+/atom/proc/is_refillable()
+ return reagents && (reagents.reagents_holder_flags & REFILLABLE)
+
+/atom/proc/is_drainable()
+ return reagents && (reagents.reagents_holder_flags & DRAINABLE)
+
+
+/atom/proc/AllowDrop()
+ return FALSE
+
+/atom/proc/CheckExit()
+ return TRUE
+
+/atom/proc/HasProximity(atom/movable/AM as mob|obj)
+ return
+
+/atom/proc/emp_act(severity)
+ var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity)
+ if(!(protection & EMP_PROTECT_WIRES) && istype(wires))
+ wires.emp_pulse()
+ return protection // Pass the protection value collected here upwards
+
+/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
+ SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
+ . = P.on_hit(src, 0, def_zone)
+
+//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it.
+// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first.
+/atom/proc/shove_act(mob/living/target, mob/living/user)
+ return FALSE
+
+/atom/proc/in_contents_of(container)//can take class or object instance as argument
+ if(ispath(container))
+ if(istype(src.loc, container))
+ return TRUE
+ else if(src in container)
+ return TRUE
+ return FALSE
+
+/atom/proc/update_overlaysb()
+ SHOULD_CALL_PARENT(1)
+ . = list()
+ SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
+
+/atom/proc/update_iconb()
+ var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON)
+
+ if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE))
+ update_icon_state()
+
+ if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS))
+ var/list/new_overlays = update_overlaysb()
+ if(managed_overlays)
+ cut_overlay(managed_overlays)
+ managed_overlays = null
+ if(length(new_overlays))
+ managed_overlays = new_overlays
+ add_overlay(new_overlays)
+
+/atom/proc/get_examine_name(mob/user)
+ . = "\a [src]"
+ var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]")
+ if(article)
+ . = "[article] [src]"
+ override[EXAMINE_POSITION_ARTICLE] = article
+
+ var/should_override = FALSE
+
+ if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED)
+ should_override = TRUE
+
+
+ if(blood_DNA && !istype(src, /obj/effect/decal))
+ override[EXAMINE_POSITION_BEFORE] = " blood-stained "
+ should_override = TRUE
+
+ if(should_override)
+ . = override.Join("")
+
+///Generate the full examine string of this atom (including icon for goonchat)
+/atom/proc/get_examine_string(mob/user, thats = FALSE)
+ return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]"
+
+/atom/proc/examine(mob/user)
+ . = list("[get_examine_string(user, TRUE)].")
+
+ if(!isliving(src))
+ user.visible_message("[user] examines [src].",\
+ "You examine [src].")
+ if(desc)
+ . += desc
+
+ if(reagents)
+ if(reagents.reagents_holder_flags & TRANSPARENT)
+ . += "It contains:"
+ if(length(reagents.reagent_list))
+ if(user.can_see_reagents()) //Show each individual reagent
+ for(var/datum/reagent/R in reagents.reagent_list)
+ . += "[R.volume] units of [R.name]"
+ else //Otherwise, just show the total volume
+ var/total_volume = 0
+ for(var/datum/reagent/R in reagents.reagent_list)
+ total_volume += R.volume
+ . += "[total_volume] units of various reagents"
+ else
+ . += "Nothing."
+ else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE)
+ if(reagents.total_volume)
+ . += "It has [reagents.total_volume] unit\s left."
+ else
+ . += "It's empty."
+ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .)
+
+/// Updates the icon of the atom
+/atom/proc/update_icon()
+ // I expect we're going to need more return flags and options in this proc
+ var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON)
+
+ if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE))
+ update_icon_state()
+
+ if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS))
+ var/list/new_overlays = update_overlays()
+ if(managed_overlays)
+ cut_overlay(managed_overlays)
+ managed_overlays = null
+ if(length(new_overlays))
+ managed_overlays = new_overlays
+ add_overlay(new_overlays)
+
+/// Updates the icon state of the atom
+/atom/proc/update_icon_state()
+
+/// Updates the overlays of the atom
+/atom/proc/update_overlays()
+ SHOULD_CALL_PARENT(1)
+ . = list()
+ SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .)
+
+/atom/proc/relaymove(mob/user)
+ if(buckle_message_cooldown <= world.time)
+ buckle_message_cooldown = world.time + 50
+ to_chat(user, "You can't move while buckled to [src]!")
+ return
+
+/atom/proc/contents_explosion(severity, target)
+ return //For handling the effects of explosions on contents that would not normally be effected
+
+/atom/proc/ex_act(severity, target)
+ set waitfor = FALSE
+ contents_explosion(severity, target)
+ SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target)
+
+/atom/proc/blob_act(obj/structure/blob/B)
+ SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B)
+ return
+
+/atom/proc/fire_act(exposed_temperature, exposed_volume)
+ SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
+ return
+
+/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
+ if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...).
+ addtimer(CALLBACK(src, .proc/hitby_react, AM), 2)
+
+/atom/proc/hitby_react(atom/movable/AM)
+ if(AM && isturf(AM.loc))
+ step(AM, turn(AM.dir, 180))
+
+/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube)
+ return
+
+//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list
+/mob/living/proc/get_blood_dna_list()
+ var/blood_id = get_blood_id()
+ if(!(blood_id in GLOB.blood_reagent_types))
+ return
+ return list("ANIMAL DNA" = "Y-")
+
+/mob/living/carbon/get_blood_dna_list()
+ var/blood_id = get_blood_id()
+ if(!(blood_id in GLOB.blood_reagent_types))
+ return
+ var/list/blood_dna = list()
+ if(dna)
+ blood_dna[dna.unique_enzymes] = dna.blood_type
+ else
+ blood_dna["UNKNOWN DNA"] = "X*"
+ return blood_dna
+
+/mob/living/carbon/alien/get_blood_dna_list()
+ return list("UNKNOWN DNA" = "X*")
+
+//to add a mob's dna info into an object's blood_DNA list.
+/atom/proc/transfer_mob_blood_dna(mob/living/L)
+ // Returns 0 if we have that blood already
+ var/new_blood_dna = L.get_blood_dna_list()
+ if(!new_blood_dna)
+ return FALSE
+ LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it.
+ var/old_length = blood_DNA.len
+ blood_DNA |= new_blood_dna
+ if(blood_DNA.len == old_length)
+ return FALSE
+ return TRUE
+
+//to add blood dna info to the object's blood_DNA list
+/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases)
+ LAZYINITLIST(blood_DNA)
+ var/old_length = blood_DNA.len
+ blood_DNA |= blood_dna
+ if(blood_DNA.len > old_length)
+ return TRUE
+ //some new blood DNA was added
+
+//to add blood from a mob onto something, and transfer their dna info
+/atom/proc/add_mob_blood(mob/living/M)
+ var/list/blood_dna = M.get_blood_dna_list()
+ if(!blood_dna)
+ return FALSE
+ return add_blood_DNA(blood_dna, M.diseases)
+
+//to add blood onto something, with blood dna info to include.
+/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ return FALSE
+
+/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ return transfer_blood_dna(blood_dna, diseases)
+
+/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ . = ..()
+ if(!.)
+ return
+ add_blood_overlay()
+
+/obj/item/proc/add_blood_overlay()
+ if(!blood_DNA.len)
+ return
+ if(initial(icon) && initial(icon_state))
+ blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object
+ blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent)
+ blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant
+ blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY)
+ add_overlay(blood_splatter_icon)
+
+/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ . = ..()
+ transfer_blood = rand(2, 4)
+
+/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src
+ if(!B)
+ B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases)
+ B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal.
+ return TRUE //we bloodied the floor
+
+/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases)
+ if(head)
+ head.add_blood_DNA(blood_dna, diseases)
+ update_inv_head()
+ else if(wear_mask)
+ wear_mask.add_blood_DNA(blood_dna, diseases)
+ update_inv_wear_mask()
+ if(wear_neck)
+ wear_neck.add_blood_DNA(blood_dna, diseases)
+ update_inv_neck()
+ if(wear_suit)
+ wear_suit.add_blood_DNA(blood_dna, diseases)
+ update_inv_wear_suit()
+ else if(w_uniform)
+ w_uniform.add_blood_DNA(blood_dna, diseases)
+ update_inv_w_uniform()
+ if(gloves)
+ var/obj/item/clothing/gloves/G = gloves
+ G.add_blood_DNA(blood_dna, diseases)
+ else
+ transfer_blood_dna(blood_dna, diseases)
+ bloody_hands = rand(2, 4)
+ update_inv_gloves() //handles bloody hands overlays and updating
+ return TRUE
+
+/atom/proc/blood_DNA_to_color()
+ var/list/colors = list()//first we make a list of all bloodtypes present
+ for(var/bloop in blood_DNA)
+ if(colors[blood_DNA[bloop]])
+ colors[blood_DNA[bloop]]++
+ else
+ colors[blood_DNA[bloop]] = 1
+
+ var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up
+
+ if(colors.len)
+ var/sum = 0 //this is all shitcode, but it works; trust me
+ final_rgb = bloodtype_to_color(colors[1])
+ sum = colors[colors[1]]
+ if(colors.len > 1)
+ var/i = 2
+ while(i <= colors.len)
+ var/tmp = colors[colors[i]]
+ final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum))
+ sum += tmp
+ i++
+
+ return final_rgb
+
+/atom/proc/clean_blood()
+ . = blood_DNA? TRUE : FALSE
+ blood_DNA = null
+
+/atom/proc/wash_cream()
+ return TRUE
+
+/atom/proc/isinspace()
+ if(isspaceturf(get_turf(src)))
+ return TRUE
+ else
+ return FALSE
+
+/atom/proc/handle_fall()
+ return
+
+/atom/proc/singularity_act()
+ return
+
+/atom/proc/singularity_pull(obj/singularity/S, current_size)
+ SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size)
+
+/atom/proc/acid_act(acidpwr, acid_volume)
+ SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
+
+/atom/proc/emag_act()
+ SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
+
+/atom/proc/rad_act(strength)
+ if(istype(get_turf(src), /turf/open/pool))
+ var/turf/open/pool/PL = get_turf(src)
+ if(PL.filled == TRUE)
+ strength *= 0.15
+ SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
+
+/atom/proc/narsie_act()
+ SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT)
+
+/atom/proc/ratvar_act()
+ SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT)
+
+/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
+ return FALSE
+
+/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
+ SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode)
+ return FALSE
+
+/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
+ if(GetComponent(/datum/component/storage))
+ return component_storage_contents_dump_act(src_object, user)
+ return FALSE
+
+/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user)
+ var/list/things = src_object.contents()
+ var/datum/progressbar/progress = new(user, things.len, src)
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress)))
+ stoplag(1)
+ qdel(progress)
+ to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.")
+ STR.orient2hud(user)
+ src_object.orient2hud(user)
+ if(user.active_storage) //refresh the HUD to show the transfered contents
+ user.active_storage.close(user)
+ user.active_storage.show_to(user)
+ return TRUE
+
+/atom/proc/get_dumping_location(obj/item/storage/source,mob/user)
+ return null
+
+//This proc is called on the location of an atom when the atom is Destroy()'d
+/atom/proc/handle_atom_del(atom/A)
+ SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A)
+
+//called when the turf the atom resides on is ChangeTurfed
+/atom/proc/HandleTurfChange(turf/T)
+ for(var/a in src)
+ var/atom/A = a
+ A.HandleTurfChange(T)
+
+//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it)
+/atom/proc/get_remote_view_fullscreens(mob/user)
+ return
+
+//the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera)
+/atom/proc/update_remote_sight(mob/living/user)
+ return
+
+
+//Hook for running code when a dir change occurs
+/atom/proc/setDir(newdir)
+ SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir)
+ dir = newdir
+
+/atom/proc/mech_melee_attack(obj/mecha/M)
+ return
+
+//If a mob logouts/logins in side of an object you can use this proc
+/atom/proc/on_log(login)
+ if(loc)
+ loc.on_log(login)
+
+
+/*
+ Atom Colour Priority System
+ A System that gives finer control over which atom colour to colour the atom with.
+ The "highest priority" one is always displayed as opposed to the default of
+ "whichever was set last is displayed"
+*/
+
+
+/*
+ Adds an instance of colour_type to the atom's atom_colours list
+*/
+/atom/proc/add_atom_colour(coloration, colour_priority)
+ if(!atom_colours || !atom_colours.len)
+ atom_colours = list()
+ atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
+ if(!coloration)
+ return
+ if(colour_priority > atom_colours.len)
+ return
+ atom_colours[colour_priority] = coloration
+ update_atom_colour()
+
+
+/*
+ Removes an instance of colour_type from the atom's atom_colours list
+*/
+/atom/proc/remove_atom_colour(colour_priority, coloration)
+ if(!atom_colours)
+ atom_colours = list()
+ atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
+ if(colour_priority > atom_colours.len)
+ return
+ if(coloration && atom_colours[colour_priority] != coloration)
+ return //if we don't have the expected color (for a specific priority) to remove, do nothing
+ atom_colours[colour_priority] = null
+ update_atom_colour()
+
+
+/*
+ Resets the atom's color to null, and then sets it to the highest priority
+ colour available
+*/
+/atom/proc/update_atom_colour()
+ if(!atom_colours)
+ atom_colours = list()
+ atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently.
+ color = null
+ for(var/C in atom_colours)
+ if(islist(C))
+ var/list/L = C
+ if(L.len)
+ color = L
+ return
+ else if(C)
+ color = C
+ return
+
+/atom/vv_edit_var(var_name, var_value)
+ if(!GLOB.Debug2)
+ flags_1 |= ADMIN_SPAWNED_1
+ . = ..()
+ switch(var_name)
+ if("color")
+ add_atom_colour(color, ADMIN_COLOUR_PRIORITY)
+
+/atom/vv_get_dropdown()
+ . = ..()
+ . += "---"
+ var/turf/curturf = get_turf(src)
+ if (curturf)
+ .["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]"
+ .["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]"
+ .["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]"
+ .["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]"
+ .["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]"
+
+/atom/proc/drop_location()
+ var/atom/L = loc
+ if(!L)
+ return null
+ return L.AllowDrop() ? L : L.drop_location()
+
+/atom/Entered(atom/movable/AM, atom/oldLoc)
+ SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc)
+
+/atom/Exit(atom/movable/AM, atom/newLoc)
+ . = ..()
+ if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT)
+ return FALSE
+
+/atom/Exited(atom/movable/AM, atom/newLoc)
+ SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc)
+
+/atom/proc/return_temperature()
+ return
+
+// Tool behavior procedure. Redirects to tool-specific procs by default.
+// You can override it to catch all tool interactions, for use in complex deconstruction procs.
+// Just don't forget to return ..() in the end.
+/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type)
+ switch(tool_type)
+ if(TOOL_CROWBAR)
+ return crowbar_act(user, I)
+ if(TOOL_MULTITOOL)
+ return multitool_act(user, I)
+ if(TOOL_SCREWDRIVER)
+ return screwdriver_act(user, I)
+ if(TOOL_WRENCH)
+ return wrench_act(user, I)
+ if(TOOL_WIRECUTTER)
+ return wirecutter_act(user, I)
+ if(TOOL_WELDER)
+ return welder_act(user, I)
+ if(TOOL_ANALYZER)
+ return analyzer_act(user, I)
+
+// Tool-specific behavior procs. To be overridden in subtypes.
+/atom/proc/crowbar_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/multitool_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE)
+ if(!istype(I, /obj/item/multitool))
+ if(user && !silent)
+ to_chat(user, "[I] has no data buffer!")
+ return FALSE
+ return TRUE
+
+/atom/proc/screwdriver_act(mob/living/user, obj/item/I)
+ SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I)
+
+/atom/proc/wrench_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/wirecutter_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/welder_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/analyzer_act(mob/living/user, obj/item/I)
+ return
+
+/atom/proc/GenerateTag()
+ return
+
+// Generic logging helper
+/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE)
+ if(!log_globally)
+ return
+
+ var/log_text = "[key_name(src)] [message] [loc_name(src)]"
+ switch(message_type)
+ if(LOG_ATTACK)
+ log_attack(log_text)
+ if(LOG_SAY)
+ log_say(log_text)
+ if(LOG_WHISPER)
+ log_whisper(log_text)
+ if(LOG_EMOTE)
+ log_emote(log_text)
+ if(LOG_DSAY)
+ log_dsay(log_text)
+ if(LOG_PDA)
+ log_pda(log_text)
+ if(LOG_CHAT)
+ log_chat(log_text)
+ if(LOG_COMMENT)
+ log_comment(log_text)
+ if(LOG_TELECOMMS)
+ log_telecomms(log_text)
+ if(LOG_OOC)
+ log_ooc(log_text)
+ if(LOG_ADMIN)
+ log_admin(log_text)
+ if(LOG_ADMIN_PRIVATE)
+ log_admin_private(log_text)
+ if(LOG_ASAY)
+ log_adminsay(log_text)
+ if(LOG_OWNERSHIP)
+ log_game(log_text)
+ if(LOG_GAME)
+ log_game(log_text)
+ else
+ stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).")
+ log_game(log_text)
+
+// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements)
+/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null)
+ var/prefix = tag ? "([tag]) " : ""
+ var/suffix = forced_by ? " FORCED by [forced_by]" : ""
+ log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally)
+
+// Helper for logging of messages with only one sender and receiver
+/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag)
+ if(!tag)
+ stack_trace("Unspecified tag for private message")
+ tag = "UNKNOWN"
+
+ source.log_talk(message, message_type, tag="[tag] to [key_name(target)]")
+ if(source != target)
+ target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE)
+
+/*
+Proc for attack log creation, because really why not
+1 argument is the actor performing the action
+2 argument is the target of the action
+3 is a verb describing the action (e.g. punched, throwed, kicked, etc.)
+4 is a tool with which the action was made (usually an item)
+5 is any additional text, which will be appended to the rest of the log line
+*/
+
+/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null)
+ var/ssource = key_name(user)
+ var/starget = key_name(target)
+
+ var/mob/living/living_target = target
+ var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : ""
+
+ var/sobject = ""
+ if(object)
+ sobject = " with [key_name(object)]"
+ var/saddition = ""
+ if(addition)
+ saddition = " [addition]"
+
+ var/postfix = "[sobject][saddition][hp]"
+
+ var/message = "has [what_done] [starget][postfix]"
+ user.log_message(message, LOG_ATTACK, color="red")
+
+ if(user != target)
+ var/reverse_message = "has been [what_done] by [ssource][postfix]"
+ target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE)
+
+// Filter stuff
+/atom/movable/proc/add_filter(name,priority,list/params)
+ if(!filter_data)
+ filter_data = list()
+ var/list/p = params.Copy()
+ p["priority"] = priority
+ filter_data[name] = p
+ update_filters()
+
+/atom/movable/proc/update_filters()
+ filters = null
+ sortTim(filter_data,associative = TRUE)
+ for(var/f in filter_data)
+ var/list/data = filter_data[f]
+ var/list/arguments = data.Copy()
+ arguments -= "priority"
+ filters += filter(arglist(arguments))
+
+/atom/movable/proc/get_filter(name)
+ if(filter_data)
+ if(filter_data[name])
+ return filters[filter_data.Find(name)]
+
+/atom/movable/proc/remove_filter(name)
+ if(filter_data)
+ if(filter_data[name])
+ filter_data -= name
+ update_filters()
+ return TRUE
+
+/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
+ . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
+
+///Passes Stat Browser Panel clicks to the game and calls client click on an atom
+/atom/Topic(href, list/href_list)
+ . = ..()
+ if(!usr?.client)
+ return
+ var/client/usr_client = usr.client
+ var/list/paramslist = list()
+ if(href_list["statpanel_item_shiftclick"])
+ paramslist["shift"] = "1"
+ if(href_list["statpanel_item_ctrlclick"])
+ paramslist["ctrl"] = "1"
+ if(href_list["statpanel_item_altclick"])
+ paramslist["alt"] = "1"
+ if(href_list["statpanel_item_click"])
+ // first of all make sure we valid
+ var/mouseparams = list2params(paramslist)
+ usr_client.Click(src, loc, null, mouseparams)
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index 8d849c8c..c98795c9 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -1,48 +1,48 @@
-/obj/machinery/bluespace_beacon
-
- icon = 'icons/obj/objects.dmi'
- icon_state = "floor_beaconf"
- name = "bluespace gigabeacon"
- desc = "A device that draws power from bluespace and creates a permanent tracking beacon."
- level = 1 // underfloor
- layer = LOW_OBJ_LAYER
- use_power = IDLE_POWER_USE
- idle_power_usage = 0
- var/obj/item/beacon/Beacon
-
-/obj/machinery/bluespace_beacon/Initialize()
- . = ..()
- var/turf/T = loc
- Beacon = new(T)
- Beacon.invisibility = INVISIBILITY_MAXIMUM
-
- hide(T.intact)
-
-/obj/machinery/bluespace_beacon/Destroy()
- QDEL_NULL(Beacon)
- return ..()
-
-// update the invisibility and icon
-/obj/machinery/bluespace_beacon/hide(intact)
- invisibility = intact ? INVISIBILITY_MAXIMUM : 0
- updateicon()
-
-// update the icon_state
-/obj/machinery/bluespace_beacon/proc/updateicon()
- var/state="floor_beacon"
-
- if(invisibility)
- icon_state = "[state]f"
-
- else
- icon_state = "[state]"
-
-/obj/machinery/bluespace_beacon/process()
- if(!Beacon)
- var/turf/T = loc
- Beacon = new(T)
- Beacon.invisibility = INVISIBILITY_MAXIMUM
- else if (Beacon.loc != loc)
- Beacon.forceMove(loc)
-
- updateicon()
+/obj/machinery/bluespace_beacon
+
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "floor_beaconf"
+ name = "bluespace gigabeacon"
+ desc = "A device that draws power from bluespace and creates a permanent tracking beacon."
+ level = 1 // underfloor
+ layer = LOW_OBJ_LAYER
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 0
+ var/obj/item/beacon/Beacon
+
+/obj/machinery/bluespace_beacon/Initialize()
+ . = ..()
+ var/turf/T = loc
+ Beacon = new(T)
+ Beacon.invisibility = INVISIBILITY_MAXIMUM
+
+ hide(T.intact)
+
+/obj/machinery/bluespace_beacon/Destroy()
+ QDEL_NULL(Beacon)
+ return ..()
+
+// update the invisibility and icon
+/obj/machinery/bluespace_beacon/hide(intact)
+ invisibility = intact ? INVISIBILITY_MAXIMUM : 0
+ update_icon()
+
+// update the icon_state
+/obj/machinery/bluespace_beacon/update_icon()
+ var/state="floor_beacon"
+
+ if(invisibility)
+ icon_state = "[state]f"
+
+ else
+ icon_state = "[state]"
+
+/obj/machinery/bluespace_beacon/process()
+ if(!Beacon)
+ var/turf/T = loc
+ Beacon = new(T)
+ Beacon.invisibility = INVISIBILITY_MAXIMUM
+ else if (Beacon.loc != loc)
+ Beacon.forceMove(loc)
+
+ update_icon()
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index 5e170058..f8aad894 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -1,265 +1,266 @@
-/obj/machinery/button
- name = "button"
- desc = "A remote control switch."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "doorctrl"
- var/skin = "doorctrl"
- power_channel = ENVIRON
- var/obj/item/assembly/device
- var/obj/item/electronics/airlock/board
- var/device_type = null
- var/id = null
- var/initialized_button = 0
- armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70)
- use_power = IDLE_POWER_USE
- idle_power_usage = 2
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
-
-/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
- . = ..()
- if(built)
- setDir(ndir)
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- panel_open = TRUE
- update_icon()
-
-
- if(!built && !device && device_type)
- device = new device_type(src)
-
- src.check_access(null)
-
- if(req_access.len || req_one_access.len)
- board = new(src)
- if(req_access.len)
- board.accesses = req_access
- else
- board.one_access = 1
- board.accesses = req_one_access
-
-
-/obj/machinery/button/update_icon()
- cut_overlays()
- if(panel_open)
- icon_state = "button-open"
- if(device)
- add_overlay("button-device")
- if(board)
- add_overlay("button-board")
-
- else
- if(stat & (NOPOWER|BROKEN))
- icon_state = "[skin]-p"
- else
- icon_state = skin
-
-/obj/machinery/button/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/screwdriver))
- if(panel_open || allowed(user))
- default_deconstruction_screwdriver(user, "button-open", "[skin]",W)
- update_icon()
- else
- to_chat(user, "Maintenance Access Denied")
- flick("[skin]-denied", src)
- return
-
- if(panel_open)
- if(!device && istype(W, /obj/item/assembly))
- if(!user.transferItemToLoc(W, src))
- to_chat(user, "\The [W] is stuck to you!")
- return
- device = W
- to_chat(user, "You add [W] to the button.")
-
- if(!board && istype(W, /obj/item/electronics/airlock))
- if(!user.transferItemToLoc(W, src))
- to_chat(user, "\The [W] is stuck to you!")
- return
- board = W
- if(board.one_access)
- req_one_access = board.accesses
- else
- req_access = board.accesses
- to_chat(user, "You add [W] to the button.")
-
- if(!device && !board && istype(W, /obj/item/wrench))
- to_chat(user, "You start unsecuring the button frame...")
- W.play_tool_sound(src)
- if(W.use_tool(src, user, 40))
- to_chat(user, "You unsecure the button frame.")
- transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src)))
- playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
- qdel(src)
-
- update_icon()
- return
-
- if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON))
- return attack_hand(user)
- else
- return ..()
-
-/obj/machinery/button/emag_act(mob/user)
- if(obj_flags & EMAGGED)
- return
- req_access = list()
- req_one_access = list()
- playsound(src, "sparks", 100, 1)
- obj_flags |= EMAGGED
-
-/obj/machinery/button/attack_ai(mob/user)
- if(!panel_open)
- return attack_hand(user)
-
-/obj/machinery/button/attack_robot(mob/user)
- return attack_ai(user)
-
-/obj/machinery/button/proc/setup_device()
- if(id && istype(device, /obj/item/assembly/control))
- var/obj/item/assembly/control/A = device
- A.id = id
- initialized_button = 1
-
-/obj/machinery/button/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(!initialized_button)
- setup_device()
- add_fingerprint(user)
- if(panel_open)
- if(device || board)
- if(device)
- device.forceMove(drop_location())
- device = null
- if(board)
- board.forceMove(drop_location())
- req_access = list()
- req_one_access = list()
- board = null
- update_icon()
- to_chat(user, "You remove electronics from the button frame.")
-
- else
- if(skin == "doorctrl")
- skin = "launcher"
- else
- skin = "doorctrl"
- to_chat(user, "You change the button frame's front panel.")
- return
-
- if((stat & (NOPOWER|BROKEN)))
- return
-
- if(device && device.next_activate > world.time)
- return
-
- if(!allowed(user))
- to_chat(user, "Access Denied")
- flick("[skin]-denied", src)
- return
-
- use_power(5)
- icon_state = "[skin]1"
-
- if(device)
- device.pulsed()
-
- addtimer(CALLBACK(src, .proc/update_icon), 15)
-
-/obj/machinery/button/power_change()
- ..()
- update_icon()
-
-
-/obj/machinery/button/door
- name = "door button"
- desc = "A door remote control switch."
- var/normaldoorcontrol = FALSE
- var/specialfunctions = OPEN // Bitflag, see assembly file
-
-/obj/machinery/button/door/setup_device()
- if(!device)
- if(normaldoorcontrol)
- var/obj/item/assembly/control/airlock/A = new(src)
- device = A
- A.specialfunctions = specialfunctions
- else
- device = new /obj/item/assembly/control(src)
- ..()
-
-/obj/machinery/button/door/incinerator_vent_toxmix
- name = "combustion chamber vent control"
- id = INCINERATOR_TOXMIX_VENT
- req_access = list(ACCESS_TOX)
-
-/obj/machinery/button/door/incinerator_vent_atmos_main
- name = "turbine vent control"
- id = INCINERATOR_ATMOS_MAINVENT
- req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
-
-/obj/machinery/button/door/incinerator_vent_atmos_aux
- name = "combustion chamber vent control"
- id = INCINERATOR_ATMOS_AUXVENT
- req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
-
-/obj/machinery/button/door/incinerator_vent_syndicatelava_main
- name = "turbine vent control"
- id = INCINERATOR_SYNDICATELAVA_MAINVENT
- req_access = list(ACCESS_SYNDICATE)
-
-/obj/machinery/button/door/incinerator_vent_syndicatelava_aux
- name = "combustion chamber vent control"
- id = INCINERATOR_SYNDICATELAVA_AUXVENT
- req_access = list(ACCESS_SYNDICATE)
-
-/obj/machinery/button/massdriver
- name = "mass driver button"
- desc = "A remote control switch for a mass driver."
- icon_state = "launcher"
- skin = "launcher"
- device_type = /obj/item/assembly/control/massdriver
-
-/obj/machinery/button/ignition
- name = "ignition switch"
- desc = "A remote control switch for a mounted igniter."
- icon_state = "launcher"
- skin = "launcher"
- device_type = /obj/item/assembly/control/igniter
-
-/obj/machinery/button/ignition/incinerator
- name = "combustion chamber ignition switch"
- desc = "A remote control switch for the combustion chamber's igniter."
-
-/obj/machinery/button/ignition/incinerator/toxmix
- id = INCINERATOR_TOXMIX_IGNITER
-
-/obj/machinery/button/ignition/incinerator/atmos
- id = INCINERATOR_ATMOS_IGNITER
-
-/obj/machinery/button/ignition/incinerator/syndicatelava
- id = INCINERATOR_SYNDICATELAVA_IGNITER
-
-/obj/machinery/button/flasher
- name = "flasher button"
- desc = "A remote control switch for a mounted flasher."
- icon_state = "launcher"
- skin = "launcher"
- device_type = /obj/item/assembly/control/flasher
-
-/obj/machinery/button/crematorium
- name = "crematorium igniter"
- desc = "Burn baby burn!"
- icon_state = "launcher"
- skin = "launcher"
- device_type = /obj/item/assembly/control/crematorium
- req_access = list()
- id = 1
-
-/obj/item/wallframe/button
- name = "button frame"
- desc = "Used for building buttons."
- icon_state = "button"
- result_path = /obj/machinery/button
- materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
+/obj/machinery/button
+ name = "button"
+ desc = "A remote control switch."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "doorctrl"
+ var/skin = "doorctrl"
+ power_channel = ENVIRON
+ var/obj/item/assembly/device
+ var/obj/item/electronics/airlock/board
+ var/device_type = null
+ var/id = null
+ var/initialized_button = 0
+ armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70)
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 2
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
+ . = ..()
+ if(built)
+ setDir(ndir)
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+ pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
+ panel_open = TRUE
+ update_icon()
+
+
+ if(!built && !device && device_type)
+ device = new device_type(src)
+
+ src.check_access(null)
+
+ if(req_access.len || req_one_access.len)
+ board = new(src)
+ if(req_access.len)
+ board.accesses = req_access
+ else
+ board.one_access = 1
+ board.accesses = req_one_access
+
+/obj/machinery/button/update_icon_state()
+ if(panel_open)
+ icon_state = "button-open"
+ else if(stat & (NOPOWER|BROKEN))
+ icon_state = "[skin]-p"
+ else
+ icon_state = skin
+
+/obj/machinery/button/update_overlays()
+ . = ..()
+ if(!panel_open)
+ return
+ if(device)
+ . += "button-device"
+ if(board)
+ . += "button-board"
+
+/obj/machinery/button/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/screwdriver))
+ if(panel_open || allowed(user))
+ default_deconstruction_screwdriver(user, "button-open", "[skin]",W)
+ update_icon()
+ else
+ to_chat(user, "Maintenance Access Denied")
+ flick("[skin]-denied", src)
+ return
+
+ if(panel_open)
+ if(!device && istype(W, /obj/item/assembly))
+ if(!user.transferItemToLoc(W, src))
+ to_chat(user, "\The [W] is stuck to you!")
+ return
+ device = W
+ to_chat(user, "You add [W] to the button.")
+
+ if(!board && istype(W, /obj/item/electronics/airlock))
+ if(!user.transferItemToLoc(W, src))
+ to_chat(user, "\The [W] is stuck to you!")
+ return
+ board = W
+ if(board.one_access)
+ req_one_access = board.accesses
+ else
+ req_access = board.accesses
+ to_chat(user, "You add [W] to the button.")
+
+ if(!device && !board && istype(W, /obj/item/wrench))
+ to_chat(user, "You start unsecuring the button frame...")
+ W.play_tool_sound(src)
+ if(W.use_tool(src, user, 40))
+ to_chat(user, "You unsecure the button frame.")
+ transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src)))
+ playsound(loc, 'sound/items/deconstruct.ogg', 50, 1)
+ qdel(src)
+
+ update_icon()
+ return
+
+ if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON))
+ return attack_hand(user)
+ else
+ return ..()
+
+/obj/machinery/button/emag_act(mob/user)
+ if(obj_flags & EMAGGED)
+ return
+ req_access = list()
+ req_one_access = list()
+ playsound(src, "sparks", 100, 1)
+ obj_flags |= EMAGGED
+
+/obj/machinery/button/attack_ai(mob/user)
+ if(!panel_open)
+ return attack_hand(user)
+
+/obj/machinery/button/attack_robot(mob/user)
+ return attack_ai(user)
+
+/obj/machinery/button/proc/setup_device()
+ if(id && istype(device, /obj/item/assembly/control))
+ var/obj/item/assembly/control/A = device
+ A.id = id
+ initialized_button = 1
+
+/obj/machinery/button/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(!initialized_button)
+ setup_device()
+ add_fingerprint(user)
+ if(panel_open)
+ if(device || board)
+ if(device)
+ device.forceMove(drop_location())
+ device = null
+ if(board)
+ board.forceMove(drop_location())
+ req_access = list()
+ req_one_access = list()
+ board = null
+ update_icon()
+ to_chat(user, "You remove electronics from the button frame.")
+
+ else
+ if(skin == "doorctrl")
+ skin = "launcher"
+ else
+ skin = "doorctrl"
+ to_chat(user, "You change the button frame's front panel.")
+ return
+
+ if((stat & (NOPOWER|BROKEN)))
+ return
+
+ if(device && device.next_activate > world.time)
+ return
+
+ if(!allowed(user))
+ to_chat(user, "Access Denied")
+ flick("[skin]-denied", src)
+ return
+
+ use_power(5)
+ icon_state = "[skin]1"
+
+ if(device)
+ device.pulsed()
+
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 15)
+
+/obj/machinery/button/power_change()
+ ..()
+ update_icon()
+
+
+/obj/machinery/button/door
+ name = "door button"
+ desc = "A door remote control switch."
+ var/normaldoorcontrol = FALSE
+ var/specialfunctions = OPEN // Bitflag, see assembly file
+
+/obj/machinery/button/door/setup_device()
+ if(!device)
+ if(normaldoorcontrol)
+ var/obj/item/assembly/control/airlock/A = new(src)
+ device = A
+ A.specialfunctions = specialfunctions
+ else
+ device = new /obj/item/assembly/control(src)
+ ..()
+
+/obj/machinery/button/door/incinerator_vent_toxmix
+ name = "combustion chamber vent control"
+ id = INCINERATOR_TOXMIX_VENT
+ req_access = list(ACCESS_TOX)
+
+/obj/machinery/button/door/incinerator_vent_atmos_main
+ name = "turbine vent control"
+ id = INCINERATOR_ATMOS_MAINVENT
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
+
+/obj/machinery/button/door/incinerator_vent_atmos_aux
+ name = "combustion chamber vent control"
+ id = INCINERATOR_ATMOS_AUXVENT
+ req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS)
+
+/obj/machinery/button/door/incinerator_vent_syndicatelava_main
+ name = "turbine vent control"
+ id = INCINERATOR_SYNDICATELAVA_MAINVENT
+ req_access = list(ACCESS_SYNDICATE)
+
+/obj/machinery/button/door/incinerator_vent_syndicatelava_aux
+ name = "combustion chamber vent control"
+ id = INCINERATOR_SYNDICATELAVA_AUXVENT
+ req_access = list(ACCESS_SYNDICATE)
+
+/obj/machinery/button/massdriver
+ name = "mass driver button"
+ desc = "A remote control switch for a mass driver."
+ icon_state = "launcher"
+ skin = "launcher"
+ device_type = /obj/item/assembly/control/massdriver
+
+/obj/machinery/button/ignition
+ name = "ignition switch"
+ desc = "A remote control switch for a mounted igniter."
+ icon_state = "launcher"
+ skin = "launcher"
+ device_type = /obj/item/assembly/control/igniter
+
+/obj/machinery/button/ignition/incinerator
+ name = "combustion chamber ignition switch"
+ desc = "A remote control switch for the combustion chamber's igniter."
+
+/obj/machinery/button/ignition/incinerator/toxmix
+ id = INCINERATOR_TOXMIX_IGNITER
+
+/obj/machinery/button/ignition/incinerator/atmos
+ id = INCINERATOR_ATMOS_IGNITER
+
+/obj/machinery/button/ignition/incinerator/syndicatelava
+ id = INCINERATOR_SYNDICATELAVA_IGNITER
+
+/obj/machinery/button/flasher
+ name = "flasher button"
+ desc = "A remote control switch for a mounted flasher."
+ icon_state = "launcher"
+ skin = "launcher"
+ device_type = /obj/item/assembly/control/flasher
+
+/obj/machinery/button/crematorium
+ name = "crematorium igniter"
+ desc = "Burn baby burn!"
+ icon_state = "launcher"
+ skin = "launcher"
+ device_type = /obj/item/assembly/control/crematorium
+ req_access = list()
+ id = 1
+
+/obj/item/wallframe/button
+ name = "button frame"
+ desc = "Used for building buttons."
+ icon_state = "button"
+ result_path = /obj/machinery/button
+ materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 17136d3c..bef5effb 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -292,7 +292,7 @@
new /obj/item/stack/cable_coil(loc, 2)
qdel(src)
-/obj/machinery/camera/update_icon()
+/obj/machinery/camera/update_icon_state()
if(!status)
icon_state = "[initial(icon_state)]1"
else if (stat & EMPED)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 1969fe8b..1c0635fd 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -1,130 +1,130 @@
-/obj/machinery/cell_charger
- name = "cell charger"
- desc = "It charges power cells."
- icon = 'icons/obj/power.dmi'
- icon_state = "ccharger"
- use_power = IDLE_POWER_USE
- idle_power_usage = 5
- active_power_usage = 60
- power_channel = EQUIP
- circuit = /obj/item/circuitboard/machine/cell_charger
- pass_flags = PASSTABLE
- var/obj/item/stock_parts/cell/charging = null
- var/chargelevel = -1
- var/charge_rate = 500
-
-/obj/machinery/cell_charger/proc/updateicon()
- cut_overlays()
- if(charging)
- add_overlay(image(charging.icon, charging.icon_state))
- add_overlay("ccharger-on")
- if(!(stat & (BROKEN|NOPOWER)))
- var/newlevel = round(charging.percent() * 4 / 100)
- chargelevel = newlevel
- add_overlay("ccharger-o[newlevel]")
-
-/obj/machinery/cell_charger/examine(mob/user)
- . = ..()
- . += "There's [charging ? "a" : "no"] cell in the charger."
- if(charging)
- . += "Current charge: [round(charging.percent(), 1)]%."
-
-/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
- if(stat & BROKEN)
- to_chat(user, "[src] is broken!")
- return
- if(!anchored)
- to_chat(user, "[src] isn't attached to the ground!")
- return
- if(charging)
- to_chat(user, "There is already a cell in the charger!")
- return
- else
- var/area/a = loc.loc // Gets our locations location, like a dream within a dream
- if(!isarea(a))
- return
- if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
- to_chat(user, "[src] blinks red as you try to insert the cell!")
- return
- if(!user.transferItemToLoc(W,src))
- return
-
- charging = W
- user.visible_message("[user] inserts a cell into [src].", "You insert a cell into [src].")
- chargelevel = -1
- updateicon()
- else
- if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W))
- return
- if(default_deconstruction_crowbar(W))
- return
- if(!charging && default_unfasten_wrench(user, W))
- return
- return ..()
-
-/obj/machinery/cell_charger/deconstruct()
- if(charging)
- charging.forceMove(drop_location())
- return ..()
-
-/obj/machinery/cell_charger/Destroy()
- QDEL_NULL(charging)
- return ..()
-
-/obj/machinery/cell_charger/proc/removecell()
- charging.update_icon()
- charging = null
- chargelevel = -1
- updateicon()
-
-/obj/machinery/cell_charger/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(!charging)
- return
-
- user.put_in_hands(charging)
- charging.add_fingerprint(user)
-
- user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].")
-
- removecell()
-
-/obj/machinery/cell_charger/attack_tk(mob/user)
- if(!charging)
- return
-
- charging.forceMove(loc)
- to_chat(user, "You telekinetically remove [charging] from [src].")
-
- removecell()
-
-/obj/machinery/cell_charger/attack_ai(mob/user)
- return
-
-/obj/machinery/cell_charger/emp_act(severity)
- . = ..()
-
- if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_CONTENTS)
- return
-
- if(charging)
- charging.emp_act(severity)
-
-/obj/machinery/cell_charger/RefreshParts()
- charge_rate = 500
- for(var/obj/item/stock_parts/capacitor/C in component_parts)
- charge_rate *= C.rating
-
-/obj/machinery/cell_charger/process()
- if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
- return
-
- if(charging.percent() >= 100)
- return
- use_power(charge_rate)
- charging.give(charge_rate) //this is 2558, efficient batteries exist
-
- updateicon()
+/obj/machinery/cell_charger
+ name = "cell charger"
+ desc = "It charges power cells."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "ccharger"
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 5
+ active_power_usage = 60
+ power_channel = EQUIP
+ circuit = /obj/item/circuitboard/machine/cell_charger
+ pass_flags = PASSTABLE
+ var/obj/item/stock_parts/cell/charging = null
+ var/chargelevel = -1
+ var/charge_rate = 500
+
+/obj/machinery/cell_charger/update_icon()
+ cut_overlays()
+ if(charging)
+ add_overlay(image(charging.icon, charging.icon_state))
+ add_overlay("ccharger-on")
+ if(!(stat & (BROKEN|NOPOWER)))
+ var/newlevel = round(charging.percent() * 4 / 100)
+ chargelevel = newlevel
+ add_overlay("ccharger-o[newlevel]")
+
+/obj/machinery/cell_charger/examine(mob/user)
+ . = ..()
+ . += "There's [charging ? "a" : "no"] cell in the charger."
+ if(charging)
+ . += "Current charge: [round(charging.percent(), 1)]%."
+
+/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/stock_parts/cell) && !panel_open)
+ if(stat & BROKEN)
+ to_chat(user, "[src] is broken!")
+ return
+ if(!anchored)
+ to_chat(user, "[src] isn't attached to the ground!")
+ return
+ if(charging)
+ to_chat(user, "There is already a cell in the charger!")
+ return
+ else
+ var/area/a = loc.loc // Gets our locations location, like a dream within a dream
+ if(!isarea(a))
+ return
+ if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
+ to_chat(user, "[src] blinks red as you try to insert the cell!")
+ return
+ if(!user.transferItemToLoc(W,src))
+ return
+
+ charging = W
+ user.visible_message("[user] inserts a cell into [src].", "You insert a cell into [src].")
+ chargelevel = -1
+ update_icon()
+ else
+ if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W))
+ return
+ if(default_deconstruction_crowbar(W))
+ return
+ if(!charging && default_unfasten_wrench(user, W))
+ return
+ return ..()
+
+/obj/machinery/cell_charger/deconstruct()
+ if(charging)
+ charging.forceMove(drop_location())
+ return ..()
+
+/obj/machinery/cell_charger/Destroy()
+ QDEL_NULL(charging)
+ return ..()
+
+/obj/machinery/cell_charger/proc/removecell()
+ charging.update_icon()
+ charging = null
+ chargelevel = -1
+ update_icon()
+
+/obj/machinery/cell_charger/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(!charging)
+ return
+
+ user.put_in_hands(charging)
+ charging.add_fingerprint(user)
+
+ user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].")
+
+ removecell()
+
+/obj/machinery/cell_charger/attack_tk(mob/user)
+ if(!charging)
+ return
+
+ charging.forceMove(loc)
+ to_chat(user, "You telekinetically remove [charging] from [src].")
+
+ removecell()
+
+/obj/machinery/cell_charger/attack_ai(mob/user)
+ return
+
+/obj/machinery/cell_charger/emp_act(severity)
+ . = ..()
+
+ if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_CONTENTS)
+ return
+
+ if(charging)
+ charging.emp_act(severity)
+
+/obj/machinery/cell_charger/RefreshParts()
+ charge_rate = 500
+ for(var/obj/item/stock_parts/capacitor/C in component_parts)
+ charge_rate *= C.rating
+
+/obj/machinery/cell_charger/process()
+ if(!charging || !anchored || (stat & (BROKEN|NOPOWER)))
+ return
+
+ if(charging.percent() >= 100)
+ return
+ use_power(charge_rate)
+ charging.give(charge_rate) //this is 2558, efficient batteries exist
+
+ update_icon()
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index 40ccc61b..f3be6ac2 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -38,17 +38,21 @@
defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5%
update_icon()
-/obj/machinery/defibrillator_mount/update_icon()
- cut_overlays()
- if(defib)
- add_overlay("defib")
- if(defib.powered)
- add_overlay(defib.safety ? "online" : "emagged")
- var/ratio = defib.cell.charge / defib.cell.maxcharge
- ratio = CEILING(ratio * 4, 1) * 25
- add_overlay("charge[ratio]")
- if(clamps_locked)
- add_overlay("clamps")
+/obj/machinery/defibrillator_mount/update_overlays()
+ . = ..()
+ if(!defib)
+ return
+
+ . += "defib"
+
+ if(defib.powered)
+ . += (defib.safety ? "online" : "emagged")
+ var/ratio = defib.cell.charge / defib.cell.maxcharge
+ ratio = CEILING(ratio * 4, 1) * 25
+ . += "charge[ratio]"
+
+ if(clamps_locked)
+ . += "clamps"
/obj/machinery/defibrillator_mount/get_cell()
if(defib)
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 20b59e7a..2a4b9039 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -1,67 +1,67 @@
-// the light switch
-// can have multiple per area
-// can also operate on non-loc area through "otherarea" var
-/obj/machinery/light_switch
- name = "light switch"
- icon = 'icons/obj/power.dmi'
- icon_state = "light1"
- desc = "Make dark."
- var/on = TRUE
- var/area/area = null
- var/otherarea = null
-
-/obj/machinery/light_switch/Initialize()
- . = ..()
- area = get_area(src)
-
- if(otherarea)
- area = locate(text2path("/area/[otherarea]"))
-
- if(!name)
- name = "light switch ([area.name])"
-
- on = area.lightswitch
- updateicon()
-
-/obj/machinery/light_switch/proc/updateicon()
- if(stat & NOPOWER)
- icon_state = "light-p"
- else
- if(on)
- icon_state = "light1"
- else
- icon_state = "light0"
-
-/obj/machinery/light_switch/examine(mob/user)
- . = ..()
- . += "It is [on? "on" : "off"]."
-
-/obj/machinery/light_switch/interact(mob/user)
- . = ..()
- on = !on
-
- area.lightswitch = on
- area.updateicon()
-
- for(var/obj/machinery/light_switch/L in area)
- L.on = on
- L.updateicon()
-
- area.power_change()
-
-/obj/machinery/light_switch/power_change()
-
- if(!otherarea)
- if(powered(LIGHT))
- stat &= ~NOPOWER
- else
- stat |= NOPOWER
-
- updateicon()
-
-/obj/machinery/light_switch/emp_act(severity)
- . = ..()
- if (. & EMP_PROTECT_SELF)
- return
- if(!(stat & (BROKEN|NOPOWER)))
- power_change()
+// the light switch
+// can have multiple per area
+// can also operate on non-loc area through "otherarea" var
+/obj/machinery/light_switch
+ name = "light switch"
+ icon = 'icons/obj/power.dmi'
+ icon_state = "light1"
+ desc = "Make dark."
+ var/on = TRUE
+ var/area/area = null
+ var/otherarea = null
+
+/obj/machinery/light_switch/Initialize()
+ . = ..()
+ area = get_area(src)
+
+ if(otherarea)
+ area = locate(text2path("/area/[otherarea]"))
+
+ if(!name)
+ name = "light switch ([area.name])"
+
+ on = area.lightswitch
+ update_icon()
+
+/obj/machinery/light_switch/update_icon()
+ if(stat & NOPOWER)
+ icon_state = "light-p"
+ else
+ if(on)
+ icon_state = "light1"
+ else
+ icon_state = "light0"
+
+/obj/machinery/light_switch/examine(mob/user)
+ . = ..()
+ . += "It is [on? "on" : "off"]."
+
+/obj/machinery/light_switch/interact(mob/user)
+ . = ..()
+ on = !on
+
+ area.lightswitch = on
+ area.update_icon()
+
+ for(var/obj/machinery/light_switch/L in area)
+ L.on = on
+ L.update_icon()
+
+ area.power_change()
+
+/obj/machinery/light_switch/power_change()
+
+ if(!otherarea)
+ if(powered(LIGHT))
+ stat &= ~NOPOWER
+ else
+ stat |= NOPOWER
+
+ update_icon()
+
+/obj/machinery/light_switch/emp_act(severity)
+ . = ..()
+ if (. & EMP_PROTECT_SELF)
+ return
+ if(!(stat & (BROKEN|NOPOWER)))
+ power_change()
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index cd5482d7..c1d53293 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -1,386 +1,386 @@
-// Magnetic attractor, creates variable magnetic fields and attraction.
-// Can also be used to emit electron/proton beams to create a center of magnetism on another tile
-
-// tl;dr: it's magnets lol
-// This was created for firing ranges, but I suppose this could have other applications - Doohl
-
-/obj/machinery/magnetic_module
- icon = 'icons/obj/objects.dmi'
- icon_state = "floor_magnet-f"
- name = "electromagnetic generator"
- desc = "A device that uses station power to create points of magnetic energy."
- level = 1 // underfloor
- layer = LOW_OBJ_LAYER
- use_power = IDLE_POWER_USE
- idle_power_usage = 50
-
- var/freq = FREQ_MAGNETS // radio frequency
- var/electricity_level = 1 // intensity of the magnetic pull
- var/magnetic_field = 1 // the range of magnetic attraction
- var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something
- var/turf/center // the center of magnetic attraction
- var/on = FALSE
- var/magneting = FALSE
-
- // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down
- var/center_x = 0
- var/center_y = 0
- var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer
-
-/obj/machinery/magnetic_module/Initialize()
- ..()
- var/turf/T = loc
- hide(T.intact)
- center = T
- SSradio.add_object(src, freq, RADIO_MAGNETS)
- return INITIALIZE_HINT_LATELOAD
-
-/obj/machinery/magnetic_module/LateInitialize()
- magnetic_process()
-
-/obj/machinery/magnetic_module/Destroy()
- SSradio.remove_object(src, freq)
- center = null
- return ..()
-
-// update the invisibility and icon
-/obj/machinery/magnetic_module/hide(intact)
- invisibility = intact ? INVISIBILITY_MAXIMUM : 0
- updateicon()
-
-// update the icon_state
-/obj/machinery/magnetic_module/proc/updateicon()
- var/state="floor_magnet"
- var/onstate=""
- if(!on)
- onstate="0"
-
- if(invisibility)
- icon_state = "[state][onstate]-f" // if invisible, set icon to faded version
- // in case of being revealed by T-scanner
- else
- icon_state = "[state][onstate]"
-
-/obj/machinery/magnetic_module/receive_signal(datum/signal/signal)
-
- var/command = signal.data["command"]
- var/modifier = signal.data["modifier"]
- var/signal_code = signal.data["code"]
- if(command && (signal_code == code))
-
- Cmd(command, modifier)
-
-
-
-/obj/machinery/magnetic_module/proc/Cmd(command, modifier)
-
- if(command)
- switch(command)
- if("set-electriclevel")
- if(modifier)
- electricity_level = modifier
- if("set-magneticfield")
- if(modifier)
- magnetic_field = modifier
-
- if("add-elec")
- electricity_level++
- if(electricity_level > 12)
- electricity_level = 12
- if("sub-elec")
- electricity_level--
- if(electricity_level <= 0)
- electricity_level = 1
- if("add-mag")
- magnetic_field++
- if(magnetic_field > 4)
- magnetic_field = 4
- if("sub-mag")
- magnetic_field--
- if(magnetic_field <= 0)
- magnetic_field = 1
-
- if("set-x")
- if(modifier)
- center_x = modifier
- if("set-y")
- if(modifier)
- center_y = modifier
-
- if("N") // NORTH
- center_y++
- if("S") // SOUTH
- center_y--
- if("E") // EAST
- center_x++
- if("W") // WEST
- center_x--
- if("C") // CENTER
- center_x = 0
- center_y = 0
- if("R") // RANDOM
- center_x = rand(-max_dist, max_dist)
- center_y = rand(-max_dist, max_dist)
-
- if("set-code")
- if(modifier)
- code = modifier
- if("toggle-power")
- on = !on
-
- if(on)
- INVOKE_ASYNC(src, .proc/magnetic_process)
-
-
-
-/obj/machinery/magnetic_module/process()
- if(stat & NOPOWER)
- on = FALSE
-
- // Sanity checks:
- if(electricity_level <= 0)
- electricity_level = 1
- if(magnetic_field <= 0)
- magnetic_field = 1
-
-
- // Limitations:
- if(abs(center_x) > max_dist)
- center_x = max_dist
- if(abs(center_y) > max_dist)
- center_y = max_dist
- if(magnetic_field > 4)
- magnetic_field = 4
- if(electricity_level > 12)
- electricity_level = 12
-
- // Update power usage:
- if(on)
- use_power = ACTIVE_POWER_USE
- active_power_usage = electricity_level*15
- else
- use_power = NO_POWER_USE
-
- updateicon()
-
-
-/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the magneting
- if(magneting)
- return
- while(on)
-
- magneting = TRUE
- center = locate(x+center_x, y+center_y, z)
- if(center)
- for(var/obj/M in orange(magnetic_field, center))
- if(!M.anchored && (M.flags_1 & CONDUCT_1))
- step_towards(M, center)
-
- for(var/mob/living/silicon/S in orange(magnetic_field, center))
- if(isAI(S))
- continue
- step_towards(S, center)
-
- use_power(electricity_level * 5)
- sleep(13 - electricity_level)
-
- magneting = FALSE
-
-
-
-
-/obj/machinery/magnetic_controller
- name = "magnetic control console"
- icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING!
- icon_state = "airlock_control_standby"
- density = FALSE
- use_power = IDLE_POWER_USE
- idle_power_usage = 45
- var/frequency = FREQ_MAGNETS
- var/code = 0
- var/list/magnets = list()
- var/title = "Magnetic Control Console"
- var/autolink = 0 // if set to 1, can't probe for other magnets!
-
- var/pathpos = 1 // position in the path
- var/path = "w;e;e;w;s;n;n;s" // text path of the magnet
- var/speed = 1 // lowest = 1, highest = 10
- var/list/rpath = list() // real path of the magnet, used in iterator
-
- var/moving = 0 // 1 if scheduled to loop
- var/looping = 0 // 1 if looping
-
- var/datum/radio_frequency/radio_connection
-
-
-/obj/machinery/magnetic_controller/Initialize()
- . = ..()
- if(autolink)
- for(var/obj/machinery/magnetic_module/M in GLOB.machines)
- if(M.freq == frequency && M.code == code)
- magnets.Add(M)
-
- if(path) // check for default path
- filter_path() // renders rpath
- radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS)
-
-/obj/machinery/magnetic_controller/Destroy()
- SSradio.remove_object(src, frequency)
- magnets = null
- rpath = null
- return ..()
-
-/obj/machinery/magnetic_controller/process()
- if(magnets.len == 0 && autolink)
- for(var/obj/machinery/magnetic_module/M in GLOB.machines)
- if(M.freq == frequency && M.code == code)
- magnets.Add(M)
-
-/obj/machinery/magnetic_controller/ui_interact(mob/user)
- . = ..()
- var/dat = "Magnetic Control Console
"
- if(!autolink)
- dat += {"
- Frequency: [frequency]
- Code: [code]
- Probe Generators
- "}
-
- if(magnets.len >= 1)
-
- dat += "Magnets confirmed:
"
- var/i = 0
- for(var/obj/machinery/magnetic_module/M in magnets)
- i++
- dat += " < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
"
-
- dat += "
Speed: - [speed] +
"
- dat += "Path: {[path]}
"
- dat += "Moving: [moving ? "Enabled":"Disabled"]"
-
-
- user << browse(dat, "window=magnet;size=400x500")
- onclose(user, "magnet")
-
-/obj/machinery/magnetic_controller/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
-
- if(href_list["radio-op"])
-
- // Prepare signal beforehand, because this is a radio operation
- var/datum/signal/signal = new(list("code" = code))
-
- // Apply any necessary commands
- switch(href_list["radio-op"])
- if("togglepower")
- signal.data["command"] = "toggle-power"
-
- if("minuselec")
- signal.data["command"] = "sub-elec"
- if("pluselec")
- signal.data["command"] = "add-elec"
-
- if("minusmag")
- signal.data["command"] = "sub-mag"
- if("plusmag")
- signal.data["command"] = "add-mag"
-
-
- // Broadcast the signal
-
- radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
-
- spawn(1)
- updateUsrDialog() // pretty sure this increases responsiveness
-
- if(href_list["operation"])
- switch(href_list["operation"])
- if("plusspeed")
- speed ++
- if(speed > 10)
- speed = 10
- if("minusspeed")
- speed --
- if(speed <= 0)
- speed = 1
- if("setpath")
- var/newpath = stripped_input(usr, "Please define a new path!", "New Path", path, MAX_MESSAGE_LEN)
- if(newpath && newpath != "")
- moving = 0 // stop moving
- path = newpath
- pathpos = 1 // reset position
- filter_path() // renders rpath
-
- if("togglemoving")
- moving = !moving
- if(moving)
- spawn() MagnetMove()
-
-
- updateUsrDialog()
-
-/obj/machinery/magnetic_controller/proc/MagnetMove()
- if(looping)
- return
-
- while(moving && rpath.len >= 1)
-
- if(stat & (BROKEN|NOPOWER))
- break
-
- looping = 1
-
- // Prepare the radio signal
- var/datum/signal/signal = new(list("code" = code))
-
- if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
- pathpos = 1
-
- var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive
-
- if(!(nextmove in list("N","S","E","W","C","R")))
- // N, S, E, W are directional
- // C is center
- // R is random (in magnetic field's bounds)
- qdel(signal)
- break // break the loop if the character located is invalid
-
- signal.data["command"] = nextmove
-
-
- pathpos++ // increase iterator
-
- // Broadcast the signal
- spawn()
- radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
-
- if(speed == 10)
- sleep(1)
- else
- sleep(12-speed)
-
- looping = 0
-
-
-/obj/machinery/magnetic_controller/proc/filter_path()
- // Generates the rpath variable using the path string, think of this as "string2list"
- // Doesn't use params2list() because of the akward way it stacks entities
- rpath = list() // clear rpath
- var/maximum_characters = 50
-
- var/lentext = length(path)
- var/nextchar = ""
- var/charcount = 0
-
- for(var/i = 1, i <= lentext, i += length(nextchar)) // iterates through all characters in path
- nextchar = path[i] // find next character
-
- if(nextchar in list(";", "&", "*", " ")) // if char is a separator, ignore
- continue
- rpath += nextchar // else, add to list
- // there doesn't HAVE to be separators but it makes paths syntatically visible
- charcount++
- if(charcount >= maximum_characters)
- break
+// Magnetic attractor, creates variable magnetic fields and attraction.
+// Can also be used to emit electron/proton beams to create a center of magnetism on another tile
+
+// tl;dr: it's magnets lol
+// This was created for firing ranges, but I suppose this could have other applications - Doohl
+
+/obj/machinery/magnetic_module
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "floor_magnet-f"
+ name = "electromagnetic generator"
+ desc = "A device that uses station power to create points of magnetic energy."
+ level = 1 // underfloor
+ layer = LOW_OBJ_LAYER
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 50
+
+ var/freq = FREQ_MAGNETS // radio frequency
+ var/electricity_level = 1 // intensity of the magnetic pull
+ var/magnetic_field = 1 // the range of magnetic attraction
+ var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something
+ var/turf/center // the center of magnetic attraction
+ var/on = FALSE
+ var/magneting = FALSE
+
+ // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down
+ var/center_x = 0
+ var/center_y = 0
+ var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer
+
+/obj/machinery/magnetic_module/Initialize()
+ ..()
+ var/turf/T = loc
+ hide(T.intact)
+ center = T
+ SSradio.add_object(src, freq, RADIO_MAGNETS)
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/magnetic_module/LateInitialize()
+ magnetic_process()
+
+/obj/machinery/magnetic_module/Destroy()
+ SSradio.remove_object(src, freq)
+ center = null
+ return ..()
+
+// update the invisibility and icon
+/obj/machinery/magnetic_module/hide(intact)
+ invisibility = intact ? INVISIBILITY_MAXIMUM : 0
+ update_icon()
+
+// update the icon_state
+/obj/machinery/magnetic_module/update_icon()
+ var/state="floor_magnet"
+ var/onstate=""
+ if(!on)
+ onstate="0"
+
+ if(invisibility)
+ icon_state = "[state][onstate]-f" // if invisible, set icon to faded version
+ // in case of being revealed by T-scanner
+ else
+ icon_state = "[state][onstate]"
+
+/obj/machinery/magnetic_module/receive_signal(datum/signal/signal)
+
+ var/command = signal.data["command"]
+ var/modifier = signal.data["modifier"]
+ var/signal_code = signal.data["code"]
+ if(command && (signal_code == code))
+
+ Cmd(command, modifier)
+
+
+
+/obj/machinery/magnetic_module/proc/Cmd(command, modifier)
+
+ if(command)
+ switch(command)
+ if("set-electriclevel")
+ if(modifier)
+ electricity_level = modifier
+ if("set-magneticfield")
+ if(modifier)
+ magnetic_field = modifier
+
+ if("add-elec")
+ electricity_level++
+ if(electricity_level > 12)
+ electricity_level = 12
+ if("sub-elec")
+ electricity_level--
+ if(electricity_level <= 0)
+ electricity_level = 1
+ if("add-mag")
+ magnetic_field++
+ if(magnetic_field > 4)
+ magnetic_field = 4
+ if("sub-mag")
+ magnetic_field--
+ if(magnetic_field <= 0)
+ magnetic_field = 1
+
+ if("set-x")
+ if(modifier)
+ center_x = modifier
+ if("set-y")
+ if(modifier)
+ center_y = modifier
+
+ if("N") // NORTH
+ center_y++
+ if("S") // SOUTH
+ center_y--
+ if("E") // EAST
+ center_x++
+ if("W") // WEST
+ center_x--
+ if("C") // CENTER
+ center_x = 0
+ center_y = 0
+ if("R") // RANDOM
+ center_x = rand(-max_dist, max_dist)
+ center_y = rand(-max_dist, max_dist)
+
+ if("set-code")
+ if(modifier)
+ code = modifier
+ if("toggle-power")
+ on = !on
+
+ if(on)
+ INVOKE_ASYNC(src, .proc/magnetic_process)
+
+
+
+/obj/machinery/magnetic_module/process()
+ if(stat & NOPOWER)
+ on = FALSE
+
+ // Sanity checks:
+ if(electricity_level <= 0)
+ electricity_level = 1
+ if(magnetic_field <= 0)
+ magnetic_field = 1
+
+
+ // Limitations:
+ if(abs(center_x) > max_dist)
+ center_x = max_dist
+ if(abs(center_y) > max_dist)
+ center_y = max_dist
+ if(magnetic_field > 4)
+ magnetic_field = 4
+ if(electricity_level > 12)
+ electricity_level = 12
+
+ // Update power usage:
+ if(on)
+ use_power = ACTIVE_POWER_USE
+ active_power_usage = electricity_level*15
+ else
+ use_power = NO_POWER_USE
+
+ update_icon()
+
+
+/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the magneting
+ if(magneting)
+ return
+ while(on)
+
+ magneting = TRUE
+ center = locate(x+center_x, y+center_y, z)
+ if(center)
+ for(var/obj/M in orange(magnetic_field, center))
+ if(!M.anchored && (M.flags_1 & CONDUCT_1))
+ step_towards(M, center)
+
+ for(var/mob/living/silicon/S in orange(magnetic_field, center))
+ if(isAI(S))
+ continue
+ step_towards(S, center)
+
+ use_power(electricity_level * 5)
+ sleep(13 - electricity_level)
+
+ magneting = FALSE
+
+
+
+
+/obj/machinery/magnetic_controller
+ name = "magnetic control console"
+ icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING!
+ icon_state = "airlock_control_standby"
+ density = FALSE
+ use_power = IDLE_POWER_USE
+ idle_power_usage = 45
+ var/frequency = FREQ_MAGNETS
+ var/code = 0
+ var/list/magnets = list()
+ var/title = "Magnetic Control Console"
+ var/autolink = 0 // if set to 1, can't probe for other magnets!
+
+ var/pathpos = 1 // position in the path
+ var/path = "w;e;e;w;s;n;n;s" // text path of the magnet
+ var/speed = 1 // lowest = 1, highest = 10
+ var/list/rpath = list() // real path of the magnet, used in iterator
+
+ var/moving = 0 // 1 if scheduled to loop
+ var/looping = 0 // 1 if looping
+
+ var/datum/radio_frequency/radio_connection
+
+
+/obj/machinery/magnetic_controller/Initialize()
+ . = ..()
+ if(autolink)
+ for(var/obj/machinery/magnetic_module/M in GLOB.machines)
+ if(M.freq == frequency && M.code == code)
+ magnets.Add(M)
+
+ if(path) // check for default path
+ filter_path() // renders rpath
+ radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS)
+
+/obj/machinery/magnetic_controller/Destroy()
+ SSradio.remove_object(src, frequency)
+ magnets = null
+ rpath = null
+ return ..()
+
+/obj/machinery/magnetic_controller/process()
+ if(magnets.len == 0 && autolink)
+ for(var/obj/machinery/magnetic_module/M in GLOB.machines)
+ if(M.freq == frequency && M.code == code)
+ magnets.Add(M)
+
+/obj/machinery/magnetic_controller/ui_interact(mob/user)
+ . = ..()
+ var/dat = "Magnetic Control Console
"
+ if(!autolink)
+ dat += {"
+ Frequency: [frequency]
+ Code: [code]
+ Probe Generators
+ "}
+
+ if(magnets.len >= 1)
+
+ dat += "Magnets confirmed:
"
+ var/i = 0
+ for(var/obj/machinery/magnetic_module/M in magnets)
+ i++
+ dat += " < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
"
+
+ dat += "
Speed: - [speed] +
"
+ dat += "Path: {[path]}
"
+ dat += "Moving: [moving ? "Enabled":"Disabled"]"
+
+
+ user << browse(dat, "window=magnet;size=400x500")
+ onclose(user, "magnet")
+
+/obj/machinery/magnetic_controller/Topic(href, href_list)
+ if(..())
+ return
+ usr.set_machine(src)
+
+ if(href_list["radio-op"])
+
+ // Prepare signal beforehand, because this is a radio operation
+ var/datum/signal/signal = new(list("code" = code))
+
+ // Apply any necessary commands
+ switch(href_list["radio-op"])
+ if("togglepower")
+ signal.data["command"] = "toggle-power"
+
+ if("minuselec")
+ signal.data["command"] = "sub-elec"
+ if("pluselec")
+ signal.data["command"] = "add-elec"
+
+ if("minusmag")
+ signal.data["command"] = "sub-mag"
+ if("plusmag")
+ signal.data["command"] = "add-mag"
+
+
+ // Broadcast the signal
+
+ radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
+
+ spawn(1)
+ updateUsrDialog() // pretty sure this increases responsiveness
+
+ if(href_list["operation"])
+ switch(href_list["operation"])
+ if("plusspeed")
+ speed ++
+ if(speed > 10)
+ speed = 10
+ if("minusspeed")
+ speed --
+ if(speed <= 0)
+ speed = 1
+ if("setpath")
+ var/newpath = stripped_input(usr, "Please define a new path!", "New Path", path, MAX_MESSAGE_LEN)
+ if(newpath && newpath != "")
+ moving = 0 // stop moving
+ path = newpath
+ pathpos = 1 // reset position
+ filter_path() // renders rpath
+
+ if("togglemoving")
+ moving = !moving
+ if(moving)
+ spawn() MagnetMove()
+
+
+ updateUsrDialog()
+
+/obj/machinery/magnetic_controller/proc/MagnetMove()
+ if(looping)
+ return
+
+ while(moving && rpath.len >= 1)
+
+ if(stat & (BROKEN|NOPOWER))
+ break
+
+ looping = 1
+
+ // Prepare the radio signal
+ var/datum/signal/signal = new(list("code" = code))
+
+ if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
+ pathpos = 1
+
+ var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive
+
+ if(!(nextmove in list("N","S","E","W","C","R")))
+ // N, S, E, W are directional
+ // C is center
+ // R is random (in magnetic field's bounds)
+ qdel(signal)
+ break // break the loop if the character located is invalid
+
+ signal.data["command"] = nextmove
+
+
+ pathpos++ // increase iterator
+
+ // Broadcast the signal
+ spawn()
+ radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
+
+ if(speed == 10)
+ sleep(1)
+ else
+ sleep(12-speed)
+
+ looping = 0
+
+
+/obj/machinery/magnetic_controller/proc/filter_path()
+ // Generates the rpath variable using the path string, think of this as "string2list"
+ // Doesn't use params2list() because of the akward way it stacks entities
+ rpath = list() // clear rpath
+ var/maximum_characters = 50
+
+ var/lentext = length(path)
+ var/nextchar = ""
+ var/charcount = 0
+
+ for(var/i = 1, i <= lentext, i += length(nextchar)) // iterates through all characters in path
+ nextchar = path[i] // find next character
+
+ if(nextchar in list(";", "&", "*", " ")) // if char is a separator, ignore
+ continue
+ rpath += nextchar // else, add to list
+ // there doesn't HAVE to be separators but it makes paths syntatically visible
+ charcount++
+ if(charcount >= maximum_characters)
+ break
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 38416e94..7dc651e3 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -1,214 +1,214 @@
-// Navigation beacon for AI robots
-// No longer exists on the radio controller, it is managed by a global list.
-
-/obj/machinery/navbeacon
-
- icon = 'icons/obj/objects.dmi'
- icon_state = "navbeacon0-f"
- name = "navigation beacon"
- desc = "A radio beacon used for bot navigation."
- level = 1 // underfloor
- layer = LOW_OBJ_LAYER
- max_integrity = 500
- armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
-
- var/open = FALSE // true if cover is open
- var/locked = TRUE // true if controls are locked
- var/freq = FREQ_NAV_BEACON
- var/location = "" // location response text
- var/list/codes // assoc. list of transponder codes
- var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value"
-
- req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS)
-
-/obj/machinery/navbeacon/Initialize()
- . = ..()
-
- set_codes()
-
- var/turf/T = loc
- hide(T.intact)
- if(codes["patrol"])
- if(!GLOB.navbeacons["[z]"])
- GLOB.navbeacons["[z]"] = list()
- GLOB.navbeacons["[z]"] += src //Register with the patrol list!
- if(codes["delivery"])
- GLOB.deliverybeacons += src
- GLOB.deliverybeacontags += location
-
-/obj/machinery/navbeacon/Destroy()
- if (GLOB.navbeacons["[z]"])
- GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one.
- GLOB.deliverybeacons -= src
- return ..()
-
-/obj/machinery/navbeacon/onTransitZ(old_z, new_z)
- if (GLOB.navbeacons["[old_z]"])
- GLOB.navbeacons["[old_z]"] -= src
- if (GLOB.navbeacons["[new_z]"])
- GLOB.navbeacons["[new_z]"] += src
- ..()
-
-// set the transponder codes assoc list from codes_txt
-/obj/machinery/navbeacon/proc/set_codes()
- if(!codes_txt)
- return
-
- codes = new()
-
- var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons
-
- for(var/e in entries)
- var/index = findtext(e, "=") // format is "key=value"
- if(index)
- var/key = copytext(e, 1, index)
- var/val = copytext(e, index + length(e[index]))
- codes[key] = val
- else
- codes[e] = "1"
-
-
-// called when turf state changes
-// hide the object if turf is intact
-/obj/machinery/navbeacon/hide(intact)
- invisibility = intact ? INVISIBILITY_MAXIMUM : 0
- updateicon()
-
-// update the icon_state
-/obj/machinery/navbeacon/proc/updateicon()
- var/state="navbeacon[open]"
-
- if(invisibility)
- icon_state = "[state]-f" // if invisible, set icon to faded version
- // in case revealed by T-scanner
- else
- icon_state = "[state]"
-
-/obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params)
- var/turf/T = loc
- if(T.intact)
- return // prevent intraction when T-scanner revealed
-
- if(istype(I, /obj/item/screwdriver))
- open = !open
-
- user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.")
-
- updateicon()
-
- else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda))
- if(open)
- if (src.allowed(user))
- src.locked = !src.locked
- to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"].")
- else
- to_chat(user, "Access denied.")
- updateDialog()
- else
- to_chat(user, "You must open the cover first!")
- else
- return ..()
-
-/obj/machinery/navbeacon/attack_ai(mob/user)
- interact(user, 1)
-
-/obj/machinery/navbeacon/attack_paw()
- return
-
-/obj/machinery/navbeacon/ui_interact(mob/user)
- . = ..()
- var/ai = isAI(user)
- var/turf/T = loc
- if(T.intact)
- return // prevent intraction when T-scanner revealed
-
- if(!open && !ai) // can't alter controls if not open, unless you're an AI
- to_chat(user, "The beacon's control cover is closed!")
- return
-
-
- var/t
-
- if(locked && !ai)
- t = {"Navigation Beacon
-(swipe card to unlock controls)
-Location: [location ? location : "(none)"]
-Transponder Codes:"}
-
- for(var/key in codes)
- t += "- [key] ... [codes[key]]"
- t+= "
"
-
- else
-
- t = {"Navigation Beacon
-(swipe card to lock controls)
-
-
-Location: [location ? location : "None"]
-Transponder Codes:"}
-
- for(var/key in codes)
- t += "- [key] ... [codes[key]]"
- t += " Edit"
- t += " Delete
"
- t += " Add New
"
- t+= "
"
-
- var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400)
- popup.set_content(t)
- popup.open()
- return
-
-/obj/machinery/navbeacon/Topic(href, href_list)
- if(..())
- return
- if(open && !locked)
- usr.set_machine(src)
-
- if(href_list["locedit"])
- var/newloc = stripped_input(usr, "Enter New Location", "Navigation Beacon", location, MAX_MESSAGE_LEN)
- if(newloc)
- location = newloc
- updateDialog()
-
- else if(href_list["edit"])
- var/codekey = href_list["code"]
-
- var/newkey = stripped_input(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey)
- if(!newkey)
- return
-
- var/codeval = codes[codekey]
- var/newval = stripped_input(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval)
- if(!newval)
- newval = codekey
- return
-
- codes.Remove(codekey)
- codes[newkey] = newval
-
- updateDialog()
-
- else if(href_list["delete"])
- var/codekey = href_list["code"]
- codes.Remove(codekey)
- updateDialog()
-
- else if(href_list["add"])
-
- var/newkey = stripped_input(usr, "Enter New Transponder Code Key", "Navigation Beacon")
- if(!newkey)
- return
-
- var/newval = stripped_input(usr, "Enter New Transponder Code Value", "Navigation Beacon")
- if(!newval)
- newval = "1"
- return
-
- if(!codes)
- codes = new()
-
- codes[newkey] = newval
-
- updateDialog()
+// Navigation beacon for AI robots
+// No longer exists on the radio controller, it is managed by a global list.
+
+/obj/machinery/navbeacon
+
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "navbeacon0-f"
+ name = "navigation beacon"
+ desc = "A radio beacon used for bot navigation."
+ level = 1 // underfloor
+ layer = LOW_OBJ_LAYER
+ max_integrity = 500
+ armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
+
+ var/open = FALSE // true if cover is open
+ var/locked = TRUE // true if controls are locked
+ var/freq = FREQ_NAV_BEACON
+ var/location = "" // location response text
+ var/list/codes // assoc. list of transponder codes
+ var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value"
+
+ req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS)
+
+/obj/machinery/navbeacon/Initialize()
+ . = ..()
+
+ set_codes()
+
+ var/turf/T = loc
+ hide(T.intact)
+ if(codes["patrol"])
+ if(!GLOB.navbeacons["[z]"])
+ GLOB.navbeacons["[z]"] = list()
+ GLOB.navbeacons["[z]"] += src //Register with the patrol list!
+ if(codes["delivery"])
+ GLOB.deliverybeacons += src
+ GLOB.deliverybeacontags += location
+
+/obj/machinery/navbeacon/Destroy()
+ if (GLOB.navbeacons["[z]"])
+ GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one.
+ GLOB.deliverybeacons -= src
+ return ..()
+
+/obj/machinery/navbeacon/onTransitZ(old_z, new_z)
+ if (GLOB.navbeacons["[old_z]"])
+ GLOB.navbeacons["[old_z]"] -= src
+ if (GLOB.navbeacons["[new_z]"])
+ GLOB.navbeacons["[new_z]"] += src
+ ..()
+
+// set the transponder codes assoc list from codes_txt
+/obj/machinery/navbeacon/proc/set_codes()
+ if(!codes_txt)
+ return
+
+ codes = new()
+
+ var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons
+
+ for(var/e in entries)
+ var/index = findtext(e, "=") // format is "key=value"
+ if(index)
+ var/key = copytext(e, 1, index)
+ var/val = copytext(e, index + length(e[index]))
+ codes[key] = val
+ else
+ codes[e] = "1"
+
+
+// called when turf state changes
+// hide the object if turf is intact
+/obj/machinery/navbeacon/hide(intact)
+ invisibility = intact ? INVISIBILITY_MAXIMUM : 0
+ update_icon()
+
+// update the icon_state
+/obj/machinery/navbeacon/update_icon()
+ var/state="navbeacon[open]"
+
+ if(invisibility)
+ icon_state = "[state]-f" // if invisible, set icon to faded version
+ // in case revealed by T-scanner
+ else
+ icon_state = "[state]"
+
+/obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params)
+ var/turf/T = loc
+ if(T.intact)
+ return // prevent intraction when T-scanner revealed
+
+ if(istype(I, /obj/item/screwdriver))
+ open = !open
+
+ user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.")
+
+ update_icon()
+
+ else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda))
+ if(open)
+ if (src.allowed(user))
+ src.locked = !src.locked
+ to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"].")
+ else
+ to_chat(user, "Access denied.")
+ updateDialog()
+ else
+ to_chat(user, "You must open the cover first!")
+ else
+ return ..()
+
+/obj/machinery/navbeacon/attack_ai(mob/user)
+ interact(user, 1)
+
+/obj/machinery/navbeacon/attack_paw()
+ return
+
+/obj/machinery/navbeacon/ui_interact(mob/user)
+ . = ..()
+ var/ai = isAI(user)
+ var/turf/T = loc
+ if(T.intact)
+ return // prevent intraction when T-scanner revealed
+
+ if(!open && !ai) // can't alter controls if not open, unless you're an AI
+ to_chat(user, "The beacon's control cover is closed!")
+ return
+
+
+ var/t
+
+ if(locked && !ai)
+ t = {"Navigation Beacon
+(swipe card to unlock controls)
+Location: [location ? location : "(none)"]
+Transponder Codes:"}
+
+ for(var/key in codes)
+ t += "- [key] ... [codes[key]]"
+ t+= "
"
+
+ else
+
+ t = {"Navigation Beacon
+(swipe card to lock controls)
+
+
+Location: [location ? location : "None"]
+Transponder Codes:"}
+
+ for(var/key in codes)
+ t += "- [key] ... [codes[key]]"
+ t += " Edit"
+ t += " Delete
"
+ t += " Add New
"
+ t+= "
"
+
+ var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400)
+ popup.set_content(t)
+ popup.open()
+ return
+
+/obj/machinery/navbeacon/Topic(href, href_list)
+ if(..())
+ return
+ if(open && !locked)
+ usr.set_machine(src)
+
+ if(href_list["locedit"])
+ var/newloc = stripped_input(usr, "Enter New Location", "Navigation Beacon", location, MAX_MESSAGE_LEN)
+ if(newloc)
+ location = newloc
+ updateDialog()
+
+ else if(href_list["edit"])
+ var/codekey = href_list["code"]
+
+ var/newkey = stripped_input(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey)
+ if(!newkey)
+ return
+
+ var/codeval = codes[codekey]
+ var/newval = stripped_input(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval)
+ if(!newval)
+ newval = codekey
+ return
+
+ codes.Remove(codekey)
+ codes[newkey] = newval
+
+ updateDialog()
+
+ else if(href_list["delete"])
+ var/codekey = href_list["code"]
+ codes.Remove(codekey)
+ updateDialog()
+
+ else if(href_list["add"])
+
+ var/newkey = stripped_input(usr, "Enter New Transponder Code Key", "Navigation Beacon")
+ if(!newkey)
+ return
+
+ var/newval = stripped_input(usr, "Enter New Transponder Code Value", "Navigation Beacon")
+ if(!newval)
+ newval = "1"
+ return
+
+ if(!codes)
+ codes = new()
+
+ codes[newkey] = newval
+
+ updateDialog()
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index b1638844..c165eb6e 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -464,7 +464,7 @@
status = rcd_status
delay = rcd_delay
if (status == RCD_DECONSTRUCT)
- addtimer(CALLBACK(src, .proc/update_icon), 11)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 11)
delay -= 11
icon_state = "rcd_end_reverse"
else
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 946b3cac..d0608d52 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -46,8 +46,7 @@
/obj/item/defibrillator/update_icon()
update_power()
- update_overlays()
- update_charge()
+ return ..()
/obj/item/defibrillator/proc/update_power()
if(!QDELETED(cell))
@@ -58,23 +57,20 @@
else
powered = FALSE
-/obj/item/defibrillator/proc/update_overlays()
- cut_overlays()
+/obj/item/defibrillator/update_overlays()
+ . = ..()
if(!on)
- add_overlay("[initial(icon_state)]-paddles")
+ . += "[initial(icon_state)]-paddles"
if(powered)
- add_overlay("[initial(icon_state)]-powered")
- if(!cell)
- add_overlay("[initial(icon_state)]-nocell")
- if(!safety)
- add_overlay("[initial(icon_state)]-emagged")
-
-/obj/item/defibrillator/proc/update_charge()
- if(powered) //so it doesn't show charge if it's unpowered
+ . += "[initial(icon_state)]-powered"
if(!QDELETED(cell))
var/ratio = cell.charge / cell.maxcharge
ratio = CEILING(ratio*4, 1) * 25
add_overlay("[initial(icon_state)]-charge[ratio]")
+ if(!cell)
+ . += "[initial(icon_state)]-nocell"
+ if(!safety)
+ . += "[initial(icon_state)]-emagged"
/obj/item/defibrillator/CheckParts(list/parts_list)
..()
diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm
index 3fde2307..a8d57fab 100644
--- a/code/game/objects/items/devices/transfer_valve.dm
+++ b/code/game/objects/items/devices/transfer_valve.dm
@@ -1,237 +1,237 @@
-/obj/item/transfer_valve
- icon = 'icons/obj/assemblies.dmi'
- name = "tank transfer valve"
- icon_state = "valve_1"
- item_state = "ttv"
- lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
- desc = "Regulates the transfer of air between two tanks."
- w_class = WEIGHT_CLASS_BULKY
- var/obj/item/tank/tank_one
- var/obj/item/tank/tank_two
- var/obj/item/assembly/attached_device
- var/mob/attacher = null
- var/valve_open = FALSE
- var/toggle = 1
-
-/obj/item/transfer_valve/IsAssemblyHolder()
- return TRUE
-
-/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params)
- if(istype(item, /obj/item/tank))
- if(tank_one && tank_two)
- to_chat(user, "There are already two tanks attached, remove one first!")
- return
-
- if(!tank_one)
- if(!user.transferItemToLoc(item, src))
- return
- tank_one = item
- to_chat(user, "You attach the tank to the transfer valve.")
- else if(!tank_two)
- if(!user.transferItemToLoc(item, src))
- return
- tank_two = item
- to_chat(user, "You attach the tank to the transfer valve.")
-
- update_icon()
-//TODO: Have this take an assemblyholder
- else if(isassembly(item))
- var/obj/item/assembly/A = item
- if(A.secured)
- to_chat(user, "The device is secured.")
- return
- if(attached_device)
- to_chat(user, "There is already a device attached to the valve, remove it first!")
- return
- if(!user.transferItemToLoc(item, src))
- return
- attached_device = A
- to_chat(user, "You attach the [item] to the valve controls and secure it.")
- A.holder = src
- A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
-
- GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve."
- message_admins("[ADMIN_LOOKUPFLW(user)] attached a [item] to a transfer valve.")
- log_game("[key_name(user)] attached a [item] to a transfer valve.")
- attacher = user
- return
-
-//Attached device memes
-/obj/item/transfer_valve/Move()
- . = ..()
- if(attached_device)
- attached_device.holder_movement()
-
-/obj/item/transfer_valve/dropped()
- . = ..()
- if(attached_device)
- attached_device.dropped()
-
-/obj/item/transfer_valve/on_found(mob/finder)
- if(attached_device)
- attached_device.on_found(finder)
-
-/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj)
- . = ..()
- if(attached_device)
- attached_device.Crossed(AM)
-
-/obj/item/transfer_valve/attack_hand()//Triggers mousetraps
- . = ..()
- if(.)
- return
- if(attached_device)
- attached_device.attack_hand()
-
-//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction.
-
-
-/obj/item/transfer_valve/attack_self(mob/user)
- user.set_machine(src)
- var/dat = {" Valve properties:
-
Attachment one: [tank_one] [tank_one ? "Remove" : ""]
-
Attachment two: [tank_two] [tank_two ? "Remove" : ""]
-
Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""]
-
Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"}
-
- var/datum/browser/popup = new(user, "trans_valve", name)
- popup.set_content(dat)
- popup.open()
- return
-
-/obj/item/transfer_valve/Topic(href, href_list)
- ..()
- if(!usr.canUseTopic(src))
- return
- if(tank_one && href_list["tankone"])
- split_gases()
- valve_open = FALSE
- tank_one.forceMove(drop_location())
- tank_one = null
- update_icon()
- else if(tank_two && href_list["tanktwo"])
- split_gases()
- valve_open = FALSE
- tank_two.forceMove(drop_location())
- tank_two = null
- update_icon()
- else if(href_list["open"])
- toggle_valve()
- else if(attached_device)
- if(href_list["rem_device"])
- attached_device.on_detach()
- attached_device = null
- update_icon()
- if(href_list["device"])
- attached_device.attack_self(usr)
-
- attack_self(usr)
- add_fingerprint(usr)
-
-/obj/item/transfer_valve/proc/process_activation(obj/item/D)
- if(toggle)
- toggle = FALSE
- toggle_valve()
- addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever
-
-/obj/item/transfer_valve/proc/toggle_off()
- toggle = TRUE
-
-/obj/item/transfer_valve/update_icon()
- cut_overlays()
- underlays = null
-
- if(!tank_one && !tank_two && !attached_device)
- icon_state = "valve_1"
- return
- icon_state = "valve"
-
- if(tank_one)
- add_overlay("[tank_one.icon_state]")
- if(tank_two)
- var/icon/J = new(icon, icon_state = "[tank_two.icon_state]")
- J.Shift(WEST, 13)
- underlays += J
- if(attached_device)
- add_overlay("device")
- if(istype(attached_device, /obj/item/assembly/infra))
- var/obj/item/assembly/infra/sensor = attached_device
- if(sensor.on && sensor.visible)
- add_overlay("proxy_beam")
-
-/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE)
- var/target_self = FALSE
- if(!target || (target == tank_one.air_contents))
- target = tank_two.air_contents
- if(target == tank_two.air_contents)
- target_self = TRUE
- if(change_volume)
- if(!target_self)
- target.volume += tank_two.volume
- target.volume += tank_one.air_contents.volume
- var/datum/gas_mixture/temp
- temp = tank_one.air_contents.remove_ratio(1)
- target.merge(temp)
- if(!target_self)
- temp = tank_two.air_contents.remove_ratio(1)
- target.merge(temp)
-
-/obj/item/transfer_valve/proc/split_gases()
- if (!valve_open || !tank_one || !tank_two)
- return
- var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
- var/datum/gas_mixture/temp
- temp = tank_two.air_contents.remove_ratio(ratio1)
- tank_one.air_contents.merge(temp)
- tank_two.air_contents.volume -= tank_one.air_contents.volume
-
- /*
- Exadv1: I know this isn't how it's going to work, but this was just to check
- it explodes properly when it gets a signal (and it does).
- */
-
-/obj/item/transfer_valve/proc/toggle_valve()
- if(!valve_open && tank_one && tank_two)
- valve_open = TRUE
- var/turf/bombturf = get_turf(src)
-
- var/attachment
- if(attached_device)
- if(istype(attached_device, /obj/item/assembly/signaler))
- attachment = "[attached_device]"
- else
- attachment = attached_device
-
- var/admin_attachment_message
- var/attachment_message
- if(attachment)
- admin_attachment_message = " with [attachment] attached by [attacher ? ADMIN_LOOKUPFLW(attacher) : "Unknown"]"
- attachment_message = " with [attachment] attached by [attacher ? key_name_admin(attacher) : "Unknown"]"
-
- var/mob/bomber = get_mob_by_key(fingerprintslast)
- var/admin_bomber_message
- var/bomber_message
- if(bomber)
- admin_bomber_message = " - Last touched by: [ADMIN_LOOKUPFLW(bomber)]"
- bomber_message = " - Last touched by: [key_name_admin(bomber)]"
-
-
- var/admin_bomb_message = "Bomb valve opened in [ADMIN_VERBOSEJMP(bombturf)][admin_attachment_message][admin_bomber_message]"
- GLOB.bombers += admin_bomb_message
- message_admins(admin_bomb_message, 0, 1)
- log_game("Bomb valve opened in [AREACOORD(bombturf)][attachment_message][bomber_message]")
-
- merge_gases()
- for(var/i in 1 to 6)
- addtimer(CALLBACK(src, .proc/update_icon), 20 + (i - 1) * 10)
-
- else if(valve_open && tank_one && tank_two)
- split_gases()
- valve_open = FALSE
- update_icon()
-
-// this doesn't do anything but the timer etc. expects it to be here
-// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
-/obj/item/transfer_valve/proc/c_state()
- return
+/obj/item/transfer_valve
+ icon = 'icons/obj/assemblies.dmi'
+ name = "tank transfer valve"
+ icon_state = "valve_1"
+ item_state = "ttv"
+ lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
+ desc = "Regulates the transfer of air between two tanks."
+ w_class = WEIGHT_CLASS_BULKY
+ var/obj/item/tank/tank_one
+ var/obj/item/tank/tank_two
+ var/obj/item/assembly/attached_device
+ var/mob/attacher = null
+ var/valve_open = FALSE
+ var/toggle = 1
+
+/obj/item/transfer_valve/IsAssemblyHolder()
+ return TRUE
+
+/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params)
+ if(istype(item, /obj/item/tank))
+ if(tank_one && tank_two)
+ to_chat(user, "There are already two tanks attached, remove one first!")
+ return
+
+ if(!tank_one)
+ if(!user.transferItemToLoc(item, src))
+ return
+ tank_one = item
+ to_chat(user, "You attach the tank to the transfer valve.")
+ else if(!tank_two)
+ if(!user.transferItemToLoc(item, src))
+ return
+ tank_two = item
+ to_chat(user, "You attach the tank to the transfer valve.")
+
+ update_icon()
+//TODO: Have this take an assemblyholder
+ else if(isassembly(item))
+ var/obj/item/assembly/A = item
+ if(A.secured)
+ to_chat(user, "The device is secured.")
+ return
+ if(attached_device)
+ to_chat(user, "There is already a device attached to the valve, remove it first!")
+ return
+ if(!user.transferItemToLoc(item, src))
+ return
+ attached_device = A
+ to_chat(user, "You attach the [item] to the valve controls and secure it.")
+ A.holder = src
+ A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
+
+ GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve."
+ message_admins("[ADMIN_LOOKUPFLW(user)] attached a [item] to a transfer valve.")
+ log_game("[key_name(user)] attached a [item] to a transfer valve.")
+ attacher = user
+ return
+
+//Attached device memes
+/obj/item/transfer_valve/Move()
+ . = ..()
+ if(attached_device)
+ attached_device.holder_movement()
+
+/obj/item/transfer_valve/dropped()
+ . = ..()
+ if(attached_device)
+ attached_device.dropped()
+
+/obj/item/transfer_valve/on_found(mob/finder)
+ if(attached_device)
+ attached_device.on_found(finder)
+
+/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj)
+ . = ..()
+ if(attached_device)
+ attached_device.Crossed(AM)
+
+/obj/item/transfer_valve/attack_hand()//Triggers mousetraps
+ . = ..()
+ if(.)
+ return
+ if(attached_device)
+ attached_device.attack_hand()
+
+//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction.
+
+
+/obj/item/transfer_valve/attack_self(mob/user)
+ user.set_machine(src)
+ var/dat = {" Valve properties:
+
Attachment one: [tank_one] [tank_one ? "Remove" : ""]
+
Attachment two: [tank_two] [tank_two ? "Remove" : ""]
+
Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""]
+
Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"}
+
+ var/datum/browser/popup = new(user, "trans_valve", name)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/obj/item/transfer_valve/Topic(href, href_list)
+ ..()
+ if(!usr.canUseTopic(src))
+ return
+ if(tank_one && href_list["tankone"])
+ split_gases()
+ valve_open = FALSE
+ tank_one.forceMove(drop_location())
+ tank_one = null
+ update_icon()
+ else if(tank_two && href_list["tanktwo"])
+ split_gases()
+ valve_open = FALSE
+ tank_two.forceMove(drop_location())
+ tank_two = null
+ update_icon()
+ else if(href_list["open"])
+ toggle_valve()
+ else if(attached_device)
+ if(href_list["rem_device"])
+ attached_device.on_detach()
+ attached_device = null
+ update_icon()
+ if(href_list["device"])
+ attached_device.attack_self(usr)
+
+ attack_self(usr)
+ add_fingerprint(usr)
+
+/obj/item/transfer_valve/proc/process_activation(obj/item/D)
+ if(toggle)
+ toggle = FALSE
+ toggle_valve()
+ addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever
+
+/obj/item/transfer_valve/proc/toggle_off()
+ toggle = TRUE
+
+/obj/item/transfer_valve/update_icon()
+ cut_overlays()
+ underlays = null
+
+ if(!tank_one && !tank_two && !attached_device)
+ icon_state = "valve_1"
+ return
+ icon_state = "valve"
+
+ if(tank_one)
+ add_overlay("[tank_one.icon_state]")
+ if(tank_two)
+ var/icon/J = new(icon, icon_state = "[tank_two.icon_state]")
+ J.Shift(WEST, 13)
+ underlays += J
+ if(attached_device)
+ add_overlay("device")
+ if(istype(attached_device, /obj/item/assembly/infra))
+ var/obj/item/assembly/infra/sensor = attached_device
+ if(sensor.on && sensor.visible)
+ add_overlay("proxy_beam")
+
+/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE)
+ var/target_self = FALSE
+ if(!target || (target == tank_one.air_contents))
+ target = tank_two.air_contents
+ if(target == tank_two.air_contents)
+ target_self = TRUE
+ if(change_volume)
+ if(!target_self)
+ target.volume += tank_two.volume
+ target.volume += tank_one.air_contents.volume
+ var/datum/gas_mixture/temp
+ temp = tank_one.air_contents.remove_ratio(1)
+ target.merge(temp)
+ if(!target_self)
+ temp = tank_two.air_contents.remove_ratio(1)
+ target.merge(temp)
+
+/obj/item/transfer_valve/proc/split_gases()
+ if (!valve_open || !tank_one || !tank_two)
+ return
+ var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume
+ var/datum/gas_mixture/temp
+ temp = tank_two.air_contents.remove_ratio(ratio1)
+ tank_one.air_contents.merge(temp)
+ tank_two.air_contents.volume -= tank_one.air_contents.volume
+
+ /*
+ Exadv1: I know this isn't how it's going to work, but this was just to check
+ it explodes properly when it gets a signal (and it does).
+ */
+
+/obj/item/transfer_valve/proc/toggle_valve()
+ if(!valve_open && tank_one && tank_two)
+ valve_open = TRUE
+ var/turf/bombturf = get_turf(src)
+
+ var/attachment
+ if(attached_device)
+ if(istype(attached_device, /obj/item/assembly/signaler))
+ attachment = "[attached_device]"
+ else
+ attachment = attached_device
+
+ var/admin_attachment_message
+ var/attachment_message
+ if(attachment)
+ admin_attachment_message = " with [attachment] attached by [attacher ? ADMIN_LOOKUPFLW(attacher) : "Unknown"]"
+ attachment_message = " with [attachment] attached by [attacher ? key_name_admin(attacher) : "Unknown"]"
+
+ var/mob/bomber = get_mob_by_key(fingerprintslast)
+ var/admin_bomber_message
+ var/bomber_message
+ if(bomber)
+ admin_bomber_message = " - Last touched by: [ADMIN_LOOKUPFLW(bomber)]"
+ bomber_message = " - Last touched by: [key_name_admin(bomber)]"
+
+
+ var/admin_bomb_message = "Bomb valve opened in [ADMIN_VERBOSEJMP(bombturf)][admin_attachment_message][admin_bomber_message]"
+ GLOB.bombers += admin_bomb_message
+ message_admins(admin_bomb_message, 0, 1)
+ log_game("Bomb valve opened in [AREACOORD(bombturf)][attachment_message][bomber_message]")
+
+ merge_gases()
+ for(var/i in 1 to 6)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 20 + (i - 1) * 10)
+
+ else if(valve_open && tank_one && tank_two)
+ split_gases()
+ valve_open = FALSE
+ update_icon()
+
+// this doesn't do anything but the timer etc. expects it to be here
+// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
+/obj/item/transfer_valve/proc/c_state()
+ return
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index 72d27ae5..e63b4d7a 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -213,7 +213,7 @@
loadedWeightClass -= I.w_class
else if (A == tank)
tank = null
- update_icons()
+ update_icon()
/obj/item/pneumatic_cannon/ghetto //Obtainable by improvised methods; more gas per use, less capacity, but smaller
name = "improvised pneumatic cannon"
@@ -239,14 +239,13 @@
return
to_chat(user, "You hook \the [thetank] up to \the [src].")
tank = thetank
- update_icons()
+ update_icon()
-/obj/item/pneumatic_cannon/proc/update_icons()
+/obj/item/pneumatic_cannon/update_icon()
cut_overlays()
if(!tank)
return
add_overlay(tank.icon_state)
- update_icon()
/obj/item/pneumatic_cannon/proc/fill_with_type(type, amount)
if(!ispath(type, /obj) && !ispath(type, /mob))
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 811d5f24..91b8021d 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -1,413 +1,413 @@
-
-
-//The robot bodyparts have been moved to code/module/surgery/bodyparts/robot_bodyparts.dm
-
-
-/obj/item/robot_suit
- name = "cyborg endoskeleton"
- desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
- icon = 'icons/mob/augmentation/augments.dmi'
- icon_state = "robo_suit"
- var/obj/item/bodypart/l_arm/robot/l_arm = null
- var/obj/item/bodypart/r_arm/robot/r_arm = null
- var/obj/item/bodypart/l_leg/robot/l_leg = null
- var/obj/item/bodypart/r_leg/robot/r_leg = null
- var/obj/item/bodypart/chest/robot/chest = null
- var/obj/item/bodypart/head/robot/head = null
-
- var/created_name = ""
- var/mob/living/silicon/ai/forced_ai
- var/locomotion = 1
- var/lawsync = 1
- var/aisync = 1
- var/panel_locked = TRUE
-
-/obj/item/robot_suit/New()
- ..()
- updateicon()
-
-/obj/item/robot_suit/prebuilt/New()
- l_arm = new(src)
- r_arm = new(src)
- l_leg = new(src)
- r_leg = new(src)
- head = new(src)
- head.flash1 = new(head)
- head.flash2 = new(head)
- chest = new(src)
- chest.wired = TRUE
- chest.cell = new /obj/item/stock_parts/cell/high/plus(chest)
- ..()
-
-/obj/item/robot_suit/proc/updateicon()
- cut_overlays()
- if(l_arm)
- add_overlay("[l_arm.icon_state]+o")
- if(r_arm)
- add_overlay("[r_arm.icon_state]+o")
- if(chest)
- add_overlay("[chest.icon_state]+o")
- if(l_leg)
- add_overlay("[l_leg.icon_state]+o")
- if(r_leg)
- add_overlay("[r_leg.icon_state]+o")
- if(head)
- add_overlay("[head.icon_state]+o")
-
-/obj/item/robot_suit/proc/check_completion()
- if(src.l_arm && src.r_arm)
- if(src.l_leg && src.r_leg)
- if(src.chest && src.head)
- SSblackbox.record_feedback("amount", "cyborg_frames_built", 1)
- return 1
- return 0
-
-/obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet
- var/turf/T = get_turf(src)
- if(l_leg || r_leg || chest || l_arm || r_arm || head)
- if(I.use_tool(src, user, 5, volume=50))
- if(l_leg)
- l_leg.forceMove(T)
- l_leg = null
- if(r_leg)
- r_leg.forceMove(T)
- r_leg = null
- if(chest)
- if (chest.cell) //Sanity check.
- chest.cell.forceMove(T)
- chest.cell = null
- chest.forceMove(T)
- new /obj/item/stack/cable_coil(T, 1)
- chest.wired = FALSE
- chest = null
- if(l_arm)
- l_arm.forceMove(T)
- l_arm = null
- if(r_arm)
- r_arm.forceMove(T)
- r_arm = null
- if(head)
- head.forceMove(T)
- head.flash1.forceMove(T)
- head.flash1 = null
- head.flash2.forceMove(T)
- head.flash2 = null
- head = null
- to_chat(user, "You disassemble the cyborg shell.")
- else
- to_chat(user, "There is nothing to remove from the endoskeleton.")
- updateicon()
-
-/obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc
- if(!user.put_in_hands(I))
- I.forceMove(drop_location())
- return FALSE
- return TRUE
-
-/obj/item/robot_suit/screwdriver_act(mob/living/user, obj/item/I) //Swaps the power cell if you're holding a new one in your other hand.
- . = ..()
- if(.)
- return TRUE
-
- if(!chest) //can't remove a cell if there's no chest to remove it from.
- to_chat(user, "[src] has no attached torso.")
- return
-
- var/obj/item/stock_parts/cell/temp_cell = user.is_holding_item_of_type(/obj/item/stock_parts/cell)
- var/swap_failed
- if(!temp_cell) //if we're not holding a cell
- swap_failed = TRUE
- else if(!user.transferItemToLoc(temp_cell, chest))
- swap_failed = TRUE
- to_chat(user, "[temp_cell] is stuck to your hand, you can't put it in [src]!")
-
- if(chest.cell) //drop the chest's current cell no matter what.
- put_in_hand_or_drop(user, chest.cell)
-
- if(swap_failed) //we didn't transfer any new items.
- if(chest.cell) //old cell ejected, nothing inserted.
- to_chat(user, "You remove [chest.cell] from [src].")
- chest.cell = null
- else
- to_chat(user, "The power cell slot in [src]'s torso is empty.")
- return
-
- to_chat(user, "You [chest.cell ? "replace [src]'s [chest.cell.name] with [temp_cell]" : "insert [temp_cell] into [src]"].")
- chest.cell = temp_cell
- return TRUE
-
-/obj/item/robot_suit/attackby(obj/item/W, mob/user, params)
-
- if(istype(W, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = W
- if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
- if (M.use(1))
- var/obj/item/bot_assembly/ed209/B = new
- B.forceMove(drop_location())
- to_chat(user, "You arm the robot frame.")
- var/holding_this = user.get_inactive_held_item()==src
- qdel(src)
- if (holding_this)
- user.put_in_inactive_hand(B)
- else
- to_chat(user, "You need one sheet of metal to start building ED-209!")
- return
- else if(istype(W, /obj/item/bodypart/l_leg/robot))
- if(src.l_leg)
- return
- if(!user.transferItemToLoc(W, src))
- return
- W.icon_state = initial(W.icon_state)
- W.cut_overlays()
- src.l_leg = W
- src.updateicon()
-
- else if(istype(W, /obj/item/bodypart/r_leg/robot))
- if(src.r_leg)
- return
- if(!user.transferItemToLoc(W, src))
- return
- W.icon_state = initial(W.icon_state)
- W.cut_overlays()
- src.r_leg = W
- src.updateicon()
-
- else if(istype(W, /obj/item/bodypart/l_arm/robot))
- if(src.l_arm)
- return
- if(!user.transferItemToLoc(W, src))
- return
- W.icon_state = initial(W.icon_state)
- W.cut_overlays()
- src.l_arm = W
- src.updateicon()
-
- else if(istype(W, /obj/item/bodypart/r_arm/robot))
- if(src.r_arm)
- return
- if(!user.transferItemToLoc(W, src))
- return
- W.icon_state = initial(W.icon_state)//in case it is a dismembered robotic limb
- W.cut_overlays()
- src.r_arm = W
- src.updateicon()
-
- else if(istype(W, /obj/item/bodypart/chest/robot))
- var/obj/item/bodypart/chest/robot/CH = W
- if(src.chest)
- return
- if(CH.wired && CH.cell)
- if(!user.transferItemToLoc(CH, src))
- return
- CH.icon_state = initial(CH.icon_state) //in case it is a dismembered robotic limb
- CH.cut_overlays()
- src.chest = CH
- src.updateicon()
- else if(!CH.wired)
- to_chat(user, "You need to attach wires to it first!")
- else
- to_chat(user, "You need to attach a cell to it first!")
-
- else if(istype(W, /obj/item/bodypart/head/robot))
- var/obj/item/bodypart/head/robot/HD = W
- for(var/X in HD.contents)
- if(istype(X, /obj/item/organ))
- to_chat(user, "There are organs inside [HD]!")
- return
- if(src.head)
- return
- if(HD.flash2 && HD.flash1)
- if(!user.transferItemToLoc(HD, src))
- return
- HD.icon_state = initial(HD.icon_state)//in case it is a dismembered robotic limb
- HD.cut_overlays()
- src.head = HD
- src.updateicon()
- else
- to_chat(user, "You need to attach a flash to it first!")
-
- else if (istype(W, /obj/item/multitool))
- if(check_completion())
- Interact(user)
- else
- to_chat(user, "The endoskeleton must be assembled before debugging can begin!")
-
- else if(istype(W, /obj/item/mmi))
- var/obj/item/mmi/M = W
- if(check_completion())
- if(!chest.cell)
- to_chat(user, "The endoskeleton still needs a power cell!")
- return
- if(!isturf(loc))
- to_chat(user, "You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!")
- return
- if(!M.brainmob)
- to_chat(user, "Sticking an empty [M.name] into the frame would sort of defeat the purpose!")
- return
-
- var/mob/living/brain/BM = M.brainmob
- if(!BM.key || !BM.mind)
- to_chat(user, "The MMI indicates that their mind is completely unresponsive; there's no point!")
- return
-
- if(!BM.client) //braindead
- to_chat(user, "The MMI indicates that their mind is currently inactive; it might change!")
- return
-
- if(BM.stat == DEAD || (M.brain && M.brain.organ_flags & ORGAN_FAILING))
- to_chat(user, "Sticking a dead brain into the frame would sort of defeat the purpose!")
- return
-
- if(jobban_isbanned(BM, "Cyborg") || QDELETED(src) || QDELETED(BM) || QDELETED(user) || QDELETED(M) || !Adjacent(user))
- if(!QDELETED(M))
- to_chat(user, "This [M.name] does not seem to fit!")
- return
-
- if(!user.temporarilyRemoveItemFromInventory(W))
- return
-
- var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
- if(!O)
- return
-
- if(M.laws && M.laws.id != DEFAULT_AI_LAWID)
- aisync = 0
- lawsync = 0
- O.laws = M.laws
- M.laws.associate(O)
-
- O.invisibility = 0
- //Transfer debug settings to new mob
- O.custom_name = created_name
- O.locked = panel_locked
- if(!aisync)
- lawsync = 0
- O.set_connected_ai(null)
- else
- O.notify_ai(NEW_BORG)
- if(forced_ai)
- O.set_connected_ai(forced_ai)
- if(!lawsync)
- O.lawupdate = 0
- if(M.laws.id == DEFAULT_AI_LAWID)
- O.make_laws()
-
- SSticker.mode.remove_antag_for_borging(BM.mind)
- if(!istype(M.laws, /datum/ai_laws/ratvar))
- remove_servant_of_ratvar(BM, TRUE)
- BM.mind.transfer_to(O)
-
- if(O.mind && O.mind.special_role)
- O.mind.store_memory("As a cyborg, you must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.")
- to_chat(O, "You have been robotized!")
- to_chat(O, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.")
-
- O.job = "Cyborg"
-
- O.cell = chest.cell
- chest.cell.forceMove(O)
- chest.cell = null
- W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
- if(O.mmi) //we delete the mmi created by robot/New()
- qdel(O.mmi)
- O.mmi = W //and give the real mmi to the borg.
- O.updatename()
- SSblackbox.record_feedback("amount", "cyborg_birth", 1)
- forceMove(O)
- O.robot_suit = src
-
- if(!locomotion)
- O.lockcharge = 1
- O.update_canmove()
- to_chat(O, "Error: Servo motors unresponsive.")
-
- else
- to_chat(user, "The MMI must go in after everything else!")
-
- else if(istype(W, /obj/item/borg/upgrade/ai))
- var/obj/item/borg/upgrade/ai/M = W
- if(check_completion())
- if(!isturf(loc))
- to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!")
- return
- if(!user.temporarilyRemoveItemFromInventory(M))
- to_chat(user, "[M] is stuck to your hand!")
- return
- qdel(M)
- var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/shell(get_turf(src))
-
- if(!aisync)
- lawsync = FALSE
- O.set_connected_ai(null)
- else
- if(forced_ai)
- O.set_connected_ai(forced_ai)
- O.notify_ai(AI_SHELL)
- if(!lawsync)
- O.lawupdate = FALSE
- O.make_laws()
-
-
- O.cell = chest.cell
- chest.cell.forceMove(O)
- chest.cell = null
- O.locked = panel_locked
- O.job = "Cyborg"
- forceMove(O)
- O.robot_suit = src
- if(!locomotion)
- O.lockcharge = TRUE
- O.update_canmove()
-
- else if(istype(W, /obj/item/pen))
- to_chat(user, "You need to use a multitool to name [src]!")
- else
- return ..()
-
-/obj/item/robot_suit/proc/Interact(mob/user)
- var/t1 = "Designation: [(created_name ? "[created_name]" : "Default Cyborg")]
\n"
- t1 += "Master AI: [(forced_ai ? "[forced_ai.name]" : "Automatic")]
\n"
-
- t1 += "LawSync Port: [(lawsync ? "Open" : "Closed")]
\n"
- t1 += "AI Connection Port: [(aisync ? "Open" : "Closed")]
\n"
- t1 += "Servo Motor Functions: [(locomotion ? "Unlocked" : "Locked")]
\n"
- t1 += "Panel Lock: [(panel_locked ? "Engaged" : "Disengaged")]
\n"
- var/datum/browser/popup = new(user, "robotdebug", "Cyborg Boot Debug", 310, 220)
- popup.set_content(t1)
- popup.open()
-
-/obj/item/robot_suit/Topic(href, href_list)
- if(usr.incapacitated() || !Adjacent(usr))
- return
-
- var/mob/living/living_user = usr
- var/obj/item/item_in_hand = living_user.get_active_held_item()
- if(!istype(item_in_hand, /obj/item/multitool))
- to_chat(living_user, "You need a multitool!")
- return
-
- if(href_list["Name"])
- var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name), TRUE)
- if(!in_range(src, usr) && src.loc != usr)
- return
- if(new_name)
- created_name = new_name
- else
- created_name = ""
-
- else if(href_list["Master"])
- forced_ai = select_active_ai(usr)
- if(!forced_ai)
- to_chat(usr, "No active AIs detected.")
-
- else if(href_list["Law"])
- lawsync = !lawsync
- else if(href_list["AI"])
- aisync = !aisync
- else if(href_list["Loco"])
- locomotion = !locomotion
- else if(href_list["Panel"])
- panel_locked = !panel_locked
-
- add_fingerprint(usr)
- Interact(usr)
+
+
+//The robot bodyparts have been moved to code/module/surgery/bodyparts/robot_bodyparts.dm
+
+
+/obj/item/robot_suit
+ name = "cyborg endoskeleton"
+ desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors."
+ icon = 'icons/mob/augmentation/augments.dmi'
+ icon_state = "robo_suit"
+ var/obj/item/bodypart/l_arm/robot/l_arm = null
+ var/obj/item/bodypart/r_arm/robot/r_arm = null
+ var/obj/item/bodypart/l_leg/robot/l_leg = null
+ var/obj/item/bodypart/r_leg/robot/r_leg = null
+ var/obj/item/bodypart/chest/robot/chest = null
+ var/obj/item/bodypart/head/robot/head = null
+
+ var/created_name = ""
+ var/mob/living/silicon/ai/forced_ai
+ var/locomotion = 1
+ var/lawsync = 1
+ var/aisync = 1
+ var/panel_locked = TRUE
+
+/obj/item/robot_suit/New()
+ ..()
+ update_icon()
+
+/obj/item/robot_suit/prebuilt/New()
+ l_arm = new(src)
+ r_arm = new(src)
+ l_leg = new(src)
+ r_leg = new(src)
+ head = new(src)
+ head.flash1 = new(head)
+ head.flash2 = new(head)
+ chest = new(src)
+ chest.wired = TRUE
+ chest.cell = new /obj/item/stock_parts/cell/high/plus(chest)
+ ..()
+
+/obj/item/robot_suit/update_icon()
+ cut_overlays()
+ if(l_arm)
+ add_overlay("[l_arm.icon_state]+o")
+ if(r_arm)
+ add_overlay("[r_arm.icon_state]+o")
+ if(chest)
+ add_overlay("[chest.icon_state]+o")
+ if(l_leg)
+ add_overlay("[l_leg.icon_state]+o")
+ if(r_leg)
+ add_overlay("[r_leg.icon_state]+o")
+ if(head)
+ add_overlay("[head.icon_state]+o")
+
+/obj/item/robot_suit/proc/check_completion()
+ if(src.l_arm && src.r_arm)
+ if(src.l_leg && src.r_leg)
+ if(src.chest && src.head)
+ SSblackbox.record_feedback("amount", "cyborg_frames_built", 1)
+ return 1
+ return 0
+
+/obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet
+ var/turf/T = get_turf(src)
+ if(l_leg || r_leg || chest || l_arm || r_arm || head)
+ if(I.use_tool(src, user, 5, volume=50))
+ if(l_leg)
+ l_leg.forceMove(T)
+ l_leg = null
+ if(r_leg)
+ r_leg.forceMove(T)
+ r_leg = null
+ if(chest)
+ if (chest.cell) //Sanity check.
+ chest.cell.forceMove(T)
+ chest.cell = null
+ chest.forceMove(T)
+ new /obj/item/stack/cable_coil(T, 1)
+ chest.wired = FALSE
+ chest = null
+ if(l_arm)
+ l_arm.forceMove(T)
+ l_arm = null
+ if(r_arm)
+ r_arm.forceMove(T)
+ r_arm = null
+ if(head)
+ head.forceMove(T)
+ head.flash1.forceMove(T)
+ head.flash1 = null
+ head.flash2.forceMove(T)
+ head.flash2 = null
+ head = null
+ to_chat(user, "You disassemble the cyborg shell.")
+ else
+ to_chat(user, "There is nothing to remove from the endoskeleton.")
+ update_icon()
+
+/obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc
+ if(!user.put_in_hands(I))
+ I.forceMove(drop_location())
+ return FALSE
+ return TRUE
+
+/obj/item/robot_suit/screwdriver_act(mob/living/user, obj/item/I) //Swaps the power cell if you're holding a new one in your other hand.
+ . = ..()
+ if(.)
+ return TRUE
+
+ if(!chest) //can't remove a cell if there's no chest to remove it from.
+ to_chat(user, "[src] has no attached torso.")
+ return
+
+ var/obj/item/stock_parts/cell/temp_cell = user.is_holding_item_of_type(/obj/item/stock_parts/cell)
+ var/swap_failed
+ if(!temp_cell) //if we're not holding a cell
+ swap_failed = TRUE
+ else if(!user.transferItemToLoc(temp_cell, chest))
+ swap_failed = TRUE
+ to_chat(user, "[temp_cell] is stuck to your hand, you can't put it in [src]!")
+
+ if(chest.cell) //drop the chest's current cell no matter what.
+ put_in_hand_or_drop(user, chest.cell)
+
+ if(swap_failed) //we didn't transfer any new items.
+ if(chest.cell) //old cell ejected, nothing inserted.
+ to_chat(user, "You remove [chest.cell] from [src].")
+ chest.cell = null
+ else
+ to_chat(user, "The power cell slot in [src]'s torso is empty.")
+ return
+
+ to_chat(user, "You [chest.cell ? "replace [src]'s [chest.cell.name] with [temp_cell]" : "insert [temp_cell] into [src]"].")
+ chest.cell = temp_cell
+ return TRUE
+
+/obj/item/robot_suit/attackby(obj/item/W, mob/user, params)
+
+ if(istype(W, /obj/item/stack/sheet/metal))
+ var/obj/item/stack/sheet/metal/M = W
+ if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
+ if (M.use(1))
+ var/obj/item/bot_assembly/ed209/B = new
+ B.forceMove(drop_location())
+ to_chat(user, "You arm the robot frame.")
+ var/holding_this = user.get_inactive_held_item()==src
+ qdel(src)
+ if (holding_this)
+ user.put_in_inactive_hand(B)
+ else
+ to_chat(user, "You need one sheet of metal to start building ED-209!")
+ return
+ else if(istype(W, /obj/item/bodypart/l_leg/robot))
+ if(src.l_leg)
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ W.icon_state = initial(W.icon_state)
+ W.cut_overlays()
+ src.l_leg = W
+ update_icon()
+
+ else if(istype(W, /obj/item/bodypart/r_leg/robot))
+ if(src.r_leg)
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ W.icon_state = initial(W.icon_state)
+ W.cut_overlays()
+ src.r_leg = W
+ update_icon()
+
+ else if(istype(W, /obj/item/bodypart/l_arm/robot))
+ if(src.l_arm)
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ W.icon_state = initial(W.icon_state)
+ W.cut_overlays()
+ src.l_arm = W
+ update_icon()
+
+ else if(istype(W, /obj/item/bodypart/r_arm/robot))
+ if(src.r_arm)
+ return
+ if(!user.transferItemToLoc(W, src))
+ return
+ W.icon_state = initial(W.icon_state)//in case it is a dismembered robotic limb
+ W.cut_overlays()
+ src.r_arm = W
+ update_icon()
+
+ else if(istype(W, /obj/item/bodypart/chest/robot))
+ var/obj/item/bodypart/chest/robot/CH = W
+ if(src.chest)
+ return
+ if(CH.wired && CH.cell)
+ if(!user.transferItemToLoc(CH, src))
+ return
+ CH.icon_state = initial(CH.icon_state) //in case it is a dismembered robotic limb
+ CH.cut_overlays()
+ src.chest = CH
+ update_icon()
+ else if(!CH.wired)
+ to_chat(user, "You need to attach wires to it first!")
+ else
+ to_chat(user, "You need to attach a cell to it first!")
+
+ else if(istype(W, /obj/item/bodypart/head/robot))
+ var/obj/item/bodypart/head/robot/HD = W
+ for(var/X in HD.contents)
+ if(istype(X, /obj/item/organ))
+ to_chat(user, "There are organs inside [HD]!")
+ return
+ if(src.head)
+ return
+ if(HD.flash2 && HD.flash1)
+ if(!user.transferItemToLoc(HD, src))
+ return
+ HD.icon_state = initial(HD.icon_state)//in case it is a dismembered robotic limb
+ HD.cut_overlays()
+ src.head = HD
+ update_icon()
+ else
+ to_chat(user, "You need to attach a flash to it first!")
+
+ else if (istype(W, /obj/item/multitool))
+ if(check_completion())
+ Interact(user)
+ else
+ to_chat(user, "The endoskeleton must be assembled before debugging can begin!")
+
+ else if(istype(W, /obj/item/mmi))
+ var/obj/item/mmi/M = W
+ if(check_completion())
+ if(!chest.cell)
+ to_chat(user, "The endoskeleton still needs a power cell!")
+ return
+ if(!isturf(loc))
+ to_chat(user, "You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!")
+ return
+ if(!M.brainmob)
+ to_chat(user, "Sticking an empty [M.name] into the frame would sort of defeat the purpose!")
+ return
+
+ var/mob/living/brain/BM = M.brainmob
+ if(!BM.key || !BM.mind)
+ to_chat(user, "The MMI indicates that their mind is completely unresponsive; there's no point!")
+ return
+
+ if(!BM.client) //braindead
+ to_chat(user, "The MMI indicates that their mind is currently inactive; it might change!")
+ return
+
+ if(BM.stat == DEAD || (M.brain && M.brain.organ_flags & ORGAN_FAILING))
+ to_chat(user, "Sticking a dead brain into the frame would sort of defeat the purpose!")
+ return
+
+ if(jobban_isbanned(BM, "Cyborg") || QDELETED(src) || QDELETED(BM) || QDELETED(user) || QDELETED(M) || !Adjacent(user))
+ if(!QDELETED(M))
+ to_chat(user, "This [M.name] does not seem to fit!")
+ return
+
+ if(!user.temporarilyRemoveItemFromInventory(W))
+ return
+
+ var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
+ if(!O)
+ return
+
+ if(M.laws && M.laws.id != DEFAULT_AI_LAWID)
+ aisync = 0
+ lawsync = 0
+ O.laws = M.laws
+ M.laws.associate(O)
+
+ O.invisibility = 0
+ //Transfer debug settings to new mob
+ O.custom_name = created_name
+ O.locked = panel_locked
+ if(!aisync)
+ lawsync = 0
+ O.set_connected_ai(null)
+ else
+ O.notify_ai(NEW_BORG)
+ if(forced_ai)
+ O.set_connected_ai(forced_ai)
+ if(!lawsync)
+ O.lawupdate = 0
+ if(M.laws.id == DEFAULT_AI_LAWID)
+ O.make_laws()
+
+ SSticker.mode.remove_antag_for_borging(BM.mind)
+ if(!istype(M.laws, /datum/ai_laws/ratvar))
+ remove_servant_of_ratvar(BM, TRUE)
+ BM.mind.transfer_to(O)
+
+ if(O.mind && O.mind.special_role)
+ O.mind.store_memory("As a cyborg, you must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.")
+ to_chat(O, "You have been robotized!")
+ to_chat(O, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.")
+
+ O.job = "Cyborg"
+
+ O.cell = chest.cell
+ chest.cell.forceMove(O)
+ chest.cell = null
+ W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
+ if(O.mmi) //we delete the mmi created by robot/New()
+ qdel(O.mmi)
+ O.mmi = W //and give the real mmi to the borg.
+ O.updatename()
+ SSblackbox.record_feedback("amount", "cyborg_birth", 1)
+ forceMove(O)
+ O.robot_suit = src
+
+ if(!locomotion)
+ O.lockcharge = 1
+ O.update_canmove()
+ to_chat(O, "Error: Servo motors unresponsive.")
+
+ else
+ to_chat(user, "The MMI must go in after everything else!")
+
+ else if(istype(W, /obj/item/borg/upgrade/ai))
+ var/obj/item/borg/upgrade/ai/M = W
+ if(check_completion())
+ if(!isturf(loc))
+ to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!")
+ return
+ if(!user.temporarilyRemoveItemFromInventory(M))
+ to_chat(user, "[M] is stuck to your hand!")
+ return
+ qdel(M)
+ var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/shell(get_turf(src))
+
+ if(!aisync)
+ lawsync = FALSE
+ O.set_connected_ai(null)
+ else
+ if(forced_ai)
+ O.set_connected_ai(forced_ai)
+ O.notify_ai(AI_SHELL)
+ if(!lawsync)
+ O.lawupdate = FALSE
+ O.make_laws()
+
+
+ O.cell = chest.cell
+ chest.cell.forceMove(O)
+ chest.cell = null
+ O.locked = panel_locked
+ O.job = "Cyborg"
+ forceMove(O)
+ O.robot_suit = src
+ if(!locomotion)
+ O.lockcharge = TRUE
+ O.update_canmove()
+
+ else if(istype(W, /obj/item/pen))
+ to_chat(user, "You need to use a multitool to name [src]!")
+ else
+ return ..()
+
+/obj/item/robot_suit/proc/Interact(mob/user)
+ var/t1 = "Designation: [(created_name ? "[created_name]" : "Default Cyborg")]
\n"
+ t1 += "Master AI: [(forced_ai ? "[forced_ai.name]" : "Automatic")]
\n"
+
+ t1 += "LawSync Port: [(lawsync ? "Open" : "Closed")]
\n"
+ t1 += "AI Connection Port: [(aisync ? "Open" : "Closed")]
\n"
+ t1 += "Servo Motor Functions: [(locomotion ? "Unlocked" : "Locked")]
\n"
+ t1 += "Panel Lock: [(panel_locked ? "Engaged" : "Disengaged")]
\n"
+ var/datum/browser/popup = new(user, "robotdebug", "Cyborg Boot Debug", 310, 220)
+ popup.set_content(t1)
+ popup.open()
+
+/obj/item/robot_suit/Topic(href, href_list)
+ if(usr.incapacitated() || !Adjacent(usr))
+ return
+
+ var/mob/living/living_user = usr
+ var/obj/item/item_in_hand = living_user.get_active_held_item()
+ if(!istype(item_in_hand, /obj/item/multitool))
+ to_chat(living_user, "You need a multitool!")
+ return
+
+ if(href_list["Name"])
+ var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name), TRUE)
+ if(!in_range(src, usr) && src.loc != usr)
+ return
+ if(new_name)
+ created_name = new_name
+ else
+ created_name = ""
+
+ else if(href_list["Master"])
+ forced_ai = select_active_ai(usr)
+ if(!forced_ai)
+ to_chat(usr, "No active AIs detected.")
+
+ else if(href_list["Law"])
+ lawsync = !lawsync
+ else if(href_list["AI"])
+ aisync = !aisync
+ else if(href_list["Loco"])
+ locomotion = !locomotion
+ else if(href_list["Panel"])
+ panel_locked = !panel_locked
+
+ add_fingerprint(usr)
+ Interact(usr)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 656bbc51..282311b5 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -1,255 +1,252 @@
-
-/obj
- var/crit_fail = FALSE
- animate_movement = 2
- speech_span = SPAN_ROBOT
- var/obj_flags = CAN_BE_HIT
- var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT.
-
- var/damtype = BRUTE
- var/force = 0
-
- var/datum/armor/armor
- var/obj_integrity //defaults to max_integrity
- var/max_integrity = 500
- var/integrity_failure = 0 //0 if we have no special broken behavior
-
- var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
-
- var/acid_level = 0 //how much acid is on that obj
-
- var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
- var/current_skin //the item reskin
- var/list/unique_reskin //List of options to reskin.
- var/always_reskinnable = FALSE
-
- // Access levels, used in modules\jobs\access.dm
- var/list/req_access
- var/req_access_txt = "0"
- var/list/req_one_access
- var/req_one_access_txt = "0"
-
- var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object
-
- vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace.
-
-/obj/vv_edit_var(vname, vval)
- switch(vname)
- if("anchored")
- setAnchored(vval)
- return TRUE
- if("obj_flags")
- if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION))
- return FALSE
- if("control_object")
- var/obj/O = vval
- if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION))
- return FALSE
- return ..()
-
-/obj/Initialize()
- . = ..()
- if (islist(armor))
- armor = getArmor(arglist(armor))
- else if (!armor)
- armor = getArmor()
- else if (!istype(armor, /datum/armor))
- stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()")
-
- if(obj_integrity == null)
- obj_integrity = max_integrity
- if (set_obj_flags)
- var/flagslist = splittext(set_obj_flags,";")
- var/list/string_to_objflag = GLOB.bitfields["obj_flags"]
- for (var/flag in flagslist)
- if(flag[1] == "!")
- flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial !
- obj_flags &= ~string_to_objflag[flag]
- else
- obj_flags |= string_to_objflag[flag]
- if((obj_flags & ON_BLUEPRINTS) && isturf(loc))
- var/turf/T = loc
- T.add_blueprints_preround(src)
-
-
-/obj/Destroy(force=FALSE)
- if(!ismachinery(src))
- STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists
- SStgui.close_uis(src)
- . = ..()
-
-/obj/proc/setAnchored(anchorvalue)
- SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue)
- anchored = anchorvalue
-
-/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
- . = ..()
- if(obj_flags & FROZEN)
- visible_message("[src] shatters into a million pieces!")
- qdel(src)
-
-
-/obj/assume_air(datum/gas_mixture/giver)
- if(loc)
- return loc.assume_air(giver)
- else
- return null
-
-/obj/remove_air(amount)
- if(loc)
- return loc.remove_air(amount)
- else
- return null
-
-/obj/return_air()
- if(loc)
- return loc.return_air()
- else
- return null
-
-/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request)
- //Return: (NONSTANDARD)
- // null if object handles breathing logic for lifeform
- // datum/air_group to tell lifeform to process using that breath return
- //DEFAULT: Take air from turf to give to have mob process
-
- if(breath_request>0)
- var/datum/gas_mixture/environment = return_air()
- var/breath_percentage = BREATH_VOLUME / environment.return_volume()
- return remove_air(environment.total_moles() * breath_percentage)
- else
- return null
-
-/obj/proc/updateUsrDialog()
- if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI))
- var/is_in_use = FALSE
- var/list/nearby = viewers(1, src)
- for(var/mob/M in nearby)
- if ((M.client && M.machine == src))
- is_in_use = TRUE
- ui_interact(M)
- if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr))
- if (!(usr in nearby))
- if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
- is_in_use = TRUE
- ui_interact(usr)
-
- // check for TK users
-
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- if(!(usr in nearby))
- if(usr.client && usr.machine==src)
- if(H.dna.check_mutation(TK))
- is_in_use = TRUE
- ui_interact(usr)
- if (is_in_use)
- obj_flags |= IN_USE
- else
- obj_flags &= ~IN_USE
-
-/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE)
- // Check that people are actually using the machine. If not, don't update anymore.
- if(obj_flags & IN_USE)
- var/is_in_use = FALSE
- if(update_viewers)
- for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
- is_in_use = TRUE
- src.interact(M)
- var/ai_in_use = FALSE
- if(update_ais)
- ai_in_use = AutoUpdateAI(src)
-
- if(update_viewers && update_ais) //State change is sure only if we check both
- if(!ai_in_use && !is_in_use)
- obj_flags &= ~IN_USE
-
-
-/obj/attack_ghost(mob/user)
- . = ..()
- if(.)
- return
- ui_interact(user)
-
-/obj/proc/container_resist(mob/living/user)
- return
-
-/obj/proc/update_icon()
- return
-
-/mob/proc/unset_machine()
- if(machine)
- machine.on_unset_machine(src)
- machine = null
-
-//called when the user unsets the machine.
-/atom/movable/proc/on_unset_machine(mob/user)
- return
-
-/mob/proc/set_machine(obj/O)
- if(src.machine)
- unset_machine()
- src.machine = O
- if(istype(O))
- O.obj_flags |= IN_USE
-
-/obj/item/proc/updateSelfDialog()
- var/mob/M = src.loc
- if(istype(M) && M.client && M.machine == src)
- src.attack_self(M)
-
-/obj/proc/hide(h)
- return
-
-/obj/singularity_pull(S, current_size)
- ..()
- if(!anchored || current_size >= STAGE_FIVE)
- step_towards(src,S)
-
-/obj/get_dumping_location(datum/component/storage/source,mob/user)
- return get_turf(src)
-
-/obj/proc/CanAStarPass()
- . = !density
-
-/obj/proc/check_uplink_validity()
- return 1
-
-/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc)
- return
-
-/obj/vv_get_dropdown()
- . = ..()
- .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]"
- .["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]"
- .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]"
-
-/obj/examine(mob/user)
- . = ..()
- if(obj_flags & UNIQUE_RENAME)
- . += "Use a pen on it to rename it or change its description."
- if(unique_reskin && (!current_skin || always_reskinnable))
- . += "Alt-click it to reskin it."
-
-/obj/AltClick(mob/user)
- . = ..()
- if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
- reskin_obj(user)
- return TRUE
-
-/obj/proc/reskin_obj(mob/M)
- if(!LAZYLEN(unique_reskin))
- return
- var/dat = "Reskin options for [name]:\n"
- for(var/V in unique_reskin)
- var/output = icon2html(src, M, unique_reskin[V])
- dat += "[V]: [output]\n"
- to_chat(M, dat)
-
- var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin
- if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin)
- return
- current_skin = choice
- icon_state = unique_reskin[choice]
- to_chat(M, "[src] is now skinned as '[choice]'.")
+
+/obj
+ var/crit_fail = FALSE
+ animate_movement = 2
+ speech_span = SPAN_ROBOT
+ var/obj_flags = CAN_BE_HIT
+ var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT.
+
+ var/damtype = BRUTE
+ var/force = 0
+
+ var/datum/armor/armor
+ var/obj_integrity //defaults to max_integrity
+ var/max_integrity = 500
+ var/integrity_failure = 0 //0 if we have no special broken behavior
+
+ var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
+
+ var/acid_level = 0 //how much acid is on that obj
+
+ var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
+ var/current_skin //the item reskin
+ var/list/unique_reskin //List of options to reskin.
+ var/always_reskinnable = FALSE
+
+ // Access levels, used in modules\jobs\access.dm
+ var/list/req_access
+ var/req_access_txt = "0"
+ var/list/req_one_access
+ var/req_one_access_txt = "0"
+
+ var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object
+
+ vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace.
+
+/obj/vv_edit_var(vname, vval)
+ switch(vname)
+ if("anchored")
+ setAnchored(vval)
+ return TRUE
+ if("obj_flags")
+ if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION))
+ return FALSE
+ if("control_object")
+ var/obj/O = vval
+ if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION))
+ return FALSE
+ return ..()
+
+/obj/Initialize()
+ . = ..()
+ if (islist(armor))
+ armor = getArmor(arglist(armor))
+ else if (!armor)
+ armor = getArmor()
+ else if (!istype(armor, /datum/armor))
+ stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()")
+
+ if(obj_integrity == null)
+ obj_integrity = max_integrity
+ if (set_obj_flags)
+ var/flagslist = splittext(set_obj_flags,";")
+ var/list/string_to_objflag = GLOB.bitfields["obj_flags"]
+ for (var/flag in flagslist)
+ if(flag[1] == "!")
+ flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial !
+ obj_flags &= ~string_to_objflag[flag]
+ else
+ obj_flags |= string_to_objflag[flag]
+ if((obj_flags & ON_BLUEPRINTS) && isturf(loc))
+ var/turf/T = loc
+ T.add_blueprints_preround(src)
+
+
+/obj/Destroy(force=FALSE)
+ if(!ismachinery(src))
+ STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists
+ SStgui.close_uis(src)
+ . = ..()
+
+/obj/proc/setAnchored(anchorvalue)
+ SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue)
+ anchored = anchorvalue
+
+/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
+ . = ..()
+ if(obj_flags & FROZEN)
+ visible_message("[src] shatters into a million pieces!")
+ qdel(src)
+
+
+/obj/assume_air(datum/gas_mixture/giver)
+ if(loc)
+ return loc.assume_air(giver)
+ else
+ return null
+
+/obj/remove_air(amount)
+ if(loc)
+ return loc.remove_air(amount)
+ else
+ return null
+
+/obj/return_air()
+ if(loc)
+ return loc.return_air()
+ else
+ return null
+
+/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request)
+ //Return: (NONSTANDARD)
+ // null if object handles breathing logic for lifeform
+ // datum/air_group to tell lifeform to process using that breath return
+ //DEFAULT: Take air from turf to give to have mob process
+
+ if(breath_request>0)
+ var/datum/gas_mixture/environment = return_air()
+ var/breath_percentage = BREATH_VOLUME / environment.return_volume()
+ return remove_air(environment.total_moles() * breath_percentage)
+ else
+ return null
+
+/obj/proc/updateUsrDialog()
+ if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI))
+ var/is_in_use = FALSE
+ var/list/nearby = viewers(1, src)
+ for(var/mob/M in nearby)
+ if ((M.client && M.machine == src))
+ is_in_use = TRUE
+ ui_interact(M)
+ if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr))
+ if (!(usr in nearby))
+ if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
+ is_in_use = TRUE
+ ui_interact(usr)
+
+ // check for TK users
+
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ if(!(usr in nearby))
+ if(usr.client && usr.machine==src)
+ if(H.dna.check_mutation(TK))
+ is_in_use = TRUE
+ ui_interact(usr)
+ if (is_in_use)
+ obj_flags |= IN_USE
+ else
+ obj_flags &= ~IN_USE
+
+/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE)
+ // Check that people are actually using the machine. If not, don't update anymore.
+ if(obj_flags & IN_USE)
+ var/is_in_use = FALSE
+ if(update_viewers)
+ for(var/mob/M in viewers(1, src))
+ if ((M.client && M.machine == src))
+ is_in_use = TRUE
+ src.interact(M)
+ var/ai_in_use = FALSE
+ if(update_ais)
+ ai_in_use = AutoUpdateAI(src)
+
+ if(update_viewers && update_ais) //State change is sure only if we check both
+ if(!ai_in_use && !is_in_use)
+ obj_flags &= ~IN_USE
+
+
+/obj/attack_ghost(mob/user)
+ . = ..()
+ if(.)
+ return
+ ui_interact(user)
+
+/obj/proc/container_resist(mob/living/user)
+ return
+
+/mob/proc/unset_machine()
+ if(machine)
+ machine.on_unset_machine(src)
+ machine = null
+
+//called when the user unsets the machine.
+/atom/movable/proc/on_unset_machine(mob/user)
+ return
+
+/mob/proc/set_machine(obj/O)
+ if(src.machine)
+ unset_machine()
+ src.machine = O
+ if(istype(O))
+ O.obj_flags |= IN_USE
+
+/obj/item/proc/updateSelfDialog()
+ var/mob/M = src.loc
+ if(istype(M) && M.client && M.machine == src)
+ src.attack_self(M)
+
+/obj/proc/hide(h)
+ return
+
+/obj/singularity_pull(S, current_size)
+ ..()
+ if(!anchored || current_size >= STAGE_FIVE)
+ step_towards(src,S)
+
+/obj/get_dumping_location(datum/component/storage/source,mob/user)
+ return get_turf(src)
+
+/obj/proc/CanAStarPass()
+ . = !density
+
+/obj/proc/check_uplink_validity()
+ return 1
+
+/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc)
+ return
+
+/obj/vv_get_dropdown()
+ . = ..()
+ .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]"
+ .["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]"
+ .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]"
+
+/obj/examine(mob/user)
+ . = ..()
+ if(obj_flags & UNIQUE_RENAME)
+ . += "Use a pen on it to rename it or change its description."
+ if(unique_reskin && (!current_skin || always_reskinnable))
+ . += "Alt-click it to reskin it."
+
+/obj/AltClick(mob/user)
+ . = ..()
+ if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
+ reskin_obj(user)
+ return TRUE
+
+/obj/proc/reskin_obj(mob/M)
+ if(!LAZYLEN(unique_reskin))
+ return
+ var/dat = "Reskin options for [name]:\n"
+ for(var/V in unique_reskin)
+ var/output = icon2html(src, M, unique_reskin[V])
+ dat += "[V]: [output]\n"
+ to_chat(M, dat)
+
+ var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin
+ if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin)
+ return
+ current_skin = choice
+ icon_state = unique_reskin[choice]
+ to_chat(M, "[src] is now skinned as '[choice]'.")
diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm
index 91836b83..b9748560 100644
--- a/code/game/objects/structures/divine.dm
+++ b/code/game/objects/structures/divine.dm
@@ -40,11 +40,11 @@
last_process = world.time
to_chat(user, "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.")
user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,20)
- update_icons()
- addtimer(CALLBACK(src, .proc/update_icons), time_between_uses)
+ update_icon()
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), time_between_uses)
-/obj/structure/healingfountain/proc/update_icons()
+/obj/structure/healingfountain/update_icon()
if(last_process + time_between_uses > world.time)
icon_state = "fountain"
else
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 2b0d57be..41539529 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -103,9 +103,9 @@
/turf/open/floor/blob_act(obj/structure/blob/B)
return
-/turf/open/floor/proc/update_icon()
+/turf/open/floor/update_icon()
+ . = ..()
update_visuals()
- return 1
/turf/open/floor/attack_paw(mob/user)
return attack_hand(user)
diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm
index 39d2d9c5..f4f86e79 100644
--- a/code/game/turfs/simulated/wall/reinf_walls.dm
+++ b/code/game/turfs/simulated/wall/reinf_walls.dm
@@ -202,15 +202,20 @@
return 1
return 0
-/turf/closed/wall/r_wall/proc/update_icon()
+/turf/closed/wall/r_wall/update_icon()
+ . = ..()
if(d_state != INTACT)
smooth = SMOOTH_FALSE
clear_smooth_overlays()
- icon_state = "r_wall-[d_state]"
else
smooth = SMOOTH_TRUE
queue_smooth_neighbors(src)
queue_smooth(src)
+
+/turf/closed/wall/r_wall/update_icon_state()
+ if(d_state != INTACT)
+ icon_state = "r_wall-[d_state]"
+ else
icon_state = "r_wall"
/turf/closed/wall/r_wall/singularity_pull(S, current_size)
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index f0f0667c..db5fc8a1 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -103,10 +103,13 @@
for(var/atom/movable/AM in src)
throw_atom(AM)
-/turf/open/space/transit/proc/update_icon()
- icon_state = "speedspace_ns_[get_transit_state(src)]"
+/turf/open/space/transit/update_icon()
+ . = ..()
transform = turn(matrix(), get_transit_angle(src))
+/turf/open/space/transit/update_icon_state()
+ icon_state = "speedspace_ns_[get_transit_state(src)]"
+
/proc/get_transit_state(turf/T)
var/p = 9
. = 1
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index afe5aa3f..c9e0ca33 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -1,363 +1,363 @@
-#define CONFUSION_STACK_MAX_MULTIPLIER 2
-/obj/item/assembly/flash
- name = "flash"
- desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
- icon_state = "flash"
- item_state = "flashtool"
- lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- throwforce = 0
- w_class = WEIGHT_CLASS_TINY
- materials = list(MAT_METAL = 300, MAT_GLASS = 300)
- crit_fail = FALSE //Is the flash burnt out?
- light_color = LIGHT_COLOR_WHITE
- light_power = FLASH_LIGHT_POWER
- var/flashing_overlay = "flash-f"
- var/times_used = 0 //Number of times it's been used.
- var/burnout_resistance = 0
- var/last_used = 0 //last world.time it was used.
- var/cooldown = 0
- var/last_trigger = 0 //Last time it was successfully triggered.
-
-/obj/item/assembly/flash/suicide_act(mob/living/user)
- if (crit_fail)
- user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but its burnt out!")
- return SHAME
- else if (user.eye_blind)
- user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but [user.p_theyre()] blind!")
- return SHAME
- user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it! It looks like [user.p_theyre()] trying to commit suicide!")
- attack(user,user)
- return FIRELOSS
-
-/obj/item/assembly/flash/update_icon(flash = FALSE)
- cut_overlays()
- attached_overlays = list()
- if(crit_fail)
- add_overlay("flashburnt")
- attached_overlays += "flashburnt"
- if(flash)
- add_overlay(flashing_overlay)
- attached_overlays += flashing_overlay
- addtimer(CALLBACK(src, .proc/update_icon), 5)
- if(holder)
- holder.update_icon()
-
-/obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user)
- if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
- flash_carbon(user, user, 15, 0)
- return FALSE
- return TRUE
-
-/obj/item/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
- if(!crit_fail)
- crit_fail = TRUE
- update_icon()
- if(ismob(loc))
- var/mob/M = loc
- M.visible_message("[src] burns out!","[src] burns out!")
- else
- var/turf/T = get_turf(src)
- T.visible_message("[src] burns out!")
-
-/obj/item/assembly/flash/proc/flash_recharge(interval = 10)
- var/deciseconds_passed = world.time - last_used
- for(var/seconds = deciseconds_passed / 10, seconds >= interval, seconds -= interval) //get 1 charge every interval
- times_used--
- last_used = world.time
- times_used = max(0, times_used) //sanity
- if(max(0, prob(times_used * 3) - burnout_resistance)) //The more often it's used in a short span of time the more likely it will burn out
- burn_out()
- return FALSE
- return TRUE
-
-//BYPASS CHECKS ALSO PREVENTS BURNOUT!
-/obj/item/assembly/flash/proc/AOE_flash(bypass_checks = FALSE, range = 3, power = 5, targeted = FALSE, mob/user)
- if(!bypass_checks && !try_use_flash())
- return FALSE
- var/list/mob/targets = get_flash_targets(get_turf(src), range, FALSE)
- if(user)
- targets -= user
- for(var/mob/living/carbon/C in targets)
- flash_carbon(C, user, power, targeted, TRUE)
- return TRUE
-
-/obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE)
- if(!target_loc)
- target_loc = loc
- if(override_vision_checks)
- return get_hearers_in_view(range, get_turf(target_loc))
- if(isturf(target_loc) || (ismob(target_loc) && isturf(target_loc.loc)))
- return viewers(range, get_turf(target_loc))
- else
- return typecache_filter_list(target_loc.GetAllContents(), GLOB.typecache_living)
-
-/obj/item/assembly/flash/proc/try_use_flash(mob/user = null)
- if(crit_fail || (world.time < last_trigger + cooldown))
- return FALSE
- last_trigger = world.time
- playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
- flash_lighting_fx(FLASH_LIGHT_RANGE, light_power, light_color)
- times_used++
- flash_recharge()
- update_icon(TRUE)
- if(user && !clown_check(user))
- return FALSE
- return TRUE
-
-/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
- if(!istype(M))
- return
- if(user)
- log_combat(user, M, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src)
- else //caused by emp/remote signal
- M.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]",LOG_ATTACK)
- if(generic_message && M != user)
- to_chat(M, "[src] emits a blinding light!")
- if(targeted)
- if(M.flash_act(1, 1))
- if(M.confused < power)
- var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
- M.confused += min(power, diff)
- if(user)
- terrible_conversion_proc(M, user)
- visible_message("[user] blinds [M] with the flash!")
- to_chat(user, "You blind [M] with the flash!")
- to_chat(M, "[user] blinds you with the flash!")
- else
- to_chat(M, "You are blinded by [src]!")
- var/toblur = 20 - M.eye_blurry
- if(toblur > 0)
- M.blur_eyes(toblur)
- else if(user)
- visible_message("[user] fails to blind [M] with the flash!")
- to_chat(user, "You fail to blind [M] with the flash!")
- to_chat(M, "[user] fails to blind you with the flash!")
- else
- to_chat(M, "[src] fails to blind you!")
- else
- if(M.flash_act())
- var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
- M.confused += min(power, diff)
-
-/obj/item/assembly/flash/attack(mob/living/M, mob/user)
- if(!try_use_flash(user))
- return FALSE
- if(iscarbon(M))
- flash_carbon(M, user, 20, 1)
- return TRUE
- else if(issilicon(M))
- var/mob/living/silicon/robot/R = M
- log_combat(user, R, "flashed", src)
- update_icon(1)
- R.Knockdown(rand(80,120))
- var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
- R.confused += min(5, diff)
- R.flash_act(affect_silicon = 1)
- user.visible_message("[user] overloads [R]'s sensors with the flash!", "You overload [R]'s sensors with the flash!")
- return TRUE
-
- user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!")
-
-/obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
- if(holder)
- return FALSE
- if(!AOE_flash(FALSE, 3, 5, FALSE, user))
- return FALSE
- to_chat(user, "[src] emits a blinding light!")
-
-/obj/item/assembly/flash/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(!try_use_flash())
- return
- AOE_flash()
- burn_out()
-
-/obj/item/assembly/flash/activate()//AOE flash on signal received
- if(!..())
- return
- AOE_flash()
-
-/obj/item/assembly/flash/proc/terrible_conversion_proc(mob/living/carbon/human/H, mob/user)
- if(istype(H) && ishuman(user) && H.stat != DEAD)
- if(user.mind)
- var/datum/antagonist/rev/head/converter = user.mind.has_antag_datum(/datum/antagonist/rev/head)
- if(!converter)
- return
- if(!H.client)
- to_chat(user, "This mind is so vacant that it is not susceptible to influence!")
- return
- if(H.stat != CONSCIOUS)
- to_chat(user, "They must be conscious before you can convert [H.p_them()]!")
- return
- if(converter.add_revolutionary(H.mind))
- times_used -- //Flashes less likely to burn out for headrevs when used for conversion
- else
- to_chat(user, "This mind seems resistant to the flash!")
-
-
-/obj/item/assembly/flash/cyborg
-
-/obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user)
- ..()
- new /obj/effect/temp_visual/borgflash(get_turf(src))
-
-/obj/item/assembly/flash/cyborg/attack_self(mob/user)
- ..()
- new /obj/effect/temp_visual/borgflash(get_turf(src))
-
-/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, params)
- return
-/obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I)
- return
-
-/obj/item/assembly/flash/memorizer
- name = "memorizer"
- desc = "If you see this, you're not likely to remember it any time soon."
- icon = 'icons/obj/device.dmi'
- icon_state = "memorizer"
- item_state = "nullrod"
-
-/obj/item/assembly/flash/handheld //this is now the regular pocket flashes
-
-/obj/item/assembly/flash/armimplant
- name = "photon projector"
- desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out."
- var/flashcd = 20
- var/overheat = 0
- var/obj/item/organ/cyberimp/arm/flash/I = null
-
-/obj/item/assembly/flash/armimplant/burn_out()
- if(I && I.owner)
- to_chat(I.owner, "Your photon projector implant overheats and deactivates!")
- I.Retract()
- overheat = TRUE
- addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2)
-
-/obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null)
- if(overheat)
- if(I && I.owner)
- to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!")
- return FALSE
- overheat = TRUE
- addtimer(CALLBACK(src, .proc/cooldown), flashcd)
- playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
- update_icon(1)
- return TRUE
-
-
-/obj/item/assembly/flash/armimplant/proc/cooldown()
- overheat = FALSE
-
-/obj/item/assembly/flash/shield
- name = "strobe shield"
- desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "flashshield"
- item_state = "flashshield"
- lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
- slot_flags = ITEM_SLOT_BACK
- force = 10
- throwforce = 5
- throw_speed = 2
- throw_range = 3
- w_class = WEIGHT_CLASS_BULKY
- materials = list(MAT_GLASS=7500, MAT_METAL=1000)
- attack_verb = list("shoved", "bashed")
- block_chance = 50
- armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
-
-/obj/item/assembly/flash/shield/flash_recharge(interval=10)
- if(times_used >= 4)
- burn_out()
- return FALSE
- return TRUE
-
-/obj/item/assembly/flash/shield/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/assembly/flash/handheld))
- var/obj/item/assembly/flash/handheld/flash = W
- if(flash.crit_fail)
- to_chat(user, "No sense replacing it with a broken bulb.")
- return
- else
- to_chat(user, "You begin to replace the bulb.")
- if(do_after(user, 20, target = src))
- if(flash.crit_fail || !flash || QDELETED(flash))
- return
- crit_fail = FALSE
- times_used = 0
- playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
- update_icon()
- flash.crit_fail = TRUE
- flash.update_icon()
- return
- ..()
-
-/obj/item/assembly/flash/shield/update_icon(flash = FALSE)
- icon_state = "flashshield"
- item_state = "flashshield"
-
- if(crit_fail)
- icon_state = "riot"
- item_state = "riot"
- else if(flash)
- icon_state = "flashshield_flash"
- item_state = "flashshield_flash"
- addtimer(CALLBACK(src, .proc/update_icon), 5)
-
- if(holder)
- holder.update_icon()
-
-/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- activate()
- return ..()
-
-//ported from tg - check to make sure it can't appear where it's not supposed to.
-/obj/item/assembly/flash/hypnotic
- desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance."
- flashing_overlay = "flash-hypno" //I cannot find this icon no matter how hard I look in tg, so I might just make my own.
- light_color = LIGHT_COLOR_PINK
- cooldown = 20
-
-/obj/item/assembly/flash/hypnotic/burn_out()
- return
-
-/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
- if(!istype(M))
- return
- if(user)
- log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src)
- else //caused by emp/remote signal
- M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK)
- if(generic_message && M != user)
- to_chat(M, "[src] emits a soothing light...")
- if(targeted)
- if(M.flash_act(1, 1))
- var/hypnosis = FALSE
- if(M.hypnosis_vulnerable())
- hypnosis = TRUE
- if(user)
- user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!")
-
- if(!hypnosis)
- to_chat(M, "The light makes you feel oddly relaxed...")
- M.confused += min(M.confused + 10, 20)
- M.dizziness += min(M.dizziness + 10, 20)
- M.drowsyness += min(M.drowsyness + 10, 20)
- M.apply_status_effect(STATUS_EFFECT_PACIFY, 100)
- else
- M.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
-
- else if(user)
- user.visible_message("[user] fails to blind [M] with the flash!", "You fail to hypno-flash [M]!")
- else
- to_chat(M, "[src] fails to blind you!")
-
- else if(M.flash_act())
- to_chat(M, "Such a pretty light...")
- M.confused += min(M.confused + 4, 20)
- M.dizziness += min(M.dizziness + 4, 20)
- M.drowsyness += min(M.drowsyness + 4, 20)
+#define CONFUSION_STACK_MAX_MULTIPLIER 2
+/obj/item/assembly/flash
+ name = "flash"
+ desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
+ icon_state = "flash"
+ item_state = "flashtool"
+ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
+ throwforce = 0
+ w_class = WEIGHT_CLASS_TINY
+ materials = list(MAT_METAL = 300, MAT_GLASS = 300)
+ crit_fail = FALSE //Is the flash burnt out?
+ light_color = LIGHT_COLOR_WHITE
+ light_power = FLASH_LIGHT_POWER
+ var/flashing_overlay = "flash-f"
+ var/times_used = 0 //Number of times it's been used.
+ var/burnout_resistance = 0
+ var/last_used = 0 //last world.time it was used.
+ var/cooldown = 0
+ var/last_trigger = 0 //Last time it was successfully triggered.
+
+/obj/item/assembly/flash/suicide_act(mob/living/user)
+ if (crit_fail)
+ user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but its burnt out!")
+ return SHAME
+ else if (user.eye_blind)
+ user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but [user.p_theyre()] blind!")
+ return SHAME
+ user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it! It looks like [user.p_theyre()] trying to commit suicide!")
+ attack(user,user)
+ return FIRELOSS
+
+/obj/item/assembly/flash/update_icon(flash = FALSE)
+ cut_overlays()
+ attached_overlays = list()
+ if(crit_fail)
+ add_overlay("flashburnt")
+ attached_overlays += "flashburnt"
+ if(flash)
+ add_overlay(flashing_overlay)
+ attached_overlays += flashing_overlay
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
+ if(holder)
+ holder.update_icon()
+
+/obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user)
+ if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
+ flash_carbon(user, user, 15, 0)
+ return FALSE
+ return TRUE
+
+/obj/item/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
+ if(!crit_fail)
+ crit_fail = TRUE
+ update_icon()
+ if(ismob(loc))
+ var/mob/M = loc
+ M.visible_message("[src] burns out!","[src] burns out!")
+ else
+ var/turf/T = get_turf(src)
+ T.visible_message("[src] burns out!")
+
+/obj/item/assembly/flash/proc/flash_recharge(interval = 10)
+ var/deciseconds_passed = world.time - last_used
+ for(var/seconds = deciseconds_passed / 10, seconds >= interval, seconds -= interval) //get 1 charge every interval
+ times_used--
+ last_used = world.time
+ times_used = max(0, times_used) //sanity
+ if(max(0, prob(times_used * 3) - burnout_resistance)) //The more often it's used in a short span of time the more likely it will burn out
+ burn_out()
+ return FALSE
+ return TRUE
+
+//BYPASS CHECKS ALSO PREVENTS BURNOUT!
+/obj/item/assembly/flash/proc/AOE_flash(bypass_checks = FALSE, range = 3, power = 5, targeted = FALSE, mob/user)
+ if(!bypass_checks && !try_use_flash())
+ return FALSE
+ var/list/mob/targets = get_flash_targets(get_turf(src), range, FALSE)
+ if(user)
+ targets -= user
+ for(var/mob/living/carbon/C in targets)
+ flash_carbon(C, user, power, targeted, TRUE)
+ return TRUE
+
+/obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE)
+ if(!target_loc)
+ target_loc = loc
+ if(override_vision_checks)
+ return get_hearers_in_view(range, get_turf(target_loc))
+ if(isturf(target_loc) || (ismob(target_loc) && isturf(target_loc.loc)))
+ return viewers(range, get_turf(target_loc))
+ else
+ return typecache_filter_list(target_loc.GetAllContents(), GLOB.typecache_living)
+
+/obj/item/assembly/flash/proc/try_use_flash(mob/user = null)
+ if(crit_fail || (world.time < last_trigger + cooldown))
+ return FALSE
+ last_trigger = world.time
+ playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
+ flash_lighting_fx(FLASH_LIGHT_RANGE, light_power, light_color)
+ times_used++
+ flash_recharge()
+ update_icon(TRUE)
+ if(user && !clown_check(user))
+ return FALSE
+ return TRUE
+
+/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
+ if(!istype(M))
+ return
+ if(user)
+ log_combat(user, M, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src)
+ else //caused by emp/remote signal
+ M.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]",LOG_ATTACK)
+ if(generic_message && M != user)
+ to_chat(M, "[src] emits a blinding light!")
+ if(targeted)
+ if(M.flash_act(1, 1))
+ if(M.confused < power)
+ var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
+ M.confused += min(power, diff)
+ if(user)
+ terrible_conversion_proc(M, user)
+ visible_message("[user] blinds [M] with the flash!")
+ to_chat(user, "You blind [M] with the flash!")
+ to_chat(M, "[user] blinds you with the flash!")
+ else
+ to_chat(M, "You are blinded by [src]!")
+ var/toblur = 20 - M.eye_blurry
+ if(toblur > 0)
+ M.blur_eyes(toblur)
+ else if(user)
+ visible_message("[user] fails to blind [M] with the flash!")
+ to_chat(user, "You fail to blind [M] with the flash!")
+ to_chat(M, "[user] fails to blind you with the flash!")
+ else
+ to_chat(M, "[src] fails to blind you!")
+ else
+ if(M.flash_act())
+ var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
+ M.confused += min(power, diff)
+
+/obj/item/assembly/flash/attack(mob/living/M, mob/user)
+ if(!try_use_flash(user))
+ return FALSE
+ if(iscarbon(M))
+ flash_carbon(M, user, 20, 1)
+ return TRUE
+ else if(issilicon(M))
+ var/mob/living/silicon/robot/R = M
+ log_combat(user, R, "flashed", src)
+ update_icon(1)
+ R.Knockdown(rand(80,120))
+ var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
+ R.confused += min(5, diff)
+ R.flash_act(affect_silicon = 1)
+ user.visible_message("[user] overloads [R]'s sensors with the flash!", "You overload [R]'s sensors with the flash!")
+ return TRUE
+
+ user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!")
+
+/obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
+ if(holder)
+ return FALSE
+ if(!AOE_flash(FALSE, 3, 5, FALSE, user))
+ return FALSE
+ to_chat(user, "[src] emits a blinding light!")
+
+/obj/item/assembly/flash/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ if(!try_use_flash())
+ return
+ AOE_flash()
+ burn_out()
+
+/obj/item/assembly/flash/activate()//AOE flash on signal received
+ if(!..())
+ return
+ AOE_flash()
+
+/obj/item/assembly/flash/proc/terrible_conversion_proc(mob/living/carbon/human/H, mob/user)
+ if(istype(H) && ishuman(user) && H.stat != DEAD)
+ if(user.mind)
+ var/datum/antagonist/rev/head/converter = user.mind.has_antag_datum(/datum/antagonist/rev/head)
+ if(!converter)
+ return
+ if(!H.client)
+ to_chat(user, "This mind is so vacant that it is not susceptible to influence!")
+ return
+ if(H.stat != CONSCIOUS)
+ to_chat(user, "They must be conscious before you can convert [H.p_them()]!")
+ return
+ if(converter.add_revolutionary(H.mind))
+ times_used -- //Flashes less likely to burn out for headrevs when used for conversion
+ else
+ to_chat(user, "This mind seems resistant to the flash!")
+
+
+/obj/item/assembly/flash/cyborg
+
+/obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user)
+ ..()
+ new /obj/effect/temp_visual/borgflash(get_turf(src))
+
+/obj/item/assembly/flash/cyborg/attack_self(mob/user)
+ ..()
+ new /obj/effect/temp_visual/borgflash(get_turf(src))
+
+/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, params)
+ return
+/obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I)
+ return
+
+/obj/item/assembly/flash/memorizer
+ name = "memorizer"
+ desc = "If you see this, you're not likely to remember it any time soon."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "memorizer"
+ item_state = "nullrod"
+
+/obj/item/assembly/flash/handheld //this is now the regular pocket flashes
+
+/obj/item/assembly/flash/armimplant
+ name = "photon projector"
+ desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out."
+ var/flashcd = 20
+ var/overheat = 0
+ var/obj/item/organ/cyberimp/arm/flash/I = null
+
+/obj/item/assembly/flash/armimplant/burn_out()
+ if(I && I.owner)
+ to_chat(I.owner, "Your photon projector implant overheats and deactivates!")
+ I.Retract()
+ overheat = TRUE
+ addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2)
+
+/obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null)
+ if(overheat)
+ if(I && I.owner)
+ to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!")
+ return FALSE
+ overheat = TRUE
+ addtimer(CALLBACK(src, .proc/cooldown), flashcd)
+ playsound(src, 'sound/weapons/flash.ogg', 100, TRUE)
+ update_icon(1)
+ return TRUE
+
+
+/obj/item/assembly/flash/armimplant/proc/cooldown()
+ overheat = FALSE
+
+/obj/item/assembly/flash/shield
+ name = "strobe shield"
+ desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "flashshield"
+ item_state = "flashshield"
+ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
+ slot_flags = ITEM_SLOT_BACK
+ force = 10
+ throwforce = 5
+ throw_speed = 2
+ throw_range = 3
+ w_class = WEIGHT_CLASS_BULKY
+ materials = list(MAT_GLASS=7500, MAT_METAL=1000)
+ attack_verb = list("shoved", "bashed")
+ block_chance = 50
+ armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
+
+/obj/item/assembly/flash/shield/flash_recharge(interval=10)
+ if(times_used >= 4)
+ burn_out()
+ return FALSE
+ return TRUE
+
+/obj/item/assembly/flash/shield/attackby(obj/item/W, mob/user)
+ if(istype(W, /obj/item/assembly/flash/handheld))
+ var/obj/item/assembly/flash/handheld/flash = W
+ if(flash.crit_fail)
+ to_chat(user, "No sense replacing it with a broken bulb.")
+ return
+ else
+ to_chat(user, "You begin to replace the bulb.")
+ if(do_after(user, 20, target = src))
+ if(flash.crit_fail || !flash || QDELETED(flash))
+ return
+ crit_fail = FALSE
+ times_used = 0
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
+ update_icon()
+ flash.crit_fail = TRUE
+ flash.update_icon()
+ return
+ ..()
+
+/obj/item/assembly/flash/shield/update_icon(flash = FALSE)
+ icon_state = "flashshield"
+ item_state = "flashshield"
+
+ if(crit_fail)
+ icon_state = "riot"
+ item_state = "riot"
+ else if(flash)
+ icon_state = "flashshield_flash"
+ item_state = "flashshield_flash"
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
+
+ if(holder)
+ holder.update_icon()
+
+/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ activate()
+ return ..()
+
+//ported from tg - check to make sure it can't appear where it's not supposed to.
+/obj/item/assembly/flash/hypnotic
+ desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance."
+ flashing_overlay = "flash-hypno" //I cannot find this icon no matter how hard I look in tg, so I might just make my own.
+ light_color = LIGHT_COLOR_PINK
+ cooldown = 20
+
+/obj/item/assembly/flash/hypnotic/burn_out()
+ return
+
+/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
+ if(!istype(M))
+ return
+ if(user)
+ log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src)
+ else //caused by emp/remote signal
+ M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK)
+ if(generic_message && M != user)
+ to_chat(M, "[src] emits a soothing light...")
+ if(targeted)
+ if(M.flash_act(1, 1))
+ var/hypnosis = FALSE
+ if(M.hypnosis_vulnerable())
+ hypnosis = TRUE
+ if(user)
+ user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!")
+
+ if(!hypnosis)
+ to_chat(M, "The light makes you feel oddly relaxed...")
+ M.confused += min(M.confused + 10, 20)
+ M.dizziness += min(M.dizziness + 10, 20)
+ M.drowsyness += min(M.drowsyness + 10, 20)
+ M.apply_status_effect(STATUS_EFFECT_PACIFY, 100)
+ else
+ M.apply_status_effect(/datum/status_effect/trance, 200, TRUE)
+
+ else if(user)
+ user.visible_message("[user] fails to blind [M] with the flash!", "You fail to hypno-flash [M]!")
+ else
+ to_chat(M, "[src] fails to blind you!")
+
+ else if(M.flash_act())
+ to_chat(M, "Such a pretty light...")
+ M.confused += min(M.confused + 4, 20)
+ M.dizziness += min(M.dizziness + 4, 20)
+ M.drowsyness += min(M.drowsyness + 4, 20)
diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm
index 7b78facf..1b4ebd6c 100644
--- a/code/modules/cargo/gondolapod.dm
+++ b/code/modules/cargo/gondolapod.dm
@@ -29,7 +29,7 @@
name = linked_pod.name
. = ..()
-/mob/living/simple_animal/pet/gondola/gondolapod/proc/update_icon()
+/mob/living/simple_animal/pet/gondola/gondolapod/update_icon_state()
if(opened)
icon_state = "gondolapod_open"
else
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 2ad46b80..d1d17b3d 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -53,7 +53,7 @@
mix_filling_color(S)
S.reagents.trans_to(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
foodtype |= S.foodtype
- update_overlays(S)
+ update_snack_overlays(S)
to_chat(user, "You add the [I.name] to the [name].")
update_name(S)
else
@@ -101,7 +101,7 @@
rgbcolor[4] = (customcolor[4]+ingcolor[4])/2
filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4])
-/obj/item/reagent_containers/food/snacks/customizable/update_overlays(obj/item/reagent_containers/food/snacks/S)
+/obj/item/reagent_containers/food/snacks/customizable/update_snack_overlays(obj/item/reagent_containers/food/snacks/S)
var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling")
if(S.filling_color == "#FFFFFF")
filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00")
@@ -137,7 +137,7 @@
/obj/item/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice)
..()
slice.filling_color = filling_color
- slice.update_overlays(src)
+ slice.update_snack_overlays(src)
/obj/item/reagent_containers/food/snacks/customizable/Destroy()
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 22106266..ee7e129a 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -267,7 +267,7 @@ All foods are distributed among various categories. Use common sense.
trash = null
return
-/obj/item/reagent_containers/food/snacks/proc/update_overlays(obj/item/reagent_containers/food/snacks/S)
+/obj/item/reagent_containers/food/snacks/proc/update_snack_overlays(obj/item/reagent_containers/food/snacks/S)
cut_overlays()
var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling")
if(S.filling_color == "#FFFFFF")
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index e06e095b..3e6f57ba 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -822,13 +822,13 @@
to_chat(user, "You add the [I] to the [name].")
P.name = initial(P.name)
contents += P
- update_overlays(P)
+ update_snack_overlays(P)
if (P.contents.len)
for(var/V in P.contents)
P = V
P.name = initial(P.name)
contents += P
- update_overlays(P)
+ update_snack_overlays(P)
P = I
clearlist(P.contents)
return
@@ -837,7 +837,7 @@
return O.attackby(I, user, params)
..()
-/obj/item/reagent_containers/food/snacks/pancakes/update_overlays(obj/item/reagent_containers/food/snacks/P)
+/obj/item/reagent_containers/food/snacks/pancakes/update_snack_overlays(obj/item/reagent_containers/food/snacks/P)
var/mutable_appearance/pancake = mutable_appearance(icon, "[P.item_state]_[rand(1,3)]")
pancake.pixel_x = rand(-1,1)
pancake.pixel_y = 3 * contents.len - 1
diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm
index 3574f8a9..7b5b0586 100644
--- a/code/modules/holodeck/turfs.dm
+++ b/code/modules/holodeck/turfs.dm
@@ -111,11 +111,10 @@
/turf/open/floor/holofloor/carpet/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/update_icon), 1)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 1)
/turf/open/floor/holofloor/carpet/update_icon()
- if(!..())
- return 0
+ . = ..()
if(intact)
queue_smooth(src)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 1c91b733..50862ee1 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -175,7 +175,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
* Hair will always update its dir, so if your sprite has no dirs the haircut will go all over the place.
* |- Ricotez
*/
-/mob/dead/observer/proc/update_icon(new_form)
+/mob/dead/observer/update_icon(new_form)
+ . = ..()
if(client) //We update our preferences in case they changed right before update_icon was called.
ghost_accs = client.prefs.ghost_accs
ghost_others = client.prefs.ghost_others
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 32af8888..f75607df 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -820,7 +820,7 @@
robot_suit.head.flash2.burn_out()
robot_suit.head.flash2 = null
robot_suit.head = null
- robot_suit.updateicon()
+ robot_suit.update_icon()
else
new /obj/item/robot_suit(T)
new /obj/item/bodypart/l_leg/robot(T)
diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm
index 0378b0b9..600dfdd5 100644
--- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm
+++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm
@@ -51,7 +51,7 @@
weapon.attack(C, src)
playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE, -1)
if(C.stat == DEAD)
- addtimer(CALLBACK(src, .proc/update_icon), 2)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 2)
back_to_idle()
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 7e3b2eb1..afc92c96 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -852,7 +852,7 @@ Pass a positive integer as an argument to override a bot's default speed.
ejectpai(usr)
update_controls()
-/mob/living/simple_animal/bot/proc/update_icon()
+/mob/living/simple_animal/bot/update_icon_state()
icon_state = "[initial(icon_state)][on]"
// Machinery to simplify topic and access calls
diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm
index c76dece7..5788fbb2 100644
--- a/code/modules/mob/living/simple_animal/bot/honkbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm
@@ -49,7 +49,7 @@
/mob/living/simple_animal/bot/honkbot/proc/sensor_blink()
icon_state = "honkbot-c"
- addtimer(CALLBACK(src, .proc/update_icon), 5, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 5, TIMER_OVERRIDE|TIMER_UNIQUE)
//honkbots react with sounds.
/mob/living/simple_animal/bot/honkbot/proc/react_ping()
@@ -177,7 +177,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
playsound(src, "honkbot_e", 50, 0)
spam_flag = TRUE // prevent spam
icon_state = "honkbot-e"
- addtimer(CALLBACK(src, .proc/update_icon), 30, TIMER_OVERRIDE|TIMER_UNIQUE)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 30, TIMER_OVERRIDE|TIMER_UNIQUE)
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
/mob/living/simple_animal/bot/honkbot/proc/honk_attack(mob/living/carbon/C) // horn attack
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 7a64c4e0..0d1a4bda 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -252,7 +252,7 @@ Auto Patrol: []"},
var/judgement_criteria = judgement_criteria()
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
icon_state = "secbot-c"
- addtimer(CALLBACK(src, .proc/update_icon), 2)
+ addtimer(CALLBACK(src, /atom/.proc/update_icon), 2)
var/threat = 5
if(ishuman(C))
C.stuttering = 5
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 66bcbdc0..5c99826d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -392,14 +392,10 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA
spintime -= speed
/mob/proc/update_pull_hud_icon()
- if(hud_used)
- if(hud_used.pull_icon)
- hud_used.pull_icon.update_icon(src)
+ hud_used?.pull_icon?.update_icon()
/mob/proc/update_rest_hud_icon()
- if(hud_used)
- if(hud_used.rest_icon)
- hud_used.rest_icon.update_icon(src)
+ hud_used?.rest_icon?.update_icon()
/mob/verb/mode()
set name = "Activate Held Object"
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 5a404651..6e74f42c 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -27,7 +27,7 @@
I'll make some notes on where certain variable defines should probably go.
Changing this around would probably require a good look-over the pre-existing code.
*/
- var/zone_selected = null
+ var/zone_selected = BODY_ZONE_CHEST
var/computer_id = null
var/list/logging = list()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 922d36fe..02c9c1ed 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -1,408 +1,408 @@
-/mob/CanPass(atom/movable/mover, turf/target)
- if((mover.pass_flags & PASSMOB))
- return TRUE
- if(istype(mover, /obj/item/projectile) || mover.throwing)
- return (!density || lying)
- if(buckled == mover)
- return TRUE
- if(ismob(mover))
- if (mover in buckled_mobs)
- return TRUE
- return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover)))
-
-//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM.
-//See mob_movespeed.dm
-/mob/proc/movement_delay() //update /living/movement_delay() if you change this
- return cached_multiplicative_slowdown
-
-/client/verb/drop_item()
- set hidden = 1
- if(!iscyborg(mob) && mob.stat == CONSCIOUS)
- mob.dropItemToGround(mob.get_active_held_item())
- return
-
-/client/proc/Move_object(direct)
- if(mob && mob.control_object)
- if(mob.control_object.density)
- step(mob.control_object,direct)
- if(!mob.control_object)
- return
- mob.control_object.setDir(direct)
- else
- mob.control_object.forceMove(get_step(mob.control_object,direct))
-
-#define MOVEMENT_DELAY_BUFFER 0.75
-#define MOVEMENT_DELAY_BUFFER_DELTA 1.25
-
-/client/Move(n, direct)
- if(world.time < move_delay) //do not move anything ahead of this check please
- return FALSE
- else
- next_move_dir_add = 0
- next_move_dir_sub = 0
- var/old_move_delay = move_delay
- move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick
- if(!mob || !mob.loc)
- return FALSE
- if(!n || !direct)
- return FALSE
- if(mob.notransform)
- return FALSE //This is sota the goto stop mobs from moving var
- if(mob.control_object)
- return Move_object(direct)
- if(!isliving(mob))
- return mob.Move(n, direct)
- if(mob.stat == DEAD)
- mob.ghostize()
- return FALSE
- if(mob.force_moving)
- return FALSE
-
- var/mob/living/L = mob //Already checked for isliving earlier
- if(L.incorporeal_move) //Move though walls
- Process_Incorpmove(direct)
- return FALSE
-
- if(mob.remote_control) //we're controlling something, our movement is relayed to it
- return mob.remote_control.relaymove(mob, direct)
-
- if(isAI(mob))
- return AIMove(n,direct,mob)
-
- if(Process_Grab()) //are we restrained by someone's grip?
- return
-
- if(mob.buckled) //if we're buckled to something, tell it we moved.
- return mob.buckled.relaymove(mob, direct)
-
- if(!mob.canmove)
- return FALSE
-
- if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
- var/atom/O = mob.loc
- return O.relaymove(mob, direct)
-
- if(!mob.Process_Spacemove(direct))
- return FALSE
- //We are now going to move
- var/add_delay = mob.movement_delay()
- mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * (((direct & 3) && (direct & 12)) ? 2 : 1))) // set it now in case of pulled objects
- if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time)
- move_delay = old_move_delay
- else
- move_delay = world.time
- var/oldloc = mob.loc
-
- if(L.confused)
- var/newdir = 0
- if(L.confused > 40)
- newdir = pick(GLOB.alldirs)
- else if(prob(L.confused * 1.5))
- newdir = angle2dir(dir2angle(direct) + pick(90, -90))
- else if(prob(L.confused * 3))
- newdir = angle2dir(dir2angle(direct) + pick(45, -45))
- if(newdir)
- direct = newdir
- n = get_step(L, direct)
-
- . = ..()
-
- if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully
- add_delay *= 1.66
- move_delay += add_delay
- mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay))
- if(.) // If mob is null here, we deserve the runtime
- if(mob.throwing)
- mob.throwing.finalize(FALSE)
-
- for(var/obj/O in mob.user_movement_hooks)
- O.intercept_user_move(direct, mob, n, oldloc)
-
- var/atom/movable/P = mob.pulling
- if(P && !ismob(P) && P.density)
- mob.setDir(turn(mob.dir, 180))
-
-///Process_Grab()
-///Called by client/Move()
-///Checks to see if you are being grabbed and if so attemps to break it
-/client/proc/Process_Grab()
- if(mob.pulledby)
- if(mob.incapacitated(ignore_restraints = 1))
- move_delay = world.time + 10
- return TRUE
- else if(mob.restrained(ignore_grab = 1))
- move_delay = world.time + 10
- to_chat(src, "You're restrained! You can't move!")
- return TRUE
- else
- return mob.resist_grab(1)
-
-///Process_Incorpmove
-///Called by client/Move()
-///Allows mobs to run though walls
-/client/proc/Process_Incorpmove(direct)
- var/turf/mobloc = get_turf(mob)
- if(!isliving(mob))
- return
- var/mob/living/L = mob
- switch(L.incorporeal_move)
- if(INCORPOREAL_MOVE_BASIC)
- var/T = get_step(L,direct)
- if(T)
- L.forceMove(T)
- L.setDir(direct)
- if(INCORPOREAL_MOVE_SHADOW)
- if(prob(50))
- var/locx
- var/locy
- switch(direct)
- if(NORTH)
- locx = mobloc.x
- locy = (mobloc.y+2)
- if(locy>world.maxy)
- return
- if(SOUTH)
- locx = mobloc.x
- locy = (mobloc.y-2)
- if(locy<1)
- return
- if(EAST)
- locy = mobloc.y
- locx = (mobloc.x+2)
- if(locx>world.maxx)
- return
- if(WEST)
- locy = mobloc.y
- locx = (mobloc.x-2)
- if(locx<1)
- return
- else
- return
- var/target = locate(locx,locy,mobloc.z)
- if(target)
- L.loc = target
- var/limit = 2//For only two trailing shadows.
- for(var/turf/T in getline(mobloc, L.loc))
- new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
- limit--
- if(limit<=0)
- break
- else
- new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
- var/T = get_step(L,direct)
- if(T)
- L.forceMove(T)
- L.setDir(direct)
- if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
- var/turf/open/floor/stepTurf = get_step(L, direct)
- if(stepTurf)
- for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
- to_chat(L, "[S] bars your passage!")
- if(isrevenant(L))
- var/mob/living/simple_animal/revenant/R = L
- R.reveal(20)
- R.stun(20)
- return
- if(stepTurf.flags_1 & NOJAUNT_1)
- to_chat(L, "Some strange aura is blocking the way.")
- return
- if (locate(/obj/effect/blessing, stepTurf))
- to_chat(L, "Holy energies block your path!")
- return
-
- L.forceMove(stepTurf)
- L.setDir(direct)
- return TRUE
-
-
-///Process_Spacemove
-///Called by /client/Move()
-///For moving in space
-///return TRUE for movement 0 for none
-/mob/Process_Spacemove(movement_dir = 0)
- if(spacewalk || ..())
- return TRUE
- var/atom/movable/backup = get_spacemove_backup()
- if(backup)
- if(istype(backup) && movement_dir && !backup.anchored)
- if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
- to_chat(src, "You push off of [backup] to propel yourself.")
- return TRUE
- return FALSE
-
-/mob/get_spacemove_backup()
- for(var/A in orange(1, get_turf(src)))
- if(isarea(A))
- continue
- else if(isturf(A))
- var/turf/turf = A
- if(isspaceturf(turf))
- continue
- if(!turf.density && !mob_negates_gravity())
- continue
- return A
- else
- var/atom/movable/AM = A
- if(AM == buckled)
- continue
- if(ismob(AM))
- var/mob/M = AM
- if(M.buckled)
- continue
- if(!AM.CanPass(src) || AM.density)
- if(AM.anchored)
- return AM
- if(pulling == AM)
- continue
- . = AM
-
-/mob/proc/mob_has_gravity()
- return has_gravity()
-
-/mob/proc/mob_negates_gravity()
- return FALSE
-
-
-/mob/proc/slip(s_amount, w_amount, obj/O, lube)
- return
-
-/mob/proc/update_gravity()
- return
-
-//bodypart selection - Cyberboss
-//8 toggles through head - eyes - mouth
-//4: r-arm 5: chest 6: l-arm
-//1: r-leg 2: groin 3: l-leg
-
-/client/proc/check_has_body_select()
- return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel)
-
-/client/verb/body_toggle_head()
- set name = "body-toggle-head"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/next_in_line
- switch(mob.zone_selected)
- if(BODY_ZONE_HEAD)
- next_in_line = BODY_ZONE_PRECISE_EYES
- if(BODY_ZONE_PRECISE_EYES)
- next_in_line = BODY_ZONE_PRECISE_MOUTH
- else
- next_in_line = BODY_ZONE_HEAD
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(next_in_line, mob)
-
-/client/verb/body_r_arm()
- set name = "body-r-arm"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(BODY_ZONE_R_ARM, mob)
-
-/client/verb/body_chest()
- set name = "body-chest"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(BODY_ZONE_CHEST, mob)
-
-/client/verb/body_l_arm()
- set name = "body-l-arm"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(BODY_ZONE_L_ARM, mob)
-
-/client/verb/body_r_leg()
- set name = "body-r-leg"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(BODY_ZONE_R_LEG, mob)
-
-/client/verb/body_groin()
- set name = "body-groin"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob)
-
-/client/verb/body_l_leg()
- set name = "body-l-leg"
- set hidden = 1
-
- if(!check_has_body_select())
- return
-
- var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
- selector.set_selected_zone(BODY_ZONE_L_LEG, mob)
-
-/client/verb/toggle_walk_run()
- set name = "toggle-walk-run"
- set hidden = TRUE
- set instant = TRUE
- if(mob)
- mob.toggle_move_intent(usr)
-
-/mob/proc/toggle_move_intent(mob/user)
- if(m_intent == MOVE_INTENT_RUN)
- m_intent = MOVE_INTENT_WALK
- else
- if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude.
- to_chat(src, "You find yourself unable to run.")
- return FALSE
- m_intent = MOVE_INTENT_RUN
- if(hud_used && hud_used.static_inventory)
- for(var/obj/screen/mov_intent/selector in hud_used.static_inventory)
- selector.update_icon(src)
-
-/mob/verb/up()
- set name = "Move Upwards"
- set category = "IC"
-
- if(zMove(UP, TRUE))
- to_chat(src, "You move upwards.")
-
-/mob/verb/down()
- set name = "Move Down"
- set category = "IC"
-
- if(zMove(DOWN, TRUE))
- to_chat(src, "You move down.")
-
-/mob/proc/zMove(dir, feedback = FALSE)
- if(dir != UP && dir != DOWN)
- return FALSE
- var/turf/target = get_step_multiz(src, dir)
- if(!target)
- if(feedback)
- to_chat(src, "There's nothing in that direction!")
- return FALSE
- if(!canZMove(dir, target))
- if(feedback)
- to_chat(src, "You couldn't move there!")
- return FALSE
- forceMove(target)
- return TRUE
-
-/mob/proc/canZMove(direction, turf/target)
- return FALSE
+/mob/CanPass(atom/movable/mover, turf/target)
+ if((mover.pass_flags & PASSMOB))
+ return TRUE
+ if(istype(mover, /obj/item/projectile) || mover.throwing)
+ return (!density || lying)
+ if(buckled == mover)
+ return TRUE
+ if(ismob(mover))
+ if (mover in buckled_mobs)
+ return TRUE
+ return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover)))
+
+//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM.
+//See mob_movespeed.dm
+/mob/proc/movement_delay() //update /living/movement_delay() if you change this
+ return cached_multiplicative_slowdown
+
+/client/verb/drop_item()
+ set hidden = 1
+ if(!iscyborg(mob) && mob.stat == CONSCIOUS)
+ mob.dropItemToGround(mob.get_active_held_item())
+ return
+
+/client/proc/Move_object(direct)
+ if(mob && mob.control_object)
+ if(mob.control_object.density)
+ step(mob.control_object,direct)
+ if(!mob.control_object)
+ return
+ mob.control_object.setDir(direct)
+ else
+ mob.control_object.forceMove(get_step(mob.control_object,direct))
+
+#define MOVEMENT_DELAY_BUFFER 0.75
+#define MOVEMENT_DELAY_BUFFER_DELTA 1.25
+
+/client/Move(n, direct)
+ if(world.time < move_delay) //do not move anything ahead of this check please
+ return FALSE
+ else
+ next_move_dir_add = 0
+ next_move_dir_sub = 0
+ var/old_move_delay = move_delay
+ move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick
+ if(!mob || !mob.loc)
+ return FALSE
+ if(!n || !direct)
+ return FALSE
+ if(mob.notransform)
+ return FALSE //This is sota the goto stop mobs from moving var
+ if(mob.control_object)
+ return Move_object(direct)
+ if(!isliving(mob))
+ return mob.Move(n, direct)
+ if(mob.stat == DEAD)
+ mob.ghostize()
+ return FALSE
+ if(mob.force_moving)
+ return FALSE
+
+ var/mob/living/L = mob //Already checked for isliving earlier
+ if(L.incorporeal_move) //Move though walls
+ Process_Incorpmove(direct)
+ return FALSE
+
+ if(mob.remote_control) //we're controlling something, our movement is relayed to it
+ return mob.remote_control.relaymove(mob, direct)
+
+ if(isAI(mob))
+ return AIMove(n,direct,mob)
+
+ if(Process_Grab()) //are we restrained by someone's grip?
+ return
+
+ if(mob.buckled) //if we're buckled to something, tell it we moved.
+ return mob.buckled.relaymove(mob, direct)
+
+ if(!mob.canmove)
+ return FALSE
+
+ if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
+ var/atom/O = mob.loc
+ return O.relaymove(mob, direct)
+
+ if(!mob.Process_Spacemove(direct))
+ return FALSE
+ //We are now going to move
+ var/add_delay = mob.movement_delay()
+ mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * (((direct & 3) && (direct & 12)) ? 2 : 1))) // set it now in case of pulled objects
+ if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time)
+ move_delay = old_move_delay
+ else
+ move_delay = world.time
+ var/oldloc = mob.loc
+
+ if(L.confused)
+ var/newdir = 0
+ if(L.confused > 40)
+ newdir = pick(GLOB.alldirs)
+ else if(prob(L.confused * 1.5))
+ newdir = angle2dir(dir2angle(direct) + pick(90, -90))
+ else if(prob(L.confused * 3))
+ newdir = angle2dir(dir2angle(direct) + pick(45, -45))
+ if(newdir)
+ direct = newdir
+ n = get_step(L, direct)
+
+ . = ..()
+
+ if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully
+ add_delay *= 1.66
+ move_delay += add_delay
+ mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay))
+ if(.) // If mob is null here, we deserve the runtime
+ if(mob.throwing)
+ mob.throwing.finalize(FALSE)
+
+ for(var/obj/O in mob.user_movement_hooks)
+ O.intercept_user_move(direct, mob, n, oldloc)
+
+ var/atom/movable/P = mob.pulling
+ if(P && !ismob(P) && P.density)
+ mob.setDir(turn(mob.dir, 180))
+
+///Process_Grab()
+///Called by client/Move()
+///Checks to see if you are being grabbed and if so attemps to break it
+/client/proc/Process_Grab()
+ if(mob.pulledby)
+ if(mob.incapacitated(ignore_restraints = 1))
+ move_delay = world.time + 10
+ return TRUE
+ else if(mob.restrained(ignore_grab = 1))
+ move_delay = world.time + 10
+ to_chat(src, "You're restrained! You can't move!")
+ return TRUE
+ else
+ return mob.resist_grab(1)
+
+///Process_Incorpmove
+///Called by client/Move()
+///Allows mobs to run though walls
+/client/proc/Process_Incorpmove(direct)
+ var/turf/mobloc = get_turf(mob)
+ if(!isliving(mob))
+ return
+ var/mob/living/L = mob
+ switch(L.incorporeal_move)
+ if(INCORPOREAL_MOVE_BASIC)
+ var/T = get_step(L,direct)
+ if(T)
+ L.forceMove(T)
+ L.setDir(direct)
+ if(INCORPOREAL_MOVE_SHADOW)
+ if(prob(50))
+ var/locx
+ var/locy
+ switch(direct)
+ if(NORTH)
+ locx = mobloc.x
+ locy = (mobloc.y+2)
+ if(locy>world.maxy)
+ return
+ if(SOUTH)
+ locx = mobloc.x
+ locy = (mobloc.y-2)
+ if(locy<1)
+ return
+ if(EAST)
+ locy = mobloc.y
+ locx = (mobloc.x+2)
+ if(locx>world.maxx)
+ return
+ if(WEST)
+ locy = mobloc.y
+ locx = (mobloc.x-2)
+ if(locx<1)
+ return
+ else
+ return
+ var/target = locate(locx,locy,mobloc.z)
+ if(target)
+ L.loc = target
+ var/limit = 2//For only two trailing shadows.
+ for(var/turf/T in getline(mobloc, L.loc))
+ new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir)
+ limit--
+ if(limit<=0)
+ break
+ else
+ new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
+ var/T = get_step(L,direct)
+ if(T)
+ L.forceMove(T)
+ L.setDir(direct)
+ if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
+ var/turf/open/floor/stepTurf = get_step(L, direct)
+ if(stepTurf)
+ for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
+ to_chat(L, "[S] bars your passage!")
+ if(isrevenant(L))
+ var/mob/living/simple_animal/revenant/R = L
+ R.reveal(20)
+ R.stun(20)
+ return
+ if(stepTurf.flags_1 & NOJAUNT_1)
+ to_chat(L, "Some strange aura is blocking the way.")
+ return
+ if (locate(/obj/effect/blessing, stepTurf))
+ to_chat(L, "Holy energies block your path!")
+ return
+
+ L.forceMove(stepTurf)
+ L.setDir(direct)
+ return TRUE
+
+
+///Process_Spacemove
+///Called by /client/Move()
+///For moving in space
+///return TRUE for movement 0 for none
+/mob/Process_Spacemove(movement_dir = 0)
+ if(spacewalk || ..())
+ return TRUE
+ var/atom/movable/backup = get_spacemove_backup()
+ if(backup)
+ if(istype(backup) && movement_dir && !backup.anchored)
+ if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
+ to_chat(src, "You push off of [backup] to propel yourself.")
+ return TRUE
+ return FALSE
+
+/mob/get_spacemove_backup()
+ for(var/A in orange(1, get_turf(src)))
+ if(isarea(A))
+ continue
+ else if(isturf(A))
+ var/turf/turf = A
+ if(isspaceturf(turf))
+ continue
+ if(!turf.density && !mob_negates_gravity())
+ continue
+ return A
+ else
+ var/atom/movable/AM = A
+ if(AM == buckled)
+ continue
+ if(ismob(AM))
+ var/mob/M = AM
+ if(M.buckled)
+ continue
+ if(!AM.CanPass(src) || AM.density)
+ if(AM.anchored)
+ return AM
+ if(pulling == AM)
+ continue
+ . = AM
+
+/mob/proc/mob_has_gravity()
+ return has_gravity()
+
+/mob/proc/mob_negates_gravity()
+ return FALSE
+
+
+/mob/proc/slip(s_amount, w_amount, obj/O, lube)
+ return
+
+/mob/proc/update_gravity()
+ return
+
+//bodypart selection - Cyberboss
+//8 toggles through head - eyes - mouth
+//4: r-arm 5: chest 6: l-arm
+//1: r-leg 2: groin 3: l-leg
+
+/client/proc/check_has_body_select()
+ return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel)
+
+/client/verb/body_toggle_head()
+ set name = "body-toggle-head"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/next_in_line
+ switch(mob.zone_selected)
+ if(BODY_ZONE_HEAD)
+ next_in_line = BODY_ZONE_PRECISE_EYES
+ if(BODY_ZONE_PRECISE_EYES)
+ next_in_line = BODY_ZONE_PRECISE_MOUTH
+ else
+ next_in_line = BODY_ZONE_HEAD
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(next_in_line, mob)
+
+/client/verb/body_r_arm()
+ set name = "body-r-arm"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(BODY_ZONE_R_ARM, mob)
+
+/client/verb/body_chest()
+ set name = "body-chest"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(BODY_ZONE_CHEST, mob)
+
+/client/verb/body_l_arm()
+ set name = "body-l-arm"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(BODY_ZONE_L_ARM, mob)
+
+/client/verb/body_r_leg()
+ set name = "body-r-leg"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(BODY_ZONE_R_LEG, mob)
+
+/client/verb/body_groin()
+ set name = "body-groin"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob)
+
+/client/verb/body_l_leg()
+ set name = "body-l-leg"
+ set hidden = 1
+
+ if(!check_has_body_select())
+ return
+
+ var/obj/screen/zone_sel/selector = mob.hud_used.zone_select
+ selector.set_selected_zone(BODY_ZONE_L_LEG, mob)
+
+/client/verb/toggle_walk_run()
+ set name = "toggle-walk-run"
+ set hidden = TRUE
+ set instant = TRUE
+ if(mob)
+ mob.toggle_move_intent(usr)
+
+/mob/proc/toggle_move_intent(mob/user)
+ if(m_intent == MOVE_INTENT_RUN)
+ m_intent = MOVE_INTENT_WALK
+ else
+ if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude.
+ to_chat(src, "You find yourself unable to run.")
+ return FALSE
+ m_intent = MOVE_INTENT_RUN
+ if(hud_used && hud_used.static_inventory)
+ for(var/obj/screen/mov_intent/selector in hud_used.static_inventory)
+ selector.update_icon()
+
+/mob/verb/up()
+ set name = "Move Upwards"
+ set category = "IC"
+
+ if(zMove(UP, TRUE))
+ to_chat(src, "You move upwards.")
+
+/mob/verb/down()
+ set name = "Move Down"
+ set category = "IC"
+
+ if(zMove(DOWN, TRUE))
+ to_chat(src, "You move down.")
+
+/mob/proc/zMove(dir, feedback = FALSE)
+ if(dir != UP && dir != DOWN)
+ return FALSE
+ var/turf/target = get_step_multiz(src, dir)
+ if(!target)
+ if(feedback)
+ to_chat(src, "There's nothing in that direction!")
+ return FALSE
+ if(!canZMove(dir, target))
+ if(feedback)
+ to_chat(src, "You couldn't move there!")
+ return FALSE
+ forceMove(target)
+ return TRUE
+
+/mob/proc/canZMove(direction, turf/target)
+ return FALSE
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 018a16e4..a4cd9d92 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -1,231 +1,231 @@
-// stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
-#define RAD_COLLECTOR_EFFICIENCY 60 // radiation needs to be over this amount to get power
-#define RAD_COLLECTOR_COEFFICIENT 100
-#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
-#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process()
-#define RAD_COLLECTOR_OUTPUT min(stored_power, (stored_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored
-
-/obj/machinery/power/rad_collector
- name = "Radiation Collector Array"
- desc = "A device which uses Hawking Radiation and plasma to produce power."
- icon = 'icons/obj/singularity.dmi'
- icon_state = "ca"
- anchored = FALSE
- density = TRUE
- req_access = list(ACCESS_ENGINE_EQUIP)
-// use_power = NO_POWER_USE
- max_integrity = 350
- integrity_failure = 80
- circuit = /obj/item/circuitboard/machine/rad_collector
- var/obj/item/tank/internals/plasma/loaded_tank = null
- var/stored_power = 0
- var/active = 0
- var/locked = FALSE
- var/drainratio = 1
- var/powerproduction_drain = 0.001
-
- var/bitcoinproduction_drain = 0.15
- var/bitcoinmining = FALSE
- rad_insulation = RAD_EXTREME_INSULATION
-
-/obj/machinery/power/rad_collector/anchored
- anchored = TRUE
-
-/obj/machinery/power/rad_collector/Destroy()
- return ..()
-
-/obj/machinery/power/rad_collector/process()
- if(!loaded_tank)
- return
- if(!bitcoinmining)
- if(!loaded_tank.air_contents.gases[/datum/gas/plasma])
- investigate_log("out of fuel.", INVESTIGATE_SINGULO)
- playsound(src, 'sound/machines/ding.ogg', 50, 1)
- eject()
- else
- var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma])
- loaded_tank.air_contents.gases[/datum/gas/plasma] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/tritium] += gasdrained
- GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
-
- var/power_produced = RAD_COLLECTOR_OUTPUT
- add_avail(power_produced)
- stored_power-=power_produced
- else if(is_station_level(z) && SSresearch.science_tech)
- if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen])
- playsound(src, 'sound/machines/ding.ogg', 50, 1)
- eject()
- else
- var/gasdrained = bitcoinproduction_drain*drainratio
- loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained
- loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2
- GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
- var/bitcoins_mined = RAD_COLLECTOR_OUTPUT
- SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE)
- stored_power-=bitcoins_mined
-
-/obj/machinery/power/rad_collector/interact(mob/user)
- if(anchored)
- if(!src.locked)
- toggle_power()
- user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
- "You turn the [src.name] [active? "on":"off"].")
- var/fuel
- if(loaded_tank)
- fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
- investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO)
- return
- else
- to_chat(user, "The controls are locked!")
- return
-
-/obj/machinery/power/rad_collector/can_be_unfasten_wrench(mob/user, silent)
- if(loaded_tank)
- if(!silent)
- to_chat(user, "Remove the plasma tank first!")
- return FAILED_UNFASTEN
- return ..()
-
-/obj/machinery/power/rad_collector/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
- . = ..()
- if(. == SUCCESSFUL_UNFASTEN)
- if(anchored)
- connect_to_network()
- else
- disconnect_from_network()
-
-/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/tank/internals/plasma))
- if(!anchored)
- to_chat(user, "[src] needs to be secured to the floor first!")
- return TRUE
- if(loaded_tank)
- to_chat(user, "There's already a plasma tank loaded!")
- return TRUE
- if(panel_open)
- to_chat(user, "Close the maintenance panel first!")
- return TRUE
- if(!user.transferItemToLoc(W, src))
- return
- loaded_tank = W
- update_icons()
- else if(W.GetID())
- if(allowed(user))
- if(active)
- locked = !locked
- to_chat(user, "You [locked ? "lock" : "unlock"] the controls.")
- else
- to_chat(user, "The controls can only be locked when \the [src] is active!")
- else
- to_chat(user, "Access denied.")
- return TRUE
- else
- return ..()
-
-/obj/machinery/power/rad_collector/wrench_act(mob/living/user, obj/item/I)
- default_unfasten_wrench(user, I)
- return TRUE
-
-/obj/machinery/power/rad_collector/screwdriver_act(mob/living/user, obj/item/I)
- if(..())
- return TRUE
- if(loaded_tank)
- to_chat(user, "Remove the plasma tank first!")
- else
- default_deconstruction_screwdriver(user, icon_state, icon_state, I)
- return TRUE
-
-/obj/machinery/power/rad_collector/crowbar_act(mob/living/user, obj/item/I)
- if(loaded_tank)
- if(locked)
- to_chat(user, "The controls are locked!")
- return TRUE
- eject()
- return TRUE
- if(default_deconstruction_crowbar(I))
- return TRUE
- to_chat(user, "There isn't a tank loaded!")
- return TRUE
-
-/obj/machinery/power/rad_collector/multitool_act(mob/living/user, obj/item/I)
- if(!is_station_level(z) && !SSresearch.science_tech)
- to_chat(user, "[src] isn't linked to a research system!")
- return TRUE
- if(locked)
- to_chat(user, "[src] is locked!")
- return TRUE
- if(active)
- to_chat(user, "[src] is currently active, producing [bitcoinmining ? "research points":"power"].")
- return TRUE
- bitcoinmining = !bitcoinmining
- to_chat(user, "You [bitcoinmining ? "enable":"disable"] the research point production feature of [src].")
- return TRUE
-
-/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I)
- if(loaded_tank)
- loaded_tank.analyzer_act(user, I)
-
-/obj/machinery/power/rad_collector/examine(mob/user)
- . = ..()
- if(active)
- if(!bitcoinmining)
- . += "[src]'s display states that it has stored [DisplayPower(stored_power)], and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute.
The plasma within it's tank is being irradiated into tritium."
- else
- . += "[src]'s display states that it's producing a total of [(stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute.
The tritium and oxygen within it's tank is being combusted into carbon dioxide."
- else
- if(!bitcoinmining)
- . += "[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\""
- else
- . += "[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\""
-
-/obj/machinery/power/rad_collector/obj_break(damage_flag)
- if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
- eject()
- stat |= BROKEN
-
-/obj/machinery/power/rad_collector/proc/eject()
- locked = FALSE
- var/obj/item/tank/internals/plasma/Z = src.loaded_tank
- if (!Z)
- return
- Z.forceMove(drop_location())
- Z.layer = initial(Z.layer)
- Z.plane = initial(Z.plane)
- src.loaded_tank = null
- if(active)
- toggle_power()
- else
- update_icons()
-
-/obj/machinery/power/rad_collector/rad_act(pulse_strength)
- . = ..()
- if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY)
- stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
-
-/obj/machinery/power/rad_collector/proc/update_icons()
- cut_overlays()
- if(loaded_tank)
- add_overlay("ptank")
- if(stat & (NOPOWER|BROKEN))
- return
- if(active)
- add_overlay("on")
-
-
-/obj/machinery/power/rad_collector/proc/toggle_power()
- active = !active
- if(active)
- icon_state = "ca_on"
- flick("ca_active", src)
- else
- icon_state = "ca"
- flick("ca_deactive", src)
- update_icons()
- return
-
-#undef RAD_COLLECTOR_EFFICIENCY
-#undef RAD_COLLECTOR_COEFFICIENT
-#undef RAD_COLLECTOR_STORED_OUT
-#undef RAD_COLLECTOR_MINING_CONVERSION_RATE
-#undef RAD_COLLECTOR_OUTPUT
+// stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
+#define RAD_COLLECTOR_EFFICIENCY 60 // radiation needs to be over this amount to get power
+#define RAD_COLLECTOR_COEFFICIENT 100
+#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
+#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process()
+#define RAD_COLLECTOR_OUTPUT min(stored_power, (stored_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored
+
+/obj/machinery/power/rad_collector
+ name = "Radiation Collector Array"
+ desc = "A device which uses Hawking Radiation and plasma to produce power."
+ icon = 'icons/obj/singularity.dmi'
+ icon_state = "ca"
+ anchored = FALSE
+ density = TRUE
+ req_access = list(ACCESS_ENGINE_EQUIP)
+// use_power = NO_POWER_USE
+ max_integrity = 350
+ integrity_failure = 80
+ circuit = /obj/item/circuitboard/machine/rad_collector
+ var/obj/item/tank/internals/plasma/loaded_tank = null
+ var/stored_power = 0
+ var/active = 0
+ var/locked = FALSE
+ var/drainratio = 1
+ var/powerproduction_drain = 0.001
+
+ var/bitcoinproduction_drain = 0.15
+ var/bitcoinmining = FALSE
+ rad_insulation = RAD_EXTREME_INSULATION
+
+/obj/machinery/power/rad_collector/anchored
+ anchored = TRUE
+
+/obj/machinery/power/rad_collector/Destroy()
+ return ..()
+
+/obj/machinery/power/rad_collector/process()
+ if(!loaded_tank)
+ return
+ if(!bitcoinmining)
+ if(!loaded_tank.air_contents.gases[/datum/gas/plasma])
+ investigate_log("out of fuel.", INVESTIGATE_SINGULO)
+ playsound(src, 'sound/machines/ding.ogg', 50, 1)
+ eject()
+ else
+ var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma])
+ loaded_tank.air_contents.gases[/datum/gas/plasma] -= gasdrained
+ loaded_tank.air_contents.gases[/datum/gas/tritium] += gasdrained
+ GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
+
+ var/power_produced = RAD_COLLECTOR_OUTPUT
+ add_avail(power_produced)
+ stored_power-=power_produced
+ else if(is_station_level(z) && SSresearch.science_tech)
+ if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen])
+ playsound(src, 'sound/machines/ding.ogg', 50, 1)
+ eject()
+ else
+ var/gasdrained = bitcoinproduction_drain*drainratio
+ loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained
+ loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained
+ loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2
+ GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases)
+ var/bitcoins_mined = RAD_COLLECTOR_OUTPUT
+ SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE)
+ stored_power-=bitcoins_mined
+
+/obj/machinery/power/rad_collector/interact(mob/user)
+ if(anchored)
+ if(!src.locked)
+ toggle_power()
+ user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
+ "You turn the [src.name] [active? "on":"off"].")
+ var/fuel
+ if(loaded_tank)
+ fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
+ investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO)
+ return
+ else
+ to_chat(user, "The controls are locked!")
+ return
+
+/obj/machinery/power/rad_collector/can_be_unfasten_wrench(mob/user, silent)
+ if(loaded_tank)
+ if(!silent)
+ to_chat(user, "Remove the plasma tank first!")
+ return FAILED_UNFASTEN
+ return ..()
+
+/obj/machinery/power/rad_collector/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
+ . = ..()
+ if(. == SUCCESSFUL_UNFASTEN)
+ if(anchored)
+ connect_to_network()
+ else
+ disconnect_from_network()
+
+/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/tank/internals/plasma))
+ if(!anchored)
+ to_chat(user, "[src] needs to be secured to the floor first!")
+ return TRUE
+ if(loaded_tank)
+ to_chat(user, "There's already a plasma tank loaded!")
+ return TRUE
+ if(panel_open)
+ to_chat(user, "Close the maintenance panel first!")
+ return TRUE
+ if(!user.transferItemToLoc(W, src))
+ return
+ loaded_tank = W
+ update_icon()
+ else if(W.GetID())
+ if(allowed(user))
+ if(active)
+ locked = !locked
+ to_chat(user, "You [locked ? "lock" : "unlock"] the controls.")
+ else
+ to_chat(user, "The controls can only be locked when \the [src] is active!")
+ else
+ to_chat(user, "Access denied.")
+ return TRUE
+ else
+ return ..()
+
+/obj/machinery/power/rad_collector/wrench_act(mob/living/user, obj/item/I)
+ default_unfasten_wrench(user, I)
+ return TRUE
+
+/obj/machinery/power/rad_collector/screwdriver_act(mob/living/user, obj/item/I)
+ if(..())
+ return TRUE
+ if(loaded_tank)
+ to_chat(user, "Remove the plasma tank first!")
+ else
+ default_deconstruction_screwdriver(user, icon_state, icon_state, I)
+ return TRUE
+
+/obj/machinery/power/rad_collector/crowbar_act(mob/living/user, obj/item/I)
+ if(loaded_tank)
+ if(locked)
+ to_chat(user, "The controls are locked!")
+ return TRUE
+ eject()
+ return TRUE
+ if(default_deconstruction_crowbar(I))
+ return TRUE
+ to_chat(user, "There isn't a tank loaded!")
+ return TRUE
+
+/obj/machinery/power/rad_collector/multitool_act(mob/living/user, obj/item/I)
+ if(!is_station_level(z) && !SSresearch.science_tech)
+ to_chat(user, "[src] isn't linked to a research system!")
+ return TRUE
+ if(locked)
+ to_chat(user, "[src] is locked!")
+ return TRUE
+ if(active)
+ to_chat(user, "[src] is currently active, producing [bitcoinmining ? "research points":"power"].")
+ return TRUE
+ bitcoinmining = !bitcoinmining
+ to_chat(user, "You [bitcoinmining ? "enable":"disable"] the research point production feature of [src].")
+ return TRUE
+
+/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I)
+ if(loaded_tank)
+ loaded_tank.analyzer_act(user, I)
+
+/obj/machinery/power/rad_collector/examine(mob/user)
+ . = ..()
+ if(active)
+ if(!bitcoinmining)
+ . += "[src]'s display states that it has stored [DisplayPower(stored_power)], and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute.
The plasma within it's tank is being irradiated into tritium."
+ else
+ . += "[src]'s display states that it's producing a total of [(stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute.
The tritium and oxygen within it's tank is being combusted into carbon dioxide."
+ else
+ if(!bitcoinmining)
+ . += "[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\""
+ else
+ . += "[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\""
+
+/obj/machinery/power/rad_collector/obj_break(damage_flag)
+ if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
+ eject()
+ stat |= BROKEN
+
+/obj/machinery/power/rad_collector/proc/eject()
+ locked = FALSE
+ var/obj/item/tank/internals/plasma/Z = src.loaded_tank
+ if (!Z)
+ return
+ Z.forceMove(drop_location())
+ Z.layer = initial(Z.layer)
+ Z.plane = initial(Z.plane)
+ src.loaded_tank = null
+ if(active)
+ toggle_power()
+ else
+ update_icon()
+
+/obj/machinery/power/rad_collector/rad_act(pulse_strength)
+ . = ..()
+ if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY)
+ stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
+
+/obj/machinery/power/rad_collector/update_icon()
+ cut_overlays()
+ if(loaded_tank)
+ add_overlay("ptank")
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(active)
+ add_overlay("on")
+
+
+/obj/machinery/power/rad_collector/proc/toggle_power()
+ active = !active
+ if(active)
+ icon_state = "ca_on"
+ flick("ca_active", src)
+ else
+ icon_state = "ca"
+ flick("ca_deactive", src)
+ update_icon()
+ return
+
+#undef RAD_COLLECTOR_EFFICIENCY
+#undef RAD_COLLECTOR_COEFFICIENT
+#undef RAD_COLLECTOR_STORED_OUT
+#undef RAD_COLLECTOR_MINING_CONVERSION_RATE
+#undef RAD_COLLECTOR_OUTPUT
diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm
index 3a0eb364..6ad0603c 100644
--- a/modular_citadel/code/_onclick/hud/screen_objects.dm
+++ b/modular_citadel/code/_onclick/hud/screen_objects.dm
@@ -18,10 +18,11 @@
var/mob/living/carbon/C = usr
C.toggle_combat_mode()
-/obj/screen/combattoggle/proc/rebasetointerbay(mob/living/carbon/C)
- if(!C)
+/obj/screen/combattoggle/update_icon_state()
+ var/mob/living/carbon/user = hud?.mymob
+ if(!istype(user))
return
- if(C.combatmode)
+ if(user.combatmode)
icon_state = "combat"
else
icon_state = "combat_off"
@@ -36,10 +37,11 @@
var/mob/living/carbon/C = usr
C.toggle_vore_mode()
-/obj/screen/voretoggle/proc/rebaseintomygut(mob/living/carbon/C)
- if(!C)
+/obj/screen/voretoggle/update_icon_state()
+ var/mob/living/carbon/user = hud?.mymob
+ if(!istype(user))
return
- if(C.voremode && !C.combatmode)
+ if(user.voremode && !user.combatmode)
icon_state = "nom"
else
icon_state = "nom_off"
diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm
index ae58134d..14f8fba8 100644
--- a/modular_citadel/code/_onclick/hud/sprint.dm
+++ b/modular_citadel/code/_onclick/hud/sprint.dm
@@ -12,10 +12,11 @@
var/mob/living/carbon/human/H = usr
H.togglesprint()
-/obj/screen/sprintbutton/proc/insert_witty_toggle_joke_here(mob/living/carbon/human/H)
- if(!H)
+/obj/screen/sprintbutton/update_icon_state()
+ var/mob/living/user = hud?.mymob
+ if(istype(user))
return
- if(H.sprinting)
+ if(user.sprinting)
icon_state = "act_sprint_on"
else
icon_state = "act_sprint"
diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm
index 71ad66bb..e76fec7d 100644
--- a/modular_citadel/code/_onclick/hud/stamina.dm
+++ b/modular_citadel/code/_onclick/hud/stamina.dm
@@ -14,32 +14,18 @@
var/mob/living/L = usr
to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
Your stamina buffer can take [L.stambuffer] stamina loss, and will use 50% of that stamina loss when recharging.
Your stamina buffer is [(L.stambuffer*(100/L.stambuffer))-(L.bufferedstam*(100/L.stambuffer))]% full.")
-/mob/living/carbon/human/proc/staminahudamount()
- if(stat == DEAD || recoveringstam)
- return "staminacrit"
+/obj/screen/staminas/update_icon_state()
+ var/mob/living/carbon/user = hud?.mymob
+ if(!user)
+ return
+ if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2))
+ icon_state = "staminacrit"
+ else if(user.hal_screwyhud == 5)
+ icon_state = "stamina0"
else
- switch(hal_screwyhud)
- if(1 to 2)
- return "staminacrit"
- if(5)
- return "stamina0"
- else
- switch(100 - getStaminaLoss())
- if(100 to INFINITY)
- return "stamina0"
- if(80 to 100)
- return "stamina1"
- if(60 to 80)
- return "stamina2"
- if(40 to 60)
- return "stamina3"
- if(20 to 40)
- return "stamina4"
- if(0 to 20)
- return "stamina5"
- else
- return "stamina6"
+ icon_state = "stamina[max(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]"
+//stam buffer
//stam buffer
/obj/screen/staminabuffer
icon = 'modular_citadel/icons/ui/screen_gen.dmi'
@@ -49,32 +35,30 @@
layer = ABOVE_HUD_LAYER + 0.1
mouse_opacity = 0
-/mob/living/carbon/human/proc/staminabufferhudamount()
- if(stat == DEAD || recoveringstam)
- return "stambuffer7"
+/obj/screen/staminabuffer/update_icon_state()
+ var/mob/living/carbon/user = hud?.mymob
+ if(!user)
+ return
+ if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2))
+ icon_state = "stambuffer7"
+ else if(user.hal_screwyhud == 5)
+ icon_state = "stambuffer0"
else
- switch(hal_screwyhud)
- if(1 to 2)
- return "stambuffer7"
- if(5)
- return "stambuffer0"
+ switch(user.bufferedstam / user.stambuffer)
+ if(0.95 to INFINITY)
+ icon_state = "stambuffer7"
+ if(0.9 to 0.95)
+ icon_state = "stambuffer6"
+ if(0.8 to 0.9)
+ icon_state = "stambuffer5"
+ if(0.6 to 0.8)
+ icon_state = "stambuffer4"
+ if(0.4 to 0.6)
+ icon_state = "stambuffer3"
+ if(0.2 to 0.4)
+ icon_state = "stambuffer2"
+ if(0.05 to 0.2)
+ icon_state = "stambuffer1"
else
- var/percentmult = 100/stambuffer
- switch(stambuffer*percentmult - bufferedstam*percentmult)
- if(95 to INFINITY)
- return "stambuffer0"
- if(90 to 95)
- return "stambuffer1"
- if(80 to 90)
- return "stambuffer2"
- if(60 to 80)
- return "stambuffer3"
- if(40 to 60)
- return "stambuffer4"
- if(20 to 40)
- return "stambuffer5"
- if(5 to 20)
- return "stambuffer6"
- else
- return "stambuffer7"
-*/
\ No newline at end of file
+ icon_state = "stambuffer0"
+*/
diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
index bea9e8b1..5cb49f45 100644
--- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm
@@ -41,18 +41,16 @@
playsound_local(src, 'modular_citadel/sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above!
if(client)
client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting
- if(hud_used && hud_used.static_inventory)
- for(var/obj/screen/combattoggle/selector in hud_used.static_inventory)
- selector.rebasetointerbay(src)
+ var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory
+ T?.update_icon_state()
combatmessagecooldown = 10 SECONDS + world.time //This is set 100% of the time to make sure squeezing regen out of process cycles doesn't result in the combat mode message getting spammed
SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode)
return TRUE
mob/living/carbon/proc/toggle_vore_mode()
voremode = !voremode
- if(hud_used && hud_used.static_inventory)
- for(var/obj/screen/voretoggle/selector in hud_used.static_inventory)
- selector.rebaseintomygut(src)
+ var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory
+ T?.update_icon_state()
if(combatmode)
return FALSE //let's not override the main draw of the game these days
SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
index f9ed0a01..cf2ae09d 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm
@@ -1,6 +1,3 @@
-/mob/living/carbon/human
- var/sprinting = FALSE
-
/mob/living/carbon/human/Move(NewLoc, direct)
var/oldpseudoheight = pseudo_z_axis
. = ..()
@@ -27,13 +24,12 @@
if(sprinting)
playsound_local(src, 'modular_citadel/sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE)
else
- playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
-// if(hud_used && hud_used.static_inventory)
-// for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory)
-// selector.insert_witty_toggle_joke_here(src)
+ playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
+ S?.update_icon_state()
return TRUE
/mob/living/carbon/human/proc/sprint_hotkey(targetstatus)
if(targetstatus ? !sprinting : sprinting)
togglesprint()
-*/
\ No newline at end of file
+*/
diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm
index 5ec2ab8c..b74d116c 100644
--- a/modular_citadel/code/modules/mob/living/living.dm
+++ b/modular_citadel/code/modules/mob/living/living.dm
@@ -1,4 +1,5 @@
/mob/living
+ var/sprinting = FALSE
var/recoveringstam = FALSE
var/incomingstammult = 1
var/bufferedstam = 0
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
index d32d560b..b5a425ed 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -1,6 +1,3 @@
-/mob/living/silicon/robot
- var/sprinting = FALSE
-
/mob/living/silicon/robot/Move(NewLoc, direct)
. = ..()
@@ -19,13 +16,12 @@
else
if(shutdown)
playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE)
- playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
-// if(hud_used && hud_used.static_inventory)
-// for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory)
-// selector.insert_witty_toggle_joke_here(src)
+ playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE)
+ var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory
+ S?.update_icon_state()
return TRUE
/mob/living/silicon/robot/proc/sprint_hotkey(targetstatus)
if(targetstatus ? !sprinting : sprinting)
togglesprint()
-*/
\ No newline at end of file
+*/
diff --git a/tgstation.dme b/tgstation.dme
index 6f83b2f6..d93cc8a3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1,3358 +1,3357 @@
-
-// DM Environment file for tgstation.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 "_maps\_basemap.dm"
-#include "_maps\layeniastation.dm"
-#include "_maps\map_files\generic\CentCom.dmm"
-#include "code\_compile_options.dm"
-#include "code\world.dm"
-#include "code\__DEFINES\_globals.dm"
-#include "code\__DEFINES\_protect.dm"
-#include "code\__DEFINES\_tick.dm"
-#include "code\__DEFINES\access.dm"
-#include "code\__DEFINES\admin.dm"
-#include "code\__DEFINES\antagonists.dm"
-#include "code\__DEFINES\atmospherics.dm"
-#include "code\__DEFINES\atom_hud.dm"
-#include "code\__DEFINES\bsql.config.dm"
-#include "code\__DEFINES\bsql.dm"
-#include "code\__DEFINES\callbacks.dm"
-#include "code\__DEFINES\cargo.dm"
-#include "code\__DEFINES\cinematics.dm"
-#include "code\__DEFINES\citadel_defines.dm"
-#include "code\__DEFINES\cleaning.dm"
-#include "code\__DEFINES\clockcult.dm"
-#include "code\__DEFINES\colors.dm"
-#include "code\__DEFINES\combat.dm"
-#include "code\__DEFINES\components.dm"
-#include "code\__DEFINES\configuration.dm"
-#include "code\__DEFINES\construction.dm"
-#include "code\__DEFINES\contracts.dm"
-#include "code\__DEFINES\cult.dm"
-#include "code\__DEFINES\diseases.dm"
-#include "code\__DEFINES\DNA.dm"
-#include "code\__DEFINES\events.dm"
-#include "code\__DEFINES\exports.dm"
-#include "code\__DEFINES\flags.dm"
-#include "code\__DEFINES\food.dm"
-#include "code\__DEFINES\footsteps.dm"
-#include "code\__DEFINES\hud.dm"
-#include "code\__DEFINES\integrated_electronics.dm"
-#include "code\__DEFINES\interaction_flags.dm"
-#include "code\__DEFINES\inventory.dm"
-#include "code\__DEFINES\is_helpers.dm"
-#include "code\__DEFINES\jobs.dm"
-#include "code\__DEFINES\language.dm"
-#include "code\__DEFINES\layers.dm"
-#include "code\__DEFINES\lighting.dm"
-#include "code\__DEFINES\logging.dm"
-#include "code\__DEFINES\machines.dm"
-#include "code\__DEFINES\maps.dm"
-#include "code\__DEFINES\maths.dm"
-#include "code\__DEFINES\MC.dm"
-#include "code\__DEFINES\mecha.dm"
-#include "code\__DEFINES\medal.dm"
-#include "code\__DEFINES\melee.dm"
-#include "code\__DEFINES\menu.dm"
-#include "code\__DEFINES\misc.dm"
-#include "code\__DEFINES\mobs.dm"
-#include "code\__DEFINES\monkeys.dm"
-#include "code\__DEFINES\move_force.dm"
-#include "code\__DEFINES\movement.dm"
-#include "code\__DEFINES\movespeed_modification.dm"
-#include "code\__DEFINES\nanites.dm"
-#include "code\__DEFINES\networks.dm"
-#include "code\__DEFINES\obj_flags.dm"
-#include "code\__DEFINES\pinpointers.dm"
-#include "code\__DEFINES\pipe_construction.dm"
-#include "code\__DEFINES\pool.dm"
-#include "code\__DEFINES\preferences.dm"
-#include "code\__DEFINES\procpath.dm"
-#include "code\__DEFINES\profile.dm"
-#include "code\__DEFINES\qdel.dm"
-#include "code\__DEFINES\quirks.dm"
-#include "code\__DEFINES\radiation.dm"
-#include "code\__DEFINES\radio.dm"
-#include "code\__DEFINES\reactions.dm"
-#include "code\__DEFINES\reagents.dm"
-#include "code\__DEFINES\reagents_specific_heat.dm"
-#include "code\__DEFINES\research.dm"
-#include "code\__DEFINES\robots.dm"
-#include "code\__DEFINES\role_preferences.dm"
-#include "code\__DEFINES\rust_g.config.dm"
-#include "code\__DEFINES\rust_g.dm"
-#include "code\__DEFINES\say.dm"
-#include "code\__DEFINES\shuttles.dm"
-#include "code\__DEFINES\sight.dm"
-#include "code\__DEFINES\sound.dm"
-#include "code\__DEFINES\spaceman_dmm.dm"
-#include "code\__DEFINES\stat.dm"
-#include "code\__DEFINES\stat_tracking.dm"
-#include "code\__DEFINES\status_effects.dm"
-#include "code\__DEFINES\subsystems.dm"
-#include "code\__DEFINES\tgs.config.dm"
-#include "code\__DEFINES\tgs.dm"
-#include "code\__DEFINES\tgui.dm"
-#include "code\__DEFINES\time.dm"
-#include "code\__DEFINES\tools.dm"
-#include "code\__DEFINES\traits.dm"
-#include "code\__DEFINES\turf_flags.dm"
-#include "code\__DEFINES\typeids.dm"
-#include "code\__DEFINES\vehicles.dm"
-#include "code\__DEFINES\voreconstants.dm"
-#include "code\__DEFINES\vv.dm"
-#include "code\__DEFINES\wall_dents.dm"
-#include "code\__DEFINES\wires.dm"
-#include "code\__DEFINES\dcs\signals.dm"
-#include "code\__HELPERS\_cit_helpers.dm"
-#include "code\__HELPERS\_lists.dm"
-#include "code\__HELPERS\_logging.dm"
-#include "code\__HELPERS\_string_lists.dm"
-#include "code\__HELPERS\areas.dm"
-#include "code\__HELPERS\AStar.dm"
-#include "code\__HELPERS\cmp.dm"
-#include "code\__HELPERS\dates.dm"
-#include "code\__HELPERS\dna.dm"
-#include "code\__HELPERS\files.dm"
-#include "code\__HELPERS\game.dm"
-#include "code\__HELPERS\global_lists.dm"
-#include "code\__HELPERS\heap.dm"
-#include "code\__HELPERS\icon_smoothing.dm"
-#include "code\__HELPERS\icons.dm"
-#include "code\__HELPERS\level_traits.dm"
-#include "code\__HELPERS\matrices.dm"
-#include "code\__HELPERS\mobs.dm"
-#include "code\__HELPERS\mouse_control.dm"
-#include "code\__HELPERS\names.dm"
-#include "code\__HELPERS\priority_announce.dm"
-#include "code\__HELPERS\pronouns.dm"
-#include "code\__HELPERS\qdel.dm"
-#include "code\__HELPERS\radiation.dm"
-#include "code\__HELPERS\radio.dm"
-#include "code\__HELPERS\reagents.dm"
-#include "code\__HELPERS\roundend.dm"
-#include "code\__HELPERS\sanitize_values.dm"
-#include "code\__HELPERS\shell.dm"
-#include "code\__HELPERS\stat_tracking.dm"
-#include "code\__HELPERS\text.dm"
-#include "code\__HELPERS\text_vr.dm"
-#include "code\__HELPERS\time.dm"
-#include "code\__HELPERS\type2type.dm"
-#include "code\__HELPERS\type2type_vr.dm"
-#include "code\__HELPERS\typelists.dm"
-#include "code\__HELPERS\unsorted.dm"
-#include "code\__HELPERS\verbs.dm"
-#include "code\__HELPERS\view.dm"
-#include "code\__HELPERS\sorts\__main.dm"
-#include "code\__HELPERS\sorts\InsertSort.dm"
-#include "code\__HELPERS\sorts\MergeSort.dm"
-#include "code\__HELPERS\sorts\TimSort.dm"
-#include "code\_globalvars\bitfields.dm"
-#include "code\_globalvars\configuration.dm"
-#include "code\_globalvars\game_modes.dm"
-#include "code\_globalvars\genetics.dm"
-#include "code\_globalvars\logging.dm"
-#include "code\_globalvars\misc.dm"
-#include "code\_globalvars\regexes.dm"
-#include "code\_globalvars\lists\flavor_misc.dm"
-#include "code\_globalvars\lists\maintenance_loot.dm"
-#include "code\_globalvars\lists\mapping.dm"
-#include "code\_globalvars\lists\medals.dm"
-#include "code\_globalvars\lists\mobs.dm"
-#include "code\_globalvars\lists\names.dm"
-#include "code\_globalvars\lists\objects.dm"
-#include "code\_globalvars\lists\poll_ignore.dm"
-#include "code\_globalvars\lists\typecache.dm"
-#include "code\_globalvars\lists\vending.dm"
-#include "code\_js\byjax.dm"
-#include "code\_js\menus.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\overmind.dm"
-#include "code\_onclick\telekinesis.dm"
-#include "code\_onclick\hud\_defines.dm"
-#include "code\_onclick\hud\action_button.dm"
-#include "code\_onclick\hud\ai.dm"
-#include "code\_onclick\hud\alert.dm"
-#include "code\_onclick\hud\alien.dm"
-#include "code\_onclick\hud\alien_larva.dm"
-#include "code\_onclick\hud\blob_overmind.dm"
-#include "code\_onclick\hud\blobbernauthud.dm"
-#include "code\_onclick\hud\constructs.dm"
-#include "code\_onclick\hud\credits.dm"
-#include "code\_onclick\hud\devil.dm"
-#include "code\_onclick\hud\drones.dm"
-#include "code\_onclick\hud\fullscreen.dm"
-#include "code\_onclick\hud\generic_dextrous.dm"
-#include "code\_onclick\hud\ghost.dm"
-#include "code\_onclick\hud\guardian.dm"
-#include "code\_onclick\hud\hud.dm"
-#include "code\_onclick\hud\hud_cit.dm"
-#include "code\_onclick\hud\human.dm"
-#include "code\_onclick\hud\monkey.dm"
-#include "code\_onclick\hud\movable_screen_objects.dm"
-#include "code\_onclick\hud\parallax.dm"
-#include "code\_onclick\hud\picture_in_picture.dm"
-#include "code\_onclick\hud\plane_master.dm"
-#include "code\_onclick\hud\radial.dm"
-#include "code\_onclick\hud\radial_persistent.dm"
-#include "code\_onclick\hud\revenanthud.dm"
-#include "code\_onclick\hud\robot.dm"
-#include "code\_onclick\hud\screen_objects.dm"
-#include "code\_onclick\hud\swarmer.dm"
-#include "code\controllers\admin.dm"
-#include "code\controllers\configuration_citadel.dm"
-#include "code\controllers\controller.dm"
-#include "code\controllers\failsafe.dm"
-#include "code\controllers\globals.dm"
-#include "code\controllers\hooks.dm"
-#include "code\controllers\master.dm"
-#include "code\controllers\subsystem.dm"
-#include "code\controllers\configuration\config_entry.dm"
-#include "code\controllers\configuration\configuration.dm"
-#include "code\controllers\configuration\entries\comms.dm"
-#include "code\controllers\configuration\entries\dbconfig.dm"
-#include "code\controllers\configuration\entries\game_options.dm"
-#include "code\controllers\configuration\entries\general.dm"
-#include "code\controllers\subsystem\acid.dm"
-#include "code\controllers\subsystem\adjacent_air.dm"
-#include "code\controllers\subsystem\air.dm"
-#include "code\controllers\subsystem\air_turfs.dm"
-#include "code\controllers\subsystem\assets.dm"
-#include "code\controllers\subsystem\atoms.dm"
-#include "code\controllers\subsystem\augury.dm"
-#include "code\controllers\subsystem\autotransfer.dm"
-#include "code\controllers\subsystem\blackbox.dm"
-#include "code\controllers\subsystem\chat.dm"
-#include "code\controllers\subsystem\communications.dm"
-#include "code\controllers\subsystem\dbcore.dm"
-#include "code\controllers\subsystem\dcs.dm"
-#include "code\controllers\subsystem\disease.dm"
-#include "code\controllers\subsystem\events.dm"
-#include "code\controllers\subsystem\fire_burning.dm"
-#include "code\controllers\subsystem\garbage.dm"
-#include "code\controllers\subsystem\icon_smooth.dm"
-#include "code\controllers\subsystem\idlenpcpool.dm"
-#include "code\controllers\subsystem\input.dm"
-#include "code\controllers\subsystem\ipintel.dm"
-#include "code\controllers\subsystem\item_spawning.dm"
-#include "code\controllers\subsystem\job.dm"
-#include "code\controllers\subsystem\jukeboxes.dm"
-#include "code\controllers\subsystem\language.dm"
-#include "code\controllers\subsystem\lighting.dm"
-#include "code\controllers\subsystem\machines.dm"
-#include "code\controllers\subsystem\mapping.dm"
-#include "code\controllers\subsystem\medals.dm"
-#include "code\controllers\subsystem\minor_mapping.dm"
-#include "code\controllers\subsystem\mobs.dm"
-#include "code\controllers\subsystem\moods.dm"
-#include "code\controllers\subsystem\nightshift.dm"
-#include "code\controllers\subsystem\npcpool.dm"
-#include "code\controllers\subsystem\overlays.dm"
-#include "code\controllers\subsystem\pai.dm"
-#include "code\controllers\subsystem\parallax.dm"
-#include "code\controllers\subsystem\pathfinder.dm"
-#include "code\controllers\subsystem\persistence.dm"
-#include "code\controllers\subsystem\ping.dm"
-#include "code\controllers\subsystem\radiation.dm"
-#include "code\controllers\subsystem\radio.dm"
-#include "code\controllers\subsystem\research.dm"
-#include "code\controllers\subsystem\server_maint.dm"
-#include "code\controllers\subsystem\shuttle.dm"
-#include "code\controllers\subsystem\spacedrift.dm"
-#include "code\controllers\subsystem\statpanel.dm"
-#include "code\controllers\subsystem\stickyban.dm"
-#include "code\controllers\subsystem\sun.dm"
-#include "code\controllers\subsystem\tgui.dm"
-#include "code\controllers\subsystem\throwing.dm"
-#include "code\controllers\subsystem\ticker.dm"
-#include "code\controllers\subsystem\time_track.dm"
-#include "code\controllers\subsystem\timer.dm"
-#include "code\controllers\subsystem\title.dm"
-#include "code\controllers\subsystem\traumas.dm"
-#include "code\controllers\subsystem\vis_overlays.dm"
-#include "code\controllers\subsystem\vore.dm"
-#include "code\controllers\subsystem\vote.dm"
-#include "code\controllers\subsystem\weather.dm"
-#include "code\controllers\subsystem\processing\chemistry.dm"
-#include "code\controllers\subsystem\processing\circuit.dm"
-#include "code\controllers\subsystem\processing\fastprocess.dm"
-#include "code\controllers\subsystem\processing\fields.dm"
-#include "code\controllers\subsystem\processing\nanites.dm"
-#include "code\controllers\subsystem\processing\networks.dm"
-#include "code\controllers\subsystem\processing\obj.dm"
-#include "code\controllers\subsystem\processing\processing.dm"
-#include "code\controllers\subsystem\processing\projectiles.dm"
-#include "code\controllers\subsystem\processing\quirks.dm"
-#include "code\controllers\subsystem\processing\wet_floors.dm"
-#include "code\datums\action.dm"
-#include "code\datums\ai_laws.dm"
-#include "code\datums\armor.dm"
-#include "code\datums\beam.dm"
-#include "code\datums\browser.dm"
-#include "code\datums\callback.dm"
-#include "code\datums\chatmessage.dm"
-#include "code\datums\cinematic.dm"
-#include "code\datums\dash_weapon.dm"
-#include "code\datums\datacore.dm"
-#include "code\datums\datum.dm"
-#include "code\datums\datumvars.dm"
-#include "code\datums\dna.dm"
-#include "code\datums\dog_fashion.dm"
-#include "code\datums\embedding_behavior.dm"
-#include "code\datums\emotes.dm"
-#include "code\datums\ert.dm"
-#include "code\datums\explosion.dm"
-#include "code\datums\forced_movement.dm"
-#include "code\datums\holocall.dm"
-#include "code\datums\http.dm"
-#include "code\datums\hud.dm"
-#include "code\datums\map_config.dm"
-#include "code\datums\martial.dm"
-#include "code\datums\mind.dm"
-#include "code\datums\mutable_appearance.dm"
-#include "code\datums\numbered_display.dm"
-#include "code\datums\outfit.dm"
-#include "code\datums\position_point_vector.dm"
-#include "code\datums\profiling.dm"
-#include "code\datums\progressbar.dm"
-#include "code\datums\radiation_wave.dm"
-#include "code\datums\recipe.dm"
-#include "code\datums\ruins.dm"
-#include "code\datums\saymode.dm"
-#include "code\datums\shuttles.dm"
-#include "code\datums\soullink.dm"
-#include "code\datums\spawners_menu.dm"
-#include "code\datums\verbs.dm"
-#include "code\datums\weakrefs.dm"
-#include "code\datums\world_topic.dm"
-#include "code\datums\actions\beam_rifle.dm"
-#include "code\datums\actions\ninja.dm"
-#include "code\datums\brain_damage\brain_trauma.dm"
-#include "code\datums\brain_damage\hypnosis.dm"
-#include "code\datums\brain_damage\imaginary_friend.dm"
-#include "code\datums\brain_damage\mild.dm"
-#include "code\datums\brain_damage\phobia.dm"
-#include "code\datums\brain_damage\severe.dm"
-#include "code\datums\brain_damage\special.dm"
-#include "code\datums\brain_damage\split_personality.dm"
-#include "code\datums\components\_component.dm"
-#include "code\datums\components\anti_magic.dm"
-#include "code\datums\components\armor_plate.dm"
-#include "code\datums\components\bouncy.dm"
-#include "code\datums\components\butchering.dm"
-#include "code\datums\components\caltrop.dm"
-#include "code\datums\components\chasm.dm"
-#include "code\datums\components\construction.dm"
-#include "code\datums\components\decal.dm"
-#include "code\datums\components\earprotection.dm"
-#include "code\datums\components\edit_complainer.dm"
-#include "code\datums\components\empprotection.dm"
-#include "code\datums\components\footstep.dm"
-#include "code\datums\components\forced_gravity.dm"
-#include "code\datums\components\infective.dm"
-#include "code\datums\components\jousting.dm"
-#include "code\datums\components\knockoff.dm"
-#include "code\datums\components\lockon_aiming.dm"
-#include "code\datums\components\magnetic_catch.dm"
-#include "code\datums\components\material_container.dm"
-#include "code\datums\components\mirage_border.dm"
-#include "code\datums\components\mood.dm"
-#include "code\datums\components\nanites.dm"
-#include "code\datums\components\ntnet_interface.dm"
-#include "code\datums\components\orbiter.dm"
-#include "code\datums\components\paintable.dm"
-#include "code\datums\components\rad_insulation.dm"
-#include "code\datums\components\radioactive.dm"
-#include "code\datums\components\remote_materials.dm"
-#include "code\datums\components\riding.dm"
-#include "code\datums\components\rotation.dm"
-#include "code\datums\components\signal_redirect.dm"
-#include "code\datums\components\sizzle.dm"
-#include "code\datums\components\slippery.dm"
-#include "code\datums\components\spawner.dm"
-#include "code\datums\components\spooky.dm"
-#include "code\datums\components\squeak.dm"
-#include "code\datums\components\stationloving.dm"
-#include "code\datums\components\swarming.dm"
-#include "code\datums\components\thermite.dm"
-#include "code\datums\components\twitch_plays.dm"
-#include "code\datums\components\uplink.dm"
-#include "code\datums\components\wearertargeting.dm"
-#include "code\datums\components\wet_floor.dm"
-#include "code\datums\components\crafting\craft.dm"
-#include "code\datums\components\crafting\guncrafting.dm"
-#include "code\datums\components\crafting\recipes.dm"
-#include "code\datums\components\crafting\recipes\recipes_clothing.dm"
-#include "code\datums\components\crafting\recipes\recipes_misc.dm"
-#include "code\datums\components\crafting\recipes\recipes_primal.dm"
-#include "code\datums\components\crafting\recipes\recipes_robot.dm"
-#include "code\datums\components\crafting\recipes\recipes_weapon_and_ammo.dm"
-#include "code\datums\components\storage\storage.dm"
-#include "code\datums\components\storage\concrete\_concrete.dm"
-#include "code\datums\components\storage\concrete\bag_of_holding.dm"
-#include "code\datums\components\storage\concrete\bluespace.dm"
-#include "code\datums\components\storage\concrete\emergency.dm"
-#include "code\datums\components\storage\concrete\implant.dm"
-#include "code\datums\components\storage\concrete\pockets.dm"
-#include "code\datums\components\storage\concrete\rped.dm"
-#include "code\datums\components\storage\concrete\special.dm"
-#include "code\datums\components\storage\concrete\stack.dm"
-#include "code\datums\diseases\_disease.dm"
-#include "code\datums\diseases\_MobProcs.dm"
-#include "code\datums\diseases\anxiety.dm"
-#include "code\datums\diseases\appendicitis.dm"
-#include "code\datums\diseases\beesease.dm"
-#include "code\datums\diseases\brainrot.dm"
-#include "code\datums\diseases\cold.dm"
-#include "code\datums\diseases\cold9.dm"
-#include "code\datums\diseases\dna_spread.dm"
-#include "code\datums\diseases\fake_gbs.dm"
-#include "code\datums\diseases\flu.dm"
-#include "code\datums\diseases\fluspanish.dm"
-#include "code\datums\diseases\gbs.dm"
-#include "code\datums\diseases\heart_failure.dm"
-#include "code\datums\diseases\magnitis.dm"
-#include "code\datums\diseases\parrotpossession.dm"
-#include "code\datums\diseases\pierrot_throat.dm"
-#include "code\datums\diseases\retrovirus.dm"
-#include "code\datums\diseases\rhumba_beat.dm"
-#include "code\datums\diseases\transformation.dm"
-#include "code\datums\diseases\tuberculosis.dm"
-#include "code\datums\diseases\wizarditis.dm"
-#include "code\datums\diseases\advance\advance.dm"
-#include "code\datums\diseases\advance\presets.dm"
-#include "code\datums\diseases\advance\symptoms\beard.dm"
-#include "code\datums\diseases\advance\symptoms\choking.dm"
-#include "code\datums\diseases\advance\symptoms\confusion.dm"
-#include "code\datums\diseases\advance\symptoms\cough.dm"
-#include "code\datums\diseases\advance\symptoms\deafness.dm"
-#include "code\datums\diseases\advance\symptoms\dizzy.dm"
-#include "code\datums\diseases\advance\symptoms\fever.dm"
-#include "code\datums\diseases\advance\symptoms\fire.dm"
-#include "code\datums\diseases\advance\symptoms\flesh_eating.dm"
-#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
-#include "code\datums\diseases\advance\symptoms\headache.dm"
-#include "code\datums\diseases\advance\symptoms\heal.dm"
-#include "code\datums\diseases\advance\symptoms\itching.dm"
-#include "code\datums\diseases\advance\symptoms\nanites.dm"
-#include "code\datums\diseases\advance\symptoms\narcolepsy.dm"
-#include "code\datums\diseases\advance\symptoms\oxygen.dm"
-#include "code\datums\diseases\advance\symptoms\sensory.dm"
-#include "code\datums\diseases\advance\symptoms\shedding.dm"
-#include "code\datums\diseases\advance\symptoms\shivering.dm"
-#include "code\datums\diseases\advance\symptoms\skin.dm"
-#include "code\datums\diseases\advance\symptoms\sneeze.dm"
-#include "code\datums\diseases\advance\symptoms\species.dm"
-#include "code\datums\diseases\advance\symptoms\symptoms.dm"
-#include "code\datums\diseases\advance\symptoms\viral.dm"
-#include "code\datums\diseases\advance\symptoms\vision.dm"
-#include "code\datums\diseases\advance\symptoms\voice_change.dm"
-#include "code\datums\diseases\advance\symptoms\vomit.dm"
-#include "code\datums\diseases\advance\symptoms\weight.dm"
-#include "code\datums\diseases\advance\symptoms\youth.dm"
-#include "code\datums\elements\_element.dm"
-#include "code\datums\elements\bed_tucking.dm"
-#include "code\datums\elements\cleaning.dm"
-#include "code\datums\elements\earhealing.dm"
-#include "code\datums\elements\flavor_text.dm"
-#include "code\datums\elements\ghost_role_eligibility.dm"
-#include "code\datums\elements\mob_holder.dm"
-#include "code\datums\elements\swimming.dm"
-#include "code\datums\elements\wuv.dm"
-#include "code\datums\helper_datums\events.dm"
-#include "code\datums\helper_datums\getrev.dm"
-#include "code\datums\helper_datums\icon_snapshot.dm"
-#include "code\datums\helper_datums\teleport.dm"
-#include "code\datums\helper_datums\topic_input.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\weather.dm"
-#include "code\datums\martial\boxing.dm"
-#include "code\datums\martial\cqc.dm"
-#include "code\datums\martial\krav_maga.dm"
-#include "code\datums\martial\mushpunch.dm"
-#include "code\datums\martial\plasma_fist.dm"
-#include "code\datums\martial\psychotic_brawl.dm"
-#include "code\datums\martial\sleeping_carp.dm"
-#include "code\datums\martial\wrestling.dm"
-#include "code\datums\mood_events\beauty_events.dm"
-#include "code\datums\mood_events\drink_events.dm"
-#include "code\datums\mood_events\drug_events.dm"
-#include "code\datums\mood_events\generic_negative_events.dm"
-#include "code\datums\mood_events\generic_positive_events.dm"
-#include "code\datums\mood_events\mood_event.dm"
-#include "code\datums\mood_events\needs_events.dm"
-#include "code\datums\mutations\_mutations.dm"
-#include "code\datums\mutations\actions.dm"
-#include "code\datums\mutations\antenna.dm"
-#include "code\datums\mutations\body.dm"
-#include "code\datums\mutations\chameleon.dm"
-#include "code\datums\mutations\cold_resistance.dm"
-#include "code\datums\mutations\combined.dm"
-#include "code\datums\mutations\hulk.dm"
-#include "code\datums\mutations\radioactive.dm"
-#include "code\datums\mutations\sight.dm"
-#include "code\datums\mutations\speech.dm"
-#include "code\datums\mutations\telekinesis.dm"
-#include "code\datums\ruins\lavaland.dm"
-#include "code\datums\ruins\space.dm"
-#include "code\datums\ruins\station.dm"
-#include "code\datums\status_effects\buffs.dm"
-#include "code\datums\status_effects\debuffs.dm"
-#include "code\datums\status_effects\gas.dm"
-#include "code\datums\status_effects\neutral.dm"
-#include "code\datums\status_effects\status_effect.dm"
-#include "code\datums\traits\_quirk.dm"
-#include "code\datums\traits\good.dm"
-#include "code\datums\traits\negative.dm"
-#include "code\datums\traits\neutral.dm"
-#include "code\datums\weather\weather.dm"
-#include "code\datums\weather\weather_types\acid_rain.dm"
-#include "code\datums\weather\weather_types\ash_storm.dm"
-#include "code\datums\weather\weather_types\floor_is_lava.dm"
-#include "code\datums\weather\weather_types\layenia.dm"
-#include "code\datums\weather\weather_types\radiation_storm.dm"
-#include "code\datums\weather\weather_types\snow_storm.dm"
-#include "code\datums\wires\_wires.dm"
-#include "code\datums\wires\airalarm.dm"
-#include "code\datums\wires\airlock.dm"
-#include "code\datums\wires\apc.dm"
-#include "code\datums\wires\autolathe.dm"
-#include "code\datums\wires\emitter.dm"
-#include "code\datums\wires\explosive.dm"
-#include "code\datums\wires\microwave.dm"
-#include "code\datums\wires\mulebot.dm"
-#include "code\datums\wires\particle_accelerator.dm"
-#include "code\datums\wires\r_n_d.dm"
-#include "code\datums\wires\radio.dm"
-#include "code\datums\wires\robot.dm"
-#include "code\datums\wires\suit_storage_unit.dm"
-#include "code\datums\wires\syndicatebomb.dm"
-#include "code\datums\wires\tesla_coil.dm"
-#include "code\datums\wires\vending.dm"
-#include "code\game\alternate_appearance.dm"
-#include "code\game\atoms.dm"
-#include "code\game\atoms_movable.dm"
-#include "code\game\communications.dm"
-#include "code\game\data_huds.dm"
-#include "code\game\say.dm"
-#include "code\game\shuttle_engines.dm"
-#include "code\game\sound.dm"
-#include "code\game\world.dm"
-#include "code\game\area\ai_monitored.dm"
-#include "code\game\area\areas.dm"
-#include "code\game\area\Space_Station_13_areas.dm"
-#include "code\game\area\areas\away_content.dm"
-#include "code\game\area\areas\centcom.dm"
-#include "code\game\area\areas\holodeck.dm"
-#include "code\game\area\areas\layenia.dm"
-#include "code\game\area\areas\mining.dm"
-#include "code\game\area\areas\shuttles.dm"
-#include "code\game\area\areas\ruins\_ruins.dm"
-#include "code\game\area\areas\ruins\lavaland.dm"
-#include "code\game\area\areas\ruins\space.dm"
-#include "code\game\area\areas\ruins\templates.dm"
-#include "code\game\gamemodes\events.dm"
-#include "code\game\gamemodes\game_mode.dm"
-#include "code\game\gamemodes\objective.dm"
-#include "code\game\gamemodes\objective_items.dm"
-#include "code\game\gamemodes\bloodsucker\bloodsucker.dm"
-#include "code\game\gamemodes\bloodsucker\hunter.dm"
-#include "code\game\gamemodes\brother\traitor_bro.dm"
-#include "code\game\gamemodes\changeling\changeling.dm"
-#include "code\game\gamemodes\changeling\traitor_chan.dm"
-#include "code\game\gamemodes\clock_cult\clock_cult.dm"
-#include "code\game\gamemodes\clown_ops\bananium_bomb.dm"
-#include "code\game\gamemodes\clown_ops\clown_ops.dm"
-#include "code\game\gamemodes\clown_ops\clown_weapons.dm"
-#include "code\game\gamemodes\cult\cult.dm"
-#include "code\game\gamemodes\devil\devil_game_mode.dm"
-#include "code\game\gamemodes\devil\game_mode.dm"
-#include "code\game\gamemodes\devil\objectives.dm"
-#include "code\game\gamemodes\devil\devil agent\devil_agent.dm"
-#include "code\game\gamemodes\dynamic\dynamic.dm"
-#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm"
-#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm"
-#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm"
-#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm"
-#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm"
-#include "code\game\gamemodes\extended\extended.dm"
-#include "code\game\gamemodes\meteor\meteor.dm"
-#include "code\game\gamemodes\meteor\meteors.dm"
-#include "code\game\gamemodes\monkey\monkey.dm"
-#include "code\game\gamemodes\nuclear\nuclear.dm"
-#include "code\game\gamemodes\overthrow\objective.dm"
-#include "code\game\gamemodes\overthrow\overthrow.dm"
-#include "code\game\gamemodes\revolution\revolution.dm"
-#include "code\game\gamemodes\sandbox\airlock_maker.dm"
-#include "code\game\gamemodes\sandbox\h_sandbox.dm"
-#include "code\game\gamemodes\sandbox\sandbox.dm"
-#include "code\game\gamemodes\traitor\double_agents.dm"
-#include "code\game\gamemodes\traitor\traitor.dm"
-#include "code\game\gamemodes\wizard\wizard.dm"
-#include "code\game\machinery\_machinery.dm"
-#include "code\game\machinery\ai_slipper.dm"
-#include "code\game\machinery\airlock_control.dm"
-#include "code\game\machinery\announcement_system.dm"
-#include "code\game\machinery\aug_manipulator.dm"
-#include "code\game\machinery\autolathe.dm"
-#include "code\game\machinery\bank_machine.dm"
-#include "code\game\machinery\Beacon.dm"
-#include "code\game\machinery\bloodbankgen.dm"
-#include "code\game\machinery\buttons.dm"
-#include "code\game\machinery\cell_charger.dm"
-#include "code\game\machinery\cloning.dm"
-#include "code\game\machinery\constructable_frame.dm"
-#include "code\game\machinery\dance_machine.dm"
-#include "code\game\machinery\defibrillator_mount.dm"
-#include "code\game\machinery\deployable.dm"
-#include "code\game\machinery\dish_drive.dm"
-#include "code\game\machinery\dna_scanner.dm"
-#include "code\game\machinery\doppler_array.dm"
-#include "code\game\machinery\droneDispenser.dm"
-#include "code\game\machinery\exp_cloner.dm"
-#include "code\game\machinery\firealarm.dm"
-#include "code\game\machinery\flasher.dm"
-#include "code\game\machinery\gulag_item_reclaimer.dm"
-#include "code\game\machinery\gulag_teleporter.dm"
-#include "code\game\machinery\harvester.dm"
-#include "code\game\machinery\hologram.dm"
-#include "code\game\machinery\igniter.dm"
-#include "code\game\machinery\iv_drip.dm"
-#include "code\game\machinery\launch_pad.dm"
-#include "code\game\machinery\lightswitch.dm"
-#include "code\game\machinery\limbgrower.dm"
-#include "code\game\machinery\magnet.dm"
-#include "code\game\machinery\mass_driver.dm"
-#include "code\game\machinery\navbeacon.dm"
-#include "code\game\machinery\newscaster.dm"
-#include "code\game\machinery\PDApainter.dm"
-#include "code\game\machinery\posi_alert.dm"
-#include "code\game\machinery\quantum_pad.dm"
-#include "code\game\machinery\recharger.dm"
-#include "code\game\machinery\rechargestation.dm"
-#include "code\game\machinery\recycler.dm"
-#include "code\game\machinery\requests_console.dm"
-#include "code\game\machinery\shieldgen.dm"
-#include "code\game\machinery\Sleeper.dm"
-#include "code\game\machinery\slotmachine.dm"
-#include "code\game\machinery\spaceheater.dm"
-#include "code\game\machinery\stasis.dm"
-#include "code\game\machinery\status_display.dm"
-#include "code\game\machinery\suit_storage_unit.dm"
-#include "code\game\machinery\syndicatebeacon.dm"
-#include "code\game\machinery\syndicatebomb.dm"
-#include "code\game\machinery\teleporter.dm"
-#include "code\game\machinery\transformer.dm"
-#include "code\game\machinery\washing_machine.dm"
-#include "code\game\machinery\wishgranter.dm"
-#include "code\game\machinery\camera\camera.dm"
-#include "code\game\machinery\camera\camera_assembly.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\_computer.dm"
-#include "code\game\machinery\computer\aifixer.dm"
-#include "code\game\machinery\computer\apc_control.dm"
-#include "code\game\machinery\computer\arcade.dm"
-#include "code\game\machinery\computer\atmos_alert.dm"
-#include "code\game\machinery\computer\atmos_control.dm"
-#include "code\game\machinery\computer\buildandrepair.dm"
-#include "code\game\machinery\computer\camera.dm"
-#include "code\game\machinery\computer\camera_advanced.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\crew.dm"
-#include "code\game\machinery\computer\dna_console.dm"
-#include "code\game\machinery\computer\launchpad_control.dm"
-#include "code\game\machinery\computer\law.dm"
-#include "code\game\machinery\computer\medical.dm"
-#include "code\game\machinery\computer\Operating.dm"
-#include "code\game\machinery\computer\pod.dm"
-#include "code\game\machinery\computer\robot.dm"
-#include "code\game\machinery\computer\security.dm"
-#include "code\game\machinery\computer\station_alert.dm"
-#include "code\game\machinery\computer\telecrystalconsoles.dm"
-#include "code\game\machinery\computer\teleporter.dm"
-#include "code\game\machinery\computer\arcade\battle.dm"
-#include "code\game\machinery\computer\arcade\minesweeper.dm"
-#include "code\game\machinery\computer\arcade\misc_arcade.dm"
-#include "code\game\machinery\computer\arcade\orion_trail.dm"
-#include "code\game\machinery\computer\prisoner\_prisoner.dm"
-#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm"
-#include "code\game\machinery\computer\prisoner\management.dm"
-#include "code\game\machinery\doors\airlock.dm"
-#include "code\game\machinery\doors\airlock_electronics.dm"
-#include "code\game\machinery\doors\airlock_types.dm"
-#include "code\game\machinery\doors\alarmlock.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\firedoor.dm"
-#include "code\game\machinery\doors\passworddoor.dm"
-#include "code\game\machinery\doors\poddoor.dm"
-#include "code\game\machinery\doors\shutters.dm"
-#include "code\game\machinery\doors\unpowered.dm"
-#include "code\game\machinery\doors\windowdoor.dm"
-#include "code\game\machinery\embedded_controller\access_controller.dm"
-#include "code\game\machinery\embedded_controller\airlock_controller.dm"
-#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
-#include "code\game\machinery\embedded_controller\simple_vent_controller.dm"
-#include "code\game\machinery\pipe\construction.dm"
-#include "code\game\machinery\pipe\pipe_dispenser.dm"
-#include "code\game\machinery\porta_turret\portable_turret.dm"
-#include "code\game\machinery\porta_turret\portable_turret_construct.dm"
-#include "code\game\machinery\porta_turret\portable_turret_cover.dm"
-#include "code\game\machinery\poweredfans\fan_assembly.dm"
-#include "code\game\machinery\poweredfans\poweredfans.dm"
-#include "code\game\machinery\telecomms\broadcasting.dm"
-#include "code\game\machinery\telecomms\machine_interactions.dm"
-#include "code\game\machinery\telecomms\telecomunications.dm"
-#include "code\game\machinery\telecomms\computers\logbrowser.dm"
-#include "code\game\machinery\telecomms\computers\message.dm"
-#include "code\game\machinery\telecomms\computers\telemonitor.dm"
-#include "code\game\machinery\telecomms\machines\allinone.dm"
-#include "code\game\machinery\telecomms\machines\broadcaster.dm"
-#include "code\game\machinery\telecomms\machines\bus.dm"
-#include "code\game\machinery\telecomms\machines\hub.dm"
-#include "code\game\machinery\telecomms\machines\message_server.dm"
-#include "code\game\machinery\telecomms\machines\processor.dm"
-#include "code\game\machinery\telecomms\machines\receiver.dm"
-#include "code\game\machinery\telecomms\machines\relay.dm"
-#include "code\game\machinery\telecomms\machines\server.dm"
-#include "code\game\mecha\mech_bay.dm"
-#include "code\game\mecha\mech_fabricator.dm"
-#include "code\game\mecha\mecha.dm"
-#include "code\game\mecha\mecha_actions.dm"
-#include "code\game\mecha\mecha_construction_paths.dm"
-#include "code\game\mecha\mecha_control_console.dm"
-#include "code\game\mecha\mecha_defense.dm"
-#include "code\game\mecha\mecha_parts.dm"
-#include "code\game\mecha\mecha_topic.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\gygax.dm"
-#include "code\game\mecha\combat\honker.dm"
-#include "code\game\mecha\combat\marauder.dm"
-#include "code\game\mecha\combat\neovgre.dm"
-#include "code\game\mecha\combat\phazon.dm"
-#include "code\game\mecha\combat\reticence.dm"
-#include "code\game\mecha\equipment\mecha_equipment.dm"
-#include "code\game\mecha\equipment\tools\medical_tools.dm"
-#include "code\game\mecha\equipment\tools\mining_tools.dm"
-#include "code\game\mecha\equipment\tools\other_tools.dm"
-#include "code\game\mecha\equipment\tools\work_tools.dm"
-#include "code\game\mecha\equipment\weapons\weapons.dm"
-#include "code\game\mecha\medical\medical.dm"
-#include "code\game\mecha\medical\odysseus.dm"
-#include "code\game\mecha\working\ripley.dm"
-#include "code\game\mecha\working\working.dm"
-#include "code\game\objects\buckling.dm"
-#include "code\game\objects\empulse.dm"
-#include "code\game\objects\items.dm"
-#include "code\game\objects\obj_defense.dm"
-#include "code\game\objects\objs.dm"
-#include "code\game\objects\structures.dm"
-#include "code\game\objects\effects\alien_acid.dm"
-#include "code\game\objects\effects\anomalies.dm"
-#include "code\game\objects\effects\blessing.dm"
-#include "code\game\objects\effects\bump_teleporter.dm"
-#include "code\game\objects\effects\contraband.dm"
-#include "code\game\objects\effects\countdown.dm"
-#include "code\game\objects\effects\effects.dm"
-#include "code\game\objects\effects\forcefields.dm"
-#include "code\game\objects\effects\glowshroom.dm"
-#include "code\game\objects\effects\landmarks.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\proximity.dm"
-#include "code\game\objects\effects\spiders.dm"
-#include "code\game\objects\effects\step_triggers.dm"
-#include "code\game\objects\effects\wanted_poster.dm"
-#include "code\game\objects\effects\decals\cleanable.dm"
-#include "code\game\objects\effects\decals\crayon.dm"
-#include "code\game\objects\effects\decals\decal.dm"
-#include "code\game\objects\effects\decals\misc.dm"
-#include "code\game\objects\effects\decals\remains.dm"
-#include "code\game\objects\effects\decals\cleanable\aliens.dm"
-#include "code\game\objects\effects\decals\cleanable\gibs.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\turfdecal\dirt.dm"
-#include "code\game\objects\effects\decals\turfdecal\markings.dm"
-#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm"
-#include "code\game\objects\effects\decals\turfdecal\weather.dm"
-#include "code\game\objects\effects\effect_system\effect_system.dm"
-#include "code\game\objects\effects\effect_system\effects_explosion.dm"
-#include "code\game\objects\effects\effect_system\effects_foam.dm"
-#include "code\game\objects\effects\effect_system\effects_other.dm"
-#include "code\game\objects\effects\effect_system\effects_smoke.dm"
-#include "code\game\objects\effects\effect_system\effects_sparks.dm"
-#include "code\game\objects\effects\effect_system\effects_water.dm"
-#include "code\game\objects\effects\spawners\bombspawner.dm"
-#include "code\game\objects\effects\spawners\bundle.dm"
-#include "code\game\objects\effects\spawners\gibspawner.dm"
-#include "code\game\objects\effects\spawners\lootdrop.dm"
-#include "code\game\objects\effects\spawners\structure.dm"
-#include "code\game\objects\effects\spawners\traps.dm"
-#include "code\game\objects\effects\spawners\vaultspawner.dm"
-#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm"
-#include "code\game\objects\effects\temporary_visuals\clockcult.dm"
-#include "code\game\objects\effects\temporary_visuals\cult.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\AI_modules.dm"
-#include "code\game\objects\items\airlock_painter.dm"
-#include "code\game\objects\items\apc_frame.dm"
-#include "code\game\objects\items\blueprints.dm"
-#include "code\game\objects\items\body_egg.dm"
-#include "code\game\objects\items\bodybag.dm"
-#include "code\game\objects\items\candle.dm"
-#include "code\game\objects\items\cardboard_cutouts.dm"
-#include "code\game\objects\items\cards_ids.dm"
-#include "code\game\objects\items\charter.dm"
-#include "code\game\objects\items\chromosome.dm"
-#include "code\game\objects\items\chrono_eraser.dm"
-#include "code\game\objects\items\cigs_lighters.dm"
-#include "code\game\objects\items\clown_items.dm"
-#include "code\game\objects\items\control_wand.dm"
-#include "code\game\objects\items\cosmetics.dm"
-#include "code\game\objects\items\courtroom.dm"
-#include "code\game\objects\items\crayons.dm"
-#include "code\game\objects\items\defib.dm"
-#include "code\game\objects\items\dehy_carp.dm"
-#include "code\game\objects\items\dice.dm"
-#include "code\game\objects\items\dna_injector.dm"
-#include "code\game\objects\items\documents.dm"
-#include "code\game\objects\items\eightball.dm"
-#include "code\game\objects\items\extinguisher.dm"
-#include "code\game\objects\items\flamethrower.dm"
-#include "code\game\objects\items\gift.dm"
-#include "code\game\objects\items\granters.dm"
-#include "code\game\objects\items\handcuffs.dm"
-#include "code\game\objects\items\his_grace.dm"
-#include "code\game\objects\items\holosign_creator.dm"
-#include "code\game\objects\items\holy_weapons.dm"
-#include "code\game\objects\items\hot_potato.dm"
-#include "code\game\objects\items\inducer.dm"
-#include "code\game\objects\items\kitchen.dm"
-#include "code\game\objects\items\latexballoon.dm"
-#include "code\game\objects\items\lorebooks.dm"
-#include "code\game\objects\items\manuals.dm"
-#include "code\game\objects\items\mesmetron.dm"
-#include "code\game\objects\items\miscellaneous.dm"
-#include "code\game\objects\items\mop.dm"
-#include "code\game\objects\items\paint.dm"
-#include "code\game\objects\items\paiwire.dm"
-#include "code\game\objects\items\pet_carrier.dm"
-#include "code\game\objects\items\pinpointer.dm"
-#include "code\game\objects\items\plushes.dm"
-#include "code\game\objects\items\pneumaticCannon.dm"
-#include "code\game\objects\items\powerfist.dm"
-#include "code\game\objects\items\RCD.dm"
-#include "code\game\objects\items\RCL.dm"
-#include "code\game\objects\items\religion.dm"
-#include "code\game\objects\items\RPD.dm"
-#include "code\game\objects\items\RSF.dm"
-#include "code\game\objects\items\scrolls.dm"
-#include "code\game\objects\items\sharpener.dm"
-#include "code\game\objects\items\shields.dm"
-#include "code\game\objects\items\shooting_range.dm"
-#include "code\game\objects\items\signs.dm"
-#include "code\game\objects\items\singularityhammer.dm"
-#include "code\game\objects\items\stunbaton.dm"
-#include "code\game\objects\items\taster.dm"
-#include "code\game\objects\items\teleportation.dm"
-#include "code\game\objects\items\teleprod.dm"
-#include "code\game\objects\items\theft_tools.dm"
-#include "code\game\objects\items\toys.dm"
-#include "code\game\objects\items\trash.dm"
-#include "code\game\objects\items\twohanded.dm"
-#include "code\game\objects\items\vending_items.dm"
-#include "code\game\objects\items\weaponry.dm"
-#include "code\game\objects\items\circuitboards\circuitboard.dm"
-#include "code\game\objects\items\circuitboards\computer_circuitboards.dm"
-#include "code\game\objects\items\circuitboards\machine_circuitboards.dm"
-#include "code\game\objects\items\devices\aicard.dm"
-#include "code\game\objects\items\devices\anomaly_neutralizer.dm"
-#include "code\game\objects\items\devices\beacon.dm"
-#include "code\game\objects\items\devices\camera_bug.dm"
-#include "code\game\objects\items\devices\chameleonproj.dm"
-#include "code\game\objects\items\devices\compressionkit.dm"
-#include "code\game\objects\items\devices\desynchronizer.dm"
-#include "code\game\objects\items\devices\dogborg_sleeper.dm"
-#include "code\game\objects\items\devices\doorCharge.dm"
-#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
-#include "code\game\objects\items\devices\flashlight.dm"
-#include "code\game\objects\items\devices\forcefieldprojector.dm"
-#include "code\game\objects\items\devices\geiger_counter.dm"
-#include "code\game\objects\items\devices\glue.dm"
-#include "code\game\objects\items\devices\gps.dm"
-#include "code\game\objects\items\devices\instruments.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\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\pressureplates.dm"
-#include "code\game\objects\items\devices\quantum_keycard.dm"
-#include "code\game\objects\items\devices\reverse_bear_trap.dm"
-#include "code\game\objects\items\devices\scanners.dm"
-#include "code\game\objects\items\devices\sensor_device.dm"
-#include "code\game\objects\items\devices\taperecorder.dm"
-#include "code\game\objects\items\devices\traitordevices.dm"
-#include "code\game\objects\items\devices\transfer_valve.dm"
-#include "code\game\objects\items\devices\PDA\cart.dm"
-#include "code\game\objects\items\devices\PDA\PDA.dm"
-#include "code\game\objects\items\devices\PDA\PDA_types.dm"
-#include "code\game\objects\items\devices\PDA\radio.dm"
-#include "code\game\objects\items\devices\PDA\virus_cart.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\headset.dm"
-#include "code\game\objects\items\devices\radio\intercom.dm"
-#include "code\game\objects\items\devices\radio\radio.dm"
-#include "code\game\objects\items\grenades\antigravity.dm"
-#include "code\game\objects\items\grenades\chem_grenade.dm"
-#include "code\game\objects\items\grenades\clusterbuster.dm"
-#include "code\game\objects\items\grenades\emgrenade.dm"
-#include "code\game\objects\items\grenades\flashbang.dm"
-#include "code\game\objects\items\grenades\ghettobomb.dm"
-#include "code\game\objects\items\grenades\grenade.dm"
-#include "code\game\objects\items\grenades\plastic.dm"
-#include "code\game\objects\items\grenades\smokebomb.dm"
-#include "code\game\objects\items\grenades\spawnergrenade.dm"
-#include "code\game\objects\items\grenades\syndieminibomb.dm"
-#include "code\game\objects\items\implants\implant.dm"
-#include "code\game\objects\items\implants\implant_abductor.dm"
-#include "code\game\objects\items\implants\implant_chem.dm"
-#include "code\game\objects\items\implants\implant_clown.dm"
-#include "code\game\objects\items\implants\implant_CQC.dm"
-#include "code\game\objects\items\implants\implant_exile.dm"
-#include "code\game\objects\items\implants\implant_explosive.dm"
-#include "code\game\objects\items\implants\implant_freedom.dm"
-#include "code\game\objects\items\implants\implant_krav_maga.dm"
-#include "code\game\objects\items\implants\implant_mindshield.dm"
-#include "code\game\objects\items\implants\implant_misc.dm"
-#include "code\game\objects\items\implants\implant_mushpunch.dm"
-#include "code\game\objects\items\implants\implant_plasmafist.dm"
-#include "code\game\objects\items\implants\implant_psychobrawl.dm"
-#include "code\game\objects\items\implants\implant_radio.dm"
-#include "code\game\objects\items\implants\implant_slave.dm"
-#include "code\game\objects\items\implants\implant_sleepingcarp.dm"
-#include "code\game\objects\items\implants\implant_spell.dm"
-#include "code\game\objects\items\implants\implant_stealth.dm"
-#include "code\game\objects\items\implants\implant_storage.dm"
-#include "code\game\objects\items\implants\implant_track.dm"
-#include "code\game\objects\items\implants\implant_uplink.dm"
-#include "code\game\objects\items\implants\implant_wrestling.dm"
-#include "code\game\objects\items\implants\implantcase.dm"
-#include "code\game\objects\items\implants\implantchair.dm"
-#include "code\game\objects\items\implants\implanter.dm"
-#include "code\game\objects\items\implants\implantpad.dm"
-#include "code\game\objects\items\melee\energy.dm"
-#include "code\game\objects\items\melee\misc.dm"
-#include "code\game\objects\items\melee\transforming.dm"
-#include "code\game\objects\items\robot\ai_upgrades.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\stacks\bscrystal.dm"
-#include "code\game\objects\items\stacks\cash.dm"
-#include "code\game\objects\items\stacks\medical.dm"
-#include "code\game\objects\items\stacks\rods.dm"
-#include "code\game\objects\items\stacks\stack.dm"
-#include "code\game\objects\items\stacks\telecrystal.dm"
-#include "code\game\objects\items\stacks\wrap.dm"
-#include "code\game\objects\items\stacks\sheets\glass.dm"
-#include "code\game\objects\items\stacks\sheets\leather.dm"
-#include "code\game\objects\items\stacks\sheets\light.dm"
-#include "code\game\objects\items\stacks\sheets\mineral.dm"
-#include "code\game\objects\items\stacks\sheets\sheet_types.dm"
-#include "code\game\objects\items\stacks\sheets\sheets.dm"
-#include "code\game\objects\items\stacks\tiles\light.dm"
-#include "code\game\objects\items\stacks\tiles\tile_mineral.dm"
-#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm"
-#include "code\game\objects\items\stacks\tiles\tile_types.dm"
-#include "code\game\objects\items\storage\backpack.dm"
-#include "code\game\objects\items\storage\bags.dm"
-#include "code\game\objects\items\storage\belt.dm"
-#include "code\game\objects\items\storage\book.dm"
-#include "code\game\objects\items\storage\boxes.dm"
-#include "code\game\objects\items\storage\briefcase.dm"
-#include "code\game\objects\items\storage\dakis.dm"
-#include "code\game\objects\items\storage\fancy.dm"
-#include "code\game\objects\items\storage\firstaid.dm"
-#include "code\game\objects\items\storage\lockbox.dm"
-#include "code\game\objects\items\storage\secure.dm"
-#include "code\game\objects\items\storage\storage.dm"
-#include "code\game\objects\items\storage\toolbox.dm"
-#include "code\game\objects\items\storage\uplink_kits.dm"
-#include "code\game\objects\items\storage\wallets.dm"
-#include "code\game\objects\items\tanks\jetpack.dm"
-#include "code\game\objects\items\tanks\tank_types.dm"
-#include "code\game\objects\items\tanks\tanks.dm"
-#include "code\game\objects\items\tanks\watertank.dm"
-#include "code\game\objects\items\tools\crowbar.dm"
-#include "code\game\objects\items\tools\screwdriver.dm"
-#include "code\game\objects\items\tools\weldingtool.dm"
-#include "code\game\objects\items\tools\wirecutters.dm"
-#include "code\game\objects\items\tools\wrench.dm"
-#include "code\game\objects\structures\ai_core.dm"
-#include "code\game\objects\structures\aliens.dm"
-#include "code\game\objects\structures\artstuff.dm"
-#include "code\game\objects\structures\barsigns.dm"
-#include "code\game\objects\structures\bedsheet_bin.dm"
-#include "code\game\objects\structures\destructible_structures.dm"
-#include "code\game\objects\structures\displaycase.dm"
-#include "code\game\objects\structures\divine.dm"
-#include "code\game\objects\structures\door_assembly.dm"
-#include "code\game\objects\structures\door_assembly_types.dm"
-#include "code\game\objects\structures\dresser.dm"
-#include "code\game\objects\structures\electricchair.dm"
-#include "code\game\objects\structures\extinguisher.dm"
-#include "code\game\objects\structures\false_walls.dm"
-#include "code\game\objects\structures\fence.dm"
-#include "code\game\objects\structures\fireaxe.dm"
-#include "code\game\objects\structures\fireplace.dm"
-#include "code\game\objects\structures\flora.dm"
-#include "code\game\objects\structures\fluff.dm"
-#include "code\game\objects\structures\ghost_role_spawners.dm"
-#include "code\game\objects\structures\girders.dm"
-#include "code\game\objects\structures\grille.dm"
-#include "code\game\objects\structures\guillotine.dm"
-#include "code\game\objects\structures\guncase.dm"
-#include "code\game\objects\structures\headpike.dm"
-#include "code\game\objects\structures\hivebot.dm"
-#include "code\game\objects\structures\holosign.dm"
-#include "code\game\objects\structures\janicart.dm"
-#include "code\game\objects\structures\kitchen_spike.dm"
-#include "code\game\objects\structures\ladders.dm"
-#include "code\game\objects\structures\lattice.dm"
-#include "code\game\objects\structures\life_candle.dm"
-#include "code\game\objects\structures\loom.dm"
-#include "code\game\objects\structures\manned_turret.dm"
-#include "code\game\objects\structures\medkit.dm"
-#include "code\game\objects\structures\memorial.dm"
-#include "code\game\objects\structures\mineral_doors.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\musician.dm"
-#include "code\game\objects\structures\noticeboard.dm"
-#include "code\game\objects\structures\petrified_statue.dm"
-#include "code\game\objects\structures\plasticflaps.dm"
-#include "code\game\objects\structures\reflector.dm"
-#include "code\game\objects\structures\safe.dm"
-#include "code\game\objects\structures\showcase.dm"
-#include "code\game\objects\structures\spawner.dm"
-#include "code\game\objects\structures\spirit_board.dm"
-#include "code\game\objects\structures\stairs.dm"
-#include "code\game\objects\structures\statues.dm"
-#include "code\game\objects\structures\table_frames.dm"
-#include "code\game\objects\structures\tables_racks.dm"
-#include "code\game\objects\structures\tank_dispenser.dm"
-#include "code\game\objects\structures\target_stake.dm"
-#include "code\game\objects\structures\traps.dm"
-#include "code\game\objects\structures\trash_piles.dm"
-#include "code\game\objects\structures\watercloset.dm"
-#include "code\game\objects\structures\windoor_assembly.dm"
-#include "code\game\objects\structures\window.dm"
-#include "code\game\objects\structures\beds_chairs\alien_nest.dm"
-#include "code\game\objects\structures\beds_chairs\bed.dm"
-#include "code\game\objects\structures\beds_chairs\chair.dm"
-#include "code\game\objects\structures\crates_lockers\closets.dm"
-#include "code\game\objects\structures\crates_lockers\crates.dm"
-#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
-#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.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\syndicate.dm"
-#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm"
-#include "code\game\objects\structures\crates_lockers\closets\wardrobe.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\engineering.dm"
-#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.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\misc.dm"
-#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm"
-#include "code\game\objects\structures\crates_lockers\closets\secure\psychology.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\crates\bins.dm"
-#include "code\game\objects\structures\crates_lockers\crates\critter.dm"
-#include "code\game\objects\structures\crates_lockers\crates\large.dm"
-#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
-#include "code\game\objects\structures\crates_lockers\crates\wooden.dm"
-#include "code\game\objects\structures\lavaland\necropolis_tendril.dm"
-#include "code\game\objects\structures\signs\_signs.dm"
-#include "code\game\objects\structures\signs\signs_departments.dm"
-#include "code\game\objects\structures\signs\signs_maps.dm"
-#include "code\game\objects\structures\signs\signs_plaques.dm"
-#include "code\game\objects\structures\signs\signs_warning.dm"
-#include "code\game\objects\structures\transit_tubes\station.dm"
-#include "code\game\objects\structures\transit_tubes\transit_tube.dm"
-#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm"
-#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm"
-#include "code\game\turfs\baseturf_skipover.dm"
-#include "code\game\turfs\change_turf.dm"
-#include "code\game\turfs\closed.dm"
-#include "code\game\turfs\open.dm"
-#include "code\game\turfs\turf.dm"
-#include "code\game\turfs\openspace\openspace.dm"
-#include "code\game\turfs\simulated\chasm.dm"
-#include "code\game\turfs\simulated\dirtystation.dm"
-#include "code\game\turfs\simulated\floor.dm"
-#include "code\game\turfs\simulated\lava.dm"
-#include "code\game\turfs\simulated\minerals.dm"
-#include "code\game\turfs\simulated\reebe_void.dm"
-#include "code\game\turfs\simulated\river.dm"
-#include "code\game\turfs\simulated\walls.dm"
-#include "code\game\turfs\simulated\water.dm"
-#include "code\game\turfs\simulated\floor\fancy_floor.dm"
-#include "code\game\turfs\simulated\floor\light_floor.dm"
-#include "code\game\turfs\simulated\floor\mineral_floor.dm"
-#include "code\game\turfs\simulated\floor\misc_floor.dm"
-#include "code\game\turfs\simulated\floor\plasteel_floor.dm"
-#include "code\game\turfs\simulated\floor\plating.dm"
-#include "code\game\turfs\simulated\floor\reinf_floor.dm"
-#include "code\game\turfs\simulated\floor\plating\asteroid.dm"
-#include "code\game\turfs\simulated\floor\plating\dirt.dm"
-#include "code\game\turfs\simulated\floor\plating\misc_plating.dm"
-#include "code\game\turfs\simulated\wall\mineral_walls.dm"
-#include "code\game\turfs\simulated\wall\misc_walls.dm"
-#include "code\game\turfs\simulated\wall\reinf_walls.dm"
-#include "code\game\turfs\space\space.dm"
-#include "code\game\turfs\space\transit.dm"
-#include "code\modules\admin\admin.dm"
-#include "code\modules\admin\admin_investigate.dm"
-#include "code\modules\admin\admin_ranks.dm"
-#include "code\modules\admin\admin_verbs.dm"
-#include "code\modules\admin\adminmenu.dm"
-#include "code\modules\admin\antag_panel.dm"
-#include "code\modules\admin\banjob.dm"
-#include "code\modules\admin\chat_commands.dm"
-#include "code\modules\admin\check_antagonists.dm"
-#include "code\modules\admin\create_mob.dm"
-#include "code\modules\admin\create_object.dm"
-#include "code\modules\admin\create_poll.dm"
-#include "code\modules\admin\create_turf.dm"
-#include "code\modules\admin\fun_balloon.dm"
-#include "code\modules\admin\holder2.dm"
-#include "code\modules\admin\ipintel.dm"
-#include "code\modules\admin\IsBanned.dm"
-#include "code\modules\admin\NewBan.dm"
-#include "code\modules\admin\permissionedit.dm"
-#include "code\modules\admin\player_panel.dm"
-#include "code\modules\admin\secrets.dm"
-#include "code\modules\admin\sound_emitter.dm"
-#include "code\modules\admin\sql_message_system.dm"
-#include "code\modules\admin\stickyban.dm"
-#include "code\modules\admin\topic.dm"
-#include "code\modules\admin\whitelist.dm"
-#include "code\modules\admin\DB_ban\functions.dm"
-#include "code\modules\admin\verbs\adminhelp.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\ak47s.dm"
-#include "code\modules\admin\verbs\atmosdebug.dm"
-#include "code\modules\admin\verbs\bluespacearty.dm"
-#include "code\modules\admin\verbs\borgpanel.dm"
-#include "code\modules\admin\verbs\BrokenInhands.dm"
-#include "code\modules\admin\verbs\cinematic.dm"
-#include "code\modules\admin\verbs\deadsay.dm"
-#include "code\modules\admin\verbs\debug.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\individual_logging.dm"
-#include "code\modules\admin\verbs\machine_upgrade.dm"
-#include "code\modules\admin\verbs\manipulate_organs.dm"
-#include "code\modules\admin\verbs\map_template_loadverb.dm"
-#include "code\modules\admin\verbs\mapping.dm"
-#include "code\modules\admin\verbs\maprotation.dm"
-#include "code\modules\admin\verbs\massmodvar.dm"
-#include "code\modules\admin\verbs\modifyvariables.dm"
-#include "code\modules\admin\verbs\one_click_antag.dm"
-#include "code\modules\admin\verbs\onlyone.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\reestablish_db_connection.dm"
-#include "code\modules\admin\verbs\spawnobjasmob.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\debug_variables.dm"
-#include "code\modules\antagonists\_common\antag_datum.dm"
-#include "code\modules\antagonists\_common\antag_helpers.dm"
-#include "code\modules\antagonists\_common\antag_hud.dm"
-#include "code\modules\antagonists\_common\antag_spawner.dm"
-#include "code\modules\antagonists\_common\antag_team.dm"
-#include "code\modules\antagonists\abductor\abductor.dm"
-#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm"
-#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm"
-#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm"
-#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm"
-#include "code\modules\antagonists\abductor\equipment\gland.dm"
-#include "code\modules\antagonists\abductor\machinery\camera.dm"
-#include "code\modules\antagonists\abductor\machinery\console.dm"
-#include "code\modules\antagonists\abductor\machinery\dispenser.dm"
-#include "code\modules\antagonists\abductor\machinery\experiment.dm"
-#include "code\modules\antagonists\abductor\machinery\pad.dm"
-#include "code\modules\antagonists\blob\blob.dm"
-#include "code\modules\antagonists\blob\blob\blob_report.dm"
-#include "code\modules\antagonists\blob\blob\overmind.dm"
-#include "code\modules\antagonists\blob\blob\powers.dm"
-#include "code\modules\antagonists\blob\blob\theblob.dm"
-#include "code\modules\antagonists\blob\blob\blobs\blob_mobs.dm"
-#include "code\modules\antagonists\blob\blob\blobs\core.dm"
-#include "code\modules\antagonists\blob\blob\blobs\factory.dm"
-#include "code\modules\antagonists\blob\blob\blobs\node.dm"
-#include "code\modules\antagonists\blob\blob\blobs\resource.dm"
-#include "code\modules\antagonists\blob\blob\blobs\shield.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm"
-#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm"
-#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm"
-#include "code\modules\antagonists\bloodsucker\datum_hunter.dm"
-#include "code\modules\antagonists\bloodsucker\datum_vassal.dm"
-#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm"
-#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm"
-#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm"
-#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm"
-#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_brawn.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm"
-#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm"
-#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm"
-#include "code\modules\antagonists\brainwashing\brainwashing.dm"
-#include "code\modules\antagonists\brother\brother.dm"
-#include "code\modules\antagonists\changeling\cellular_emporium.dm"
-#include "code\modules\antagonists\changeling\changeling.dm"
-#include "code\modules\antagonists\changeling\changeling_power.dm"
-#include "code\modules\antagonists\changeling\powers\absorb.dm"
-#include "code\modules\antagonists\changeling\powers\adrenaline.dm"
-#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm"
-#include "code\modules\antagonists\changeling\powers\biodegrade.dm"
-#include "code\modules\antagonists\changeling\powers\chameleon_skin.dm"
-#include "code\modules\antagonists\changeling\powers\digitalcamo.dm"
-#include "code\modules\antagonists\changeling\powers\fakedeath.dm"
-#include "code\modules\antagonists\changeling\powers\fleshmend.dm"
-#include "code\modules\antagonists\changeling\powers\headcrab.dm"
-#include "code\modules\antagonists\changeling\powers\hivemind.dm"
-#include "code\modules\antagonists\changeling\powers\humanform.dm"
-#include "code\modules\antagonists\changeling\powers\lesserform.dm"
-#include "code\modules\antagonists\changeling\powers\linglink.dm"
-#include "code\modules\antagonists\changeling\powers\mimic_voice.dm"
-#include "code\modules\antagonists\changeling\powers\mutations.dm"
-#include "code\modules\antagonists\changeling\powers\panacea.dm"
-#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm"
-#include "code\modules\antagonists\changeling\powers\regenerate.dm"
-#include "code\modules\antagonists\changeling\powers\revive.dm"
-#include "code\modules\antagonists\changeling\powers\shriek.dm"
-#include "code\modules\antagonists\changeling\powers\spiders.dm"
-#include "code\modules\antagonists\changeling\powers\strained_muscles.dm"
-#include "code\modules\antagonists\changeling\powers\tiny_prick.dm"
-#include "code\modules\antagonists\changeling\powers\transform.dm"
-#include "code\modules\antagonists\clockcult\clock_effect.dm"
-#include "code\modules\antagonists\clockcult\clock_item.dm"
-#include "code\modules\antagonists\clockcult\clock_mobs.dm"
-#include "code\modules\antagonists\clockcult\clock_scripture.dm"
-#include "code\modules\antagonists\clockcult\clock_structure.dm"
-#include "code\modules\antagonists\clockcult\clockcult.dm"
-#include "code\modules\antagonists\clockcult\clock_effects\city_of_cogs_rift.dm"
-#include "code\modules\antagonists\clockcult\clock_effects\clock_overlay.dm"
-#include "code\modules\antagonists\clockcult\clock_effects\clock_sigils.dm"
-#include "code\modules\antagonists\clockcult\clock_effects\general_markers.dm"
-#include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm"
-#include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm"
-#include "code\modules\antagonists\clockcult\clock_helpers\slab_abilities.dm"
-#include "code\modules\antagonists\clockcult\clock_items\clock_components.dm"
-#include "code\modules\antagonists\clockcult\clock_items\clockwork_armor.dm"
-#include "code\modules\antagonists\clockcult\clock_items\clockwork_slab.dm"
-#include "code\modules\antagonists\clockcult\clock_items\clockwork_weaponry.dm"
-#include "code\modules\antagonists\clockcult\clock_items\construct_chassis.dm"
-#include "code\modules\antagonists\clockcult\clock_items\integration_cog.dm"
-#include "code\modules\antagonists\clockcult\clock_items\judicial_visor.dm"
-#include "code\modules\antagonists\clockcult\clock_items\replica_fabricator.dm"
-#include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm"
-#include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm"
-#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm"
-#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm"
-#include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm"
-#include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm"
-#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm"
-#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm"
-#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm"
-#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm"
-#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm"
-#include "code\modules\antagonists\cult\blood_magic.dm"
-#include "code\modules\antagonists\cult\cult.dm"
-#include "code\modules\antagonists\cult\cult_comms.dm"
-#include "code\modules\antagonists\cult\cult_items.dm"
-#include "code\modules\antagonists\cult\cult_structures.dm"
-#include "code\modules\antagonists\cult\ritual.dm"
-#include "code\modules\antagonists\cult\rune_spawn_action.dm"
-#include "code\modules\antagonists\cult\runes.dm"
-#include "code\modules\antagonists\devil\devil.dm"
-#include "code\modules\antagonists\devil\devil_helpers.dm"
-#include "code\modules\antagonists\devil\imp\imp.dm"
-#include "code\modules\antagonists\devil\sintouched\objectives.dm"
-#include "code\modules\antagonists\devil\sintouched\sintouched.dm"
-#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
-#include "code\modules\antagonists\devil\true_devil\inventory.dm"
-#include "code\modules\antagonists\disease\disease_abilities.dm"
-#include "code\modules\antagonists\disease\disease_datum.dm"
-#include "code\modules\antagonists\disease\disease_disease.dm"
-#include "code\modules\antagonists\disease\disease_event.dm"
-#include "code\modules\antagonists\disease\disease_mob.dm"
-#include "code\modules\antagonists\ert\ert.dm"
-#include "code\modules\antagonists\greentext\greentext.dm"
-#include "code\modules\antagonists\greybois\greybois.dm"
-#include "code\modules\antagonists\highlander\highlander.dm"
-#include "code\modules\antagonists\monkey\monkey.dm"
-#include "code\modules\antagonists\morph\morph.dm"
-#include "code\modules\antagonists\morph\morph_antag.dm"
-#include "code\modules\antagonists\nightmare\nightmare.dm"
-#include "code\modules\antagonists\nightmare\nightmare_objectives.dm"
-#include "code\modules\antagonists\ninja\ninja.dm"
-#include "code\modules\antagonists\nukeop\clownop.dm"
-#include "code\modules\antagonists\nukeop\nukeop.dm"
-#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
-#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm"
-#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm"
-#include "code\modules\antagonists\official\official.dm"
-#include "code\modules\antagonists\overthrow\overthrow.dm"
-#include "code\modules\antagonists\overthrow\overthrow_converter.dm"
-#include "code\modules\antagonists\overthrow\overthrow_team.dm"
-#include "code\modules\antagonists\pirate\pirate.dm"
-#include "code\modules\antagonists\revenant\revenant.dm"
-#include "code\modules\antagonists\revenant\revenant_abilities.dm"
-#include "code\modules\antagonists\revenant\revenant_antag.dm"
-#include "code\modules\antagonists\revenant\revenant_blight.dm"
-#include "code\modules\antagonists\revenant\revenant_spawn_event.dm"
-#include "code\modules\antagonists\revolution\revolution.dm"
-#include "code\modules\antagonists\separatist\separatist.dm"
-#include "code\modules\antagonists\slaughter\slaughter.dm"
-#include "code\modules\antagonists\slaughter\slaughter_antag.dm"
-#include "code\modules\antagonists\slaughter\slaughterevent.dm"
-#include "code\modules\antagonists\survivalist\survivalist.dm"
-#include "code\modules\antagonists\swarmer\swarmer.dm"
-#include "code\modules\antagonists\swarmer\swarmer_event.dm"
-#include "code\modules\antagonists\traitor\datum_traitor.dm"
-#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm"
-#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm"
-#include "code\modules\antagonists\valentines\heartbreaker.dm"
-#include "code\modules\antagonists\valentines\valentine.dm"
-#include "code\modules\antagonists\wishgranter\wishgranter.dm"
-#include "code\modules\antagonists\wizard\wizard.dm"
-#include "code\modules\antagonists\wizard\equipment\artefact.dm"
-#include "code\modules\antagonists\wizard\equipment\soulstone.dm"
-#include "code\modules\antagonists\wizard\equipment\spellbook.dm"
-#include "code\modules\antagonists\xeno\xeno.dm"
-#include "code\modules\assembly\assembly.dm"
-#include "code\modules\assembly\bomb.dm"
-#include "code\modules\assembly\doorcontrol.dm"
-#include "code\modules\assembly\flash.dm"
-#include "code\modules\assembly\health.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\atmospherics\multiz.dm"
-#include "code\modules\atmospherics\environmental\LINDA_fire.dm"
-#include "code\modules\atmospherics\environmental\LINDA_system.dm"
-#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm"
-#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm"
-#include "code\modules\atmospherics\gasmixtures\gas_types.dm"
-#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm"
-#include "code\modules\atmospherics\gasmixtures\reactions.dm"
-#include "code\modules\atmospherics\machinery\airalarm.dm"
-#include "code\modules\atmospherics\machinery\atmosmachinery.dm"
-#include "code\modules\atmospherics\machinery\datum_pipeline.dm"
-#include "code\modules\atmospherics\machinery\components\components_base.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\binary_devices.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm"
-#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm"
-#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm"
-#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm"
-#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm"
-#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm"
-#include "code\modules\atmospherics\machinery\other\meter.dm"
-#include "code\modules\atmospherics\machinery\other\miner.dm"
-#include "code\modules\atmospherics\machinery\pipes\bluespace.dm"
-#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm"
-#include "code\modules\atmospherics\machinery\pipes\manifold.dm"
-#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm"
-#include "code\modules\atmospherics\machinery\pipes\mapping.dm"
-#include "code\modules\atmospherics\machinery\pipes\pipes.dm"
-#include "code\modules\atmospherics\machinery\pipes\simple.dm"
-#include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm"
-#include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm"
-#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm"
-#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm"
-#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm"
-#include "code\modules\atmospherics\machinery\portable\canister.dm"
-#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm"
-#include "code\modules\atmospherics\machinery\portable\pump.dm"
-#include "code\modules\atmospherics\machinery\portable\scrubber.dm"
-#include "code\modules\awaymissions\away_props.dm"
-#include "code\modules\awaymissions\bluespaceartillery.dm"
-#include "code\modules\awaymissions\capture_the_flag.dm"
-#include "code\modules\awaymissions\corpse.dm"
-#include "code\modules\awaymissions\exile.dm"
-#include "code\modules\awaymissions\gateway.dm"
-#include "code\modules\awaymissions\pamphlet.dm"
-#include "code\modules\awaymissions\signpost.dm"
-#include "code\modules\awaymissions\super_secret_room.dm"
-#include "code\modules\awaymissions\zlevel.dm"
-#include "code\modules\awaymissions\mission_code\Academy.dm"
-#include "code\modules\awaymissions\mission_code\Cabin.dm"
-#include "code\modules\awaymissions\mission_code\caves.dm"
-#include "code\modules\awaymissions\mission_code\centcomAway.dm"
-#include "code\modules\awaymissions\mission_code\challenge.dm"
-#include "code\modules\awaymissions\mission_code\jungleresort.dm"
-#include "code\modules\awaymissions\mission_code\moonoutpost19.dm"
-#include "code\modules\awaymissions\mission_code\murderdome.dm"
-#include "code\modules\awaymissions\mission_code\research.dm"
-#include "code\modules\awaymissions\mission_code\snowdin.dm"
-#include "code\modules\awaymissions\mission_code\spacebattle.dm"
-#include "code\modules\awaymissions\mission_code\stationCollision.dm"
-#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm"
-#include "code\modules\awaymissions\mission_code\wildwest.dm"
-#include "code\modules\bsql\includes.dm"
-#include "code\modules\buildmode\bm_mode.dm"
-#include "code\modules\buildmode\buildmode.dm"
-#include "code\modules\buildmode\buttons.dm"
-#include "code\modules\buildmode\effects\line.dm"
-#include "code\modules\buildmode\submodes\advanced.dm"
-#include "code\modules\buildmode\submodes\area_edit.dm"
-#include "code\modules\buildmode\submodes\basic.dm"
-#include "code\modules\buildmode\submodes\boom.dm"
-#include "code\modules\buildmode\submodes\copy.dm"
-#include "code\modules\buildmode\submodes\fill.dm"
-#include "code\modules\buildmode\submodes\mapgen.dm"
-#include "code\modules\buildmode\submodes\throwing.dm"
-#include "code\modules\buildmode\submodes\variable_edit.dm"
-#include "code\modules\cargo\bounty.dm"
-#include "code\modules\cargo\bounty_console.dm"
-#include "code\modules\cargo\centcom_podlauncher.dm"
-#include "code\modules\cargo\console.dm"
-#include "code\modules\cargo\export_scanner.dm"
-#include "code\modules\cargo\exports.dm"
-#include "code\modules\cargo\expressconsole.dm"
-#include "code\modules\cargo\gondolapod.dm"
-#include "code\modules\cargo\order.dm"
-#include "code\modules\cargo\packs.dm"
-#include "code\modules\cargo\supplypod.dm"
-#include "code\modules\cargo\supplypod_beacon.dm"
-#include "code\modules\cargo\bounties\assistant.dm"
-#include "code\modules\cargo\bounties\botany.dm"
-#include "code\modules\cargo\bounties\chef.dm"
-#include "code\modules\cargo\bounties\engineering.dm"
-#include "code\modules\cargo\bounties\item.dm"
-#include "code\modules\cargo\bounties\mech.dm"
-#include "code\modules\cargo\bounties\medical.dm"
-#include "code\modules\cargo\bounties\mining.dm"
-#include "code\modules\cargo\bounties\reagent.dm"
-#include "code\modules\cargo\bounties\science.dm"
-#include "code\modules\cargo\bounties\security.dm"
-#include "code\modules\cargo\bounties\slime.dm"
-#include "code\modules\cargo\bounties\special.dm"
-#include "code\modules\cargo\bounties\virus.dm"
-#include "code\modules\cargo\exports\food_wine.dm"
-#include "code\modules\cargo\exports\gear.dm"
-#include "code\modules\cargo\exports\large_objects.dm"
-#include "code\modules\cargo\exports\lewd.dm"
-#include "code\modules\cargo\exports\manifest.dm"
-#include "code\modules\cargo\exports\materials.dm"
-#include "code\modules\cargo\exports\organs_robotics.dm"
-#include "code\modules\cargo\exports\parts.dm"
-#include "code\modules\cargo\exports\seeds.dm"
-#include "code\modules\cargo\exports\sheets.dm"
-#include "code\modules\cargo\exports\tools.dm"
-#include "code\modules\cargo\exports\weapons.dm"
-#include "code\modules\cargo\packs\armory.dm"
-#include "code\modules\cargo\packs\costumes_toys.dm"
-#include "code\modules\cargo\packs\emergency.dm"
-#include "code\modules\cargo\packs\engine.dm"
-#include "code\modules\cargo\packs\engineering.dm"
-#include "code\modules\cargo\packs\livestock.dm"
-#include "code\modules\cargo\packs\materials.dm"
-#include "code\modules\cargo\packs\medical.dm"
-#include "code\modules\cargo\packs\misc.dm"
-#include "code\modules\cargo\packs\organic.dm"
-#include "code\modules\cargo\packs\science.dm"
-#include "code\modules\cargo\packs\security.dm"
-#include "code\modules\cargo\packs\service.dm"
-#include "code\modules\chatter\chatter.dm"
-#include "code\modules\client\asset_cache.dm"
-#include "code\modules\client\client_colour.dm"
-#include "code\modules\client\client_defines.dm"
-#include "code\modules\client\client_procs.dm"
-#include "code\modules\client\darkmode.dm"
-#include "code\modules\client\message.dm"
-#include "code\modules\client\player_details.dm"
-#include "code\modules\client\preferences.dm"
-#include "code\modules\client\preferences_savefile.dm"
-#include "code\modules\client\preferences_toggles.dm"
-#include "code\modules\client\preferences_vr.dm"
-#include "code\modules\client\verbs\aooc.dm"
-#include "code\modules\client\verbs\etips.dm"
-#include "code\modules\client\verbs\looc.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\ears\_ears.dm"
-#include "code\modules\clothing\glasses\_glasses.dm"
-#include "code\modules\clothing\glasses\engine_goggles.dm"
-#include "code\modules\clothing\glasses\hud.dm"
-#include "code\modules\clothing\glasses\vg_glasses.dm"
-#include "code\modules\clothing\gloves\_gloves.dm"
-#include "code\modules\clothing\gloves\boxing.dm"
-#include "code\modules\clothing\gloves\color.dm"
-#include "code\modules\clothing\gloves\miscellaneous.dm"
-#include "code\modules\clothing\gloves\ring.dm"
-#include "code\modules\clothing\gloves\vg_gloves.dm"
-#include "code\modules\clothing\head\_head.dm"
-#include "code\modules\clothing\head\beanie.dm"
-#include "code\modules\clothing\head\cit_hats.dm"
-#include "code\modules\clothing\head\collectable.dm"
-#include "code\modules\clothing\head\hardhat.dm"
-#include "code\modules\clothing\head\helmet.dm"
-#include "code\modules\clothing\head\jobs.dm"
-#include "code\modules\clothing\head\misc.dm"
-#include "code\modules\clothing\head\misc_special.dm"
-#include "code\modules\clothing\head\soft_caps.dm"
-#include "code\modules\clothing\head\vg_hats.dm"
-#include "code\modules\clothing\masks\_masks.dm"
-#include "code\modules\clothing\masks\boxing.dm"
-#include "code\modules\clothing\masks\breath.dm"
-#include "code\modules\clothing\masks\gasmask.dm"
-#include "code\modules\clothing\masks\hailer.dm"
-#include "code\modules\clothing\masks\miscellaneous.dm"
-#include "code\modules\clothing\masks\vg_masks.dm"
-#include "code\modules\clothing\neck\_neck.dm"
-#include "code\modules\clothing\outfits\ert.dm"
-#include "code\modules\clothing\outfits\event.dm"
-#include "code\modules\clothing\outfits\plasmaman.dm"
-#include "code\modules\clothing\outfits\standard.dm"
-#include "code\modules\clothing\outfits\vr.dm"
-#include "code\modules\clothing\outfits\vv_outfit.dm"
-#include "code\modules\clothing\shoes\_shoes.dm"
-#include "code\modules\clothing\shoes\bananashoes.dm"
-#include "code\modules\clothing\shoes\colour.dm"
-#include "code\modules\clothing\shoes\magboots.dm"
-#include "code\modules\clothing\shoes\miscellaneous.dm"
-#include "code\modules\clothing\shoes\taeclowndo.dm"
-#include "code\modules\clothing\shoes\vg_shoes.dm"
-#include "code\modules\clothing\spacesuits\_spacesuits.dm"
-#include "code\modules\clothing\spacesuits\chronosuit.dm"
-#include "code\modules\clothing\spacesuits\hardsuit.dm"
-#include "code\modules\clothing\spacesuits\miscellaneous.dm"
-#include "code\modules\clothing\spacesuits\plasmamen.dm"
-#include "code\modules\clothing\spacesuits\syndi.dm"
-#include "code\modules\clothing\spacesuits\vg_spess.dm"
-#include "code\modules\clothing\suits\_suits.dm"
-#include "code\modules\clothing\suits\armor.dm"
-#include "code\modules\clothing\suits\bio.dm"
-#include "code\modules\clothing\suits\cloaks.dm"
-#include "code\modules\clothing\suits\jobs.dm"
-#include "code\modules\clothing\suits\labcoat.dm"
-#include "code\modules\clothing\suits\miscellaneous.dm"
-#include "code\modules\clothing\suits\reactive_armour.dm"
-#include "code\modules\clothing\suits\toggles.dm"
-#include "code\modules\clothing\suits\utility.dm"
-#include "code\modules\clothing\suits\vg_suits.dm"
-#include "code\modules\clothing\suits\wiz_robe.dm"
-#include "code\modules\clothing\under\_under.dm"
-#include "code\modules\clothing\under\accessories.dm"
-#include "code\modules\clothing\under\color.dm"
-#include "code\modules\clothing\under\miscellaneous.dm"
-#include "code\modules\clothing\under\pants.dm"
-#include "code\modules\clothing\under\shorts.dm"
-#include "code\modules\clothing\under\syndicate.dm"
-#include "code\modules\clothing\under\trek.dm"
-#include "code\modules\clothing\under\vg_under.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\jobs\Plasmaman\civilian_service.dm"
-#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm"
-#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm"
-#include "code\modules\clothing\under\jobs\Plasmaman\security.dm"
-#include "code\modules\detectivework\detective_work.dm"
-#include "code\modules\detectivework\evidence.dm"
-#include "code\modules\detectivework\scanner.dm"
-#include "code\modules\emoji\emoji_parse.dm"
-#include "code\modules\error_handler\error_handler.dm"
-#include "code\modules\error_handler\error_viewer.dm"
-#include "code\modules\events\_event.dm"
-#include "code\modules\events\abductor.dm"
-#include "code\modules\events\alien_infestation.dm"
-#include "code\modules\events\anomaly.dm"
-#include "code\modules\events\anomaly_bluespace.dm"
-#include "code\modules\events\anomaly_flux.dm"
-#include "code\modules\events\anomaly_grav.dm"
-#include "code\modules\events\anomaly_pyro.dm"
-#include "code\modules\events\anomaly_vortex.dm"
-#include "code\modules\events\aurora_aquilae.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\bureaucratic_error.dm"
-#include "code\modules\events\camerafailure.dm"
-#include "code\modules\events\carp_migration.dm"
-#include "code\modules\events\carpteam.dm"
-#include "code\modules\events\communications_blackout.dm"
-#include "code\modules\events\devil.dm"
-#include "code\modules\events\disease_outbreak.dm"
-#include "code\modules\events\dust.dm"
-#include "code\modules\events\electrical_storm.dm"
-#include "code\modules\events\false_alarm.dm"
-#include "code\modules\events\floorcluwne.dm"
-#include "code\modules\events\ghost_role.dm"
-#include "code\modules\events\grid_check.dm"
-#include "code\modules\events\heart_attack.dm"
-#include "code\modules\events\high_priority_bounty.dm"
-#include "code\modules\events\immovable_rod.dm"
-#include "code\modules\events\ion_storm.dm"
-#include "code\modules\events\major_dust.dm"
-#include "code\modules\events\mass_hallucination.dm"
-#include "code\modules\events\meateor_wave.dm"
-#include "code\modules\events\meteor_wave.dm"
-#include "code\modules\events\mice_migration.dm"
-#include "code\modules\events\nightmare.dm"
-#include "code\modules\events\operative.dm"
-#include "code\modules\events\pirates.dm"
-#include "code\modules\events\portal_storm.dm"
-#include "code\modules\events\prison_break.dm"
-#include "code\modules\events\processor_overload.dm"
-#include "code\modules\events\radiation_storm.dm"
-#include "code\modules\events\sentience.dm"
-#include "code\modules\events\shuttle_loan.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\vent_clog.dm"
-#include "code\modules\events\wormholes.dm"
-#include "code\modules\events\holiday\halloween.dm"
-#include "code\modules\events\holiday\vday.dm"
-#include "code\modules\events\holiday\xmas.dm"
-#include "code\modules\events\wizard\aid.dm"
-#include "code\modules\events\wizard\blobies.dm"
-#include "code\modules\events\wizard\curseditems.dm"
-#include "code\modules\events\wizard\departmentrevolt.dm"
-#include "code\modules\events\wizard\fakeexplosion.dm"
-#include "code\modules\events\wizard\ghost.dm"
-#include "code\modules\events\wizard\greentext.dm"
-#include "code\modules\events\wizard\imposter.dm"
-#include "code\modules\events\wizard\invincible.dm"
-#include "code\modules\events\wizard\lava.dm"
-#include "code\modules\events\wizard\magicarp.dm"
-#include "code\modules\events\wizard\petsplosion.dm"
-#include "code\modules\events\wizard\race.dm"
-#include "code\modules\events\wizard\rpgloot.dm"
-#include "code\modules\events\wizard\shuffle.dm"
-#include "code\modules\events\wizard\summons.dm"
-#include "code\modules\fields\fields.dm"
-#include "code\modules\fields\gravity.dm"
-#include "code\modules\fields\peaceborg_dampener.dm"
-#include "code\modules\fields\timestop.dm"
-#include "code\modules\fields\turf_objects.dm"
-#include "code\modules\flufftext\Dreaming.dm"
-#include "code\modules\flufftext\Hallucination.dm"
-#include "code\modules\food_and_drinks\autobottler.dm"
-#include "code\modules\food_and_drinks\food.dm"
-#include "code\modules\food_and_drinks\pizzabox.dm"
-#include "code\modules\food_and_drinks\drinks\drinks.dm"
-#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm"
-#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm"
-#include "code\modules\food_and_drinks\food\condiment.dm"
-#include "code\modules\food_and_drinks\food\customizables.dm"
-#include "code\modules\food_and_drinks\food\snacks.dm"
-#include "code\modules\food_and_drinks\food\snacks_bread.dm"
-#include "code\modules\food_and_drinks\food\snacks_burgers.dm"
-#include "code\modules\food_and_drinks\food\snacks_cake.dm"
-#include "code\modules\food_and_drinks\food\snacks_egg.dm"
-#include "code\modules\food_and_drinks\food\snacks_frozen.dm"
-#include "code\modules\food_and_drinks\food\snacks_meat.dm"
-#include "code\modules\food_and_drinks\food\snacks_other.dm"
-#include "code\modules\food_and_drinks\food\snacks_pastry.dm"
-#include "code\modules\food_and_drinks\food\snacks_pie.dm"
-#include "code\modules\food_and_drinks\food\snacks_pizza.dm"
-#include "code\modules\food_and_drinks\food\snacks_salad.dm"
-#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
-#include "code\modules\food_and_drinks\food\snacks_soup.dm"
-#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
-#include "code\modules\food_and_drinks\food\snacks_sushi.dm"
-#include "code\modules\food_and_drinks\food\snacks_vend.dm"
-#include "code\modules\food_and_drinks\food\snacks\dough.dm"
-#include "code\modules\food_and_drinks\food\snacks\meat.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\grill.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm"
-#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm"
-#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm"
-#include "code\modules\food_and_drinks\recipes\food_mixtures.dm"
-#include "code\modules\food_and_drinks\recipes\processor_recipes.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
-#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm"
-#include "code\modules\games\cas.dm"
-#include "code\modules\goonchat\browserOutput.dm"
-#include "code\modules\holiday\easter.dm"
-#include "code\modules\holiday\holidays.dm"
-#include "code\modules\holiday\halloween\bartholomew.dm"
-#include "code\modules\holiday\halloween\jacqueen.dm"
-#include "code\modules\holodeck\area_copy.dm"
-#include "code\modules\holodeck\computer.dm"
-#include "code\modules\holodeck\holo_effect.dm"
-#include "code\modules\holodeck\items.dm"
-#include "code\modules\holodeck\mobs.dm"
-#include "code\modules\holodeck\turfs.dm"
-#include "code\modules\hydroponics\biogenerator.dm"
-#include "code\modules\hydroponics\fermenting_barrel.dm"
-#include "code\modules\hydroponics\gene_modder.dm"
-#include "code\modules\hydroponics\grown.dm"
-#include "code\modules\hydroponics\growninedible.dm"
-#include "code\modules\hydroponics\hydroitemdefines.dm"
-#include "code\modules\hydroponics\hydroponics.dm"
-#include "code\modules\hydroponics\plant_genes.dm"
-#include "code\modules\hydroponics\sample.dm"
-#include "code\modules\hydroponics\seed_extractor.dm"
-#include "code\modules\hydroponics\seeds.dm"
-#include "code\modules\hydroponics\beekeeping\beebox.dm"
-#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm"
-#include "code\modules\hydroponics\beekeeping\honey_frame.dm"
-#include "code\modules\hydroponics\beekeeping\honeycomb.dm"
-#include "code\modules\hydroponics\grown\ambrosia.dm"
-#include "code\modules\hydroponics\grown\apple.dm"
-#include "code\modules\hydroponics\grown\banana.dm"
-#include "code\modules\hydroponics\grown\beans.dm"
-#include "code\modules\hydroponics\grown\berries.dm"
-#include "code\modules\hydroponics\grown\cannabis.dm"
-#include "code\modules\hydroponics\grown\cereals.dm"
-#include "code\modules\hydroponics\grown\chili.dm"
-#include "code\modules\hydroponics\grown\citrus.dm"
-#include "code\modules\hydroponics\grown\cocoa_vanilla.dm"
-#include "code\modules\hydroponics\grown\corn.dm"
-#include "code\modules\hydroponics\grown\cotton.dm"
-#include "code\modules\hydroponics\grown\eggplant.dm"
-#include "code\modules\hydroponics\grown\flowers.dm"
-#include "code\modules\hydroponics\grown\garlic.dm"
-#include "code\modules\hydroponics\grown\grass_carpet.dm"
-#include "code\modules\hydroponics\grown\kudzu.dm"
-#include "code\modules\hydroponics\grown\melon.dm"
-#include "code\modules\hydroponics\grown\misc.dm"
-#include "code\modules\hydroponics\grown\mushrooms.dm"
-#include "code\modules\hydroponics\grown\nettle.dm"
-#include "code\modules\hydroponics\grown\onion.dm"
-#include "code\modules\hydroponics\grown\peach.dm"
-#include "code\modules\hydroponics\grown\peanuts.dm"
-#include "code\modules\hydroponics\grown\peas.dm"
-#include "code\modules\hydroponics\grown\pineapple.dm"
-#include "code\modules\hydroponics\grown\potato.dm"
-#include "code\modules\hydroponics\grown\pumpkin.dm"
-#include "code\modules\hydroponics\grown\random.dm"
-#include "code\modules\hydroponics\grown\replicapod.dm"
-#include "code\modules\hydroponics\grown\root.dm"
-#include "code\modules\hydroponics\grown\tea_coffee.dm"
-#include "code\modules\hydroponics\grown\tobacco.dm"
-#include "code\modules\hydroponics\grown\tomato.dm"
-#include "code\modules\hydroponics\grown\towercap.dm"
-#include "code\modules\integrated_electronics\_defines.dm"
-#include "code\modules\integrated_electronics\core\analyzer.dm"
-#include "code\modules\integrated_electronics\core\assemblies.dm"
-#include "code\modules\integrated_electronics\core\debugger.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\saved_circuits.dm"
-#include "code\modules\integrated_electronics\core\wirer.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\index_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\selfref_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\access.dm"
-#include "code\modules\integrated_electronics\subtypes\arithmetic.dm"
-#include "code\modules\integrated_electronics\subtypes\atmospherics.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\text.dm"
-#include "code\modules\integrated_electronics\subtypes\time.dm"
-#include "code\modules\integrated_electronics\subtypes\trig.dm"
-#include "code\modules\integrated_electronics\subtypes\weaponized.dm"
-#include "code\modules\jobs\access.dm"
-#include "code\modules\jobs\job_exp.dm"
-#include "code\modules\jobs\jobs.dm"
-#include "code\modules\jobs\job_types\assistant.dm"
-#include "code\modules\jobs\job_types\captain.dm"
-#include "code\modules\jobs\job_types\cargo_service.dm"
-#include "code\modules\jobs\job_types\civilian.dm"
-#include "code\modules\jobs\job_types\civilian_chaplain.dm"
-#include "code\modules\jobs\job_types\engineering.dm"
-#include "code\modules\jobs\job_types\job.dm"
-#include "code\modules\jobs\job_types\job_alt_titles.dm"
-#include "code\modules\jobs\job_types\medical.dm"
-#include "code\modules\jobs\job_types\science.dm"
-#include "code\modules\jobs\job_types\security.dm"
-#include "code\modules\jobs\job_types\silicon.dm"
-#include "code\modules\jobs\map_changes\map_changes.dm"
-#include "code\modules\keybindings\bindings_admin.dm"
-#include "code\modules\keybindings\bindings_atom.dm"
-#include "code\modules\keybindings\bindings_carbon.dm"
-#include "code\modules\keybindings\bindings_client.dm"
-#include "code\modules\keybindings\bindings_human.dm"
-#include "code\modules\keybindings\bindings_living.dm"
-#include "code\modules\keybindings\bindings_mob.dm"
-#include "code\modules\keybindings\bindings_robot.dm"
-#include "code\modules\keybindings\focus.dm"
-#include "code\modules\keybindings\setup.dm"
-#include "code\modules\language\aphasia.dm"
-#include "code\modules\language\beachbum.dm"
-#include "code\modules\language\codespeak.dm"
-#include "code\modules\language\common.dm"
-#include "code\modules\language\draconic.dm"
-#include "code\modules\language\drone.dm"
-#include "code\modules\language\language.dm"
-#include "code\modules\language\language_holder.dm"
-#include "code\modules\language\language_menu.dm"
-#include "code\modules\language\machine.dm"
-#include "code\modules\language\monkey.dm"
-#include "code\modules\language\narsian.dm"
-#include "code\modules\language\ratvarian.dm"
-#include "code\modules\language\slime.dm"
-#include "code\modules\language\spacerussian.dm"
-#include "code\modules\language\swarmer.dm"
-#include "code\modules\language\tajara.dm"
-#include "code\modules\language\vampiric.dm"
-#include "code\modules\language\xenocommon.dm"
-#include "code\modules\library\lib_codex_gigas.dm"
-#include "code\modules\library\lib_items.dm"
-#include "code\modules\library\lib_machines.dm"
-#include "code\modules\library\random_books.dm"
-#include "code\modules\library\soapstone.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_object.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\mapping\dmm_suite.dm"
-#include "code\modules\mapping\map_template.dm"
-#include "code\modules\mapping\preloader.dm"
-#include "code\modules\mapping\reader.dm"
-#include "code\modules\mapping\ruins.dm"
-#include "code\modules\mapping\verify.dm"
-#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm"
-#include "code\modules\mapping\mapping_helpers\baseturf.dm"
-#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm"
-#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm"
-#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm"
-#include "code\modules\mapping\space_management\multiz_helpers.dm"
-#include "code\modules\mapping\space_management\space_level.dm"
-#include "code\modules\mapping\space_management\space_reservation.dm"
-#include "code\modules\mapping\space_management\space_transition.dm"
-#include "code\modules\mapping\space_management\traits.dm"
-#include "code\modules\mapping\space_management\zlevel_manager.dm"
-#include "code\modules\mining\abandoned_crates.dm"
-#include "code\modules\mining\aux_base.dm"
-#include "code\modules\mining\aux_base_camera.dm"
-#include "code\modules\mining\fulton.dm"
-#include "code\modules\mining\machine_processing.dm"
-#include "code\modules\mining\machine_redemption.dm"
-#include "code\modules\mining\machine_silo.dm"
-#include "code\modules\mining\machine_stacking.dm"
-#include "code\modules\mining\machine_unloading.dm"
-#include "code\modules\mining\machine_vending.dm"
-#include "code\modules\mining\mine_items.dm"
-#include "code\modules\mining\minebot.dm"
-#include "code\modules\mining\mint.dm"
-#include "code\modules\mining\money_bag.dm"
-#include "code\modules\mining\ores_coins.dm"
-#include "code\modules\mining\satchel_ore_boxdm.dm"
-#include "code\modules\mining\shelters.dm"
-#include "code\modules\mining\equipment\explorer_gear.dm"
-#include "code\modules\mining\equipment\goliath_hide.dm"
-#include "code\modules\mining\equipment\kinetic_crusher.dm"
-#include "code\modules\mining\equipment\lazarus_injector.dm"
-#include "code\modules\mining\equipment\marker_beacons.dm"
-#include "code\modules\mining\equipment\mineral_scanner.dm"
-#include "code\modules\mining\equipment\mining_tools.dm"
-#include "code\modules\mining\equipment\regenerative_core.dm"
-#include "code\modules\mining\equipment\resonator.dm"
-#include "code\modules\mining\equipment\survival_pod.dm"
-#include "code\modules\mining\equipment\vendor_items.dm"
-#include "code\modules\mining\equipment\wormhole_jaunter.dm"
-#include "code\modules\mining\laborcamp\laborshuttle.dm"
-#include "code\modules\mining\laborcamp\laborstacker.dm"
-#include "code\modules\mining\lavaland\ash_flora.dm"
-#include "code\modules\mining\lavaland\necropolis_chests.dm"
-#include "code\modules\mining\lavaland\ruins\gym.dm"
-#include "code\modules\mob\death.dm"
-#include "code\modules\mob\emote.dm"
-#include "code\modules\mob\inventory.dm"
-#include "code\modules\mob\login.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_helpers.dm"
-#include "code\modules\mob\mob_movement.dm"
-#include "code\modules\mob\mob_movespeed.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\status_procs.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\camera\camera.dm"
-#include "code\modules\mob\dead\dead.dm"
-#include "code\modules\mob\dead\new_player\login.dm"
-#include "code\modules\mob\dead\new_player\logout.dm"
-#include "code\modules\mob\dead\new_player\new_player.dm"
-#include "code\modules\mob\dead\new_player\poll.dm"
-#include "code\modules\mob\dead\new_player\preferences_setup.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\moth_fluff.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm"
-#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm"
-#include "code\modules\mob\dead\observer\login.dm"
-#include "code\modules\mob\dead\observer\logout.dm"
-#include "code\modules\mob\dead\observer\notificationprefs.dm"
-#include "code\modules\mob\dead\observer\observer.dm"
-#include "code\modules\mob\dead\observer\observer_movement.dm"
-#include "code\modules\mob\dead\observer\say.dm"
-#include "code\modules\mob\living\blood.dm"
-#include "code\modules\mob\living\bloodcrawl.dm"
-#include "code\modules\mob\living\damage_procs.dm"
-#include "code\modules\mob\living\death.dm"
-#include "code\modules\mob\living\emote.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_movement.dm"
-#include "code\modules\mob\living\login.dm"
-#include "code\modules\mob\living\logout.dm"
-#include "code\modules\mob\living\say.dm"
-#include "code\modules\mob\living\status_procs.dm"
-#include "code\modules\mob\living\taste.dm"
-#include "code\modules\mob\living\ventcrawling.dm"
-#include "code\modules\mob\living\brain\brain.dm"
-#include "code\modules\mob\living\brain\brain_item.dm"
-#include "code\modules\mob\living\brain\death.dm"
-#include "code\modules\mob\living\brain\emote.dm"
-#include "code\modules\mob\living\brain\life.dm"
-#include "code\modules\mob\living\brain\MMI.dm"
-#include "code\modules\mob\living\brain\posibrain.dm"
-#include "code\modules\mob\living\brain\say.dm"
-#include "code\modules\mob\living\brain\status_procs.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_movement.dm"
-#include "code\modules\mob\living\carbon\damage_procs.dm"
-#include "code\modules\mob\living\carbon\death.dm"
-#include "code\modules\mob\living\carbon\emote.dm"
-#include "code\modules\mob\living\carbon\examine.dm"
-#include "code\modules\mob\living\carbon\give.dm"
-#include "code\modules\mob\living\carbon\inventory.dm"
-#include "code\modules\mob\living\carbon\life.dm"
-#include "code\modules\mob\living\carbon\say.dm"
-#include "code\modules\mob\living\carbon\status_procs.dm"
-#include "code\modules\mob\living\carbon\update_icons.dm"
-#include "code\modules\mob\living\carbon\alien\alien.dm"
-#include "code\modules\mob\living\carbon\alien\alien_defense.dm"
-#include "code\modules\mob\living\carbon\alien\damage_procs.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\login.dm"
-#include "code\modules\mob\living\carbon\alien\logout.dm"
-#include "code\modules\mob\living\carbon\alien\organs.dm"
-#include "code\modules\mob\living\carbon\alien\say.dm"
-#include "code\modules\mob\living\carbon\alien\screen.dm"
-#include "code\modules\mob\living\carbon\alien\status_procs.dm"
-#include "code\modules\mob\living\carbon\alien\update_icons.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\life.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm"
-#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm"
-#include "code\modules\mob\living\carbon\alien\larva\death.dm"
-#include "code\modules\mob\living\carbon\alien\larva\inventory.dm"
-#include "code\modules\mob\living\carbon\alien\larva\larva.dm"
-#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm"
-#include "code\modules\mob\living\carbon\alien\larva\life.dm"
-#include "code\modules\mob\living\carbon\alien\larva\powers.dm"
-#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm"
-#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm"
-#include "code\modules\mob\living\carbon\alien\special\facehugger.dm"
-#include "code\modules\mob\living\carbon\human\damage_procs.dm"
-#include "code\modules\mob\living\carbon\human\death.dm"
-#include "code\modules\mob\living\carbon\human\dummy.dm"
-#include "code\modules\mob\living\carbon\human\emote.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\human.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_helpers.dm"
-#include "code\modules\mob\living\carbon\human\human_movement.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\physiology.dm"
-#include "code\modules\mob\living\carbon\human\say.dm"
-#include "code\modules\mob\living\carbon\human\species.dm"
-#include "code\modules\mob\living\carbon\human\status_procs.dm"
-#include "code\modules\mob\living\carbon\human\typing_indicator.dm"
-#include "code\modules\mob\living\carbon\human\update_icons.dm"
-#include "code\modules\mob\living\carbon\human\species_types\abductors.dm"
-#include "code\modules\mob\living\carbon\human\species_types\android.dm"
-#include "code\modules\mob\living\carbon\human\species_types\angel.dm"
-#include "code\modules\mob\living\carbon\human\species_types\corporate.dm"
-#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm"
-#include "code\modules\mob\living\carbon\human\species_types\felinid.dm"
-#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\golems.dm"
-#include "code\modules\mob\living\carbon\human\species_types\humans.dm"
-#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm"
-#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm"
-#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm"
-#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm"
-#include "code\modules\mob\living\carbon\human\species_types\synths.dm"
-#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
-#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
-#include "code\modules\mob\living\carbon\monkey\combat.dm"
-#include "code\modules\mob\living\carbon\monkey\death.dm"
-#include "code\modules\mob\living\carbon\monkey\inventory.dm"
-#include "code\modules\mob\living\carbon\monkey\life.dm"
-#include "code\modules\mob\living\carbon\monkey\monkey.dm"
-#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm"
-#include "code\modules\mob\living\carbon\monkey\punpun.dm"
-#include "code\modules\mob\living\carbon\monkey\update_icons.dm"
-#include "code\modules\mob\living\silicon\damage_procs.dm"
-#include "code\modules\mob\living\silicon\death.dm"
-#include "code\modules\mob\living\silicon\examine.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_defense.dm"
-#include "code\modules\mob\living\silicon\silicon_movement.dm"
-#include "code\modules\mob\living\silicon\ai\ai.dm"
-#include "code\modules\mob\living\silicon\ai\ai_defense.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\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\multicam.dm"
-#include "code\modules\mob\living\silicon\ai\say.dm"
-#include "code\modules\mob\living\silicon\ai\vox_sounds.dm"
-#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
-#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
-#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
-#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm"
-#include "code\modules\mob\living\silicon\pai\death.dm"
-#include "code\modules\mob\living\silicon\pai\pai.dm"
-#include "code\modules\mob\living\silicon\pai\pai_defense.dm"
-#include "code\modules\mob\living\silicon\pai\pai_shell.dm"
-#include "code\modules\mob\living\silicon\pai\personality.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\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\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\robot.dm"
-#include "code\modules\mob\living\silicon\robot\robot_defense.dm"
-#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
-#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
-#include "code\modules\mob\living\silicon\robot\say.dm"
-#include "code\modules\mob\living\simple_animal\animal_defense.dm"
-#include "code\modules\mob\living\simple_animal\astral.dm"
-#include "code\modules\mob\living\simple_animal\constructs.dm"
-#include "code\modules\mob\living\simple_animal\corpse.dm"
-#include "code\modules\mob\living\simple_animal\damage_procs.dm"
-#include "code\modules\mob\living\simple_animal\parrot.dm"
-#include "code\modules\mob\living\simple_animal\shade.dm"
-#include "code\modules\mob\living\simple_animal\simple_animal.dm"
-#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm"
-#include "code\modules\mob\living\simple_animal\status_procs.dm"
-#include "code\modules\mob\living\simple_animal\bot\bot.dm"
-#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm"
-#include "code\modules\mob\living\simple_animal\bot\construction.dm"
-#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm"
-#include "code\modules\mob\living\simple_animal\bot\firebot.dm"
-#include "code\modules\mob\living\simple_animal\bot\floorbot.dm"
-#include "code\modules\mob\living\simple_animal\bot\honkbot.dm"
-#include "code\modules\mob\living\simple_animal\bot\medbot.dm"
-#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
-#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
-#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm"
-#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
-#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
-#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
-#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
-#include "code\modules\mob\living\simple_animal\friendly\dog.dm"
-#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
-#include "code\modules\mob\living\simple_animal\friendly\fox.dm"
-#include "code\modules\mob\living\simple_animal\friendly\goliathbaby.dm"
-#include "code\modules\mob\living\simple_animal\friendly\gondola.dm"
-#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
-#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
-#include "code\modules\mob\living\simple_animal\friendly\panda.dm"
-#include "code\modules\mob\living\simple_animal\friendly\penguin.dm"
-#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
-#include "code\modules\mob\living\simple_animal\friendly\possum.dm"
-#include "code\modules\mob\living\simple_animal\friendly\skunk.dm"
-#include "code\modules\mob\living\simple_animal\friendly\sloth.dm"
-#include "code\modules\mob\living\simple_animal\friendly\snake.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
-#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
-#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
-#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm"
-#include "code\modules\mob\living\simple_animal\guardian\types\support.dm"
-#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bread.dm"
-#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
-#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm"
-#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
-#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
-#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm"
-#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
-#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
-#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
-#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
-#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
-#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"
-#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
-#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
-#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm"
-#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
-#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm"
-#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
-#include "code\modules\mob\living\simple_animal\hostile\sharks.dm"
-#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm"
-#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
-#include "code\modules\mob\living\simple_animal\hostile\stickman.dm"
-#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
-#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
-#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
-#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
-#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
-#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
-#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
-#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm"
-#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
-#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm"
-#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
-#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm"
-#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm"
-#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm"
-#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm"
-#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm"
-#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
-#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm"
-#include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm"
-#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
-#include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm"
-#include "code\modules\mob\living\simple_animal\slime\death.dm"
-#include "code\modules\mob\living\simple_animal\slime\emote.dm"
-#include "code\modules\mob\living\simple_animal\slime\life.dm"
-#include "code\modules\mob\living\simple_animal\slime\powers.dm"
-#include "code\modules\mob\living\simple_animal\slime\say.dm"
-#include "code\modules\mob\living\simple_animal\slime\slime.dm"
-#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
-#include "code\modules\modular_computers\laptop_vendor.dm"
-#include "code\modules\modular_computers\computers\item\computer.dm"
-#include "code\modules\modular_computers\computers\item\computer_components.dm"
-#include "code\modules\modular_computers\computers\item\computer_damage.dm"
-#include "code\modules\modular_computers\computers\item\computer_power.dm"
-#include "code\modules\modular_computers\computers\item\computer_ui.dm"
-#include "code\modules\modular_computers\computers\item\laptop.dm"
-#include "code\modules\modular_computers\computers\item\laptop_presets.dm"
-#include "code\modules\modular_computers\computers\item\processor.dm"
-#include "code\modules\modular_computers\computers\item\tablet.dm"
-#include "code\modules\modular_computers\computers\item\tablet_presets.dm"
-#include "code\modules\modular_computers\computers\machinery\console_presets.dm"
-#include "code\modules\modular_computers\computers\machinery\modular_computer.dm"
-#include "code\modules\modular_computers\computers\machinery\modular_console.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\program.dm"
-#include "code\modules\modular_computers\file_system\program_events.dm"
-#include "code\modules\modular_computers\file_system\programs\airestorer.dm"
-#include "code\modules\modular_computers\file_system\programs\alarm.dm"
-#include "code\modules\modular_computers\file_system\programs\card.dm"
-#include "code\modules\modular_computers\file_system\programs\configurator.dm"
-#include "code\modules\modular_computers\file_system\programs\file_browser.dm"
-#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm"
-#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm"
-#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm"
-#include "code\modules\modular_computers\file_system\programs\nttransfer.dm"
-#include "code\modules\modular_computers\file_system\programs\powermonitor.dm"
-#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm"
-#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm"
-#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm"
-#include "code\modules\modular_computers\hardware\_hardware.dm"
-#include "code\modules\modular_computers\hardware\ai_slot.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\CPU.dm"
-#include "code\modules\modular_computers\hardware\hard_drive.dm"
-#include "code\modules\modular_computers\hardware\network_card.dm"
-#include "code\modules\modular_computers\hardware\portable_disk.dm"
-#include "code\modules\modular_computers\hardware\printer.dm"
-#include "code\modules\modular_computers\hardware\recharger.dm"
-#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
-#include "code\modules\ninja\__ninjaDefines.dm"
-#include "code\modules\ninja\energy_katana.dm"
-#include "code\modules\ninja\ninja_event.dm"
-#include "code\modules\ninja\outfit.dm"
-#include "code\modules\ninja\suit\gloves.dm"
-#include "code\modules\ninja\suit\head.dm"
-#include "code\modules\ninja\suit\mask.dm"
-#include "code\modules\ninja\suit\ninjaDrainAct.dm"
-#include "code\modules\ninja\suit\shoes.dm"
-#include "code\modules\ninja\suit\suit.dm"
-#include "code\modules\ninja\suit\suit_attackby.dm"
-#include "code\modules\ninja\suit\suit_initialisation.dm"
-#include "code\modules\ninja\suit\suit_process.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_empulse.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_net.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm"
-#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm"
-#include "code\modules\NTNet\netdata.dm"
-#include "code\modules\NTNet\network.dm"
-#include "code\modules\NTNet\relays.dm"
-#include "code\modules\NTNet\services\_service.dm"
-#include "code\modules\oracle_ui\assets.dm"
-#include "code\modules\oracle_ui\hookup_procs.dm"
-#include "code\modules\oracle_ui\oracle_ui.dm"
-#include "code\modules\oracle_ui\themed.dm"
-#include "code\modules\paperwork\clipboard.dm"
-#include "code\modules\paperwork\contract.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_cutter.dm"
-#include "code\modules\paperwork\paper_premade.dm"
-#include "code\modules\paperwork\paperbin.dm"
-#include "code\modules\paperwork\paperplane.dm"
-#include "code\modules\paperwork\pen.dm"
-#include "code\modules\paperwork\photocopier.dm"
-#include "code\modules\paperwork\stamps.dm"
-#include "code\modules\photography\_pictures.dm"
-#include "code\modules\photography\camera\camera.dm"
-#include "code\modules\photography\camera\camera_image_capturing.dm"
-#include "code\modules\photography\camera\film.dm"
-#include "code\modules\photography\camera\other.dm"
-#include "code\modules\photography\camera\silicon_camera.dm"
-#include "code\modules\photography\photos\album.dm"
-#include "code\modules\photography\photos\frame.dm"
-#include "code\modules\photography\photos\photo.dm"
-#include "code\modules\pool\pool_controller.dm"
-#include "code\modules\pool\pool_drain.dm"
-#include "code\modules\pool\pool_effects.dm"
-#include "code\modules\pool\pool_main.dm"
-#include "code\modules\pool\pool_noodles.dm"
-#include "code\modules\pool\pool_structures.dm"
-#include "code\modules\pool\pool_wires.dm"
-#include "code\modules\power\apc.dm"
-#include "code\modules\power\cable.dm"
-#include "code\modules\power\cell.dm"
-#include "code\modules\power\floodlight.dm"
-#include "code\modules\power\generator.dm"
-#include "code\modules\power\gravitygenerator.dm"
-#include "code\modules\power\lighting.dm"
-#include "code\modules\power\monitor.dm"
-#include "code\modules\power\multiz.dm"
-#include "code\modules\power\port_gen.dm"
-#include "code\modules\power\power.dm"
-#include "code\modules\power\powernet.dm"
-#include "code\modules\power\rtg.dm"
-#include "code\modules\power\smes.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\singularity\collector.dm"
-#include "code\modules\power\singularity\containment_field.dm"
-#include "code\modules\power\singularity\emitter.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\narsie.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_control.dm"
-#include "code\modules\power\singularity\particle_accelerator\particle_emitter.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\procedural_mapping\mapGenerator.dm"
-#include "code\modules\procedural_mapping\mapGeneratorModule.dm"
-#include "code\modules\procedural_mapping\mapGeneratorObj.dm"
-#include "code\modules\procedural_mapping\mapGeneratorReadme.dm"
-#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm"
-#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm"
-#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm"
-#include "code\modules\procedural_mapping\mapGenerators\cellular.dm"
-#include "code\modules\procedural_mapping\mapGenerators\cult.dm"
-#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm"
-#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm"
-#include "code\modules\procedural_mapping\mapGenerators\nature.dm"
-#include "code\modules\procedural_mapping\mapGenerators\repair.dm"
-#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
-#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
-#include "code\modules\projectiles\gun.dm"
-#include "code\modules\projectiles\pins.dm"
-#include "code\modules\projectiles\projectile.dm"
-#include "code\modules\projectiles\ammunition\_ammunition.dm"
-#include "code\modules\projectiles\ammunition\_firing.dm"
-#include "code\modules\projectiles\ammunition\ballistic\lmg.dm"
-#include "code\modules\projectiles\ammunition\ballistic\pistol.dm"
-#include "code\modules\projectiles\ammunition\ballistic\revolver.dm"
-#include "code\modules\projectiles\ammunition\ballistic\rifle.dm"
-#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm"
-#include "code\modules\projectiles\ammunition\ballistic\smg.dm"
-#include "code\modules\projectiles\ammunition\ballistic\sniper.dm"
-#include "code\modules\projectiles\ammunition\caseless\_caseless.dm"
-#include "code\modules\projectiles\ammunition\caseless\foam.dm"
-#include "code\modules\projectiles\ammunition\caseless\misc.dm"
-#include "code\modules\projectiles\ammunition\caseless\rocket.dm"
-#include "code\modules\projectiles\ammunition\energy\_energy.dm"
-#include "code\modules\projectiles\ammunition\energy\ebow.dm"
-#include "code\modules\projectiles\ammunition\energy\gravity.dm"
-#include "code\modules\projectiles\ammunition\energy\laser.dm"
-#include "code\modules\projectiles\ammunition\energy\lmg.dm"
-#include "code\modules\projectiles\ammunition\energy\plasma.dm"
-#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm"
-#include "code\modules\projectiles\ammunition\energy\portal.dm"
-#include "code\modules\projectiles\ammunition\energy\special.dm"
-#include "code\modules\projectiles\ammunition\energy\stun.dm"
-#include "code\modules\projectiles\ammunition\special\magic.dm"
-#include "code\modules\projectiles\ammunition\special\syringe.dm"
-#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
-#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
-#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
-#include "code\modules\projectiles\boxes_magazines\external\lmg.dm"
-#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
-#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm"
-#include "code\modules\projectiles\boxes_magazines\external\rifle.dm"
-#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm"
-#include "code\modules\projectiles\boxes_magazines\external\smg.dm"
-#include "code\modules\projectiles\boxes_magazines\external\sniper.dm"
-#include "code\modules\projectiles\boxes_magazines\external\toy.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\misc.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm"
-#include "code\modules\projectiles\boxes_magazines\internal\toy.dm"
-#include "code\modules\projectiles\guns\ballistic.dm"
-#include "code\modules\projectiles\guns\energy.dm"
-#include "code\modules\projectiles\guns\magic.dm"
-#include "code\modules\projectiles\guns\ballistic\automatic.dm"
-#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm"
-#include "code\modules\projectiles\guns\ballistic\launchers.dm"
-#include "code\modules\projectiles\guns\ballistic\pistol.dm"
-#include "code\modules\projectiles\guns\ballistic\revolver.dm"
-#include "code\modules\projectiles\guns\ballistic\shotgun.dm"
-#include "code\modules\projectiles\guns\ballistic\toy.dm"
-#include "code\modules\projectiles\guns\energy\dueling.dm"
-#include "code\modules\projectiles\guns\energy\energy_gun.dm"
-#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
-#include "code\modules\projectiles\guns\energy\laser.dm"
-#include "code\modules\projectiles\guns\energy\megabuster.dm"
-#include "code\modules\projectiles\guns\energy\mounted.dm"
-#include "code\modules\projectiles\guns\energy\plasma_cit.dm"
-#include "code\modules\projectiles\guns\energy\pulse.dm"
-#include "code\modules\projectiles\guns\energy\special.dm"
-#include "code\modules\projectiles\guns\energy\stun.dm"
-#include "code\modules\projectiles\guns\magic\staff.dm"
-#include "code\modules\projectiles\guns\magic\wand.dm"
-#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
-#include "code\modules\projectiles\guns\misc\blastcannon.dm"
-#include "code\modules\projectiles\guns\misc\chem_gun.dm"
-#include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
-#include "code\modules\projectiles\guns\misc\medbeam.dm"
-#include "code\modules\projectiles\guns\misc\syringe_gun.dm"
-#include "code\modules\projectiles\projectile\beams.dm"
-#include "code\modules\projectiles\projectile\bullets.dm"
-#include "code\modules\projectiles\projectile\magic.dm"
-#include "code\modules\projectiles\projectile\megabuster.dm"
-#include "code\modules\projectiles\projectile\plasma.dm"
-#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
-#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
-#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
-#include "code\modules\projectiles\projectile\bullets\grenade.dm"
-#include "code\modules\projectiles\projectile\bullets\lmg.dm"
-#include "code\modules\projectiles\projectile\bullets\pistol.dm"
-#include "code\modules\projectiles\projectile\bullets\revolver.dm"
-#include "code\modules\projectiles\projectile\bullets\rifle.dm"
-#include "code\modules\projectiles\projectile\bullets\shotgun.dm"
-#include "code\modules\projectiles\projectile\bullets\smg.dm"
-#include "code\modules\projectiles\projectile\bullets\sniper.dm"
-#include "code\modules\projectiles\projectile\bullets\special.dm"
-#include "code\modules\projectiles\projectile\energy\_energy.dm"
-#include "code\modules\projectiles\projectile\energy\ebow.dm"
-#include "code\modules\projectiles\projectile\energy\misc.dm"
-#include "code\modules\projectiles\projectile\energy\net_snare.dm"
-#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm"
-#include "code\modules\projectiles\projectile\energy\stun.dm"
-#include "code\modules\projectiles\projectile\energy\tesla.dm"
-#include "code\modules\projectiles\projectile\magic\spellcard.dm"
-#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
-#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
-#include "code\modules\projectiles\projectile\reusable\magspear.dm"
-#include "code\modules\projectiles\projectile\special\curse.dm"
-#include "code\modules\projectiles\projectile\special\floral.dm"
-#include "code\modules\projectiles\projectile\special\gravity.dm"
-#include "code\modules\projectiles\projectile\special\hallucination.dm"
-#include "code\modules\projectiles\projectile\special\ion.dm"
-#include "code\modules\projectiles\projectile\special\meteor.dm"
-#include "code\modules\projectiles\projectile\special\mindflayer.dm"
-#include "code\modules\projectiles\projectile\special\neurotoxin.dm"
-#include "code\modules\projectiles\projectile\special\plasma.dm"
-#include "code\modules\projectiles\projectile\special\rocket.dm"
-#include "code\modules\projectiles\projectile\special\temperature.dm"
-#include "code\modules\projectiles\projectile\special\wormhole.dm"
-#include "code\modules\reagents\chem_splash.dm"
-#include "code\modules\reagents\chem_wiki_render.dm"
-#include "code\modules\reagents\reagent_containers.dm"
-#include "code\modules\reagents\reagent_dispenser.dm"
-#include "code\modules\reagents\chemistry\colors.dm"
-#include "code\modules\reagents\chemistry\holder.dm"
-#include "code\modules\reagents\chemistry\reagents.dm"
-#include "code\modules\reagents\chemistry\recipes.dm"
-#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm"
-#include "code\modules\reagents\chemistry\machinery\chem_heater.dm"
-#include "code\modules\reagents\chemistry\machinery\chem_master.dm"
-#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm"
-#include "code\modules\reagents\chemistry\machinery\pandemic.dm"
-#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm"
-#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm"
-#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\food_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\other_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm"
-#include "code\modules\reagents\chemistry\recipes\drugs.dm"
-#include "code\modules\reagents\chemistry\recipes\medicine.dm"
-#include "code\modules\reagents\chemistry\recipes\others.dm"
-#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm"
-#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm"
-#include "code\modules\reagents\chemistry\recipes\special.dm"
-#include "code\modules\reagents\chemistry\recipes\toxins.dm"
-#include "code\modules\reagents\reagent_containers\blood_pack.dm"
-#include "code\modules\reagents\reagent_containers\borghydro.dm"
-#include "code\modules\reagents\reagent_containers\bottle.dm"
-#include "code\modules\reagents\reagent_containers\chem_pack.dm"
-#include "code\modules\reagents\reagent_containers\Chemical_tongue.dm"
-#include "code\modules\reagents\reagent_containers\dropper.dm"
-#include "code\modules\reagents\reagent_containers\glass.dm"
-#include "code\modules\reagents\reagent_containers\hypospray.dm"
-#include "code\modules\reagents\reagent_containers\hypovial.dm"
-#include "code\modules\reagents\reagent_containers\medspray.dm"
-#include "code\modules\reagents\reagent_containers\patch.dm"
-#include "code\modules\reagents\reagent_containers\pill.dm"
-#include "code\modules\reagents\reagent_containers\rags.dm"
-#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm"
-#include "code\modules\reagents\reagent_containers\spray.dm"
-#include "code\modules\reagents\reagent_containers\syringes.dm"
-#include "code\modules\recycling\conveyor2.dm"
-#include "code\modules\recycling\sortingmachinery.dm"
-#include "code\modules\recycling\disposal\bin.dm"
-#include "code\modules\recycling\disposal\construction.dm"
-#include "code\modules\recycling\disposal\eject.dm"
-#include "code\modules\recycling\disposal\holder.dm"
-#include "code\modules\recycling\disposal\multiz.dm"
-#include "code\modules\recycling\disposal\outlet.dm"
-#include "code\modules\recycling\disposal\pipe.dm"
-#include "code\modules\recycling\disposal\pipe_sorting.dm"
-#include "code\modules\research\designs.dm"
-#include "code\modules\research\destructive_analyzer.dm"
-#include "code\modules\research\experimentor.dm"
-#include "code\modules\research\rdconsole.dm"
-#include "code\modules\research\rdmachines.dm"
-#include "code\modules\research\research_disk.dm"
-#include "code\modules\research\server.dm"
-#include "code\modules\research\stock_parts.dm"
-#include "code\modules\research\designs\AI_module_designs.dm"
-#include "code\modules\research\designs\autobotter_designs.dm"
-#include "code\modules\research\designs\biogenerator_designs.dm"
-#include "code\modules\research\designs\bluespace_designs.dm"
-#include "code\modules\research\designs\computer_part_designs.dm"
-#include "code\modules\research\designs\electronics_designs.dm"
-#include "code\modules\research\designs\equipment_designs.dm"
-#include "code\modules\research\designs\limbgrower_designs.dm"
-#include "code\modules\research\designs\mecha_designs.dm"
-#include "code\modules\research\designs\mechfabricator_designs.dm"
-#include "code\modules\research\designs\medical_designs.dm"
-#include "code\modules\research\designs\mining_designs.dm"
-#include "code\modules\research\designs\misc_designs.dm"
-#include "code\modules\research\designs\nanite_designs.dm"
-#include "code\modules\research\designs\power_designs.dm"
-#include "code\modules\research\designs\smelting_designs.dm"
-#include "code\modules\research\designs\stock_parts_designs.dm"
-#include "code\modules\research\designs\telecomms_designs.dm"
-#include "code\modules\research\designs\weapon_designs.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
-#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
-#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm"
-#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm"
-#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm"
-#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm"
-#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm"
-#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm"
-#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm"
-#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm"
-#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm"
-#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm"
-#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm"
-#include "code\modules\research\designs\machine_desings\machine_designs_service.dm"
-#include "code\modules\research\machinery\_production.dm"
-#include "code\modules\research\machinery\circuit_imprinter.dm"
-#include "code\modules\research\machinery\departmental_circuit_imprinter.dm"
-#include "code\modules\research\machinery\departmental_protolathe.dm"
-#include "code\modules\research\machinery\departmental_techfab.dm"
-#include "code\modules\research\machinery\protolathe.dm"
-#include "code\modules\research\machinery\techfab.dm"
-#include "code\modules\research\nanites\nanite_chamber.dm"
-#include "code\modules\research\nanites\nanite_chamber_computer.dm"
-#include "code\modules\research\nanites\nanite_cloud_controller.dm"
-#include "code\modules\research\nanites\nanite_hijacker.dm"
-#include "code\modules\research\nanites\nanite_misc_items.dm"
-#include "code\modules\research\nanites\nanite_program_hub.dm"
-#include "code\modules\research\nanites\nanite_programmer.dm"
-#include "code\modules\research\nanites\nanite_programs.dm"
-#include "code\modules\research\nanites\nanite_remote.dm"
-#include "code\modules\research\nanites\program_disks.dm"
-#include "code\modules\research\nanites\public_chamber.dm"
-#include "code\modules\research\nanites\nanite_programs\buffing.dm"
-#include "code\modules\research\nanites\nanite_programs\healing.dm"
-#include "code\modules\research\nanites\nanite_programs\rogue.dm"
-#include "code\modules\research\nanites\nanite_programs\sensor.dm"
-#include "code\modules\research\nanites\nanite_programs\suppression.dm"
-#include "code\modules\research\nanites\nanite_programs\utility.dm"
-#include "code\modules\research\nanites\nanite_programs\weapon.dm"
-#include "code\modules\research\techweb\__techweb_helpers.dm"
-#include "code\modules\research\techweb\_techweb.dm"
-#include "code\modules\research\techweb\_techweb_node.dm"
-#include "code\modules\research\techweb\all_nodes.dm"
-#include "code\modules\research\xenoarch\artifact.dm"
-#include "code\modules\research\xenoarch\artifact_list.dm"
-#include "code\modules\research\xenoarch\strange_rock.dm"
-#include "code\modules\research\xenoarch\tools.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\amauri.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\gelthi.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\jurlmah.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\nofruit.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\shand.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\surik.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\telriis.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\thaadra.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\vale.dm"
-#include "code\modules\research\xenoarch\xenobotany\grown\vaporsac.dm"
-#include "code\modules\research\xenobiology\xenobio_camera.dm"
-#include "code\modules\research\xenobiology\xenobiology.dm"
-#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm"
-#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm"
-#include "code\modules\research\xenobiology\crossbreeding\_misc.dm"
-#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm"
-#include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm"
-#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm"
-#include "code\modules\research\xenobiology\crossbreeding\burning.dm"
-#include "code\modules\research\xenobiology\crossbreeding\charged.dm"
-#include "code\modules\research\xenobiology\crossbreeding\chilling.dm"
-#include "code\modules\research\xenobiology\crossbreeding\consuming.dm"
-#include "code\modules\research\xenobiology\crossbreeding\industrial.dm"
-#include "code\modules\research\xenobiology\crossbreeding\prismatic.dm"
-#include "code\modules\research\xenobiology\crossbreeding\recurring.dm"
-#include "code\modules\research\xenobiology\crossbreeding\regenerative.dm"
-#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm"
-#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm"
-#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
-#include "code\modules\ruins\lavaland_ruin_code.dm"
-#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
-#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"
-#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
-#include "code\modules\ruins\lavalandruin_code\sloth.dm"
-#include "code\modules\ruins\lavalandruin_code\surface.dm"
-#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
-#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
-#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
-#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
-#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
-#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
-#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
-#include "code\modules\ruins\spaceruin_code\cloning_lab.dm"
-#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
-#include "code\modules\ruins\spaceruin_code\crashedship.dm"
-#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
-#include "code\modules\ruins\spaceruin_code\DJstation.dm"
-#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
-#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
-#include "code\modules\ruins\spaceruin_code\miracle.dm"
-#include "code\modules\ruins\spaceruin_code\oldstation.dm"
-#include "code\modules\ruins\spaceruin_code\originalcontent.dm"
-#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
-#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
-#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm"
-#include "code\modules\security_levels\keycard_authentication.dm"
-#include "code\modules\security_levels\security_levels.dm"
-#include "code\modules\shuttle\arrivals.dm"
-#include "code\modules\shuttle\assault_pod.dm"
-#include "code\modules\shuttle\computer.dm"
-#include "code\modules\shuttle\docking.dm"
-#include "code\modules\shuttle\elevator.dm"
-#include "code\modules\shuttle\emergency.dm"
-#include "code\modules\shuttle\ferry.dm"
-#include "code\modules\shuttle\manipulator.dm"
-#include "code\modules\shuttle\monastery.dm"
-#include "code\modules\shuttle\navigation_computer.dm"
-#include "code\modules\shuttle\on_move.dm"
-#include "code\modules\shuttle\ripple.dm"
-#include "code\modules\shuttle\shuttle.dm"
-#include "code\modules\shuttle\shuttle_rotate.dm"
-#include "code\modules\shuttle\special.dm"
-#include "code\modules\shuttle\supply.dm"
-#include "code\modules\shuttle\syndicate.dm"
-#include "code\modules\shuttle\white_ship.dm"
-#include "code\modules\spells\spell.dm"
-#include "code\modules\spells\spell_types\adminbussed.dm"
-#include "code\modules\spells\spell_types\aimed.dm"
-#include "code\modules\spells\spell_types\area_teleport.dm"
-#include "code\modules\spells\spell_types\barnyard.dm"
-#include "code\modules\spells\spell_types\bloodcrawl.dm"
-#include "code\modules\spells\spell_types\charge.dm"
-#include "code\modules\spells\spell_types\conjure.dm"
-#include "code\modules\spells\spell_types\construct_spells.dm"
-#include "code\modules\spells\spell_types\devil.dm"
-#include "code\modules\spells\spell_types\devil_boons.dm"
-#include "code\modules\spells\spell_types\dumbfire.dm"
-#include "code\modules\spells\spell_types\emplosion.dm"
-#include "code\modules\spells\spell_types\ethereal_jaunt.dm"
-#include "code\modules\spells\spell_types\explosion.dm"
-#include "code\modules\spells\spell_types\forcewall.dm"
-#include "code\modules\spells\spell_types\genetic.dm"
-#include "code\modules\spells\spell_types\godhand.dm"
-#include "code\modules\spells\spell_types\infinite_guns.dm"
-#include "code\modules\spells\spell_types\inflict_handler.dm"
-#include "code\modules\spells\spell_types\knock.dm"
-#include "code\modules\spells\spell_types\lichdom.dm"
-#include "code\modules\spells\spell_types\lightning.dm"
-#include "code\modules\spells\spell_types\mime.dm"
-#include "code\modules\spells\spell_types\mind_transfer.dm"
-#include "code\modules\spells\spell_types\projectile.dm"
-#include "code\modules\spells\spell_types\rightandwrong.dm"
-#include "code\modules\spells\spell_types\rod_form.dm"
-#include "code\modules\spells\spell_types\santa.dm"
-#include "code\modules\spells\spell_types\shadow_walk.dm"
-#include "code\modules\spells\spell_types\shapeshift.dm"
-#include "code\modules\spells\spell_types\spacetime_distortion.dm"
-#include "code\modules\spells\spell_types\summonitem.dm"
-#include "code\modules\spells\spell_types\taeclowndo.dm"
-#include "code\modules\spells\spell_types\telepathy.dm"
-#include "code\modules\spells\spell_types\the_traps.dm"
-#include "code\modules\spells\spell_types\touch_attacks.dm"
-#include "code\modules\spells\spell_types\trigger.dm"
-#include "code\modules\spells\spell_types\turf_teleport.dm"
-#include "code\modules\spells\spell_types\voice_of_god.dm"
-#include "code\modules\spells\spell_types\wizard.dm"
-#include "code\modules\station_goals\bsa.dm"
-#include "code\modules\station_goals\dna_vault.dm"
-#include "code\modules\station_goals\shield.dm"
-#include "code\modules\station_goals\station_goal.dm"
-#include "code\modules\surgery\amputation.dm"
-#include "code\modules\surgery\brain_surgery.dm"
-#include "code\modules\surgery\breast_augmentation.dm"
-#include "code\modules\surgery\cavity_implant.dm"
-#include "code\modules\surgery\core_removal.dm"
-#include "code\modules\surgery\coronary_bypass.dm"
-#include "code\modules\surgery\dental_implant.dm"
-#include "code\modules\surgery\embalming.dm"
-#include "code\modules\surgery\experimental_dissection.dm"
-#include "code\modules\surgery\eye_surgery.dm"
-#include "code\modules\surgery\graft_synthtissue.dm"
-#include "code\modules\surgery\healing.dm"
-#include "code\modules\surgery\helpers.dm"
-#include "code\modules\surgery\implant_removal.dm"
-#include "code\modules\surgery\limb_augmentation.dm"
-#include "code\modules\surgery\lipoplasty.dm"
-#include "code\modules\surgery\lobectomy.dm"
-#include "code\modules\surgery\mechanic_steps.dm"
-#include "code\modules\surgery\nutcracker.dm"
-#include "code\modules\surgery\organ_manipulation.dm"
-#include "code\modules\surgery\organic_steps.dm"
-#include "code\modules\surgery\penis_augmentation.dm"
-#include "code\modules\surgery\plastic_surgery.dm"
-#include "code\modules\surgery\prosthetic_replacement.dm"
-#include "code\modules\surgery\remove_embedded_object.dm"
-#include "code\modules\surgery\surgery.dm"
-#include "code\modules\surgery\surgery_step.dm"
-#include "code\modules\surgery\tools.dm"
-#include "code\modules\surgery\advanced\brainwashing.dm"
-#include "code\modules\surgery\advanced\lobotomy.dm"
-#include "code\modules\surgery\advanced\necrotic_revival.dm"
-#include "code\modules\surgery\advanced\pacification.dm"
-#include "code\modules\surgery\advanced\revival.dm"
-#include "code\modules\surgery\advanced\toxichealing.dm"
-#include "code\modules\surgery\advanced\viral_bonding.dm"
-#include "code\modules\surgery\advanced\bioware\bioware.dm"
-#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm"
-#include "code\modules\surgery\advanced\bioware\ligament_hook.dm"
-#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm"
-#include "code\modules\surgery\advanced\bioware\muscled_veins.dm"
-#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm"
-#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm"
-#include "code\modules\surgery\advanced\bioware\vein_threading.dm"
-#include "code\modules\surgery\bodyparts\bodyparts.dm"
-#include "code\modules\surgery\bodyparts\broken.dm"
-#include "code\modules\surgery\bodyparts\dismemberment.dm"
-#include "code\modules\surgery\bodyparts\head.dm"
-#include "code\modules\surgery\bodyparts\helpers.dm"
-#include "code\modules\surgery\bodyparts\robot_bodyparts.dm"
-#include "code\modules\surgery\organs\appendix.dm"
-#include "code\modules\surgery\organs\augments_arms.dm"
-#include "code\modules\surgery\organs\augments_chest.dm"
-#include "code\modules\surgery\organs\augments_eyes.dm"
-#include "code\modules\surgery\organs\augments_internal.dm"
-#include "code\modules\surgery\organs\autosurgeon.dm"
-#include "code\modules\surgery\organs\ears.dm"
-#include "code\modules\surgery\organs\eyes.dm"
-#include "code\modules\surgery\organs\heart.dm"
-#include "code\modules\surgery\organs\helpers.dm"
-#include "code\modules\surgery\organs\liver.dm"
-#include "code\modules\surgery\organs\lungs.dm"
-#include "code\modules\surgery\organs\organ_internal.dm"
-#include "code\modules\surgery\organs\stomach.dm"
-#include "code\modules\surgery\organs\tails.dm"
-#include "code\modules\surgery\organs\tongue.dm"
-#include "code\modules\surgery\organs\vocal_cords.dm"
-#include "code\modules\tgs\includes.dm"
-#include "code\modules\tgui\external.dm"
-#include "code\modules\tgui\states.dm"
-#include "code\modules\tgui\subsystem.dm"
-#include "code\modules\tgui\tgui.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\language_menu.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\zlevel.dm"
-#include "code\modules\tooltip\tooltip.dm"
-#include "code\modules\unit_tests\_unit_tests.dm"
-#include "code\modules\uplink\uplink_devices.dm"
-#include "code\modules\uplink\uplink_items.dm"
-#include "code\modules\uplink\uplink_purchase_log.dm"
-#include "code\modules\vehicles\_vehicle.dm"
-#include "code\modules\vehicles\atv.dm"
-#include "code\modules\vehicles\bicycle.dm"
-#include "code\modules\vehicles\lavaboat.dm"
-#include "code\modules\vehicles\motorized_wheelchair.dm"
-#include "code\modules\vehicles\pimpin_ride.dm"
-#include "code\modules\vehicles\ridden.dm"
-#include "code\modules\vehicles\scooter.dm"
-#include "code\modules\vehicles\sealed.dm"
-#include "code\modules\vehicles\secway.dm"
-#include "code\modules\vehicles\speedbike.dm"
-#include "code\modules\vehicles\vehicle_actions.dm"
-#include "code\modules\vehicles\vehicle_key.dm"
-#include "code\modules\vehicles\wheelchair.dm"
-#include "code\modules\vehicles\cars\car.dm"
-#include "code\modules\vehicles\cars\clowncar.dm"
-#include "code\modules\vending\_vending.dm"
-#include "code\modules\vending\assist.dm"
-#include "code\modules\vending\autodrobe.dm"
-#include "code\modules\vending\boozeomat.dm"
-#include "code\modules\vending\cartridge.dm"
-#include "code\modules\vending\cigarette.dm"
-#include "code\modules\vending\clothesmate.dm"
-#include "code\modules\vending\coffee.dm"
-#include "code\modules\vending\cola.dm"
-#include "code\modules\vending\drinnerware.dm"
-#include "code\modules\vending\engineering.dm"
-#include "code\modules\vending\engivend.dm"
-#include "code\modules\vending\games.dm"
-#include "code\modules\vending\liberation.dm"
-#include "code\modules\vending\liberation_toy.dm"
-#include "code\modules\vending\magivend.dm"
-#include "code\modules\vending\medical.dm"
-#include "code\modules\vending\medical_wall.dm"
-#include "code\modules\vending\megaseed.dm"
-#include "code\modules\vending\nutrimax.dm"
-#include "code\modules\vending\plasmaresearch.dm"
-#include "code\modules\vending\robotics.dm"
-#include "code\modules\vending\security.dm"
-#include "code\modules\vending\snack.dm"
-#include "code\modules\vending\sovietsoda.dm"
-#include "code\modules\vending\sustenance.dm"
-#include "code\modules\vending\toys.dm"
-#include "code\modules\vending\wardrobes.dm"
-#include "code\modules\vending\youtool.dm"
-#include "code\modules\VR\vr_human.dm"
-#include "code\modules\VR\vr_sleeper.dm"
-#include "code\modules\zombie\items.dm"
-#include "code\modules\zombie\organs.dm"
-#include "hyperstation\code\__DEFINES\economy.dm"
-#include "hyperstation\code\__DEFINES\wendigo.dm"
-#include "hyperstation\code\controllers\subsystem\economy.dm"
-#include "hyperstation\code\datums\actions.dm"
-#include "hyperstation\code\datums\components\crafting\bounties.dm"
-#include "hyperstation\code\datums\components\crafting\recipes.dm"
-#include "hyperstation\code\datums\ert_hazard_cleanup.dm"
-#include "hyperstation\code\datums\elements\holder_micro.dm"
-#include "hyperstation\code\datums\mood_events\events.dm"
-#include "hyperstation\code\datums\ruins\lavaland.dm"
-#include "hyperstation\code\datums\traits\good.dm"
-#include "hyperstation\code\datums\traits\neutral.dm"
-#include "hyperstation\code\datums\weather\oxygen_rain.dm"
-#include "hyperstation\code\game\objects\railings.dm"
-#include "hyperstation\code\game\objects\items\cosmetics.dm"
-#include "hyperstation\code\game\objects\items\storage\big_bag.dm"
-#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm"
-#include "hyperstation\code\gamemode\traitor_lewd.dm"
-#include "hyperstation\code\gamemode\traitor_thief.dm"
-#include "hyperstation\code\gamemode\werewolf\werewolf.dm"
-#include "hyperstation\code\hyperbot\hyperbot.dm"
-#include "hyperstation\code\mobs\carrion.dm"
-#include "hyperstation\code\mobs\dancer.dm"
-#include "hyperstation\code\mobs\hugbot.dm"
-#include "hyperstation\code\mobs\mimic.dm"
-#include "hyperstation\code\mobs\werewolf.dm"
-#include "hyperstation\code\modules\pen.dm"
-#include "hyperstation\code\modules\traits.dm"
-#include "hyperstation\code\modules\admin\verbs\hyperverbs.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\datums_hud.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\forest\structures\soul_storage.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\_on_click.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\defines_init.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\examine.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\metabolization.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_defense.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_equip.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\organs_bodyparts.dm"
-#include "hyperstation\code\modules\antagonists\wendigo\mob\update_icons.dm"
-#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm"
-#include "hyperstation\code\modules\arousal\arousalhud.dm"
-#include "hyperstation\code\modules\cargo\exports\engineering.dm"
-#include "hyperstation\code\modules\cargo\exports\sweatshop.dm"
-#include "hyperstation\code\modules\cargo\packs\misc.dm"
-#include "hyperstation\code\modules\cargo\sweatshop\metal.dm"
-#include "hyperstation\code\modules\cargo\sweatshop\sweatshop.dm"
-#include "hyperstation\code\modules\cargo\sweatshop\wooden.dm"
-#include "hyperstation\code\modules\client\loadout\glasses.dm"
-#include "hyperstation\code\modules\client\loadout\tablet.dm"
-#include "hyperstation\code\modules\clothing\gloves.dm"
-#include "hyperstation\code\modules\clothing\head.dm"
-#include "hyperstation\code\modules\clothing\glasses\polychromic_glasses.dm"
-#include "hyperstation\code\modules\clothing\spacesuits\hardsuit.dm"
-#include "hyperstation\code\modules\clothing\suits\misc.dm"
-#include "hyperstation\code\modules\clothing\under\under.dm"
-#include "hyperstation\code\modules\economy\account.dm"
-#include "hyperstation\code\modules\integrated_electronics\input.dm"
-#include "hyperstation\code\modules\mining\shelters.dm"
-#include "hyperstation\code\modules\mining\equipment\survival_pod.dm"
-#include "hyperstation\code\modules\mob\mob_helpers.dm"
-#include "hyperstation\code\modules\mob\living\status_indicators.dm"
-#include "hyperstation\code\modules\mob\living\silicon\robot\robot.dm"
-#include "hyperstation\code\modules\mob\living\silicon\robot\robot_modules.dm"
-#include "hyperstation\code\modules\patreon\patreon.dm"
-#include "hyperstation\code\modules\power\reactor\fuel_rods.dm"
-#include "hyperstation\code\modules\power\reactor\rbmk.dm"
-#include "hyperstation\code\modules\power\reactor\reactor_cargo.dm"
-#include "hyperstation\code\modules\reagents\chemistry\reagents\food_reagents.dm"
-#include "hyperstation\code\modules\reagents\chemistry\reagents\hydroponics_reactions.dm"
-#include "hyperstation\code\modules\resize\resize_action.dm"
-#include "hyperstation\code\modules\resize\resizing.dm"
-#include "hyperstation\code\modules\resize\sizechems.dm"
-#include "hyperstation\code\modules\resize\sizegun.dm"
-#include "hyperstation\code\modules\surgery\organs\augments_arms.dm"
-#include "hyperstation\code\modules\uplink\uplink_items.dm"
-#include "hyperstation\code\obj\ashtray.dm"
-#include "hyperstation\code\obj\bluespace sewing kit.dm"
-#include "hyperstation\code\obj\condom.dm"
-#include "hyperstation\code\obj\decal.dm"
-#include "hyperstation\code\obj\economy.dm"
-#include "hyperstation\code\obj\fleshlight.dm"
-#include "hyperstation\code\obj\fluff.dm"
-#include "hyperstation\code\obj\kinkyclothes.dm"
-#include "hyperstation\code\obj\leash.dm"
-#include "hyperstation\code\obj\lunaritems.dm"
-#include "hyperstation\code\obj\milking machine.dm"
-#include "hyperstation\code\obj\plushes.dm"
-#include "hyperstation\code\obj\pole.dm"
-#include "hyperstation\code\obj\pregnancytester.dm"
-#include "hyperstation\code\obj\rewards.dm"
-#include "hyperstation\code\obj\rope.dm"
-#include "hyperstation\code\obj\sizeitems.dm"
-#include "hyperstation\code\obj\sounding.dm"
-#include "hyperstation\code\obj\vibrator.dm"
-#include "interface\interface.dm"
-#include "interface\menu.dm"
-#include "interface\stylesheet.dm"
-#include "modular_citadel\code\init.dm"
-#include "modular_citadel\code\__HELPERS\list2list.dm"
-#include "modular_citadel\code\__HELPERS\lists.dm"
-#include "modular_citadel\code\__HELPERS\mobs.dm"
-#include "modular_citadel\code\_globalvars\lists\mobs.dm"
-#include "modular_citadel\code\_onclick\click.dm"
-#include "modular_citadel\code\_onclick\item_attack.dm"
-#include "modular_citadel\code\_onclick\other_mobs.dm"
-#include "modular_citadel\code\_onclick\hud\screen_objects.dm"
-#include "modular_citadel\code\_onclick\hud\sprint.dm"
-#include "modular_citadel\code\_onclick\hud\stamina.dm"
-#include "modular_citadel\code\controllers\configuration\entries\general.dm"
-#include "modular_citadel\code\controllers\subsystem\job.dm"
-#include "modular_citadel\code\datums\components\material_container.dm"
-#include "modular_citadel\code\datums\components\phantomthief.dm"
-#include "modular_citadel\code\datums\components\souldeath.dm"
-#include "modular_citadel\code\datums\mood_events\chem_events.dm"
-#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm"
-#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm"
-#include "modular_citadel\code\datums\mood_events\moodular.dm"
-#include "modular_citadel\code\datums\mutations\hulk.dm"
-#include "modular_citadel\code\datums\status_effects\chems.dm"
-#include "modular_citadel\code\datums\status_effects\debuffs.dm"
-#include "modular_citadel\code\datums\traits\negative.dm"
-#include "modular_citadel\code\datums\traits\neutral.dm"
-#include "modular_citadel\code\datums\wires\airlock.dm"
-#include "modular_citadel\code\datums\wires\autoylathe.dm"
-#include "modular_citadel\code\game\area\cit_areas.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\dominator.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\dominator_countdown.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gang.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gang_datums.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gang_decals.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gang_hud.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gang_items.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gang_pen.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gangs.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\gangtool.dm"
-#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm"
-#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
-#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm"
-#include "modular_citadel\code\game\machinery\cryopod.dm"
-#include "modular_citadel\code\game\machinery\displaycases.dm"
-#include "modular_citadel\code\game\machinery\Sleeper.dm"
-#include "modular_citadel\code\game\machinery\toylathe.dm"
-#include "modular_citadel\code\game\machinery\vending.dm"
-#include "modular_citadel\code\game\machinery\wishgranter.dm"
-#include "modular_citadel\code\game\machinery\doors\airlock.dm"
-#include "modular_citadel\code\game\machinery\doors\airlock_types.dm"
-#include "modular_citadel\code\game\objects\cit_screenshake.dm"
-#include "modular_citadel\code\game\objects\items.dm"
-#include "modular_citadel\code\game\objects\tools.dm"
-#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
-#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
-#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
-#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm"
-#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
-#include "modular_citadel\code\game\objects\items\balls.dm"
-#include "modular_citadel\code\game\objects\items\boombox.dm"
-#include "modular_citadel\code\game\objects\items\holy_weapons.dm"
-#include "modular_citadel\code\game\objects\items\honk.dm"
-#include "modular_citadel\code\game\objects\items\stunsword.dm"
-#include "modular_citadel\code\game\objects\items\vending_items.dm"
-#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm"
-#include "modular_citadel\code\game\objects\items\devices\aicard.dm"
-#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm"
-#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
-#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
-#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
-#include "modular_citadel\code\game\objects\items\melee\misc.dm"
-#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm"
-#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
-#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
-#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
-#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
-#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm"
-#include "modular_citadel\code\game\turfs\cit_turfs.dm"
-#include "modular_citadel\code\modules\admin\chat_commands.dm"
-#include "modular_citadel\code\modules\admin\holder2.dm"
-#include "modular_citadel\code\modules\admin\secrets.dm"
-#include "modular_citadel\code\modules\arousal\arousal.dm"
-#include "modular_citadel\code\modules\arousal\organs\belly.dm"
-#include "modular_citadel\code\modules\arousal\organs\breasts.dm"
-#include "modular_citadel\code\modules\arousal\organs\eggsack.dm"
-#include "modular_citadel\code\modules\arousal\organs\genitals.dm"
-#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm"
-#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm"
-#include "modular_citadel\code\modules\arousal\organs\penis.dm"
-#include "modular_citadel\code\modules\arousal\organs\testicles.dm"
-#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
-#include "modular_citadel\code\modules\arousal\organs\womb.dm"
-#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
-#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm"
-#include "modular_citadel\code\modules\cargo\console.dm"
-#include "modular_citadel\code\modules\client\client_defines.dm"
-#include "modular_citadel\code\modules\client\client_procs.dm"
-#include "modular_citadel\code\modules\client\preferences.dm"
-#include "modular_citadel\code\modules\client\preferences_savefile.dm"
-#include "modular_citadel\code\modules\client\preferences_toggles.dm"
-#include "modular_citadel\code\modules\client\loadout\__donator.dm"
-#include "modular_citadel\code\modules\client\loadout\_medical.dm"
-#include "modular_citadel\code\modules\client\loadout\_security.dm"
-#include "modular_citadel\code\modules\client\loadout\_service.dm"
-#include "modular_citadel\code\modules\client\loadout\backpack.dm"
-#include "modular_citadel\code\modules\client\loadout\glasses.dm"
-#include "modular_citadel\code\modules\client\loadout\gloves.dm"
-#include "modular_citadel\code\modules\client\loadout\hands.dm"
-#include "modular_citadel\code\modules\client\loadout\head.dm"
-#include "modular_citadel\code\modules\client\loadout\loadout.dm"
-#include "modular_citadel\code\modules\client\loadout\mask.dm"
-#include "modular_citadel\code\modules\client\loadout\neck.dm"
-#include "modular_citadel\code\modules\client\loadout\shoes.dm"
-#include "modular_citadel\code\modules\client\loadout\suit.dm"
-#include "modular_citadel\code\modules\client\loadout\uniform.dm"
-#include "modular_citadel\code\modules\client\verbs\who.dm"
-#include "modular_citadel\code\modules\clothing\clothing.dm"
-#include "modular_citadel\code\modules\clothing\neck.dm"
-#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm"
-#include "modular_citadel\code\modules\clothing\head\head.dm"
-#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm"
-#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm"
-#include "modular_citadel\code\modules\clothing\suits\polychromic_suit.dm"
-#include "modular_citadel\code\modules\clothing\suits\suits.dm"
-#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm"
-#include "modular_citadel\code\modules\clothing\under\trek_under.dm"
-#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
-#include "modular_citadel\code\modules\clothing\under\under.dm"
-#include "modular_citadel\code\modules\crafting\recipes.dm"
-#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
-#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
-#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
-#include "modular_citadel\code\modules\events\blob.dm"
-#include "modular_citadel\code\modules\events\wizard\magicarp.dm"
-#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm"
-#include "modular_citadel\code\modules\mentor\follow.dm"
-#include "modular_citadel\code\modules\mentor\mentor.dm"
-#include "modular_citadel\code\modules\mentor\mentor_memo.dm"
-#include "modular_citadel\code\modules\mentor\mentor_verbs.dm"
-#include "modular_citadel\code\modules\mentor\mentorhelp.dm"
-#include "modular_citadel\code\modules\mentor\mentorpm.dm"
-#include "modular_citadel\code\modules\mentor\mentorsay.dm"
-#include "modular_citadel\code\modules\mining\mining_ruins.dm"
-#include "modular_citadel\code\modules\mob\cit_emotes.dm"
-#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm"
-#include "modular_citadel\code\modules\mob\living\damage_procs.dm"
-#include "modular_citadel\code\modules\mob\living\living.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\life.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm"
-#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
-#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm"
-#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
-#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm"
-#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm"
-#include "modular_citadel\code\modules\power\lighting.dm"
-#include "modular_citadel\code\modules\projectiles\gun.dm"
-#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm"
-#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm"
-#include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
-#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm"
-#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm"
-#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm"
-#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm"
-#include "modular_citadel\code\modules\projectiles\guns\toys.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm"
-#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
-#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
-#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
-#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm"
-#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm"
-#include "modular_citadel\code\modules\reagents\objects\clothes.dm"
-#include "modular_citadel\code\modules\reagents\objects\items.dm"
-#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
-#include "modular_citadel\code\modules\recycling\disposal\bin.dm"
-#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
-#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
-#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm"
-#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
-#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm"
-#include "modular_citadel\code\modules\vehicles\secway.dm"
-#include "modular_citadel\code\modules\vore\hook-defs_vr.dm"
-#include "modular_citadel\code\modules\vore\persistence.dm"
-#include "modular_citadel\code\modules\vore\trycatch_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\living_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\vore_vr.dm"
-#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
-#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
-#include "modular_citadel\interface\skin.dmf"
-#include "yogstation\code\modules\power\energyharvester.dm"
-// END_INCLUDE
+
+// DM Environment file for tgstation.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 "_maps\_basemap.dm"
+#include "_maps\layeniastation.dm"
+#include "_maps\map_files\generic\CentCom.dmm"
+#include "code\_compile_options.dm"
+#include "code\world.dm"
+#include "code\__DEFINES\_globals.dm"
+#include "code\__DEFINES\_protect.dm"
+#include "code\__DEFINES\_tick.dm"
+#include "code\__DEFINES\access.dm"
+#include "code\__DEFINES\admin.dm"
+#include "code\__DEFINES\antagonists.dm"
+#include "code\__DEFINES\atmospherics.dm"
+#include "code\__DEFINES\atom_hud.dm"
+#include "code\__DEFINES\bsql.config.dm"
+#include "code\__DEFINES\bsql.dm"
+#include "code\__DEFINES\callbacks.dm"
+#include "code\__DEFINES\cargo.dm"
+#include "code\__DEFINES\cinematics.dm"
+#include "code\__DEFINES\citadel_defines.dm"
+#include "code\__DEFINES\cleaning.dm"
+#include "code\__DEFINES\clockcult.dm"
+#include "code\__DEFINES\colors.dm"
+#include "code\__DEFINES\combat.dm"
+#include "code\__DEFINES\components.dm"
+#include "code\__DEFINES\configuration.dm"
+#include "code\__DEFINES\construction.dm"
+#include "code\__DEFINES\contracts.dm"
+#include "code\__DEFINES\cult.dm"
+#include "code\__DEFINES\diseases.dm"
+#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\events.dm"
+#include "code\__DEFINES\exports.dm"
+#include "code\__DEFINES\flags.dm"
+#include "code\__DEFINES\food.dm"
+#include "code\__DEFINES\footsteps.dm"
+#include "code\__DEFINES\hud.dm"
+#include "code\__DEFINES\integrated_electronics.dm"
+#include "code\__DEFINES\interaction_flags.dm"
+#include "code\__DEFINES\inventory.dm"
+#include "code\__DEFINES\is_helpers.dm"
+#include "code\__DEFINES\jobs.dm"
+#include "code\__DEFINES\language.dm"
+#include "code\__DEFINES\layers.dm"
+#include "code\__DEFINES\lighting.dm"
+#include "code\__DEFINES\logging.dm"
+#include "code\__DEFINES\machines.dm"
+#include "code\__DEFINES\maps.dm"
+#include "code\__DEFINES\maths.dm"
+#include "code\__DEFINES\MC.dm"
+#include "code\__DEFINES\mecha.dm"
+#include "code\__DEFINES\medal.dm"
+#include "code\__DEFINES\melee.dm"
+#include "code\__DEFINES\menu.dm"
+#include "code\__DEFINES\misc.dm"
+#include "code\__DEFINES\mobs.dm"
+#include "code\__DEFINES\monkeys.dm"
+#include "code\__DEFINES\move_force.dm"
+#include "code\__DEFINES\movement.dm"
+#include "code\__DEFINES\movespeed_modification.dm"
+#include "code\__DEFINES\nanites.dm"
+#include "code\__DEFINES\networks.dm"
+#include "code\__DEFINES\obj_flags.dm"
+#include "code\__DEFINES\pinpointers.dm"
+#include "code\__DEFINES\pipe_construction.dm"
+#include "code\__DEFINES\pool.dm"
+#include "code\__DEFINES\preferences.dm"
+#include "code\__DEFINES\procpath.dm"
+#include "code\__DEFINES\profile.dm"
+#include "code\__DEFINES\qdel.dm"
+#include "code\__DEFINES\quirks.dm"
+#include "code\__DEFINES\radiation.dm"
+#include "code\__DEFINES\radio.dm"
+#include "code\__DEFINES\reactions.dm"
+#include "code\__DEFINES\reagents.dm"
+#include "code\__DEFINES\reagents_specific_heat.dm"
+#include "code\__DEFINES\research.dm"
+#include "code\__DEFINES\robots.dm"
+#include "code\__DEFINES\role_preferences.dm"
+#include "code\__DEFINES\rust_g.config.dm"
+#include "code\__DEFINES\rust_g.dm"
+#include "code\__DEFINES\say.dm"
+#include "code\__DEFINES\shuttles.dm"
+#include "code\__DEFINES\sight.dm"
+#include "code\__DEFINES\sound.dm"
+#include "code\__DEFINES\spaceman_dmm.dm"
+#include "code\__DEFINES\stat.dm"
+#include "code\__DEFINES\stat_tracking.dm"
+#include "code\__DEFINES\status_effects.dm"
+#include "code\__DEFINES\subsystems.dm"
+#include "code\__DEFINES\tgs.config.dm"
+#include "code\__DEFINES\tgs.dm"
+#include "code\__DEFINES\tgui.dm"
+#include "code\__DEFINES\time.dm"
+#include "code\__DEFINES\tools.dm"
+#include "code\__DEFINES\traits.dm"
+#include "code\__DEFINES\turf_flags.dm"
+#include "code\__DEFINES\typeids.dm"
+#include "code\__DEFINES\vehicles.dm"
+#include "code\__DEFINES\voreconstants.dm"
+#include "code\__DEFINES\vv.dm"
+#include "code\__DEFINES\wall_dents.dm"
+#include "code\__DEFINES\wires.dm"
+#include "code\__DEFINES\dcs\signals.dm"
+#include "code\__HELPERS\_cit_helpers.dm"
+#include "code\__HELPERS\_lists.dm"
+#include "code\__HELPERS\_logging.dm"
+#include "code\__HELPERS\_string_lists.dm"
+#include "code\__HELPERS\areas.dm"
+#include "code\__HELPERS\AStar.dm"
+#include "code\__HELPERS\cmp.dm"
+#include "code\__HELPERS\dates.dm"
+#include "code\__HELPERS\dna.dm"
+#include "code\__HELPERS\files.dm"
+#include "code\__HELPERS\game.dm"
+#include "code\__HELPERS\global_lists.dm"
+#include "code\__HELPERS\heap.dm"
+#include "code\__HELPERS\icon_smoothing.dm"
+#include "code\__HELPERS\icons.dm"
+#include "code\__HELPERS\level_traits.dm"
+#include "code\__HELPERS\matrices.dm"
+#include "code\__HELPERS\mobs.dm"
+#include "code\__HELPERS\mouse_control.dm"
+#include "code\__HELPERS\names.dm"
+#include "code\__HELPERS\priority_announce.dm"
+#include "code\__HELPERS\pronouns.dm"
+#include "code\__HELPERS\qdel.dm"
+#include "code\__HELPERS\radiation.dm"
+#include "code\__HELPERS\radio.dm"
+#include "code\__HELPERS\reagents.dm"
+#include "code\__HELPERS\roundend.dm"
+#include "code\__HELPERS\sanitize_values.dm"
+#include "code\__HELPERS\shell.dm"
+#include "code\__HELPERS\stat_tracking.dm"
+#include "code\__HELPERS\text.dm"
+#include "code\__HELPERS\text_vr.dm"
+#include "code\__HELPERS\time.dm"
+#include "code\__HELPERS\type2type.dm"
+#include "code\__HELPERS\type2type_vr.dm"
+#include "code\__HELPERS\typelists.dm"
+#include "code\__HELPERS\unsorted.dm"
+#include "code\__HELPERS\verbs.dm"
+#include "code\__HELPERS\view.dm"
+#include "code\__HELPERS\sorts\__main.dm"
+#include "code\__HELPERS\sorts\InsertSort.dm"
+#include "code\__HELPERS\sorts\MergeSort.dm"
+#include "code\__HELPERS\sorts\TimSort.dm"
+#include "code\_globalvars\bitfields.dm"
+#include "code\_globalvars\configuration.dm"
+#include "code\_globalvars\game_modes.dm"
+#include "code\_globalvars\genetics.dm"
+#include "code\_globalvars\logging.dm"
+#include "code\_globalvars\misc.dm"
+#include "code\_globalvars\regexes.dm"
+#include "code\_globalvars\lists\flavor_misc.dm"
+#include "code\_globalvars\lists\maintenance_loot.dm"
+#include "code\_globalvars\lists\mapping.dm"
+#include "code\_globalvars\lists\medals.dm"
+#include "code\_globalvars\lists\mobs.dm"
+#include "code\_globalvars\lists\names.dm"
+#include "code\_globalvars\lists\objects.dm"
+#include "code\_globalvars\lists\poll_ignore.dm"
+#include "code\_globalvars\lists\typecache.dm"
+#include "code\_globalvars\lists\vending.dm"
+#include "code\_js\byjax.dm"
+#include "code\_js\menus.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\overmind.dm"
+#include "code\_onclick\telekinesis.dm"
+#include "code\_onclick\hud\_defines.dm"
+#include "code\_onclick\hud\action_button.dm"
+#include "code\_onclick\hud\ai.dm"
+#include "code\_onclick\hud\alert.dm"
+#include "code\_onclick\hud\alien.dm"
+#include "code\_onclick\hud\alien_larva.dm"
+#include "code\_onclick\hud\blob_overmind.dm"
+#include "code\_onclick\hud\blobbernauthud.dm"
+#include "code\_onclick\hud\constructs.dm"
+#include "code\_onclick\hud\credits.dm"
+#include "code\_onclick\hud\devil.dm"
+#include "code\_onclick\hud\drones.dm"
+#include "code\_onclick\hud\fullscreen.dm"
+#include "code\_onclick\hud\generic_dextrous.dm"
+#include "code\_onclick\hud\ghost.dm"
+#include "code\_onclick\hud\guardian.dm"
+#include "code\_onclick\hud\hud.dm"
+#include "code\_onclick\hud\human.dm"
+#include "code\_onclick\hud\monkey.dm"
+#include "code\_onclick\hud\movable_screen_objects.dm"
+#include "code\_onclick\hud\parallax.dm"
+#include "code\_onclick\hud\picture_in_picture.dm"
+#include "code\_onclick\hud\plane_master.dm"
+#include "code\_onclick\hud\radial.dm"
+#include "code\_onclick\hud\radial_persistent.dm"
+#include "code\_onclick\hud\revenanthud.dm"
+#include "code\_onclick\hud\robot.dm"
+#include "code\_onclick\hud\screen_objects.dm"
+#include "code\_onclick\hud\swarmer.dm"
+#include "code\controllers\admin.dm"
+#include "code\controllers\configuration_citadel.dm"
+#include "code\controllers\controller.dm"
+#include "code\controllers\failsafe.dm"
+#include "code\controllers\globals.dm"
+#include "code\controllers\hooks.dm"
+#include "code\controllers\master.dm"
+#include "code\controllers\subsystem.dm"
+#include "code\controllers\configuration\config_entry.dm"
+#include "code\controllers\configuration\configuration.dm"
+#include "code\controllers\configuration\entries\comms.dm"
+#include "code\controllers\configuration\entries\dbconfig.dm"
+#include "code\controllers\configuration\entries\game_options.dm"
+#include "code\controllers\configuration\entries\general.dm"
+#include "code\controllers\subsystem\acid.dm"
+#include "code\controllers\subsystem\adjacent_air.dm"
+#include "code\controllers\subsystem\air.dm"
+#include "code\controllers\subsystem\air_turfs.dm"
+#include "code\controllers\subsystem\assets.dm"
+#include "code\controllers\subsystem\atoms.dm"
+#include "code\controllers\subsystem\augury.dm"
+#include "code\controllers\subsystem\autotransfer.dm"
+#include "code\controllers\subsystem\blackbox.dm"
+#include "code\controllers\subsystem\chat.dm"
+#include "code\controllers\subsystem\communications.dm"
+#include "code\controllers\subsystem\dbcore.dm"
+#include "code\controllers\subsystem\dcs.dm"
+#include "code\controllers\subsystem\disease.dm"
+#include "code\controllers\subsystem\events.dm"
+#include "code\controllers\subsystem\fire_burning.dm"
+#include "code\controllers\subsystem\garbage.dm"
+#include "code\controllers\subsystem\icon_smooth.dm"
+#include "code\controllers\subsystem\idlenpcpool.dm"
+#include "code\controllers\subsystem\input.dm"
+#include "code\controllers\subsystem\ipintel.dm"
+#include "code\controllers\subsystem\item_spawning.dm"
+#include "code\controllers\subsystem\job.dm"
+#include "code\controllers\subsystem\jukeboxes.dm"
+#include "code\controllers\subsystem\language.dm"
+#include "code\controllers\subsystem\lighting.dm"
+#include "code\controllers\subsystem\machines.dm"
+#include "code\controllers\subsystem\mapping.dm"
+#include "code\controllers\subsystem\medals.dm"
+#include "code\controllers\subsystem\minor_mapping.dm"
+#include "code\controllers\subsystem\mobs.dm"
+#include "code\controllers\subsystem\moods.dm"
+#include "code\controllers\subsystem\nightshift.dm"
+#include "code\controllers\subsystem\npcpool.dm"
+#include "code\controllers\subsystem\overlays.dm"
+#include "code\controllers\subsystem\pai.dm"
+#include "code\controllers\subsystem\parallax.dm"
+#include "code\controllers\subsystem\pathfinder.dm"
+#include "code\controllers\subsystem\persistence.dm"
+#include "code\controllers\subsystem\ping.dm"
+#include "code\controllers\subsystem\radiation.dm"
+#include "code\controllers\subsystem\radio.dm"
+#include "code\controllers\subsystem\research.dm"
+#include "code\controllers\subsystem\server_maint.dm"
+#include "code\controllers\subsystem\shuttle.dm"
+#include "code\controllers\subsystem\spacedrift.dm"
+#include "code\controllers\subsystem\statpanel.dm"
+#include "code\controllers\subsystem\stickyban.dm"
+#include "code\controllers\subsystem\sun.dm"
+#include "code\controllers\subsystem\tgui.dm"
+#include "code\controllers\subsystem\throwing.dm"
+#include "code\controllers\subsystem\ticker.dm"
+#include "code\controllers\subsystem\time_track.dm"
+#include "code\controllers\subsystem\timer.dm"
+#include "code\controllers\subsystem\title.dm"
+#include "code\controllers\subsystem\traumas.dm"
+#include "code\controllers\subsystem\vis_overlays.dm"
+#include "code\controllers\subsystem\vore.dm"
+#include "code\controllers\subsystem\vote.dm"
+#include "code\controllers\subsystem\weather.dm"
+#include "code\controllers\subsystem\processing\chemistry.dm"
+#include "code\controllers\subsystem\processing\circuit.dm"
+#include "code\controllers\subsystem\processing\fastprocess.dm"
+#include "code\controllers\subsystem\processing\fields.dm"
+#include "code\controllers\subsystem\processing\nanites.dm"
+#include "code\controllers\subsystem\processing\networks.dm"
+#include "code\controllers\subsystem\processing\obj.dm"
+#include "code\controllers\subsystem\processing\processing.dm"
+#include "code\controllers\subsystem\processing\projectiles.dm"
+#include "code\controllers\subsystem\processing\quirks.dm"
+#include "code\controllers\subsystem\processing\wet_floors.dm"
+#include "code\datums\action.dm"
+#include "code\datums\ai_laws.dm"
+#include "code\datums\armor.dm"
+#include "code\datums\beam.dm"
+#include "code\datums\browser.dm"
+#include "code\datums\callback.dm"
+#include "code\datums\chatmessage.dm"
+#include "code\datums\cinematic.dm"
+#include "code\datums\dash_weapon.dm"
+#include "code\datums\datacore.dm"
+#include "code\datums\datum.dm"
+#include "code\datums\datumvars.dm"
+#include "code\datums\dna.dm"
+#include "code\datums\dog_fashion.dm"
+#include "code\datums\embedding_behavior.dm"
+#include "code\datums\emotes.dm"
+#include "code\datums\ert.dm"
+#include "code\datums\explosion.dm"
+#include "code\datums\forced_movement.dm"
+#include "code\datums\holocall.dm"
+#include "code\datums\http.dm"
+#include "code\datums\hud.dm"
+#include "code\datums\map_config.dm"
+#include "code\datums\martial.dm"
+#include "code\datums\mind.dm"
+#include "code\datums\mutable_appearance.dm"
+#include "code\datums\numbered_display.dm"
+#include "code\datums\outfit.dm"
+#include "code\datums\position_point_vector.dm"
+#include "code\datums\profiling.dm"
+#include "code\datums\progressbar.dm"
+#include "code\datums\radiation_wave.dm"
+#include "code\datums\recipe.dm"
+#include "code\datums\ruins.dm"
+#include "code\datums\saymode.dm"
+#include "code\datums\shuttles.dm"
+#include "code\datums\soullink.dm"
+#include "code\datums\spawners_menu.dm"
+#include "code\datums\verbs.dm"
+#include "code\datums\weakrefs.dm"
+#include "code\datums\world_topic.dm"
+#include "code\datums\actions\beam_rifle.dm"
+#include "code\datums\actions\ninja.dm"
+#include "code\datums\brain_damage\brain_trauma.dm"
+#include "code\datums\brain_damage\hypnosis.dm"
+#include "code\datums\brain_damage\imaginary_friend.dm"
+#include "code\datums\brain_damage\mild.dm"
+#include "code\datums\brain_damage\phobia.dm"
+#include "code\datums\brain_damage\severe.dm"
+#include "code\datums\brain_damage\special.dm"
+#include "code\datums\brain_damage\split_personality.dm"
+#include "code\datums\components\_component.dm"
+#include "code\datums\components\anti_magic.dm"
+#include "code\datums\components\armor_plate.dm"
+#include "code\datums\components\bouncy.dm"
+#include "code\datums\components\butchering.dm"
+#include "code\datums\components\caltrop.dm"
+#include "code\datums\components\chasm.dm"
+#include "code\datums\components\construction.dm"
+#include "code\datums\components\decal.dm"
+#include "code\datums\components\earprotection.dm"
+#include "code\datums\components\edit_complainer.dm"
+#include "code\datums\components\empprotection.dm"
+#include "code\datums\components\footstep.dm"
+#include "code\datums\components\forced_gravity.dm"
+#include "code\datums\components\infective.dm"
+#include "code\datums\components\jousting.dm"
+#include "code\datums\components\knockoff.dm"
+#include "code\datums\components\lockon_aiming.dm"
+#include "code\datums\components\magnetic_catch.dm"
+#include "code\datums\components\material_container.dm"
+#include "code\datums\components\mirage_border.dm"
+#include "code\datums\components\mood.dm"
+#include "code\datums\components\nanites.dm"
+#include "code\datums\components\ntnet_interface.dm"
+#include "code\datums\components\orbiter.dm"
+#include "code\datums\components\paintable.dm"
+#include "code\datums\components\rad_insulation.dm"
+#include "code\datums\components\radioactive.dm"
+#include "code\datums\components\remote_materials.dm"
+#include "code\datums\components\riding.dm"
+#include "code\datums\components\rotation.dm"
+#include "code\datums\components\signal_redirect.dm"
+#include "code\datums\components\sizzle.dm"
+#include "code\datums\components\slippery.dm"
+#include "code\datums\components\spawner.dm"
+#include "code\datums\components\spooky.dm"
+#include "code\datums\components\squeak.dm"
+#include "code\datums\components\stationloving.dm"
+#include "code\datums\components\swarming.dm"
+#include "code\datums\components\thermite.dm"
+#include "code\datums\components\twitch_plays.dm"
+#include "code\datums\components\uplink.dm"
+#include "code\datums\components\wearertargeting.dm"
+#include "code\datums\components\wet_floor.dm"
+#include "code\datums\components\crafting\craft.dm"
+#include "code\datums\components\crafting\guncrafting.dm"
+#include "code\datums\components\crafting\recipes.dm"
+#include "code\datums\components\crafting\recipes\recipes_clothing.dm"
+#include "code\datums\components\crafting\recipes\recipes_misc.dm"
+#include "code\datums\components\crafting\recipes\recipes_primal.dm"
+#include "code\datums\components\crafting\recipes\recipes_robot.dm"
+#include "code\datums\components\crafting\recipes\recipes_weapon_and_ammo.dm"
+#include "code\datums\components\storage\storage.dm"
+#include "code\datums\components\storage\concrete\_concrete.dm"
+#include "code\datums\components\storage\concrete\bag_of_holding.dm"
+#include "code\datums\components\storage\concrete\bluespace.dm"
+#include "code\datums\components\storage\concrete\emergency.dm"
+#include "code\datums\components\storage\concrete\implant.dm"
+#include "code\datums\components\storage\concrete\pockets.dm"
+#include "code\datums\components\storage\concrete\rped.dm"
+#include "code\datums\components\storage\concrete\special.dm"
+#include "code\datums\components\storage\concrete\stack.dm"
+#include "code\datums\diseases\_disease.dm"
+#include "code\datums\diseases\_MobProcs.dm"
+#include "code\datums\diseases\anxiety.dm"
+#include "code\datums\diseases\appendicitis.dm"
+#include "code\datums\diseases\beesease.dm"
+#include "code\datums\diseases\brainrot.dm"
+#include "code\datums\diseases\cold.dm"
+#include "code\datums\diseases\cold9.dm"
+#include "code\datums\diseases\dna_spread.dm"
+#include "code\datums\diseases\fake_gbs.dm"
+#include "code\datums\diseases\flu.dm"
+#include "code\datums\diseases\fluspanish.dm"
+#include "code\datums\diseases\gbs.dm"
+#include "code\datums\diseases\heart_failure.dm"
+#include "code\datums\diseases\magnitis.dm"
+#include "code\datums\diseases\parrotpossession.dm"
+#include "code\datums\diseases\pierrot_throat.dm"
+#include "code\datums\diseases\retrovirus.dm"
+#include "code\datums\diseases\rhumba_beat.dm"
+#include "code\datums\diseases\transformation.dm"
+#include "code\datums\diseases\tuberculosis.dm"
+#include "code\datums\diseases\wizarditis.dm"
+#include "code\datums\diseases\advance\advance.dm"
+#include "code\datums\diseases\advance\presets.dm"
+#include "code\datums\diseases\advance\symptoms\beard.dm"
+#include "code\datums\diseases\advance\symptoms\choking.dm"
+#include "code\datums\diseases\advance\symptoms\confusion.dm"
+#include "code\datums\diseases\advance\symptoms\cough.dm"
+#include "code\datums\diseases\advance\symptoms\deafness.dm"
+#include "code\datums\diseases\advance\symptoms\dizzy.dm"
+#include "code\datums\diseases\advance\symptoms\fever.dm"
+#include "code\datums\diseases\advance\symptoms\fire.dm"
+#include "code\datums\diseases\advance\symptoms\flesh_eating.dm"
+#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
+#include "code\datums\diseases\advance\symptoms\headache.dm"
+#include "code\datums\diseases\advance\symptoms\heal.dm"
+#include "code\datums\diseases\advance\symptoms\itching.dm"
+#include "code\datums\diseases\advance\symptoms\nanites.dm"
+#include "code\datums\diseases\advance\symptoms\narcolepsy.dm"
+#include "code\datums\diseases\advance\symptoms\oxygen.dm"
+#include "code\datums\diseases\advance\symptoms\sensory.dm"
+#include "code\datums\diseases\advance\symptoms\shedding.dm"
+#include "code\datums\diseases\advance\symptoms\shivering.dm"
+#include "code\datums\diseases\advance\symptoms\skin.dm"
+#include "code\datums\diseases\advance\symptoms\sneeze.dm"
+#include "code\datums\diseases\advance\symptoms\species.dm"
+#include "code\datums\diseases\advance\symptoms\symptoms.dm"
+#include "code\datums\diseases\advance\symptoms\viral.dm"
+#include "code\datums\diseases\advance\symptoms\vision.dm"
+#include "code\datums\diseases\advance\symptoms\voice_change.dm"
+#include "code\datums\diseases\advance\symptoms\vomit.dm"
+#include "code\datums\diseases\advance\symptoms\weight.dm"
+#include "code\datums\diseases\advance\symptoms\youth.dm"
+#include "code\datums\elements\_element.dm"
+#include "code\datums\elements\bed_tucking.dm"
+#include "code\datums\elements\cleaning.dm"
+#include "code\datums\elements\earhealing.dm"
+#include "code\datums\elements\flavor_text.dm"
+#include "code\datums\elements\ghost_role_eligibility.dm"
+#include "code\datums\elements\mob_holder.dm"
+#include "code\datums\elements\swimming.dm"
+#include "code\datums\elements\wuv.dm"
+#include "code\datums\helper_datums\events.dm"
+#include "code\datums\helper_datums\getrev.dm"
+#include "code\datums\helper_datums\icon_snapshot.dm"
+#include "code\datums\helper_datums\teleport.dm"
+#include "code\datums\helper_datums\topic_input.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\weather.dm"
+#include "code\datums\martial\boxing.dm"
+#include "code\datums\martial\cqc.dm"
+#include "code\datums\martial\krav_maga.dm"
+#include "code\datums\martial\mushpunch.dm"
+#include "code\datums\martial\plasma_fist.dm"
+#include "code\datums\martial\psychotic_brawl.dm"
+#include "code\datums\martial\sleeping_carp.dm"
+#include "code\datums\martial\wrestling.dm"
+#include "code\datums\mood_events\beauty_events.dm"
+#include "code\datums\mood_events\drink_events.dm"
+#include "code\datums\mood_events\drug_events.dm"
+#include "code\datums\mood_events\generic_negative_events.dm"
+#include "code\datums\mood_events\generic_positive_events.dm"
+#include "code\datums\mood_events\mood_event.dm"
+#include "code\datums\mood_events\needs_events.dm"
+#include "code\datums\mutations\_mutations.dm"
+#include "code\datums\mutations\actions.dm"
+#include "code\datums\mutations\antenna.dm"
+#include "code\datums\mutations\body.dm"
+#include "code\datums\mutations\chameleon.dm"
+#include "code\datums\mutations\cold_resistance.dm"
+#include "code\datums\mutations\combined.dm"
+#include "code\datums\mutations\hulk.dm"
+#include "code\datums\mutations\radioactive.dm"
+#include "code\datums\mutations\sight.dm"
+#include "code\datums\mutations\speech.dm"
+#include "code\datums\mutations\telekinesis.dm"
+#include "code\datums\ruins\lavaland.dm"
+#include "code\datums\ruins\space.dm"
+#include "code\datums\ruins\station.dm"
+#include "code\datums\status_effects\buffs.dm"
+#include "code\datums\status_effects\debuffs.dm"
+#include "code\datums\status_effects\gas.dm"
+#include "code\datums\status_effects\neutral.dm"
+#include "code\datums\status_effects\status_effect.dm"
+#include "code\datums\traits\_quirk.dm"
+#include "code\datums\traits\good.dm"
+#include "code\datums\traits\negative.dm"
+#include "code\datums\traits\neutral.dm"
+#include "code\datums\weather\weather.dm"
+#include "code\datums\weather\weather_types\acid_rain.dm"
+#include "code\datums\weather\weather_types\ash_storm.dm"
+#include "code\datums\weather\weather_types\floor_is_lava.dm"
+#include "code\datums\weather\weather_types\layenia.dm"
+#include "code\datums\weather\weather_types\radiation_storm.dm"
+#include "code\datums\weather\weather_types\snow_storm.dm"
+#include "code\datums\wires\_wires.dm"
+#include "code\datums\wires\airalarm.dm"
+#include "code\datums\wires\airlock.dm"
+#include "code\datums\wires\apc.dm"
+#include "code\datums\wires\autolathe.dm"
+#include "code\datums\wires\emitter.dm"
+#include "code\datums\wires\explosive.dm"
+#include "code\datums\wires\microwave.dm"
+#include "code\datums\wires\mulebot.dm"
+#include "code\datums\wires\particle_accelerator.dm"
+#include "code\datums\wires\r_n_d.dm"
+#include "code\datums\wires\radio.dm"
+#include "code\datums\wires\robot.dm"
+#include "code\datums\wires\suit_storage_unit.dm"
+#include "code\datums\wires\syndicatebomb.dm"
+#include "code\datums\wires\tesla_coil.dm"
+#include "code\datums\wires\vending.dm"
+#include "code\game\alternate_appearance.dm"
+#include "code\game\atoms.dm"
+#include "code\game\atoms_movable.dm"
+#include "code\game\communications.dm"
+#include "code\game\data_huds.dm"
+#include "code\game\say.dm"
+#include "code\game\shuttle_engines.dm"
+#include "code\game\sound.dm"
+#include "code\game\world.dm"
+#include "code\game\area\ai_monitored.dm"
+#include "code\game\area\areas.dm"
+#include "code\game\area\Space_Station_13_areas.dm"
+#include "code\game\area\areas\away_content.dm"
+#include "code\game\area\areas\centcom.dm"
+#include "code\game\area\areas\holodeck.dm"
+#include "code\game\area\areas\layenia.dm"
+#include "code\game\area\areas\mining.dm"
+#include "code\game\area\areas\shuttles.dm"
+#include "code\game\area\areas\ruins\_ruins.dm"
+#include "code\game\area\areas\ruins\lavaland.dm"
+#include "code\game\area\areas\ruins\space.dm"
+#include "code\game\area\areas\ruins\templates.dm"
+#include "code\game\gamemodes\events.dm"
+#include "code\game\gamemodes\game_mode.dm"
+#include "code\game\gamemodes\objective.dm"
+#include "code\game\gamemodes\objective_items.dm"
+#include "code\game\gamemodes\bloodsucker\bloodsucker.dm"
+#include "code\game\gamemodes\bloodsucker\hunter.dm"
+#include "code\game\gamemodes\brother\traitor_bro.dm"
+#include "code\game\gamemodes\changeling\changeling.dm"
+#include "code\game\gamemodes\changeling\traitor_chan.dm"
+#include "code\game\gamemodes\clock_cult\clock_cult.dm"
+#include "code\game\gamemodes\clown_ops\bananium_bomb.dm"
+#include "code\game\gamemodes\clown_ops\clown_ops.dm"
+#include "code\game\gamemodes\clown_ops\clown_weapons.dm"
+#include "code\game\gamemodes\cult\cult.dm"
+#include "code\game\gamemodes\devil\devil_game_mode.dm"
+#include "code\game\gamemodes\devil\game_mode.dm"
+#include "code\game\gamemodes\devil\objectives.dm"
+#include "code\game\gamemodes\devil\devil agent\devil_agent.dm"
+#include "code\game\gamemodes\dynamic\dynamic.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm"
+#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm"
+#include "code\game\gamemodes\extended\extended.dm"
+#include "code\game\gamemodes\meteor\meteor.dm"
+#include "code\game\gamemodes\meteor\meteors.dm"
+#include "code\game\gamemodes\monkey\monkey.dm"
+#include "code\game\gamemodes\nuclear\nuclear.dm"
+#include "code\game\gamemodes\overthrow\objective.dm"
+#include "code\game\gamemodes\overthrow\overthrow.dm"
+#include "code\game\gamemodes\revolution\revolution.dm"
+#include "code\game\gamemodes\sandbox\airlock_maker.dm"
+#include "code\game\gamemodes\sandbox\h_sandbox.dm"
+#include "code\game\gamemodes\sandbox\sandbox.dm"
+#include "code\game\gamemodes\traitor\double_agents.dm"
+#include "code\game\gamemodes\traitor\traitor.dm"
+#include "code\game\gamemodes\wizard\wizard.dm"
+#include "code\game\machinery\_machinery.dm"
+#include "code\game\machinery\ai_slipper.dm"
+#include "code\game\machinery\airlock_control.dm"
+#include "code\game\machinery\announcement_system.dm"
+#include "code\game\machinery\aug_manipulator.dm"
+#include "code\game\machinery\autolathe.dm"
+#include "code\game\machinery\bank_machine.dm"
+#include "code\game\machinery\Beacon.dm"
+#include "code\game\machinery\bloodbankgen.dm"
+#include "code\game\machinery\buttons.dm"
+#include "code\game\machinery\cell_charger.dm"
+#include "code\game\machinery\cloning.dm"
+#include "code\game\machinery\constructable_frame.dm"
+#include "code\game\machinery\dance_machine.dm"
+#include "code\game\machinery\defibrillator_mount.dm"
+#include "code\game\machinery\deployable.dm"
+#include "code\game\machinery\dish_drive.dm"
+#include "code\game\machinery\dna_scanner.dm"
+#include "code\game\machinery\doppler_array.dm"
+#include "code\game\machinery\droneDispenser.dm"
+#include "code\game\machinery\exp_cloner.dm"
+#include "code\game\machinery\firealarm.dm"
+#include "code\game\machinery\flasher.dm"
+#include "code\game\machinery\gulag_item_reclaimer.dm"
+#include "code\game\machinery\gulag_teleporter.dm"
+#include "code\game\machinery\harvester.dm"
+#include "code\game\machinery\hologram.dm"
+#include "code\game\machinery\igniter.dm"
+#include "code\game\machinery\iv_drip.dm"
+#include "code\game\machinery\launch_pad.dm"
+#include "code\game\machinery\lightswitch.dm"
+#include "code\game\machinery\limbgrower.dm"
+#include "code\game\machinery\magnet.dm"
+#include "code\game\machinery\mass_driver.dm"
+#include "code\game\machinery\navbeacon.dm"
+#include "code\game\machinery\newscaster.dm"
+#include "code\game\machinery\PDApainter.dm"
+#include "code\game\machinery\posi_alert.dm"
+#include "code\game\machinery\quantum_pad.dm"
+#include "code\game\machinery\recharger.dm"
+#include "code\game\machinery\rechargestation.dm"
+#include "code\game\machinery\recycler.dm"
+#include "code\game\machinery\requests_console.dm"
+#include "code\game\machinery\shieldgen.dm"
+#include "code\game\machinery\Sleeper.dm"
+#include "code\game\machinery\slotmachine.dm"
+#include "code\game\machinery\spaceheater.dm"
+#include "code\game\machinery\stasis.dm"
+#include "code\game\machinery\status_display.dm"
+#include "code\game\machinery\suit_storage_unit.dm"
+#include "code\game\machinery\syndicatebeacon.dm"
+#include "code\game\machinery\syndicatebomb.dm"
+#include "code\game\machinery\teleporter.dm"
+#include "code\game\machinery\transformer.dm"
+#include "code\game\machinery\washing_machine.dm"
+#include "code\game\machinery\wishgranter.dm"
+#include "code\game\machinery\camera\camera.dm"
+#include "code\game\machinery\camera\camera_assembly.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\_computer.dm"
+#include "code\game\machinery\computer\aifixer.dm"
+#include "code\game\machinery\computer\apc_control.dm"
+#include "code\game\machinery\computer\arcade.dm"
+#include "code\game\machinery\computer\atmos_alert.dm"
+#include "code\game\machinery\computer\atmos_control.dm"
+#include "code\game\machinery\computer\buildandrepair.dm"
+#include "code\game\machinery\computer\camera.dm"
+#include "code\game\machinery\computer\camera_advanced.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\crew.dm"
+#include "code\game\machinery\computer\dna_console.dm"
+#include "code\game\machinery\computer\launchpad_control.dm"
+#include "code\game\machinery\computer\law.dm"
+#include "code\game\machinery\computer\medical.dm"
+#include "code\game\machinery\computer\Operating.dm"
+#include "code\game\machinery\computer\pod.dm"
+#include "code\game\machinery\computer\robot.dm"
+#include "code\game\machinery\computer\security.dm"
+#include "code\game\machinery\computer\station_alert.dm"
+#include "code\game\machinery\computer\telecrystalconsoles.dm"
+#include "code\game\machinery\computer\teleporter.dm"
+#include "code\game\machinery\computer\arcade\battle.dm"
+#include "code\game\machinery\computer\arcade\minesweeper.dm"
+#include "code\game\machinery\computer\arcade\misc_arcade.dm"
+#include "code\game\machinery\computer\arcade\orion_trail.dm"
+#include "code\game\machinery\computer\prisoner\_prisoner.dm"
+#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm"
+#include "code\game\machinery\computer\prisoner\management.dm"
+#include "code\game\machinery\doors\airlock.dm"
+#include "code\game\machinery\doors\airlock_electronics.dm"
+#include "code\game\machinery\doors\airlock_types.dm"
+#include "code\game\machinery\doors\alarmlock.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\firedoor.dm"
+#include "code\game\machinery\doors\passworddoor.dm"
+#include "code\game\machinery\doors\poddoor.dm"
+#include "code\game\machinery\doors\shutters.dm"
+#include "code\game\machinery\doors\unpowered.dm"
+#include "code\game\machinery\doors\windowdoor.dm"
+#include "code\game\machinery\embedded_controller\access_controller.dm"
+#include "code\game\machinery\embedded_controller\airlock_controller.dm"
+#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
+#include "code\game\machinery\embedded_controller\simple_vent_controller.dm"
+#include "code\game\machinery\pipe\construction.dm"
+#include "code\game\machinery\pipe\pipe_dispenser.dm"
+#include "code\game\machinery\porta_turret\portable_turret.dm"
+#include "code\game\machinery\porta_turret\portable_turret_construct.dm"
+#include "code\game\machinery\porta_turret\portable_turret_cover.dm"
+#include "code\game\machinery\poweredfans\fan_assembly.dm"
+#include "code\game\machinery\poweredfans\poweredfans.dm"
+#include "code\game\machinery\telecomms\broadcasting.dm"
+#include "code\game\machinery\telecomms\machine_interactions.dm"
+#include "code\game\machinery\telecomms\telecomunications.dm"
+#include "code\game\machinery\telecomms\computers\logbrowser.dm"
+#include "code\game\machinery\telecomms\computers\message.dm"
+#include "code\game\machinery\telecomms\computers\telemonitor.dm"
+#include "code\game\machinery\telecomms\machines\allinone.dm"
+#include "code\game\machinery\telecomms\machines\broadcaster.dm"
+#include "code\game\machinery\telecomms\machines\bus.dm"
+#include "code\game\machinery\telecomms\machines\hub.dm"
+#include "code\game\machinery\telecomms\machines\message_server.dm"
+#include "code\game\machinery\telecomms\machines\processor.dm"
+#include "code\game\machinery\telecomms\machines\receiver.dm"
+#include "code\game\machinery\telecomms\machines\relay.dm"
+#include "code\game\machinery\telecomms\machines\server.dm"
+#include "code\game\mecha\mech_bay.dm"
+#include "code\game\mecha\mech_fabricator.dm"
+#include "code\game\mecha\mecha.dm"
+#include "code\game\mecha\mecha_actions.dm"
+#include "code\game\mecha\mecha_construction_paths.dm"
+#include "code\game\mecha\mecha_control_console.dm"
+#include "code\game\mecha\mecha_defense.dm"
+#include "code\game\mecha\mecha_parts.dm"
+#include "code\game\mecha\mecha_topic.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\gygax.dm"
+#include "code\game\mecha\combat\honker.dm"
+#include "code\game\mecha\combat\marauder.dm"
+#include "code\game\mecha\combat\neovgre.dm"
+#include "code\game\mecha\combat\phazon.dm"
+#include "code\game\mecha\combat\reticence.dm"
+#include "code\game\mecha\equipment\mecha_equipment.dm"
+#include "code\game\mecha\equipment\tools\medical_tools.dm"
+#include "code\game\mecha\equipment\tools\mining_tools.dm"
+#include "code\game\mecha\equipment\tools\other_tools.dm"
+#include "code\game\mecha\equipment\tools\work_tools.dm"
+#include "code\game\mecha\equipment\weapons\weapons.dm"
+#include "code\game\mecha\medical\medical.dm"
+#include "code\game\mecha\medical\odysseus.dm"
+#include "code\game\mecha\working\ripley.dm"
+#include "code\game\mecha\working\working.dm"
+#include "code\game\objects\buckling.dm"
+#include "code\game\objects\empulse.dm"
+#include "code\game\objects\items.dm"
+#include "code\game\objects\obj_defense.dm"
+#include "code\game\objects\objs.dm"
+#include "code\game\objects\structures.dm"
+#include "code\game\objects\effects\alien_acid.dm"
+#include "code\game\objects\effects\anomalies.dm"
+#include "code\game\objects\effects\blessing.dm"
+#include "code\game\objects\effects\bump_teleporter.dm"
+#include "code\game\objects\effects\contraband.dm"
+#include "code\game\objects\effects\countdown.dm"
+#include "code\game\objects\effects\effects.dm"
+#include "code\game\objects\effects\forcefields.dm"
+#include "code\game\objects\effects\glowshroom.dm"
+#include "code\game\objects\effects\landmarks.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\proximity.dm"
+#include "code\game\objects\effects\spiders.dm"
+#include "code\game\objects\effects\step_triggers.dm"
+#include "code\game\objects\effects\wanted_poster.dm"
+#include "code\game\objects\effects\decals\cleanable.dm"
+#include "code\game\objects\effects\decals\crayon.dm"
+#include "code\game\objects\effects\decals\decal.dm"
+#include "code\game\objects\effects\decals\misc.dm"
+#include "code\game\objects\effects\decals\remains.dm"
+#include "code\game\objects\effects\decals\cleanable\aliens.dm"
+#include "code\game\objects\effects\decals\cleanable\gibs.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\turfdecal\dirt.dm"
+#include "code\game\objects\effects\decals\turfdecal\markings.dm"
+#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm"
+#include "code\game\objects\effects\decals\turfdecal\weather.dm"
+#include "code\game\objects\effects\effect_system\effect_system.dm"
+#include "code\game\objects\effects\effect_system\effects_explosion.dm"
+#include "code\game\objects\effects\effect_system\effects_foam.dm"
+#include "code\game\objects\effects\effect_system\effects_other.dm"
+#include "code\game\objects\effects\effect_system\effects_smoke.dm"
+#include "code\game\objects\effects\effect_system\effects_sparks.dm"
+#include "code\game\objects\effects\effect_system\effects_water.dm"
+#include "code\game\objects\effects\spawners\bombspawner.dm"
+#include "code\game\objects\effects\spawners\bundle.dm"
+#include "code\game\objects\effects\spawners\gibspawner.dm"
+#include "code\game\objects\effects\spawners\lootdrop.dm"
+#include "code\game\objects\effects\spawners\structure.dm"
+#include "code\game\objects\effects\spawners\traps.dm"
+#include "code\game\objects\effects\spawners\vaultspawner.dm"
+#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm"
+#include "code\game\objects\effects\temporary_visuals\clockcult.dm"
+#include "code\game\objects\effects\temporary_visuals\cult.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\AI_modules.dm"
+#include "code\game\objects\items\airlock_painter.dm"
+#include "code\game\objects\items\apc_frame.dm"
+#include "code\game\objects\items\blueprints.dm"
+#include "code\game\objects\items\body_egg.dm"
+#include "code\game\objects\items\bodybag.dm"
+#include "code\game\objects\items\candle.dm"
+#include "code\game\objects\items\cardboard_cutouts.dm"
+#include "code\game\objects\items\cards_ids.dm"
+#include "code\game\objects\items\charter.dm"
+#include "code\game\objects\items\chromosome.dm"
+#include "code\game\objects\items\chrono_eraser.dm"
+#include "code\game\objects\items\cigs_lighters.dm"
+#include "code\game\objects\items\clown_items.dm"
+#include "code\game\objects\items\control_wand.dm"
+#include "code\game\objects\items\cosmetics.dm"
+#include "code\game\objects\items\courtroom.dm"
+#include "code\game\objects\items\crayons.dm"
+#include "code\game\objects\items\defib.dm"
+#include "code\game\objects\items\dehy_carp.dm"
+#include "code\game\objects\items\dice.dm"
+#include "code\game\objects\items\dna_injector.dm"
+#include "code\game\objects\items\documents.dm"
+#include "code\game\objects\items\eightball.dm"
+#include "code\game\objects\items\extinguisher.dm"
+#include "code\game\objects\items\flamethrower.dm"
+#include "code\game\objects\items\gift.dm"
+#include "code\game\objects\items\granters.dm"
+#include "code\game\objects\items\handcuffs.dm"
+#include "code\game\objects\items\his_grace.dm"
+#include "code\game\objects\items\holosign_creator.dm"
+#include "code\game\objects\items\holy_weapons.dm"
+#include "code\game\objects\items\hot_potato.dm"
+#include "code\game\objects\items\inducer.dm"
+#include "code\game\objects\items\kitchen.dm"
+#include "code\game\objects\items\latexballoon.dm"
+#include "code\game\objects\items\lorebooks.dm"
+#include "code\game\objects\items\manuals.dm"
+#include "code\game\objects\items\mesmetron.dm"
+#include "code\game\objects\items\miscellaneous.dm"
+#include "code\game\objects\items\mop.dm"
+#include "code\game\objects\items\paint.dm"
+#include "code\game\objects\items\paiwire.dm"
+#include "code\game\objects\items\pet_carrier.dm"
+#include "code\game\objects\items\pinpointer.dm"
+#include "code\game\objects\items\plushes.dm"
+#include "code\game\objects\items\pneumaticCannon.dm"
+#include "code\game\objects\items\powerfist.dm"
+#include "code\game\objects\items\RCD.dm"
+#include "code\game\objects\items\RCL.dm"
+#include "code\game\objects\items\religion.dm"
+#include "code\game\objects\items\RPD.dm"
+#include "code\game\objects\items\RSF.dm"
+#include "code\game\objects\items\scrolls.dm"
+#include "code\game\objects\items\sharpener.dm"
+#include "code\game\objects\items\shields.dm"
+#include "code\game\objects\items\shooting_range.dm"
+#include "code\game\objects\items\signs.dm"
+#include "code\game\objects\items\singularityhammer.dm"
+#include "code\game\objects\items\stunbaton.dm"
+#include "code\game\objects\items\taster.dm"
+#include "code\game\objects\items\teleportation.dm"
+#include "code\game\objects\items\teleprod.dm"
+#include "code\game\objects\items\theft_tools.dm"
+#include "code\game\objects\items\toys.dm"
+#include "code\game\objects\items\trash.dm"
+#include "code\game\objects\items\twohanded.dm"
+#include "code\game\objects\items\vending_items.dm"
+#include "code\game\objects\items\weaponry.dm"
+#include "code\game\objects\items\circuitboards\circuitboard.dm"
+#include "code\game\objects\items\circuitboards\computer_circuitboards.dm"
+#include "code\game\objects\items\circuitboards\machine_circuitboards.dm"
+#include "code\game\objects\items\devices\aicard.dm"
+#include "code\game\objects\items\devices\anomaly_neutralizer.dm"
+#include "code\game\objects\items\devices\beacon.dm"
+#include "code\game\objects\items\devices\camera_bug.dm"
+#include "code\game\objects\items\devices\chameleonproj.dm"
+#include "code\game\objects\items\devices\compressionkit.dm"
+#include "code\game\objects\items\devices\desynchronizer.dm"
+#include "code\game\objects\items\devices\dogborg_sleeper.dm"
+#include "code\game\objects\items\devices\doorCharge.dm"
+#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
+#include "code\game\objects\items\devices\flashlight.dm"
+#include "code\game\objects\items\devices\forcefieldprojector.dm"
+#include "code\game\objects\items\devices\geiger_counter.dm"
+#include "code\game\objects\items\devices\glue.dm"
+#include "code\game\objects\items\devices\gps.dm"
+#include "code\game\objects\items\devices\instruments.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\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\pressureplates.dm"
+#include "code\game\objects\items\devices\quantum_keycard.dm"
+#include "code\game\objects\items\devices\reverse_bear_trap.dm"
+#include "code\game\objects\items\devices\scanners.dm"
+#include "code\game\objects\items\devices\sensor_device.dm"
+#include "code\game\objects\items\devices\taperecorder.dm"
+#include "code\game\objects\items\devices\traitordevices.dm"
+#include "code\game\objects\items\devices\transfer_valve.dm"
+#include "code\game\objects\items\devices\PDA\cart.dm"
+#include "code\game\objects\items\devices\PDA\PDA.dm"
+#include "code\game\objects\items\devices\PDA\PDA_types.dm"
+#include "code\game\objects\items\devices\PDA\radio.dm"
+#include "code\game\objects\items\devices\PDA\virus_cart.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\headset.dm"
+#include "code\game\objects\items\devices\radio\intercom.dm"
+#include "code\game\objects\items\devices\radio\radio.dm"
+#include "code\game\objects\items\grenades\antigravity.dm"
+#include "code\game\objects\items\grenades\chem_grenade.dm"
+#include "code\game\objects\items\grenades\clusterbuster.dm"
+#include "code\game\objects\items\grenades\emgrenade.dm"
+#include "code\game\objects\items\grenades\flashbang.dm"
+#include "code\game\objects\items\grenades\ghettobomb.dm"
+#include "code\game\objects\items\grenades\grenade.dm"
+#include "code\game\objects\items\grenades\plastic.dm"
+#include "code\game\objects\items\grenades\smokebomb.dm"
+#include "code\game\objects\items\grenades\spawnergrenade.dm"
+#include "code\game\objects\items\grenades\syndieminibomb.dm"
+#include "code\game\objects\items\implants\implant.dm"
+#include "code\game\objects\items\implants\implant_abductor.dm"
+#include "code\game\objects\items\implants\implant_chem.dm"
+#include "code\game\objects\items\implants\implant_clown.dm"
+#include "code\game\objects\items\implants\implant_CQC.dm"
+#include "code\game\objects\items\implants\implant_exile.dm"
+#include "code\game\objects\items\implants\implant_explosive.dm"
+#include "code\game\objects\items\implants\implant_freedom.dm"
+#include "code\game\objects\items\implants\implant_krav_maga.dm"
+#include "code\game\objects\items\implants\implant_mindshield.dm"
+#include "code\game\objects\items\implants\implant_misc.dm"
+#include "code\game\objects\items\implants\implant_mushpunch.dm"
+#include "code\game\objects\items\implants\implant_plasmafist.dm"
+#include "code\game\objects\items\implants\implant_psychobrawl.dm"
+#include "code\game\objects\items\implants\implant_radio.dm"
+#include "code\game\objects\items\implants\implant_slave.dm"
+#include "code\game\objects\items\implants\implant_sleepingcarp.dm"
+#include "code\game\objects\items\implants\implant_spell.dm"
+#include "code\game\objects\items\implants\implant_stealth.dm"
+#include "code\game\objects\items\implants\implant_storage.dm"
+#include "code\game\objects\items\implants\implant_track.dm"
+#include "code\game\objects\items\implants\implant_uplink.dm"
+#include "code\game\objects\items\implants\implant_wrestling.dm"
+#include "code\game\objects\items\implants\implantcase.dm"
+#include "code\game\objects\items\implants\implantchair.dm"
+#include "code\game\objects\items\implants\implanter.dm"
+#include "code\game\objects\items\implants\implantpad.dm"
+#include "code\game\objects\items\melee\energy.dm"
+#include "code\game\objects\items\melee\misc.dm"
+#include "code\game\objects\items\melee\transforming.dm"
+#include "code\game\objects\items\robot\ai_upgrades.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\stacks\bscrystal.dm"
+#include "code\game\objects\items\stacks\cash.dm"
+#include "code\game\objects\items\stacks\medical.dm"
+#include "code\game\objects\items\stacks\rods.dm"
+#include "code\game\objects\items\stacks\stack.dm"
+#include "code\game\objects\items\stacks\telecrystal.dm"
+#include "code\game\objects\items\stacks\wrap.dm"
+#include "code\game\objects\items\stacks\sheets\glass.dm"
+#include "code\game\objects\items\stacks\sheets\leather.dm"
+#include "code\game\objects\items\stacks\sheets\light.dm"
+#include "code\game\objects\items\stacks\sheets\mineral.dm"
+#include "code\game\objects\items\stacks\sheets\sheet_types.dm"
+#include "code\game\objects\items\stacks\sheets\sheets.dm"
+#include "code\game\objects\items\stacks\tiles\light.dm"
+#include "code\game\objects\items\stacks\tiles\tile_mineral.dm"
+#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm"
+#include "code\game\objects\items\stacks\tiles\tile_types.dm"
+#include "code\game\objects\items\storage\backpack.dm"
+#include "code\game\objects\items\storage\bags.dm"
+#include "code\game\objects\items\storage\belt.dm"
+#include "code\game\objects\items\storage\book.dm"
+#include "code\game\objects\items\storage\boxes.dm"
+#include "code\game\objects\items\storage\briefcase.dm"
+#include "code\game\objects\items\storage\dakis.dm"
+#include "code\game\objects\items\storage\fancy.dm"
+#include "code\game\objects\items\storage\firstaid.dm"
+#include "code\game\objects\items\storage\lockbox.dm"
+#include "code\game\objects\items\storage\secure.dm"
+#include "code\game\objects\items\storage\storage.dm"
+#include "code\game\objects\items\storage\toolbox.dm"
+#include "code\game\objects\items\storage\uplink_kits.dm"
+#include "code\game\objects\items\storage\wallets.dm"
+#include "code\game\objects\items\tanks\jetpack.dm"
+#include "code\game\objects\items\tanks\tank_types.dm"
+#include "code\game\objects\items\tanks\tanks.dm"
+#include "code\game\objects\items\tanks\watertank.dm"
+#include "code\game\objects\items\tools\crowbar.dm"
+#include "code\game\objects\items\tools\screwdriver.dm"
+#include "code\game\objects\items\tools\weldingtool.dm"
+#include "code\game\objects\items\tools\wirecutters.dm"
+#include "code\game\objects\items\tools\wrench.dm"
+#include "code\game\objects\structures\ai_core.dm"
+#include "code\game\objects\structures\aliens.dm"
+#include "code\game\objects\structures\artstuff.dm"
+#include "code\game\objects\structures\barsigns.dm"
+#include "code\game\objects\structures\bedsheet_bin.dm"
+#include "code\game\objects\structures\destructible_structures.dm"
+#include "code\game\objects\structures\displaycase.dm"
+#include "code\game\objects\structures\divine.dm"
+#include "code\game\objects\structures\door_assembly.dm"
+#include "code\game\objects\structures\door_assembly_types.dm"
+#include "code\game\objects\structures\dresser.dm"
+#include "code\game\objects\structures\electricchair.dm"
+#include "code\game\objects\structures\extinguisher.dm"
+#include "code\game\objects\structures\false_walls.dm"
+#include "code\game\objects\structures\fence.dm"
+#include "code\game\objects\structures\fireaxe.dm"
+#include "code\game\objects\structures\fireplace.dm"
+#include "code\game\objects\structures\flora.dm"
+#include "code\game\objects\structures\fluff.dm"
+#include "code\game\objects\structures\ghost_role_spawners.dm"
+#include "code\game\objects\structures\girders.dm"
+#include "code\game\objects\structures\grille.dm"
+#include "code\game\objects\structures\guillotine.dm"
+#include "code\game\objects\structures\guncase.dm"
+#include "code\game\objects\structures\headpike.dm"
+#include "code\game\objects\structures\hivebot.dm"
+#include "code\game\objects\structures\holosign.dm"
+#include "code\game\objects\structures\janicart.dm"
+#include "code\game\objects\structures\kitchen_spike.dm"
+#include "code\game\objects\structures\ladders.dm"
+#include "code\game\objects\structures\lattice.dm"
+#include "code\game\objects\structures\life_candle.dm"
+#include "code\game\objects\structures\loom.dm"
+#include "code\game\objects\structures\manned_turret.dm"
+#include "code\game\objects\structures\medkit.dm"
+#include "code\game\objects\structures\memorial.dm"
+#include "code\game\objects\structures\mineral_doors.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\musician.dm"
+#include "code\game\objects\structures\noticeboard.dm"
+#include "code\game\objects\structures\petrified_statue.dm"
+#include "code\game\objects\structures\plasticflaps.dm"
+#include "code\game\objects\structures\reflector.dm"
+#include "code\game\objects\structures\safe.dm"
+#include "code\game\objects\structures\showcase.dm"
+#include "code\game\objects\structures\spawner.dm"
+#include "code\game\objects\structures\spirit_board.dm"
+#include "code\game\objects\structures\stairs.dm"
+#include "code\game\objects\structures\statues.dm"
+#include "code\game\objects\structures\table_frames.dm"
+#include "code\game\objects\structures\tables_racks.dm"
+#include "code\game\objects\structures\tank_dispenser.dm"
+#include "code\game\objects\structures\target_stake.dm"
+#include "code\game\objects\structures\traps.dm"
+#include "code\game\objects\structures\trash_piles.dm"
+#include "code\game\objects\structures\watercloset.dm"
+#include "code\game\objects\structures\windoor_assembly.dm"
+#include "code\game\objects\structures\window.dm"
+#include "code\game\objects\structures\beds_chairs\alien_nest.dm"
+#include "code\game\objects\structures\beds_chairs\bed.dm"
+#include "code\game\objects\structures\beds_chairs\chair.dm"
+#include "code\game\objects\structures\crates_lockers\closets.dm"
+#include "code\game\objects\structures\crates_lockers\crates.dm"
+#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm"
+#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.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\syndicate.dm"
+#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm"
+#include "code\game\objects\structures\crates_lockers\closets\wardrobe.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\engineering.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.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\misc.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\psychology.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\crates\bins.dm"
+#include "code\game\objects\structures\crates_lockers\crates\critter.dm"
+#include "code\game\objects\structures\crates_lockers\crates\large.dm"
+#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
+#include "code\game\objects\structures\crates_lockers\crates\wooden.dm"
+#include "code\game\objects\structures\lavaland\necropolis_tendril.dm"
+#include "code\game\objects\structures\signs\_signs.dm"
+#include "code\game\objects\structures\signs\signs_departments.dm"
+#include "code\game\objects\structures\signs\signs_maps.dm"
+#include "code\game\objects\structures\signs\signs_plaques.dm"
+#include "code\game\objects\structures\signs\signs_warning.dm"
+#include "code\game\objects\structures\transit_tubes\station.dm"
+#include "code\game\objects\structures\transit_tubes\transit_tube.dm"
+#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm"
+#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm"
+#include "code\game\turfs\baseturf_skipover.dm"
+#include "code\game\turfs\change_turf.dm"
+#include "code\game\turfs\closed.dm"
+#include "code\game\turfs\open.dm"
+#include "code\game\turfs\turf.dm"
+#include "code\game\turfs\openspace\openspace.dm"
+#include "code\game\turfs\simulated\chasm.dm"
+#include "code\game\turfs\simulated\dirtystation.dm"
+#include "code\game\turfs\simulated\floor.dm"
+#include "code\game\turfs\simulated\lava.dm"
+#include "code\game\turfs\simulated\minerals.dm"
+#include "code\game\turfs\simulated\reebe_void.dm"
+#include "code\game\turfs\simulated\river.dm"
+#include "code\game\turfs\simulated\walls.dm"
+#include "code\game\turfs\simulated\water.dm"
+#include "code\game\turfs\simulated\floor\fancy_floor.dm"
+#include "code\game\turfs\simulated\floor\light_floor.dm"
+#include "code\game\turfs\simulated\floor\mineral_floor.dm"
+#include "code\game\turfs\simulated\floor\misc_floor.dm"
+#include "code\game\turfs\simulated\floor\plasteel_floor.dm"
+#include "code\game\turfs\simulated\floor\plating.dm"
+#include "code\game\turfs\simulated\floor\reinf_floor.dm"
+#include "code\game\turfs\simulated\floor\plating\asteroid.dm"
+#include "code\game\turfs\simulated\floor\plating\dirt.dm"
+#include "code\game\turfs\simulated\floor\plating\misc_plating.dm"
+#include "code\game\turfs\simulated\wall\mineral_walls.dm"
+#include "code\game\turfs\simulated\wall\misc_walls.dm"
+#include "code\game\turfs\simulated\wall\reinf_walls.dm"
+#include "code\game\turfs\space\space.dm"
+#include "code\game\turfs\space\transit.dm"
+#include "code\modules\admin\admin.dm"
+#include "code\modules\admin\admin_investigate.dm"
+#include "code\modules\admin\admin_ranks.dm"
+#include "code\modules\admin\admin_verbs.dm"
+#include "code\modules\admin\adminmenu.dm"
+#include "code\modules\admin\antag_panel.dm"
+#include "code\modules\admin\banjob.dm"
+#include "code\modules\admin\chat_commands.dm"
+#include "code\modules\admin\check_antagonists.dm"
+#include "code\modules\admin\create_mob.dm"
+#include "code\modules\admin\create_object.dm"
+#include "code\modules\admin\create_poll.dm"
+#include "code\modules\admin\create_turf.dm"
+#include "code\modules\admin\fun_balloon.dm"
+#include "code\modules\admin\holder2.dm"
+#include "code\modules\admin\ipintel.dm"
+#include "code\modules\admin\IsBanned.dm"
+#include "code\modules\admin\NewBan.dm"
+#include "code\modules\admin\permissionedit.dm"
+#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\secrets.dm"
+#include "code\modules\admin\sound_emitter.dm"
+#include "code\modules\admin\sql_message_system.dm"
+#include "code\modules\admin\stickyban.dm"
+#include "code\modules\admin\topic.dm"
+#include "code\modules\admin\whitelist.dm"
+#include "code\modules\admin\DB_ban\functions.dm"
+#include "code\modules\admin\verbs\adminhelp.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\ak47s.dm"
+#include "code\modules\admin\verbs\atmosdebug.dm"
+#include "code\modules\admin\verbs\bluespacearty.dm"
+#include "code\modules\admin\verbs\borgpanel.dm"
+#include "code\modules\admin\verbs\BrokenInhands.dm"
+#include "code\modules\admin\verbs\cinematic.dm"
+#include "code\modules\admin\verbs\deadsay.dm"
+#include "code\modules\admin\verbs\debug.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\individual_logging.dm"
+#include "code\modules\admin\verbs\machine_upgrade.dm"
+#include "code\modules\admin\verbs\manipulate_organs.dm"
+#include "code\modules\admin\verbs\map_template_loadverb.dm"
+#include "code\modules\admin\verbs\mapping.dm"
+#include "code\modules\admin\verbs\maprotation.dm"
+#include "code\modules\admin\verbs\massmodvar.dm"
+#include "code\modules\admin\verbs\modifyvariables.dm"
+#include "code\modules\admin\verbs\one_click_antag.dm"
+#include "code\modules\admin\verbs\onlyone.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\reestablish_db_connection.dm"
+#include "code\modules\admin\verbs\spawnobjasmob.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\debug_variables.dm"
+#include "code\modules\antagonists\_common\antag_datum.dm"
+#include "code\modules\antagonists\_common\antag_helpers.dm"
+#include "code\modules\antagonists\_common\antag_hud.dm"
+#include "code\modules\antagonists\_common\antag_spawner.dm"
+#include "code\modules\antagonists\_common\antag_team.dm"
+#include "code\modules\antagonists\abductor\abductor.dm"
+#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm"
+#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm"
+#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm"
+#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm"
+#include "code\modules\antagonists\abductor\equipment\gland.dm"
+#include "code\modules\antagonists\abductor\machinery\camera.dm"
+#include "code\modules\antagonists\abductor\machinery\console.dm"
+#include "code\modules\antagonists\abductor\machinery\dispenser.dm"
+#include "code\modules\antagonists\abductor\machinery\experiment.dm"
+#include "code\modules\antagonists\abductor\machinery\pad.dm"
+#include "code\modules\antagonists\blob\blob.dm"
+#include "code\modules\antagonists\blob\blob\blob_report.dm"
+#include "code\modules\antagonists\blob\blob\overmind.dm"
+#include "code\modules\antagonists\blob\blob\powers.dm"
+#include "code\modules\antagonists\blob\blob\theblob.dm"
+#include "code\modules\antagonists\blob\blob\blobs\blob_mobs.dm"
+#include "code\modules\antagonists\blob\blob\blobs\core.dm"
+#include "code\modules\antagonists\blob\blob\blobs\factory.dm"
+#include "code\modules\antagonists\blob\blob\blobs\node.dm"
+#include "code\modules\antagonists\blob\blob\blobs\resource.dm"
+#include "code\modules\antagonists\blob\blob\blobs\shield.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm"
+#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm"
+#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm"
+#include "code\modules\antagonists\bloodsucker\datum_hunter.dm"
+#include "code\modules\antagonists\bloodsucker\datum_vassal.dm"
+#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm"
+#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm"
+#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm"
+#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm"
+#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_brawn.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm"
+#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm"
+#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm"
+#include "code\modules\antagonists\brainwashing\brainwashing.dm"
+#include "code\modules\antagonists\brother\brother.dm"
+#include "code\modules\antagonists\changeling\cellular_emporium.dm"
+#include "code\modules\antagonists\changeling\changeling.dm"
+#include "code\modules\antagonists\changeling\changeling_power.dm"
+#include "code\modules\antagonists\changeling\powers\absorb.dm"
+#include "code\modules\antagonists\changeling\powers\adrenaline.dm"
+#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm"
+#include "code\modules\antagonists\changeling\powers\biodegrade.dm"
+#include "code\modules\antagonists\changeling\powers\chameleon_skin.dm"
+#include "code\modules\antagonists\changeling\powers\digitalcamo.dm"
+#include "code\modules\antagonists\changeling\powers\fakedeath.dm"
+#include "code\modules\antagonists\changeling\powers\fleshmend.dm"
+#include "code\modules\antagonists\changeling\powers\headcrab.dm"
+#include "code\modules\antagonists\changeling\powers\hivemind.dm"
+#include "code\modules\antagonists\changeling\powers\humanform.dm"
+#include "code\modules\antagonists\changeling\powers\lesserform.dm"
+#include "code\modules\antagonists\changeling\powers\linglink.dm"
+#include "code\modules\antagonists\changeling\powers\mimic_voice.dm"
+#include "code\modules\antagonists\changeling\powers\mutations.dm"
+#include "code\modules\antagonists\changeling\powers\panacea.dm"
+#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm"
+#include "code\modules\antagonists\changeling\powers\regenerate.dm"
+#include "code\modules\antagonists\changeling\powers\revive.dm"
+#include "code\modules\antagonists\changeling\powers\shriek.dm"
+#include "code\modules\antagonists\changeling\powers\spiders.dm"
+#include "code\modules\antagonists\changeling\powers\strained_muscles.dm"
+#include "code\modules\antagonists\changeling\powers\tiny_prick.dm"
+#include "code\modules\antagonists\changeling\powers\transform.dm"
+#include "code\modules\antagonists\clockcult\clock_effect.dm"
+#include "code\modules\antagonists\clockcult\clock_item.dm"
+#include "code\modules\antagonists\clockcult\clock_mobs.dm"
+#include "code\modules\antagonists\clockcult\clock_scripture.dm"
+#include "code\modules\antagonists\clockcult\clock_structure.dm"
+#include "code\modules\antagonists\clockcult\clockcult.dm"
+#include "code\modules\antagonists\clockcult\clock_effects\city_of_cogs_rift.dm"
+#include "code\modules\antagonists\clockcult\clock_effects\clock_overlay.dm"
+#include "code\modules\antagonists\clockcult\clock_effects\clock_sigils.dm"
+#include "code\modules\antagonists\clockcult\clock_effects\general_markers.dm"
+#include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm"
+#include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm"
+#include "code\modules\antagonists\clockcult\clock_helpers\slab_abilities.dm"
+#include "code\modules\antagonists\clockcult\clock_items\clock_components.dm"
+#include "code\modules\antagonists\clockcult\clock_items\clockwork_armor.dm"
+#include "code\modules\antagonists\clockcult\clock_items\clockwork_slab.dm"
+#include "code\modules\antagonists\clockcult\clock_items\clockwork_weaponry.dm"
+#include "code\modules\antagonists\clockcult\clock_items\construct_chassis.dm"
+#include "code\modules\antagonists\clockcult\clock_items\integration_cog.dm"
+#include "code\modules\antagonists\clockcult\clock_items\judicial_visor.dm"
+#include "code\modules\antagonists\clockcult\clock_items\replica_fabricator.dm"
+#include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm"
+#include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm"
+#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm"
+#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm"
+#include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm"
+#include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm"
+#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm"
+#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm"
+#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm"
+#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm"
+#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm"
+#include "code\modules\antagonists\cult\blood_magic.dm"
+#include "code\modules\antagonists\cult\cult.dm"
+#include "code\modules\antagonists\cult\cult_comms.dm"
+#include "code\modules\antagonists\cult\cult_items.dm"
+#include "code\modules\antagonists\cult\cult_structures.dm"
+#include "code\modules\antagonists\cult\ritual.dm"
+#include "code\modules\antagonists\cult\rune_spawn_action.dm"
+#include "code\modules\antagonists\cult\runes.dm"
+#include "code\modules\antagonists\devil\devil.dm"
+#include "code\modules\antagonists\devil\devil_helpers.dm"
+#include "code\modules\antagonists\devil\imp\imp.dm"
+#include "code\modules\antagonists\devil\sintouched\objectives.dm"
+#include "code\modules\antagonists\devil\sintouched\sintouched.dm"
+#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
+#include "code\modules\antagonists\devil\true_devil\inventory.dm"
+#include "code\modules\antagonists\disease\disease_abilities.dm"
+#include "code\modules\antagonists\disease\disease_datum.dm"
+#include "code\modules\antagonists\disease\disease_disease.dm"
+#include "code\modules\antagonists\disease\disease_event.dm"
+#include "code\modules\antagonists\disease\disease_mob.dm"
+#include "code\modules\antagonists\ert\ert.dm"
+#include "code\modules\antagonists\greentext\greentext.dm"
+#include "code\modules\antagonists\greybois\greybois.dm"
+#include "code\modules\antagonists\highlander\highlander.dm"
+#include "code\modules\antagonists\monkey\monkey.dm"
+#include "code\modules\antagonists\morph\morph.dm"
+#include "code\modules\antagonists\morph\morph_antag.dm"
+#include "code\modules\antagonists\nightmare\nightmare.dm"
+#include "code\modules\antagonists\nightmare\nightmare_objectives.dm"
+#include "code\modules\antagonists\ninja\ninja.dm"
+#include "code\modules\antagonists\nukeop\clownop.dm"
+#include "code\modules\antagonists\nukeop\nukeop.dm"
+#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm"
+#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm"
+#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm"
+#include "code\modules\antagonists\official\official.dm"
+#include "code\modules\antagonists\overthrow\overthrow.dm"
+#include "code\modules\antagonists\overthrow\overthrow_converter.dm"
+#include "code\modules\antagonists\overthrow\overthrow_team.dm"
+#include "code\modules\antagonists\pirate\pirate.dm"
+#include "code\modules\antagonists\revenant\revenant.dm"
+#include "code\modules\antagonists\revenant\revenant_abilities.dm"
+#include "code\modules\antagonists\revenant\revenant_antag.dm"
+#include "code\modules\antagonists\revenant\revenant_blight.dm"
+#include "code\modules\antagonists\revenant\revenant_spawn_event.dm"
+#include "code\modules\antagonists\revolution\revolution.dm"
+#include "code\modules\antagonists\separatist\separatist.dm"
+#include "code\modules\antagonists\slaughter\slaughter.dm"
+#include "code\modules\antagonists\slaughter\slaughter_antag.dm"
+#include "code\modules\antagonists\slaughter\slaughterevent.dm"
+#include "code\modules\antagonists\survivalist\survivalist.dm"
+#include "code\modules\antagonists\swarmer\swarmer.dm"
+#include "code\modules\antagonists\swarmer\swarmer_event.dm"
+#include "code\modules\antagonists\traitor\datum_traitor.dm"
+#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm"
+#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm"
+#include "code\modules\antagonists\valentines\heartbreaker.dm"
+#include "code\modules\antagonists\valentines\valentine.dm"
+#include "code\modules\antagonists\wishgranter\wishgranter.dm"
+#include "code\modules\antagonists\wizard\wizard.dm"
+#include "code\modules\antagonists\wizard\equipment\artefact.dm"
+#include "code\modules\antagonists\wizard\equipment\soulstone.dm"
+#include "code\modules\antagonists\wizard\equipment\spellbook.dm"
+#include "code\modules\antagonists\xeno\xeno.dm"
+#include "code\modules\assembly\assembly.dm"
+#include "code\modules\assembly\bomb.dm"
+#include "code\modules\assembly\doorcontrol.dm"
+#include "code\modules\assembly\flash.dm"
+#include "code\modules\assembly\health.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\atmospherics\multiz.dm"
+#include "code\modules\atmospherics\environmental\LINDA_fire.dm"
+#include "code\modules\atmospherics\environmental\LINDA_system.dm"
+#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm"
+#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm"
+#include "code\modules\atmospherics\gasmixtures\gas_types.dm"
+#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm"
+#include "code\modules\atmospherics\gasmixtures\reactions.dm"
+#include "code\modules\atmospherics\machinery\airalarm.dm"
+#include "code\modules\atmospherics\machinery\atmosmachinery.dm"
+#include "code\modules\atmospherics\machinery\datum_pipeline.dm"
+#include "code\modules\atmospherics\machinery\components\components_base.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\binary_devices.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm"
+#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm"
+#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm"
+#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm"
+#include "code\modules\atmospherics\machinery\other\meter.dm"
+#include "code\modules\atmospherics\machinery\other\miner.dm"
+#include "code\modules\atmospherics\machinery\pipes\bluespace.dm"
+#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm"
+#include "code\modules\atmospherics\machinery\pipes\manifold.dm"
+#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm"
+#include "code\modules\atmospherics\machinery\pipes\mapping.dm"
+#include "code\modules\atmospherics\machinery\pipes\pipes.dm"
+#include "code\modules\atmospherics\machinery\pipes\simple.dm"
+#include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm"
+#include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm"
+#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm"
+#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm"
+#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm"
+#include "code\modules\atmospherics\machinery\portable\canister.dm"
+#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm"
+#include "code\modules\atmospherics\machinery\portable\pump.dm"
+#include "code\modules\atmospherics\machinery\portable\scrubber.dm"
+#include "code\modules\awaymissions\away_props.dm"
+#include "code\modules\awaymissions\bluespaceartillery.dm"
+#include "code\modules\awaymissions\capture_the_flag.dm"
+#include "code\modules\awaymissions\corpse.dm"
+#include "code\modules\awaymissions\exile.dm"
+#include "code\modules\awaymissions\gateway.dm"
+#include "code\modules\awaymissions\pamphlet.dm"
+#include "code\modules\awaymissions\signpost.dm"
+#include "code\modules\awaymissions\super_secret_room.dm"
+#include "code\modules\awaymissions\zlevel.dm"
+#include "code\modules\awaymissions\mission_code\Academy.dm"
+#include "code\modules\awaymissions\mission_code\Cabin.dm"
+#include "code\modules\awaymissions\mission_code\caves.dm"
+#include "code\modules\awaymissions\mission_code\centcomAway.dm"
+#include "code\modules\awaymissions\mission_code\challenge.dm"
+#include "code\modules\awaymissions\mission_code\jungleresort.dm"
+#include "code\modules\awaymissions\mission_code\moonoutpost19.dm"
+#include "code\modules\awaymissions\mission_code\murderdome.dm"
+#include "code\modules\awaymissions\mission_code\research.dm"
+#include "code\modules\awaymissions\mission_code\snowdin.dm"
+#include "code\modules\awaymissions\mission_code\spacebattle.dm"
+#include "code\modules\awaymissions\mission_code\stationCollision.dm"
+#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm"
+#include "code\modules\awaymissions\mission_code\wildwest.dm"
+#include "code\modules\bsql\includes.dm"
+#include "code\modules\buildmode\bm_mode.dm"
+#include "code\modules\buildmode\buildmode.dm"
+#include "code\modules\buildmode\buttons.dm"
+#include "code\modules\buildmode\effects\line.dm"
+#include "code\modules\buildmode\submodes\advanced.dm"
+#include "code\modules\buildmode\submodes\area_edit.dm"
+#include "code\modules\buildmode\submodes\basic.dm"
+#include "code\modules\buildmode\submodes\boom.dm"
+#include "code\modules\buildmode\submodes\copy.dm"
+#include "code\modules\buildmode\submodes\fill.dm"
+#include "code\modules\buildmode\submodes\mapgen.dm"
+#include "code\modules\buildmode\submodes\throwing.dm"
+#include "code\modules\buildmode\submodes\variable_edit.dm"
+#include "code\modules\cargo\bounty.dm"
+#include "code\modules\cargo\bounty_console.dm"
+#include "code\modules\cargo\centcom_podlauncher.dm"
+#include "code\modules\cargo\console.dm"
+#include "code\modules\cargo\export_scanner.dm"
+#include "code\modules\cargo\exports.dm"
+#include "code\modules\cargo\expressconsole.dm"
+#include "code\modules\cargo\gondolapod.dm"
+#include "code\modules\cargo\order.dm"
+#include "code\modules\cargo\packs.dm"
+#include "code\modules\cargo\supplypod.dm"
+#include "code\modules\cargo\supplypod_beacon.dm"
+#include "code\modules\cargo\bounties\assistant.dm"
+#include "code\modules\cargo\bounties\botany.dm"
+#include "code\modules\cargo\bounties\chef.dm"
+#include "code\modules\cargo\bounties\engineering.dm"
+#include "code\modules\cargo\bounties\item.dm"
+#include "code\modules\cargo\bounties\mech.dm"
+#include "code\modules\cargo\bounties\medical.dm"
+#include "code\modules\cargo\bounties\mining.dm"
+#include "code\modules\cargo\bounties\reagent.dm"
+#include "code\modules\cargo\bounties\science.dm"
+#include "code\modules\cargo\bounties\security.dm"
+#include "code\modules\cargo\bounties\slime.dm"
+#include "code\modules\cargo\bounties\special.dm"
+#include "code\modules\cargo\bounties\virus.dm"
+#include "code\modules\cargo\exports\food_wine.dm"
+#include "code\modules\cargo\exports\gear.dm"
+#include "code\modules\cargo\exports\large_objects.dm"
+#include "code\modules\cargo\exports\lewd.dm"
+#include "code\modules\cargo\exports\manifest.dm"
+#include "code\modules\cargo\exports\materials.dm"
+#include "code\modules\cargo\exports\organs_robotics.dm"
+#include "code\modules\cargo\exports\parts.dm"
+#include "code\modules\cargo\exports\seeds.dm"
+#include "code\modules\cargo\exports\sheets.dm"
+#include "code\modules\cargo\exports\tools.dm"
+#include "code\modules\cargo\exports\weapons.dm"
+#include "code\modules\cargo\packs\armory.dm"
+#include "code\modules\cargo\packs\costumes_toys.dm"
+#include "code\modules\cargo\packs\emergency.dm"
+#include "code\modules\cargo\packs\engine.dm"
+#include "code\modules\cargo\packs\engineering.dm"
+#include "code\modules\cargo\packs\livestock.dm"
+#include "code\modules\cargo\packs\materials.dm"
+#include "code\modules\cargo\packs\medical.dm"
+#include "code\modules\cargo\packs\misc.dm"
+#include "code\modules\cargo\packs\organic.dm"
+#include "code\modules\cargo\packs\science.dm"
+#include "code\modules\cargo\packs\security.dm"
+#include "code\modules\cargo\packs\service.dm"
+#include "code\modules\chatter\chatter.dm"
+#include "code\modules\client\asset_cache.dm"
+#include "code\modules\client\client_colour.dm"
+#include "code\modules\client\client_defines.dm"
+#include "code\modules\client\client_procs.dm"
+#include "code\modules\client\darkmode.dm"
+#include "code\modules\client\message.dm"
+#include "code\modules\client\player_details.dm"
+#include "code\modules\client\preferences.dm"
+#include "code\modules\client\preferences_savefile.dm"
+#include "code\modules\client\preferences_toggles.dm"
+#include "code\modules\client\preferences_vr.dm"
+#include "code\modules\client\verbs\aooc.dm"
+#include "code\modules\client\verbs\etips.dm"
+#include "code\modules\client\verbs\looc.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\ears\_ears.dm"
+#include "code\modules\clothing\glasses\_glasses.dm"
+#include "code\modules\clothing\glasses\engine_goggles.dm"
+#include "code\modules\clothing\glasses\hud.dm"
+#include "code\modules\clothing\glasses\vg_glasses.dm"
+#include "code\modules\clothing\gloves\_gloves.dm"
+#include "code\modules\clothing\gloves\boxing.dm"
+#include "code\modules\clothing\gloves\color.dm"
+#include "code\modules\clothing\gloves\miscellaneous.dm"
+#include "code\modules\clothing\gloves\ring.dm"
+#include "code\modules\clothing\gloves\vg_gloves.dm"
+#include "code\modules\clothing\head\_head.dm"
+#include "code\modules\clothing\head\beanie.dm"
+#include "code\modules\clothing\head\cit_hats.dm"
+#include "code\modules\clothing\head\collectable.dm"
+#include "code\modules\clothing\head\hardhat.dm"
+#include "code\modules\clothing\head\helmet.dm"
+#include "code\modules\clothing\head\jobs.dm"
+#include "code\modules\clothing\head\misc.dm"
+#include "code\modules\clothing\head\misc_special.dm"
+#include "code\modules\clothing\head\soft_caps.dm"
+#include "code\modules\clothing\head\vg_hats.dm"
+#include "code\modules\clothing\masks\_masks.dm"
+#include "code\modules\clothing\masks\boxing.dm"
+#include "code\modules\clothing\masks\breath.dm"
+#include "code\modules\clothing\masks\gasmask.dm"
+#include "code\modules\clothing\masks\hailer.dm"
+#include "code\modules\clothing\masks\miscellaneous.dm"
+#include "code\modules\clothing\masks\vg_masks.dm"
+#include "code\modules\clothing\neck\_neck.dm"
+#include "code\modules\clothing\outfits\ert.dm"
+#include "code\modules\clothing\outfits\event.dm"
+#include "code\modules\clothing\outfits\plasmaman.dm"
+#include "code\modules\clothing\outfits\standard.dm"
+#include "code\modules\clothing\outfits\vr.dm"
+#include "code\modules\clothing\outfits\vv_outfit.dm"
+#include "code\modules\clothing\shoes\_shoes.dm"
+#include "code\modules\clothing\shoes\bananashoes.dm"
+#include "code\modules\clothing\shoes\colour.dm"
+#include "code\modules\clothing\shoes\magboots.dm"
+#include "code\modules\clothing\shoes\miscellaneous.dm"
+#include "code\modules\clothing\shoes\taeclowndo.dm"
+#include "code\modules\clothing\shoes\vg_shoes.dm"
+#include "code\modules\clothing\spacesuits\_spacesuits.dm"
+#include "code\modules\clothing\spacesuits\chronosuit.dm"
+#include "code\modules\clothing\spacesuits\hardsuit.dm"
+#include "code\modules\clothing\spacesuits\miscellaneous.dm"
+#include "code\modules\clothing\spacesuits\plasmamen.dm"
+#include "code\modules\clothing\spacesuits\syndi.dm"
+#include "code\modules\clothing\spacesuits\vg_spess.dm"
+#include "code\modules\clothing\suits\_suits.dm"
+#include "code\modules\clothing\suits\armor.dm"
+#include "code\modules\clothing\suits\bio.dm"
+#include "code\modules\clothing\suits\cloaks.dm"
+#include "code\modules\clothing\suits\jobs.dm"
+#include "code\modules\clothing\suits\labcoat.dm"
+#include "code\modules\clothing\suits\miscellaneous.dm"
+#include "code\modules\clothing\suits\reactive_armour.dm"
+#include "code\modules\clothing\suits\toggles.dm"
+#include "code\modules\clothing\suits\utility.dm"
+#include "code\modules\clothing\suits\vg_suits.dm"
+#include "code\modules\clothing\suits\wiz_robe.dm"
+#include "code\modules\clothing\under\_under.dm"
+#include "code\modules\clothing\under\accessories.dm"
+#include "code\modules\clothing\under\color.dm"
+#include "code\modules\clothing\under\miscellaneous.dm"
+#include "code\modules\clothing\under\pants.dm"
+#include "code\modules\clothing\under\shorts.dm"
+#include "code\modules\clothing\under\syndicate.dm"
+#include "code\modules\clothing\under\trek.dm"
+#include "code\modules\clothing\under\vg_under.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\jobs\Plasmaman\civilian_service.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm"
+#include "code\modules\clothing\under\jobs\Plasmaman\security.dm"
+#include "code\modules\detectivework\detective_work.dm"
+#include "code\modules\detectivework\evidence.dm"
+#include "code\modules\detectivework\scanner.dm"
+#include "code\modules\emoji\emoji_parse.dm"
+#include "code\modules\error_handler\error_handler.dm"
+#include "code\modules\error_handler\error_viewer.dm"
+#include "code\modules\events\_event.dm"
+#include "code\modules\events\abductor.dm"
+#include "code\modules\events\alien_infestation.dm"
+#include "code\modules\events\anomaly.dm"
+#include "code\modules\events\anomaly_bluespace.dm"
+#include "code\modules\events\anomaly_flux.dm"
+#include "code\modules\events\anomaly_grav.dm"
+#include "code\modules\events\anomaly_pyro.dm"
+#include "code\modules\events\anomaly_vortex.dm"
+#include "code\modules\events\aurora_aquilae.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\bureaucratic_error.dm"
+#include "code\modules\events\camerafailure.dm"
+#include "code\modules\events\carp_migration.dm"
+#include "code\modules\events\carpteam.dm"
+#include "code\modules\events\communications_blackout.dm"
+#include "code\modules\events\devil.dm"
+#include "code\modules\events\disease_outbreak.dm"
+#include "code\modules\events\dust.dm"
+#include "code\modules\events\electrical_storm.dm"
+#include "code\modules\events\false_alarm.dm"
+#include "code\modules\events\floorcluwne.dm"
+#include "code\modules\events\ghost_role.dm"
+#include "code\modules\events\grid_check.dm"
+#include "code\modules\events\heart_attack.dm"
+#include "code\modules\events\high_priority_bounty.dm"
+#include "code\modules\events\immovable_rod.dm"
+#include "code\modules\events\ion_storm.dm"
+#include "code\modules\events\major_dust.dm"
+#include "code\modules\events\mass_hallucination.dm"
+#include "code\modules\events\meateor_wave.dm"
+#include "code\modules\events\meteor_wave.dm"
+#include "code\modules\events\mice_migration.dm"
+#include "code\modules\events\nightmare.dm"
+#include "code\modules\events\operative.dm"
+#include "code\modules\events\pirates.dm"
+#include "code\modules\events\portal_storm.dm"
+#include "code\modules\events\prison_break.dm"
+#include "code\modules\events\processor_overload.dm"
+#include "code\modules\events\radiation_storm.dm"
+#include "code\modules\events\sentience.dm"
+#include "code\modules\events\shuttle_loan.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\vent_clog.dm"
+#include "code\modules\events\wormholes.dm"
+#include "code\modules\events\holiday\halloween.dm"
+#include "code\modules\events\holiday\vday.dm"
+#include "code\modules\events\holiday\xmas.dm"
+#include "code\modules\events\wizard\aid.dm"
+#include "code\modules\events\wizard\blobies.dm"
+#include "code\modules\events\wizard\curseditems.dm"
+#include "code\modules\events\wizard\departmentrevolt.dm"
+#include "code\modules\events\wizard\fakeexplosion.dm"
+#include "code\modules\events\wizard\ghost.dm"
+#include "code\modules\events\wizard\greentext.dm"
+#include "code\modules\events\wizard\imposter.dm"
+#include "code\modules\events\wizard\invincible.dm"
+#include "code\modules\events\wizard\lava.dm"
+#include "code\modules\events\wizard\magicarp.dm"
+#include "code\modules\events\wizard\petsplosion.dm"
+#include "code\modules\events\wizard\race.dm"
+#include "code\modules\events\wizard\rpgloot.dm"
+#include "code\modules\events\wizard\shuffle.dm"
+#include "code\modules\events\wizard\summons.dm"
+#include "code\modules\fields\fields.dm"
+#include "code\modules\fields\gravity.dm"
+#include "code\modules\fields\peaceborg_dampener.dm"
+#include "code\modules\fields\timestop.dm"
+#include "code\modules\fields\turf_objects.dm"
+#include "code\modules\flufftext\Dreaming.dm"
+#include "code\modules\flufftext\Hallucination.dm"
+#include "code\modules\food_and_drinks\autobottler.dm"
+#include "code\modules\food_and_drinks\food.dm"
+#include "code\modules\food_and_drinks\pizzabox.dm"
+#include "code\modules\food_and_drinks\drinks\drinks.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm"
+#include "code\modules\food_and_drinks\food\condiment.dm"
+#include "code\modules\food_and_drinks\food\customizables.dm"
+#include "code\modules\food_and_drinks\food\snacks.dm"
+#include "code\modules\food_and_drinks\food\snacks_bread.dm"
+#include "code\modules\food_and_drinks\food\snacks_burgers.dm"
+#include "code\modules\food_and_drinks\food\snacks_cake.dm"
+#include "code\modules\food_and_drinks\food\snacks_egg.dm"
+#include "code\modules\food_and_drinks\food\snacks_frozen.dm"
+#include "code\modules\food_and_drinks\food\snacks_meat.dm"
+#include "code\modules\food_and_drinks\food\snacks_other.dm"
+#include "code\modules\food_and_drinks\food\snacks_pastry.dm"
+#include "code\modules\food_and_drinks\food\snacks_pie.dm"
+#include "code\modules\food_and_drinks\food\snacks_pizza.dm"
+#include "code\modules\food_and_drinks\food\snacks_salad.dm"
+#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
+#include "code\modules\food_and_drinks\food\snacks_soup.dm"
+#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
+#include "code\modules\food_and_drinks\food\snacks_sushi.dm"
+#include "code\modules\food_and_drinks\food\snacks_vend.dm"
+#include "code\modules\food_and_drinks\food\snacks\dough.dm"
+#include "code\modules\food_and_drinks\food\snacks\meat.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\grill.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm"
+#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm"
+#include "code\modules\food_and_drinks\recipes\food_mixtures.dm"
+#include "code\modules\food_and_drinks\recipes\processor_recipes.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm"
+#include "code\modules\games\cas.dm"
+#include "code\modules\goonchat\browserOutput.dm"
+#include "code\modules\holiday\easter.dm"
+#include "code\modules\holiday\holidays.dm"
+#include "code\modules\holiday\halloween\bartholomew.dm"
+#include "code\modules\holiday\halloween\jacqueen.dm"
+#include "code\modules\holodeck\area_copy.dm"
+#include "code\modules\holodeck\computer.dm"
+#include "code\modules\holodeck\holo_effect.dm"
+#include "code\modules\holodeck\items.dm"
+#include "code\modules\holodeck\mobs.dm"
+#include "code\modules\holodeck\turfs.dm"
+#include "code\modules\hydroponics\biogenerator.dm"
+#include "code\modules\hydroponics\fermenting_barrel.dm"
+#include "code\modules\hydroponics\gene_modder.dm"
+#include "code\modules\hydroponics\grown.dm"
+#include "code\modules\hydroponics\growninedible.dm"
+#include "code\modules\hydroponics\hydroitemdefines.dm"
+#include "code\modules\hydroponics\hydroponics.dm"
+#include "code\modules\hydroponics\plant_genes.dm"
+#include "code\modules\hydroponics\sample.dm"
+#include "code\modules\hydroponics\seed_extractor.dm"
+#include "code\modules\hydroponics\seeds.dm"
+#include "code\modules\hydroponics\beekeeping\beebox.dm"
+#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm"
+#include "code\modules\hydroponics\beekeeping\honey_frame.dm"
+#include "code\modules\hydroponics\beekeeping\honeycomb.dm"
+#include "code\modules\hydroponics\grown\ambrosia.dm"
+#include "code\modules\hydroponics\grown\apple.dm"
+#include "code\modules\hydroponics\grown\banana.dm"
+#include "code\modules\hydroponics\grown\beans.dm"
+#include "code\modules\hydroponics\grown\berries.dm"
+#include "code\modules\hydroponics\grown\cannabis.dm"
+#include "code\modules\hydroponics\grown\cereals.dm"
+#include "code\modules\hydroponics\grown\chili.dm"
+#include "code\modules\hydroponics\grown\citrus.dm"
+#include "code\modules\hydroponics\grown\cocoa_vanilla.dm"
+#include "code\modules\hydroponics\grown\corn.dm"
+#include "code\modules\hydroponics\grown\cotton.dm"
+#include "code\modules\hydroponics\grown\eggplant.dm"
+#include "code\modules\hydroponics\grown\flowers.dm"
+#include "code\modules\hydroponics\grown\garlic.dm"
+#include "code\modules\hydroponics\grown\grass_carpet.dm"
+#include "code\modules\hydroponics\grown\kudzu.dm"
+#include "code\modules\hydroponics\grown\melon.dm"
+#include "code\modules\hydroponics\grown\misc.dm"
+#include "code\modules\hydroponics\grown\mushrooms.dm"
+#include "code\modules\hydroponics\grown\nettle.dm"
+#include "code\modules\hydroponics\grown\onion.dm"
+#include "code\modules\hydroponics\grown\peach.dm"
+#include "code\modules\hydroponics\grown\peanuts.dm"
+#include "code\modules\hydroponics\grown\peas.dm"
+#include "code\modules\hydroponics\grown\pineapple.dm"
+#include "code\modules\hydroponics\grown\potato.dm"
+#include "code\modules\hydroponics\grown\pumpkin.dm"
+#include "code\modules\hydroponics\grown\random.dm"
+#include "code\modules\hydroponics\grown\replicapod.dm"
+#include "code\modules\hydroponics\grown\root.dm"
+#include "code\modules\hydroponics\grown\tea_coffee.dm"
+#include "code\modules\hydroponics\grown\tobacco.dm"
+#include "code\modules\hydroponics\grown\tomato.dm"
+#include "code\modules\hydroponics\grown\towercap.dm"
+#include "code\modules\integrated_electronics\_defines.dm"
+#include "code\modules\integrated_electronics\core\analyzer.dm"
+#include "code\modules\integrated_electronics\core\assemblies.dm"
+#include "code\modules\integrated_electronics\core\debugger.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\saved_circuits.dm"
+#include "code\modules\integrated_electronics\core\wirer.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\index_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\selfref_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\access.dm"
+#include "code\modules\integrated_electronics\subtypes\arithmetic.dm"
+#include "code\modules\integrated_electronics\subtypes\atmospherics.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\text.dm"
+#include "code\modules\integrated_electronics\subtypes\time.dm"
+#include "code\modules\integrated_electronics\subtypes\trig.dm"
+#include "code\modules\integrated_electronics\subtypes\weaponized.dm"
+#include "code\modules\jobs\access.dm"
+#include "code\modules\jobs\job_exp.dm"
+#include "code\modules\jobs\jobs.dm"
+#include "code\modules\jobs\job_types\assistant.dm"
+#include "code\modules\jobs\job_types\captain.dm"
+#include "code\modules\jobs\job_types\cargo_service.dm"
+#include "code\modules\jobs\job_types\civilian.dm"
+#include "code\modules\jobs\job_types\civilian_chaplain.dm"
+#include "code\modules\jobs\job_types\engineering.dm"
+#include "code\modules\jobs\job_types\job.dm"
+#include "code\modules\jobs\job_types\job_alt_titles.dm"
+#include "code\modules\jobs\job_types\medical.dm"
+#include "code\modules\jobs\job_types\science.dm"
+#include "code\modules\jobs\job_types\security.dm"
+#include "code\modules\jobs\job_types\silicon.dm"
+#include "code\modules\jobs\map_changes\map_changes.dm"
+#include "code\modules\keybindings\bindings_admin.dm"
+#include "code\modules\keybindings\bindings_atom.dm"
+#include "code\modules\keybindings\bindings_carbon.dm"
+#include "code\modules\keybindings\bindings_client.dm"
+#include "code\modules\keybindings\bindings_human.dm"
+#include "code\modules\keybindings\bindings_living.dm"
+#include "code\modules\keybindings\bindings_mob.dm"
+#include "code\modules\keybindings\bindings_robot.dm"
+#include "code\modules\keybindings\focus.dm"
+#include "code\modules\keybindings\setup.dm"
+#include "code\modules\language\aphasia.dm"
+#include "code\modules\language\beachbum.dm"
+#include "code\modules\language\codespeak.dm"
+#include "code\modules\language\common.dm"
+#include "code\modules\language\draconic.dm"
+#include "code\modules\language\drone.dm"
+#include "code\modules\language\language.dm"
+#include "code\modules\language\language_holder.dm"
+#include "code\modules\language\language_menu.dm"
+#include "code\modules\language\machine.dm"
+#include "code\modules\language\monkey.dm"
+#include "code\modules\language\narsian.dm"
+#include "code\modules\language\ratvarian.dm"
+#include "code\modules\language\slime.dm"
+#include "code\modules\language\spacerussian.dm"
+#include "code\modules\language\swarmer.dm"
+#include "code\modules\language\tajara.dm"
+#include "code\modules\language\vampiric.dm"
+#include "code\modules\language\xenocommon.dm"
+#include "code\modules\library\lib_codex_gigas.dm"
+#include "code\modules\library\lib_items.dm"
+#include "code\modules\library\lib_machines.dm"
+#include "code\modules\library\random_books.dm"
+#include "code\modules\library\soapstone.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_object.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\mapping\dmm_suite.dm"
+#include "code\modules\mapping\map_template.dm"
+#include "code\modules\mapping\preloader.dm"
+#include "code\modules\mapping\reader.dm"
+#include "code\modules\mapping\ruins.dm"
+#include "code\modules\mapping\verify.dm"
+#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm"
+#include "code\modules\mapping\mapping_helpers\baseturf.dm"
+#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm"
+#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm"
+#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm"
+#include "code\modules\mapping\space_management\multiz_helpers.dm"
+#include "code\modules\mapping\space_management\space_level.dm"
+#include "code\modules\mapping\space_management\space_reservation.dm"
+#include "code\modules\mapping\space_management\space_transition.dm"
+#include "code\modules\mapping\space_management\traits.dm"
+#include "code\modules\mapping\space_management\zlevel_manager.dm"
+#include "code\modules\mining\abandoned_crates.dm"
+#include "code\modules\mining\aux_base.dm"
+#include "code\modules\mining\aux_base_camera.dm"
+#include "code\modules\mining\fulton.dm"
+#include "code\modules\mining\machine_processing.dm"
+#include "code\modules\mining\machine_redemption.dm"
+#include "code\modules\mining\machine_silo.dm"
+#include "code\modules\mining\machine_stacking.dm"
+#include "code\modules\mining\machine_unloading.dm"
+#include "code\modules\mining\machine_vending.dm"
+#include "code\modules\mining\mine_items.dm"
+#include "code\modules\mining\minebot.dm"
+#include "code\modules\mining\mint.dm"
+#include "code\modules\mining\money_bag.dm"
+#include "code\modules\mining\ores_coins.dm"
+#include "code\modules\mining\satchel_ore_boxdm.dm"
+#include "code\modules\mining\shelters.dm"
+#include "code\modules\mining\equipment\explorer_gear.dm"
+#include "code\modules\mining\equipment\goliath_hide.dm"
+#include "code\modules\mining\equipment\kinetic_crusher.dm"
+#include "code\modules\mining\equipment\lazarus_injector.dm"
+#include "code\modules\mining\equipment\marker_beacons.dm"
+#include "code\modules\mining\equipment\mineral_scanner.dm"
+#include "code\modules\mining\equipment\mining_tools.dm"
+#include "code\modules\mining\equipment\regenerative_core.dm"
+#include "code\modules\mining\equipment\resonator.dm"
+#include "code\modules\mining\equipment\survival_pod.dm"
+#include "code\modules\mining\equipment\vendor_items.dm"
+#include "code\modules\mining\equipment\wormhole_jaunter.dm"
+#include "code\modules\mining\laborcamp\laborshuttle.dm"
+#include "code\modules\mining\laborcamp\laborstacker.dm"
+#include "code\modules\mining\lavaland\ash_flora.dm"
+#include "code\modules\mining\lavaland\necropolis_chests.dm"
+#include "code\modules\mining\lavaland\ruins\gym.dm"
+#include "code\modules\mob\death.dm"
+#include "code\modules\mob\emote.dm"
+#include "code\modules\mob\inventory.dm"
+#include "code\modules\mob\login.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_helpers.dm"
+#include "code\modules\mob\mob_movement.dm"
+#include "code\modules\mob\mob_movespeed.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\status_procs.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\camera\camera.dm"
+#include "code\modules\mob\dead\dead.dm"
+#include "code\modules\mob\dead\new_player\login.dm"
+#include "code\modules\mob\dead\new_player\logout.dm"
+#include "code\modules\mob\dead\new_player\new_player.dm"
+#include "code\modules\mob\dead\new_player\poll.dm"
+#include "code\modules\mob\dead\new_player\preferences_setup.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\moth_fluff.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm"
+#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm"
+#include "code\modules\mob\dead\observer\login.dm"
+#include "code\modules\mob\dead\observer\logout.dm"
+#include "code\modules\mob\dead\observer\notificationprefs.dm"
+#include "code\modules\mob\dead\observer\observer.dm"
+#include "code\modules\mob\dead\observer\observer_movement.dm"
+#include "code\modules\mob\dead\observer\say.dm"
+#include "code\modules\mob\living\blood.dm"
+#include "code\modules\mob\living\bloodcrawl.dm"
+#include "code\modules\mob\living\damage_procs.dm"
+#include "code\modules\mob\living\death.dm"
+#include "code\modules\mob\living\emote.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_movement.dm"
+#include "code\modules\mob\living\login.dm"
+#include "code\modules\mob\living\logout.dm"
+#include "code\modules\mob\living\say.dm"
+#include "code\modules\mob\living\status_procs.dm"
+#include "code\modules\mob\living\taste.dm"
+#include "code\modules\mob\living\ventcrawling.dm"
+#include "code\modules\mob\living\brain\brain.dm"
+#include "code\modules\mob\living\brain\brain_item.dm"
+#include "code\modules\mob\living\brain\death.dm"
+#include "code\modules\mob\living\brain\emote.dm"
+#include "code\modules\mob\living\brain\life.dm"
+#include "code\modules\mob\living\brain\MMI.dm"
+#include "code\modules\mob\living\brain\posibrain.dm"
+#include "code\modules\mob\living\brain\say.dm"
+#include "code\modules\mob\living\brain\status_procs.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_movement.dm"
+#include "code\modules\mob\living\carbon\damage_procs.dm"
+#include "code\modules\mob\living\carbon\death.dm"
+#include "code\modules\mob\living\carbon\emote.dm"
+#include "code\modules\mob\living\carbon\examine.dm"
+#include "code\modules\mob\living\carbon\give.dm"
+#include "code\modules\mob\living\carbon\inventory.dm"
+#include "code\modules\mob\living\carbon\life.dm"
+#include "code\modules\mob\living\carbon\say.dm"
+#include "code\modules\mob\living\carbon\status_procs.dm"
+#include "code\modules\mob\living\carbon\update_icons.dm"
+#include "code\modules\mob\living\carbon\alien\alien.dm"
+#include "code\modules\mob\living\carbon\alien\alien_defense.dm"
+#include "code\modules\mob\living\carbon\alien\damage_procs.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\login.dm"
+#include "code\modules\mob\living\carbon\alien\logout.dm"
+#include "code\modules\mob\living\carbon\alien\organs.dm"
+#include "code\modules\mob\living\carbon\alien\say.dm"
+#include "code\modules\mob\living\carbon\alien\screen.dm"
+#include "code\modules\mob\living\carbon\alien\status_procs.dm"
+#include "code\modules\mob\living\carbon\alien\update_icons.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\death.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\life.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm"
+#include "code\modules\mob\living\carbon\alien\larva\death.dm"
+#include "code\modules\mob\living\carbon\alien\larva\inventory.dm"
+#include "code\modules\mob\living\carbon\alien\larva\larva.dm"
+#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm"
+#include "code\modules\mob\living\carbon\alien\larva\life.dm"
+#include "code\modules\mob\living\carbon\alien\larva\powers.dm"
+#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm"
+#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm"
+#include "code\modules\mob\living\carbon\alien\special\facehugger.dm"
+#include "code\modules\mob\living\carbon\human\damage_procs.dm"
+#include "code\modules\mob\living\carbon\human\death.dm"
+#include "code\modules\mob\living\carbon\human\dummy.dm"
+#include "code\modules\mob\living\carbon\human\emote.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\human.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_helpers.dm"
+#include "code\modules\mob\living\carbon\human\human_movement.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\physiology.dm"
+#include "code\modules\mob\living\carbon\human\say.dm"
+#include "code\modules\mob\living\carbon\human\species.dm"
+#include "code\modules\mob\living\carbon\human\status_procs.dm"
+#include "code\modules\mob\living\carbon\human\typing_indicator.dm"
+#include "code\modules\mob\living\carbon\human\update_icons.dm"
+#include "code\modules\mob\living\carbon\human\species_types\abductors.dm"
+#include "code\modules\mob\living\carbon\human\species_types\android.dm"
+#include "code\modules\mob\living\carbon\human\species_types\angel.dm"
+#include "code\modules\mob\living\carbon\human\species_types\corporate.dm"
+#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm"
+#include "code\modules\mob\living\carbon\human\species_types\felinid.dm"
+#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\golems.dm"
+#include "code\modules\mob\living\carbon\human\species_types\humans.dm"
+#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm"
+#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm"
+#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm"
+#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm"
+#include "code\modules\mob\living\carbon\human\species_types\synths.dm"
+#include "code\modules\mob\living\carbon\human\species_types\vampire.dm"
+#include "code\modules\mob\living\carbon\human\species_types\zombies.dm"
+#include "code\modules\mob\living\carbon\monkey\combat.dm"
+#include "code\modules\mob\living\carbon\monkey\death.dm"
+#include "code\modules\mob\living\carbon\monkey\inventory.dm"
+#include "code\modules\mob\living\carbon\monkey\life.dm"
+#include "code\modules\mob\living\carbon\monkey\monkey.dm"
+#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm"
+#include "code\modules\mob\living\carbon\monkey\punpun.dm"
+#include "code\modules\mob\living\carbon\monkey\update_icons.dm"
+#include "code\modules\mob\living\silicon\damage_procs.dm"
+#include "code\modules\mob\living\silicon\death.dm"
+#include "code\modules\mob\living\silicon\examine.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_defense.dm"
+#include "code\modules\mob\living\silicon\silicon_movement.dm"
+#include "code\modules\mob\living\silicon\ai\ai.dm"
+#include "code\modules\mob\living\silicon\ai\ai_defense.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\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\multicam.dm"
+#include "code\modules\mob\living\silicon\ai\say.dm"
+#include "code\modules\mob\living\silicon\ai\vox_sounds.dm"
+#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
+#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
+#include "code\modules\mob\living\silicon\ai\freelook\eye.dm"
+#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm"
+#include "code\modules\mob\living\silicon\pai\death.dm"
+#include "code\modules\mob\living\silicon\pai\pai.dm"
+#include "code\modules\mob\living\silicon\pai\pai_defense.dm"
+#include "code\modules\mob\living\silicon\pai\pai_shell.dm"
+#include "code\modules\mob\living\silicon\pai\personality.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\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\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\robot.dm"
+#include "code\modules\mob\living\silicon\robot\robot_defense.dm"
+#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
+#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "code\modules\mob\living\silicon\robot\say.dm"
+#include "code\modules\mob\living\simple_animal\animal_defense.dm"
+#include "code\modules\mob\living\simple_animal\astral.dm"
+#include "code\modules\mob\living\simple_animal\constructs.dm"
+#include "code\modules\mob\living\simple_animal\corpse.dm"
+#include "code\modules\mob\living\simple_animal\damage_procs.dm"
+#include "code\modules\mob\living\simple_animal\parrot.dm"
+#include "code\modules\mob\living\simple_animal\shade.dm"
+#include "code\modules\mob\living\simple_animal\simple_animal.dm"
+#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm"
+#include "code\modules\mob\living\simple_animal\status_procs.dm"
+#include "code\modules\mob\living\simple_animal\bot\bot.dm"
+#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm"
+#include "code\modules\mob\living\simple_animal\bot\construction.dm"
+#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm"
+#include "code\modules\mob\living\simple_animal\bot\firebot.dm"
+#include "code\modules\mob\living\simple_animal\bot\floorbot.dm"
+#include "code\modules\mob\living\simple_animal\bot\honkbot.dm"
+#include "code\modules\mob\living\simple_animal\bot\medbot.dm"
+#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
+#include "code\modules\mob\living\simple_animal\bot\secbot.dm"
+#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm"
+#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm"
+#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
+#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm"
+#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
+#include "code\modules\mob\living\simple_animal\friendly\dog.dm"
+#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm"
+#include "code\modules\mob\living\simple_animal\friendly\fox.dm"
+#include "code\modules\mob\living\simple_animal\friendly\goliathbaby.dm"
+#include "code\modules\mob\living\simple_animal\friendly\gondola.dm"
+#include "code\modules\mob\living\simple_animal\friendly\lizard.dm"
+#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
+#include "code\modules\mob\living\simple_animal\friendly\panda.dm"
+#include "code\modules\mob\living\simple_animal\friendly\penguin.dm"
+#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
+#include "code\modules\mob\living\simple_animal\friendly\possum.dm"
+#include "code\modules\mob\living\simple_animal\friendly\skunk.dm"
+#include "code\modules\mob\living\simple_animal\friendly\sloth.dm"
+#include "code\modules\mob\living\simple_animal\friendly\snake.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
+#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
+#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
+#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\support.dm"
+#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
+#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
+#include "code\modules\mob\living\simple_animal\hostile\bees.dm"
+#include "code\modules\mob\living\simple_animal\hostile\bread.dm"
+#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
+#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm"
+#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
+#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm"
+#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
+#include "code\modules\mob\living\simple_animal\hostile\goose.dm"
+#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
+#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
+#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
+#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"
+#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
+#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
+#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm"
+#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm"
+#include "code\modules\mob\living\simple_animal\hostile\russian.dm"
+#include "code\modules\mob\living\simple_animal\hostile\sharks.dm"
+#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm"
+#include "code\modules\mob\living\simple_animal\hostile\statue.dm"
+#include "code\modules\mob\living\simple_animal\hostile\stickman.dm"
+#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
+#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
+#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
+#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
+#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
+#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
+#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
+#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm"
+#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm"
+#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm"
+#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"
+#include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm"
+#include "code\modules\mob\living\simple_animal\slime\death.dm"
+#include "code\modules\mob\living\simple_animal\slime\emote.dm"
+#include "code\modules\mob\living\simple_animal\slime\life.dm"
+#include "code\modules\mob\living\simple_animal\slime\powers.dm"
+#include "code\modules\mob\living\simple_animal\slime\say.dm"
+#include "code\modules\mob\living\simple_animal\slime\slime.dm"
+#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
+#include "code\modules\modular_computers\laptop_vendor.dm"
+#include "code\modules\modular_computers\computers\item\computer.dm"
+#include "code\modules\modular_computers\computers\item\computer_components.dm"
+#include "code\modules\modular_computers\computers\item\computer_damage.dm"
+#include "code\modules\modular_computers\computers\item\computer_power.dm"
+#include "code\modules\modular_computers\computers\item\computer_ui.dm"
+#include "code\modules\modular_computers\computers\item\laptop.dm"
+#include "code\modules\modular_computers\computers\item\laptop_presets.dm"
+#include "code\modules\modular_computers\computers\item\processor.dm"
+#include "code\modules\modular_computers\computers\item\tablet.dm"
+#include "code\modules\modular_computers\computers\item\tablet_presets.dm"
+#include "code\modules\modular_computers\computers\machinery\console_presets.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_computer.dm"
+#include "code\modules\modular_computers\computers\machinery\modular_console.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\program.dm"
+#include "code\modules\modular_computers\file_system\program_events.dm"
+#include "code\modules\modular_computers\file_system\programs\airestorer.dm"
+#include "code\modules\modular_computers\file_system\programs\alarm.dm"
+#include "code\modules\modular_computers\file_system\programs\card.dm"
+#include "code\modules\modular_computers\file_system\programs\configurator.dm"
+#include "code\modules\modular_computers\file_system\programs\file_browser.dm"
+#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm"
+#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm"
+#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm"
+#include "code\modules\modular_computers\file_system\programs\nttransfer.dm"
+#include "code\modules\modular_computers\file_system\programs\powermonitor.dm"
+#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm"
+#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm"
+#include "code\modules\modular_computers\hardware\_hardware.dm"
+#include "code\modules\modular_computers\hardware\ai_slot.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\CPU.dm"
+#include "code\modules\modular_computers\hardware\hard_drive.dm"
+#include "code\modules\modular_computers\hardware\network_card.dm"
+#include "code\modules\modular_computers\hardware\portable_disk.dm"
+#include "code\modules\modular_computers\hardware\printer.dm"
+#include "code\modules\modular_computers\hardware\recharger.dm"
+#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
+#include "code\modules\ninja\__ninjaDefines.dm"
+#include "code\modules\ninja\energy_katana.dm"
+#include "code\modules\ninja\ninja_event.dm"
+#include "code\modules\ninja\outfit.dm"
+#include "code\modules\ninja\suit\gloves.dm"
+#include "code\modules\ninja\suit\head.dm"
+#include "code\modules\ninja\suit\mask.dm"
+#include "code\modules\ninja\suit\ninjaDrainAct.dm"
+#include "code\modules\ninja\suit\shoes.dm"
+#include "code\modules\ninja\suit\suit.dm"
+#include "code\modules\ninja\suit\suit_attackby.dm"
+#include "code\modules\ninja\suit\suit_initialisation.dm"
+#include "code\modules\ninja\suit\suit_process.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_empulse.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_net.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm"
+#include "code\modules\NTNet\netdata.dm"
+#include "code\modules\NTNet\network.dm"
+#include "code\modules\NTNet\relays.dm"
+#include "code\modules\NTNet\services\_service.dm"
+#include "code\modules\oracle_ui\assets.dm"
+#include "code\modules\oracle_ui\hookup_procs.dm"
+#include "code\modules\oracle_ui\oracle_ui.dm"
+#include "code\modules\oracle_ui\themed.dm"
+#include "code\modules\paperwork\clipboard.dm"
+#include "code\modules\paperwork\contract.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_cutter.dm"
+#include "code\modules\paperwork\paper_premade.dm"
+#include "code\modules\paperwork\paperbin.dm"
+#include "code\modules\paperwork\paperplane.dm"
+#include "code\modules\paperwork\pen.dm"
+#include "code\modules\paperwork\photocopier.dm"
+#include "code\modules\paperwork\stamps.dm"
+#include "code\modules\photography\_pictures.dm"
+#include "code\modules\photography\camera\camera.dm"
+#include "code\modules\photography\camera\camera_image_capturing.dm"
+#include "code\modules\photography\camera\film.dm"
+#include "code\modules\photography\camera\other.dm"
+#include "code\modules\photography\camera\silicon_camera.dm"
+#include "code\modules\photography\photos\album.dm"
+#include "code\modules\photography\photos\frame.dm"
+#include "code\modules\photography\photos\photo.dm"
+#include "code\modules\pool\pool_controller.dm"
+#include "code\modules\pool\pool_drain.dm"
+#include "code\modules\pool\pool_effects.dm"
+#include "code\modules\pool\pool_main.dm"
+#include "code\modules\pool\pool_noodles.dm"
+#include "code\modules\pool\pool_structures.dm"
+#include "code\modules\pool\pool_wires.dm"
+#include "code\modules\power\apc.dm"
+#include "code\modules\power\cable.dm"
+#include "code\modules\power\cell.dm"
+#include "code\modules\power\floodlight.dm"
+#include "code\modules\power\generator.dm"
+#include "code\modules\power\gravitygenerator.dm"
+#include "code\modules\power\lighting.dm"
+#include "code\modules\power\monitor.dm"
+#include "code\modules\power\multiz.dm"
+#include "code\modules\power\port_gen.dm"
+#include "code\modules\power\power.dm"
+#include "code\modules\power\powernet.dm"
+#include "code\modules\power\rtg.dm"
+#include "code\modules\power\smes.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\singularity\collector.dm"
+#include "code\modules\power\singularity\containment_field.dm"
+#include "code\modules\power\singularity\emitter.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\narsie.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_control.dm"
+#include "code\modules\power\singularity\particle_accelerator\particle_emitter.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\procedural_mapping\mapGenerator.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModule.dm"
+#include "code\modules\procedural_mapping\mapGeneratorObj.dm"
+#include "code\modules\procedural_mapping\mapGeneratorReadme.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm"
+#include "code\modules\procedural_mapping\mapGenerators\cellular.dm"
+#include "code\modules\procedural_mapping\mapGenerators\cult.dm"
+#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm"
+#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm"
+#include "code\modules\procedural_mapping\mapGenerators\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\repair.dm"
+#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
+#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
+#include "code\modules\projectiles\gun.dm"
+#include "code\modules\projectiles\pins.dm"
+#include "code\modules\projectiles\projectile.dm"
+#include "code\modules\projectiles\ammunition\_ammunition.dm"
+#include "code\modules\projectiles\ammunition\_firing.dm"
+#include "code\modules\projectiles\ammunition\ballistic\lmg.dm"
+#include "code\modules\projectiles\ammunition\ballistic\pistol.dm"
+#include "code\modules\projectiles\ammunition\ballistic\revolver.dm"
+#include "code\modules\projectiles\ammunition\ballistic\rifle.dm"
+#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm"
+#include "code\modules\projectiles\ammunition\ballistic\smg.dm"
+#include "code\modules\projectiles\ammunition\ballistic\sniper.dm"
+#include "code\modules\projectiles\ammunition\caseless\_caseless.dm"
+#include "code\modules\projectiles\ammunition\caseless\foam.dm"
+#include "code\modules\projectiles\ammunition\caseless\misc.dm"
+#include "code\modules\projectiles\ammunition\caseless\rocket.dm"
+#include "code\modules\projectiles\ammunition\energy\_energy.dm"
+#include "code\modules\projectiles\ammunition\energy\ebow.dm"
+#include "code\modules\projectiles\ammunition\energy\gravity.dm"
+#include "code\modules\projectiles\ammunition\energy\laser.dm"
+#include "code\modules\projectiles\ammunition\energy\lmg.dm"
+#include "code\modules\projectiles\ammunition\energy\plasma.dm"
+#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm"
+#include "code\modules\projectiles\ammunition\energy\portal.dm"
+#include "code\modules\projectiles\ammunition\energy\special.dm"
+#include "code\modules\projectiles\ammunition\energy\stun.dm"
+#include "code\modules\projectiles\ammunition\special\magic.dm"
+#include "code\modules\projectiles\ammunition\special\syringe.dm"
+#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
+#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
+#include "code\modules\projectiles\boxes_magazines\external\lmg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
+#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm"
+#include "code\modules\projectiles\boxes_magazines\external\rifle.dm"
+#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm"
+#include "code\modules\projectiles\boxes_magazines\external\smg.dm"
+#include "code\modules\projectiles\boxes_magazines\external\sniper.dm"
+#include "code\modules\projectiles\boxes_magazines\external\toy.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\misc.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm"
+#include "code\modules\projectiles\boxes_magazines\internal\toy.dm"
+#include "code\modules\projectiles\guns\ballistic.dm"
+#include "code\modules\projectiles\guns\energy.dm"
+#include "code\modules\projectiles\guns\magic.dm"
+#include "code\modules\projectiles\guns\ballistic\automatic.dm"
+#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm"
+#include "code\modules\projectiles\guns\ballistic\launchers.dm"
+#include "code\modules\projectiles\guns\ballistic\pistol.dm"
+#include "code\modules\projectiles\guns\ballistic\revolver.dm"
+#include "code\modules\projectiles\guns\ballistic\shotgun.dm"
+#include "code\modules\projectiles\guns\ballistic\toy.dm"
+#include "code\modules\projectiles\guns\energy\dueling.dm"
+#include "code\modules\projectiles\guns\energy\energy_gun.dm"
+#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
+#include "code\modules\projectiles\guns\energy\laser.dm"
+#include "code\modules\projectiles\guns\energy\megabuster.dm"
+#include "code\modules\projectiles\guns\energy\mounted.dm"
+#include "code\modules\projectiles\guns\energy\plasma_cit.dm"
+#include "code\modules\projectiles\guns\energy\pulse.dm"
+#include "code\modules\projectiles\guns\energy\special.dm"
+#include "code\modules\projectiles\guns\energy\stun.dm"
+#include "code\modules\projectiles\guns\magic\staff.dm"
+#include "code\modules\projectiles\guns\magic\wand.dm"
+#include "code\modules\projectiles\guns\misc\beam_rifle.dm"
+#include "code\modules\projectiles\guns\misc\blastcannon.dm"
+#include "code\modules\projectiles\guns\misc\chem_gun.dm"
+#include "code\modules\projectiles\guns\misc\grenade_launcher.dm"
+#include "code\modules\projectiles\guns\misc\medbeam.dm"
+#include "code\modules\projectiles\guns\misc\syringe_gun.dm"
+#include "code\modules\projectiles\projectile\beams.dm"
+#include "code\modules\projectiles\projectile\bullets.dm"
+#include "code\modules\projectiles\projectile\magic.dm"
+#include "code\modules\projectiles\projectile\megabuster.dm"
+#include "code\modules\projectiles\projectile\plasma.dm"
+#include "code\modules\projectiles\projectile\bullets\_incendiary.dm"
+#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm"
+#include "code\modules\projectiles\projectile\bullets\dnainjector.dm"
+#include "code\modules\projectiles\projectile\bullets\grenade.dm"
+#include "code\modules\projectiles\projectile\bullets\lmg.dm"
+#include "code\modules\projectiles\projectile\bullets\pistol.dm"
+#include "code\modules\projectiles\projectile\bullets\revolver.dm"
+#include "code\modules\projectiles\projectile\bullets\rifle.dm"
+#include "code\modules\projectiles\projectile\bullets\shotgun.dm"
+#include "code\modules\projectiles\projectile\bullets\smg.dm"
+#include "code\modules\projectiles\projectile\bullets\sniper.dm"
+#include "code\modules\projectiles\projectile\bullets\special.dm"
+#include "code\modules\projectiles\projectile\energy\_energy.dm"
+#include "code\modules\projectiles\projectile\energy\ebow.dm"
+#include "code\modules\projectiles\projectile\energy\misc.dm"
+#include "code\modules\projectiles\projectile\energy\net_snare.dm"
+#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm"
+#include "code\modules\projectiles\projectile\energy\stun.dm"
+#include "code\modules\projectiles\projectile\energy\tesla.dm"
+#include "code\modules\projectiles\projectile\magic\spellcard.dm"
+#include "code\modules\projectiles\projectile\reusable\_reusable.dm"
+#include "code\modules\projectiles\projectile\reusable\foam_dart.dm"
+#include "code\modules\projectiles\projectile\reusable\magspear.dm"
+#include "code\modules\projectiles\projectile\special\curse.dm"
+#include "code\modules\projectiles\projectile\special\floral.dm"
+#include "code\modules\projectiles\projectile\special\gravity.dm"
+#include "code\modules\projectiles\projectile\special\hallucination.dm"
+#include "code\modules\projectiles\projectile\special\ion.dm"
+#include "code\modules\projectiles\projectile\special\meteor.dm"
+#include "code\modules\projectiles\projectile\special\mindflayer.dm"
+#include "code\modules\projectiles\projectile\special\neurotoxin.dm"
+#include "code\modules\projectiles\projectile\special\plasma.dm"
+#include "code\modules\projectiles\projectile\special\rocket.dm"
+#include "code\modules\projectiles\projectile\special\temperature.dm"
+#include "code\modules\projectiles\projectile\special\wormhole.dm"
+#include "code\modules\reagents\chem_splash.dm"
+#include "code\modules\reagents\chem_wiki_render.dm"
+#include "code\modules\reagents\reagent_containers.dm"
+#include "code\modules\reagents\reagent_dispenser.dm"
+#include "code\modules\reagents\chemistry\colors.dm"
+#include "code\modules\reagents\chemistry\holder.dm"
+#include "code\modules\reagents\chemistry\reagents.dm"
+#include "code\modules\reagents\chemistry\recipes.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_heater.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_master.dm"
+#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm"
+#include "code\modules\reagents\chemistry\machinery\pandemic.dm"
+#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm"
+#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm"
+#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\food_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\other_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm"
+#include "code\modules\reagents\chemistry\recipes\drugs.dm"
+#include "code\modules\reagents\chemistry\recipes\medicine.dm"
+#include "code\modules\reagents\chemistry\recipes\others.dm"
+#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm"
+#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm"
+#include "code\modules\reagents\chemistry\recipes\special.dm"
+#include "code\modules\reagents\chemistry\recipes\toxins.dm"
+#include "code\modules\reagents\reagent_containers\blood_pack.dm"
+#include "code\modules\reagents\reagent_containers\borghydro.dm"
+#include "code\modules\reagents\reagent_containers\bottle.dm"
+#include "code\modules\reagents\reagent_containers\chem_pack.dm"
+#include "code\modules\reagents\reagent_containers\Chemical_tongue.dm"
+#include "code\modules\reagents\reagent_containers\dropper.dm"
+#include "code\modules\reagents\reagent_containers\glass.dm"
+#include "code\modules\reagents\reagent_containers\hypospray.dm"
+#include "code\modules\reagents\reagent_containers\hypovial.dm"
+#include "code\modules\reagents\reagent_containers\medspray.dm"
+#include "code\modules\reagents\reagent_containers\patch.dm"
+#include "code\modules\reagents\reagent_containers\pill.dm"
+#include "code\modules\reagents\reagent_containers\rags.dm"
+#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm"
+#include "code\modules\reagents\reagent_containers\spray.dm"
+#include "code\modules\reagents\reagent_containers\syringes.dm"
+#include "code\modules\recycling\conveyor2.dm"
+#include "code\modules\recycling\sortingmachinery.dm"
+#include "code\modules\recycling\disposal\bin.dm"
+#include "code\modules\recycling\disposal\construction.dm"
+#include "code\modules\recycling\disposal\eject.dm"
+#include "code\modules\recycling\disposal\holder.dm"
+#include "code\modules\recycling\disposal\multiz.dm"
+#include "code\modules\recycling\disposal\outlet.dm"
+#include "code\modules\recycling\disposal\pipe.dm"
+#include "code\modules\recycling\disposal\pipe_sorting.dm"
+#include "code\modules\research\designs.dm"
+#include "code\modules\research\destructive_analyzer.dm"
+#include "code\modules\research\experimentor.dm"
+#include "code\modules\research\rdconsole.dm"
+#include "code\modules\research\rdmachines.dm"
+#include "code\modules\research\research_disk.dm"
+#include "code\modules\research\server.dm"
+#include "code\modules\research\stock_parts.dm"
+#include "code\modules\research\designs\AI_module_designs.dm"
+#include "code\modules\research\designs\autobotter_designs.dm"
+#include "code\modules\research\designs\biogenerator_designs.dm"
+#include "code\modules\research\designs\bluespace_designs.dm"
+#include "code\modules\research\designs\computer_part_designs.dm"
+#include "code\modules\research\designs\electronics_designs.dm"
+#include "code\modules\research\designs\equipment_designs.dm"
+#include "code\modules\research\designs\limbgrower_designs.dm"
+#include "code\modules\research\designs\mecha_designs.dm"
+#include "code\modules\research\designs\mechfabricator_designs.dm"
+#include "code\modules\research\designs\medical_designs.dm"
+#include "code\modules\research\designs\mining_designs.dm"
+#include "code\modules\research\designs\misc_designs.dm"
+#include "code\modules\research\designs\nanite_designs.dm"
+#include "code\modules\research\designs\power_designs.dm"
+#include "code\modules\research\designs\smelting_designs.dm"
+#include "code\modules\research\designs\stock_parts_designs.dm"
+#include "code\modules\research\designs\telecomms_designs.dm"
+#include "code\modules\research\designs\weapon_designs.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
+#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
+#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm"
+#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm"
+#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm"
+#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm"
+#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm"
+#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm"
+#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm"
+#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm"
+#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm"
+#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm"
+#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm"
+#include "code\modules\research\designs\machine_desings\machine_designs_service.dm"
+#include "code\modules\research\machinery\_production.dm"
+#include "code\modules\research\machinery\circuit_imprinter.dm"
+#include "code\modules\research\machinery\departmental_circuit_imprinter.dm"
+#include "code\modules\research\machinery\departmental_protolathe.dm"
+#include "code\modules\research\machinery\departmental_techfab.dm"
+#include "code\modules\research\machinery\protolathe.dm"
+#include "code\modules\research\machinery\techfab.dm"
+#include "code\modules\research\nanites\nanite_chamber.dm"
+#include "code\modules\research\nanites\nanite_chamber_computer.dm"
+#include "code\modules\research\nanites\nanite_cloud_controller.dm"
+#include "code\modules\research\nanites\nanite_hijacker.dm"
+#include "code\modules\research\nanites\nanite_misc_items.dm"
+#include "code\modules\research\nanites\nanite_program_hub.dm"
+#include "code\modules\research\nanites\nanite_programmer.dm"
+#include "code\modules\research\nanites\nanite_programs.dm"
+#include "code\modules\research\nanites\nanite_remote.dm"
+#include "code\modules\research\nanites\program_disks.dm"
+#include "code\modules\research\nanites\public_chamber.dm"
+#include "code\modules\research\nanites\nanite_programs\buffing.dm"
+#include "code\modules\research\nanites\nanite_programs\healing.dm"
+#include "code\modules\research\nanites\nanite_programs\rogue.dm"
+#include "code\modules\research\nanites\nanite_programs\sensor.dm"
+#include "code\modules\research\nanites\nanite_programs\suppression.dm"
+#include "code\modules\research\nanites\nanite_programs\utility.dm"
+#include "code\modules\research\nanites\nanite_programs\weapon.dm"
+#include "code\modules\research\techweb\__techweb_helpers.dm"
+#include "code\modules\research\techweb\_techweb.dm"
+#include "code\modules\research\techweb\_techweb_node.dm"
+#include "code\modules\research\techweb\all_nodes.dm"
+#include "code\modules\research\xenoarch\artifact.dm"
+#include "code\modules\research\xenoarch\artifact_list.dm"
+#include "code\modules\research\xenoarch\strange_rock.dm"
+#include "code\modules\research\xenoarch\tools.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\amauri.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\gelthi.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\jurlmah.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\nofruit.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\shand.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\surik.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\telriis.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\thaadra.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\vale.dm"
+#include "code\modules\research\xenoarch\xenobotany\grown\vaporsac.dm"
+#include "code\modules\research\xenobiology\xenobio_camera.dm"
+#include "code\modules\research\xenobiology\xenobiology.dm"
+#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm"
+#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm"
+#include "code\modules\research\xenobiology\crossbreeding\_misc.dm"
+#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm"
+#include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm"
+#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm"
+#include "code\modules\research\xenobiology\crossbreeding\burning.dm"
+#include "code\modules\research\xenobiology\crossbreeding\charged.dm"
+#include "code\modules\research\xenobiology\crossbreeding\chilling.dm"
+#include "code\modules\research\xenobiology\crossbreeding\consuming.dm"
+#include "code\modules\research\xenobiology\crossbreeding\industrial.dm"
+#include "code\modules\research\xenobiology\crossbreeding\prismatic.dm"
+#include "code\modules\research\xenobiology\crossbreeding\recurring.dm"
+#include "code\modules\research\xenobiology\crossbreeding\regenerative.dm"
+#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm"
+#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm"
+#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm"
+#include "code\modules\ruins\lavaland_ruin_code.dm"
+#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
+#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"
+#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
+#include "code\modules\ruins\lavalandruin_code\sloth.dm"
+#include "code\modules\ruins\lavalandruin_code\surface.dm"
+#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
+#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm"
+#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm"
+#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
+#include "code\modules\ruins\spaceruin_code\asteroid4.dm"
+#include "code\modules\ruins\spaceruin_code\bigderelict1.dm"
+#include "code\modules\ruins\spaceruin_code\caravanambush.dm"
+#include "code\modules\ruins\spaceruin_code\cloning_lab.dm"
+#include "code\modules\ruins\spaceruin_code\crashedclownship.dm"
+#include "code\modules\ruins\spaceruin_code\crashedship.dm"
+#include "code\modules\ruins\spaceruin_code\deepstorage.dm"
+#include "code\modules\ruins\spaceruin_code\DJstation.dm"
+#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm"
+#include "code\modules\ruins\spaceruin_code\listeningstation.dm"
+#include "code\modules\ruins\spaceruin_code\miracle.dm"
+#include "code\modules\ruins\spaceruin_code\oldstation.dm"
+#include "code\modules\ruins\spaceruin_code\originalcontent.dm"
+#include "code\modules\ruins\spaceruin_code\spacehotel.dm"
+#include "code\modules\ruins\spaceruin_code\TheDerelict.dm"
+#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm"
+#include "code\modules\security_levels\keycard_authentication.dm"
+#include "code\modules\security_levels\security_levels.dm"
+#include "code\modules\shuttle\arrivals.dm"
+#include "code\modules\shuttle\assault_pod.dm"
+#include "code\modules\shuttle\computer.dm"
+#include "code\modules\shuttle\docking.dm"
+#include "code\modules\shuttle\elevator.dm"
+#include "code\modules\shuttle\emergency.dm"
+#include "code\modules\shuttle\ferry.dm"
+#include "code\modules\shuttle\manipulator.dm"
+#include "code\modules\shuttle\monastery.dm"
+#include "code\modules\shuttle\navigation_computer.dm"
+#include "code\modules\shuttle\on_move.dm"
+#include "code\modules\shuttle\ripple.dm"
+#include "code\modules\shuttle\shuttle.dm"
+#include "code\modules\shuttle\shuttle_rotate.dm"
+#include "code\modules\shuttle\special.dm"
+#include "code\modules\shuttle\supply.dm"
+#include "code\modules\shuttle\syndicate.dm"
+#include "code\modules\shuttle\white_ship.dm"
+#include "code\modules\spells\spell.dm"
+#include "code\modules\spells\spell_types\adminbussed.dm"
+#include "code\modules\spells\spell_types\aimed.dm"
+#include "code\modules\spells\spell_types\area_teleport.dm"
+#include "code\modules\spells\spell_types\barnyard.dm"
+#include "code\modules\spells\spell_types\bloodcrawl.dm"
+#include "code\modules\spells\spell_types\charge.dm"
+#include "code\modules\spells\spell_types\conjure.dm"
+#include "code\modules\spells\spell_types\construct_spells.dm"
+#include "code\modules\spells\spell_types\devil.dm"
+#include "code\modules\spells\spell_types\devil_boons.dm"
+#include "code\modules\spells\spell_types\dumbfire.dm"
+#include "code\modules\spells\spell_types\emplosion.dm"
+#include "code\modules\spells\spell_types\ethereal_jaunt.dm"
+#include "code\modules\spells\spell_types\explosion.dm"
+#include "code\modules\spells\spell_types\forcewall.dm"
+#include "code\modules\spells\spell_types\genetic.dm"
+#include "code\modules\spells\spell_types\godhand.dm"
+#include "code\modules\spells\spell_types\infinite_guns.dm"
+#include "code\modules\spells\spell_types\inflict_handler.dm"
+#include "code\modules\spells\spell_types\knock.dm"
+#include "code\modules\spells\spell_types\lichdom.dm"
+#include "code\modules\spells\spell_types\lightning.dm"
+#include "code\modules\spells\spell_types\mime.dm"
+#include "code\modules\spells\spell_types\mind_transfer.dm"
+#include "code\modules\spells\spell_types\projectile.dm"
+#include "code\modules\spells\spell_types\rightandwrong.dm"
+#include "code\modules\spells\spell_types\rod_form.dm"
+#include "code\modules\spells\spell_types\santa.dm"
+#include "code\modules\spells\spell_types\shadow_walk.dm"
+#include "code\modules\spells\spell_types\shapeshift.dm"
+#include "code\modules\spells\spell_types\spacetime_distortion.dm"
+#include "code\modules\spells\spell_types\summonitem.dm"
+#include "code\modules\spells\spell_types\taeclowndo.dm"
+#include "code\modules\spells\spell_types\telepathy.dm"
+#include "code\modules\spells\spell_types\the_traps.dm"
+#include "code\modules\spells\spell_types\touch_attacks.dm"
+#include "code\modules\spells\spell_types\trigger.dm"
+#include "code\modules\spells\spell_types\turf_teleport.dm"
+#include "code\modules\spells\spell_types\voice_of_god.dm"
+#include "code\modules\spells\spell_types\wizard.dm"
+#include "code\modules\station_goals\bsa.dm"
+#include "code\modules\station_goals\dna_vault.dm"
+#include "code\modules\station_goals\shield.dm"
+#include "code\modules\station_goals\station_goal.dm"
+#include "code\modules\surgery\amputation.dm"
+#include "code\modules\surgery\brain_surgery.dm"
+#include "code\modules\surgery\breast_augmentation.dm"
+#include "code\modules\surgery\cavity_implant.dm"
+#include "code\modules\surgery\core_removal.dm"
+#include "code\modules\surgery\coronary_bypass.dm"
+#include "code\modules\surgery\dental_implant.dm"
+#include "code\modules\surgery\embalming.dm"
+#include "code\modules\surgery\experimental_dissection.dm"
+#include "code\modules\surgery\eye_surgery.dm"
+#include "code\modules\surgery\graft_synthtissue.dm"
+#include "code\modules\surgery\healing.dm"
+#include "code\modules\surgery\helpers.dm"
+#include "code\modules\surgery\implant_removal.dm"
+#include "code\modules\surgery\limb_augmentation.dm"
+#include "code\modules\surgery\lipoplasty.dm"
+#include "code\modules\surgery\lobectomy.dm"
+#include "code\modules\surgery\mechanic_steps.dm"
+#include "code\modules\surgery\nutcracker.dm"
+#include "code\modules\surgery\organ_manipulation.dm"
+#include "code\modules\surgery\organic_steps.dm"
+#include "code\modules\surgery\penis_augmentation.dm"
+#include "code\modules\surgery\plastic_surgery.dm"
+#include "code\modules\surgery\prosthetic_replacement.dm"
+#include "code\modules\surgery\remove_embedded_object.dm"
+#include "code\modules\surgery\surgery.dm"
+#include "code\modules\surgery\surgery_step.dm"
+#include "code\modules\surgery\tools.dm"
+#include "code\modules\surgery\advanced\brainwashing.dm"
+#include "code\modules\surgery\advanced\lobotomy.dm"
+#include "code\modules\surgery\advanced\necrotic_revival.dm"
+#include "code\modules\surgery\advanced\pacification.dm"
+#include "code\modules\surgery\advanced\revival.dm"
+#include "code\modules\surgery\advanced\toxichealing.dm"
+#include "code\modules\surgery\advanced\viral_bonding.dm"
+#include "code\modules\surgery\advanced\bioware\bioware.dm"
+#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm"
+#include "code\modules\surgery\advanced\bioware\ligament_hook.dm"
+#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm"
+#include "code\modules\surgery\advanced\bioware\muscled_veins.dm"
+#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm"
+#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm"
+#include "code\modules\surgery\advanced\bioware\vein_threading.dm"
+#include "code\modules\surgery\bodyparts\bodyparts.dm"
+#include "code\modules\surgery\bodyparts\broken.dm"
+#include "code\modules\surgery\bodyparts\dismemberment.dm"
+#include "code\modules\surgery\bodyparts\head.dm"
+#include "code\modules\surgery\bodyparts\helpers.dm"
+#include "code\modules\surgery\bodyparts\robot_bodyparts.dm"
+#include "code\modules\surgery\organs\appendix.dm"
+#include "code\modules\surgery\organs\augments_arms.dm"
+#include "code\modules\surgery\organs\augments_chest.dm"
+#include "code\modules\surgery\organs\augments_eyes.dm"
+#include "code\modules\surgery\organs\augments_internal.dm"
+#include "code\modules\surgery\organs\autosurgeon.dm"
+#include "code\modules\surgery\organs\ears.dm"
+#include "code\modules\surgery\organs\eyes.dm"
+#include "code\modules\surgery\organs\heart.dm"
+#include "code\modules\surgery\organs\helpers.dm"
+#include "code\modules\surgery\organs\liver.dm"
+#include "code\modules\surgery\organs\lungs.dm"
+#include "code\modules\surgery\organs\organ_internal.dm"
+#include "code\modules\surgery\organs\stomach.dm"
+#include "code\modules\surgery\organs\tails.dm"
+#include "code\modules\surgery\organs\tongue.dm"
+#include "code\modules\surgery\organs\vocal_cords.dm"
+#include "code\modules\tgs\includes.dm"
+#include "code\modules\tgui\external.dm"
+#include "code\modules\tgui\states.dm"
+#include "code\modules\tgui\subsystem.dm"
+#include "code\modules\tgui\tgui.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\language_menu.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\zlevel.dm"
+#include "code\modules\tooltip\tooltip.dm"
+#include "code\modules\unit_tests\_unit_tests.dm"
+#include "code\modules\uplink\uplink_devices.dm"
+#include "code\modules\uplink\uplink_items.dm"
+#include "code\modules\uplink\uplink_purchase_log.dm"
+#include "code\modules\vehicles\_vehicle.dm"
+#include "code\modules\vehicles\atv.dm"
+#include "code\modules\vehicles\bicycle.dm"
+#include "code\modules\vehicles\lavaboat.dm"
+#include "code\modules\vehicles\motorized_wheelchair.dm"
+#include "code\modules\vehicles\pimpin_ride.dm"
+#include "code\modules\vehicles\ridden.dm"
+#include "code\modules\vehicles\scooter.dm"
+#include "code\modules\vehicles\sealed.dm"
+#include "code\modules\vehicles\secway.dm"
+#include "code\modules\vehicles\speedbike.dm"
+#include "code\modules\vehicles\vehicle_actions.dm"
+#include "code\modules\vehicles\vehicle_key.dm"
+#include "code\modules\vehicles\wheelchair.dm"
+#include "code\modules\vehicles\cars\car.dm"
+#include "code\modules\vehicles\cars\clowncar.dm"
+#include "code\modules\vending\_vending.dm"
+#include "code\modules\vending\assist.dm"
+#include "code\modules\vending\autodrobe.dm"
+#include "code\modules\vending\boozeomat.dm"
+#include "code\modules\vending\cartridge.dm"
+#include "code\modules\vending\cigarette.dm"
+#include "code\modules\vending\clothesmate.dm"
+#include "code\modules\vending\coffee.dm"
+#include "code\modules\vending\cola.dm"
+#include "code\modules\vending\drinnerware.dm"
+#include "code\modules\vending\engineering.dm"
+#include "code\modules\vending\engivend.dm"
+#include "code\modules\vending\games.dm"
+#include "code\modules\vending\liberation.dm"
+#include "code\modules\vending\liberation_toy.dm"
+#include "code\modules\vending\magivend.dm"
+#include "code\modules\vending\medical.dm"
+#include "code\modules\vending\medical_wall.dm"
+#include "code\modules\vending\megaseed.dm"
+#include "code\modules\vending\nutrimax.dm"
+#include "code\modules\vending\plasmaresearch.dm"
+#include "code\modules\vending\robotics.dm"
+#include "code\modules\vending\security.dm"
+#include "code\modules\vending\snack.dm"
+#include "code\modules\vending\sovietsoda.dm"
+#include "code\modules\vending\sustenance.dm"
+#include "code\modules\vending\toys.dm"
+#include "code\modules\vending\wardrobes.dm"
+#include "code\modules\vending\youtool.dm"
+#include "code\modules\VR\vr_human.dm"
+#include "code\modules\VR\vr_sleeper.dm"
+#include "code\modules\zombie\items.dm"
+#include "code\modules\zombie\organs.dm"
+#include "hyperstation\code\__DEFINES\economy.dm"
+#include "hyperstation\code\__DEFINES\wendigo.dm"
+#include "hyperstation\code\controllers\subsystem\economy.dm"
+#include "hyperstation\code\datums\actions.dm"
+#include "hyperstation\code\datums\components\crafting\bounties.dm"
+#include "hyperstation\code\datums\components\crafting\recipes.dm"
+#include "hyperstation\code\datums\ert_hazard_cleanup.dm"
+#include "hyperstation\code\datums\elements\holder_micro.dm"
+#include "hyperstation\code\datums\mood_events\events.dm"
+#include "hyperstation\code\datums\ruins\lavaland.dm"
+#include "hyperstation\code\datums\traits\good.dm"
+#include "hyperstation\code\datums\traits\neutral.dm"
+#include "hyperstation\code\datums\weather\oxygen_rain.dm"
+#include "hyperstation\code\game\objects\railings.dm"
+#include "hyperstation\code\game\objects\items\cosmetics.dm"
+#include "hyperstation\code\game\objects\items\storage\big_bag.dm"
+#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm"
+#include "hyperstation\code\gamemode\traitor_lewd.dm"
+#include "hyperstation\code\gamemode\traitor_thief.dm"
+#include "hyperstation\code\gamemode\werewolf\werewolf.dm"
+#include "hyperstation\code\hyperbot\hyperbot.dm"
+#include "hyperstation\code\mobs\carrion.dm"
+#include "hyperstation\code\mobs\dancer.dm"
+#include "hyperstation\code\mobs\hugbot.dm"
+#include "hyperstation\code\mobs\mimic.dm"
+#include "hyperstation\code\mobs\werewolf.dm"
+#include "hyperstation\code\modules\pen.dm"
+#include "hyperstation\code\modules\traits.dm"
+#include "hyperstation\code\modules\admin\verbs\hyperverbs.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\datums_hud.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\forest\structures\soul_storage.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\_on_click.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\defines_init.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\examine.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\metabolization.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_defense.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_equip.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\organs_bodyparts.dm"
+#include "hyperstation\code\modules\antagonists\wendigo\mob\update_icons.dm"
+#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm"
+#include "hyperstation\code\modules\arousal\arousalhud.dm"
+#include "hyperstation\code\modules\cargo\exports\engineering.dm"
+#include "hyperstation\code\modules\cargo\exports\sweatshop.dm"
+#include "hyperstation\code\modules\cargo\packs\misc.dm"
+#include "hyperstation\code\modules\cargo\sweatshop\metal.dm"
+#include "hyperstation\code\modules\cargo\sweatshop\sweatshop.dm"
+#include "hyperstation\code\modules\cargo\sweatshop\wooden.dm"
+#include "hyperstation\code\modules\client\loadout\glasses.dm"
+#include "hyperstation\code\modules\client\loadout\tablet.dm"
+#include "hyperstation\code\modules\clothing\gloves.dm"
+#include "hyperstation\code\modules\clothing\head.dm"
+#include "hyperstation\code\modules\clothing\glasses\polychromic_glasses.dm"
+#include "hyperstation\code\modules\clothing\spacesuits\hardsuit.dm"
+#include "hyperstation\code\modules\clothing\suits\misc.dm"
+#include "hyperstation\code\modules\clothing\under\under.dm"
+#include "hyperstation\code\modules\economy\account.dm"
+#include "hyperstation\code\modules\integrated_electronics\input.dm"
+#include "hyperstation\code\modules\mining\shelters.dm"
+#include "hyperstation\code\modules\mining\equipment\survival_pod.dm"
+#include "hyperstation\code\modules\mob\mob_helpers.dm"
+#include "hyperstation\code\modules\mob\living\status_indicators.dm"
+#include "hyperstation\code\modules\mob\living\silicon\robot\robot.dm"
+#include "hyperstation\code\modules\mob\living\silicon\robot\robot_modules.dm"
+#include "hyperstation\code\modules\patreon\patreon.dm"
+#include "hyperstation\code\modules\power\reactor\fuel_rods.dm"
+#include "hyperstation\code\modules\power\reactor\rbmk.dm"
+#include "hyperstation\code\modules\power\reactor\reactor_cargo.dm"
+#include "hyperstation\code\modules\reagents\chemistry\reagents\food_reagents.dm"
+#include "hyperstation\code\modules\reagents\chemistry\reagents\hydroponics_reactions.dm"
+#include "hyperstation\code\modules\resize\resize_action.dm"
+#include "hyperstation\code\modules\resize\resizing.dm"
+#include "hyperstation\code\modules\resize\sizechems.dm"
+#include "hyperstation\code\modules\resize\sizegun.dm"
+#include "hyperstation\code\modules\surgery\organs\augments_arms.dm"
+#include "hyperstation\code\modules\uplink\uplink_items.dm"
+#include "hyperstation\code\obj\ashtray.dm"
+#include "hyperstation\code\obj\bluespace sewing kit.dm"
+#include "hyperstation\code\obj\condom.dm"
+#include "hyperstation\code\obj\decal.dm"
+#include "hyperstation\code\obj\economy.dm"
+#include "hyperstation\code\obj\fleshlight.dm"
+#include "hyperstation\code\obj\fluff.dm"
+#include "hyperstation\code\obj\kinkyclothes.dm"
+#include "hyperstation\code\obj\leash.dm"
+#include "hyperstation\code\obj\lunaritems.dm"
+#include "hyperstation\code\obj\milking machine.dm"
+#include "hyperstation\code\obj\plushes.dm"
+#include "hyperstation\code\obj\pole.dm"
+#include "hyperstation\code\obj\pregnancytester.dm"
+#include "hyperstation\code\obj\rewards.dm"
+#include "hyperstation\code\obj\rope.dm"
+#include "hyperstation\code\obj\sizeitems.dm"
+#include "hyperstation\code\obj\sounding.dm"
+#include "hyperstation\code\obj\vibrator.dm"
+#include "interface\interface.dm"
+#include "interface\menu.dm"
+#include "interface\stylesheet.dm"
+#include "modular_citadel\code\init.dm"
+#include "modular_citadel\code\__HELPERS\list2list.dm"
+#include "modular_citadel\code\__HELPERS\lists.dm"
+#include "modular_citadel\code\__HELPERS\mobs.dm"
+#include "modular_citadel\code\_globalvars\lists\mobs.dm"
+#include "modular_citadel\code\_onclick\click.dm"
+#include "modular_citadel\code\_onclick\item_attack.dm"
+#include "modular_citadel\code\_onclick\other_mobs.dm"
+#include "modular_citadel\code\_onclick\hud\screen_objects.dm"
+#include "modular_citadel\code\_onclick\hud\sprint.dm"
+#include "modular_citadel\code\_onclick\hud\stamina.dm"
+#include "modular_citadel\code\controllers\configuration\entries\general.dm"
+#include "modular_citadel\code\controllers\subsystem\job.dm"
+#include "modular_citadel\code\datums\components\material_container.dm"
+#include "modular_citadel\code\datums\components\phantomthief.dm"
+#include "modular_citadel\code\datums\components\souldeath.dm"
+#include "modular_citadel\code\datums\mood_events\chem_events.dm"
+#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm"
+#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm"
+#include "modular_citadel\code\datums\mood_events\moodular.dm"
+#include "modular_citadel\code\datums\mutations\hulk.dm"
+#include "modular_citadel\code\datums\status_effects\chems.dm"
+#include "modular_citadel\code\datums\status_effects\debuffs.dm"
+#include "modular_citadel\code\datums\traits\negative.dm"
+#include "modular_citadel\code\datums\traits\neutral.dm"
+#include "modular_citadel\code\datums\wires\airlock.dm"
+#include "modular_citadel\code\datums\wires\autoylathe.dm"
+#include "modular_citadel\code\game\area\cit_areas.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\dominator.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\dominator_countdown.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gang.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gang_datums.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gang_decals.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gang_hud.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gang_items.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gang_pen.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gangs.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\gangtool.dm"
+#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm"
+#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
+#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm"
+#include "modular_citadel\code\game\machinery\cryopod.dm"
+#include "modular_citadel\code\game\machinery\displaycases.dm"
+#include "modular_citadel\code\game\machinery\Sleeper.dm"
+#include "modular_citadel\code\game\machinery\toylathe.dm"
+#include "modular_citadel\code\game\machinery\vending.dm"
+#include "modular_citadel\code\game\machinery\wishgranter.dm"
+#include "modular_citadel\code\game\machinery\doors\airlock.dm"
+#include "modular_citadel\code\game\machinery\doors\airlock_types.dm"
+#include "modular_citadel\code\game\objects\cit_screenshake.dm"
+#include "modular_citadel\code\game\objects\items.dm"
+#include "modular_citadel\code\game\objects\tools.dm"
+#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm"
+#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm"
+#include "modular_citadel\code\game\objects\items\balls.dm"
+#include "modular_citadel\code\game\objects\items\boombox.dm"
+#include "modular_citadel\code\game\objects\items\holy_weapons.dm"
+#include "modular_citadel\code\game\objects\items\honk.dm"
+#include "modular_citadel\code\game\objects\items\stunsword.dm"
+#include "modular_citadel\code\game\objects\items\vending_items.dm"
+#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm"
+#include "modular_citadel\code\game\objects\items\devices\aicard.dm"
+#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm"
+#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm"
+#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm"
+#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm"
+#include "modular_citadel\code\game\objects\items\melee\misc.dm"
+#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm"
+#include "modular_citadel\code\game\objects\items\storage\firstaid.dm"
+#include "modular_citadel\code\game\objects\structures\tables_racks.dm"
+#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm"
+#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm"
+#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm"
+#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm"
+#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm"
+#include "modular_citadel\code\game\turfs\cit_turfs.dm"
+#include "modular_citadel\code\modules\admin\chat_commands.dm"
+#include "modular_citadel\code\modules\admin\holder2.dm"
+#include "modular_citadel\code\modules\admin\secrets.dm"
+#include "modular_citadel\code\modules\arousal\arousal.dm"
+#include "modular_citadel\code\modules\arousal\organs\belly.dm"
+#include "modular_citadel\code\modules\arousal\organs\breasts.dm"
+#include "modular_citadel\code\modules\arousal\organs\eggsack.dm"
+#include "modular_citadel\code\modules\arousal\organs\genitals.dm"
+#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm"
+#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm"
+#include "modular_citadel\code\modules\arousal\organs\penis.dm"
+#include "modular_citadel\code\modules\arousal\organs\testicles.dm"
+#include "modular_citadel\code\modules\arousal\organs\vagina.dm"
+#include "modular_citadel\code\modules\arousal\organs\womb.dm"
+#include "modular_citadel\code\modules\arousal\toys\dildos.dm"
+#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm"
+#include "modular_citadel\code\modules\cargo\console.dm"
+#include "modular_citadel\code\modules\client\client_defines.dm"
+#include "modular_citadel\code\modules\client\client_procs.dm"
+#include "modular_citadel\code\modules\client\preferences.dm"
+#include "modular_citadel\code\modules\client\preferences_savefile.dm"
+#include "modular_citadel\code\modules\client\preferences_toggles.dm"
+#include "modular_citadel\code\modules\client\loadout\__donator.dm"
+#include "modular_citadel\code\modules\client\loadout\_medical.dm"
+#include "modular_citadel\code\modules\client\loadout\_security.dm"
+#include "modular_citadel\code\modules\client\loadout\_service.dm"
+#include "modular_citadel\code\modules\client\loadout\backpack.dm"
+#include "modular_citadel\code\modules\client\loadout\glasses.dm"
+#include "modular_citadel\code\modules\client\loadout\gloves.dm"
+#include "modular_citadel\code\modules\client\loadout\hands.dm"
+#include "modular_citadel\code\modules\client\loadout\head.dm"
+#include "modular_citadel\code\modules\client\loadout\loadout.dm"
+#include "modular_citadel\code\modules\client\loadout\mask.dm"
+#include "modular_citadel\code\modules\client\loadout\neck.dm"
+#include "modular_citadel\code\modules\client\loadout\shoes.dm"
+#include "modular_citadel\code\modules\client\loadout\suit.dm"
+#include "modular_citadel\code\modules\client\loadout\uniform.dm"
+#include "modular_citadel\code\modules\client\verbs\who.dm"
+#include "modular_citadel\code\modules\clothing\clothing.dm"
+#include "modular_citadel\code\modules\clothing\neck.dm"
+#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm"
+#include "modular_citadel\code\modules\clothing\head\head.dm"
+#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm"
+#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm"
+#include "modular_citadel\code\modules\clothing\suits\polychromic_suit.dm"
+#include "modular_citadel\code\modules\clothing\suits\suits.dm"
+#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm"
+#include "modular_citadel\code\modules\clothing\under\trek_under.dm"
+#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
+#include "modular_citadel\code\modules\clothing\under\under.dm"
+#include "modular_citadel\code\modules\crafting\recipes.dm"
+#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
+#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
+#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
+#include "modular_citadel\code\modules\events\blob.dm"
+#include "modular_citadel\code\modules\events\wizard\magicarp.dm"
+#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm"
+#include "modular_citadel\code\modules\mentor\follow.dm"
+#include "modular_citadel\code\modules\mentor\mentor.dm"
+#include "modular_citadel\code\modules\mentor\mentor_memo.dm"
+#include "modular_citadel\code\modules\mentor\mentor_verbs.dm"
+#include "modular_citadel\code\modules\mentor\mentorhelp.dm"
+#include "modular_citadel\code\modules\mentor\mentorpm.dm"
+#include "modular_citadel\code\modules\mentor\mentorsay.dm"
+#include "modular_citadel\code\modules\mining\mining_ruins.dm"
+#include "modular_citadel\code\modules\mob\cit_emotes.dm"
+#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm"
+#include "modular_citadel\code\modules\mob\living\damage_procs.dm"
+#include "modular_citadel\code\modules\mob\living\living.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\life.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm"
+#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm"
+#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm"
+#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm"
+#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm"
+#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm"
+#include "modular_citadel\code\modules\power\lighting.dm"
+#include "modular_citadel\code\modules\projectiles\gun.dm"
+#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm"
+#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm"
+#include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
+#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm"
+#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm"
+#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm"
+#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm"
+#include "modular_citadel\code\modules\projectiles\guns\toys.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm"
+#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm"
+#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm"
+#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm"
+#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm"
+#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm"
+#include "modular_citadel\code\modules\reagents\objects\clothes.dm"
+#include "modular_citadel\code\modules\reagents\objects\items.dm"
+#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm"
+#include "modular_citadel\code\modules\recycling\disposal\bin.dm"
+#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm"
+#include "modular_citadel\code\modules\research\designs\machine_designs.dm"
+#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm"
+#include "modular_citadel\code\modules\research\techweb\_techweb.dm"
+#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm"
+#include "modular_citadel\code\modules\vehicles\secway.dm"
+#include "modular_citadel\code\modules\vore\hook-defs_vr.dm"
+#include "modular_citadel\code\modules\vore\persistence.dm"
+#include "modular_citadel\code\modules\vore\trycatch_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\living_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\vore_vr.dm"
+#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
+#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
+#include "modular_citadel\interface\skin.dmf"
+#include "yogstation\code\modules\power\energyharvester.dm"
+// END_INCLUDE