diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a5befac1a0d..2bfe397cedb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -90,7 +90,7 @@ # Persistence, Fabian's area **/persistence @Arrow768 @NonQueueingMatt @FabianK3 -/code/__DEFINES/persistence.dm @Arrow768 @NonQueueingMatt @FabianK3 +/code/__DEFINES/persistence/ @Arrow768 @NonQueueingMatt @FabianK3 /code/__HELPERS/logging/subsystems/persistence.dm @Arrow768 @NonQueueingMatt @FabianK3 /code/controllers/subsystems/persistence/ @Arrow768 @NonQueueingMatt @FabianK3 diff --git a/.github/workflows/byond.yml b/.github/workflows/byond.yml index 1e89d02d09a..4e9dae0b8b2 100644 --- a/.github/workflows/byond.yml +++ b/.github/workflows/byond.yml @@ -343,6 +343,45 @@ jobs: tools/bootstrap/python -m mapmerge2.dmm_test tools/bootstrap/python -m tools.maplint.source + ################################################## + ############### Forbidden map types ############## + ################################################## + lint-forbidden-map-types: + name: Lint Forbidden map types + runs-on: ubuntu-24.04 + needs: validate-structure + if: needs.validate-structure.outputs.skipci != 'true' + + concurrency: + group: lint-forbidden-map-types-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + + steps: + #Checkout the repository + - name: Checkout repository + uses: actions/checkout@v4 + + #Initialize the environment variables + - name: Set ENV variables + run: bash dependencies.sh + + #Restores python cache + - name: Restore Python Cache + uses: actions/setup-python@v4 + with: + python-version: ${{ env.PYTHON_VERSION }} + cache: "pip" + + #Install python packages and tools + - name: Install Python Packages + run: | + pip install -r tools/requirements.txt + pip3 install setuptools + + - name: Check forbidden map types + run: | + tools/bootstrap/python tools/findForbiddenMapTypes.py + ########################################### ############## GENERIC TESTS ############## ########################################### diff --git a/SQL/migrate-2023/V022__persistence_update.sql b/SQL/migrate-2023/V022__persistence_update.sql new file mode 100644 index 00000000000..053ac7f346c --- /dev/null +++ b/SQL/migrate-2023/V022__persistence_update.sql @@ -0,0 +1,41 @@ +-- PR: https://github.com/Aurorastation/Aurora.3/pull/22114 + +-- Updates to existing objects table +ALTER TABLE `ss13_persistent_objects` MODIFY COLUMN `x` INT NOT NULL; +ALTER TABLE `ss13_persistent_objects` MODIFY COLUMN `y` INT NOT NULL; +ALTER TABLE `ss13_persistent_objects` MODIFY COLUMN `z` INT NOT NULL; +ALTER TABLE `ss13_persistent_objects` MODIFY COLUMN `content` MEDIUMTEXT NULL; + +-- New persistent content types - Generics and records +CREATE TABLE `ss13_persistent_type_definitions` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `type` VARCHAR(128) NOT NULL UNIQUE, + `title` VARCHAR(128) NOT NULL, + `description` VARCHAR(256) NOT NULL, + `definition_type` INT NOT NULL COMMENT '1 = GENERIC, 2 = HISTORY' +); + +CREATE TABLE `ss13_persistent_generics` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `type` INT NOT NULL, + `attribute` VARCHAR(64) NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `expires_at` DATETIME NOT NULL, + `content` MEDIUMTEXT NOT NULL, + CONSTRAINT `fk_generics_type_definition` FOREIGN KEY (`type`) REFERENCES `ss13_persistent_type_definitions` (`id`), + CONSTRAINT `unique_generics_type_attribute` UNIQUE (`type`, `attribute`), + INDEX `idx_generics_attribute` (`attribute`), + INDEX `idx_generics_expires_at` (`expires_at`) +); + +CREATE TABLE `ss13_persistent_history` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `type` INT NOT NULL, + `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `attribute` VARCHAR(64) NULL, + `value` VARCHAR(64) NOT NULL, + `game_id` VARCHAR(30) NOT NULL, + CONSTRAINT `fk_history_type_definition` FOREIGN KEY (`type`) REFERENCES `ss13_persistent_type_definitions` (`id`), + INDEX `idx_history_created_at` (`created_at`), + INDEX `idx_history_attribute` (`attribute`) +); diff --git a/aurorastation.dme b/aurorastation.dme index 6fd3f3d1a04..6ecdd7d4365 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -117,7 +117,6 @@ #include "code\__DEFINES\outfit.dm" #include "code\__DEFINES\overmap.dm" #include "code\__DEFINES\path.dm" -#include "code\__DEFINES\persistence.dm" #include "code\__DEFINES\pipes.dm" #include "code\__DEFINES\prefs.dm" #include "code\__DEFINES\procpath.dm" @@ -201,6 +200,10 @@ #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" #include "code\__DEFINES\dcs\signals\signals_object\signals_object.dm" +#include "code\__DEFINES\persistence\cleanup.dm" +#include "code\__DEFINES\persistence\models.dm" +#include "code\__DEFINES\persistence\type_defines.dm" +#include "code\__DEFINES\persistence\types.dm" #include "code\__HELPERS\_global_objects.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\area_movement.dm" @@ -444,6 +447,12 @@ #include "code\controllers\subsystems\persistence\persistence_objects.dm" #include "code\controllers\subsystems\persistence\persistence_objects_public.dm" #include "code\controllers\subsystems\persistence\persistence_objects_sql.dm" +#include "code\controllers\subsystems\persistence\persistence_types.dm" +#include "code\controllers\subsystems\persistence\persistence_types_generic_public.dm" +#include "code\controllers\subsystems\persistence\persistence_types_generic_sql.dm" +#include "code\controllers\subsystems\persistence\persistence_types_history_public.dm" +#include "code\controllers\subsystems\persistence\persistence_types_history_sql.dm" +#include "code\controllers\subsystems\persistence\persistence_types_sql.dm" #include "code\controllers\subsystems\processing\airflow.dm" #include "code\controllers\subsystems\processing\calamity.dm" #include "code\controllers\subsystems\processing\disease.dm" diff --git a/code/__DEFINES/global.dm b/code/__DEFINES/global.dm index 27ca7f43381..c5438cf8bb7 100644 --- a/code/__DEFINES/global.dm +++ b/code/__DEFINES/global.dm @@ -109,10 +109,6 @@ GLOBAL_VAR(custom_event_msg) GLOBAL_DATUM(dbcon, /DBConnection) GLOBAL_PROTECT(dbcon) -// Persistence subsystem object track register - List of all persistent objects tracked by the subsystem. -GLOBAL_LIST_EMPTY(persistence_object_track_register) -GLOBAL_PROTECT(persistence_object_track_register) - // Added for Xenoarchaeology, might be useful for other stuff. GLOBAL_LIST_INIT(alphabet_uppercase, list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")) diff --git a/code/__DEFINES/persistence.dm b/code/__DEFINES/persistence.dm deleted file mode 100644 index 90d6ea9eb3f..00000000000 --- a/code/__DEFINES/persistence.dm +++ /dev/null @@ -1,6 +0,0 @@ -/*############################################# - Constants for the persistence subsystem -#############################################*/ - -#define PERSISTENT_DEFAULT_EXPIRATION_DAYS 30 // Default expire timespan for newly created persistent objects -#define PERSISTENT_EXPIRATION_CLEANUP_DELAY_DAYS 30 // Grace period for expired database entries before they get cleaned up. diff --git a/code/__DEFINES/persistence/cleanup.dm b/code/__DEFINES/persistence/cleanup.dm new file mode 100644 index 00000000000..84a3a0b607d --- /dev/null +++ b/code/__DEFINES/persistence/cleanup.dm @@ -0,0 +1,58 @@ +/*#################################################### + Defines for cleanups and expirations +####################################################*/ + +#define PERSISTENT_DEFAULT_EXPIRATION_DAYS 30 // Default expire timespan for newly created persistent content +#define PERSISTENT_EXPIRATION_CLEANUP_DELAY_DAYS 30 // Grace period for expired database entries before they get cleaned up, objects only + +// ##### Persistent type "history" expiration rules +// Rules are applied on the combination type+attribute +// See type definition macros on their usage +// Abstract marked types are used for type catching in code and not to be used in type definitions + +ABSTRACT_TYPE(/singleton/persistent_type_history_expiration_rule) + +// Keep last X rows - This rule removes all records exceeding the newest X records by count +ABSTRACT_TYPE(/singleton/persistent_type_history_expiration_rule/row_count) + var/max_row_count = 0 + +/singleton/persistent_type_history_expiration_rule/row_count/ten + max_row_count = 10 + +/singleton/persistent_type_history_expiration_rule/row_count/hundred + max_row_count = 100 + +/singleton/persistent_type_history_expiration_rule/row_count/thousand + max_row_count = 1000 + +// Keep records for X rounds - This rule removes all records that don't belong to the last X finished rounds +ABSTRACT_TYPE(/singleton/persistent_type_history_expiration_rule/round_count) + var/max_round_count = 0 + +/singleton/persistent_type_history_expiration_rule/round_count/ten + max_round_count = 10 + +/singleton/persistent_type_history_expiration_rule/round_count/fifty + max_round_count = 50 + +/singleton/persistent_type_history_expiration_rule/round_count/hundred + max_round_count = 100 + +// Keep records for X days - This rule removes all records that are older then X days since their creation +ABSTRACT_TYPE(/singleton/persistent_type_history_expiration_rule/age) + var/max_age_days = 0 + +/singleton/persistent_type_history_expiration_rule/age/default + max_age_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS + +/singleton/persistent_type_history_expiration_rule/age/week + max_age_days = 7 + +/singleton/persistent_type_history_expiration_rule/age/quarter_year + max_age_days = 90 + +/singleton/persistent_type_history_expiration_rule/age/half_year + max_age_days = 180 + +/singleton/persistent_type_history_expiration_rule/age/year + max_age_days = 365 diff --git a/code/__DEFINES/persistence/models.dm b/code/__DEFINES/persistence/models.dm new file mode 100644 index 00000000000..b30bafe521b --- /dev/null +++ b/code/__DEFINES/persistence/models.dm @@ -0,0 +1,22 @@ +/*################################################### + Subsystem cache structures +###################################################*/ + +// Data transfer objects - Used by the subsystem for aggregation and result returns, these should be treated as read-only when handed by the subsystem + +/datum/persistent_record_container // Container for combining records of type(+attribute) + var/singleton/persistent_type/history/type_define = null // Definition type + var/attribute = null // Attribute for aggregation records into type+attribute groups + var/list/datum/persistent_record/records = list() // Container contents + +/datum/persistent_record // Single persistent record + var/id = 0 // Database ID - Might be a non-existend (virtual) ID if the record hasn't been saved yet + var/created_at = "" // Timestamp when the record was saved + var/game_id = "" // Game Id when the record was saved + var/value = null // Treat this as string value + +/datum/persistent_generic // Persistent generic data holder + var/singleton/persistent_type/history/type_define = null // Definition type + var/attribute = null // Attribute for aggregation into type+attribute + var/content = null // Treat this as a string - Open for implementing caller (e.g. raw string or json) + var/expires_in_days = PERSISTENT_EXPIRATION_CLEANUP_DELAY_DAYS // Expiration timespan used when generic is saved diff --git a/code/__DEFINES/persistence/type_defines.dm b/code/__DEFINES/persistence/type_defines.dm new file mode 100644 index 00000000000..fa3ef0609a0 --- /dev/null +++ b/code/__DEFINES/persistence/type_defines.dm @@ -0,0 +1,78 @@ +/*################################################### + Base types and macros for type definitions +###################################################*/ + +// ##### Base type definitions + +// Persistent type definition found in database +ABSTRACT_TYPE(/singleton/persistent_type) + var/database_id = 0 // Set during subsystem init - DO NOT MODIFY + var/definition_type_value = 0 // DO NOT MODIFY - DATABASE CONSTANT + var/title = "" + var/description = "" + var/requires_attribute = FALSE // Whether or not this type requires/has an attribute, relevant for subsystem when saving or pulling type data - Should not be changed after release for the given type + +// Hard coded in "ss13_persistent_type_definitions.definition_type", DO NOT MODIFY - DATABASE CONSTANTS +#define PERSISTENCE_INTERNAL_TYPE_DEFINE_TYPE_VALUE_GENERIC 1 +#define PERSISTENCE_INTERNAL_TYPE_DEFINE_TYPE_VALUE_HISTORY 2 + +/** + * Hook proc that is called by the subsystem starting finalization on each persistent type definition. + * Hooks are used for implementing finalization logic for mechanics that either + * don't have a single trigger to save or where repetitive saving would be too costly. + * Should return nothing, returned values are discarded. + * Implementation can be put where applicable, e.g. next to loading logic of the type. + */ +/singleton/persistent_type/proc/finalization_hook() + SHOULD_CALL_PARENT(FALSE) + return + +ABSTRACT_TYPE(/singleton/persistent_type/generic) // Base type for "persistent generics" + definition_type_value = PERSISTENCE_INTERNAL_TYPE_DEFINE_TYPE_VALUE_GENERIC // DO NOT MODIFY - DATABASE CONSTANT + +ABSTRACT_TYPE(/singleton/persistent_type/history) // Base type for "persistent history" + definition_type_value = PERSISTENCE_INTERNAL_TYPE_DEFINE_TYPE_VALUE_HISTORY // DO NOT MODIFY - DATABASE CONSTANT + var/singleton/persistent_type_history_expiration_rule/expiration_rule = null + +ABSTRACT_TYPE(/singleton/persistent_type/history/character) // Base type with extended validation for persistent history in relation to characters + // Empty stub + +// ##### Macros for new custom type definitions +// - TYPE_NAME = Name of the type definition, used to upsert into database, cannot be updated - Changes result in a new type definition in the DB +// - TITLE = Title of the type definition, used for display purposes +// - DESCRIPTION = Description of the type definition, used for display purposes +// - REQUIRES_ATTRIBUTE = Boolean, whether this type definition requires an attribute to be specified +// - EXPIRATION_RULE = For history type definitions, the expiration rule to apply to records of this type. +// See /singleton/persistent_type_history_expiration_rule and subtypes for available rules. + +// Persistent generic +// CREATE_PERSISTENT_TYPE_GENERIC(my_type_name, "My custom type", "This type is a test and has no purpose", TRUE) +#define CREATE_PERSISTENT_TYPE_GENERIC(TYPE_NAME, TITLE, DESCRIPTION, REQUIRES_ATTRIBUTE) \ + /singleton/persistent_type/generic/##TYPE_NAME \ + { \ + title = #TITLE; \ + description = #DESCRIPTION; \ + requires_attribute = ##REQUIRES_ATTRIBUTE; \ + } + +// Persistent history +// CREATE_PERSISTENT_TYPE_HISTORY(my_type_name, "My custom type", "This type is a test and has no purpose", TRUE, /singleton/persistent_type_history_expiration_rule/age/default) +#define CREATE_PERSISTENT_TYPE_HISTORY(TYPE_NAME, TITLE, DESCRIPTION, REQUIRES_ATTRIBUTE, EXPIRATION_RULE) \ + /singleton/persistent_type/history/##TYPE_NAME \ + { \ + title = #TITLE; \ + description = #DESCRIPTION; \ + requires_attribute = ##REQUIRES_ATTRIBUTE; \ + expiration_rule = ##EXPIRATION_RULE; \ + } + +// Persistent history with extended validation on character relation - Attribute automatically required compared to parent persistent history type definition +// CREATE_PERSISTENT_TYPE_HISTORY_CHARACTER(my_type_name, "My custom type", "This type is a test and has no purpose", /singleton/persistent_type_history_expiration_rule/age/default) +#define CREATE_PERSISTENT_TYPE_HISTORY_CHARACTER(TYPE_NAME, TITLE, DESCRIPTION, EXPIRATION_RULE) \ + /singleton/persistent_type/history/character/##TYPE_NAME \ + { \ + title = #TITLE; \ + description = #DESCRIPTION; \ + requires_attribute = TRUE; \ + expiration_rule = ##EXPIRATION_RULE; \ + } diff --git a/code/__DEFINES/persistence/types.dm b/code/__DEFINES/persistence/types.dm new file mode 100644 index 00000000000..ac07943c4f0 --- /dev/null +++ b/code/__DEFINES/persistence/types.dm @@ -0,0 +1,27 @@ +/*################################################### + Type definitions +###################################################*/ + +// Type definitions using macros - This file contains all types getting made accessible in code and later in database during first subsystem run +// See macros for detailed information on parameters and the underlaying types +// Generally, after being released (as in, run against the database once), these should NOT be modified if possible, explicit warnings: + +// +------------------------------------------------------------------------------------------------------------------+ +// | MODIFYING THE TYPE NAME OF EXISTING DEFINES WILL CREATE A NEW TYPE DEFINITION IN THE DATABASE | +// +------------------------------------------------------------------------------------------------------------------+ +// | MODIFYING THE ATTRIBUTE FLAG OF EXISTING DEFINES CAN HAVE BREAKING CONSEQUENCES, TESTING REQUIRED BEFORE RELEASE | +// +------------------------------------------------------------------------------------------------------------------+ + +// Below are the defines for generics, history and history with character validation + +// ##### Persistent generics + +CREATE_PERSISTENT_TYPE_GENERIC(horizon_overmap_position, "SCCV Horizon sector position", "Position of the SCCV Horizon on the overmap.", FALSE) + +// ##### Persistent history + + + +// ##### Persistent history with character validation + +CREATE_PERSISTENT_TYPE_HISTORY_CHARACTER(mining_points, "Mining yield history", "History of mining points yield of individual miners.", /singleton/persistent_type_history_expiration_rule/age/week) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 892b5de30c7..3de3048a149 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -426,18 +426,24 @@ /** * List of lists, sorts by element[key] - for things like crew monitoring computer sorting records by name. */ -/proc/sortByKey(var/list/L, var/key) +/proc/sortByKeyText(var/list/L, var/key) if(L.len < 2) return L var/middle = L.len / 2 + 1 - return mergeKeyedLists(sortByKey(L.Copy(0, middle), key), sortByKey(L.Copy(middle), key), key) + return mergeKeyedLists(sortByKeyText(L.Copy(0, middle), key), sortByKeyText(L.Copy(middle), key), key) -/proc/mergeKeyedLists(var/list/L, var/list/R, var/key) +/proc/sortByKeyNumber(var/list/L, var/key) + if(L.len < 2) + return L + var/middle = L.len / 2 + 1 + return mergeKeyedLists(sortByKeyText(L.Copy(0, middle), key), sortByKeyText(L.Copy(middle), key), key, value_is_number = TRUE) + +/proc/mergeKeyedLists(var/list/L, var/list/R, var/key, var/value_is_number = FALSE) var/Li=1 var/Ri=1 var/list/result = new() while(Li <= L.len && Ri <= R.len) - if(sorttext(L[Li][key], R[Ri][key]) < 1) + if((value_is_number && L[Li][key] < R[Ri][key]) || (!value_is_number && sorttext(L[Li][key], R[Ri][key]) < 1)) // Works around list += list2 merging lists; it's not pretty but it works. result += "temp item" result[result.len] = R[Ri++] diff --git a/code/__HELPERS/logging/subsystems/persistence.dm b/code/__HELPERS/logging/subsystems/persistence.dm index cdb00b43133..d0f1eaa38b7 100644 --- a/code/__HELPERS/logging/subsystems/persistence.dm +++ b/code/__HELPERS/logging/subsystems/persistence.dm @@ -12,8 +12,18 @@ /proc/log_subsystem_persistence_warning(text) log_subsystem_persistence("WARNING: [text]") -/proc/log_subsystem_persistence_error(text) - log_subsystem_persistence("ERROR: [text]") +/proc/log_subsystem_persistence_error(text, exception/e = null) + if(e) + log_subsystem_persistence("ERROR: [text] - [e]") + if(SSsentry) + SSsentry.capture_exception(e) + else + log_subsystem_persistence("ERROR: [text]") -/proc/log_subsystem_persistence_panic(text) - log_subsystem_persistence("PANIC: [text]") +/proc/log_subsystem_persistence_panic(text, exception/e = null) + if(e) + log_subsystem_persistence("PANIC: [text] - [e]") + if(SSsentry) + SSsentry.capture_exception(e) + else + log_subsystem_persistence("PANIC: [text]") diff --git a/code/controllers/subsystems/persistence/persistence.dm b/code/controllers/subsystems/persistence/persistence.dm index 0a364309a92..bc4ed83c391 100644 --- a/code/controllers/subsystems/persistence/persistence.dm +++ b/code/controllers/subsystems/persistence/persistence.dm @@ -2,24 +2,43 @@ * Persistence subsystem * Subsytem for managing any form of persistent content across rounds. * - * This subsystem consists of multiple partial files, following the structure: - * - persistence.dm - Subsystem definition and generic code. - * - persistence_objects.dm - Persistent objects related code. - * - persistence_objects_sql.dm - Persistent objects database code. - * - persistence_objects_public.dm - Persistent objects public procs. + * This subsystem consists of multiple partial files, split into different responsibilities: + * persistence.dm - Subsystem define and related code + * Objects and types (with Generics and History respectively), each containing: + * Base file (no suffix), public procs (_public.dm suffix), SQL code (_sql.dm suffix) */ SUBSYSTEM_DEF(persistence) name = "Persistence" init_order = INIT_ORDER_PERSISTENCE // The order is tied with the init and maploading subsystem. flags = SS_NO_FIRE // This subsystem has no continues workload, it's init and shutdown only. - var/prevent_saving = FALSE // Toggle to prevent saving at round end, changed by toggle_persistence proc, used for admin purposes. + /// Sanity check to confirm init was a success before finalizing. + var/init_success = FALSE + /// Global toggle to prevent saving at round end, changed by toggle_persistence proc, used for admin purposes. + var/prevent_saving = FALSE + /// In-memory register of all persistent objects that were loaded or created during the round, used for tracking and finalization purposes. + var/object_track_register = list() + /// Dictionary<"[type](+[attribute])" cache of persistent history records. + var/history_cache = alist() + /// Manual record counter of cache containers. + var/history_cache_count = 0 + /// ID of last found history record. + /// Higher found IDs mean the record is not yet found in the database, lower or equal found ID means the are record that are already in the database. + /// Used during history_virtual_id init and read-through cache hits. + var/history_last_database_id = 0 + /// ID used for instanciating new history records during the round, used for cache tracking. + /// Their database ID will be set during insert/finalization. + var/history_virtual_id = 0 + /// Dictionary cache of Character name by ID for history/character helper. + var/char_cache = alist() + /// Dictionary<"[type](+[attribute])", container> cache of persistent generics. + var/generic_cache = alist() /** * Subsystem info stub message generation. */ /datum/controller/subsystem/persistence/stat_entry(msg) - msg = ("Register: [length(GLOB.persistence_object_track_register)] | Prevent saving: [SSpersistence.prevent_saving ? "TRUE" : "FALSE"]") + msg = ("[init_success ? "" : "INIT FAILED!!!|"][prevent_saving ? "SAVING DISABLED!|" : ""]Objects:[length(object_track_register)]|Containers:[length(history_cache)];Records:[history_cache_count]|Generics:[length(generic_cache)]") return msg /** @@ -77,7 +96,7 @@ SUBSYSTEM_DEF(persistence) else return - feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb","TPS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /** * Initialization of the persistence subsystem. @@ -90,14 +109,22 @@ SUBSYSTEM_DEF(persistence) return SS_INIT_SUCCESS if(!databaseCheckConnection("subsystem init")) + log_subsystem_persistence_error("SQL connection unavailable. Init not possible.") return SS_INIT_FAILURE try objectsInitialize() - catch(var/exception/e) - log_subsystem_persistence_panic("Unhandled exception during persistent objects initialization: [e]") + catch(var/exception/e_objects) + log_subsystem_persistence_panic("Unhandled exception during persistent objects initialization!", e_objects) return SS_INIT_FAILURE + try + typesInitialize() + catch(var/exception/e_types) + log_subsystem_persistence_panic("Unhandled exception during persistent type initialization!", e_types) + return SS_INIT_FAILURE + + init_success = TRUE return SS_INIT_SUCCESS /** @@ -105,6 +132,10 @@ SUBSYSTEM_DEF(persistence) * The shutdown consists of finalization steps for each persistent data type. */ /datum/controller/subsystem/persistence/Shutdown() + if(!init_success) + log_subsystem_persistence_panic("Init success flag is FALSE. Something went wrong during subsystem init! Aborting finalization to prevent corrupt data!") + return + if(prevent_saving) log_subsystem_persistence_warning("Persistence subsystem was toggled to not save. Skipping subsystem finalization.") return @@ -115,6 +146,10 @@ SUBSYSTEM_DEF(persistence) try objectsFinalize() - catch(var/exception/e) - log_subsystem_persistence_panic("Unhandled exception during persistent objects finalization: [e]") - return + catch(var/exception/e_objects) + log_subsystem_persistence_panic("Unhandled exception during persistent objects finalization!", e_objects) + + try + typesFinalize() + catch(var/exception/e_types) + log_subsystem_persistence_panic("Unhandled exception during persistent types finalization!", e_types) diff --git a/code/controllers/subsystems/persistence/persistence_objects.dm b/code/controllers/subsystems/persistence/persistence_objects.dm index 0d15671375f..490ec81d4a3 100644 --- a/code/controllers/subsystems/persistence/persistence_objects.dm +++ b/code/controllers/subsystems/persistence/persistence_objects.dm @@ -4,7 +4,7 @@ */ /datum/controller/subsystem/persistence/proc/objectsInitialize() PRIVATE_PROC(TRUE) - GLOB.persistence_object_track_register = list() + object_track_register = list() if(SSatlas.current_map.path != "sccv_horizon") // The persistence system only supports objects from the main map levels for multiple reasons, e.g. Z level value, mapping support log_subsystem_persistence_info("Persistent objects: Current map did not match SCCV Horizon, skipping persistent object initialization.") @@ -42,8 +42,8 @@ if(SSatlas.current_map.path != "sccv_horizon") // The persistence system only supports objects from the main map levels for multiple reasons, e.g. Z level value, mapping support log_subsystem_persistence_info("Persistent objects: Current map did not match SCCV Horizon, skipping persistent object finalization.") - if(length(GLOB.persistence_object_track_register) > 0) - log_subsystem_persistence_warning("Persistent objects: There are [length(GLOB.persistence_object_track_register)] tracked objects at finalization, while the map is not supported! These track will not be saved! Verify that SSatlas.current_map.path has not changed during the round!") + if(length(object_track_register) > 0) + log_subsystem_persistence_warning("Persistent objects: There are [length(object_track_register)] tracked objects at finalization, while the map is not supported! These track will not be saved! Verify that SSatlas.current_map.path has not changed during the round!") return // Subsystem shutdown: @@ -52,7 +52,7 @@ // Delete persistent records that no longer exist in the registry (removed during the round) // Run checks on each track that might prevent further persistence - for (var/obj/track as anything in GLOB.persistence_object_track_register) + for (var/obj/track in object_track_register) CHECK_TICK var/turf/T = get_turf(track) if(!T || !is_station_level(T.z)) // The persistence system only supports objects from the main map levels for multiple reasons, e.g. Z level value, mapping support @@ -65,7 +65,7 @@ // Get already stored data before saving new tracks so we can compare what has been updated or removed during the round. var/list/existing_data = objectsDatabaseGetActiveEntries() - for (var/obj/track as anything in GLOB.persistence_object_track_register) + for (var/obj/track in object_track_register) CHECK_TICK if (track.persistent_objects_track_id == 0) // Tracked object has no ID meaning it is new, create a new persistent record for it @@ -76,7 +76,7 @@ // If we find the track, we need to check if it requires an update instead for (var/record in existing_data) var/found = FALSE - for (var/obj/track as anything in GLOB.persistence_object_track_register) + for (var/obj/track in object_track_register) CHECK_TICK if (record["id"] == track.persistent_objects_track_id) // A track with the same ID has been found in the register, it still exists, check if we need to update it instead @@ -114,7 +114,7 @@ if(length(content)) result = json_encode(content) catch(var/exception/e) - log_subsystem_persistence_error("Error during json serialization for persistent object. Failed to get/encode track content: [e]") + log_subsystem_persistence_error("Error during json serialization or retrieval of content for persistent object. Type: [track.type]", e) return result /** @@ -129,4 +129,4 @@ try track.persistent_objects_apply_content(json_decode(json), x, y, z) catch(var/exception/e) - log_subsystem_persistence_error("Error during json deserialization for persistent object. Failed to apply/decode track content: [e]") + log_subsystem_persistence_error("Error during json deserialization or applying content for persistent object. Type: [track.type]", e) diff --git a/code/controllers/subsystems/persistence/persistence_objects_public.dm b/code/controllers/subsystems/persistence/persistence_objects_public.dm index 9a167cac56e..b91c38712c8 100644 --- a/code/controllers/subsystems/persistence/persistence_objects_public.dm +++ b/code/controllers/subsystems/persistence/persistence_objects_public.dm @@ -11,7 +11,7 @@ new_track.persistent_objects_track_active = TRUE new_track.persistent_objects_author_ckey = ckey - GLOB.persistence_object_track_register += new_track + object_track_register += new_track /** * Removes the given object from the list of tracked objects. At shutdown the tracked object will be remove from the database. @@ -21,4 +21,4 @@ return old_track.persistent_objects_track_active = FALSE - GLOB.persistence_object_track_register -= old_track + object_track_register -= old_track diff --git a/code/controllers/subsystems/persistence/persistence_objects_sql.dm b/code/controllers/subsystems/persistence/persistence_objects_sql.dm index 5152183170f..f1963ec9519 100644 --- a/code/controllers/subsystems/persistence/persistence_objects_sql.dm +++ b/code/controllers/subsystems/persistence/persistence_objects_sql.dm @@ -71,7 +71,7 @@ list( "author_ckey" = track.persistent_objects_author_ckey, "type" = "[track.type]", - "expire_in_days" = track.persistant_objects_expiration_time_days, + "expire_in_days" = track.persistent_objects_expiration_time_days, "content" = objectsGetTrackContent(track), "x" = T.x, "y" = T.y, @@ -99,7 +99,7 @@ "UPDATE ss13_persistent_objects SET author_ckey=:author_ckey, expires_at=DATE_ADD(NOW(), INTERVAL :expire_in_days DAY), content=:content, x=:x, y=:y, z=:z WHERE id = :id", list( "author_ckey" = track.persistent_objects_author_ckey, - "expire_in_days" = track.persistant_objects_expiration_time_days, + "expire_in_days" = track.persistent_objects_expiration_time_days, "content" = objectsGetTrackContent(track), "x" = T.x, "y" = T.y, diff --git a/code/controllers/subsystems/persistence/persistence_types.dm b/code/controllers/subsystems/persistence/persistence_types.dm new file mode 100644 index 00000000000..6957498213a --- /dev/null +++ b/code/controllers/subsystems/persistence/persistence_types.dm @@ -0,0 +1,170 @@ +/** + * Called during subsystem init to upssert persistent type definitions into the database. + */ +/datum/controller/subsystem/persistence/proc/typesInitialize() + PRIVATE_PROC(TRUE) + // Types init: + // Upsert all types found in code into database + // Get type ID of each type found in code by name lookup + // -- Records + // Init history cache + // Run cleanup on history records + // -- Generics + // Init generic cache + // Run cleanup on generics + + // Types upsert + // Base types to exclude + var/base_types = list(/singleton/persistent_type, /singleton/persistent_type/generic, /singleton/persistent_type/history, /singleton/persistent_type/history/character) + var/custom_types = typesof(/singleton/persistent_type) - base_types // These are the types we are actually dealing with + + // Upsert all persistent type definitions found in code + // Whether or not it's new, get its database ID + for (var/C in custom_types) + CHECK_TICK + var/singleton/persistent_type/T = GET_SINGLETON(C) + typesDatabaseUpsertType("[T]", T.title, T.description, T.definition_type_value) + T.database_id = typesDatabaseGetTypeIdByName("[T]") + + // ### Records + + // Init internal history cache + history_last_database_id = historyDatabaseGetLastID() + if(history_last_database_id == 0) + log_subsystem_persistence_warning("Failed to get last ID of persistent type history records from the database during initialization. Either the table is empty or something went wrong.") + history_virtual_id = history_last_database_id + history_cache = list() + + // Clean history records + for(var/type_combination in historyDatabaseGetTypeAttributeCombinations()) // Iterate through each distinct type+attribute combination + CHECK_TICK + var/type_id = type_combination["type_id"] + var/attribute = type_combination["attribute"] + var/singleton/persistent_type/history/found_type + for (var/C in custom_types) + var/singleton/persistent_type/T = GET_SINGLETON(C) + if(istype(T, /singleton/persistent_type/history) && T.database_id == type_id) + found_type = T + if(!found_type) + continue // The type found in the database is no longer available in the codebase + + // Clean by the individual cleanup rule + if(ispath(found_type.expiration_rule, /singleton/persistent_type_history_expiration_rule/row_count)) // row_count + var/singleton/persistent_type_history_expiration_rule/row_count/rule = GET_SINGLETON(found_type.expiration_rule) + historyDatabaseCleanByRowCount(found_type.database_id, attribute, rule.max_row_count) + + if(ispath(found_type.expiration_rule, /singleton/persistent_type_history_expiration_rule/round_count)) // round_count + var/singleton/persistent_type_history_expiration_rule/round_count/rule = GET_SINGLETON(found_type.expiration_rule) + historyDatabaseCleanByRoundCount(found_type.database_id, attribute, rule.max_round_count) + + if(ispath(found_type.expiration_rule, /singleton/persistent_type_history_expiration_rule/age)) // age + var/singleton/persistent_type_history_expiration_rule/age/rule = GET_SINGLETON(found_type.expiration_rule) + historyDatabaseCleanByMaxAgeDays(found_type.database_id, attribute, rule.max_age_days) + + // ### Generics + + // Init internal generic cache + generic_cache = alist() + // Cleanup + genericDatabaseCleanup() + + // ### Char lookup + char_cache = alist() + +/** + * Finalize persistent types. + * Adds new persistent generics and history. + */ +/datum/controller/subsystem/persistence/proc/typesFinalize() + PRIVATE_PROC(TRUE) + + // Subsystem shutdown: + // Call finalization hook for each known persistent_type + // Save all history records in cache to database which have an ID higher then last known database ID - Records created during the round. + // Save all generics in cache to database which have an ID higher then last known database ID - Generics created during the round. + + // ##### Hooks + var/base_types = list(/singleton/persistent_type, /singleton/persistent_type/generic, /singleton/persistent_type/history, /singleton/persistent_type/history/character) + var/custom_types = typesof(/singleton/persistent_type) - base_types // These are the types we are actually dealing with + for (var/C in custom_types) + CHECK_TICK + var/singleton/persistent_type/type_instance = GET_SINGLETON(C) + try + type_instance.finalization_hook() + catch(var/exception/e) + log_subsystem_persistence_error("Unhandled exception during finalization_hook of [type_instance]", e) + + // ##### Saving history + var/total_saved_count = 0 + for(var/key in history_cache) + CHECK_TICK + var/datum/persistent_record_container/container = history_cache[key] // Dictionary<"[type](+[attribute])", container> + if(!length(container.records)) + continue // Container was queried, got no hits and nothing was added. + + var/list/datum/persistent_record/new_records = list() + for(var/datum/persistent_record/record in container.records) + if(record.id > history_last_database_id) // ID assigned by virtual ID is larger then last known database ID, record is new and needs to be saved. + new_records += record + + for(var/datum/persistent_record/record in new_records) + var/singleton/persistent_type/type_instance = GET_SINGLETON(container.type_define) + historyDatabaseInsertRecord(type_instance.database_id, container.attribute, record.value) + total_saved_count++ + + log_subsystem_persistence_info("Saved new [length(total_saved_count)] persistent history records.") + + // ##### Saving generics + for(var/key in generic_cache) + CHECK_TICK + var/datum/persistent_generic/container = generic_cache[key] // Dictionary<"[type](+[attribute])", container> + var/singleton/persistent_type/type_instance = GET_SINGLETON(container.type_define) + genericDatabaseSave(type_instance.database_id, container.attribute, container.expires_in_days, container.content) + + log_subsystem_persistence_info("Saved [length(generic_cache)] persistent generics.") + +/** + * Internal proc for assigning new IDs to history records, these are used for internal cache tracking and will be discard by database IDs at finalization. + */ +/datum/controller/subsystem/persistence/proc/typesGetVirtualRecordID() + PRIVATE_PROC(TRUE) + history_virtual_id += 1 + return history_virtual_id + +/** + * Internal proc for finding the top K records (by ID) in a record container. + * Top K insertion sort selection (Manual leaderboard sort). + * PARAMS: + * k = Number of records to return. + * Container = Container to search in. + * RETURN: + * List of top K records by ID, sorted from highest to lowest. + */ +/datum/controller/subsystem/persistence/proc/typesHistoryCacheSelectTopK(k, datum/persistent_record_container/container) + PRIVATE_PROC(TRUE) + if(length(container.records)) + return list() + + var/list/datum/persistent_record/top = list() + + for(var/datum/persistent_record/r in container.records) + var/insert_pos = 1 + + // Find position for insert when top isn't full yet or when a value in top is smaller then current record to be replaced + while(insert_pos <= top.len && top[insert_pos].id > r.id) + insert_pos++ + + if(top.len < k) // Top isn't full yet, insert without cutting + top.Insert(insert_pos, r) + else if(r.id > top[top.len].id) // Top is full, replace next lowest pos with current record and cut list back to size k + top.Insert(insert_pos, r) + top.Cut(k+1) + + return top + +/datum/controller/subsystem/persistence/proc/typesGetCacheName(var/singleton/persistent_type/target_type, var/attribute) + PRIVATE_PROC(TRUE) + if(attribute && length(attribute) > 0) + return "[target_type]+[attribute]" + else + return "[target_type]" diff --git a/code/controllers/subsystems/persistence/persistence_types_generic_public.dm b/code/controllers/subsystems/persistence/persistence_types_generic_public.dm new file mode 100644 index 00000000000..35184d1422f --- /dev/null +++ b/code/controllers/subsystems/persistence/persistence_types_generic_public.dm @@ -0,0 +1,72 @@ +/** + * Saves or overrides generic content for a type(+attribute) + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type/generic and subtypes. + * content = List of associative values to be saved. ("id" = 123, "value" = "lorem ipsum") + * attribute = Custom attribute of the generic, can be null if the type definition doesn't require it. Defaults to null. + * expires_in_days = Days until the content is deemed expired. Defaults to PERSISTENT_DEFAULT_EXPIRATION_DAYS. + */ +/datum/controller/subsystem/persistence/proc/genericSave(var/singleton/persistent_type/generic/target_type, content, attribute = null, expires_in_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS) + if(!content || !length(content)) + return + + if(!target_type) + log_subsystem_persistence_warning("Attempted to add generic with null target type.") + return + + var/singleton/persistent_type/type_instance = GET_SINGLETON(target_type) + if(type_instance.requires_attribute && !length(attribute)) + log_subsystem_persistence_warning("Attempted to add generic of type [target_type] without required attribute.") + return + + if(!expires_in_days || expires_in_days <= 0) + expires_in_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS + + attribute = length("[attribute]") > 0 ? attribute : null + var/datum/persistent_generic/generic = generic_cache[typesGetCacheName(target_type, attribute)] + if(generic) + generic.content = json_encode(content) + generic.expires_in_days = expires_in_days + return + + var/datum/persistent_generic/new_generic = new /datum/persistent_generic/ + new_generic.type_define = target_type + new_generic.attribute = attribute + new_generic.content = json_encode(content) + new_generic.expires_in_days = expires_in_days + generic_cache[typesGetCacheName(target_type, attribute)] = new_generic + +/** + * Retrieve/Loads generic content of a type(+attribute) + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type/generic and subtypes. + * attribute = Custom attribute of the generic, can be null if the type definition doesn't require it. Defaults to null. + * RETURN: + * /persistent_generic or null if not available. + */ +/datum/controller/subsystem/persistence/proc/genericLoad(var/singleton/persistent_type/generic/target_type, attribute = null) + if(!target_type) + log_subsystem_persistence_warning("Attempted to load generic with null target type.") + return + + var/singleton/persistent_type/type_instance = GET_SINGLETON(target_type) + if(type_instance.requires_attribute && !length(attribute)) + log_subsystem_persistence_warning("Attempted to load generic of type [target_type] without required attribute.") + return + + attribute = length("[attribute]") > 0 ? attribute : null + var/datum/persistent_generic/generic = generic_cache[typesGetCacheName(target_type, attribute)] + if(generic) + return generic + + var/result = genericDatabaseLoad(type_instance.database_id, attribute) + if(!result) + return null + + var/datum/persistent_generic/new_generic = new /datum/persistent_generic/ + new_generic.type_define = target_type + new_generic.attribute = attribute + new_generic.content = json_decode(result["content"]) + new_generic.expires_in_days = 0 + generic_cache[typesGetCacheName(target_type, attribute)] = new_generic + return new_generic diff --git a/code/controllers/subsystems/persistence/persistence_types_generic_sql.dm b/code/controllers/subsystems/persistence/persistence_types_generic_sql.dm new file mode 100644 index 00000000000..73b93079618 --- /dev/null +++ b/code/controllers/subsystems/persistence/persistence_types_generic_sql.dm @@ -0,0 +1,137 @@ +/** + * Get the last ID in the generics table. + * RETURN: + * Last ID or zero. + */ +/datum/controller/subsystem/persistence/proc/genericDatabaseGetLastID() + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("genericDatabaseGetLastID")) + return 0 + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT id FROM ss13_persistent_generics ORDER BY id DESC LIMIT 1" + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "genericDatabaseGetLastID")) + qdel(query) + return 0 + + var/last_id = 0 + if(query.NextRow()) + last_id = query.item[1] + qdel(query) + return last_id + +/** + * Runs a cleanup query on generics that have expired. + */ +/datum/controller/subsystem/persistence/proc/genericDatabaseCleanup() + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("genericDatabaseCleanup")) + return 0 + + var/datum/db_query/query = SSdbcore.NewQuery( + "DELETE FROM ss13_persistent_generics WHERE expires_at < NOW()" + ) + query.Execute() + + databaseCheckQueryResult(query, "genericDatabaseCleanup") + qdel(query) + +/** + * Save a generic persistent type(+attribute). + * PARAMS: + * type_id = Type of ID. + * attribute = Custom attribute of the record, can be null. + * expires_in_days = Number of days until the content expires. + * content = JSON content to be saved. + */ +/datum/controller/subsystem/persistence/proc/genericDatabaseSave(type_id, attribute, expires_in_days, content) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("genericDatabaseSave")) + return 0 + + // Because MariaDB doesn't consider NULL in the attribute to be a violation of the UNIQUE constraint, + // we have to verify if the generic already exists, if the attribute is null. + // If the attribute is null and the generic exists, manually update the row instead of INSERT + ON DUPLICATE KEY. + // Otherwise, with valid unique constraint (not null attributes), we can continue with the regular INSERT + ON DUPLICATE KEY directly. + if(!attribute) + var/datum/db_query/null_attribute_query = SSdbcore.NewQuery( + "SELECT id FROM ss13_persistent_generics WHERE type = :type_id AND attribute IS NULL", + list( + "type_id" = type_id + ) + ) + null_attribute_query.Execute() + + if(!databaseCheckQueryResult(null_attribute_query, "genericDatabaseSaveNullAttributeCheck")) + qdel(null_attribute_query) + return 0 + + var/id = 0 + if(null_attribute_query.NextRow()) + id = null_attribute_query.item[1] + qdel(null_attribute_query) + if(id > 0) // Attribute null and row found - Invalid unique contraint for MariaDB - Update manually. + var/datum/db_query/update_query = SSdbcore.NewQuery( + "UPDATE ss13_persistent_generics SET created_at = NOW(), expires_at = DATE_ADD(NOW(), INTERVAL :expires_in_days DAY), content = :content WHERE id = :id", + list( + "expires_in_days" = expires_in_days, + "content" = content, + "id" = id + ) + ) + update_query.Execute() + + databaseCheckQueryResult(update_query, "genericDatabaseSaveNullAttributeUpdate") + qdel(update_query) + return // Skip regular upcoming query due to the reasons above + + var/datum/db_query/query = SSdbcore.NewQuery( + "INSERT INTO ss13_persistent_generics (type, attribute, created_at, expires_at, content) VALUES (:type_id, :attribute, NOW(), DATE_ADD(NOW(), INTERVAL :expires_in_days DAY), :content) \ + ON DUPLICATE KEY UPDATE created_at = NOW(), expires_at = DATE_ADD(NOW(), INTERVAL :expires_in_days DAY), content = :content", + list( + "type_id" = type_id, + "attribute" = attribute, + "expires_in_days" = expires_in_days, + "content" = content + ) + ) + query.Execute() + + databaseCheckQueryResult(query, "genericDatabaseSave") + qdel(query) + +/** + * Load a generic persistent type(+attribute). + * PARAMS: + * type_id = Type of ID. + * attribute = Custom attribute of the record, can be null. + * RETURN: + * Associative list of keys "id", "content" (JSON). + */ +/datum/controller/subsystem/persistence/proc/genericDatabaseLoad(type_id, attribute) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("genericDatabaseLoad")) + return 0 + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT id, content FROM ss13_persistent_generics \ + WHERE type = :type_id AND attribute <=> :attribute", + list( + "type_id" = type_id, + "attribute" = attribute + ) + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "genericDatabaseLoad")) + qdel(query) + return null + + var/result = null + while(query.NextRow()) + result = list("id" = query.item[1], "content" = query.item[2]) + qdel(query) + return result diff --git a/code/controllers/subsystems/persistence/persistence_types_history_public.dm b/code/controllers/subsystems/persistence/persistence_types_history_public.dm new file mode 100644 index 00000000000..40164071543 --- /dev/null +++ b/code/controllers/subsystems/persistence/persistence_types_history_public.dm @@ -0,0 +1,263 @@ +#define PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT 1000 // Max row count of records allowed to be drawn from database for performance reasons + +/** + * Helper proc for history/character persistent types to retrieve a character name based of it's character ID. + * PARAMS: + * char_id = ID of character. + * RETURN: + * Character name or null if not found. + */ +/datum/controller/subsystem/persistence/proc/historyGetCharnameByID(char_id) + if(!char_id) + return null + + var/char_id_num = text2num(char_id) + if(char_id_num <= 0) + return null + + var/cache_hit = char_cache["[char_id_num]"] + if(cache_hit) + return cache_hit + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT name FROM ss13_characters WHERE id = :char_id", + list("char_id" = char_id_num) + ) + query.Execute() + + var/char_name + while(query.NextRow()) + char_name += query.item[1] + qdel(query) + if(!char_name) + return null + else + char_cache["[char_id_num]"] = char_name + return char_name + +/** + * Add a new record to the history for the given type/attribute. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type/history and subtypes. + * attribute = Custom attribute of the record, can be null if the type definition doesn't require it. + * value = Value of the record, cannot be null or empty. + */ +/datum/controller/subsystem/persistence/proc/historyAddRecord(var/singleton/persistent_type/history/target_type, attribute, value) + if(!target_type) + log_subsystem_persistence_warning("Attempted to add history record with null target type.") + return + + var/singleton/persistent_type/type_instance = GET_SINGLETON(target_type) + if(type_instance.requires_attribute && length(attribute) > 0) + log_subsystem_persistence_warning("Attempted to add history record of type [target_type] without required attribute.") + return + + if(!value) + log_subsystem_persistence_warning("Attempted to add history record of type [target_type] with empty value.") + return + + // Sanity check if a character record is added using this proc directly instead of the overload historyAddCharacterRecord. + if(istype(type_instance, /singleton/persistent_type/history/character) && (length(attribute) > 0 || !isnum(attribute))) + log_subsystem_persistence_warning("Attempted to add character history record of target type [target_type], but the attribute was either empty or failed the isnum check.") + return + + // Add record to cache for DB insert at finalization and quick access + // Check if record container exists, if not, create it + var/datum/persistent_record_container/container = null + attribute = length("[attribute]") > 0 ? attribute : null + container = history_cache[typesGetCacheName(target_type, attribute)] + + if(!container) + container = new /datum/persistent_record_container + container.type_define = target_type.type + container.attribute = attribute + container.records = list() + history_cache[typesGetCacheName(target_type, attribute)] = container + + // Create record and add to container + var/datum/persistent_record/r = new /datum/persistent_record + r.id = typesGetVirtualRecordID() + r.created_at = "[worlddate2text()] [worldtime2text()]" + r.game_id = GLOB.round_id + r.value = value + container.records += r + history_cache_count++ + +/** + * Add a new record that belongs to a specific character to the history for the given type. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type/history/character and subtypes. + * char_id = Character ID that the record should belong to. + * value = Value of the record, cannot be null or empty. + */ +/datum/controller/subsystem/persistence/proc/historyAddCharacterRecord(var/singleton/persistent_type/history/character/target_type, char_id, value) + if(!ispath(target_type, /singleton/persistent_type/history/character)) + log_subsystem_persistence_warning("Attempted to add character history record, but the provided target type didn't match a character persistent type, provided was [target_type]") + return + if(!isnum(char_id)) + log_subsystem_persistence_warning("Attempted to add character history record of type [target_type] but char_id failed the isnum check.") + return + return historyAddRecord(target_type, char_id, value) + +/** + * Queries the last record of a specified type/attribute. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type and subtypes. + * If the type definition is a character record type, the attribute must be a valid character ID or the record will be rejected. + * attribute = Custom attribute of the record, can be null if the type definition doesn't require it. + * RETURN: + * Single /persistent_record or null. + */ +/datum/controller/subsystem/persistence/proc/historyGetLastRecord(var/singleton/persistent_type/history/target_type, attribute) + var/result = historyGetLastRecords(target_type, attribute, 1) + if(length(result) == 0) + return null + else + return result[1] + +/** + * Queries the last X records of a specified type/attribute. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type and subtypes. + * If the type definition is a character record type, the attribute must be a valid character ID or the record will be rejected. + * attribute = Custom attribute of the record, can be null if the type definition doesn't require it. + * limit = Number of records to retrieve. + * skip_caching = If set to TRUE, the results won't be added to the types cache, defaults to FALSE. + * RETURN: + * List of /persistent_record or empty list. + */ +/datum/controller/subsystem/persistence/proc/historyGetLastRecords(var/singleton/persistent_type/history/target_type, attribute, limit, skip_caching = FALSE) + if(!target_type) + log_subsystem_persistence_warning("Attempted to get history records with null target type.") + return list() + + if(limit > PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT) + limit = PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT + log_subsystem_persistence_warning("Attempted to draw more records then allowed for target type [target_type].") + + var/singleton/persistent_type/type_instance = GET_SINGLETON(target_type) + if(type_instance.requires_attribute && !attribute) + log_subsystem_persistence_warning("Attempted to get history records of type [target_type] without required attribute.") + return list() + + // Query order + // 1 - Check if record container exists, if so, check if last X records are in there, aggregate found records, step to DB (2) for missing remainders. + // 2 - Query database for last X records of type and add it to record container as new cache + + var/datum/persistent_record_container/container = null + attribute = length("[attribute]") > 0 ? attribute : null + container = history_cache[typesGetCacheName(target_type, attribute)] + + var/list/datum/persistent_record/top = list() + + // Query order - 1 + if(container) + top = typesHistoryCacheSelectTopK(limit, container) + if(length(top) == limit) // All X records got hit in cache, return + return top + else if (!skip_caching) + container = new /datum/persistent_record_container + container.type_define = target_type.type + container.attribute = attribute + container.records = list() + history_cache[typesGetCacheName(target_type, attribute)] = container + + // Query order - 2 + var/list/db_records = historyDatabaseGetRecords(type_instance.database_id, attribute, limit - length(top)) // Draw remaining missing records from DB + var/len = length(db_records) + if(!len) + return list() + + if(!skip_caching) + history_cache_count += len + + for(var/alist/record in db_records) + var/datum/persistent_record/r = new /datum/persistent_record + r.id = record["id"] + r.created_at = record["created_at"] + r.game_id = record["game_id"] + r.value = record["value"] + if(!skip_caching) + container.records += r // Add to cache + top += r // Records in top are either newly created or read from DB already, append newly queries records. + + return top + +/** + * Queries all records of a specified type/attribute. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type and subtypes. + * If the type definition is a character record type, the attribute must be a valid character ID or the record will be rejected. + * attribute = Custom attribute of the record, can be null if the type definition doesn't require it. + * skip_caching = If set to TRUE, the results won't be added to the types cache, defaults to TRUE. + * RETURN: + * List of /persistent_record or empty list. + */ +/datum/controller/subsystem/persistence/proc/historyGetAllRecords(var/singleton/persistent_type/history/target_type, attribute, skip_caching = TRUE) + var/result = historyGetLastRecords(target_type, attribute, PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT, skip_caching) + if(length(result) == 0) + return null + else + return result + +/** + * Queries the last record of the specified type for all attributes. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type and subtypes. + * RETURN: + * Associative list with "attribute" and "records" of type list(/persistent_record) or empty list. + */ +/datum/controller/subsystem/persistence/proc/historyGetLastRecordForAllAttributes(var/singleton/persistent_type/history/target_type) + var/result = historyGetLastRecordsForAllAttributes(target_type, 1) + if(length(result) == 0) + return list() + else + return result + +/** + * Queries the last X records of a specified type for all attributes. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type and subtypes. + * limit = Number of records to retrieve. + * skip_caching = If set to TRUE, the results won't be added to the types cache, defaults to TRUE. + * RETURN: + * List of associative list with "attribute" and "records" of type list(/persistent_record) or empty list. + */ +/datum/controller/subsystem/persistence/proc/historyGetLastRecordsForAllAttributes(var/singleton/persistent_type/history/target_type, limit, skip_caching = TRUE) + if(!target_type) + log_subsystem_persistence_warning("Attempted to get history records with null target type.") + return list() + + if(limit > PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT) + limit = PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT + log_subsystem_persistence_warning("Attempted to draw more records then allowed for target type [target_type].") + + var/singleton/persistent_type/type_instance = GET_SINGLETON(target_type) + var/list/result = list() + + var/attributes = historyDatabaseGetAllAttributes(type_instance.database_id) + if(attributes && length(attributes) > 0) + for(var/attribute in attributes) + result += list(alist("attribute" = attribute, "records" = historyGetAllRecords(target_type, attribute, skip_caching))) + else + var/no_attribute_records = historyGetAllRecords(target_type, null, skip_caching) + if(no_attribute_records && length(no_attribute_records) > 0) + result = list(alist("attribute" = null, "records" = no_attribute_records)) + return result + +/** + * Queries all records of a specified type for all attributes. + * PARAMS: + * target_type = Singleton persistent type definition. See /singleton/persistent_type and subtypes. + * skip_caching = If set to TRUE, the results won't be added to the types cache, defaults to TRUE. + * RETURN: + * List of associative list with "attribute" and "records" of type list(/persistent_record) or empty list. + */ +/datum/controller/subsystem/persistence/proc/historyGetAllRecordsForAllAttributes(var/singleton/persistent_type/history/target_type, skip_caching = TRUE) + var/result = historyGetLastRecordsForAllAttributes(target_type, PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT, skip_caching) + if(length(result) == 0) + return null + else + return result + +#undef PERSISTENCE_INTERNAL_MAX_RECORD_QUERY_COUNT diff --git a/code/controllers/subsystems/persistence/persistence_types_history_sql.dm b/code/controllers/subsystems/persistence/persistence_types_history_sql.dm new file mode 100644 index 00000000000..1a2afe8d4ff --- /dev/null +++ b/code/controllers/subsystems/persistence/persistence_types_history_sql.dm @@ -0,0 +1,235 @@ +/** + * Get the last ID in the history table. + * RETURN: + * Last ID or zero. + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseGetLastID() + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseGetLastID")) + return 0 + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT id FROM ss13_persistent_history ORDER BY id DESC LIMIT 1" + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "historyDatabaseGetLastID")) + qdel(query) + return 0 + + var/last_id = 0 + if(query.NextRow()) + last_id = query.item[1] + qdel(query) + return last_id + +/** + * Returns all combinations of types+attributes from persistent history. + * RETURN: + * Distinct list of list with keys "type_id" and "attribute" (possibly null). + * Example: (("type_id" = 1, "attribute" = null), ("type_id" = 1, "attribute" = "lorem ipsum"), ("type_id" = 2, "attribute" = "dolor sit amet")) + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseGetTypeAttributeCombinations() + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseGetTypeAttributeCombinations")) + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT DISTINCT type, attribute FROM ss13_persistent_history" + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "historyDatabaseGetTypeAttributeCombinations")) + qdel(query) + return null + + var/result = list() + while(query.NextRow()) + result += list(alist("type_id" = query.item[1], "attribute" = query.item[2])) + qdel(query) + return result + +/** + * Returns all attributes from persistent history for a specified type. + * RETURN: + * Distinct list of attributes or empty list. + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseGetAllAttributes(type_id) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseGetAllAttributes")) + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT DISTINCT attribute FROM ss13_persistent_history WHERE type = :type_id", + list("type_id" = type_id) + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "historyDatabaseGetAllAttributes")) + qdel(query) + return null + + var/result = list() + while(query.NextRow()) + result += query.item[1] + qdel(query) + return result + +/** + * Clean up history records of type+attribute by specified row count + * PARAMS: + * type_id = ID of type. + * attribute = Custom attribute of the record, can be null. + * row_count = Count of rows to keep for the specified grouping. + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseCleanByRowCount(type_id, attribute, row_count) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseCleanByRowCount")) + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "\ + DELETE FROM ss13_persistent_history \ + WHERE type = :type_id AND attribute <=> :attribute \ + AND id NOT IN ( \ + SELECT id FROM ss13_persistent_history \ + WHERE type = :type_id AND attribute <=> :attribute \ + ORDER BY created_at DESC, id DESC \ + LIMIT :row_count \ + )", + list( + "type_id" = type_id, + "attribute" = attribute, + "row_count" = row_count + ) + ) + query.Execute() + + databaseCheckQueryResult(query, "historyDatabaseCleanByRowCount") + qdel(query) + +/** + * Clean up history records of type+attribute by specified round count. + * PARAMS: + * type_id = Type of ID. + * attribute = Custom attribute of the record, can be null. + * round_count = Number of rounds to keep for specified grouping. + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseCleanByRoundCount(type_id, attribute, round_count) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseCleanByRoundCount")) + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "\ + DELETE FROM ss13_persistent_history \ + WHERE type = :type_id AND attribute <=> :attribute \ + AND game_id NOT IN ( \ + SELECT game_id FROM ( \ + SELECT game_id FROM ss13_persistent_history \ + WHERE type = :type_id AND attribute <=> :attribute \ + GROUP BY game_id \ + ORDER BY MAX(created_at) DESC, game_id DESC \ + LIMIT :round_count \ + ) AS recent_games \ + )", + list( + "type_id" = type_id, + "attribute" = attribute, + "round_count" = round_count + ) + ) + query.Execute() + + databaseCheckQueryResult(query, "historyDatabaseCleanByRoundCount") + qdel(query) + +/** + * Clean up history records of type+attribute by max age of record in days + * PARAMS: + * type_id = ID of type. + * attribute = Custom attribute of the record, can be null. + * max_age_days = Max age of records in days. + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseCleanByMaxAgeDays(type_id, attribute, max_age_days) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseCleanByMaxAgeDays")) + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "\ + DELETE FROM ss13_persistent_history \ + WHERE type = :type_id AND attribute <=> :attribute \ + AND created_at < (NOW() - INTERVAL :max_age_days DAY)", + list( + "type_id" = type_id, + "attribute" = attribute, + "max_age_days" = max_age_days + ) + ) + query.Execute() + + databaseCheckQueryResult(query, "historyDatabaseCleanByMaxAgeDays") + qdel(query) + +/** + * Insert a new history record into the history table. + * PARAMS: + * type_id = ID of type. + * attribute = Custom attribute of the record, can be null. + * value = Value of the record, cannot be null or empty. + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseInsertRecord(type_id, attribute, value) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseInsertRecord")) + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "INSERT INTO ss13_persistent_history (type, created_at, attribute, value, game_id) VALUES (:type_id, NOW(), :attribute, :value, :game_id)", + list( + "type_id" = type_id, + "attribute" = attribute, + "value" = "[value]", + "game_id" = "[GLOB.round_id]" + ) + ) + query.Execute() + + databaseCheckQueryResult(query, "historyDatabaseInsertRecord") + qdel(query) + +/** + * Get the last X history records for a type+attribute. + * PARAMS: + * type_id = ID of type + * attribute = Custom attribute of the record, can be null. + * count = Number of records to be returned. + * RETURN: + * List of records, each as a list consisting of keys "id", "created_at" and "value". + */ +/datum/controller/subsystem/persistence/proc/historyDatabaseGetRecords(type_id, attribute, count) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("historyDatabaseGetRecords")) + return 0 + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT id, created_at, value, game_id FROM ss13_persistent_history \ + WHERE type = :type_id AND attribute <=> :attribute \ + ORDER BY id DESC LIMIT :count", + list( + "type_id" = type_id, + "attribute" = attribute, + "count" = count + ) + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "historyDatabaseGetRecords")) + qdel(query) + return null + + var/records = list() + while(query.NextRow()) + records += list(alist("id" = query.item[1], "created_at" = query.item[2], "value" = query.item[3])) + qdel(query) + return records diff --git a/code/controllers/subsystems/persistence/persistence_types_sql.dm b/code/controllers/subsystems/persistence/persistence_types_sql.dm new file mode 100644 index 00000000000..bc6175edcf7 --- /dev/null +++ b/code/controllers/subsystems/persistence/persistence_types_sql.dm @@ -0,0 +1,55 @@ +/** + * Insert or update a type definition in the database. If a type with the same name already exists, it will be updated with the new title and description. + * PARAMS: + * type = Name of type to be upserted. + * title = Custom display title of the type. + * description = Custom display description of the type. + * definition_type = Enum value of the definition type. See /singleton/persistent_type. + */ +/datum/controller/subsystem/persistence/proc/typesDatabaseUpsertType(type, title, description, definition_type) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("typesDatabaseUpsertType")) + return + + var/datum/db_query/upsert_query = SSdbcore.NewQuery( + "INSERT INTO ss13_persistent_type_definitions (type, title, description, definition_type) VALUES (:type, :title, :description, :definition_type) \ + ON DUPLICATE KEY UPDATE title = VALUES(title), description = VALUES(description)", + list( + "type" = type, + "title" = title, + "description" = description, + "definition_type" = definition_type + ) + ) + upsert_query.Execute() + + databaseCheckQueryResult(upsert_query, "typesDatabaseUpsertType") + qdel(upsert_query) + +/** + * Get ID of type definition. + * PARAMS: + * type_name = Type name of singleton definition. + * RETURN: + * Database ID of type. + */ +/datum/controller/subsystem/persistence/proc/typesDatabaseGetTypeIdByName(type_name) + PRIVATE_PROC(TRUE) + if(!databaseCheckConnection("typesDatabaseGetTypeIdByName")) + return 0 + + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT id FROM ss13_persistent_type_definitions WHERE type = :type_name", + list("type_name" = type_name) + ) + query.Execute() + + if(!databaseCheckQueryResult(query, "typesDatabaseGetTypeIdByName")) + qdel(query) + return 0 + + var/database_id = null + if(query.NextRow()) + database_id = query.item[1] + qdel(query) + return database_id diff --git a/code/datums/repositories/crew.dm b/code/datums/repositories/crew.dm index 4ff0b2f0731..e389da82ef9 100644 --- a/code/datums/repositories/crew.dm +++ b/code/datums/repositories/crew.dm @@ -95,7 +95,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new()) crewmembers += list(crewmemberData) - crewmembers = sortByKey(crewmembers, "name") + crewmembers = sortByKeyText(crewmembers, "name") cache_entry.timestamp = world.time + 5 SECONDS cache_entry.data = crewmembers diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 6481c72ea11..d7f2b89ac4b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -28,8 +28,6 @@ GLOBAL_LIST_EMPTY(additional_antag_types) var/station_was_nuked = 0 // See nuclearbomb.dm and malfunction.dm. var/explosion_in_progress = 0 // Sit back and relax - var/waittime_l = 60 SECONDS // Lower bound on time before intercept arrives (in tenths of seconds) - var/waittime_h = 180 SECONDS // Upper bound on time before intercept arrives (in tenths of seconds) var/event_delay_mod_moderate // Modifies the timing of random events. var/event_delay_mod_major // As above. @@ -281,8 +279,7 @@ GLOBAL_LIST_EMPTY(additional_antag_types) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(display_logout_report)), ROUNDSTART_LOGOUT_REPORT_TIME) - var/welcome_delay = rand(waittime_l, waittime_h) - addtimer(CALLBACK(SSatlas.current_map, TYPE_PROC_REF(/datum/map, send_welcome)), welcome_delay) + SSatlas.current_map.post_gamemode_setup() addtimer(CALLBACK(SSatlas.current_map, TYPE_PROC_REF(/datum/map, load_holodeck_programs)), 5 MINUTES) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 301c7e8bed6..e3a27d38080 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -531,7 +531,7 @@ if(T) var/area/A = get_area(T) if(A && !(A.area_flags & AREA_FLAG_PREVENT_PERSISTENT_TRASH)) - persistant_objects_expiration_time_days = 3 // Ensure expiration date is set to prevent long term trash + persistent_objects_expiration_time_days = 3 // Ensure expiration date is set to prevent long term trash SSpersistence.objectsRegisterTrack(src, usr == null ? null : ckey(usr.key)) return diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm index 632e9f0b464..7db5750ec71 100644 --- a/code/game/objects/items/sticker.dm +++ b/code/game/objects/items/sticker.dm @@ -6,7 +6,7 @@ item_flags = ITEM_FLAG_NO_BLUDGEON w_class = WEIGHT_CLASS_TINY vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_DIR - persistant_objects_expiration_time_days = 2 + persistent_objects_expiration_time_days = 2 var/datum/weakref/attached var/list/rand_icons diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 2333f8a8cb0..4c95ad585cf 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -11,7 +11,7 @@ /obj/item/material/ashtray/Initialize(newloc, material_key) . = ..() - persistant_objects_expiration_time_days = rand(7, 180) // Imagine they get stolen, lost or break... + persistent_objects_expiration_time_days = rand(7, 180) // Imagine they get stolen, lost or break... max_butts = round(material.hardness/10) //This is arbitrary but whatever. randpixel_xy() update_icon() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 3862dded453..72732f681f5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -105,7 +105,7 @@ // This should be considered for any moderation purpose var/persistent_objects_author_ckey = null // Expiration time used when saving/updating a persistent type, this can be changed depending on the use case by assigning a new value - var/persistant_objects_expiration_time_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS + var/persistent_objects_expiration_time_days = PERSISTENT_DEFAULT_EXPIRATION_DAYS /* END PERSISTENCE VARS */ /// for easy reference of talking atoms diff --git a/code/modules/cargo/delivery/package.dm b/code/modules/cargo/delivery/package.dm index 1aa63bbf215..98098d9f95c 100644 --- a/code/modules/cargo/delivery/package.dm +++ b/code/modules/cargo/delivery/package.dm @@ -158,7 +158,7 @@ ABSTRACT_TYPE(/obj/item/package) Probably more expensive then it should be." icon_state = "supply_package" item_state = "supply_package" - persistant_objects_expiration_time_days = 360 + persistent_objects_expiration_time_days = 360 /obj/item/package/persistent_supply/Initialize() . = ..() diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index 2201bb7028a..78f99529b96 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -325,7 +325,7 @@ desc = "A specialized charge card that holds a certain amount of money. This type of charge card is in use for special purposes and not generally available." icon_state = "efundcard_special" var/initial_worth = 0 // Used for calculating how much cash was spend, needs to be set using VV after spawning it. - persistant_objects_expiration_time_days = 360 + persistent_objects_expiration_time_days = 360 /obj/item/spacecash/ewallet/persistent_charge_card/Initialize() . = ..() diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 718fcdef06e..60fde774824 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -192,6 +192,9 @@ ID.mining_points += points if(points != 0) ping("\The [src] pings, \"Point transfer complete! Transaction total: [points] points!\"") + var/character_id = astype(ID.mob_id.resolve(), /mob/living/carbon/human/)?.character_id + if(character_id) + SSpersistence.historyAddCharacterRecord(/singleton/persistent_type/history/character/mining_points, character_id, points) points = 0 else ping("\The [src] pings, \"Transaction failed due to a negative point value. No transaction can be done until this value has returned to a positive one.\"") diff --git a/code/modules/modular_computers/file_system/programs/security/penalmechs.dm b/code/modules/modular_computers/file_system/programs/security/penalmechs.dm index 2def9c74337..8facaf3b60d 100644 --- a/code/modules/modular_computers/file_system/programs/security/penalmechs.dm +++ b/code/modules/modular_computers/file_system/programs/security/penalmechs.dm @@ -60,8 +60,8 @@ robots += list(robotData) - data["mechs"] = sortByKey(mechs, "pilot") - data["robots"] = sortByKey(robots, "pilot") + data["mechs"] = sortByKeyText(mechs, "pilot") + data["robots"] = sortByKeyText(robots, "pilot") data["current_cam_loc"] = current_camera ? "[REF(current_camera.loc)]" : null diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 3720663acc4..4ad09f1d3bb 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -66,7 +66,7 @@ var/can_change_icon_state = TRUE var/set_unsafe_on_init = FALSE - persistant_objects_expiration_time_days = 180 + persistent_objects_expiration_time_days = 180 /obj/item/paper/Destroy() info = null diff --git a/html/changelogs/fabiank3-persistency-subsystem-update.yml b/html/changelogs/fabiank3-persistency-subsystem-update.yml new file mode 100644 index 00000000000..a5864e0270a --- /dev/null +++ b/html/changelogs/fabiank3-persistency-subsystem-update.yml @@ -0,0 +1,23 @@ +author: FabianK3 + +delete-after: True + +changes: + - server: "Database: Added new tables for persistent generics and history, refactored persistent objects." + - bugfix: "Fix duplicate code-behind ID for admin persistence toggle verb." + - admin: "MC/VV: Moved Persistent object register from GLOB to subsystem var space." + - admin: "MC/VV: Cache list for persistent generics (generic_cache) and persistent history (history_cache) added to subsystem var space." + - admin: "MC/VV: Update stat entry of persistence subsystem. It now displays master-save-toggle, persistent object register, generics cache, history cache with entry count and possible panic-mode warning." + - admin: "Logging: Added sentry integration to persistence subsystem error/panic logging." + - code_imp: "Renamed map send_welcome proc to post_gamemode_setup and moved SCCV Horizon round start fax logic into new proc. This proc can be used for map specific init logic for any map respectively." + - rscadd: "CI/CD: Added new CI job to find object types on maps that should be excluded. Config file under maps/forbiddenMapTypes.json and currently includes persistent ash trays on the SCCV Horizon and the operations warehouse submap." + - experiment: "Updated the persistence subsystem/framework and introduced persistent generics and persistent history. Technical documentation for maintainers and contributors will be available on the repository wiki. Update includes a near-complete overhaul of the existing subsystem and added a lot of newly available methods to make a lot of things persistent that couldn't be made possible with the previous object-only persistence." + - rscadd: "Added macros to easily create new persistent type definitions, the basis for persistent generics and history." + - rscadd: "Added cleanup-rule definitions for persistent history definitions, used to specify how different persistent history mechanics should be cleaned up on a database level." + - rscadd: "Added dedicated file for persistent type definitions." + - code_imp: "Misc. changes to file structures, defines and the persistence subsystem related to the persistence framework update." + - rscadd: "New persistent mechanics: Persistent Horizon position (persistent generic example mechanic) - The SCCV Horizon will now retain its position on the overmap from round to round. Where did we park again?" + - rscadd: "New persistent mechanics: Persistent records of mining yields (persistent history example mechanic) - When miners claim their ore points using the ore console, the points will be saved. Every shift a report will be generated based of the points collected by each individual miner over the last 7 days. Who met their quota last week?" + - bugfix: "Added an init flag to the persistence subsystem to verify init success. If any issues arise during the subsystems init, saving at round end will be skipped (panic mode)." + - rscadd: "Implemented numeric version of list insert sort, based of existing test list insert sort." + - rscadd: "Implemented top K insertion sort selection for persistence subsystem cache." diff --git a/maps/_common/mapsystem/map.dm b/maps/_common/mapsystem/map.dm index ecca60fbe42..63a09be9128 100644 --- a/maps/_common/mapsystem/map.dm +++ b/maps/_common/mapsystem/map.dm @@ -283,7 +283,7 @@ return list(spawn_cost, player_cost, ship_cost) -/datum/map/proc/send_welcome() +/datum/map/proc/post_gamemode_setup() return /datum/map/proc/load_holodeck_programs() diff --git a/maps/forbiddenMapTypes.json b/maps/forbiddenMapTypes.json new file mode 100644 index 00000000000..bcd5c6ea9db --- /dev/null +++ b/maps/forbiddenMapTypes.json @@ -0,0 +1,9 @@ +{ + "forbidden_type_mappings": [ + { + "title": "Objects excluded due to persistent mechanics", + "maps": ["sccv_horizon.dmm", "ops_warehouse_small_storage.dmm"], + "forbidden_types": ["/obj/item/material/ashtray"] + } + ] +} diff --git a/maps/sccv_horizon/code/sccv_horizon.dm b/maps/sccv_horizon/code/sccv_horizon.dm index c6c406d8384..1046cd416f7 100644 --- a/maps/sccv_horizon/code/sccv_horizon.dm +++ b/maps/sccv_horizon/code/sccv_horizon.dm @@ -163,22 +163,49 @@ ) shuttle_missions = list("Exploration", "Research", "Prospecting", "Salvaging", "Transport", "Combat", "Rescue", "Training", "Humanitarian", "Expedition", "Recreation", "Other") -/datum/map/sccv_horizon/send_welcome() +/singleton/persistent_type/generic/horizon_overmap_position/finalization_hook() + if(SSatlas.current_map.use_overmap) + var/obj/effect/overmap/visitable/ship/sccv_horizon/ship = locate(/obj/effect/overmap/visitable/ship/sccv_horizon) in GLOB.map_overmap + if(ship) + SSpersistence.genericSave(/singleton/persistent_type/generic/horizon_overmap_position, list("x" = ship.x, "y" = ship.y), 1) + +/datum/map/sccv_horizon/post_gamemode_setup() + // ##### Set persistent Horizon position on the overmap + var/datum/persistent_generic/horizon_location_generic = SSpersistence.genericLoad(/singleton/persistent_type/generic/horizon_overmap_position) + if(horizon_location_generic) + var/area/overmap/map = GLOB.map_overmap + // Set Horizon location + var/obj/effect/overmap/visitable/ship/sccv_horizon/ship = locate(/obj/effect/overmap/visitable/ship/sccv_horizon) in map + ship.x = horizon_location_generic.content["x"] + ship.y = horizon_location_generic.content["y"] + // Make safe space for the Horizon + for(var/obj/effect/overmap/hazard in map) + if(hazard.x == ship.x && hazard.y == ship.y && istype(hazard, /obj/effect/overmap/event/)) // Ions, dust, carps, meteors, etc. + qdel(hazard) + + // ##### Send different faxes after slight delay + var/faxes_send_delay = rand(60 SECONDS , 180 SECONDS) + addtimer(CALLBACK(SSatlas.current_map, TYPE_PROC_REF(/datum/map/sccv_horizon, send_roundstart_faxes)), faxes_send_delay) + +/datum/map/sccv_horizon/proc/send_roundstart_faxes() + + // #### Send welcome fax with overmap information + var/obj/effect/overmap/visitable/ship/horizon = SSshuttle.ship_by_type(overmap_visitable_type) - var/welcome_text = "

[FONT_LARGE("SCCV Horizon Ultra-Range Sensor Readings:")]
" + var/welcome_text = "

[FONT_LARGE("SCCV Horizon Ultra-Range Sensor Readings:")]
" welcome_text += "Report generated on [worlddate2text()] at [worldtime2text()]


" - welcome_text += "
Current sector:
[SSatlas.current_sector.name]

" + welcome_text += "
Current sector:
[SSatlas.current_sector.name]

" if (horizon) //If the overmap is disabled, it's possible for there to be no Horizon. var/list/space_things = list() - welcome_text += "Current Coordinates:
[horizon.x]:[horizon.y]

" - welcome_text += "Available Ports of Call: [english_list(SSatlas.current_sector.ports_of_call, "none")]
" + welcome_text += "Current Coordinates:
[horizon.x]:[horizon.y]

" + welcome_text += "Available Ports of Call: [english_list(SSatlas.current_sector.ports_of_call, "none")]
" if(SSatlas.current_sector.next_port_visit) - welcome_text += "Next Port Visit: in [SSatlas.current_sector.next_port_visit] days
" + welcome_text += "Next Port Visit: in [SSatlas.current_sector.next_port_visit] days
" else - welcome_text += "There is no port visit scheduled.

" - welcome_text += "It is advised to inform crew of the available ports of call and the date of the next port visit.

" + welcome_text += "There is no port visit scheduled.

" + welcome_text += "It is advised to inform crew of the available ports of call and the date of the next port visit.

" welcome_text += "Scan results show the following points of interest:
" for(var/zlevel in GLOB.map_sectors) @@ -206,6 +233,56 @@ var/report = "The long-range sensor readings have been printed out at all communication consoles." priority_announcement.Announce(message = report) + // #### Mining yield report for operations + + var/list/name_points_kvps = SSpersistence.historyGetAllRecordsForAllAttributes(/singleton/persistent_type/history/character/mining_points) + if(name_points_kvps && length(name_points_kvps) > 0) + var/list/leaderboard_kvps = list() + for(var/kvp in name_points_kvps) // Get name, validate, add to leaderboard + var/char_name = SSpersistence.historyGetCharnameByID(kvp["attribute"]) + if(!char_name) + continue + var/point_sum = 0 + for(var/datum/persistent_record/r in kvp["records"]) + point_sum += text2num(r.value) + if(point_sum <= 0) + continue + leaderboard_kvps += list(list("score" = point_sum, "name" = char_name, "claims" = length(kvp["records"]))) + + if(length(leaderboard_kvps)) + var/report_text = "" + report_text += "

7-day mining yield report

" + report_text += "" + report_text += "
" + report_text += "7-day history of worker mining yields.
Manifest version: [worlddate2text()] [worldtime2text()]
" + report_text += "

" + + leaderboard_kvps = sortByKeyNumber(leaderboard_kvps, "score") + + report_text += "[leaderboard_kvps[1]["name"]] is leading the 7-day
yield report with [leaderboard_kvps[1]["score"]] points.


" + + report_text += "" + for(var/leaderboard_kvp in leaderboard_kvps) + report_text += "
[leaderboard_kvp["name"]]
Points: [leaderboard_kvp["score"]]
Claims: [leaderboard_kvp["claims"]]
" + report_text += "

" + + report_text += "" + report_text += "
Powered by Orion Express logistics software.
Faster than light.
" + report_text += "
" + + report_text += "
This report has been generated based of all mining yield claims in the past 7 days. Points are aggregated, claim count does not reflect on shift or trip count. Point claims are authenticated by identification cards." + report_text += "
" + report_text += "Generated by OE.SCC.MiningOps 1.7
Manifest form version 5.87, Hash:
576520646F206C6F7665206F7572207061706572776F726B21
" + + for(var/obj/structure/machinery/requests_console/console in GLOB.allConsoles) + var/area/console_area = get_area(console) + if(console_area.type in typesof(/area/horizon/command/heads/om, /area/horizon/operations/office, /area/horizon/operations/mining_main/refinery, /area/horizon/command/bridge/controlroom)) + if(console.paperstock <= 0) + continue + new /obj/item/paper(get_turf(console), report_text, "7-day mining yield report") + console.audible_message("The Requests Console beeps, \"Fax received.\"") + console.paperstock -= 1 + /datum/map/sccv_horizon/load_holodeck_programs() // loads only if at least two engineers are present // so as to not drain power on deadpop diff --git a/maps/sccv_horizon/sccv_horizon.dmm b/maps/sccv_horizon/sccv_horizon.dmm index 5f972c6653c..44177358877 100644 --- a/maps/sccv_horizon/sccv_horizon.dmm +++ b/maps/sccv_horizon/sccv_horizon.dmm @@ -2346,6 +2346,15 @@ /obj/random/maintenance_junk_or_loot, /turf/simulated/floor/tiled/dark, /area/horizon/maintenance/deck_3/cafe) +"anp" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "anu" = ( /obj/structure/sign/radiation{ pixel_x = -32 @@ -2416,6 +2425,12 @@ /obj/effect/decal/fake_object/light_source/invisible, /turf/simulated/floor/bluegrid, /area/tdome) +"anH" = ( +/obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "anN" = ( /obj/structure/lattice, /obj/effect/map_effect/perma_light/starlight, @@ -3106,13 +3121,6 @@ /obj/effect/map_effect/window_spawner/full/reinforced/firedoor, /turf/simulated/floor/tiled/dark/full, /area/horizon/crew/resdeck/living_quarters_lift) -"atF" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/machinery/firealarm/east, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "atH" = ( /obj/structure/table/rack, /obj/item/reagent_containers/spray/pepper{ @@ -4337,24 +4345,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/weapons/longbow) -"aBT" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/platform_stairs/full{ - dir = 4 - }, -/obj/structure/platform{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "aBV" = ( /obj/structure/table/wood, /obj/item/flame/candle, @@ -5609,6 +5599,25 @@ /obj/effect/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled, /area/horizon/security/investigations_hallway) +"aKf" = ( +/obj/structure/table/stone/marble, +/obj/structure/machinery/chemical_dispenser/coffeemaster/full{ + pixel_y = 19 + }, +/obj/structure/machinery/controlhub/bar{ + pixel_x = -5; + pixel_y = -8 + }, +/obj/structure/machinery/light_switch/idris{ + dir = 10; + pixel_x = 10; + pixel_y = -1 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 5 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/bar) "aKh" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -6350,23 +6359,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/security/investigations_hallway) -"aOF" = ( -/obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/shaker/salt{ - pixel_y = 5; - pixel_x = 7 - }, -/obj/item/reagent_containers/food/condiment/shaker/peppermill{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/flame/candle{ - pixel_x = -6; - pixel_y = 9 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "aOH" = ( /obj/structure/table/wood/gamblingtable, /obj/structure/machinery/power/outlet{ @@ -8484,6 +8476,21 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/maintenance/deck_1/operations/starboard/amidships) +"bdl" = ( +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/camera/network/service{ + c_tag = "Service - Mess Hall 3"; + dir = 4 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "bdm" = ( /turf/simulated/floor/holofloor/grass{ desc = "Lush, mossy grass. A staple of Konyang."; @@ -8816,6 +8823,23 @@ /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/break_room) +"bfx" = ( +/obj/structure/disposalpipe/segment{ + icon_state = "pipe-c" + }, +/obj/structure/sink/kitchen{ + dir = 8; + name = "sink"; + pixel_x = 21 + }, +/obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/bar) "bfB" = ( /obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -9113,6 +9137,27 @@ /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/dark, /area/horizon/hangar/auxiliary) +"bho" = ( +/obj/structure/table/stone/marble, +/obj/item/reagent_containers/glass/bottle/syrup/chocolate{ + pixel_x = -8; + pixel_y = 13 + }, +/obj/item/reagent_containers/glass/bottle/syrup/caramel{ + pixel_x = -2; + pixel_y = 13 + }, +/obj/item/reagent_containers/glass/bottle/syrup/pumpkin{ + pixel_x = 4; + pixel_y = 13 + }, +/obj/item/reagent_containers/glass/bottle/syrup/vanilla{ + pixel_x = 10; + pixel_y = 13 + }, +/obj/item/radio/intercom/north, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/bar) "bhs" = ( /obj/structure/undies_wardrobe, /obj/effect/floor_decal/industrial/outline/yellow, @@ -9693,6 +9738,12 @@ }, /turf/unsimulated/floor/plating, /area/shuttle/specops) +"bka" = ( +/obj/effect/floor_decal/industrial/hatch_door/service{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "bkd" = ( /obj/structure/machinery/door/firedoor{ req_one_access = list(24,11,67,73); @@ -11036,21 +11087,6 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/starboard) -"btc" = ( -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/camera/network/service{ - c_tag = "Service - Mess Hall 3"; - dir = 4 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "btg" = ( /obj/item/storage/secure/safe{ pixel_y = -20 @@ -12458,6 +12494,16 @@ "bDu" = ( /turf/unsimulated/floor, /area/centcom/ferry) +"bDv" = ( +/obj/effect/floor_decal/spline/fancy/wood, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "bDz" = ( /obj/effect/floor_decal/industrial/warning/full, /obj/structure/machinery/porta_turret/crescent, @@ -12609,13 +12655,6 @@ /obj/effect/floor_decal/industrial/hatch_door/yellow, /turf/simulated/floor/tiled/full, /area/horizon/rnd/eva) -"bEE" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 4 - }, -/obj/item/hullbeacon/red, -/turf/simulated/floor/reinforced/airless, -/area/horizon/exterior) "bEG" = ( /obj/structure/machinery/door/firedoor, /obj/effect/floor_decal/industrial/hatch_door/yellow{ @@ -12705,21 +12744,6 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/service/port) -"bFx" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/bar) "bFC" = ( /obj/effect/floor_decal/corner/dark_blue{ dir = 6 @@ -13739,6 +13763,16 @@ }, /turf/simulated/floor/plating, /area/horizon/engineering/atmos/air) +"bNx" = ( +/obj/effect/floor_decal/spline/fancy/wood, +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "bNz" = ( /obj/structure/railing/mapped, /obj/structure/sign/greencross/small{ @@ -14318,13 +14352,6 @@ }, /turf/simulated/floor/carpet/rubber, /area/horizon/tcommsat/entrance) -"bRc" = ( -/obj/structure/table/wood, -/obj/structure/machinery/recharger{ - pixel_y = 3 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "bRd" = ( /turf/simulated/wall/shuttle/unique/tcfl{ icon_state = "2,1" @@ -14409,6 +14436,18 @@ }, /turf/unsimulated/floor/dark, /area/antag/actor) +"bRM" = ( +/obj/structure/platform{ + dir = 4 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 10 + }, +/obj/structure/machinery/light/floor{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "bRQ" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -14925,6 +14964,23 @@ /obj/random/loot, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/port/far) +"bVa" = ( +/obj/structure/machinery/alarm/south, +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass{ + pixel_x = 15; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/newglass{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/structure/table/fancy/black, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "bVg" = ( /obj/structure/closet, /obj/random/loot, @@ -14946,14 +15002,6 @@ }, /turf/simulated/floor/reinforced, /area/shuttle/mercenary) -"bVn" = ( -/obj/structure/table/rack, -/obj/random/melee, -/obj/item/stack/material/steel/full, -/obj/item/crowbar/rescue_axe/tactical, -/obj/item/crowbar/rescue_axe/tactical, -/turf/simulated/floor/plating, -/area/shuttle/skipjack) "bVq" = ( /obj/effect/floor_decal/corner/mauve{ dir = 6 @@ -15036,6 +15084,11 @@ /obj/structure/lattice/catwalk/indoor/grate, /turf/simulated/floor, /area/horizon/crew/resdeck/living_quarters_lift) +"bVO" = ( +/obj/effect/floor_decal/industrial/hatch/firefighting_closet, +/obj/structure/closet/firecloset/full, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "bVS" = ( /obj/effect/floor_decal/corner/dark_green/full{ dir = 8 @@ -15272,6 +15325,14 @@ /obj/structure/flora/ausbushes/sparsegrass, /turf/simulated/floor/grass/no_edge, /area/centcom/bar) +"bXk" = ( +/obj/structure/machinery/disposal, +/obj/effect/floor_decal/industrial/outline/service, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "bXm" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 5 @@ -15343,6 +15404,24 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/starboard/far) +"bXD" = ( +/obj/structure/platform_deco{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/effect/floor_decal/spline/plain/green{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "bXG" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 5 @@ -15545,6 +15624,19 @@ /obj/effect/decal/fake_object/light_source/invisible, /turf/simulated/floor, /area/tdome) +"bZv" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/hatch/emergency_closet, +/obj/structure/closet/emcloset, +/obj/item/storage/toolbox/emergency, +/obj/item/storage/bag/inflatable/emergency, +/obj/structure/machinery/ai_status_display{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "bZy" = ( /obj/effect/floor_decal/corner/dark_green{ dir = 5 @@ -15788,15 +15880,43 @@ }, /turf/simulated/floor/carpet, /area/horizon/command/heads/xo) -"cbx" = ( -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +"cby" = ( +/obj/structure/platform{ + dir = 8 }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 +/obj/structure/table/steel, +/obj/effect/floor_decal/spline/plain/brown{ + dir = 8 }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/bar) +/obj/item/healthanalyzer{ + pixel_y = 12 + }, +/obj/item/flash/synthetic{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/flash/synthetic{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/flash/synthetic{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/flash/synthetic{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/flash/synthetic{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/flash/synthetic{ + pixel_x = -5; + pixel_y = 12 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/operations/machinist) "cbz" = ( /obj/structure/machinery/keycard_auth{ pixel_x = -5; @@ -17015,17 +17135,6 @@ }, /turf/unsimulated/floor, /area/centcom/holding) -"cjP" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/machinery/light/small/floor, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "cjU" = ( /obj/effect/floor_decal/corner/dark_blue/full{ dir = 1 @@ -17902,6 +18011,29 @@ /obj/random/maintenance_junk_or_loot, /turf/simulated/floor/tiled/dark, /area/horizon/maintenance/deck_3/cafe) +"cra" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 5 + }, +/obj/item/radio/intercom/north, +/obj/structure/machinery/power/outlet{ + pixel_y = 3 + }, +/obj/item/flame/candle{ + pixel_x = 9; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ + pixel_x = 2; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/condiment/shaker/salt{ + pixel_y = 12; + pixel_x = -3 + }, +/obj/structure/table/wood/gamblingtable, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "crp" = ( /obj/effect/floor_decal/corner/yellow{ dir = 9 @@ -19266,14 +19398,6 @@ /obj/item/stack/cable_coil/random, /turf/simulated/floor/carpet/rubber, /area/horizon/maintenance/deck_1/workshop) -"cyR" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain/corner/green, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "cyX" = ( /obj/structure/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -19410,13 +19534,6 @@ }, /turf/simulated/floor/bluegrid/server, /area/horizon/rnd/server) -"czM" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/obj/item/hullbeacon/red, -/turf/simulated/floor/reinforced/airless, -/area/horizon/exterior) "czN" = ( /obj/effect/floor_decal/corner/white{ dir = 5 @@ -21524,16 +21641,6 @@ /obj/structure/closet/cabinet, /turf/simulated/floor/wood, /area/shuttle/skipjack) -"cPK" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/machinery/disposal/small/west, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/hallway/primary/deck_2/fore) "cPR" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -21642,6 +21749,24 @@ /obj/structure/machinery/door/firedoor, /turf/simulated/floor/plating, /area/horizon/stairwell/engineering/deck_1) +"cQp" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/spline/plain/green, +/obj/structure/machinery/light/small/floor, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "cQs" = ( /obj/structure/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -22153,24 +22278,6 @@ "cTs" = ( /turf/simulated/floor/tiled/dark/full, /area/horizon/operations/machinist) -"cTt" = ( -/obj/structure/platform_deco{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/effect/floor_decal/spline/plain/green{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "cTw" = ( /obj/structure/bed/stool/chair/sofa/red{ dir = 1 @@ -23850,13 +23957,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/operations/loading) -"deR" = ( -/obj/structure/platform/cutout, -/obj/structure/platform_stairs/full/east_west_cap{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "deT" = ( /obj/structure/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/corner/dark_blue{ @@ -24773,23 +24873,6 @@ /obj/structure/machinery/firealarm/west, /turf/simulated/floor/tiled/white, /area/horizon/operations/break_room) -"djV" = ( -/obj/structure/machinery/alarm/south, -/obj/item/reagent_containers/food/drinks/drinkingglass/newglass{ - pixel_x = 15; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/newglass{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/newglass{ - pixel_x = -3; - pixel_y = 4 - }, -/obj/structure/table/fancy/black, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "djX" = ( /obj/structure/machinery/computer/ship/sensors/terminal{ dir = 1 @@ -25170,6 +25253,15 @@ }, /turf/simulated/floor/plating, /area/horizon/engineering/bluespace_drive) +"dmn" = ( +/obj/structure/platform{ + dir = 4 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "dmo" = ( /turf/simulated/wall/r_wall, /area/horizon/maintenance/deck_3/aft/port) @@ -25425,6 +25517,14 @@ }, /turf/simulated/floor/lino, /area/horizon/service/cafeteria) +"dnR" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/machinery/disposal/airless, +/obj/effect/floor_decal/industrial/outline/service, +/turf/simulated/floor/tiled/full, +/area/horizon/crew/washroom/deck_2) "dnV" = ( /obj/effect/floor_decal/corner_wide/yellow{ dir = 5 @@ -26021,19 +26121,6 @@ }, /turf/simulated/floor/exoplanet/grass/grove, /area/centcom/shared_dream) -"dqT" = ( -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/effect/floor_decal/industrial/hatch/emergency_closet, -/obj/structure/closet/emcloset, -/obj/item/storage/toolbox/emergency, -/obj/item/storage/bag/inflatable/emergency, -/obj/structure/machinery/ai_status_display{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "dqX" = ( /obj/structure/table/reinforced/steel, /obj/structure/window/reinforced/crescent, @@ -26619,19 +26706,6 @@ /obj/structure/railing/mapped, /turf/simulated/floor/holofloor/wood, /area/horizon/holodeck/source_chapel) -"duU" = ( -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/door/firedoor/multi_tile, -/obj/structure/disposalpipe/segment, -/obj/effect/floor_decal/industrial/hatch_door/service{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "duY" = ( /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/dark_green{ @@ -26738,6 +26812,15 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/hallway/interior) +"dvx" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 9 + }, +/obj/structure/bed/stool/chair/padded/beige{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "dvy" = ( /obj/structure/shuttle_part/tcfl{ icon_state = "2,0" @@ -28733,6 +28816,16 @@ temperature = 278.15 }, /area/horizon/medical/morgue) +"dIk" = ( +/obj/structure/table/rack, +/obj/random/melee, +/obj/item/airbubble/syndie, +/obj/item/airbubble/syndie, +/obj/item/airbubble/syndie, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/turf/simulated/floor/plating, +/area/shuttle/skipjack) "dIl" = ( /obj/effect/floor_decal/corner/beige{ dir = 9 @@ -28814,14 +28907,6 @@ /obj/structure/lattice/catwalk/indoor/grate, /turf/simulated/floor/plating, /area/supply/dock) -"dIO" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain/green{ - dir = 4 - }, -/obj/structure/machinery/alarm/south, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "dIP" = ( /obj/effect/floor_decal/corner_wide/lime/diagonal, /turf/simulated/floor/tiled/white, @@ -29182,6 +29267,21 @@ /obj/structure/railing/mapped, /turf/simulated/floor/reinforced/airless, /area/horizon/exterior) +"dLu" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "dLw" = ( /obj/structure/extinguisher_cabinet/north, /obj/effect/floor_decal/spline/plain/black{ @@ -29524,27 +29624,6 @@ }, /turf/simulated/floor/wood, /area/horizon/rnd/hallway/secondary) -"dNQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/floor_decal/corner/brown{ - dir = 6 - }, -/obj/effect/floor_decal/industrial/outline_straight/service{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "dNR" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 @@ -29559,12 +29638,6 @@ /obj/item/pen, /turf/simulated/floor/carpet, /area/horizon/command/bridge/meeting_room) -"dOe" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain/green, -/obj/structure/machinery/light/small/floor, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "dOk" = ( /obj/random/maintenance_junk_or_loot, /obj/effect/floor_decal/industrial/warning{ @@ -30124,18 +30197,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/security/warden) -"dSo" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/sink/kitchen{ - dir = 8; - name = "sink"; - pixel_x = 19 - }, -/obj/effect/floor_decal/spline/plain/corner/green, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "dSr" = ( /obj/structure/railing/mapped{ dir = 8 @@ -31857,32 +31918,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor, /area/horizon/maintenance/deck_3/aft/port) -"edH" = ( -/obj/item/reagent_containers/food/condiment/shaker/peppermill{ - pixel_x = 3; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/condiment/shaker/salt{ - pixel_y = 9; - pixel_x = 8 - }, -/obj/structure/table/wood/gamblingtable, -/obj/structure/machinery/power/outlet{ - pixel_y = 3 - }, -/obj/item/flame/candle{ - pixel_x = -8; - pixel_y = 9 - }, -/obj/item/flame/candle{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 10 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "edI" = ( /obj/structure/machinery/light{ dir = 4 @@ -32002,6 +32037,16 @@ }, /turf/simulated/floor/tiled, /area/horizon/security/hallway) +"eew" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain{ + dir = 1 + }, +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "eez" = ( /obj/structure/coatrack{ pixel_x = -10; @@ -32859,6 +32904,25 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/service/hydroponics/garden) +"ekl" = ( +/obj/structure/table/wood, +/obj/structure/machinery/power/outlet{ + pixel_y = 3 + }, +/obj/item/flame/candle{ + pixel_x = 7; + pixel_y = 11 + }, +/obj/random/pottedplant_small{ + pixel_x = 8; + pixel_y = -10 + }, +/obj/item/flame/candle{ + pixel_x = 3; + pixel_y = 11 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "eko" = ( /obj/effect/landmark{ name = "raiderstart" @@ -33961,21 +34025,6 @@ }, /turf/unsimulated/floor/wood, /area/antag/raider) -"erE" = ( -/obj/structure/table/stone/marble, -/obj/item/storage/box/large/produce{ - pixel_x = -1; - pixel_y = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/item/reagent_containers/food/condiment/sugar{ - pixel_x = -5; - pixel_y = -3 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/kitchen) "erI" = ( /obj/effect/shuttle_landmark/escape_pod/transit/pod4, /turf/space/transit/east, @@ -34126,6 +34175,10 @@ /obj/structure/machinery/alarm/east, /turf/simulated/floor/tiled/white, /area/horizon/storage/eva/expedition) +"esH" = ( +/obj/structure/machinery/vending/dinnerware/bar, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/bar) "esK" = ( /obj/structure/lattice, /obj/structure/platform/ledge{ @@ -34177,14 +34230,6 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/rnd/xenobiology/xenoflora) -"etb" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain/green, -/obj/structure/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "etd" = ( /obj/structure/machinery/light_switch/south, /obj/effect/floor_decal/corner/brown{ @@ -35677,23 +35722,6 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/weapons/grauwolf) -"eDG" = ( -/obj/structure/disposalpipe/segment{ - icon_state = "pipe-c" - }, -/obj/structure/sink/kitchen{ - dir = 8; - name = "sink"; - pixel_x = 21 - }, -/obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/bar) "eDP" = ( /obj/structure/cable{ icon_state = "4-8" @@ -36986,6 +37014,13 @@ /obj/effect/floor_decal/industrial/outline/emergency_closet, /turf/simulated/floor/tiled, /area/horizon/hangar/operations) +"eMu" = ( +/obj/structure/machinery/atmospherics/unary/vent_pump/on, +/obj/effect/floor_decal/corner/dark_green/full{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/bar) "eMv" = ( /obj/effect/floor_decal/industrial/warning/corner{ dir = 4 @@ -37637,6 +37672,25 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/rnd/xenoarch/storage) +"eRx" = ( +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/obj/structure/cable/green{ + icon_state = "1-8" + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "eRy" = ( /obj/structure/table/steel, /turf/simulated/floor/plating, @@ -38531,24 +38585,6 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/carpet/rubber, /area/horizon/engineering/locker_room) -"eWQ" = ( -/obj/item/stack/cable_coil{ - pixel_x = -6 - }, -/obj/structure/table/steel, -/obj/effect/floor_decal/spline/plain/brown{ - dir = 4 - }, -/obj/structure/machinery/recharger{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/robotanalyzer{ - pixel_y = 5; - pixel_x = 3 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/operations/machinist) "eWU" = ( /obj/structure/machinery/portable_atmospherics/canister/oxygen, /turf/unsimulated/floor{ @@ -39278,17 +39314,6 @@ /obj/structure/cable/yellow, /turf/simulated/floor/plating, /area/horizon/engineering/reactor/supermatter/mainchamber) -"fcP" = ( -/obj/structure/machinery/power/apc/north, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 9 - }, -/obj/structure/cable/green{ - icon_state = "0-2" - }, -/obj/structure/bed/stool/chair/sofa/right/beige, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "fdc" = ( /obj/structure/machinery/button/remote/airlock{ dir = 8; @@ -39301,13 +39326,6 @@ /obj/structure/machinery/light_switch/west, /turf/simulated/floor/tiled/freezer, /area/horizon/medical/washroom) -"fdd" = ( -/obj/structure/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/floor_decal/corner/dark_green/full{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/bar) "fde" = ( /obj/structure/machinery/chem_master{ dir = 4 @@ -39696,11 +39714,6 @@ /obj/structure/machinery/power/radial_floodlight, /turf/simulated/floor/carpet/rubber, /area/horizon/engineering/storage_hard/aft) -"feW" = ( -/obj/effect/floor_decal/industrial/hatch/firefighting_closet, -/obj/structure/closet/firecloset/full, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "ffl" = ( /obj/structure/machinery/disposal/small/south, /obj/structure/disposalpipe/trunk, @@ -39929,26 +39942,6 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/carpet/rubber, /area/horizon/medical/pharmacy) -"fgw" = ( -/obj/structure/cable/green{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/effect/floor_decal/corner/brown{ - dir = 9 - }, -/obj/structure/machinery/light/floor{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "fgy" = ( /obj/effect/floor_decal/industrial/outline/grey, /obj/effect/decal/cleanable/dirt, @@ -40749,6 +40742,22 @@ }, /turf/unsimulated/floor, /area/antag/mercenary) +"fmQ" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain/corner{ + dir = 4 + }, +/obj/structure/sink{ + pixel_y = 22 + }, +/obj/structure/mirror{ + pixel_y = 36 + }, +/obj/effect/floor_decal/spline/plain/corner{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "fmW" = ( /obj/effect/floor_decal/industrial/warning{ dir = 6 @@ -40797,27 +40806,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/hallway/interior) -"fng" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/light/floor{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/hallway/primary/deck_2/fore) "fnk" = ( /obj/effect/floor_decal/corner/mauve{ dir = 5 @@ -41710,6 +41698,24 @@ }, /turf/simulated/floor/holofloor/tiled/dark, /area/horizon/holodeck/source_boxingcourt) +"fsG" = ( +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/platform_stairs/full{ + dir = 4 + }, +/obj/structure/platform{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "fsO" = ( /obj/structure/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 @@ -42186,6 +42192,20 @@ /obj/structure/machinery/vending/zora, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/hallway/fore) +"fxd" = ( +/obj/effect/floor_decal/spline/fancy/wood/corner, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/obj/structure/machinery/light/small/floor, +/obj/structure/cable/green{ + icon_state = "2-4" + }, +/obj/structure/disposalpipe/segment{ + icon_state = "pipe-c" + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "fxe" = ( /obj/effect/floor_decal/corner/brown{ dir = 10 @@ -43322,10 +43342,6 @@ /obj/structure/table/standard, /turf/unsimulated/floor/plating, /area/centcom/specops) -"fFs" = ( -/obj/structure/machinery/hologram/holopad, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "fFz" = ( /obj/effect/floor_decal/corner/dark_green{ dir = 5 @@ -43743,6 +43759,24 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/medical/gen_treatment) +"fIx" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/closet/walllocker/medical/firstaid{ + pixel_x = -32 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/corner/brown{ + dir = 9 + }, +/obj/effect/floor_decal/spline/plain/green{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "fIA" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -45082,13 +45116,6 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/shuttle/intrepid/medical) -"fRz" = ( -/obj/structure/sign/radshield{ - dir = 4; - pixel_y = -3 - }, -/turf/simulated/wall, -/area/horizon/crew/washroom/deck_2) "fRB" = ( /obj/structure/machinery/alarm/north, /obj/item/material/shard{ @@ -45175,15 +45202,6 @@ }, /turf/simulated/floor/wood, /area/horizon/crew/lounge) -"fSj" = ( -/obj/effect/floor_decal/corner/brown{ - dir = 6 - }, -/obj/effect/floor_decal/industrial/outline_straight/service{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "fSk" = ( /obj/structure/table/wood, /obj/random/pottedplant_small{ @@ -47520,15 +47538,6 @@ "gip" = ( /turf/simulated/wall/r_wall, /area/horizon/operations/secure_ammunition_storage) -"giv" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 7 - }, -/obj/structure/bed/stool/chair/padded/black{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "giw" = ( /obj/structure/table/reinforced/steel, /obj/structure/machinery/button/remote/blast_door{ @@ -47643,6 +47652,15 @@ name = "staircase" }, /area/centcom/spawning) +"gje" = ( +/obj/effect/floor_decal/corner/brown{ + dir = 6 + }, +/obj/effect/floor_decal/industrial/outline_straight/service{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "gjf" = ( /obj/structure/machinery/computer/shuttle_control/specops{ dir = 1 @@ -48353,15 +48371,6 @@ }, /turf/unsimulated/floor, /area/antag/mercenary) -"gnL" = ( -/obj/structure/platform_deco{ - dir = 8 - }, -/obj/effect/floor_decal/spline/plain/green{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "gnM" = ( /obj/structure/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/floor_decal/spline/plain/black{ @@ -48992,16 +49001,6 @@ /obj/effect/decal/cleanable/vomit, /turf/unsimulated/floor, /area/antag/raider) -"grl" = ( -/obj/effect/floor_decal/spline/fancy/wood, -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "gro" = ( /obj/effect/floor_decal/spline/fancy/wood, /obj/structure/cult/tome{ @@ -49523,13 +49522,6 @@ name = "mossy grass" }, /area/horizon/holodeck/source_konyang) -"gvd" = ( -/obj/structure/sign/radshield{ - dir = 8; - pixel_y = -3 - }, -/turf/simulated/wall, -/area/horizon/crew/washroom/deck_2) "gvf" = ( /obj/effect/floor_decal/industrial/hatch/yellow, /obj/structure/machinery/vending/coffee, @@ -49652,26 +49644,6 @@ }, /turf/simulated/floor, /area/horizon/maintenance/deck_3/security/port) -"gvS" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/shaker/salt{ - pixel_x = -7; - pixel_y = -8 - }, -/obj/item/reagent_containers/food/condiment/shaker/peppermill{ - pixel_x = -1; - pixel_y = -8 - }, -/obj/item/paper_bin{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 5 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "gvV" = ( /obj/structure/machinery/door/firedoor{ req_one_access = list(24,11,67,73); @@ -50039,21 +50011,6 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/rnd/xenobiology/xenoflora) -"gyk" = ( -/obj/structure/cable/green{ - icon_state = "1-4" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 6 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "gyl" = ( /obj/effect/floor_decal/corner/dark_green{ dir = 10 @@ -50276,6 +50233,18 @@ /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_1/main/starboard) +"gAc" = ( +/obj/structure/machinery/holosign/service/kitchen{ + pixel_y = -32; + id = "kitchen" + }, +/obj/item/lore_radio{ + pixel_y = 4; + pixel_x = 2 + }, +/obj/structure/table/fancy/black, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "gAf" = ( /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -50436,6 +50405,13 @@ /obj/effect/shuttle_landmark/escape_pod/start/pod4, /turf/simulated/floor/shuttle/dark_blue, /area/horizon/shuttle/escape_pod/pod4) +"gAZ" = ( +/obj/structure/sign/flag/idris{ + pixel_y = 32 + }, +/obj/structure/machinery/vending/quick_e_meals, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "gBd" = ( /obj/effect/floor_decal/corner/white{ dir = 5 @@ -50539,13 +50515,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/command/heads/hos) -"gBG" = ( -/obj/structure/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/floor_decal/spline/fancy/wood/corner, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "gBH" = ( /obj/structure/table/reinforced/steel, /obj/structure/machinery/door/window/brigdoor/southleft{ @@ -50870,6 +50839,19 @@ "gEq" = ( /turf/simulated/floor/tiled/ramp/bottom, /area/shuttle/mercenary) +"gEy" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "gEA" = ( /obj/effect/floor_decal/industrial/warning{ dir = 5 @@ -51426,13 +51408,6 @@ }, /turf/simulated/floor/tiled/full, /area/horizon/command/bridge/minibar) -"gHP" = ( -/obj/structure/table/reinforced/steel, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar/rescue_axe/tactical, -/obj/item/crowbar/rescue_axe/tactical, -/turf/unsimulated/floor/monotile, -/area/antag/burglar) "gHX" = ( /obj/structure/railing/mapped{ dir = 8 @@ -52321,15 +52296,6 @@ }, /turf/simulated/floor, /area/horizon/command/bridge/aibunker) -"gOd" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 9 - }, -/obj/structure/bed/stool/chair/padded/beige{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "gOh" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -53045,6 +53011,24 @@ }, /turf/unsimulated/floor, /area/centcom/evac) +"gTI" = ( +/obj/item/stack/cable_coil{ + pixel_x = -6 + }, +/obj/structure/table/steel, +/obj/effect/floor_decal/spline/plain/brown{ + dir = 4 + }, +/obj/structure/machinery/recharger{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/robotanalyzer{ + pixel_y = 5; + pixel_x = 3 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/operations/machinist) "gTL" = ( /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ @@ -53763,23 +53747,6 @@ }, /turf/simulated/floor/carpet/art, /area/horizon/crew/lounge) -"gYg" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - icon_state = "pipe-c" - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/floor_decal/spline/plain/green, -/obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "gYk" = ( /obj/structure/window/reinforced{ dir = 8 @@ -54419,6 +54386,63 @@ }, /turf/simulated/floor/marble/dark, /area/horizon/holodeck/source_trinary) +"hcX" = ( +/obj/structure/table/rack, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/item/material/knife/tacknife{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/material/knife/tacknife{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/material/knife/tacknife{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/material/knife/tacknife{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/melee/baton/stunrod{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/melee/baton/stunrod{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/melee/baton/stunrod{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/melee/baton/stunrod{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/shield/energy{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/item/shield/energy{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/item/shield/energy{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/item/shield/energy{ + pixel_x = -8; + pixel_y = 7 + }, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/turf/unsimulated/floor, +/area/antag/mercenary) "hdc" = ( /obj/structure/bed/handrail{ dir = 8 @@ -55377,25 +55401,6 @@ /obj/structure/lattice/catwalk/indoor/grate, /turf/simulated/floor/plating, /area/horizon/hallway/primary/deck_2/central) -"hjj" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/floor_decal/corner/brown{ - dir = 9 - }, -/obj/structure/machinery/light/floor{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "hjl" = ( /obj/structure/sign/waste_station{ pixel_y = 32 @@ -56377,6 +56382,20 @@ /obj/structure/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/horizon/operations/break_room) +"hoQ" = ( +/obj/effect/floor_decal/corner/dark_green/full{ + dir = 1 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/machinery/atm{ + dir = 1; + pixel_y = 28; + pixel_x = 2 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "hoT" = ( /obj/structure/bed/stool/chair/padded/blue{ dir = 4 @@ -56750,18 +56769,6 @@ }, /turf/simulated/floor, /area/horizon/maintenance/deck_3/aft/holodeck) -"hrz" = ( -/obj/structure/platform{ - dir = 4 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 10 - }, -/obj/structure/machinery/light/floor{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "hrA" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -58660,6 +58667,13 @@ icon_state = "0,2" }, /area/shuttle/legion) +"hDo" = ( +/obj/structure/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/floor_decal/spline/fancy/wood/corner, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "hDp" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -58879,6 +58893,19 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/service/kitchen) +"hEC" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 6 + }, +/obj/structure/machinery/computer/guestpass{ + pixel_y = 27; + pixel_x = -2 + }, +/obj/structure/bed/stool/chair/padded/red{ + dir = 8 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "hED" = ( /obj/structure/cable{ icon_state = "1-2" @@ -59277,6 +59304,27 @@ /obj/effect/floor_decal/industrial/hatch/red, /turf/simulated/floor/tiled/dark/full, /area/horizon/security/armoury) +"hHh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/effect/floor_decal/corner/brown{ + dir = 6 + }, +/obj/effect/floor_decal/industrial/outline_straight/service{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "hHl" = ( /obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 @@ -59453,6 +59501,19 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/reactor/supermatter/mainchamber) +"hIp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/door/firedoor, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/effect/floor_decal/industrial/hatch_door/service{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/hallway/primary/deck_2/fore) "hIy" = ( /obj/structure/machinery/atmospherics/pipe/simple/visible/black, /obj/structure/machinery/atmospherics/pipe/simple/visible/cyan{ @@ -60245,6 +60306,15 @@ /obj/random/maintenance_junk_or_loot, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_1/main/starboard) +"hNL" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/obj/structure/platform_deco{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "hNR" = ( /obj/effect/floor_decal/corner_wide/yellow/full{ dir = 4 @@ -61696,21 +61766,6 @@ /obj/structure/machinery/power/apc/super/critical/north, /turf/simulated/floor/tiled, /area/horizon/engineering/bluespace_drive) -"hYP" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "hYR" = ( /obj/effect/decal/fake_object{ dir = 4; @@ -64033,6 +64088,15 @@ /obj/structure/railing/mapped, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/reactor/indra/mainchamber) +"ioi" = ( +/obj/structure/machinery/media/jukebox/audioconsole{ + anchored = 1 + }, +/obj/structure/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "ioj" = ( /obj/structure/disposalpipe/segment{ icon_state = "pipe-c" @@ -65974,6 +66038,11 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/storage_hard/aft) +"iAJ" = ( +/obj/effect/floor_decal/industrial/warning, +/obj/item/hullbeacon/red, +/turf/simulated/floor/reinforced/airless, +/area/horizon/exterior) "iAO" = ( /obj/structure/sign/vacuum, /turf/unsimulated/wall/darkshuttlewall, @@ -66168,6 +66237,13 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled, /area/horizon/service/custodial) +"iBU" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/platform_deco, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "iBV" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -66300,25 +66376,6 @@ }, /turf/unsimulated/floor/wood, /area/antag/actor) -"iCV" = ( -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" - }, -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "iDd" = ( /obj/effect/floor_decal/corner/lime{ dir = 10 @@ -66438,28 +66495,6 @@ /obj/structure/machinery/light_switch/south, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/storage_hard/aft) -"iDJ" = ( -/obj/effect/floor_decal/corner/dark_green/full{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/machinery/camera/network/service{ - c_tag = "Service - Mess Hall 4"; - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - icon_state = "pipe-c" - }, -/obj/effect/floor_decal/corner/dark_green/full{ - dir = 4 - }, -/obj/effect/floor_decal/industrial/outline_straight/service, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "iDV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -66898,13 +66933,6 @@ }, /turf/simulated/floor/marble/dark, /area/horizon/holodeck/source_luceism) -"iHm" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 5 - }, -/obj/structure/machinery/smartfridge/drinks, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/bar) "iHu" = ( /obj/structure/closet/crate/freezer/rations, /obj/effect/floor_decal/industrial/outline/blue, @@ -67747,6 +67775,16 @@ "iNc" = ( /turf/unsimulated/floor/freezer, /area/antag/mercenary) +"iNe" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/machinery/disposal/small/west, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/hallway/primary/deck_2/fore) "iNf" = ( /obj/structure/bed/stool/chair/shuttle{ dir = 4 @@ -68252,11 +68290,32 @@ /obj/effect/floor_decal/industrial/outline/grey, /turf/simulated/floor/plating, /area/horizon/hangar/auxiliary) -"iQk" = ( -/obj/structure/table/stone/marble, -/obj/effect/floor_decal/industrial/warning/corner, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/bar) +"iQl" = ( +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ + pixel_x = 3; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/shaker/salt{ + pixel_y = 9; + pixel_x = 8 + }, +/obj/structure/table/wood/gamblingtable, +/obj/structure/machinery/power/outlet{ + pixel_y = 3 + }, +/obj/item/flame/candle{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/item/flame/candle{ + pixel_x = -4; + pixel_y = 9 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 10 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "iQp" = ( /obj/structure/bed/stool/chair/folding{ dir = 4 @@ -68575,14 +68634,6 @@ /obj/structure/bed/stool/padded/green, /turf/simulated/floor/tiled/white, /area/centcom/shared_dream) -"iSz" = ( -/obj/structure/machinery/disposal, -/obj/effect/floor_decal/industrial/outline/service, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "iSC" = ( /obj/effect/floor_decal/corner_wide/green{ dir = 5 @@ -69284,6 +69335,13 @@ /obj/structure/shuttle/engine/propulsion/burst/left, /turf/unsimulated/floor/plating, /area/shuttle/skipjack) +"iXH" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "iXO" = ( /obj/structure/machinery/atmospherics/unary/vent_pump{ icon_state = "map_vent_out"; @@ -69471,6 +69529,14 @@ /obj/item/modular_computer/laptop/preset/supply/om, /turf/simulated/floor/carpet, /area/horizon/command/heads/om) +"iYF" = ( +/obj/structure/table/wood, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 10 + }, +/obj/item/storage/box/tcaf_pamphlet, +/turf/unsimulated/floor, +/area/centcom/legion/hangar5) "iYG" = ( /obj/structure/machinery/alarm/south, /turf/simulated/floor/plating, @@ -70394,6 +70460,26 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/service/kitchen) +"jfj" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 6 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/light/small/floor, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 4 + }, +/obj/structure/cable/green{ + icon_state = "1-4" + }, +/turf/simulated/floor/wood, +/area/horizon/service/bar) "jfk" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -70874,27 +70960,6 @@ }, /turf/simulated/floor/reinforced/airless, /area/horizon/exterior/no_shields) -"jia" = ( -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/structure/cable/green{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/segment{ - icon_state = "pipe-c" - }, -/obj/effect/floor_decal/industrial/outline_straight/service{ - dir = 8 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 5 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/bar) "jib" = ( /obj/structure/shuttle_part/mercenary/small{ icon_state = "4,1" @@ -71519,6 +71584,26 @@ }, /turf/simulated/floor/tiled, /area/horizon/hangar/intrepid/interstitial) +"jlR" = ( +/obj/structure/cable/green{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/obj/effect/floor_decal/corner/brown{ + dir = 9 + }, +/obj/structure/machinery/light/floor{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "jlT" = ( /obj/structure/machinery/light/small, /obj/structure/machinery/papershredder{ @@ -71810,24 +71895,6 @@ }, /turf/unsimulated/floor/plating, /area/centcom/spawning) -"jnM" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/floor_decal/spline/plain/green, -/obj/structure/machinery/light/small/floor, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "jnO" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -71899,6 +71966,9 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/engineering/break_room) +"jnX" = ( +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "joj" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -72297,6 +72367,16 @@ /obj/structure/machinery/door/firedoor, /turf/simulated/floor/tiled/dark/full, /area/horizon/rnd/hallway/secondary) +"jrf" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 1 + }, +/obj/structure/machinery/status_display{ + pixel_y = 32 + }, +/obj/structure/bed/stool/chair/sofa/left/beige, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "jrg" = ( /obj/effect/floor_decal/industrial/hatch/yellow, /obj/structure/machinery/recharge_station, @@ -73601,6 +73681,13 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/weapons/grauwolf) +"jzI" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 5 + }, +/obj/structure/machinery/smartfridge/drinks, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/bar) "jzJ" = ( /obj/structure/machinery/holosign/service/kitchen{ id = "kitchen" @@ -73936,6 +74023,19 @@ }, /turf/simulated/floor/marble, /area/horizon/holodeck/source_trinary) +"jCe" = ( +/obj/structure/bed/stool/chair/office/dark{ + dir = 8 + }, +/obj/structure/machinery/camera/network/service{ + c_tag = "Service - Mess Hall 1"; + dir = 1 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 10 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "jCh" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 5 @@ -74028,6 +74128,13 @@ /obj/random/maintenance_junk_or_loot, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_2/research) +"jCE" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/machinery/firealarm/east, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "jCF" = ( /obj/structure/lattice, /turf/simulated/open, @@ -74347,20 +74454,6 @@ /obj/structure/machinery/atmospherics/pipe/simple/hidden, /turf/simulated/floor/tiled, /area/horizon/security/brig) -"jFk" = ( -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/sortjunction/flipped{ - sortType = "Hydroponics" - }, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "jFo" = ( /obj/effect/floor_decal/corner/black{ dir = 6 @@ -74967,24 +75060,6 @@ /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/dark/full, /area/horizon/operations/machinist) -"jJE" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) -"jJG" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/structure/bed/stool/chair/padded/beige{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "jJP" = ( /obj/structure/grille, /obj/structure/window/shuttle/scc_space_ship/cardinal, @@ -75011,6 +75086,16 @@ /obj/effect/decal/cleanable/dirt, /turf/unsimulated/floor, /area/antag/jockey) +"jJR" = ( +/obj/effect/floor_decal/spline/fancy/wood, +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 4 + }, +/obj/structure/cable/green{ + icon_state = "1-8" + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "jJU" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -75451,25 +75536,6 @@ /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor, /area/horizon/maintenance/deck_3/aft/starboard) -"jNo" = ( -/obj/structure/table/wood, -/obj/structure/machinery/power/outlet{ - pixel_y = 3 - }, -/obj/item/flame/candle{ - pixel_x = 7; - pixel_y = 11 - }, -/obj/random/pottedplant_small{ - pixel_x = 8; - pixel_y = -10 - }, -/obj/item/flame/candle{ - pixel_x = 3; - pixel_y = 11 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "jNp" = ( /obj/random/dirt_75, /obj/structure/lattice/catwalk/indoor/grate/dark, @@ -75927,6 +75993,22 @@ /obj/structure/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/dark, /area/horizon/engineering/atmos) +"jPR" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/structure/mirror{ + pixel_y = 36 + }, +/obj/structure/sink{ + pixel_y = 22 + }, +/obj/effect/floor_decal/spline/plain/corner{ + dir = 4 + }, +/obj/effect/floor_decal/spline/plain/corner{ + dir = 1 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "jPS" = ( /obj/random/contraband, /obj/random/maintenance_junk_or_loot, @@ -76062,24 +76144,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_3/security/port) -"jQN" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/closet/walllocker/medical/firstaid{ - pixel_x = -32 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/corner/brown{ - dir = 9 - }, -/obj/effect/floor_decal/spline/plain/green{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "jQT" = ( /obj/structure/machinery/atmospherics/pipe/manifold/hidden/black, /obj/structure/machinery/light, @@ -76172,12 +76236,6 @@ icon_state = "dark_preview" }, /area/centcom/holding) -"jRy" = ( -/obj/effect/floor_decal/industrial/hatch_door/service{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "jRz" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/corner/dark_green/diagonal, @@ -76465,20 +76523,6 @@ icon_state = "dark_preview" }, /area/centcom/specops) -"jTm" = ( -/obj/effect/floor_decal/corner/dark_green/full{ - dir = 1 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/structure/machinery/atm{ - dir = 1; - pixel_y = 28; - pixel_x = 2 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "jTp" = ( /turf/simulated/floor/marble/dark, /area/horizon/holodeck/source_tribunal) @@ -77428,6 +77472,27 @@ icon_state = "dark_preview" }, /area/antag/mercenary) +"jZQ" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/obj/structure/cable/green{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/cable/green{ + icon_state = "1-8" + }, +/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/supply, +/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "jZS" = ( /obj/structure/machinery/porta_turret, /obj/structure/cable/green{ @@ -77765,14 +77830,6 @@ }, /turf/simulated/floor/holofloor/tiled, /area/horizon/holodeck/source_emptycourt) -"kcf" = ( -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/structure/machinery/vending/dinnerware/metal, -/obj/effect/floor_decal/industrial/hatch/service, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "kch" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -78046,6 +78103,16 @@ }, /turf/simulated/floor/tiled, /area/horizon/hangar/auxiliary) +"kdw" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain{ + dir = 1 + }, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "kdC" = ( /obj/structure/grille, /obj/structure/machinery/door/firedoor, @@ -80022,25 +80089,6 @@ /obj/effect/map_effect/window_spawner/full/reinforced/indestructible, /turf/unsimulated/floor/dark_monotile, /area/antag/actor) -"kqE" = ( -/obj/structure/table/stone/marble, -/obj/structure/machinery/chemical_dispenser/coffeemaster/full{ - pixel_y = 19 - }, -/obj/structure/machinery/controlhub/bar{ - pixel_x = -5; - pixel_y = -8 - }, -/obj/structure/machinery/light_switch/idris{ - dir = 10; - pixel_x = 10; - pixel_y = -1 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 5 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/bar) "kqK" = ( /obj/structure/plasticflaps/airtight, /obj/structure/machinery/door/firedoor, @@ -80103,6 +80151,10 @@ dir = 4 }, /area/horizon/hangar/auxiliary) +"kqZ" = ( +/obj/structure/machinery/hologram/holopad/long_range, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "krb" = ( /obj/effect/floor_decal/industrial/warning{ dir = 9 @@ -80268,13 +80320,12 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/medical/pharmacy) -"ksB" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) +"ksC" = ( +/obj/effect/floor_decal/industrial/hatch/service, +/obj/item/radio/intercom/west, +/obj/structure/machinery/vending/snack/horizon, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/hallway/primary/deck_2/fore) "ksI" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -81898,6 +81949,28 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_1/hangar/port) +"kBr" = ( +/obj/effect/floor_decal/corner/dark_green/full{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/machinery/camera/network/service{ + c_tag = "Service - Mess Hall 4"; + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + icon_state = "pipe-c" + }, +/obj/effect/floor_decal/corner/dark_green/full{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/outline_straight/service, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "kBs" = ( /obj/structure/machinery/light{ dir = 4 @@ -81937,25 +82010,6 @@ /obj/effect/map_effect/window_spawner/full/reinforced/firedoor, /turf/simulated/floor/tiled/dark/full, /area/horizon/hallway/primary/deck_2/central) -"kBy" = ( -/obj/structure/platform_deco, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/spline/plain/green{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "kBE" = ( /obj/effect/floor_decal/corner/dark_green{ dir = 9 @@ -83773,16 +83827,6 @@ /obj/structure/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/white, /area/horizon/rnd/test_range) -"kNc" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 1 - }, -/obj/structure/machinery/status_display{ - pixel_y = 32 - }, -/obj/structure/bed/stool/chair/sofa/left/beige, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "kNd" = ( /obj/random/dirt_75, /obj/item/trash/cigbutt/cigarbutt{ @@ -84371,13 +84415,6 @@ }, /turf/simulated/floor/tiled/full, /area/horizon/command/bridge/upperdeck) -"kSa" = ( -/obj/structure/machinery/light/floor, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 6 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "kSd" = ( /obj/effect/floor_decal/corner/red{ dir = 8 @@ -85617,6 +85654,15 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/security/autopsy_laboratory) +"law" = ( +/obj/effect/floor_decal/spline/fancy/wood/cee{ + dir = 4 + }, +/obj/structure/synthesized_instrument/synthesizer/piano{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/bar) "laF" = ( /obj/structure/shuttle_part/tcfl{ icon_state = "3,6" @@ -85968,6 +86014,13 @@ }, /turf/simulated/floor/plating, /area/horizon/shuttle/canary) +"lcM" = ( +/obj/structure/platform/cutout, +/obj/structure/platform_stairs/full/east_west_cap{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "lcN" = ( /obj/random/contraband, /obj/random/junk, @@ -86293,17 +86346,6 @@ /obj/effect/floor_decal/industrial/hatch/yellow, /turf/unsimulated/floor, /area/centcom/legion) -"lew" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 10 - }, -/obj/effect/floor_decal/industrial/outline_straight/service, -/obj/effect/floor_decal/industrial/arrow/service, -/obj/structure/platform{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "lex" = ( /obj/effect/step_trigger/thrower/shuttle/west, /turf/unsimulated/mineral/asteroid, @@ -87255,6 +87297,25 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/medical/icu) +"lkM" = ( +/obj/structure/platform_deco, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/effect/floor_decal/spline/plain/green{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "lkN" = ( /obj/structure/flora/ausbushes/sparsegrass, /obj/item/radio/intercom/west, @@ -87625,6 +87686,13 @@ }, /turf/simulated/floor/tiled, /area/horizon/engineering/bluespace_drive) +"lnC" = ( +/obj/structure/sign/radshield{ + dir = 4; + pixel_y = -3 + }, +/turf/simulated/wall, +/area/horizon/crew/washroom/deck_2) "lnL" = ( /obj/structure/machinery/portable_atmospherics/canister/oxygen, /obj/item/tank/air, @@ -88116,6 +88184,16 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_2/wing/starboard/near) +"lqJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 5 + }, +/obj/structure/machinery/light/small/floor, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "lqK" = ( /obj/effect/floor_decal/corner_wide/paleblue{ dir = 5 @@ -88450,19 +88528,6 @@ icon_state = "dark_preview" }, /area/centcom/holding) -"lsE" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/floor_decal/spline/plain/corner/green{ - dir = 1 - }, -/obj/structure/machinery/disposal/small/west, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "lsM" = ( /obj/effect/floor_decal/corner/red/diagonal, /obj/effect/floor_decal/spline/fancy, @@ -88603,19 +88668,6 @@ /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/main/starboard) -"ltJ" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "ltK" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/machinery/atmospherics/pipe/simple/hidden/aux{ @@ -88841,6 +88893,14 @@ icon_state = "wood" }, /area/antag/raider) +"luY" = ( +/obj/effect/floor_decal/industrial/outline/service, +/obj/structure/machinery/washing_machine, +/obj/structure/machinery/status_display{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/full, +/area/horizon/crew/washroom/deck_2) "lvg" = ( /obj/structure/coatrack{ pixel_x = 7; @@ -88863,15 +88923,6 @@ /obj/random/dirt_75, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/port/far) -"lvk" = ( -/obj/structure/machinery/media/jukebox/audioconsole{ - anchored = 1 - }, -/obj/structure/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "lvs" = ( /obj/structure/machinery/computer/shuttle_control/multi/legion, /turf/unsimulated/floor{ @@ -89628,15 +89679,6 @@ "lAZ" = ( /turf/simulated/wall/r_wall, /area/horizon/maintenance/deck_1/atmos_crosser) -"lBe" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/bed/stool/chair/padded/black{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "lBr" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -91099,10 +91141,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/operations/office) -"lJW" = ( -/obj/effect/floor_decal/spline/fancy/wood, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "lJX" = ( /obj/item/storage/slide_projector, /obj/structure/table/reinforced/glass, @@ -91592,16 +91630,6 @@ /obj/structure/machinery/light_switch/south, /turf/simulated/floor/tiled/white, /area/horizon/operations/break_room) -"lNs" = ( -/obj/structure/table/rack, -/obj/random/melee, -/obj/item/airbubble/syndie, -/obj/item/airbubble/syndie, -/obj/item/airbubble/syndie, -/obj/item/crowbar/rescue_axe/tactical, -/obj/item/crowbar/rescue_axe/tactical, -/turf/simulated/floor/plating, -/area/shuttle/skipjack) "lNt" = ( /obj/structure/sign/nosmoking_1{ pixel_y = 32 @@ -91922,6 +91950,18 @@ }, /turf/simulated/floor/wood/maple, /area/horizon/holodeck/source_cafe) +"lQI" = ( +/obj/effect/floor_decal/corner/dark_green/full, +/obj/effect/floor_decal/industrial/outline_straight/service, +/obj/effect/floor_decal/industrial/arrow/service, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "lQM" = ( /obj/structure/table/standard, /obj/structure/machinery/requests_console/west{ @@ -92008,15 +92048,6 @@ /obj/structure/stairs_lower/stairs_upper, /turf/simulated/wall/r_wall, /area/horizon/rnd/xenoarch/atrium) -"lRD" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/structure/cable/green, -/obj/structure/machinery/power/apc/south, -/obj/effect/floor_decal/spline/plain/green{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "lRF" = ( /obj/effect/step_trigger/thrower/shuttle/southeast, /turf/space/transit/east, @@ -92086,16 +92117,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/hallway/primary/deck_3/central) -"lSz" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain{ - dir = 1 - }, -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "lSB" = ( /obj/structure/reagent_dispensers/extinguisher, /obj/effect/floor_decal/corner/red/diagonal, @@ -92748,6 +92769,18 @@ }, /turf/simulated/floor/tiled/dark, /area/shuttle/legion) +"lXQ" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/sink/kitchen{ + dir = 8; + name = "sink"; + pixel_x = 19 + }, +/obj/effect/floor_decal/spline/plain/corner/green, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "lYc" = ( /obj/structure/grille, /obj/structure/window/shuttle/scc_space_ship, @@ -92877,6 +92910,15 @@ }, /turf/simulated/floor/wood, /area/horizon/command/heads/xo) +"lYI" = ( +/obj/structure/platform_deco{ + dir = 4 + }, +/obj/effect/floor_decal/spline/plain/green{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "lYJ" = ( /obj/effect/floor_decal/corner/dark_green{ dir = 5 @@ -92897,29 +92939,6 @@ }, /turf/simulated/floor/reinforced/airless, /area/horizon/exterior) -"lYR" = ( -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 1 - }, -/obj/structure/machinery/light/small/floor, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "lYS" = ( /obj/item/reagent_containers/glass/beaker/large{ pixel_x = 9; @@ -93480,6 +93499,21 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/rnd/xenoarch/presentation) +"mcc" = ( +/obj/structure/table/stone/marble, +/obj/item/storage/box/large/produce{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/item/reagent_containers/food/condiment/sugar{ + pixel_x = -5; + pixel_y = -3 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/kitchen) "mci" = ( /obj/effect/floor_decal/industrial/warning/corner{ dir = 4 @@ -93876,15 +93910,6 @@ dir = 4 }, /area/horizon/maintenance/deck_1/wing/starboard/far) -"mfc" = ( -/obj/structure/platform_deco{ - dir = 4 - }, -/obj/effect/floor_decal/spline/plain/green{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "mfe" = ( /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_3/aft/starboard/far) @@ -94495,6 +94520,12 @@ }, /turf/simulated/floor/tiled, /area/horizon/engineering/equipment) +"miw" = ( +/obj/structure/bed/stool/chair/wood{ + dir = 8 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "mix" = ( /obj/structure/shuttle_part/ert{ icon_state = "10,2"; @@ -95723,15 +95754,6 @@ /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor/plating, /area/horizon/engineering/atmos/propulsion) -"mrj" = ( -/obj/effect/floor_decal/industrial/hatch/service, -/obj/structure/machinery/vending/mredispenser, -/obj/structure/machinery/camera/network/service{ - c_tag = "Service - Mess Hallway"; - dir = 4 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/hallway/primary/deck_2/fore) "mrl" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -96583,6 +96605,28 @@ }, /turf/simulated/floor/holofloor/tiled, /area/horizon/holodeck/source_battlemonsters) +"mxl" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 7 + }, +/obj/item/flame/candle{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ + pixel_x = -7; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/condiment/shaker/salt{ + pixel_y = 4; + pixel_x = -2 + }, +/obj/structure/machinery/power/outlet{ + pixel_y = 3 + }, +/obj/structure/table/wood, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "mxo" = ( /obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -96699,14 +96743,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/weapons/longbow) -"myg" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/machinery/disposal/airless, -/obj/effect/floor_decal/industrial/outline/service, -/turf/simulated/floor/tiled/full, -/area/horizon/crew/washroom/deck_2) "myn" = ( /obj/structure/disposalpipe/junction/yjunction, /turf/simulated/floor/tiled/white, @@ -97636,6 +97672,15 @@ /obj/random/dirt_75, /turf/simulated/floor/tiled/gunmetal/full, /area/horizon/operations/ship_supply_warehouse) +"mFe" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 7 + }, +/obj/structure/bed/stool/chair/padded/black{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "mFg" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -98247,19 +98292,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/reactor/indra/smes) -"mIs" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "2-8" - }, -/obj/effect/floor_decal/spline/plain/corner/green{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "mIw" = ( /turf/unsimulated/wall/steel, /area/antag/actor) @@ -98507,25 +98539,6 @@ /obj/structure/machinery/light_switch/west, /turf/simulated/floor/tiled/white, /area/horizon/medical/gen_treatment) -"mKo" = ( -/obj/item/robot_parts/r_arm{ - pixel_y = 1; - pixel_x = 10 - }, -/obj/item/portable_whiteboard{ - pixel_y = 2; - pixel_x = -3 - }, -/obj/structure/table/steel, -/obj/effect/floor_decal/spline/plain/brown{ - dir = 1 - }, -/obj/item/storage/toolbox/electrical{ - pixel_y = 12; - pixel_x = -3 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/operations/machinist) "mKp" = ( /obj/effect/floor_decal/corner/dark_blue{ dir = 9 @@ -99111,21 +99124,30 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/rnd/xenobiology/foyer) -"mOr" = ( -/obj/effect/floor_decal/spline/fancy/wood, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "mOs" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/machinery/portable_atmospherics/canister, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/bluespace_drive) +"mOv" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/floor_decal/corner/brown{ + dir = 9 + }, +/obj/structure/machinery/light/floor{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "mOx" = ( /obj/structure/machinery/light, /obj/effect/floor_decal/corner/dark_blue{ @@ -99500,6 +99522,17 @@ /obj/structure/machinery/door/firedoor, /turf/simulated/floor/tiled/dark, /area/horizon/ai/upload) +"mRv" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/machinery/light/small/floor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "mRz" = ( /obj/structure/shuttle_part/mercenary/small{ icon_state = "8,5" @@ -101369,6 +101402,23 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_1/main/port/shortcut) +"ndI" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + icon_state = "pipe-c" + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/effect/floor_decal/spline/plain/green, +/obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "ndK" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -101428,6 +101478,15 @@ }, /turf/simulated/floor/reinforced, /area/horizon/command/bridge/controlroom) +"nej" = ( +/obj/structure/platform{ + dir = 8 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "nem" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -102112,20 +102171,6 @@ /obj/item/clothing/gloves/yellow/specialu, /turf/simulated/floor/tiled/dark, /area/horizon/engineering/storage/tech) -"niH" = ( -/obj/effect/floor_decal/spline/fancy/wood/corner, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/structure/machinery/light/small/floor, -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - icon_state = "pipe-c" - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "niJ" = ( /obj/effect/decal/rolling_fog, /obj/structure/machinery/door/window/holowindoor, @@ -102405,6 +102450,17 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/storage/eva) +"nli" = ( +/obj/structure/machinery/computer/ship/navigation/terminal{ + dir = 4 + }, +/obj/structure/machinery/holosign/service/bar{ + id = "bar"; + pixel_y = -32 + }, +/obj/effect/floor_decal/industrial/outline/service, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "nlj" = ( /obj/effect/floor_decal/industrial/warning/corner{ dir = 1 @@ -104370,18 +104426,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/engineering/bluespace_drive) -"nAk" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/light/floor{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "nAl" = ( /obj/effect/floor_decal/industrial/warning{ dir = 6 @@ -104827,9 +104871,6 @@ }, /turf/simulated/floor/lino, /area/horizon/service/chapel/main) -"nCX" = ( -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "nDc" = ( /obj/structure/machinery/light{ dir = 1 @@ -105538,24 +105579,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_3/security/port) -"nHn" = ( -/obj/effect/floor_decal/corner/grey/diagonal, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/floor_decal/spline/plain/green{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/obj/effect/landmark/start{ - name = "Chef" - }, -/turf/simulated/floor/tiled/white, -/area/horizon/service/kitchen) "nHo" = ( /obj/structure/window/shuttle/unique/scc/scout{ icon_state = "5,3" @@ -105820,22 +105843,6 @@ /obj/structure/table/standard, /turf/simulated/floor/tiled/white, /area/horizon/operations/break_room) -"nJj" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain/corner{ - dir = 4 - }, -/obj/structure/sink{ - pixel_y = 22 - }, -/obj/structure/mirror{ - pixel_y = 36 - }, -/obj/effect/floor_decal/spline/plain/corner{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "nJt" = ( /obj/structure/shuttle_part/ccia{ icon_state = "12,2" @@ -106087,12 +106094,6 @@ "nKs" = ( /turf/simulated/floor/plating, /area/horizon/rnd/eva) -"nKu" = ( -/obj/effect/floor_decal/industrial/hatch/service, -/obj/item/radio/intercom/west, -/obj/structure/machinery/vending/snack/horizon, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/hallway/primary/deck_2/fore) "nKz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -106415,28 +106416,6 @@ /obj/structure/machinery/alarm/north, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/port/nacelle) -"nMW" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 7 - }, -/obj/item/flame/candle{ - pixel_x = 8; - pixel_y = 12 - }, -/obj/item/reagent_containers/food/condiment/shaker/peppermill{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/condiment/shaker/salt{ - pixel_y = 4; - pixel_x = -2 - }, -/obj/structure/machinery/power/outlet{ - pixel_y = 3 - }, -/obj/structure/table/wood, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "nNd" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -107084,6 +107063,23 @@ /obj/structure/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/dark, /area/horizon/service/bar) +"nRP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/hologram/holopad, +/obj/structure/lattice/catwalk/indoor/grate/dark, +/turf/simulated/floor/plating, +/area/horizon/service/mess_hall) "nRR" = ( /obj/structure/filingcabinet/chestdrawer, /turf/simulated/floor/tiled/white, @@ -107315,6 +107311,14 @@ /obj/effect/map_effect/window_spawner/full/reinforced/firedoor, /turf/simulated/floor/tiled/dark/full, /area/horizon/operations/machinist) +"nTD" = ( +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/structure/machinery/vending/dinnerware/metal, +/obj/effect/floor_decal/industrial/hatch/service, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "nTE" = ( /obj/effect/floor_decal/industrial/warning/corner, /obj/effect/floor_decal/industrial/warning, @@ -107506,28 +107510,6 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_3/aft/starboard/far) -"nUS" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/shaker/peppermill{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/reagent_containers/food/condiment/shaker/salt{ - pixel_y = 10; - pixel_x = 10 - }, -/obj/item/flame/candle{ - pixel_x = -3; - pixel_y = 16 - }, -/obj/structure/machinery/power/outlet{ - pixel_y = 3 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "nUX" = ( /obj/effect/floor_decal/corner/mauve{ dir = 6 @@ -108303,6 +108285,21 @@ /obj/structure/machinery/light, /turf/unsimulated/floor/wood, /area/centcom/bar) +"oaW" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "oaZ" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 @@ -108932,6 +108929,15 @@ }, /turf/unsimulated/floor, /area/centcom/legion) +"oeW" = ( +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/bar) "oeZ" = ( /turf/unsimulated/wall/riveted, /area/template_noop) @@ -109239,12 +109245,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/command/bridge/aibunker) -"ogt" = ( -/obj/structure/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "ogv" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -109627,6 +109627,12 @@ /obj/structure/machinery/meter, /turf/simulated/floor/plating, /area/horizon/rnd/xenoarch/atrium) +"oja" = ( +/obj/structure/bed/stool/chair/wood{ + dir = 4 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "ojb" = ( /turf/simulated/wall, /area/horizon/maintenance/deck_2/wing/starboard/nacelle) @@ -109811,34 +109817,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/security/checkpoint) -"okq" = ( -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 4 - }, -/obj/structure/machinery/light/small/floor, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "2-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) -"oks" = ( -/obj/effect/floor_decal/industrial/hatch/service, -/obj/structure/machinery/computer/arcade, -/obj/structure/sign/poster/lore/tcaf{ - pixel_y = 30; - pixel_x = 6 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/bar) "okw" = ( /turf/simulated/wall, /area/horizon/maintenance/substation/wing_port) @@ -109909,6 +109887,30 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/reactor/supermatter/smes) +"okP" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/light/floor{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/outline_straight/service{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "okS" = ( /obj/structure/machinery/atmospherics/portables_connector{ dir = 4 @@ -110087,6 +110089,19 @@ icon_state = "dark_preview" }, /area/centcom/holding) +"omp" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/floor_decal/spline/plain/corner/green{ + dir = 1 + }, +/obj/structure/machinery/disposal/small/west, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "omu" = ( /obj/effect/floor_decal/corner/yellow{ dir = 4 @@ -112117,6 +112132,19 @@ }, /turf/simulated/floor/tiled, /area/horizon/rnd/hallway/secondary) +"ozD" = ( +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/door/firedoor/multi_tile, +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/industrial/hatch_door/service{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "ozQ" = ( /obj/effect/map_effect/window_spawner/full/reinforced/indestructible, /turf/unsimulated/floor/plating, @@ -113034,27 +113062,6 @@ icon_state = "wood" }, /area/centcom/control) -"oFY" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/obj/structure/cable/green{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "oGc" = ( /obj/effect/floor_decal/corner_wide/yellow{ dir = 6 @@ -113074,6 +113081,17 @@ /obj/structure/machinery/hologram/holopad, /turf/simulated/floor/tiled, /area/horizon/service/hydroponics) +"oGe" = ( +/obj/structure/machinery/power/apc/north, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 9 + }, +/obj/structure/cable/green{ + icon_state = "0-2" + }, +/obj/structure/bed/stool/chair/sofa/right/beige, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "oGg" = ( /obj/effect/floor_decal/industrial/warning{ dir = 10 @@ -113231,6 +113249,13 @@ /obj/structure/curtain/open/shower, /turf/simulated/floor/tiled/freezer, /area/horizon/security/washroom) +"oHj" = ( +/obj/structure/machinery/door/firedoor, +/obj/effect/floor_decal/industrial/hatch_door/service{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/hallway/primary/deck_2/fore) "oHl" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -113997,6 +114022,25 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/hangar/intrepid) +"oLO" = ( +/obj/item/robot_parts/r_arm{ + pixel_y = 1; + pixel_x = 10 + }, +/obj/item/portable_whiteboard{ + pixel_y = 2; + pixel_x = -3 + }, +/obj/structure/table/steel, +/obj/effect/floor_decal/spline/plain/brown{ + dir = 1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_y = 12; + pixel_x = -3 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/operations/machinist) "oLV" = ( /obj/structure/railing/mapped, /obj/structure/morgue, @@ -114867,15 +114911,6 @@ /obj/structure/machinery/light_switch/west, /turf/simulated/floor/carpet/rubber, /area/horizon/engineering/reactor/indra/monitoring) -"oRN" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 6 - }, -/obj/structure/bed/stool/chair/padded/black{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "oRO" = ( /obj/structure/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/spline/fancy/wood{ @@ -115998,15 +116033,6 @@ /obj/effect/floor_decal/corner/dark_green, /turf/simulated/floor/tiled, /area/horizon/hallway/primary/deck_3/starboard) -"oYn" = ( -/obj/structure/machinery/vending/wallmed1{ - pixel_y = 30; - req_access = list(110) - }, -/obj/structure/table/stone/marble, -/obj/item/eftpos, -/turf/simulated/floor/tiled/dark, -/area/shuttle/merchant) "oYo" = ( /obj/effect/floor_decal/corner/dark_blue{ dir = 1 @@ -116284,11 +116310,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/crew/fitness/changing) -"pam" = ( -/obj/effect/floor_decal/industrial/warning, -/obj/item/hullbeacon/red, -/turf/simulated/floor/reinforced/airless, -/area/horizon/exterior) "pan" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -116331,29 +116352,6 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/security/checkpoint2) -"pay" = ( -/obj/structure/table/stone/marble, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = 9; - pixel_y = 15 - }, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = 9; - pixel_y = 5 - }, -/obj/structure/machinery/light{ - dir = 4 - }, -/obj/item/reagent_containers/glass/rag/advanced{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/reagent_containers/glass/rag/advanced{ - pixel_x = -4; - pixel_y = -1 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/bar) "paz" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -116361,23 +116359,6 @@ /obj/structure/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/storage_hard/aft) -"paF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/hologram/holopad, -/obj/structure/lattice/catwalk/indoor/grate/dark, -/turf/simulated/floor/plating, -/area/horizon/service/mess_hall) "paI" = ( /obj/structure/disposalpipe/junction{ dir = 1 @@ -119345,6 +119326,26 @@ /obj/effect/floor_decal/industrial/loading/engineering, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/bluespace_drive) +"pvE" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/sortjunction{ + dir = 1; + sortType = "Bar" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/bar) "pvH" = ( /obj/structure/machinery/hologram/holopad, /obj/effect/overmap/visitable/ship/sccv_horizon, @@ -119448,19 +119449,6 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/starboard/far) -"pwt" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/door/firedoor, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/effect/floor_decal/industrial/hatch_door/service{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/hallway/primary/deck_2/fore) "pwv" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -119853,19 +119841,6 @@ }, /turf/simulated/floor/plating, /area/horizon/engineering/atmos/turbine) -"pyL" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "pyM" = ( /obj/structure/machinery/light/small, /obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -119986,15 +119961,6 @@ }, /turf/simulated/open/airless, /area/horizon/exterior) -"pzF" = ( -/obj/structure/platform{ - dir = 8 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "pzG" = ( /obj/structure/bed/stool/chair/padded/blue{ dir = 8 @@ -120462,27 +120428,6 @@ /obj/structure/machinery/door/firedoor, /turf/simulated/floor/tiled/dark/full, /area/horizon/rnd/xenobiology/xenoflora) -"pCx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/platform_stairs/full{ - dir = 8 - }, -/obj/structure/platform{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "pCA" = ( /obj/structure/machinery/vending/zora, /obj/structure/machinery/light{ @@ -121343,6 +121288,13 @@ /obj/structure/lattice/catwalk/indoor/grate, /turf/simulated/floor/plating, /area/horizon/engineering/hallway/fore) +"pIS" = ( +/obj/structure/table/wood, +/obj/structure/machinery/recharger{ + pixel_y = 3 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "pIV" = ( /obj/effect/floor_decal/industrial/outline/grey, /obj/structure/closet/secure_closet/evidence{ @@ -123746,15 +123698,11 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/rnd/xenological) -"pZq" = ( -/obj/structure/machinery/computer/ship/navigation/terminal{ - dir = 4 +"pZo" = ( +/obj/structure/platform/cutout{ + dir = 8 }, -/obj/structure/machinery/holosign/service/bar{ - id = "bar"; - pixel_y = -32 - }, -/obj/effect/floor_decal/industrial/outline/service, +/obj/structure/platform_stairs/full/east_west_cap, /turf/simulated/floor/tiled/dark/full, /area/horizon/service/mess_hall) "pZs" = ( @@ -123984,14 +123932,6 @@ /obj/item/bucket_sensor, /turf/simulated/floor/wood, /area/centcom/shared_dream) -"qbq" = ( -/obj/effect/floor_decal/industrial/outline/service, -/obj/structure/machinery/washing_machine, -/obj/structure/machinery/status_display{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled/full, -/area/horizon/crew/washroom/deck_2) "qbx" = ( /obj/structure/machinery/vending/coffee, /turf/unsimulated/floor{ @@ -124396,6 +124336,16 @@ /obj/effect/map_effect/marker_helper/airlock/exterior, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_1/auxatmos) +"qel" = ( +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 8 + }, +/obj/structure/machinery/light/small/floor, +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "qem" = ( /obj/structure/machinery/door/firedoor, /obj/structure/machinery/door/airlock/maintenance_hatch{ @@ -124823,21 +124773,6 @@ }, /turf/simulated/floor/reinforced/airmix, /area/horizon/engineering/atmos/air) -"qgO" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "qgS" = ( /obj/structure/machinery/door/blast/shutters{ density = 0; @@ -124916,6 +124851,13 @@ /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor, /area/horizon/maintenance/deck_3/aft/port) +"qhx" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/obj/item/hullbeacon/red, +/turf/simulated/floor/reinforced/airless, +/area/horizon/exterior) "qhy" = ( /obj/structure/sign/securearea, /turf/simulated/wall/shuttle/scc_space_ship/cardinal, @@ -125741,6 +125683,15 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/operations/commissary) +"qnh" = ( +/obj/structure/platform_deco{ + dir = 8 + }, +/obj/effect/floor_decal/spline/plain/green{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "qnj" = ( /obj/effect/floor_decal/spline/plain{ dir = 4 @@ -126042,16 +125993,6 @@ /obj/random/maintenance_junk_or_loot, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_3/security/port) -"qph" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 9 - }, -/obj/structure/machinery/atm{ - dir = 1; - pixel_y = 28 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "qpr" = ( /obj/structure/closet/secure_closet/guncabinet{ name = "Heavy Asset Protection"; @@ -129758,13 +129699,6 @@ }, /turf/simulated/floor/wood/yew, /area/centcom/shared_dream) -"qNO" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "qNV" = ( /obj/structure/cable{ icon_state = "4-8" @@ -131000,21 +130934,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/medical/surgery) -"qWG" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "qWI" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -131954,6 +131873,29 @@ /obj/effect/floor_decal/industrial/outline/grey, /turf/simulated/floor/tiled/dark/full, /area/horizon/security/evidence_storage) +"rdo" = ( +/obj/structure/table/stone/marble, +/obj/item/reagent_containers/food/drinks/shaker{ + pixel_x = 9; + pixel_y = 15 + }, +/obj/item/reagent_containers/food/drinks/shaker{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/obj/item/reagent_containers/glass/rag/advanced{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/glass/rag/advanced{ + pixel_x = -4; + pixel_y = -1 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/bar) "rdq" = ( /obj/structure/grille, /obj/structure/window/shuttle/scc_space_ship/cardinal, @@ -132119,12 +132061,6 @@ }, /turf/simulated/floor/wood, /area/horizon/rnd/xenoarch/presentation) -"req" = ( -/obj/structure/bed/stool/chair/wood{ - dir = 4 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "rer" = ( /obj/structure/grille/broken, /obj/structure/machinery/light/small{ @@ -132192,6 +132128,14 @@ }, /turf/simulated/floor/wood, /area/horizon/command/bridge/meeting_room) +"reI" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain/green, +/obj/structure/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "reJ" = ( /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor/plating, @@ -134425,6 +134369,16 @@ name = "shallow water" }, /area/horizon/holodeck/source_konyang) +"rty" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 9 + }, +/obj/structure/machinery/atm{ + dir = 1; + pixel_y = 28 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "rtA" = ( /obj/item/flag/scc/l{ pixel_y = 15 @@ -136151,6 +136105,18 @@ }, /turf/simulated/floor/exoplanet/grass, /area/centcom/shared_dream) +"rFh" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "rFi" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/condiment/shaker/salt{ @@ -136500,15 +136466,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/command/bridge/bridge_crew) -"rHq" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/obj/structure/platform_deco{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "rHr" = ( /obj/structure/machinery/door/airlock/glass_research{ dir = 4; @@ -138090,29 +138047,6 @@ /obj/effect/step_trigger/thrower/shuttle/north, /turf/space/transit/east, /area/template_noop) -"rRb" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/obj/structure/sign/directions/service{ - pixel_x = -33; - pixel_y = 3 - }, -/obj/structure/sign/directions/all{ - dir = 1; - pixel_y = 9; - pixel_x = -33 - }, -/obj/structure/sign/directions/custodial{ - pixel_x = -33; - pixel_y = -3; - dir = 1 - }, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/hallway/primary/deck_2/fore) "rRg" = ( /obj/structure/cable/green{ icon_state = "2-4" @@ -138302,19 +138236,6 @@ }, /turf/simulated/floor, /area/horizon/ai/chamber) -"rSm" = ( -/obj/structure/bed/stool/chair/office/dark{ - dir = 8 - }, -/obj/structure/machinery/camera/network/service{ - c_tag = "Service - Mess Hall 1"; - dir = 1 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 10 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "rSo" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -138457,29 +138378,6 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/starboard/far) -"rTc" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 5 - }, -/obj/item/radio/intercom/north, -/obj/structure/machinery/power/outlet{ - pixel_y = 3 - }, -/obj/item/flame/candle{ - pixel_x = 9; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/condiment/shaker/peppermill{ - pixel_x = 2; - pixel_y = 12 - }, -/obj/item/reagent_containers/food/condiment/shaker/salt{ - pixel_y = 12; - pixel_x = -3 - }, -/obj/structure/table/wood/gamblingtable, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "rTf" = ( /obj/structure/machinery/door/airlock/glass_command{ dir = 1; @@ -139028,10 +138926,6 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/hangar/auxiliary) -"rWt" = ( -/obj/structure/machinery/hologram/holopad/long_range, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "rWv" = ( /obj/effect/floor_decal/corner/dark_green{ dir = 10 @@ -139575,18 +139469,6 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/rnd/chemistry) -"sac" = ( -/obj/effect/floor_decal/corner/dark_green/full, -/obj/effect/floor_decal/industrial/outline_straight/service, -/obj/effect/floor_decal/industrial/arrow/service, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "sae" = ( /obj/effect/floor_decal/industrial/warning{ dir = 4 @@ -139666,15 +139548,6 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/rnd/xenological) -"saM" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 7 - }, -/obj/structure/bed/stool/chair/padded/black{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "saR" = ( /obj/structure/machinery/light{ dir = 1 @@ -139842,6 +139715,15 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_3/security/starboard) +"scd" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/bed/stool/chair/padded/black{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "scr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -140458,6 +140340,15 @@ }, /turf/simulated/floor/plating, /area/horizon/shuttle/intrepid/main_compartment) +"sgq" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/structure/cable/green, +/obj/structure/machinery/power/apc/south, +/obj/effect/floor_decal/spline/plain/green{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "sgr" = ( /obj/structure/machinery/door/firedoor{ req_one_access = list(24,11,67,73) @@ -141297,6 +141188,13 @@ /obj/structure/railing/mapped, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/bluespace_drive) +"skA" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/obj/item/hullbeacon/red, +/turf/simulated/floor/reinforced/airless, +/area/horizon/exterior) "skC" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/disposalpipe/segment, @@ -142157,6 +142055,10 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/security/autopsy_laboratory) +"sqF" = ( +/obj/structure/sign/floor_plaque/horizon/service, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "sqM" = ( /obj/random/dirt_75, /obj/effect/floor_decal/industrial/warning{ @@ -142171,16 +142073,6 @@ }, /turf/simulated/floor/shuttle/black, /area/shuttle/hapt) -"sqR" = ( -/obj/structure/machinery/orderterminal{ - dir = 1; - pixel_y = 29 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 5 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "sqS" = ( /obj/effect/floor_decal/corner/brown{ dir = 1 @@ -142951,6 +142843,14 @@ /obj/random/dirt_75, /turf/simulated/floor/tiled/dark, /area/horizon/maintenance/deck_2/wing/port/nacelle) +"swj" = ( +/obj/structure/table/rack, +/obj/random/melee, +/obj/item/stack/material/steel/full, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/turf/simulated/floor/plating, +/area/shuttle/skipjack) "swk" = ( /obj/structure/machinery/atmospherics/pipe/manifold/visible, /obj/structure/lattice/catwalk/indoor/grate/dark, @@ -143565,6 +143465,18 @@ }, /turf/simulated/floor/carpet/rubber, /area/horizon/tcommsat/entrance) +"szD" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/light/floor{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "szF" = ( /obj/effect/floor_decal/corner/dark_blue/full{ dir = 1 @@ -147221,22 +147133,6 @@ }, /turf/unsimulated/floor, /area/centcom/bar) -"sYt" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/structure/mirror{ - pixel_y = 36 - }, -/obj/structure/sink{ - pixel_y = 22 - }, -/obj/effect/floor_decal/spline/plain/corner{ - dir = 4 - }, -/obj/effect/floor_decal/spline/plain/corner{ - dir = 1 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "sYx" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -147423,6 +147319,20 @@ }, /turf/simulated/floor/carpet/art, /area/horizon/crew/lounge) +"sZs" = ( +/obj/structure/sign/flag/scc{ + pixel_y = 32 + }, +/obj/structure/machinery/appliance/cooker/microwave{ + pixel_y = 12; + pixel_x = -1 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/rag{ + pixel_x = -3 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "sZv" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -147442,6 +147352,19 @@ }, /turf/simulated/floor/plating, /area/horizon/hallway/primary/deck_3/port/docks) +"sZB" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/obj/structure/cable/green{ + icon_state = "2-8" + }, +/obj/effect/floor_decal/spline/plain/corner/green{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "sZF" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 @@ -147588,6 +147511,15 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/hallway/primary/deck_2/central) +"taL" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 7 + }, +/obj/structure/bed/stool/chair/padded/black{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "taM" = ( /obj/structure/bed/stool/chair/office/light, /obj/structure/machinery/atmospherics/unary/vent_pump/on{ @@ -147655,16 +147587,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/rnd/xenobiology/xenoflora) -"tby" = ( -/obj/effect/floor_decal/corner/lime/diagonal, -/obj/effect/floor_decal/spline/plain{ - dir = 1 - }, -/obj/structure/machinery/light/small{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/horizon/crew/washroom/deck_2) "tbF" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -148424,17 +148346,6 @@ "tgx" = ( /turf/simulated/floor/holofloor/lino, /area/horizon/holodeck/source_theatre) -"tgE" = ( -/obj/structure/bed/stool/bar/padded/red, -/obj/structure/disposalpipe/segment{ - dir = 1; - icon_state = "pipe-c" - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 9 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "tgG" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/closet/secure_closet/engineering_personal, @@ -148883,6 +148794,24 @@ }, /turf/simulated/floor/wood, /area/horizon/crew/lounge) +"tjA" = ( +/obj/effect/floor_decal/corner/grey/diagonal, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/effect/floor_decal/spline/plain/green{ + dir = 8 + }, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/effect/landmark/start{ + name = "Chef" + }, +/turf/simulated/floor/tiled/white, +/area/horizon/service/kitchen) "tjE" = ( /obj/structure/shuttle_part/tcfl{ icon_state = "0,5" @@ -150475,6 +150404,27 @@ /obj/effect/floor_decal/industrial/hatch_tiny/yellow, /turf/simulated/floor/tiled/dark, /area/horizon/rnd/xenobiology/xenoflora) +"tta" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/platform_stairs/full{ + dir = 8 + }, +/obj/structure/platform{ + dir = 1 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "ttm" = ( /obj/effect/decal/remains/rat, /obj/structure/lattice/catwalk/indoor/grate/dark, @@ -150663,6 +150613,14 @@ }, /turf/simulated/floor/tiled, /area/horizon/engineering/hallway/interior) +"tuO" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain/corner/green, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "tuP" = ( /obj/effect/floor_decal/corner_wide/yellow{ dir = 5 @@ -151269,6 +151227,15 @@ }, /turf/simulated/floor/carpet, /area/horizon/repoffice/consular_one) +"tyq" = ( +/obj/effect/floor_decal/industrial/hatch/service, +/obj/structure/machinery/vending/mredispenser, +/obj/structure/machinery/camera/network/service{ + c_tag = "Service - Mess Hallway"; + dir = 4 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/hallway/primary/deck_2/fore) "tyt" = ( /obj/effect/floor_decal/industrial/warning{ dir = 6 @@ -151352,18 +151319,6 @@ }, /turf/simulated/floor/exoplanet/grass/grove, /area/centcom/shared_dream) -"tyJ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "tyS" = ( /obj/effect/floor_decal/corner/green/diagonal, /obj/structure/sign/nosmoking_1{ @@ -152359,6 +152314,21 @@ }, /turf/simulated/floor/wood, /area/horizon/command/heads/om) +"tFD" = ( +/obj/structure/cable/green{ + icon_state = "1-4" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 6 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "tFF" = ( /obj/structure/window/reinforced/crescent{ dir = 1 @@ -152750,16 +152720,6 @@ /obj/structure/table/reinforced/steel, /turf/unsimulated/floor/plating, /area/centcom/specops) -"tHD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 5 - }, -/obj/structure/machinery/light/small/floor, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "tHL" = ( /obj/structure/machinery/mass_driver{ _wifi_id = "waste"; @@ -153604,6 +153564,29 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/ai/upload) +"tOl" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/obj/structure/sign/directions/service{ + pixel_x = -33; + pixel_y = 3 + }, +/obj/structure/sign/directions/all{ + dir = 1; + pixel_y = 9; + pixel_x = -33 + }, +/obj/structure/sign/directions/custodial{ + pixel_x = -33; + pixel_y = -3; + dir = 1 + }, +/obj/structure/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/hallway/primary/deck_2/fore) "tOp" = ( /obj/structure/railing/mapped{ dir = 4 @@ -153808,6 +153791,12 @@ }, /turf/simulated/open, /area/horizon/operations/office) +"tPL" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 9 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "tPN" = ( /obj/structure/machinery/camera/network/research{ c_tag = "Research - Xenobio Fore"; @@ -153855,6 +153844,20 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/command/bridge/aibunker) +"tPY" = ( +/obj/structure/cable/green{ + icon_state = "1-8" + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/sortjunction/flipped{ + sortType = "Hydroponics" + }, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/mess_hall) "tQl" = ( /turf/simulated/wall/shuttle/unique/tcfl{ icon_state = "1,5" @@ -154041,10 +154044,6 @@ }, /turf/simulated/floor/tiled/dark, /area/shuttle/mercenary) -"tRw" = ( -/obj/structure/sign/floor_plaque/horizon/service, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "tRx" = ( /obj/structure/cable{ icon_state = "1-2" @@ -154296,6 +154295,13 @@ }, /turf/simulated/floor/tiled, /area/horizon/operations/office) +"tTL" = ( +/obj/structure/sign/radshield{ + dir = 8; + pixel_y = -3 + }, +/turf/simulated/wall, +/area/horizon/crew/washroom/deck_2) "tTQ" = ( /obj/structure/machinery/button/remote/blast_door{ dir = 1; @@ -154791,6 +154797,23 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_1/operations/starboard/amidships) +"tXu" = ( +/obj/effect/floor_decal/spline/fancy/wood, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/shaker/salt{ + pixel_y = 5; + pixel_x = 7 + }, +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/flame/candle{ + pixel_x = -6; + pixel_y = 9 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "tXw" = ( /obj/structure/machinery/door/airlock/centcom{ name = "Auxillary Cryogenics" @@ -154968,6 +154991,21 @@ /obj/structure/flora/ausbushes/brflowers, /turf/simulated/floor/holofloor/grass, /area/horizon/holodeck/source_wildlife) +"tYU" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 1 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "tZa" = ( /obj/structure/cable/green{ icon_state = "0-8" @@ -155876,6 +155914,21 @@ /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled, /area/shuttle/merchant) +"ufr" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/bar) "ufs" = ( /obj/effect/floor_decal/industrial/hatch_door/yellow{ dir = 8 @@ -156109,12 +156162,6 @@ /obj/item/radio/intercom/east, /turf/simulated/floor/tiled, /area/horizon/medical/paramedic) -"uhe" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 9 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "uhj" = ( /obj/structure/grille, /obj/structure/window/shuttle/scc_space_ship, @@ -156542,6 +156589,15 @@ /obj/structure/window/shuttle/scc_space_ship/cardinal, /turf/simulated/floor/plating, /area/shuttle/merchant) +"ujx" = ( +/obj/effect/floor_decal/industrial/hatch/service, +/obj/structure/machinery/computer/arcade, +/obj/structure/sign/poster/lore/tcaf{ + pixel_y = 30; + pixel_x = 6 + }, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/bar) "ujy" = ( /obj/structure/disposalpipe/segment, /obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -157267,6 +157323,17 @@ }, /turf/simulated/floor/exoplanet/barren, /area/centcom/shared_dream) +"uou" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 10 + }, +/obj/effect/floor_decal/industrial/outline_straight/service, +/obj/effect/floor_decal/industrial/arrow/service, +/obj/structure/platform{ + dir = 8 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "uoy" = ( /obj/item/tape/engineering{ icon_state = "engineering_door" @@ -157587,43 +157654,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/operations/machinist) -"uqq" = ( -/obj/structure/platform{ - dir = 8 - }, -/obj/structure/table/steel, -/obj/effect/floor_decal/spline/plain/brown{ - dir = 8 - }, -/obj/item/healthanalyzer{ - pixel_y = 12 - }, -/obj/item/flash/synthetic{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/flash/synthetic{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/flash/synthetic{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/flash/synthetic{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/flash/synthetic{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/flash/synthetic{ - pixel_x = -5; - pixel_y = 12 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/operations/machinist) "uqw" = ( /obj/effect/floor_decal/corner/dark_blue/full, /obj/random/pottedplant, @@ -157811,26 +157841,6 @@ /obj/structure/machinery/meter, /turf/simulated/floor/tiled/dark, /area/horizon/engineering/atmos/propulsion/starboard) -"urn" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 6 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/machinery/light/small/floor, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "1-4" - }, -/turf/simulated/floor/wood, -/area/horizon/service/bar) "urx" = ( /obj/effect/floor_decal/corner/dark_blue{ dir = 8 @@ -158087,6 +158097,12 @@ }, /turf/simulated/floor, /area/horizon/maintenance/deck_3/auxatmos) +"usT" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain/green, +/obj/structure/machinery/light/small/floor, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "uta" = ( /obj/effect/floor_decal/industrial/warning{ dir = 10 @@ -160290,6 +160306,27 @@ /obj/structure/table/reinforced/steel, /turf/simulated/floor/carpet/rubber, /area/horizon/command/bridge/controlroom) +"uHm" = ( +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable/green{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + icon_state = "pipe-c" + }, +/obj/effect/floor_decal/industrial/outline_straight/service{ + dir = 8 + }, +/obj/effect/floor_decal/corner/dark_green{ + dir = 5 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/bar) "uHq" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -161399,15 +161436,6 @@ /obj/structure/machinery/atmospherics/unary/freezer, /turf/simulated/floor/tiled/dark/full, /area/horizon/service/hydroponics) -"uOK" = ( -/obj/effect/floor_decal/spline/fancy/wood/cee{ - dir = 4 - }, -/obj/structure/synthesized_instrument/synthesizer/piano{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/bar) "uOM" = ( /obj/effect/floor_decal/corner/red, /obj/effect/floor_decal/corner/red{ @@ -161656,6 +161684,28 @@ }, /turf/simulated/floor/carpet/rubber, /area/horizon/command/bridge/controlroom) +"uQn" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/reagent_containers/food/condiment/shaker/salt{ + pixel_y = 10; + pixel_x = 10 + }, +/obj/item/flame/candle{ + pixel_x = -3; + pixel_y = 16 + }, +/obj/structure/machinery/power/outlet{ + pixel_y = 3 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "uQy" = ( /obj/effect/floor_decal/spline/fancy, /obj/structure/machinery/computer/ship/sensors{ @@ -161681,27 +161731,6 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_2/wing/port/far) -"uQF" = ( -/obj/structure/table/stone/marble, -/obj/item/reagent_containers/glass/bottle/syrup/chocolate{ - pixel_x = -8; - pixel_y = 13 - }, -/obj/item/reagent_containers/glass/bottle/syrup/caramel{ - pixel_x = -2; - pixel_y = 13 - }, -/obj/item/reagent_containers/glass/bottle/syrup/pumpkin{ - pixel_x = 4; - pixel_y = 13 - }, -/obj/item/reagent_containers/glass/bottle/syrup/vanilla{ - pixel_x = 10; - pixel_y = 13 - }, -/obj/item/radio/intercom/north, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/bar) "uQG" = ( /obj/random/dirt_75, /obj/structure/machinery/light/small{ @@ -162991,6 +163020,10 @@ /obj/structure/machinery/light, /turf/simulated/floor/tiled, /area/horizon/maintenance/deck_2/research) +"uZq" = ( +/obj/structure/machinery/hologram/holopad, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "uZt" = ( /obj/structure/machinery/atmospherics/binary/pump/high_power{ dir = 1; @@ -164094,6 +164127,11 @@ /obj/structure/lattice/catwalk/indoor/grate/dark, /turf/simulated/floor, /area/horizon/maintenance/deck_3/crewlounge) +"vgQ" = ( +/obj/structure/table/stone/marble, +/obj/effect/floor_decal/industrial/warning/corner, +/turf/simulated/floor/tiled/dark/full, +/area/horizon/service/bar) "vgT" = ( /turf/simulated/wall/shuttle/scc_space_ship/cardinal, /area/horizon/operations/machinist/surgicalbay) @@ -164503,6 +164541,26 @@ /obj/structure/machinery/telecomms/broadcaster/preset_right, /turf/simulated/floor/bluegrid, /area/horizon/tcommsat/chamber) +"vkh" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/shaker/salt{ + pixel_x = -7; + pixel_y = -8 + }, +/obj/item/reagent_containers/food/condiment/shaker/peppermill{ + pixel_x = -1; + pixel_y = -8 + }, +/obj/item/paper_bin{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 5 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "vkj" = ( /obj/structure/cable{ icon_state = "0-4" @@ -165840,10 +165898,6 @@ density = 1 }, /area/antag/ninja) -"vuE" = ( -/obj/structure/machinery/vending/dinnerware/bar, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/bar) "vuM" = ( /obj/structure/sign/vacuum{ pixel_y = -32 @@ -165959,13 +166013,6 @@ "vvE" = ( /turf/simulated/wall/r_wall, /area/horizon/weapons/grauwolf) -"vvG" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/platform_deco, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "vvL" = ( /obj/structure/table/steel, /obj/item/paper_bin, @@ -166747,16 +166794,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/reactor/supermatter/airlock) -"vAU" = ( -/obj/effect/floor_decal/spline/fancy/wood, -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "vAZ" = ( /obj/structure/sink/kitchen{ name = "water fountain"; @@ -167882,13 +167919,6 @@ }, /turf/unsimulated/floor, /area/antag/mercenary) -"vIN" = ( -/obj/structure/sign/flag/idris{ - pixel_y = 32 - }, -/obj/structure/machinery/vending/quick_e_meals, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "vIR" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -167908,6 +167938,15 @@ /obj/structure/machinery/vending/cigarette/horizon, /turf/simulated/floor/tiled/full, /area/horizon/command/bridge/upperdeck) +"vJm" = ( +/obj/structure/table/stone/marble, +/obj/structure/machinery/vending/wallmed1{ + pixel_y = 30; + req_access = list(110) + }, +/obj/item/eftpos, +/turf/simulated/floor/tiled/dark, +/area/shuttle/merchant) "vJq" = ( /obj/effect/floor_decal/spline/fancy/wood/corner{ dir = 8 @@ -168333,19 +168372,6 @@ /obj/effect/floor_decal/industrial/outline/red, /turf/simulated/floor/tiled/dark/full, /area/horizon/security/armoury) -"vLY" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 6 - }, -/obj/structure/machinery/computer/guestpass{ - pixel_y = 27; - pixel_x = -2 - }, -/obj/structure/bed/stool/chair/padded/red{ - dir = 8 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "vMa" = ( /obj/structure/engineer_maintenance/electric/wall, /obj/effect/floor_decal/corner/dark_green{ @@ -168466,13 +168492,6 @@ /obj/effect/floor_decal/industrial/hatch_door/service, /turf/simulated/floor/tiled/dark/full, /area/horizon/service/bar) -"vNf" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/effect/floor_decal/spline/fancy/wood/corner, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "vNk" = ( /obj/effect/floor_decal/corner/green/diagonal, /obj/structure/engineer_maintenance/pipe/wall, @@ -169722,26 +169741,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/maintenance/deck_1/operations/starboard) -"vVN" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 4 - }, -/obj/structure/disposalpipe/sortjunction{ - dir = 1; - sortType = "Bar" - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/simulated/floor/wood, -/area/horizon/service/bar) "vVP" = ( /obj/structure/machinery/suit_cycler{ req_access = list(110) @@ -170513,6 +170512,10 @@ /obj/structure/bed/roller, /turf/simulated/floor/tiled/dark, /area/shuttle/mercenary) +"waR" = ( +/obj/effect/floor_decal/spline/fancy/wood, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "waX" = ( /turf/simulated/floor/wood, /area/horizon/command/heads/om) @@ -171435,15 +171438,6 @@ }, /turf/simulated/floor/reinforced/airless, /area/horizon/exterior) -"wgd" = ( -/obj/structure/platform{ - dir = 4 - }, -/obj/effect/floor_decal/corner/dark_green{ - dir = 1 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "wgj" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden{ dir = 5 @@ -171504,6 +171498,13 @@ }, /turf/simulated/floor/holofloor/carpet, /area/horizon/holodeck/source_biesel) +"wgH" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/service/mess_hall) "wgI" = ( /obj/structure/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/corner/mauve/diagonal, @@ -171529,6 +171530,17 @@ /obj/effect/floor_decal/industrial/hatch_door/yellow, /turf/simulated/floor/tiled/full, /area/horizon/rnd/hallway) +"wgO" = ( +/obj/structure/machinery/camera/network/service{ + c_tag = "Service - D2 Washroom"; + dir = 4 + }, +/obj/structure/closet/emcloset, +/obj/effect/floor_decal/industrial/hatch/emergency_closet, +/obj/item/storage/toolbox/emergency, +/obj/structure/machinery/firealarm/west, +/turf/simulated/floor/tiled/full, +/area/horizon/crew/washroom/deck_2) "wgP" = ( /obj/effect/floor_decal/corner/dark_blue{ dir = 6 @@ -171814,6 +171826,29 @@ "wiG" = ( /turf/simulated/wall, /area/horizon/maintenance/deck_2/cargo_compartment) +"wiK" = ( +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 1 + }, +/obj/structure/machinery/light/small/floor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/structure/cable/green{ + icon_state = "2-4" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "wiQ" = ( /obj/random/pottedplant, /obj/effect/floor_decal/spline/fancy/wood{ @@ -173657,6 +173692,13 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/engineering/atmos/propulsion/starboard) +"wtz" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/obj/effect/floor_decal/spline/fancy/wood/corner, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "wtA" = ( /obj/item/hullbeacon/red, /obj/structure/railing/mapped, @@ -174879,6 +174921,15 @@ /obj/structure/platform/ledge, /turf/simulated/floor/carpet/rubber, /area/horizon/rnd/telesci) +"wBt" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 8 + }, +/obj/structure/bed/stool/chair/padded/beige{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "wBx" = ( /obj/effect/floor_decal/industrial/warning/corner, /obj/random/dirt_75, @@ -175219,63 +175270,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/command/bridge/upperdeck) -"wEo" = ( -/obj/structure/table/rack, -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/item/material/knife/tacknife{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/material/knife/tacknife{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/material/knife/tacknife{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/material/knife/tacknife{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/melee/baton/stunrod{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/melee/baton/stunrod{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/melee/baton/stunrod{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/melee/baton/stunrod{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/shield/energy{ - pixel_x = -8; - pixel_y = 7 - }, -/obj/item/shield/energy{ - pixel_x = -8; - pixel_y = 7 - }, -/obj/item/shield/energy{ - pixel_x = -8; - pixel_y = 7 - }, -/obj/item/shield/energy{ - pixel_x = -8; - pixel_y = 7 - }, -/obj/item/crowbar/rescue_axe/tactical, -/obj/item/crowbar/rescue_axe/tactical, -/obj/item/crowbar/rescue_axe/tactical, -/obj/item/crowbar/rescue_axe/tactical, -/turf/unsimulated/floor, -/area/antag/mercenary) "wEr" = ( /turf/simulated/wall/shuttle/scc_space_ship/cardinal, /area/horizon/operations/office_aux) @@ -175748,6 +175742,16 @@ /obj/structure/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/horizon/hallway/primary/deck_3/central) +"wHi" = ( +/obj/structure/machinery/orderterminal{ + dir = 1; + pixel_y = 29 + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 5 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "wHj" = ( /obj/structure/bed/stool/chair/padded/black, /obj/effect/floor_decal/corner/grey{ @@ -175836,6 +175840,13 @@ /obj/effect/floor_decal/industrial/outline/red, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/hallway/aft) +"wIr" = ( +/obj/structure/table/reinforced/steel, +/obj/effect/decal/cleanable/dirt, +/obj/item/crowbar/rescue_axe/tactical, +/obj/item/crowbar/rescue_axe/tactical, +/turf/unsimulated/floor/monotile, +/area/antag/burglar) "wIv" = ( /obj/structure/machinery/firealarm/south, /obj/structure/machinery/light{ @@ -176608,6 +176619,27 @@ }, /turf/simulated/floor/tiled, /area/horizon/hallway/primary/deck_3/central) +"wNX" = ( +/obj/effect/floor_decal/corner/dark_green{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/structure/cable/green{ + icon_state = "4-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/machinery/light/floor{ + dir = 4 + }, +/turf/simulated/floor/tiled/dark, +/area/horizon/hallway/primary/deck_2/fore) "wOe" = ( /obj/structure/table/standard, /obj/item/clothing/glasses/hud/health, @@ -176961,30 +176993,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/stairwell/bridge/deck_3) -"wPA" = ( -/obj/effect/floor_decal/corner/dark_green{ - dir = 6 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/machinery/light/floor{ - dir = 4 - }, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 1 - }, -/obj/effect/floor_decal/industrial/outline_straight/service{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/horizon/service/mess_hall) "wPC" = ( /obj/effect/floor_decal/industrial/hatch_door/yellow, /obj/structure/machinery/door/airlock/maintenance{ @@ -178714,6 +178722,13 @@ }, /turf/simulated/floor/tiled, /area/horizon/stairwell/port/deck_3) +"wZD" = ( +/obj/structure/machinery/light/floor, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 6 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "wZE" = ( /obj/structure/cable{ icon_state = "1-2" @@ -179408,18 +179423,6 @@ }, /turf/simulated/open, /area/horizon/maintenance/deck_2/cryo) -"xdN" = ( -/obj/structure/machinery/holosign/service/kitchen{ - pixel_y = -32; - id = "kitchen" - }, -/obj/item/lore_radio{ - pixel_y = 4; - pixel_x = 2 - }, -/obj/structure/table/fancy/black, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "xdR" = ( /obj/effect/floor_decal/corner/dark_blue/full, /obj/structure/table/reinforced, @@ -180010,12 +180013,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/hangar/operations) -"xhP" = ( -/obj/structure/bed/stool/chair/wood{ - dir = 8 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "xhS" = ( /obj/structure/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 @@ -180513,12 +180510,6 @@ "xlu" = ( /turf/simulated/wall/r_wall, /area/horizon/maintenance/deck_3/cafe) -"xlv" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 5 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "xlA" = ( /obj/effect/floor_decal/spline/plain{ dir = 8 @@ -180619,6 +180610,19 @@ /obj/effect/floor_decal/industrial/outline/operations, /turf/simulated/floor/carpet/rubber, /area/horizon/engineering/atmos/storage) +"xmy" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "xmB" = ( /obj/structure/table/steel, /obj/item/multitool, @@ -181038,20 +181042,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/shuttle/intrepid/buffet) -"xpk" = ( -/obj/structure/sign/flag/scc{ - pixel_y = 32 - }, -/obj/structure/machinery/appliance/cooker/microwave{ - pixel_y = 12; - pixel_x = -1 - }, -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/rag{ - pixel_x = -3 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "xpl" = ( /obj/structure/shuttle_part/scc/scout{ icon_state = "7,5" @@ -181490,15 +181480,6 @@ }, /turf/simulated/floor/tiled/dark/full, /area/shuttle/mercenary) -"xsp" = ( -/obj/structure/table/wood, -/obj/item/material/ashtray/bronze, -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 10 - }, -/obj/item/storage/box/tcaf_pamphlet, -/turf/unsimulated/floor, -/area/centcom/legion/hangar5) "xsq" = ( /obj/structure/machinery/door/airlock/silver{ name = "Washroom" @@ -181964,6 +181945,15 @@ }, /turf/unsimulated/floor/dark, /area/antag/actor) +"xuA" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 10 + }, +/obj/structure/bed/stool/chair/padded/red{ + dir = 4 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "xuG" = ( /obj/structure/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 @@ -182967,6 +182957,12 @@ icon_state = "desert" }, /area/centcom/shared_dream) +"xAV" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 5 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "xAY" = ( /obj/structure/closet/secure_closet/guncabinet{ name = "FIB Sidearm"; @@ -183293,6 +183289,15 @@ }, /turf/simulated/wall/shuttle/scc, /area/horizon/shuttle/intrepid/port_storage) +"xDv" = ( +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 6 + }, +/obj/structure/bed/stool/chair/padded/black{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "xDw" = ( /obj/structure/table/glass, /obj/effect/floor_decal/corner/beige/diagonal, @@ -183854,6 +183859,14 @@ }, /turf/simulated/floor/tiled/dark/full, /area/horizon/engineering/lobby) +"xGR" = ( +/obj/effect/floor_decal/corner/lime/diagonal, +/obj/effect/floor_decal/spline/plain/green{ + dir = 4 + }, +/obj/structure/machinery/alarm/south, +/turf/simulated/floor/tiled/white, +/area/horizon/crew/washroom/deck_2) "xGS" = ( /obj/structure/machinery/camera/network/first_deck{ c_tag = "First Deck - EVA Storage 2" @@ -184788,17 +184801,6 @@ "xNA" = ( /turf/simulated/wall/shuttle/scc_space_ship/cardinal, /area/horizon/maintenance/deck_1/main/port) -"xNC" = ( -/obj/structure/machinery/camera/network/service{ - c_tag = "Service - D2 Washroom"; - dir = 4 - }, -/obj/structure/closet/emcloset, -/obj/effect/floor_decal/industrial/hatch/emergency_closet, -/obj/item/storage/toolbox/emergency, -/obj/structure/machinery/firealarm/west, -/turf/simulated/floor/tiled/full, -/area/horizon/crew/washroom/deck_2) "xND" = ( /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 @@ -185205,13 +185207,6 @@ }, /turf/simulated/floor/carpet/green, /area/horizon/medical/psych) -"xQQ" = ( -/obj/structure/platform/cutout{ - dir = 8 - }, -/obj/structure/platform_stairs/full/east_west_cap, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/service/mess_hall) "xQS" = ( /obj/structure/shuttle_part/scc/scout{ icon_state = "7,6" @@ -185680,6 +185675,17 @@ }, /turf/simulated/floor/tiled, /area/horizon/hallway/primary/deck_3/starboard) +"xUK" = ( +/obj/structure/bed/stool/bar/padded/red, +/obj/structure/disposalpipe/segment{ + dir = 1; + icon_state = "pipe-c" + }, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 9 + }, +/turf/simulated/floor/lino/diamond, +/area/horizon/service/mess_hall) "xUL" = ( /obj/effect/floor_decal/industrial/outline_straight/operations, /turf/simulated/floor/tiled/full, @@ -185792,16 +185798,6 @@ }, /turf/simulated/floor/tiled/white, /area/horizon/storage/eva/expedition) -"xVk" = ( -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 8 - }, -/obj/structure/machinery/light/small/floor, -/obj/effect/floor_decal/spline/fancy/wood/corner{ - dir = 1 - }, -/turf/simulated/floor/wood, -/area/horizon/service/mess_hall) "xVm" = ( /obj/structure/machinery/door/airlock/maintenance{ dir = 1; @@ -186188,15 +186184,6 @@ }, /turf/simulated/floor/tiled, /area/horizon/crew/vacantoffice) -"xYJ" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 10 - }, -/obj/structure/bed/stool/chair/padded/red{ - dir = 4 - }, -/turf/simulated/floor/lino/diamond, -/area/horizon/service/mess_hall) "xYO" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning{ @@ -186770,13 +186757,6 @@ }, /turf/simulated/floor/plating, /area/horizon/maintenance/deck_1/hangar/starboard) -"ycZ" = ( -/obj/structure/machinery/door/firedoor, -/obj/effect/floor_decal/industrial/hatch_door/service{ - dir = 8 - }, -/turf/simulated/floor/tiled/dark/full, -/area/horizon/hallway/primary/deck_2/fore) "yda" = ( /obj/structure/table/standard, /obj/item/reagent_containers/spray/cleaner{ @@ -187997,6 +187977,25 @@ }, /turf/simulated/floor/tiled/dark, /area/horizon/hallway/primary/deck_2/fore) +"ykU" = ( +/obj/effect/floor_decal/spline/fancy/wood/corner{ + dir = 4 + }, +/obj/structure/machinery/light/small/floor, +/obj/effect/floor_decal/spline/fancy/wood{ + dir = 4 + }, +/obj/structure/cable/green{ + icon_state = "2-8" + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, +/obj/structure/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/wood, +/area/horizon/service/mess_hall) "ylc" = ( /obj/structure/sign/radiation{ pixel_x = 32 @@ -278988,7 +278987,7 @@ mAZ nqF nqF jJA -eWQ +gTI dVT rBN nqF @@ -279247,7 +279246,7 @@ xwX uao uao aGE -mKo +oLO nqF lhz lqA @@ -280016,7 +280015,7 @@ sZN vkm ezv rJH -uqq +cby mSj wPm vhY @@ -282080,21 +282079,21 @@ cPR jYf vgT sDq -czM +skA dbd dbd dbd dbd dbd dbd -czM +skA dbd dbd dbd dbd dbd dbd -czM +skA dbd hoE eSV @@ -282605,7 +282604,7 @@ fMp bGX hJy ezA -oks +ujx oaZ gbw qTm @@ -282868,7 +282867,7 @@ oGC qyu pqG lbo -pam +iAJ eSV eSV eSV @@ -283380,7 +283379,7 @@ nhx aSm hHd kcY -uOK +law sdk uYQ eSV @@ -283615,18 +283614,18 @@ srt iKO ffS wNm -btc -oFY -duU +bdl +jZQ +ozD tXA xsF -tyJ -hjj +rFh +mOv rMw -jQN +fIx igx -fgw -sac +jlR +lQI clk fSc ujc @@ -283872,18 +283871,18 @@ vth wJJ gmp avy -ksB -wPA -jRy -vvG +wgH +okP +bka +iBU vNL vNL vNL vNL -pzF -gnL -kBy -lew +nej +qnh +lkM +uou kaF qDr ckI @@ -284129,18 +284128,18 @@ qch qch uhZ uhZ -fRz +lnC ioS mUz uhZ -xpk -iSz -gOd -jJG -edH -xQQ -pCx -pZq +sZs +bXk +dvx +wBt +iQl +pZo +tta +nli ezA oYz uxV @@ -284386,18 +284385,18 @@ tXO qch qAc xiu -tby -jnM -xNC +kdw +cQp +wgO uhZ -qph -niH -pyL -cjP -ltJ -lYR -iCV -rSm +rty +fxd +xmy +mRv +gEy +wiK +eRx +jCe xjF uvs bap @@ -284643,20 +284642,20 @@ sgx qch uhZ uhZ -nJj -gYg -myg +fmQ +ndI +dnR uhZ -sqR -grl -req -req -req -qWG -ogt -giv +wHi +bNx +oja +oja +oja +dLu +anH +mFe ezA -jia +uHm gZL dhe dhe @@ -284667,7 +284666,7 @@ wjb tZZ ptr rrt -pam +iAJ eSV eSV eSV @@ -284900,22 +284899,22 @@ qWO qch gtE vyN -qNO -mIs -lRD +iXH +sZB +sgq uhZ -lvk -mOr -gvS -jNo -bRc -hYP -nCX -nMW +ioi +bDv +vkh +ekl +pIS +tYU +jnX +mxl dze -iHm +jzI aKh -vuE +esH tQz pKu rWb @@ -285157,24 +285156,24 @@ udL qch uhZ uhZ -sYt -cyR -dIO +jPR +tuO +xGR uhZ -fcP -vAU -xhP -xhP -xhP -hYP -nCX -saM +oGe +jJR +miw +miw +miw +tYU +jnX +taL dze -kqE +aKf hkY -bFx -vVN -urn +ufr +pvE +jfj nUD xuP jJp @@ -285414,23 +285413,23 @@ qch qch uhZ wOx -qNO -etb +iXH +reI eFG uhZ -kNc -lJW -rWt -tRw -fFs -qgO -gBG -kSa +jrf +waR +kqZ +sqF +uZq +oaW +hDo +wZD xTb -fdd -cbx +eMu +oeW ckI -eDG +bfx fAA omW omW @@ -285667,27 +285666,27 @@ dDz aXR rPo hKL -nKu -mrj +ksC +tyq uhZ -qbq -lSz -dOe +luY +eew +usT rrj uhZ -rTc -xVk +cra +qel diy vPE -vNf -okq -gyk -djV +wtz +ykU +tFD +bVa ezA -uQF -pay +bho +rdo ejU -iQk +vgQ pxu nTa peR @@ -285928,18 +285927,18 @@ kBE mQk uhZ uhZ -gvd +tTL mZf hbN uhZ -vIN -xlv -lBe -nUS -oRN -deR -aBT -xdN +gAZ +xAV +scd +uQn +xDv +lcM +fsG +gAc wxI wxI wxI @@ -286183,22 +286182,22 @@ ykT bay eaG dZJ -rRb -ycZ -jJE +tOl +oHj +anp aSY -uhe -rHq +tPL +hNL cuF cuF cuF cuF -wgd -mfc -cTt -hrz +dmn +lYI +bXD +bRM lGT -erE +mcc ksS egD vcX @@ -286441,7 +286440,7 @@ lVE uzc wOh sOq -pwt +hIp aku hsA ujy @@ -286452,8 +286451,8 @@ ujy ujy uwD aku -jFk -tgE +tPY +xUK erO kwJ ioG @@ -286466,7 +286465,7 @@ mDX jgH dHf aLr -pam +iAJ eSV eSV eSV @@ -286695,19 +286694,19 @@ sGz fvA xTY hFk -fng -cPK +wNX +iNe xDF -ycZ -atF -dNQ -fSj +oHj +jCE +hHh +gje xtZ -dSo +lXQ wvQ wvQ wvQ -lsE +omp eCK etm rGR @@ -286961,11 +286960,11 @@ wuC sMi jXA nBM -dqT -feW -kcf +bZv +bVO +nTD gKM -xYJ +xuA etm rGR erO @@ -287222,8 +287221,8 @@ tev tev tev nBM -aOF -paF +tXu +nRP rGR lFR kHw @@ -287479,7 +287478,7 @@ jdG tof bQH nBM -vLY +hEC etm rGR erO @@ -287736,13 +287735,13 @@ jdG vOx hut uGv -nAk +szD bUs -tHD +lqJ xPP cGB wDb -nHn +tjA wYW kPH hEJ @@ -287993,9 +287992,9 @@ jdG nfm lHH nBM -jTm +hoQ xoP -iDJ +kBr xFc aAO mCY @@ -288265,7 +288264,7 @@ lYS plb ewn urZ -pam +iAJ eSV eSV eSV @@ -290064,7 +290063,7 @@ eMH dsB aVk nxk -pam +iAJ eSV eSV eSV @@ -291337,14 +291336,14 @@ sRg eWI sIA xKD -bEE +qhx hCm hCm hCm hCm hCm hCm -bEE +qhx hCm lEF eSV @@ -434513,7 +434512,7 @@ cht cht cht xYP -wEo +hcX gIk auP auP @@ -439325,7 +439324,7 @@ eSV eSV tcP tcP -oYn +vJm jZs byK byK @@ -440970,7 +440969,7 @@ eSV vZj ozQ xbA -xsp +iYF ixY kQx ozQ @@ -441691,7 +441690,7 @@ bDa hHR bFZ eDQ -gHP +wIr pCo eDw sEA @@ -445831,8 +445830,8 @@ dpX dcc dcc eRW -lNs -bVn +dIk +swj lPN ioe nHE diff --git a/tools/findForbiddenMapTypes.py b/tools/findForbiddenMapTypes.py new file mode 100644 index 00000000000..fbc4f5cb95e --- /dev/null +++ b/tools/findForbiddenMapTypes.py @@ -0,0 +1,67 @@ +import json +import os +import sys +from pathlib import Path + +def check_forbidden_types(): + # Read the forbidden type mappings + json_path = Path("maps/forbiddenMapTypes.json") + + with open(json_path, 'r') as f: + data = json.load(f) + + failed = False + missing_maps = [] + illegal_types = [] + + # Loop through each forbidden type mapping + for mapping in data["forbidden_type_mappings"]: + title = mapping["title"] + maps = mapping["maps"] + forbidden_types = mapping["forbidden_types"] + print(f"Linting step - {title}") + print(f" - Maps: {', '.join(maps)}") + print(f" - Forbidden types: {', '.join(forbidden_types)}") + + # Loop through each map in this mapping + for map_name in maps: + # Recursively search for the map file in maps/ directory + map_path = None + for root, dirs, files in os.walk(Path("maps")): + if map_name in files: + map_path = Path(root) / map_name + break + + # Check if map file was found + if map_path is None: + missing_maps.append(f"- {map_name} (step: {title})") + failed = True + break + + # Read the map file + with open(map_path, 'r') as f: + map_content = f.read() + + # Search for each forbidden type + for forbidden_type in forbidden_types: + if forbidden_type in map_content: + illegal_types.append(f"- {map_name} - {forbidden_type} (step: {title})") + failed = True + + # Print results + if failed: + print(" ===== LINT FAILED =====") + if missing_maps: + print("Maps not found:") + for item in missing_maps: + print(item) + if illegal_types: + print("Forbidden types found:") + for item in illegal_types: + print(item) + sys.exit(1) + else: + print(" ===== LINT PASSED =====") + +if __name__ == "__main__": + check_forbidden_types()