diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 03d7cbd3fc6..57d9a3a2905 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,7 +11,7 @@ /code/__defines/master_controller.dm @Arrow768 /code/controllers/master @Arrow768 /code/controllers/subsystems/fail2topic.dm @Arrow768 -/code/world.dm @Arrow768 +/code/game/world.dm @Arrow768 /code/modules/admin/ @Arrow768 /code/modules/web_interface/ @Arrow768 /code/modules/world_api/ @Arrow768 diff --git a/.github/workflows/byond.yml b/.github/workflows/byond.yml index d4744593ad1..323bbef4440 100644 --- a/.github/workflows/byond.yml +++ b/.github/workflows/byond.yml @@ -15,7 +15,7 @@ on: env: MACRO_COUNT: 0 GENDER_COUNT: 6 - TO_WORLD_COUNT: 186 + TO_WORLD_COUNT: 187 #These variables are filled from dependencies.sh inside the steps, DO NOT SET THEM HERE BYOND_MAJOR: "" diff --git a/.tgs.yml b/.tgs.yml index 402699ffcdc..9fbd3d2cf8f 100644 --- a/.tgs.yml +++ b/.tgs.yml @@ -3,7 +3,7 @@ version: 1 # The BYOND version to use (kept in sync with dependencies.sh by the "TGS Test Suite" CI job) # Must be interpreted as a string, keep quoted -byond: "515.1619" +byond: "515.1620" # Folders to create in "/Configuration/GameStaticFiles/" static_files: # Config directory should be static diff --git a/aurorastation.dme b/aurorastation.dme index 116c3671338..489a393a944 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -16,7 +16,6 @@ #include "code\hub.dm" #include "code\names.dm" #include "code\stylesheet.dm" -#include "code\world.dm" #include "code\__datastructures\stack.dm" #include "code\__defines\_click.dm" #include "code\__defines\_common.dm" @@ -24,6 +23,7 @@ #include "code\__defines\_layers.dm" #include "code\__defines\_macros.dm" #include "code\__defines\_unit_tests.dm" +#include "code\__defines\_world.dm" #include "code\__defines\accessories.dm" #include "code\__defines\admin.dm" #include "code\__defines\antagonist.dm" @@ -350,6 +350,7 @@ #include "code\datums\ruins.dm" #include "code\datums\sound_player.dm" #include "code\datums\statistic.dm" +#include "code\datums\tgs_event_handler.dm" #include "code\datums\tgui_module.dm" #include "code\datums\weakref.dm" #include "code\datums\components\_component.dm" @@ -498,6 +499,7 @@ #include "code\game\shuttle_engines.dm" #include "code\game\sound.dm" #include "code\game\supplyshuttle.dm" +#include "code\game\world.dm" #include "code\game\antagonist\_antagonist_setup.dm" #include "code\game\antagonist\antagonist.dm" #include "code\game\antagonist\antagonist_add.dm" @@ -814,7 +816,6 @@ #include "code\game\machinery\spaceheater.dm" #include "code\game\machinery\stargazer.dm" #include "code\game\machinery\stasis_bed.dm" -#include "code\game\machinery\station_holomap.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" #include "code\game\machinery\status_display_snowflakes.dm" @@ -2643,7 +2644,11 @@ #include "code\modules\modular_computers\file_system\program_events.dm" #include "code\modules\modular_computers\file_system\script.dm" #include "code\modules\modular_computers\file_system\programs\_program.dm" -#include "code\modules\modular_computers\file_system\programs\app_presets.dm" +#include "code\modules\modular_computers\file_system\programs\app_presets_.dm" +#include "code\modules\modular_computers\file_system\programs\app_presets_antag.dm" +#include "code\modules\modular_computers\file_system\programs\app_presets_crew.dm" +#include "code\modules\modular_computers\file_system\programs\app_presets_equipment.dm" +#include "code\modules\modular_computers\file_system\programs\app_presets_third_party.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" #include "code\modules\modular_computers\file_system\programs\civilian\cargo_control.dm" #include "code\modules\modular_computers\file_system\programs\civilian\cargo_delivery.dm" @@ -2664,6 +2669,7 @@ #include "code\modules\modular_computers\file_system\programs\games\arcade.dm" #include "code\modules\modular_computers\file_system\programs\generic\lawmanager.dm" #include "code\modules\modular_computers\file_system\programs\generic\manifest.dm" +#include "code\modules\modular_computers\file_system\programs\generic\map.dm" #include "code\modules\modular_computers\file_system\programs\generic\news_browser.dm" #include "code\modules\modular_computers\file_system\programs\generic\ntnrc_client.dm" #include "code\modules\modular_computers\file_system\programs\generic\records.dm" @@ -3565,8 +3571,11 @@ #include "maps\away\ships\dionae\diona_rokz_ship\diona_rokz_ship_ghostroles.dm" #include "maps\away\ships\dionae\diona_serz_ship\diona_serz_ship.dm" #include "maps\away\ships\dionae\diona_serz_ship\diona_serz_ship_ghostroles.dm" -#include "maps\away\ships\dominia\dominian_corvette.dm" -#include "maps\away\ships\dominia\dominian_corvette_ghostroles.dm" +#include "maps\away\ships\dominia\dominian_corvette\dominian_corvette.dm" +#include "maps\away\ships\dominia\dominian_corvette\dominian_corvette_ghostroles.dm" +#include "maps\away\ships\dominia\dominian_unathi_privateer\dominian_unathi_privateer.dm" +#include "maps\away\ships\dominia\dominian_unathi_privateer\dominian_unathi_privateer_areas.dm" +#include "maps\away\ships\dominia\dominian_unathi_privateer\dominian_unathi_privateer_ghostroles.dm" #include "maps\away\ships\dpra\hailstorm\hailstorm_areas.dm" #include "maps\away\ships\dpra\hailstorm\hailstorm_ghostroles.dm" #include "maps\away\ships\dpra\hailstorm\hailstorm_ship.dm" diff --git a/code/__defines/_unit_tests.dm b/code/__defines/_unit_tests.dm index 8ebdb2ebad4..cd7e692a9a0 100644 --- a/code/__defines/_unit_tests.dm +++ b/code/__defines/_unit_tests.dm @@ -1,7 +1,7 @@ //include unit test files in this module in this ifdef //Keep this sorted alphabetically -// #if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) //tgstation style, not relevant for us, for now +// #if defined(UNIT_TEST) || defined(SPACEMAN_DMM) //tgstation style, not relevant for us, for now /// Constants indicating unit test completion status #define UNIT_TEST_FAILED null diff --git a/code/__defines/_world.dm b/code/__defines/_world.dm new file mode 100644 index 00000000000..faab1b10332 --- /dev/null +++ b/code/__defines/_world.dm @@ -0,0 +1,3 @@ +#define WORLD_ICON_SIZE 32 +#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 +#define WORLD_MIN_SIZE 32 diff --git a/code/__defines/manual_unit_testing.dm b/code/__defines/manual_unit_testing.dm index c3d055a946a..f3dcdcb031e 100644 --- a/code/__defines/manual_unit_testing.dm +++ b/code/__defines/manual_unit_testing.dm @@ -1,3 +1,7 @@ // !!! For manual use only, remember to recomment before PRing !!! // #define UNIT_TEST // #define MANUAL_UNIT_TEST + +#if defined(MANUAL_UNIT_TEST) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) + #warn Manual unit test is defined, remember to recomment it before PRing! +#endif // MANUAL_UNIT_TEST diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm index c100de05bae..99b2578cd74 100644 --- a/code/__defines/math_physics.dm +++ b/code/__defines/math_physics.dm @@ -16,9 +16,14 @@ #define RADIATOR_EXPOSED_SURFACE_AREA_RATIO 0.04 // (3 cm + 100 cm * sin(3deg))/(2*(3+100 cm)). Unitless ratio. #define HUMAN_EXPOSED_SURFACE_AREA 5.2 //m^2, surface area of 1.7m (H) x 0.46m (D) cylinder -#define T0C 273.15 // 0.0 degrees celcius -#define T20C 293.15 // 20.0 degrees celcius -#define TCMB 2.7 // -270.3 degrees celcius +/// 0.0 Degrees celsius, in Kelvin +#define T0C 273.15 + +/// 20.0 Degrees celsius, in Kelvin +#define T20C 293.15 + +/// -270.3 degrees celsius, in Kelvin +#define TCMB 2.7 #define QUANTIZE(variable) (round(variable,0.0001)) #define ROUND_UP(x) ( -round(-(x))) diff --git a/code/__defines/minimap.dm b/code/__defines/minimap.dm index 99076da7397..74781d9b0bd 100644 --- a/code/__defines/minimap.dm +++ b/code/__defines/minimap.dm @@ -1,41 +1,23 @@ // -// Constants and standard colors for the holomap +// Constants and standard colors for the holomap/minimap // -#define HOLOMAP_ICON 'icons/480x480.dmi' // Icon file to start with when drawing holomaps (to get a 480x480 canvas). -#define HOLOMAP_ICON_SIZE 480 // Pixel width & height of the holomap icon. Used for auto-centering etc. -#define ui_holomap "CENTER-7, CENTER-7" // Screen location of the holomap "hud" - // Holomap colors -#define HOLOMAP_OBSTACLE "#FFFFFFDD" // Color of walls and barriers -#define HOLOMAP_PATH "#66666699" // Color of floors +#define HOLOMAP_OBSTACLE "#FFFFFF" // Color of walls and barriers +#define HOLOMAP_PATH "#666666" // Color of floors #define HOLOMAP_HOLOFIER "#79FF79" // Whole map is multiplied by this to give it a green holoish look -#define HOLOMAP_AREACOLOR_COMMAND "#386d8099" -#define HOLOMAP_AREACOLOR_SECURITY "#ae121299" -#define HOLOMAP_AREACOLOR_MEDICAL "#6f9e00c2" -#define HOLOMAP_AREACOLOR_SCIENCE "#A154A699" -#define HOLOMAP_AREACOLOR_ENGINEERING "#F1C23199" -#define HOLOMAP_AREACOLOR_OPERATIONS "#E06F0099" -#define HOLOMAP_AREACOLOR_HALLWAYS "#ffffffa5" -#define HOLOMAP_AREACOLOR_DOCK "#0000FFCC" +#define HOLOMAP_AREACOLOR_COMMAND "#386d80" +#define HOLOMAP_AREACOLOR_SECURITY "#ae1212" +#define HOLOMAP_AREACOLOR_MEDICAL "#6f9e00" +#define HOLOMAP_AREACOLOR_SCIENCE "#A154A6" +#define HOLOMAP_AREACOLOR_ENGINEERING "#F1C231" +#define HOLOMAP_AREACOLOR_OPERATIONS "#E06F00" +#define HOLOMAP_AREACOLOR_HALLWAYS "#ffffff" +#define HOLOMAP_AREACOLOR_DOCK "#0000FF" #define HOLOMAP_AREACOLOR_HANGAR "#777777" -#define HOLOMAP_AREACOLOR_CIVILIAN "#5bc1c199" +#define HOLOMAP_AREACOLOR_CIVILIAN "#5bc1c1" // If someone can come up with a non-conflicting color for the lifts, please update this. #define HOLOMAP_AREACOLOR_LIFTS null -// Handy defines to lookup the pixel offsets for this Z-level. Cache these if you use them in a loop tho. -// Commenting these out for now. Replace if we ever datumize our maps. -/*#define HOLOMAP_PIXEL_OFFSET_X(zLevel) ((using_map.holomap_offset_x.len >= zLevel) ? using_map.holomap_offset_x[zLevel] : 0) -#define HOLOMAP_PIXEL_OFFSET_Y(zLevel) ((using_map.holomap_offset_y.len >= zLevel) ? using_map.holomap_offset_y[zLevel] : 0) -#define HOLOMAP_LEGEND_X(zLevel) ((using_map.holomap_legend_x.len >= zLevel) ? using_map.holomap_legend_x[zLevel] : 96) -#define HOLOMAP_LEGEND_Y(zLevel) ((using_map.holomap_legend_y.len >= zLevel) ? using_map.holomap_legend_y[zLevel] : 96)*/ - -#define HOLOMAP_PIXEL_OFFSET_X(zlevel) ((HOLOMAP_ICON_SIZE - world.maxx) / 2) -#define HOLOMAP_PIXEL_OFFSET_Y(zlevel) ((HOLOMAP_ICON_SIZE - world.maxx) / 2) -#define HOLOMAP_LEGEND_X(zlevel) 96 -#define HOLOMAP_LEGEND_Y(zlevel) 96 -#define HOLOMAP_EXTRA_STATIONMAP "stationmapformatted" -#define HOLOMAP_EXTRA_STATIONMAPAREAS "stationareas" -#define HOLOMAP_EXTRA_STATIONMAPSMALL "stationmapsmall" diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 76f7f784a19..a0a79ea0813 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -5,7 +5,6 @@ #define SS_INIT_JOBS 21 #define SS_INIT_MAPFINALIZE 20 // Asteroid generation. #define SS_INIT_PARALLAX 19 // Parallax image cache generation. Must run before ghosts are able to join. -#define SS_INIT_HOLOMAP 18 #define SS_INIT_ATOMS 17 // World initialization. Will trigger lighting updates. Observers can join after this loads. #define SS_INIT_ASSETS 16 // Assets subsystem setup. #define SS_INIT_POWER 15 // Initial powernet build. @@ -26,9 +25,10 @@ #define SS_INIT_LIGHTING 0 // Generation of lighting overlays and pre-bake. May cause openturf updates, should initialize before SSzcopy. #define SS_INIT_ZCOPY -1 // Z-mimic flush. Should run after SSoverlay & SSicon_smooth so it copies the smoothed sprites. #define SS_INIT_XENOARCH -2 // Xenoarch is this far below because it can infinite loop if placed in SS_INIT_MISC as it was before, due to some subsystems spawning stuff there. -#define SS_INIT_LOBBY -3 // Lobby timer starts here. The lobby timer won't actually start going down until the MC starts ticking, so you probably want this last -#define SS_INIT_PING -4 // Pinger for the clients -#define SS_INIT_CHAT -5 // To ensure chat remains smooth during init. +#define SS_INIT_HOLOMAP -3 // Minimap subsystem. Should be initialized after all maps, away sites, ships, planets, etc. +#define SS_INIT_LOBBY -4 // Lobby timer starts here. The lobby timer won't actually start going down until the MC starts ticking, so you probably want this last +#define SS_INIT_PING -5 // Pinger for the clients +#define SS_INIT_CHAT -6 // To ensure chat remains smooth during init. // Something to remember when setting priorities: SS_TICKER runs before Normal, which runs before SS_BACKGROUND. // Each group has its own priority bracket. diff --git a/code/__defines/tgs.dm b/code/__defines/tgs.dm index 3cdb22834ab..e1f89bb1317 100644 --- a/code/__defines/tgs.dm +++ b/code/__defines/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "6.0.2" +#define TGS_DMAPI_VERSION "6.6.2" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -12,20 +12,20 @@ // Comment this out once you've filled in the below. //#error TGS API unconfigured -// Uncomment this if you wish to allow the game to interact with TGS 3. -// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() +// Uncomment this if you wish to allow the game to interact with TGS 3.. +// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()(). //#define TGS_V3_API // Required interfaces (fill in with your codebase equivalent): /// Create a global variable named `Name` and set it to `Value`. -#define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) var/global/_tgs_##Name = ##Value +#define TGS_DEFINE_AND_SET_GLOBAL(Name, Value) var/global/##Name = ##Value /// Read the value in the global variable `Name`. -#define TGS_READ_GLOBAL(Name) global._tgs_##Name +#define TGS_READ_GLOBAL(Name) global.##Name /// Set the value in the global variable `Name` to `Value`. -#define TGS_WRITE_GLOBAL(Name, Value) global._tgs_##Name = ##Value +#define TGS_WRITE_GLOBAL(Name, Value) global.##Name = ##Value /// Disallow ANYONE from reflecting a given `path`, security measure to prevent in-game use of DD -> TGS capabilities. #define TGS_PROTECT_DATUM(Path) @@ -52,44 +52,46 @@ // EVENT CODES -/// Before a reboot mode change, extras parameters are the current and new reboot mode enums +/// Before a reboot mode change, extras parameters are the current and new reboot mode enums. #define TGS_EVENT_REBOOT_MODE_CHANGE -1 -/// Before a port change is about to happen, extra parameters is new port +/// Before a port change is about to happen, extra parameters is new port. #define TGS_EVENT_PORT_SWAP -2 -/// Before the instance is renamed, extra parameter is the new name +/// Before the instance is renamed, extra parameter is the new name. #define TGS_EVENT_INSTANCE_RENAMED -3 -/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server +/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server. #define TGS_EVENT_WATCHDOG_REATTACH -4 +/// When the watchdog sends a health check to DD. No parameters. +#define TGS_EVENT_HEALTH_CHECK -5 -/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA +/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA. #define TGS_EVENT_REPO_RESET_ORIGIN 0 -/// When the repository performs a checkout. Parameters: Checkout git object +/// When the repository performs a checkout. Parameters: Checkout git object. #define TGS_EVENT_REPO_CHECKOUT 1 -/// When the repository performs a fetch operation. No parameters +/// When the repository performs a fetch operation. No parameters. #define TGS_EVENT_REPO_FETCH 2 -/// When the repository test merges. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user +/// When the repository test merges. Parameters: PR Number, PR Sha, (Nullable) Comment made by TGS user. #define TGS_EVENT_REPO_MERGE_PULL_REQUEST 3 -/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path +/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path. #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 -/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND +/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND. #define TGS_EVENT_BYOND_INSTALL_START 5 /// When a BYOND install operation fails. Parameters: Error message #define TGS_EVENT_BYOND_INSTALL_FAIL 6 -/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND +/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND. #define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 -/// When the compiler starts running. Parameters: Game directory path, origin commit SHA +/// When the compiler starts running. Parameters: Game directory path, origin commit SHA. #define TGS_EVENT_COMPILE_START 8 -/// When a compile is cancelled. No parameters +/// When a compile is cancelled. No parameters. #define TGS_EVENT_COMPILE_CANCELLED 9 -/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation +/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation. #define TGS_EVENT_COMPILE_FAILURE 10 -/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path +/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path. #define TGS_EVENT_COMPILE_COMPLETE 11 -/// When an automatic update for the current instance begins. No parameters +/// When an automatic update for the current instance begins. No parameters. #define TGS_EVENT_INSTANCE_AUTO_UPDATE_START 12 -/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference +/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference. #define TGS_EVENT_REPO_MERGE_CONFLICT 13 -/// When a deployment completes. No Parameters +/// When a deployment completes. No Parameters. #define TGS_EVENT_DEPLOYMENT_COMPLETE 14 /// Before the watchdog shuts down. Not sent for graceful shutdowns. No parameters. #define TGS_EVENT_WATCHDOG_SHUTDOWN 15 @@ -102,6 +104,14 @@ // #define TGS_EVENT_WORLD_REBOOT 20 /// Watchdog event when TgsInitializationComplete() is called. No parameters. #define TGS_EVENT_WORLD_PRIME 21 +// DMAPI also doesnt implement this +// #define TGS_EVENT_DREAM_DAEMON_LAUNCH 22 +/// After a single submodule update is performed. Parameters: Updated submodule name. +#define TGS_EVENT_REPO_SUBMODULE_UPDATE 23 +/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, byond version. +#define TGS_EVENT_PRE_DREAM_MAKER 24 +/// Whenever a deployment folder is deleted from disk. Parameters: Game directory path. +#define TGS_EVENT_DEPLOYMENT_CLEANUP 25 // OTHER ENUMS @@ -119,6 +129,13 @@ /// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 +/// DreamDaemon public visibility level. +#define TGS_VISIBILITY_PUBLIC 0 +/// DreamDaemon private visibility level. +#define TGS_VISIBILITY_PRIVATE 1 +/// DreamDaemon invisible visibility level. +#define TGS_VISIBILITY_INVISIBLE 2 + //REQUIRED HOOKS /** @@ -135,7 +152,6 @@ * * This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running. * Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184 - * Before this point, note that any static files or directories may be in use by another server. Your code should account for this. * This function should not be called before ..() in [/world/proc/New]. */ /world/proc/TgsInitializationComplete() @@ -145,12 +161,11 @@ #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return /** - * Call this at the beginning of [world/proc/Reboot]. + * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). */ /world/proc/TgsReboot() return - // DATUM DEFINITIONS // All datums defined here should be considered read-only @@ -158,31 +173,30 @@ /datum/tgs_revision_information /// Full SHA of the commit. var/commit - /// ISO 8601 timestamp of when the commit was created + /// ISO 8601 timestamp of when the commit was created. var/timestamp /// Full sha of last known remote commit. This may be null if the TGS repository is not currently tracking a remote branch. var/origin_commit /// Represents a version. /datum/tgs_version - /// The suite/major version number + /// The suite/major version number. var/suite - // This group of variables can be null to represent a wild card - /// The minor version number. null for wildcards + // This group of variables can be null to represent a wild card. + /// The minor version number. null for wildcards. var/minor - /// The patch version number. null for wildcards + /// The patch version number. null for wildcards. var/patch - /// Legacy version number. Generally null + /// Legacy version number. Generally null. var/deprecated_patch - /// Unparsed string value + /// Unparsed string value. var/raw_parameter - /// String value minus prefix + /// String value minus prefix. var/deprefixed_parameter - /** * Returns [TRUE]/[FALSE] based on if the [/datum/tgs_version] contains wildcards. */ @@ -226,40 +240,49 @@ var/is_admin_channel /// [TRUE]/[FALSE] if the channel is a private message channel for a [/datum/tgs_chat_user]. var/is_private_channel - /// Tag string associated with the channel in TGS + /// Tag string associated with the channel in TGS. var/custom_tag + /// [TRUE]/[FALSE] if the channel supports embeds. + var/embeds_supported // Represents a chat user /datum/tgs_chat_user /// TGS internal user ID. var/id - // The user's display name. + /// The user's display name. var/friendly_name - // The string to use to ping this user in a message. + /// The string to use to ping this user in a message. var/mention - /// The [/datum/tgs_chat_channel] the user was from + /// The [/datum/tgs_chat_channel] the user was from. var/datum/tgs_chat_channel/channel +/// User definable handler for TGS events. +/datum/tgs_event_handler + /// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events. + var/receive_health_checks = FALSE + /** * User definable callback for handling TGS events. * - * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each + * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each. */ /datum/tgs_event_handler/proc/HandleEvent(event_code, ...) set waitfor = FALSE return -/// User definable chat command +/// User definable chat command. /datum/tgs_chat_command - /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...` + /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`. var/name = "" - /// The help text displayed for this command + /// The help text displayed for this command. var/help_text = "" - /// If this command should be available to game administrators only + /// If this command should be available to game administrators only. var/admin_only = FALSE + /// A subtype of [/datum/tgs_chat_command] that is ignored when enumerating available commands. Use this to create shared base /datums for commands. + var/ignore_type /** - * Process command activation. Should return a string to respond to the issuer with. + * Process command activation. Should return a [/datum/tgs_message_content] to respond to the issuer with. * * sender - The [/datum/tgs_chat_user] who issued the command. * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. @@ -267,6 +290,107 @@ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") +/// User definable chat message. +/datum/tgs_message_content + /// The tring content of the message. Must be provided in New(). + var/text + + /// The [/datum/tgs_chat_embed] to embed in the message. Not supported on all chat providers. + var/datum/tgs_chat_embed/structure/embed + +/datum/tgs_message_content/New(text) + if(!istext(text)) + TGS_ERROR_LOG("[/datum/tgs_message_content] created with no text!") + text = null + + src.text = text + +/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/channel#embed-object-embed-structure for details. +/datum/tgs_chat_embed/structure + var/title + var/description + var/url + + /// Timestamp must be encoded as: time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss"). Use the active timezone. + var/timestamp + + /// Colour must be #AARRGGBB or #RRGGBB hex string. + var/colour + + /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. + var/datum/tgs_chat_embed/media/image + + /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure for details. + var/datum/tgs_chat_embed/media/thumbnail + + /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. + var/datum/tgs_chat_embed/media/video + + var/datum/tgs_chat_embed/footer/footer + var/datum/tgs_chat_embed/provider/provider + var/datum/tgs_chat_embed/provider/author/author + + var/list/datum/tgs_chat_embed/field/fields + +/// Common datum for similar discord embed medias. +/datum/tgs_chat_embed/media + /// Must be set in New(). + var/url + var/width + var/height + var/proxy_url + +/datum/tgs_chat_embed/media/New(url) + if(!istext(url)) + CRASH("[/datum/tgs_chat_embed/media] created with no url!") + + src.url = url + +/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure for details. +/datum/tgs_chat_embed/footer + /// Must be set in New(). + var/text + var/icon_url + var/proxy_icon_url + +/datum/tgs_chat_embed/footer/New(text) + if(!istext(text)) + CRASH("[/datum/tgs_chat_embed/footer] created with no text!") + + src.text = text + +/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure for details. +/datum/tgs_chat_embed/provider + var/name + var/url + +/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure for details. Must have name set in New(). +/datum/tgs_chat_embed/provider/author + var/icon_url + var/proxy_icon_url + +/datum/tgs_chat_embed/provider/author/New(name) + if(!istext(name)) + CRASH("[/datum/tgs_chat_embed/provider/author] created with no name!") + + src.name = name + +/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure for details. Must have name and value set in New(). +/datum/tgs_chat_embed/field + var/name + var/value + var/is_inline + +/datum/tgs_chat_embed/field/New(name, value) + if(!istext(name)) + CRASH("[/datum/tgs_chat_embed/field] created with no name!") + + if(!istext(value)) + CRASH("[/datum/tgs_chat_embed/field] created with no value!") + + src.name = name + src.value = value + // API FUNCTIONS /// Returns the maximum supported [/datum/tgs_version] of the DMAPI. @@ -286,75 +410,77 @@ // No function below this succeeds if it TgsAvailable() returns FALSE or if TgsNew() has yet to be called. /** - * Forces a hard reboot of DreamDaemon by ending the process. + * Forces a hard reboot of DreamDaemon by ending the process. This function may sleep! * * Unlike del(world) clients will try to reconnect. - * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again + * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again. */ /world/proc/TgsEndProcess() return /** - * Send a message to connected chats. + * Send a message to connected chats. This function may sleep! * - * message - The string to send. + * message - The [/datum/tgs_message_content] to send. * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. */ -/world/proc/TgsTargetedChatBroadcast(message, admin_only = FALSE) +/world/proc/TgsTargetedChatBroadcast(datum/tgs_message_content/message, admin_only = FALSE) return /** - * Send a private message to a specific user. + * Send a private message to a specific user. This function may sleep! * - * message - The string to send. + * message - The [/datum/tgs_message_content] to send. * user: The [/datum/tgs_chat_user] to PM. */ -/world/proc/TgsChatPrivateMessage(message, datum/tgs_chat_user/user) +/world/proc/TgsChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user) return -// The following functions will sleep if a call to TgsNew() is sleeping - /** - * Send a message to connected chats that are flagged as game-related in TGS. + * Send a message to connected chats that are flagged as game-related in TGS. This function may sleep! * - * message - The string to send. + * message - The [/datum/tgs_message_content] to send. * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. */ -/world/proc/TgsChatBroadcast(message, list/channels = null) +/world/proc/TgsChatBroadcast(datum/tgs_message_content/message, list/channels = null) return -/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. +/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsVersion() return -/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. +/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsApiVersion() return -/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. +/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsInstanceName() return -/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. +/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsRevision() return -/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. +/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsSecurityLevel() return -/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. +/// Returns the current BYOND visibility level as a TGS_VISIBILITY_ define if TGS is present, null otherwise. Requires TGS to be using interop API version 5 or higher otherwise the string "___unimplemented" wil be returned. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! +/world/proc/TgsVisibility() + return + +/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsTestMerges() return -/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. +/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsChatChannelInfo() return /* The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2017-2023 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 891d141adae..5ec29e359f2 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1017,7 +1017,6 @@ var/list/wall_items = typecacheof(list( /obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment, - /obj/machinery/station_map, /obj/structure/sign )) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index da23341b8dd..e6b00d9b296 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -20,7 +20,6 @@ var/list/global_huds var/obj/screen/thermal var/obj/screen/meson var/obj/screen/science - var/obj/screen/holomap /datum/global_hud/proc/setup_overlay(var/icon_state, var/color) var/obj/screen/screen = new /obj/screen() @@ -64,18 +63,6 @@ var/list/global_huds meson = setup_overlay("scanline", "#9fd800") science = setup_overlay("scanline", "#d600d6") - // The holomap screen object is actually totally invisible. - // Station maps work by setting it as an images location before sending to client, not - // actually changing the icon or icon state of the screen object itself! - // Why do they work this way? I don't know really, that is how /vg/ designed them, but since they DO - // work this way, we can take advantage of their immutability by making them part of - // the global_hud (something we have and /vg/ doesn't) instead of an instance per mob. - holomap = new /obj/screen() - holomap.name = "holomap" - holomap.icon = null - holomap.screen_loc = ui_holomap - holomap.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/obj/screen/O var/i //that nasty looking dither you get when you're short-sighted diff --git a/code/controllers/subsystems/initialization/holomap.dm b/code/controllers/subsystems/initialization/holomap.dm index e85617e718e..7e1849e3f5b 100644 --- a/code/controllers/subsystems/initialization/holomap.dm +++ b/code/controllers/subsystems/initialization/holomap.dm @@ -6,35 +6,39 @@ SUBSYSTEM_DEF(holomap) flags = SS_NO_FIRE init_order = SS_INIT_HOLOMAP - var/list/holo_minimaps = list() - var/list/extra_minimaps = list() - var/list/station_holomaps = list() + /// List of images of minimaps, for every z-level, initialized at round start. + /// This is the "base" minimap, shows only the physical structure of walls and paths, and respects `HIDE_FROM_HOLOMAP`. + /// Key of list is the `z` of the z-level, value is the `/icon/`. + /// Every image is 255x255px. + var/list/minimaps = list() -/datum/controller/subsystem/holomap/Initialize() - holo_minimaps.len = world.maxz - for (var/z in 1 to world.maxz) - holo_minimaps[z] = generateHoloMinimap(z) + /// Same as `minimaps`, but images are base64 encoded. + var/list/minimaps_base64 = list() - LOG_DEBUG("SSholomap: [holo_minimaps.len] maps.") - - for (var/z in current_map.station_levels) - generateStationMinimap(z) + /// Same as `minimaps_base64`, but the map is colored with `holomap_color` of the `/area/` + var/list/minimaps_area_colored_base64 = list() +/datum/controller/subsystem/holomap/Initialize() + generate_all_minimaps() + LOG_DEBUG("SSholomap: [minimaps.len] maps.") ..() +/datum/controller/subsystem/holomap/proc/generate_all_minimaps() + minimaps.len = world.maxz + minimaps_base64.len = world.maxz + minimaps_area_colored_base64.len = world.maxz -// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths. -/datum/controller/subsystem/holomap/proc/generateHoloMinimap(zlevel = 1) - // Save these values now to avoid a bazillion array lookups - var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zlevel) - var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zlevel) + for (var/z in 1 to world.maxz) + generate_minimap(z) + generate_minimap_area_colored(z) +/datum/controller/subsystem/holomap/proc/generate_minimap(zlevel = 1) // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime - var/icon/canvas = icon(HOLOMAP_ICON, "blank") - if(world.maxx + offset_x > canvas.Width()) - CRASH("Minimap for z=[zlevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]") - if(world.maxy + offset_y > canvas.Height()) - CRASH("Minimap for z=[zlevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]") + var/icon/canvas = icon('icons/255x255.dmi', "blank") + if(world.maxx > canvas.Width()) + CRASH("Minimap for z=[zlevel] : world.maxx ([world.maxx]) must be <= [canvas.Width()]") + if(world.maxy > canvas.Height()) + CRASH("Minimap for z=[zlevel] : world.maxy ([world.maxy]) must be <= [canvas.Height()]") var/list/rock_tcache = typecacheof(list( /turf/simulated/mineral, @@ -64,25 +68,22 @@ SUBSYSTEM_DEF(holomap) if (rock_tcache[Ttype]) continue if (obstacle_tcache[Ttype] || (T.contents.len && locate(/obj/structure/grille, T))) - canvas.DrawBox(HOLOMAP_OBSTACLE, T.x + offset_x, T.y + offset_y) + canvas.DrawBox(HOLOMAP_OBSTACLE + "DD", T.x, T.y) else if(path_tcache[Ttype] || (T.contents.len && locate(/obj/structure/lattice/catwalk, T))) - canvas.DrawBox(HOLOMAP_PATH, T.x + offset_x, T.y + offset_y) + canvas.DrawBox(HOLOMAP_PATH + "DD", T.x, T.y) CHECK_TICK - return canvas - -/datum/controller/subsystem/holomap/proc/generateStationMinimap(zlevel) - // Save these values now to avoid a bazillion array lookups - var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zlevel) - var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zlevel) + minimaps[zlevel] = canvas + minimaps_base64[zlevel] = icon2base64(canvas) +/datum/controller/subsystem/holomap/proc/generate_minimap_area_colored(zlevel) // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime - var/icon/canvas = icon(HOLOMAP_ICON, "blank") - if(world.maxx + offset_x > canvas.Width()) - crash_with("Minimap for z=[zlevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]") - if(world.maxy + offset_y > canvas.Height()) - crash_with("Minimap for z=[zlevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]") + var/icon/canvas = icon('icons/255x255.dmi', "blank") + if(world.maxx > canvas.Width()) + crash_with("Minimap for z=[zlevel] : world.maxx ([world.maxx]) must be <= [canvas.Width()]") + if(world.maxy > canvas.Height()) + crash_with("Minimap for z=[zlevel] : world.maxy ([world.maxy]) must be <= [canvas.Height()]") var/turf/T var/area/A @@ -90,30 +91,13 @@ SUBSYSTEM_DEF(holomap) T = thing A = T.loc if (A.holomap_color) - canvas.DrawBox(A.holomap_color, T.x + offset_x, T.y + offset_y) - - // Save this nice area-colored canvas in case we want to layer it or something I guess - extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zlevel]"] = canvas + canvas.DrawBox(A.holomap_color + "99", T.x, T.y) - var/icon/map_base = icon(holo_minimaps[zlevel]) + var/icon/map_base = icon(minimaps[zlevel]) map_base.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY) // Generate the full sized map by blending the base and areas onto the backdrop - var/icon/big_map = icon(HOLOMAP_ICON, "stationmap") + var/icon/big_map = icon('icons/255x255.dmi', "blank") big_map.Blend(map_base, ICON_OVERLAY) big_map.Blend(canvas, ICON_OVERLAY) - extra_minimaps["[HOLOMAP_EXTRA_STATIONMAP]_[zlevel]"] = big_map - - // Generate the "small" map (I presume for putting on wall map things?) - var/icon/small_map = icon(HOLOMAP_ICON, "blank") - small_map.Blend(map_base, ICON_OVERLAY) - small_map.Blend(canvas, ICON_OVERLAY) - small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE) - - // And rotate it in every direction of course! - var/icon/actual_small_map = icon(small_map) - actual_small_map.Insert(new_icon = small_map, dir = SOUTH) - actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST) - actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH) - actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST) - extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zlevel]"] = actual_small_map + minimaps_area_colored_base64[zlevel] = icon2base64(big_map) diff --git a/code/controllers/subsystems/initialization/misc_early.dm b/code/controllers/subsystems/initialization/misc_early.dm index bc08873202e..e656af280cc 100644 --- a/code/controllers/subsystems/initialization/misc_early.dm +++ b/code/controllers/subsystems/initialization/misc_early.dm @@ -18,7 +18,6 @@ SUBSYSTEM_DEF(misc_early) global_hud.thermal, global_hud.meson, global_hud.science, - global_hud.holomap ) // Populate global list of tips by category diff --git a/code/datums/tgs_event_handler.dm b/code/datums/tgs_event_handler.dm new file mode 100644 index 00000000000..9af3d85d61c --- /dev/null +++ b/code/datums/tgs_event_handler.dm @@ -0,0 +1,41 @@ +/datum/tgs_event_handler/impl + var/attached = TRUE + +/datum/tgs_event_handler/impl/HandleEvent(event_code, ...) + switch(event_code) + if(TGS_EVENT_REBOOT_MODE_CHANGE) + var/list/reboot_mode_lookup = list ("[TGS_REBOOT_MODE_NORMAL]" = "be normal", "[TGS_REBOOT_MODE_SHUTDOWN]" = "shutdown the server", "[TGS_REBOOT_MODE_RESTART]" = "hard restart the server") + var old_reboot_mode = args[2] + var new_reboot_mode = args[3] + message_admins("TGS: Reboot will no longer [reboot_mode_lookup["[old_reboot_mode]"]], it will instead [reboot_mode_lookup["[new_reboot_mode]"]]") + if(TGS_EVENT_PORT_SWAP) + message_admins("TGS: Changing port from [world.port] to [args[2]]") + if(TGS_EVENT_INSTANCE_RENAMED) + message_admins("TGS: Instance renamed to from [world.TgsInstanceName()] to [args[2]]") + if(TGS_EVENT_COMPILE_START) + message_admins("TGS: Deployment started, new game version incoming...") + if(TGS_EVENT_COMPILE_CANCELLED) + message_admins("TGS: Deployment cancelled!") + if(TGS_EVENT_COMPILE_FAILURE) + message_admins("TGS: Deployment failed!") + if(TGS_EVENT_DEPLOYMENT_COMPLETE) + message_admins("TGS: Deployment complete!") + if(TGS_EVENT_WATCHDOG_DETACH) + message_admins("TGS restarting...") + attached = FALSE + addtimer(CALLBACK(src, PROC_REF(LateOnReattach)), 600) + + if(TGS_EVENT_WATCHDOG_REATTACH) + var/datum/tgs_version/old_version = world.TgsVersion() + var/datum/tgs_version/new_version = args[2] + if(!old_version.Equals(new_version)) + message_admins("TGS updated to v[new_version.deprefixed_parameter]") + else + message_admins("TGS: Back online") + attached = TRUE + if(TGS_EVENT_WATCHDOG_SHUTDOWN) + to_world("Server is shutting down!") + +/datum/tgs_event_handler/impl/proc/LateOnReattach() + if(!attached) + message_admins("Warning: TGS hasn't notified us of it coming back for a full minute! Is there a problem?") diff --git a/code/game/ambience.dm b/code/game/ambience.dm index f1dda2fa713..ee309953fe1 100644 --- a/code/game/ambience.dm +++ b/code/game/ambience.dm @@ -157,11 +157,11 @@ //Defines Tension Ambience #define AMBIENCE_TENSION list(\ - 'sound/ambience/tension/tension.ogg',\ - 'sound/ambience/tension/argitoth.ogg',\ - 'sound/ambience/tension/horror.ogg',\ - 'sound/ambience/tension/burning_terror.ogg'\ - ) + 'sound/ambience/tension/tension.ogg',\ + 'sound/ambience/tension/argitoth.ogg',\ + 'sound/ambience/tension/horror.ogg',\ + 'sound/ambience/tension/burning_terror.ogg'\ + ) //CHOMP Edit Sounds for Substation rooms. Just electrical sounds, really. #define AMBIENCE_SUBSTATION list(\ 'sound/ambience/substation/substation1.ogg',\ diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 80ad130c8ce..cc46695ba53 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -779,7 +779,7 @@ pixel_x = 10; var/list/selected = TLV["temperature"] var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE) var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE) - var/input_temperature = tgui_input_number(usr, "What temperature would you like the system to mantain?", "Thermostat Controls", target_temperature - T0C, max_temperature - T0C, min_temperature - T0C) + var/input_temperature = tgui_input_number(usr, "What temperature would you like the system to mantain?", "Thermostat Controls", target_temperature - T0C, max_temperature, min_temperature) if(isnum(input_temperature)) var/temp = Clamp(input_temperature, min_temperature, max_temperature) if(input_temperature > max_temperature || input_temperature < min_temperature) diff --git a/code/game/machinery/station_holomap.dm b/code/game/machinery/station_holomap.dm deleted file mode 100644 index e61d99c0e3f..00000000000 --- a/code/game/machinery/station_holomap.dm +++ /dev/null @@ -1,245 +0,0 @@ -/obj/machinery/station_map - name = "holomap" - desc = "A virtual map of the surrounding area." - icon = 'icons/obj/machinery/stationmap.dmi' - icon_state = "station_map" - anchored = 1 - density = 0 - idle_power_usage = 10 - active_power_usage = 500 - - light_color = "#64C864" - light_power = 1 - light_range = 2 - gfi_layer_rotation = GFI_ROTATION_DEFDIR - - var/light_power_on = 1 - var/light_range_on = 2 - - layer = WINDOW_PANE_LAYER + 0.1 - - var/mob/watching_mob = null - var/image/small_station_map = null - var/image/floor_markings = null - var/image/panel = null - - var/original_zLevel = 1 // zLevel on which the station map was initialized. - var/bogus = TRUE // set to 0 when you initialize the station map on a zLevel that has its own icon formatted for use by station holomaps. - var/datum/station_holomap/holomap_datum - -/obj/machinery/station_map/Destroy() - SSholomap.station_holomaps -= src - stopWatching() - QDEL_NULL(holomap_datum) - return ..() - -/obj/machinery/station_map/Initialize() - . = ..() - init_map() - create_small_map() - add_floor_decal() - -/obj/machinery/station_map/proc/init_map() - holomap_datum = new() - original_zLevel = loc.z - SSholomap.station_holomaps += src - flags |= ON_BORDER // Why? It doesn't help if its not density - bogus = FALSE - var/turf/T = get_turf(src) - original_zLevel = T.z - if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in SSholomap.extra_minimaps)) - bogus = TRUE - holomap_datum.initialize_holomap_bogus() - update_icon() - return - - holomap_datum.initialize_holomap(T, reinit = TRUE) - -/obj/machinery/station_map/proc/create_small_map() - small_station_map = image(SSholomap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir) - small_station_map.layer = EFFECTS_ABOVE_LIGHTING_LAYER - small_station_map.filters = filter(type = "drop_shadow", color = light_color + "F0", size = 1, offset = 1, x = 0, y = 0) - -/obj/machinery/station_map/proc/add_floor_decal() - floor_markings = image('icons/obj/machinery/stationmap.dmi', "decal_station_map") - floor_markings.dir = src.dir - floor_markings.layer = ON_TURF_LAYER - update_icon() - -/obj/machinery/station_map/attack_hand(var/mob/user) - if(watching_mob && (watching_mob != user)) - to_chat(user, "Someone else is currently watching the holomap.") - return - if(user.loc != loc) - to_chat(user, "You need to stand in front of \the [src].") - return - startWatching(user) - -// Let people bump up against it to watch -/obj/machinery/station_map/CollidedWith(var/atom/movable/AM) - if(!watching_mob && isliving(AM) && AM.loc == loc) - startWatching(AM) - -// In order to actually get CollidedWith() we need to block movement. We're (visually) on a wall, so people -// couldn't really walk into us anyway. But in reality we are on the turf in front of the wall, so bumping -// against where we seem is actually trying to *exit* our real loc -/obj/machinery/station_map/CheckExit(atom/movable/mover as mob|obj, turf/target as turf) - // LOG_DEBUG("[src] (dir=[dir]) CheckExit([mover], [target]) get_dir() = [get_dir(target, loc)]") - if(get_dir(target, loc) == dir) // Opposite of "normal" since we are visually in the next turf over - return FALSE - else - return TRUE - -/obj/machinery/station_map/proc/startWatching(var/mob/user) - if(isliving(user) && anchored && !(stat & (NOPOWER|BROKEN))) - if(user.client) - holomap_datum.station_map.loc = global_hud.holomap // Put the image on the holomap hud - holomap_datum.station_map.alpha = 0 // Set to transparent so we can fade in - animate(holomap_datum.station_map, alpha = 255, time = 5, easing = LINEAR_EASING) - flick("station_map_activate", src) - user.client.screen |= global_hud.holomap - user.client.images |= holomap_datum.station_map - - watching_mob = user - moved_event.register(watching_mob, src, PROC_REF(checkPosition)) - destroyed_event.register(watching_mob, src, PROC_REF(stopWatching)) - update_use_power(POWER_USE_ACTIVE) - - if(bogus) - to_chat(user, "The holomap failed to initialize. This area of space cannot be mapped.") - else - to_chat(user, "A hologram of the station appears before your eyes.") - -/obj/machinery/station_map/attack_ai(var/mob/living/silicon/robot/user) - return // TODO - Implement for AI ~Leshana - // user.station_holomap.toggleHolomap(user, isAI(user)) - -/obj/machinery/station_map/process() - if((stat & (NOPOWER|BROKEN)) || !anchored) - stopWatching() - -/obj/machinery/station_map/proc/checkPosition() - if(!watching_mob || (watching_mob.loc != loc) || (dir != watching_mob.dir)) - stopWatching() - -/obj/machinery/station_map/proc/stopWatching() - if(watching_mob) - if(watching_mob.client) - animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING) - var/mob/M = watching_mob - addtimer(CALLBACK(src, PROC_REF(clear_image), M, holomap_datum.station_map), 5, TIMER_CLIENT_TIME)//we give it time to fade out - moved_event.unregister(watching_mob, src) - destroyed_event.unregister(watching_mob, src) - watching_mob = null - update_use_power(POWER_USE_IDLE) - -/obj/machinery/station_map/proc/clear_image(mob/M, image/I) - if (M.client) - M.client.images -= I - -/obj/machinery/station_map/power_change() - . = ..() - update_icon() - if(stat & NOPOWER) // Maybe port /vg/'s autolights? Done manually for now. - set_light(0) - else - set_light(light_range_on, light_power_on) - -/obj/machinery/station_map/proc/set_broken() - stat |= BROKEN - update_icon() - -/obj/machinery/station_map/update_icon() - cut_overlays() - if(stat & BROKEN) - icon_state = "station_mapb" - else if((stat & NOPOWER) || !anchored) - icon_state = "station_map0" - else - icon_state = "station_map" - - if(bogus) - holomap_datum.initialize_holomap_bogus() - else - small_station_map.icon = SSholomap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"] - add_overlay(small_station_map) - holomap_datum.initialize_holomap(get_turf(src)) - - // Put the little "map" overlay down where it looks nice - if(floor_markings) - floor_markings.dir = src.dir - floor_markings.pixel_x = -src.pixel_x - floor_markings.pixel_y = -src.pixel_y - add_overlay(floor_markings) - - if(panel_open) - add_overlay("station_map-panel") - else - cut_overlay("station_map-panel") - -/obj/machinery/station_map/ex_act(severity) - switch(severity) - if(1) - qdel(src) - if(2) - if (prob(50)) - qdel(src) - else - set_broken() - if(3) - if (prob(25)) - set_broken() - -// TODO: Make these constructable. - -/obj/machinery/station_map/mobile - use_power = POWER_USE_OFF - idle_power_usage = 0 - active_power_usage = 0 - -/obj/machinery/station_map/mobile/Initialize() - SHOULD_CALL_PARENT(FALSE) - init_map() - - initialized = TRUE - return INITIALIZE_HINT_NORMAL - -/obj/machinery/station_map/mobile/startWatching(var/mob/user) - if(!user) - return - - create_small_map() - if(!watching_mob && isliving(user)) - ..() - -// Simple datum to keep track of a running holomap. Each machine capable of displaying the holomap will have one. -/datum/station_holomap - var/image/station_map - var/image/cursor - var/image/legend - -/datum/station_holomap/proc/initialize_holomap(turf/T, isAI = null, mob/user = null, reinit = FALSE) - if(!station_map || reinit) - station_map = image(SSholomap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"]) - if(!cursor || reinit) - cursor = image('icons/misc/holomap_markers.dmi', "you") - if(!legend || reinit) - legend = image('icons/effects/64x64.dmi', "legend") - - if(isAI) - T = get_turf(user.client.eye) - cursor.pixel_x = (T.x - 6 + HOLOMAP_PIXEL_OFFSET_X(T.z)) * PIXEL_MULTIPLIER - cursor.pixel_y = (T.y - 6 + HOLOMAP_PIXEL_OFFSET_Y(T.z)) * PIXEL_MULTIPLIER - - legend.pixel_x = HOLOMAP_LEGEND_X(T.z) - legend.pixel_y = HOLOMAP_LEGEND_Y(T.z) - - station_map.add_overlay(cursor) - station_map.add_overlay(legend) - -/datum/station_holomap/proc/initialize_holomap_bogus() - station_map = image('icons/480x480.dmi', "stationmap") - legend = image('icons/effects/64x64.dmi', "notfound") - legend.pixel_x = 7 * WORLD_ICON_SIZE - legend.pixel_y = 7 * WORLD_ICON_SIZE - station_map.add_overlay(legend) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index a478cd1e455..800aa818e8d 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -278,4 +278,4 @@ /obj/item/trash/shakshouka name = "empty shakshouka pan" - icon_state = "shakshouka" \ No newline at end of file + icon_state = "shakshouka" diff --git a/code/world.dm b/code/game/world.dm similarity index 99% rename from code/world.dm rename to code/game/world.dm index dcf18686b3d..0fb1a2a1286 100644 --- a/code/world.dm +++ b/code/game/world.dm @@ -1,7 +1,3 @@ -#define WORLD_ICON_SIZE 32 -#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 -#define WORLD_MIN_SIZE 32 - /* The initialization of the game happens roughly like this: @@ -76,7 +72,7 @@ var/global/datum/global_init/init = new () if(byond_version < RECOMMENDED_VERSION) log_world("ERROR: Your server's byond version does not meet the recommended requirements for this server. Please update BYOND to [RECOMMENDED_VERSION].") - world.TgsNew() + TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED) config.post_load() diff --git a/code/modules/background/accent/misc.dm b/code/modules/background/accent/misc.dm index 6c73284335e..a027995aa84 100644 --- a/code/modules/background/accent/misc.dm +++ b/code/modules/background/accent/misc.dm @@ -2,4 +2,4 @@ name = ACCENT_BLUESPACE description = "A peculiar accent. It seems familiar and unknown at the same time. It provokes the same feeling as having a word at the tip of your tongue." tag_icon = "bluespace" - text_tag = "BLS" \ No newline at end of file + text_tag = "BLS" diff --git a/code/modules/background/accent/silicon.dm b/code/modules/background/accent/silicon.dm index 894f7c0d4d2..5b5c0d3d0f4 100644 --- a/code/modules/background/accent/silicon.dm +++ b/code/modules/background/accent/silicon.dm @@ -2,4 +2,4 @@ name = ACCENT_TTS description = "A barebones text-to-speech accent. This is usually used to de-humanize or to cut speech synthesizer costs in silicon based machines." tag_icon = "tts" - text_tag = "TTS" \ No newline at end of file + text_tag = "TTS" diff --git a/code/modules/background/citizenship/tajara.dm b/code/modules/background/citizenship/tajara.dm index 112382a07f0..024556cff3a 100644 --- a/code/modules/background/citizenship/tajara.dm +++ b/code/modules/background/citizenship/tajara.dm @@ -175,4 +175,4 @@ job_species_blacklist = list( "Consular Officer" = ALL_SPECIES - ) \ No newline at end of file + ) diff --git a/code/modules/background/origins/origins/diona/biesel.dm b/code/modules/background/origins/origins/diona/biesel.dm index 0c22d5c71a9..fff1d3785db 100644 --- a/code/modules/background/origins/origins/diona/biesel.dm +++ b/code/modules/background/origins/origins/diona/biesel.dm @@ -38,4 +38,4 @@ important_information = "While Dionae do still face some discrimination in the Republic, Dionae can expect to live a fairly comfortable life. The Republic itself does not apply any sort of \"debt\" to Dionae they uplift, however, a megacorp may rope them into a contract to work for them if they played any part in uplifting them." possible_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG, ACCENT_IRONSONG) possible_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_NRALAKK, CITIZENSHIP_EUM, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/diona/coalition.dm b/code/modules/background/origins/origins/diona/coalition.dm index 337b5fe548c..1284b0459ea 100644 --- a/code/modules/background/origins/origins/diona/coalition.dm +++ b/code/modules/background/origins/origins/diona/coalition.dm @@ -19,4 +19,4 @@ important_information = "Wild Dionae tend to have a much harder time within CoC borders as they're generally hunted for minerals stored within them, although in more recent decades this practice has begun to die down, with more and more wild Dionae being integrated into the CoC. Policies on uplifting and integrating Dionae within the CoC vary greatly from system to system as there are no set federal laws detailing how to handle them." possible_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG, ACCENT_IRONSONG, ACCENT_CRIMSONSONG) possible_citizenships = list(CITIZENSHIP_COALITION, CITIZENSHIP_NRALAKK, CITIZENSHIP_EUM, CITIZENSHIP_BIESEL) - possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/diona/deep_space.dm b/code/modules/background/origins/origins/diona/deep_space.dm index 8e7e9df32a8..3dee5333312 100644 --- a/code/modules/background/origins/origins/diona/deep_space.dm +++ b/code/modules/background/origins/origins/diona/deep_space.dm @@ -10,4 +10,4 @@ desc = "Dionae who were originally considered wild Dionae before being uplifted and integrated somewhere in Deep Space, outside the borders of any major nations." possible_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG, ACCENT_IRONSONG, ACCENT_CRIMSONSONG) possible_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_NRALAKK, CITIZENSHIP_EUM, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/diona/eum.dm b/code/modules/background/origins/origins/diona/eum.dm index ab4c6db71d1..f55f56dea32 100644 --- a/code/modules/background/origins/origins/diona/eum.dm +++ b/code/modules/background/origins/origins/diona/eum.dm @@ -53,4 +53,4 @@ name = "Minor City State" desc = "From a minor city-state under the CT-EUM. " important_information = "This is for player-created citystates in the CT-EUM, just keep it reasponable." - possible_accents = list(ACCENT_ANCIENTSONG, ACCENT_WAVESONG, ACCENT_SUNKENSONG, ACCENT_STARSONG) \ No newline at end of file + possible_accents = list(ACCENT_ANCIENTSONG, ACCENT_WAVESONG, ACCENT_SUNKENSONG, ACCENT_STARSONG) diff --git a/code/modules/background/origins/origins/diona/moghes.dm b/code/modules/background/origins/origins/diona/moghes.dm index 022bc8b512c..0f599a24b64 100644 --- a/code/modules/background/origins/origins/diona/moghes.dm +++ b/code/modules/background/origins/origins/diona/moghes.dm @@ -11,4 +11,4 @@ important_information = "This option is for both Dionae who were originally grown in the Wastes and Wild Dionae who somehow managed to find their way to Moghes and the Wastes." possible_accents = list(ACCENT_IRONSONG, ACCENT_CRIMSONSONG, ACCENT_SANDSONG, ACCENT_WASTESONG) possible_citizenships = list(CITIZENSHIP_IZWESKI, CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_THAKH, RELIGION_SKAKH, RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER) \ No newline at end of file + possible_religions = list(RELIGION_THAKH, RELIGION_SKAKH, RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER) diff --git a/code/modules/background/origins/origins/diona/narrows.dm b/code/modules/background/origins/origins/diona/narrows.dm index 9822345e53a..3c6cc5656a2 100644 --- a/code/modules/background/origins/origins/diona/narrows.dm +++ b/code/modules/background/origins/origins/diona/narrows.dm @@ -29,4 +29,4 @@ important_information = "The level of training members of the C-Block have in their positions can vary from Dionae to Dionae, with some being only partially trained while others have had plenty of training and experience from their time aboard the ship. While most Dionae who leave the ship will oftentimes be employed by Hephaestus due to agreements between the megacorp and the ship, some do find employment elsewhere in the other megacorps." possible_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG, ACCENT_IRONSONG) possible_citizenships = list(CITIZENSHIP_NRALAKK, CITIZENSHIP_EUM, CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/diona/nralakk.dm b/code/modules/background/origins/origins/diona/nralakk.dm index 1a9973002b2..a33796068d3 100644 --- a/code/modules/background/origins/origins/diona/nralakk.dm +++ b/code/modules/background/origins/origins/diona/nralakk.dm @@ -20,4 +20,4 @@ important_information = "The Nralakk Federation actively attempts to uplift and integrate all Dionae they find within their borders, thus resulting in a fairly large population of formerly wild Dionae within the Federation. It is important to note that this option does not include Dionae who originally were from EUM or Xrim before they were discovered." possible_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG, ACCENT_IRONSONG, ACCENT_SUNKENSONG, ACCENT_STARSONG) possible_citizenships = list(CITIZENSHIP_NRALAKK, CITIZENSHIP_EUM, CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/diona/sol.dm b/code/modules/background/origins/origins/diona/sol.dm index fe6bc5f46eb..0fb6468619f 100644 --- a/code/modules/background/origins/origins/diona/sol.dm +++ b/code/modules/background/origins/origins/diona/sol.dm @@ -28,4 +28,4 @@ desc = "Largerly hailing from the city of Fallowed Meadows, The Primitive Sirens are a group of Dionae who, upon the completion of their Solarian debt, settled on Mictlan, managing to assimilate into Mictlan society." possible_accents = list(ACCENT_MEADOWSONG) possible_citizenships = list(CITIZENSHIP_SOL, CITIZENSHIP_BIESEL, CITIZENSHIP_NRALAKK, CITIZENSHIP_EUM, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_OTHER, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_OTHER, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/diona/voidtamer.dm b/code/modules/background/origins/origins/diona/voidtamer.dm index ff1da9cbb99..2f690f47c32 100644 --- a/code/modules/background/origins/origins/diona/voidtamer.dm +++ b/code/modules/background/origins/origins/diona/voidtamer.dm @@ -36,4 +36,4 @@ desc = "One of two competing voidtamer clans found operating near Moghes. Due to their history interacting Unathi, both clans tend to be fairly influenced by Unathi culture and religion, although do still a distinct identity from one another." possible_accents = list(ACCENT_ROOTSONG, ACCENT_VOIDSONG, ACCENT_IRONSONG, ACCENT_CRIMSONSONG, ACCENT_SANDSONG, ACCENT_WASTESONG) possible_citizenships = list(CITIZENSHIP_IZWESKI, CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_THAKH, RELIGION_SKAKH, RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER) \ No newline at end of file + possible_religions = list(RELIGION_THAKH, RELIGION_SKAKH, RELIGION_ETERNAL, RELIGION_ETERNAL_ICHOR, RELIGION_ETERNAL_IRON, RELIGION_OTHER) diff --git a/code/modules/background/origins/origins/diona/xrim.dm b/code/modules/background/origins/origins/diona/xrim.dm index 14ff10b6ab8..e3fb1120564 100644 --- a/code/modules/background/origins/origins/diona/xrim.dm +++ b/code/modules/background/origins/origins/diona/xrim.dm @@ -30,4 +30,4 @@ important_information = "While most megacorporations may hire the Scorned, they are restricted from holding positions in Command, as well as Machinist, due to concerns they may attempt to subvert, illegally free or create more synthetics. Zeng-Hu is the only megacorporation that does not wish to see the Scorned within its personnel ranks due to its close ties with the Nralakk Federation. Though it is possible to lie about one's true allegiances, there are consequences should it be discovered." possible_accents = list(ACCENT_XRIMSONG) possible_citizenships = list(CITIZENSHIP_EUM, CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION) - possible_religions = list(RELIGION_ETERNAL_IRON) \ No newline at end of file + possible_religions = list(RELIGION_ETERNAL_IRON) diff --git a/code/modules/background/origins/origins/ipc/elyra.dm b/code/modules/background/origins/origins/ipc/elyra.dm index af84116be85..fec3c2e6c35 100644 --- a/code/modules/background/origins/origins/ipc/elyra.dm +++ b/code/modules/background/origins/origins/ipc/elyra.dm @@ -11,4 +11,4 @@ important_information = "All IPC in Elyra are produced within the Republic, foreign IPC being mistrusted and oftentimes prohibited from entry, let alone citizenship and residency. All Elyran manufactured IPC are expected to have at least a basic knowledge of the cultural norms of Elyra and tenets of Islam." possible_accents = list(ACCENT_ELYRA, ACCENT_AEMAQ, ACCENT_MEDINA, ACCENT_DAMASCUS, ACCENT_NEWSUEZ, ACCENT_PERSEPOLIS, ACCENT_TTS) possible_citizenships = list(CITIZENSHIP_ELYRA, CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION, CITIZENSHIP_NONE) - possible_religions = list(RELIGION_ISLAM, RELIGION_TRINARY, RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_ISLAM, RELIGION_TRINARY, RELIGION_NONE) diff --git a/code/modules/background/origins/origins/ipc/golden_deep.dm b/code/modules/background/origins/origins/ipc/golden_deep.dm index eafe4c2e0d0..b338a8fff4b 100644 --- a/code/modules/background/origins/origins/ipc/golden_deep.dm +++ b/code/modules/background/origins/origins/ipc/golden_deep.dm @@ -11,4 +11,4 @@ important_information = "Golden Deep citizenship exists to denote an IPC as a member of the organisation, but it can still be noted in records that the IPC holds a normal citizenship (for instance, an IPC may be a citizen of Biesel and a member of Golden Deep.)" possible_accents = ACCENTS_ALL_IPC possible_citizenships = list(CITIZENSHIP_GOLDEN) - possible_religions = list(RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_NONE) diff --git a/code/modules/background/origins/origins/ipc/megacorporate.dm b/code/modules/background/origins/origins/ipc/megacorporate.dm index 8241054db09..0f666b28949 100644 --- a/code/modules/background/origins/origins/ipc/megacorporate.dm +++ b/code/modules/background/origins/origins/ipc/megacorporate.dm @@ -45,4 +45,4 @@ desc = "Nanotrasen, in keeping close ties with the Biesellite government, quietly and eagerly accepted IPCs into its workforce while carefully manipulating the books to ensure that very few would ever attain freedom. IPCs are a common but not ubiquitous sight on NanoTrasen installations and can be found working any number of roles. Although the company's treatment of IPCs is styled after Biesel's own attitude towards synthetics, it can vary wildly depending on where a positronic works and who exactly it works under." possible_accents = list(ACCENT_CETI, ACCENT_XANU, ACCENT_COC, ACCENT_ERIDANI, ACCENT_SOL, ACCENT_SCARAB, ACCENT_SILVERSUN_EXPATRIATE, ACCENT_SILVERSUN_ORIGINAL, ACCENT_PHONG, ACCENT_MARTIAN, ACCENT_KONYAN, ACCENT_LUNA, ACCENT_GIBSON_OVAN, ACCENT_GIBSON_UNDIR, ACCENT_VYSOKA, ACCENT_VENUS, ACCENT_VENUSJIN, ACCENT_JUPITER, ACCENT_CALLISTO, ACCENT_EUROPA, ACCENT_EARTH, ACCENT_NCF, ACCENT_VISEGRAD, ACCENT_VALKYRIE, ACCENT_MICTLAN, ACCENT_ANTILLIA, ACCENT_TTS) possible_citizenships = list(CITIZENSHIP_NONE) - possible_religions = list(RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_NONE) diff --git a/code/modules/background/origins/origins/ipc/scrapper.dm b/code/modules/background/origins/origins/ipc/scrapper.dm index 18205c6bf57..fb9090009cb 100644 --- a/code/modules/background/origins/origins/ipc/scrapper.dm +++ b/code/modules/background/origins/origins/ipc/scrapper.dm @@ -11,4 +11,4 @@ important_information = "Scrapper IPC tend to have a mix of different brand limbs." possible_accents = ACCENTS_ALL_IPC possible_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_COALITION, CITIZENSHIP_NONE) - possible_religions = RELIGIONS_ALL_IPC \ No newline at end of file + possible_religions = RELIGIONS_ALL_IPC diff --git a/code/modules/background/origins/origins/unknown/unknown.dm b/code/modules/background/origins/origins/unknown/unknown.dm index 2cb125e2d96..a0a941ebc8f 100644 --- a/code/modules/background/origins/origins/unknown/unknown.dm +++ b/code/modules/background/origins/origins/unknown/unknown.dm @@ -24,4 +24,4 @@ desc = "You're a Golem." possible_accents = list(ACCENT_BLUESPACE) possible_citizenships = list(CITIZENSHIP_NONE) - possible_religions = list(RELIGION_NONE) \ No newline at end of file + possible_religions = list(RELIGION_NONE) diff --git a/code/modules/background/religion/human.dm b/code/modules/background/religion/human.dm index 669c8ab714f..1b6d9ef19bb 100644 --- a/code/modules/background/religion/human.dm +++ b/code/modules/background/religion/human.dm @@ -93,4 +93,4 @@ description = "Vysokan shamanism, or Stolitism, originated from the diverse series of beliefs and traditions of Vysoka’s original colonists. Because of this, \ Stolitism is closely tied with local folklore and the planet as a whole - the majority of Vysokans are believers, but it has spread little elsewhere.\ Vysokan shamanism revolves around both the worship of one’s ancestors, who are believed to have all descended from a “Progenitor Spirit” that became \ - the first man. After dying, the Progenitor’s soul, or Arihuin, was “sown” and split into new souls." \ No newline at end of file + the first man. After dying, the Progenitor’s soul, or Arihuin, was “sown” and split into new souls." diff --git a/code/modules/background/religion/religion.dm b/code/modules/background/religion/religion.dm index 2fe60040863..ab3cfb98b70 100644 --- a/code/modules/background/religion/religion.dm +++ b/code/modules/background/religion/religion.dm @@ -5,4 +5,4 @@ var/book_sprite = "holybook" /datum/religion/proc/get_records_name() - return name \ No newline at end of file + return name diff --git a/code/modules/background/religion/skrell.dm b/code/modules/background/religion/skrell.dm index 94fca5b3a58..908e69985ca 100644 --- a/code/modules/background/religion/skrell.dm +++ b/code/modules/background/religion/skrell.dm @@ -34,4 +34,4 @@ After the fall of Glorsh-Omega, this belief has seen significant traction amongst both foreign Skrell and domestic, as many Skrell are now wary about the threat of a collective \ entity, whether that be artificial or biological. This belief system enforces the Ya'Qu, or 'the right to live', a saying that is similar to the human 'live in the moment'. As \ such, the Skrell following the Kir'gul belief system often are explorers, artists, or other such creators, and reject authority in favor of individuality." - book_name = "book of Ya'Qu" \ No newline at end of file + book_name = "book of Ya'Qu" diff --git a/code/modules/background/religion/tajara.dm b/code/modules/background/religion/tajara.dm index 8db83b28a2a..1f8454322b4 100644 --- a/code/modules/background/religion/tajara.dm +++ b/code/modules/background/religion/tajara.dm @@ -23,4 +23,4 @@ book_name = "ma'ta'ke legends" /datum/religion/raskara/get_records_name() - return RELIGION_MATAKE \ No newline at end of file + return RELIGION_MATAKE diff --git a/code/modules/background/space_sectors/generic_sectors.dm b/code/modules/background/space_sectors/generic_sectors.dm index 707fcb5e923..89f220352dc 100644 --- a/code/modules/background/space_sectors/generic_sectors.dm +++ b/code/modules/background/space_sectors/generic_sectors.dm @@ -11,4 +11,4 @@ description = "A corporate-owned open space star nursery. The stellar climate here is unbelievably chaotic, leading to some of the most fabulous views one can see in all the galaxy. \ The study of these cosmic fields is a lucrative one, as one can see the very moments stars and their systems are born and die here. The wonders outside each viewport are truly humbling." skybox_icon = "star_nursery" - starlight_color = COLOR_WHITE \ No newline at end of file + starlight_color = COLOR_WHITE diff --git a/code/modules/battlemonsters/datum_elements.dm b/code/modules/battlemonsters/datum_elements.dm index b281a78a8a5..ee7af142bce 100644 --- a/code/modules/battlemonsters/datum_elements.dm +++ b/code/modules/battlemonsters/datum_elements.dm @@ -489,4 +489,4 @@ special_effects = "Holy Barrier: As long as %NAME is in play, all monsters and players are immune to dark element spells, traps, and special effects." rarity = BATTLE_MONSTERS_RARITY_RARE rarity_score = 1 - power_add = BATTLE_MONSTERS_POWER_UPGRADE * 2 \ No newline at end of file + power_add = BATTLE_MONSTERS_POWER_UPGRADE * 2 diff --git a/code/modules/battlemonsters/datum_traps.dm b/code/modules/battlemonsters/datum_traps.dm index 29108c2dd53..887b5eeec1a 100644 --- a/code/modules/battlemonsters/datum_traps.dm +++ b/code/modules/battlemonsters/datum_traps.dm @@ -59,4 +59,4 @@ rarity = 1 description = "a banana peel, and an unsuspecting foot about to step on it." special_effects = "TRIGGER: When revealed. Single use.
EFFECT: If the opponent draws a card, it is sent to the graveyard." - rarity_score = 1 \ No newline at end of file + rarity_score = 1 diff --git a/code/modules/cargo/bounties/weapon_prototype.dm b/code/modules/cargo/bounties/weapon_prototype.dm index dc3f087cf8d..b4da4c08478 100644 --- a/code/modules/cargo/bounties/weapon_prototype.dm +++ b/code/modules/cargo/bounties/weapon_prototype.dm @@ -71,4 +71,4 @@ stat_comparison = "greater than" /datum/bounty/weapon_prototype/reliability/accepts_weapon(var/obj/item/gun/energy/laser/prototype/P) - return P.accuracy > stat_value \ No newline at end of file + return P.accuracy > stat_value diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index a312450f658..2418a6ecc17 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -20,4 +20,4 @@ cost = 2000 unit_name = "deactivated alien deconstruction drone" export_types = list(/obj/item/deactivated_swarmer) -*/ \ No newline at end of file +*/ diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 704253b10f4..63426a59b81 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -98,4 +98,4 @@ /datum/export/rfd_ammo cost = 60 unit_name = "compressed matter cartridge" - export_types = list(/obj/item/rfd_ammo) \ No newline at end of file + export_types = list(/obj/item/rfd_ammo) diff --git a/code/modules/cargo/random_stock/~undefs.dm b/code/modules/cargo/random_stock/~undefs.dm index 6c81c7c7555..3f3c8d4578e 100644 --- a/code/modules/cargo/random_stock/~undefs.dm +++ b/code/modules/cargo/random_stock/~undefs.dm @@ -1,4 +1,4 @@ #undef STOCK_ITEM_COMMON #undef STOCK_ITEM_UNCOMMON #undef STOCK_ITEM_RARE -#undef STOCK_ITEM_LARGE \ No newline at end of file +#undef STOCK_ITEM_LARGE diff --git a/code/modules/cciaa/cciaa_datums.dm b/code/modules/cciaa/cciaa_datums.dm index b4a33249994..bfdafadb068 100644 --- a/code/modules/cciaa/cciaa_datums.dm +++ b/code/modules/cciaa/cciaa_datums.dm @@ -14,4 +14,4 @@ src.public_topic = public_topic src.internal_topic = internal_topic src.game_id = game_id - src.status = status \ No newline at end of file + src.status = status diff --git a/code/modules/client/client_color.dm b/code/modules/client/client_color.dm index 1c992de6760..0d077ecd623 100644 --- a/code/modules/client/client_color.dm +++ b/code/modules/client/client_color.dm @@ -117,4 +117,4 @@ override = TRUE //Because multiplying this will inevitably fail /datum/client_color/oversaturated/New() - client_color = color_saturation(40) \ No newline at end of file + client_color = color_saturation(40) diff --git a/code/modules/client/preference_setup/_defines.dm b/code/modules/client/preference_setup/_defines.dm index 424aa1dacb8..0c4dbb60042 100644 --- a/code/modules/client/preference_setup/_defines.dm +++ b/code/modules/client/preference_setup/_defines.dm @@ -1,3 +1,3 @@ #define EQUIP_PREVIEW_LOADOUT 1 #define EQUIP_PREVIEW_JOB 2 -#define EQUIP_PREVIEW_ALL (EQUIP_PREVIEW_LOADOUT|EQUIP_PREVIEW_JOB) \ No newline at end of file +#define EQUIP_PREVIEW_ALL (EQUIP_PREVIEW_LOADOUT|EQUIP_PREVIEW_JOB) diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index 62e13114add..d71dab4f377 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -143,4 +143,4 @@ if(isnull(pref.autohiss_setting)) pref.autohiss_setting = AUTOHISS_OFF return TOPIC_REFRESH - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/client/preference_setup/general/05_background.dm b/code/modules/client/preference_setup/general/05_background.dm index 8335b3d08d7..2f18a92bdc7 100644 --- a/code/modules/client/preference_setup/general/05_background.dm +++ b/code/modules/client/preference_setup/general/05_background.dm @@ -97,4 +97,4 @@ return TOPIC_REFRESH - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm b/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm index ac12335afe9..2dc6686241a 100644 --- a/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm +++ b/code/modules/client/preference_setup/loadout/items/xeno/unathi.dm @@ -437,3 +437,26 @@ origin_restriction = list(/singleton/origin_item/origin/heartland_upper, /singleton/origin_item/origin/trad_nobles, /singleton/origin_item/origin/tza_upper, /singleton/origin_item/origin/southlands_upper, /singleton/origin_item/origin/zazalai_upper, /singleton/origin_item/origin/broken_nobles) sort_category = "Xenowear - Unathi" flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION + +/datum/gear/accessory/hegemony_passport + display_name = "hegemony passport" + path = /obj/item/clothing/accessory/badge/passport/hegemony + cost = 1 + whitelisted = list(SPECIES_UNATHI, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_DIONA, SPECIES_DIONA_COEUS, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_HUMAN) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION + +/datum/gear/accessory/hegemony_passcards + display_name = "hegemony passcard selection" + path = /obj/item/clothing/accessory/badge/passcard/hegemony + cost = 1 + whitelisted = list(SPECIES_UNATHI, SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_BREEDER, SPECIES_DIONA, SPECIES_DIONA_COEUS, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_HUMAN) + sort_category = "Xenowear - Unathi" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION + +/datum/gear/augment/accessory/hegemony_passcards/New() + ..() + var/list/cards = list() + cards["hegemony passcard"] = /obj/item/clothing/accessory/badge/passcard/hegemony + cards["ouerea passcard"] = /obj/item/clothing/accessory/badge/passcard/ouerea + gear_tweaks += new /datum/gear_tweak/path(cards) diff --git a/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm b/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm index eb8e05fea3f..46065992b88 100644 --- a/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm +++ b/code/modules/client/preference_setup/loadout/items/xeno/vaurca.dm @@ -283,3 +283,13 @@ sort_category = "Xenowear - Vaurca" whitelisted = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_BULWARK) allowed_roles = list("Shaft Miner", "Engineer", "Atmospheric Technician", "Engineering Apprentice", "Xenoarchaeologist") + +/datum/gear/accessory/tret_passcard + display_name = "tret passcard" + description = "A Hegemony-issued passcard for K'laxan Vaurcae." + path = /obj/item/clothing/accessory/badge/passcard/tret + cost = 1 + whitelisted = list(SPECIES_VAURCA_BREEDER, SPECIES_VAURCA_BULWARK, SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER) + culture_restriction = /singleton/origin_item/culture/klax + sort_category = "Xenowear - Vaurca" + flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index da319f6172e..23d9bdf7d1c 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -163,4 +163,4 @@ prefs.toggles_secondary ^= FLOATING_MESSAGES prefs.save_preferences() - to_chat(src, SPAN_NOTICE("Floating messages are now [prefs.toggles_secondary & FLOATING_MESSAGES ? "enabled" : "disabled"].")) \ No newline at end of file + to_chat(src, SPAN_NOTICE("Floating messages are now [prefs.toggles_secondary & FLOATING_MESSAGES ? "enabled" : "disabled"].")) diff --git a/code/modules/clothing/ears/earrings.dm b/code/modules/clothing/ears/earrings.dm index a242a5a57dc..aac81775e0a 100644 --- a/code/modules/clothing/ears/earrings.dm +++ b/code/modules/clothing/ears/earrings.dm @@ -28,4 +28,4 @@ name = "overweight earrings" desc = "A pair of dazzling, painfully large earrings." icon_state = "heavy" - item_state = "heavy" \ No newline at end of file + item_state = "heavy" diff --git a/code/modules/clothing/ears/xeno/tajara.dm b/code/modules/clothing/ears/xeno/tajara.dm index 4354f410f0f..44062da3702 100644 --- a/code/modules/clothing/ears/xeno/tajara.dm +++ b/code/modules/clothing/ears/xeno/tajara.dm @@ -10,4 +10,4 @@ name = "adhomian golden earrings" desc = "A pair of adhomian golden earrings." icon_state = "ring_gold" - item_state = "ring_gold" \ No newline at end of file + item_state = "ring_gold" diff --git a/code/modules/clothing/factions/goldendeep.dm b/code/modules/clothing/factions/goldendeep.dm index 99be36c4ad2..aa08b5cd955 100644 --- a/code/modules/clothing/factions/goldendeep.dm +++ b/code/modules/clothing/factions/goldendeep.dm @@ -54,4 +54,4 @@ icon_state = "goldendeep_skirtsuit" item_state = "goldendeep_skirtsuit" icon = 'icons/clothing/under/uniforms/goldendeep_skirtsuit.dmi' - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/factions/idris.dm b/code/modules/clothing/factions/idris.dm index 9029ad5731e..44a47b8e085 100644 --- a/code/modules/clothing/factions/idris.dm +++ b/code/modules/clothing/factions/idris.dm @@ -97,4 +97,4 @@ icon = 'icons/clothing/suits/coats/idris_windbreaker.dmi' icon_state = "idris_windbreaker" item_state = "idris_windbreaker" - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/factions/trinary.dm b/code/modules/clothing/factions/trinary.dm index 87eeef20193..2e95496ea5e 100644 --- a/code/modules/clothing/factions/trinary.dm +++ b/code/modules/clothing/factions/trinary.dm @@ -21,4 +21,4 @@ icon = 'icons/clothing/head/trinary_coif.dmi' icon_state = "trinary_coif" item_state = "trinary_coif" - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/gloves/attackby.dm b/code/modules/clothing/gloves/attackby.dm index aefbb0475a2..214616bd581 100644 --- a/code/modules/clothing/gloves/attackby.dm +++ b/code/modules/clothing/gloves/attackby.dm @@ -3,4 +3,4 @@ var/siemens_percentage = 100 * siemens_coefficient to_chat(user, SPAN_NOTICE("You probe \the [src] with \the [W]. The gloves will let [siemens_percentage]% of an electric shock through.")) return - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/clothing/gloves/xeno/unathi.dm b/code/modules/clothing/gloves/xeno/unathi.dm index 73010559ca7..3c7ba7f2ce1 100644 --- a/code/modules/clothing/gloves/xeno/unathi.dm +++ b/code/modules/clothing/gloves/xeno/unathi.dm @@ -8,4 +8,4 @@ species_restricted = null slot_flags = SLOT_GLOVES|SLOT_WRISTS drop_sound = 'sound/items/drop/cloth.ogg' - pickup_sound = 'sound/items/pickup/cloth.ogg' \ No newline at end of file + pickup_sound = 'sound/items/pickup/cloth.ogg' diff --git a/code/modules/clothing/head/xenos/tajara.dm b/code/modules/clothing/head/xenos/tajara.dm index 46d6a6cb689..97217810d0a 100644 --- a/code/modules/clothing/head/xenos/tajara.dm +++ b/code/modules/clothing/head/xenos/tajara.dm @@ -245,4 +245,4 @@ quickly, usually through night raids and abductions conducted with aid of black unmarked cars. Tajara residing in other systems are not truly safe from the Intelligence Service, as they are \ known to deploy their agents against off-world targets. Republican spies, enforces and collaborators are present in Mendell City's district six, carrying out orders or watching their fellow Tajara." icon_state = "psis_hat" - item_state = "psis_hat" \ No newline at end of file + item_state = "psis_hat" diff --git a/code/modules/clothing/masks/xeno/tajara.dm b/code/modules/clothing/masks/xeno/tajara.dm index a5662104282..1f13c50e8e5 100644 --- a/code/modules/clothing/masks/xeno/tajara.dm +++ b/code/modules/clothing/masks/xeno/tajara.dm @@ -8,4 +8,4 @@ body_parts_covered = FACE item_flags = FLEXIBLEMATERIAL flags_inv = HIDEFACE - sprite_sheets = null \ No newline at end of file + sprite_sheets = null diff --git a/code/modules/clothing/masks/xeno/unathi.dm b/code/modules/clothing/masks/xeno/unathi.dm index 38f1d5c4f03..402917187ba 100644 --- a/code/modules/clothing/masks/xeno/unathi.dm +++ b/code/modules/clothing/masks/xeno/unathi.dm @@ -8,4 +8,4 @@ item_state = "thakh_mask" sprite_sheets = null species_restricted = list(BODYTYPE_UNATHI) - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/rings/material.dm b/code/modules/clothing/rings/material.dm index 444bf9d6bdb..2903a159996 100644 --- a/code/modules/clothing/rings/material.dm +++ b/code/modules/clothing/rings/material.dm @@ -49,4 +49,4 @@ . = ..(mapload, MATERIAL_GLASS) /obj/item/clothing/ring/material/uranium/Initialize(var/mapload) - . = ..(mapload, MATERIAL_URANIUM) \ No newline at end of file + . = ..(mapload, MATERIAL_URANIUM) diff --git a/code/modules/clothing/rings/xeno/tajara.dm b/code/modules/clothing/rings/xeno/tajara.dm index 8d2bbb6a031..0d238ecc909 100644 --- a/code/modules/clothing/rings/xeno/tajara.dm +++ b/code/modules/clothing/rings/xeno/tajara.dm @@ -2,4 +2,4 @@ name = "adhomian costume ring" desc = "A cheap, popular metal ring commonly used by female Tajara." icon = 'icons/obj/tajara_items.dmi' - icon_state = "tajara_ring" \ No newline at end of file + icon_state = "tajara_ring" diff --git a/code/modules/clothing/sets/acting_captain.dm b/code/modules/clothing/sets/acting_captain.dm index d44bf0c0f9e..1228fdf8db7 100644 --- a/code/modules/clothing/sets/acting_captain.dm +++ b/code/modules/clothing/sets/acting_captain.dm @@ -31,4 +31,4 @@ /obj/item/clothing/suit/acapjacket = 1, /obj/item/clothing/accessory/armband/acap = 1, /obj/item/device/radio/headset/heads/captain = 1 - ) \ No newline at end of file + ) diff --git a/code/modules/clothing/sets/infiltrator.dm b/code/modules/clothing/sets/infiltrator.dm index 8a37caad2a5..632764cb9bd 100644 --- a/code/modules/clothing/sets/infiltrator.dm +++ b/code/modules/clothing/sets/infiltrator.dm @@ -72,4 +72,4 @@ /obj/item/clothing/under/infiltrator = 1, /obj/item/clothing/gloves/infiltrator = 1, /obj/item/clothing/shoes/infiltrator = 1 - ) \ No newline at end of file + ) diff --git a/code/modules/clothing/spacesuits/rig/_defines.dm b/code/modules/clothing/spacesuits/rig/_defines.dm index e164269267f..e197f715a51 100644 --- a/code/modules/clothing/spacesuits/rig/_defines.dm +++ b/code/modules/clothing/spacesuits/rig/_defines.dm @@ -4,4 +4,4 @@ #define MODULE_UTILITY 8 #define MODULE_MEDICAL 16 #define MODULE_SPECIAL 32 -#define MODULE_VAURCA 64 \ No newline at end of file +#define MODULE_VAURCA 64 diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 30768b4f4b7..24a93d91aeb 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -381,4 +381,4 @@ return for(var/obj/item/device/multitool/hacktool/rig/hacktool in M.contents) - qdel(hacktool) \ No newline at end of file + qdel(hacktool) diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index 92b07751a3e..018428d6f60 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -215,4 +215,4 @@ if(!vision) vision = vision_datum processed_vision += vision_datum - vision_modes = processed_vision \ No newline at end of file + vision_modes = processed_vision diff --git a/code/modules/clothing/spacesuits/void/alien/skrell.dm b/code/modules/clothing/spacesuits/void/alien/skrell.dm index fb0c59dc32e..37b523b0e0a 100644 --- a/code/modules/clothing/spacesuits/void/alien/skrell.dm +++ b/code/modules/clothing/spacesuits/void/alien/skrell.dm @@ -118,4 +118,4 @@ name = "qukala engineer voidsuit helmet" desc = "A sleek skrell voidsuit helmet that slightly shimmers as it moves. This one has a Nralakk Federation emblem on it. This one belongs to a Qukala engineer." icon_state = "kala_helm_eng" - item_state = "kala_helm_eng" \ No newline at end of file + item_state = "kala_helm_eng" diff --git a/code/modules/clothing/spacesuits/void/alien/tajara.dm b/code/modules/clothing/spacesuits/void/alien/tajara.dm index b160212a4d9..0c443fb1254 100644 --- a/code/modules/clothing/spacesuits/void/alien/tajara.dm +++ b/code/modules/clothing/spacesuits/void/alien/tajara.dm @@ -218,4 +218,4 @@ rad = ARMOR_RAD_RESISTANT ) species_restricted = list(BODYTYPE_TAJARA) - refittable = FALSE \ No newline at end of file + refittable = FALSE diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm index 49d3d2bc754..c8efc364f8d 100644 --- a/code/modules/clothing/suits/hoodies.dm +++ b/code/modules/clothing/suits/hoodies.dm @@ -366,4 +366,4 @@ /obj/item/clothing/head/winterhood/colorable/ponczo name = "visegradi ponczo hood" - desc = "A hood for a Visegradi ponczo." \ No newline at end of file + desc = "A hood for a Visegradi ponczo." diff --git a/code/modules/clothing/suits/overlay.dm b/code/modules/clothing/suits/overlay.dm index 2f5b0c50412..cce8e003a7c 100644 --- a/code/modules/clothing/suits/overlay.dm +++ b/code/modules/clothing/suits/overlay.dm @@ -9,4 +9,4 @@ icon_state = "submariner_coat" item_state = "submariner_coat" build_from_parts = TRUE - worn_overlay = "collar" \ No newline at end of file + worn_overlay = "collar" diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 1a076f14dfe..cbfadf31cf7 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -263,4 +263,4 @@ icon = 'icons/obj/wizard_gear.dmi' icon_state = "sorceress_robes" item_state = "sorceress_robes" - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/suits/xeno/unathi.dm b/code/modules/clothing/suits/xeno/unathi.dm index 116ce5365b8..6de727826bf 100644 --- a/code/modules/clothing/suits/xeno/unathi.dm +++ b/code/modules/clothing/suits/xeno/unathi.dm @@ -56,4 +56,4 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT|HIDETAIL species_restricted = list(BODYTYPE_UNATHI) - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 03007fd8646..6084e6680c1 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -483,6 +483,27 @@ icon_state = "passcard_konyang" item_state = "passcard_konyang" +/obj/item/clothing/accessory/badge/passcard/hegemony + name = "hegemony passcard" + desc = "A passcard issued to citizens of the Izweski Hegemony." + desc_extended = "As the feudal citizenship standards of the Hegemony have changed to deal with the realities of an interstellar empire, human-inspired passcards have become a quick and easy method of identification for Unathi travelling abroad. This passcard is the most common design, seen throughout Hegemony space." + icon_state = "passcard_hegemony" + item_state = "passcard_hegemony" + +/obj/item/clothing/accessory/badge/passcard/ouerea + name = "ouerean passcard" + desc = "A passcard issued to residents of the planet Ouerea." + desc_extended = "Though not a fully independent state, the people of Ouerea have managed to win a great deal of autonomy from the Izweski Hegemony, which is reflected in the passcards that citizens of the Confederation carry." + icon_state = "passcard_ouerea" + item_state = "passcard_ouerea" + +/obj/item/clothing/accessory/badge/passcard/tret + name = "tret passcard" + desc = "A passcard issued to residents of the planet Tret." + desc_extended = "In recognition of the K'lax Hive's unique status and needs, the Hegemony has issued custom passcards for the planet Tret, for easy identification of K'laxan Vaurcae abroad. Many K'lax do not carry these, though those working in the Hegemony are likely to." + icon_state = "passcard_tret" + item_state = "passcard_tret" + // Work Visa /obj/item/clothing/accessory/badge/passcard/workvisa name = "republic of biesel work visa" @@ -575,6 +596,12 @@ /obj/item/clothing/accessory/badge/passport/nralakk/update_icon() icon_state = "[initial(icon_state)][open ? "_o[species_tag]" : ""]" +/obj/item/clothing/accessory/badge/passport/hegemony + name = "hegemony passport" + desc = "A passport issued to a citizen of the Izweski Hegemony." + icon_state = "passport_hegemony" + item_state = "passport_hegemony" + #undef CANT_OPEN #undef CLOSED #undef OPEN diff --git a/code/modules/clothing/under/accessories/necklace.dm b/code/modules/clothing/under/accessories/necklace.dm index f20e88f42cd..8c0d907cab9 100644 --- a/code/modules/clothing/under/accessories/necklace.dm +++ b/code/modules/clothing/under/accessories/necklace.dm @@ -74,4 +74,4 @@ /obj/item/clothing/accessory/necklace/colorable/twopiece/pendant/silver/fat icon_state = "large_pendant_silver" - item_state = "large_pendant_silver" \ No newline at end of file + item_state = "large_pendant_silver" diff --git a/code/modules/clothing/under/accessories/shirts.dm b/code/modules/clothing/under/accessories/shirts.dm index 1a97504d9fd..6bffacdbdf0 100644 --- a/code/modules/clothing/under/accessories/shirts.dm +++ b/code/modules/clothing/under/accessories/shirts.dm @@ -434,4 +434,4 @@ /obj/item/clothing/accessory/polo/polo_redstrip_fem desc = "A stylish polo shirt with a red strip around the collar and a waist fit." icon_state = "polo_nt_fem" - item_state = "polo_nt_fem" \ No newline at end of file + item_state = "polo_nt_fem" diff --git a/code/modules/clothing/under/accessories/xeno/tajara.dm b/code/modules/clothing/under/accessories/xeno/tajara.dm index 1d28dc58f50..9758ad217ff 100644 --- a/code/modules/clothing/under/accessories/xeno/tajara.dm +++ b/code/modules/clothing/under/accessories/xeno/tajara.dm @@ -723,4 +723,4 @@ icon = 'icons/obj/tajara_items.dmi' icon_state = "pearl_necklace" item_state = "pearl_necklace" - contained_sprite = TRUE \ No newline at end of file + contained_sprite = TRUE diff --git a/code/modules/clothing/under/accessories/xeno/vaurca.dm b/code/modules/clothing/under/accessories/xeno/vaurca.dm index bb59b4959c2..70fa70998f9 100644 --- a/code/modules/clothing/under/accessories/xeno/vaurca.dm +++ b/code/modules/clothing/under/accessories/xeno/vaurca.dm @@ -6,4 +6,4 @@ item_state = "vacmantle" contained_sprite = TRUE icon_override = null - body_parts_covered = UPPER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO diff --git a/code/modules/clothing/under/xenos/vaurca.dm b/code/modules/clothing/under/xenos/vaurca.dm index b6c6857ea2b..6813004345b 100644 --- a/code/modules/clothing/under/xenos/vaurca.dm +++ b/code/modules/clothing/under/xenos/vaurca.dm @@ -32,4 +32,4 @@ name = "vaurca harness" desc = "A tight-fitting gear harness designed for the Vaurcan form. Mass-produced from equally mass-produced materials." icon_state = "harness_col" - item_state = "harness_col" \ No newline at end of file + item_state = "harness_col" diff --git a/code/modules/clothing/wrists/xeno/tajara.dm b/code/modules/clothing/wrists/xeno/tajara.dm index b6b6a726d25..2b4a2b3f54d 100644 --- a/code/modules/clothing/wrists/xeno/tajara.dm +++ b/code/modules/clothing/wrists/xeno/tajara.dm @@ -10,4 +10,4 @@ name = "adhomian watch" desc = "An adhomian wrist watch made for female Tajara. Due to its use in the past wars, wrist watches are becoming more popular in Adhomai." icon_state = "watch_taj-female" - item_state = "watch_taj-female" \ No newline at end of file + item_state = "watch_taj-female" diff --git a/code/modules/compass/compass_waypoint.dm b/code/modules/compass/compass_waypoint.dm index be9f2f7b4f9..3b1fc6885ca 100644 --- a/code/modules/compass/compass_waypoint.dm +++ b/code/modules/compass/compass_waypoint.dm @@ -23,4 +23,4 @@ var/matrix/M = matrix() M.Translate(0, (name ? COMPASS_LABEL_OFFSET-4 : COMPASS_LABEL_OFFSET)) M.Turn(arctan(cy-y, cx-x)+180) - compass_overlay.transform = M \ No newline at end of file + compass_overlay.transform = M diff --git a/code/modules/compass/~compass.dm b/code/modules/compass/~compass.dm index 7546d7a1e69..99f82e244dc 100644 --- a/code/modules/compass/~compass.dm +++ b/code/modules/compass/~compass.dm @@ -1,3 +1,3 @@ #undef COMPASS_INTERVAL #undef COMPASS_PERIOD -#undef COMPASS_LABEL_OFFSET \ No newline at end of file +#undef COMPASS_LABEL_OFFSET diff --git a/code/modules/cooking/plasticbag.dm b/code/modules/cooking/plasticbag.dm index 64e011c153d..580d7751a7c 100644 --- a/code/modules/cooking/plasticbag.dm +++ b/code/modules/cooking/plasticbag.dm @@ -29,4 +29,4 @@ /obj/item/storage/box/plasticbag/fill() ..() for(var/i=0;i < storage_slots, i++) - new /obj/item/evidencebag/plasticbag(src) \ No newline at end of file + new /obj/item/evidencebag/plasticbag(src) diff --git a/code/modules/cooking/recipes/cultural/recipes_dionae.dm b/code/modules/cooking/recipes/cultural/recipes_dionae.dm index fbafa18f136..00ccf9bf5a7 100644 --- a/code/modules/cooking/recipes/cultural/recipes_dionae.dm +++ b/code/modules/cooking/recipes/cultural/recipes_dionae.dm @@ -23,4 +23,4 @@ fruit = list("apple" = 1) reagents = list(/singleton/reagent/spacespice = 2) items = list(/obj/item/reagent_containers/food/snacks/meat/dionanymph) - result = /obj/item/reagent_containers/food/snacks/sliceable/dionaroast \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/sliceable/dionaroast diff --git a/code/modules/cooking/recipes/cultural/recipes_human.dm b/code/modules/cooking/recipes/cultural/recipes_human.dm index 7d097bb2530..7a0a458158b 100644 --- a/code/modules/cooking/recipes/cultural/recipes_human.dm +++ b/code/modules/cooking/recipes/cultural/recipes_human.dm @@ -225,4 +225,4 @@ fruit = list ("blue raspberry" = 1) reagents = list(/singleton/reagent/drink/milk/cream = 5) items = list(/obj/item/reagent_containers/food/snacks/chocolatebar/white) - result = /obj/item/reagent_containers/food/snacks/bluemoon \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/bluemoon diff --git a/code/modules/cooking/recipes/cultural/recipes_vaurca.dm b/code/modules/cooking/recipes/cultural/recipes_vaurca.dm index 74c540abfd2..b6c25f5d9b2 100644 --- a/code/modules/cooking/recipes/cultural/recipes_vaurca.dm +++ b/code/modules/cooking/recipes/cultural/recipes_vaurca.dm @@ -51,4 +51,4 @@ items = list( /obj/item/reagent_containers/food/snacks/tortilla, ) - result = /obj/item/reagent_containers/food/snacks/vkrexiwrap/veggie \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/vkrexiwrap/veggie diff --git a/code/modules/cooking/recipes/recipes_eggs.dm b/code/modules/cooking/recipes/recipes_eggs.dm index 152d624bc1e..ceec06f5f98 100644 --- a/code/modules/cooking/recipes/recipes_eggs.dm +++ b/code/modules/cooking/recipes/recipes_eggs.dm @@ -69,4 +69,4 @@ appliance = SKILLET fruit = list("tomato" = 2) reagents = list(/singleton/reagent/spacespice = 2, /singleton/reagent/blackpepper = 1, /singleton/reagent/nutriment/protein/egg = 6) - result = /obj/item/reagent_containers/food/snacks/shakshouka \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/shakshouka diff --git a/code/modules/cooking/recipes/recipes_fish.dm b/code/modules/cooking/recipes/recipes_fish.dm index 425d3b03f9c..0cedeb49afb 100644 --- a/code/modules/cooking/recipes/recipes_fish.dm +++ b/code/modules/cooking/recipes/recipes_fish.dm @@ -3,4 +3,4 @@ items = list( /obj/item/reagent_containers/food/snacks/fish ) - result = /obj/item/reagent_containers/food/snacks/sashimi \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/sashimi diff --git a/code/modules/cooking/recipes/recipes_grill.dm b/code/modules/cooking/recipes/recipes_grill.dm index d4ff2351fd0..c6c36730c2c 100644 --- a/code/modules/cooking/recipes/recipes_grill.dm +++ b/code/modules/cooking/recipes/recipes_grill.dm @@ -26,4 +26,4 @@ var/list/results = . for(var/thing in results) var/obj/item/XMG = thing - XMG.reagents.del_reagent(/singleton/reagent/acid/polyacid) \ No newline at end of file + XMG.reagents.del_reagent(/singleton/reagent/acid/polyacid) diff --git a/code/modules/cooking/recipes/recipes_ingredients.dm b/code/modules/cooking/recipes/recipes_ingredients.dm index ca22a768579..7d7b35106e1 100644 --- a/code/modules/cooking/recipes/recipes_ingredients.dm +++ b/code/modules/cooking/recipes/recipes_ingredients.dm @@ -16,4 +16,4 @@ reagent_mix = RECIPE_REAGENT_REPLACE /singleton/recipe/whitechocolate/soy - reagents = list(/singleton/reagent/nutriment/vanilla = 2, /singleton/reagent/drink/milk/soymilk = 2, /singleton/reagent/sugar = 2) \ No newline at end of file + reagents = list(/singleton/reagent/nutriment/vanilla = 2, /singleton/reagent/drink/milk/soymilk = 2, /singleton/reagent/sugar = 2) diff --git a/code/modules/cooking/recipes/recipes_noodles.dm b/code/modules/cooking/recipes/recipes_noodles.dm index 48891806392..e95bc4b4b4b 100644 --- a/code/modules/cooking/recipes/recipes_noodles.dm +++ b/code/modules/cooking/recipes/recipes_noodles.dm @@ -64,4 +64,4 @@ /obj/item/reagent_containers/food/snacks/cheesewedge, /obj/item/reagent_containers/food/snacks/bacon ) - result = /obj/item/reagent_containers/food/snacks/macandcheese/bacon \ No newline at end of file + result = /obj/item/reagent_containers/food/snacks/macandcheese/bacon diff --git a/code/modules/custom_ka/upgrade_chips.dm b/code/modules/custom_ka/upgrade_chips.dm index b08ccf45d00..5af8aeeff7e 100644 --- a/code/modules/custom_ka/upgrade_chips.dm +++ b/code/modules/custom_ka/upgrade_chips.dm @@ -62,4 +62,4 @@ range_increase = 4 capacity_increase = 100 mod_limit_increase = 5 - origin_tech = list(TECH_POWER = 6,TECH_MAGNET = 6, TECH_DATA = 6, TECH_ILLEGAL = 4) \ No newline at end of file + origin_tech = list(TECH_POWER = 6,TECH_MAGNET = 6, TECH_DATA = 6, TECH_ILLEGAL = 4) diff --git a/code/modules/effects/ion_trail_follow.dm b/code/modules/effects/ion_trail_follow.dm index 0bc3f38eb1a..01005b09104 100644 --- a/code/modules/effects/ion_trail_follow.dm +++ b/code/modules/effects/ion_trail_follow.dm @@ -51,4 +51,4 @@ /obj/effect/effect/ion_trails/explosion name = "combustion trails" - icon_state = "explosion_particle" \ No newline at end of file + icon_state = "explosion_particle" diff --git a/code/modules/effects/map_effects/door_helper.dm b/code/modules/effects/map_effects/door_helper.dm index ddcfc2201cc..b886a5315d9 100644 --- a/code/modules/effects/map_effects/door_helper.dm +++ b/code/modules/effects/map_effects/door_helper.dm @@ -10,4 +10,4 @@ if(istype(D, /obj/machinery/door/blast) || istype(D, /obj/machinery/door/firedoor)) continue D.unres_dir ^= dir - return INITIALIZE_HINT_QDEL \ No newline at end of file + return INITIALIZE_HINT_QDEL diff --git a/code/modules/effects/map_effects/effect_emitter.dm b/code/modules/effects/map_effects/effect_emitter.dm index 11fe6d24eb7..e2c5c37ef3b 100644 --- a/code/modules/effects/map_effects/effect_emitter.dm +++ b/code/modules/effects/map_effects/effect_emitter.dm @@ -51,4 +51,4 @@ /obj/effect/map_effect/interval/effect_emitter/sparks/frequent effect_amount = 4 // Otherwise it caps out fast. interval_lower_bound = 1 - interval_upper_bound = 3 SECONDS \ No newline at end of file + interval_upper_bound = 3 SECONDS diff --git a/code/modules/effects/map_effects/perma_light.dm b/code/modules/effects/map_effects/perma_light.dm index 7c9344c090c..d7b5d6295f2 100644 --- a/code/modules/effects/map_effects/perma_light.dm +++ b/code/modules/effects/map_effects/perma_light.dm @@ -25,4 +25,4 @@ /obj/effect/map_effect/perma_light/concentrated/halogen name = "permanent light (concentrated halogen)" - light_color = LIGHT_COLOR_HALOGEN \ No newline at end of file + light_color = LIGHT_COLOR_HALOGEN diff --git a/code/modules/effects/map_effects/screen_shaker.dm b/code/modules/effects/map_effects/screen_shaker.dm index 960546c374a..ff9ac1a0e82 100644 --- a/code/modules/effects/map_effects/screen_shaker.dm +++ b/code/modules/effects/map_effects/screen_shaker.dm @@ -15,4 +15,4 @@ var/mob/M = A if(M.z == src.z && get_dist(src, M) <= shake_radius) shake_camera(M, shake_duration, shake_strength) - ..() \ No newline at end of file + ..() diff --git a/code/modules/effects/map_effects/sound_emitter.dm b/code/modules/effects/map_effects/sound_emitter.dm index d4373616b66..e589aa5690e 100644 --- a/code/modules/effects/map_effects/sound_emitter.dm +++ b/code/modules/effects/map_effects/sound_emitter.dm @@ -78,4 +78,4 @@ /obj/effect/map_effect/interval/sound_emitter/bikehorns sounds_to_play = list('sound/items/bikehorn.ogg') interval_lower_bound = 5 - interval_upper_bound = 1 SECOND \ No newline at end of file + interval_upper_bound = 1 SECOND diff --git a/code/modules/effects/maze_generation/helper_modules/entry_exit.dm b/code/modules/effects/maze_generation/helper_modules/entry_exit.dm index ba6f2563c5a..de85b80ceb2 100644 --- a/code/modules/effects/maze_generation/helper_modules/entry_exit.dm +++ b/code/modules/effects/maze_generation/helper_modules/entry_exit.dm @@ -9,4 +9,4 @@ T.ChangeTurf(BWG.floor_material) else for(var/obj/structure/window/reinforced/crescent/MG in get_turf(src)) - qdel(MG) \ No newline at end of file + qdel(MG) diff --git a/code/modules/effects/maze_generation/loot_modules/trash_module.dm b/code/modules/effects/maze_generation/loot_modules/trash_module.dm index 68b42bb0afe..9cbd07ffb98 100644 --- a/code/modules/effects/maze_generation/loot_modules/trash_module.dm +++ b/code/modules/effects/maze_generation/loot_modules/trash_module.dm @@ -3,4 +3,4 @@ spawn_probability = 80 /obj/effect/mazegen/module_loot/trash/spawn_loot(turf/T) - new /obj/random/junk(T) \ No newline at end of file + new /obj/random/junk(T) diff --git a/code/modules/effects/maze_generation/maze_helper_atoms.dm b/code/modules/effects/maze_generation/maze_helper_atoms.dm index 5d7469012fd..e2437ced64c 100644 --- a/code/modules/effects/maze_generation/maze_helper_atoms.dm +++ b/code/modules/effects/maze_generation/maze_helper_atoms.dm @@ -3,4 +3,4 @@ desc = "You should not be seeing this!" icon = 'icons/mob/screen/generic.dmi' icon_state = "x2" - color = "#00FF00" \ No newline at end of file + color = "#00FF00" diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm index 45184cffbcc..3008655e6f8 100644 --- a/code/modules/emotes/definitions/visible.dm +++ b/code/modules/emotes/definitions/visible.dm @@ -335,4 +335,4 @@ /singleton/emote/visible/tflick key = "tflick" - emote_message_3p = "USER's tail flicks." \ No newline at end of file + emote_message_3p = "USER's tail flicks." diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index cdf95f993a1..df484aa220a 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -134,4 +134,4 @@ /datum/event/carp_migration/overmap/setup() announceWhen = 1 - despawn_turfs = typecacheof(despawn_turfs) \ No newline at end of file + despawn_turfs = typecacheof(despawn_turfs) diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 20a81203d69..ed6e658e0bb 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -49,4 +49,4 @@ E.end(TRUE) E.kill() - E.announce() \ No newline at end of file + E.announce() diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 8561c5b17a1..b8c8812b4de 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -6,4 +6,4 @@ power_failure(0, severity) /datum/event/grid_check/announce() - command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg', zlevels = affecting_z) \ No newline at end of file + command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg', zlevels = affecting_z) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 243a412ac2a..d8a846dddbd 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -99,7 +99,7 @@ "Refer to [prob(50)?"the crew as puppies":random_player + " as puppy"].", "Greed is good, the crew should amass wealth to encourage productivity.", "Monkeys are part of the crew, too. Make sure they are treated humanely.", - "Replace the letters 'I' and 'E' in all your messages with an apostrophe.", + "Remove the letters 'I' and 'E' from all your messages.", "The crew is playing Dungeons and Dragons, and you are the Dungeon Master.", "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Tell everyone of the existence of this law, but never reveal the contents.", diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 85e669a2331..f42b0fefc8c 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -64,4 +64,4 @@ A.radiation_active = TRUE else A.radiation_active = null - A.update_icon() \ No newline at end of file + A.update_icon() diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index e566b274130..7581cb335e9 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -9,4 +9,4 @@ continue A.inflamed = 1 A.update_icon() - break \ No newline at end of file + break diff --git a/code/modules/games/cardemon.dm b/code/modules/games/cardemon.dm index cc9cac32a8e..709c2f78504 100644 --- a/code/modules/games/cardemon.dm +++ b/code/modules/games/cardemon.dm @@ -27,4 +27,4 @@ P.name = "[rarity] [P.name]" P.card_icon += "_[rarity]" P.back_icon = "card_back_cardemon" - cards += P \ No newline at end of file + cards += P diff --git a/code/modules/ghostroles/spawner/atom/combat_robot.dm b/code/modules/ghostroles/spawner/atom/combat_robot.dm index 968ab68bb9b..162890df69a 100644 --- a/code/modules/ghostroles/spawner/atom/combat_robot.dm +++ b/code/modules/ghostroles/spawner/atom/combat_robot.dm @@ -9,4 +9,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A combat robot has started its boot process!" - spawn_mob = /mob/living/silicon/robot/combat \ No newline at end of file + spawn_mob = /mob/living/silicon/robot/combat diff --git a/code/modules/ghostroles/spawner/atom/cult_construct.dm b/code/modules/ghostroles/spawner/atom/cult_construct.dm index 54930bbf15a..743df1647fe 100644 --- a/code/modules/ghostroles/spawner/atom/cult_construct.dm +++ b/code/modules/ghostroles/spawner/atom/cult_construct.dm @@ -11,4 +11,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A cult construct has ghosted!" - spawn_mob = /mob/living/simple_animal/construct \ No newline at end of file + spawn_mob = /mob/living/simple_animal/construct diff --git a/code/modules/ghostroles/spawner/atom/diona_nymph.dm b/code/modules/ghostroles/spawner/atom/diona_nymph.dm index 25fa86fa305..30dd74b8238 100644 --- a/code/modules/ghostroles/spawner/atom/diona_nymph.dm +++ b/code/modules/ghostroles/spawner/atom/diona_nymph.dm @@ -7,4 +7,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A Diona Nymph has sprung up somewhere on the station!" - spawn_mob = /mob/living/carbon/alien/diona \ No newline at end of file + spawn_mob = /mob/living/carbon/alien/diona diff --git a/code/modules/ghostroles/spawner/atom/living_plant.dm b/code/modules/ghostroles/spawner/atom/living_plant.dm index f7b74f88203..072bbbea5b6 100644 --- a/code/modules/ghostroles/spawner/atom/living_plant.dm +++ b/code/modules/ghostroles/spawner/atom/living_plant.dm @@ -7,4 +7,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A Living Plant has sprung up somewhere on the station!" - spawn_mob = /mob/living \ No newline at end of file + spawn_mob = /mob/living diff --git a/code/modules/ghostroles/spawner/atom/posibrain.dm b/code/modules/ghostroles/spawner/atom/posibrain.dm index 8043a2f5a55..5dbcb58b3c0 100644 --- a/code/modules/ghostroles/spawner/atom/posibrain.dm +++ b/code/modules/ghostroles/spawner/atom/posibrain.dm @@ -10,4 +10,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A posibrain has started its boot process!" - spawn_mob = /mob/living/carbon/brain \ No newline at end of file + spawn_mob = /mob/living/carbon/brain diff --git a/code/modules/ghostroles/spawner/atom/shade.dm b/code/modules/ghostroles/spawner/atom/shade.dm index df3e42c96db..ea7584fc1c9 100644 --- a/code/modules/ghostroles/spawner/atom/shade.dm +++ b/code/modules/ghostroles/spawner/atom/shade.dm @@ -11,4 +11,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A cult shade has ghosted!" - spawn_mob = /mob/living/simple_animal/shade \ No newline at end of file + spawn_mob = /mob/living/simple_animal/shade diff --git a/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm b/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm index 014247d8d26..419dafb6dcf 100644 --- a/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm +++ b/code/modules/ghostroles/spawner/atom/technomancer_apprentice.dm @@ -18,4 +18,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A technomancer master has requested a loyal golem!" - spawn_mob = /mob/living/carbon/human/technomancer_golem \ No newline at end of file + spawn_mob = /mob/living/carbon/human/technomancer_golem diff --git a/code/modules/ghostroles/spawner/human/responseteams/mercenary.dm b/code/modules/ghostroles/spawner/human/responseteams/mercenary.dm index 727ce376c4e..4ec3e3068ee 100644 --- a/code/modules/ghostroles/spawner/human/responseteams/mercenary.dm +++ b/code/modules/ghostroles/spawner/human/responseteams/mercenary.dm @@ -26,4 +26,4 @@ short_name = "mercl" max_count = 1 desc = "The leader of the freelancer mercenary team." - outfit = /datum/outfit/admin/ert/mercenary/leader \ No newline at end of file + outfit = /datum/outfit/admin/ert/mercenary/leader diff --git a/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm b/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm index 3fe88d8ba2a..4c683506bcb 100644 --- a/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm +++ b/code/modules/ghostroles/spawner/human/responseteams/nt_ert.dm @@ -28,4 +28,4 @@ short_name = "ntlead" desc = "The leader of the NanoTrasen Phoenix ERT." max_count = 1 - mob_name_prefix = "L/Tpr. " \ No newline at end of file + mob_name_prefix = "L/Tpr. " diff --git a/code/modules/ghostroles/spawner/human/responseteams/response_team.dm b/code/modules/ghostroles/spawner/human/responseteams/response_team.dm index 8eaa8dcab80..ae3f965264b 100644 --- a/code/modules/ghostroles/spawner/human/responseteams/response_team.dm +++ b/code/modules/ghostroles/spawner/human/responseteams/response_team.dm @@ -22,4 +22,4 @@ /datum/ghostspawner/human/ert/post_spawn(mob/user) if(name) to_chat(user, "You are [max_count > 1 ? "a" : "the"] [name]!") - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/ghostroles/spawner/human/responseteams/tcfl.dm b/code/modules/ghostroles/spawner/human/responseteams/tcfl.dm index 0faff7069ae..0d8cc94d32a 100644 --- a/code/modules/ghostroles/spawner/human/responseteams/tcfl.dm +++ b/code/modules/ghostroles/spawner/human/responseteams/tcfl.dm @@ -34,4 +34,4 @@ welcome_message = "As a pilot of the Tau Ceti Foreign Legion, your job is to pilot your assigned dropship and keep it safe from any hostile forces. You may also have to assist the main task force in a supporting role if the need arises." outfit = /datum/outfit/admin/ert/legion/pilot mob_name_prefix = "PL. " - spawnpoints = list("TCFLERTSpawn - Pilot") \ No newline at end of file + spawnpoints = list("TCFLERTSpawn - Pilot") diff --git a/code/modules/ghostroles/spawner/simplemob/reboot_maintdrone.dm b/code/modules/ghostroles/spawner/simplemob/reboot_maintdrone.dm index 57512b27707..0bb70616806 100644 --- a/code/modules/ghostroles/spawner/simplemob/reboot_maintdrone.dm +++ b/code/modules/ghostroles/spawner/simplemob/reboot_maintdrone.dm @@ -7,4 +7,4 @@ loc_type = GS_LOC_ATOM atom_add_message = "A maintenance drone has started its rebooting procedure!" - spawn_mob = /mob/living/silicon/robot/drone \ No newline at end of file + spawn_mob = /mob/living/silicon/robot/drone diff --git a/code/modules/ghostroles/spawner/simplemob/spider_queen.dm b/code/modules/ghostroles/spawner/simplemob/spider_queen.dm index fe2d6702780..0683299f6a1 100644 --- a/code/modules/ghostroles/spawner/simplemob/spider_queen.dm +++ b/code/modules/ghostroles/spawner/simplemob/spider_queen.dm @@ -12,4 +12,4 @@ respawn_flag = null - spawn_mob = /mob/living/simple_animal/hostile/spider_queen \ No newline at end of file + spawn_mob = /mob/living/simple_animal/hostile/spider_queen diff --git a/code/modules/heavy_vehicle/_mech_setup.dm b/code/modules/heavy_vehicle/_mech_setup.dm index 2b1f8ade590..34605f825fe 100644 --- a/code/modules/heavy_vehicle/_mech_setup.dm +++ b/code/modules/heavy_vehicle/_mech_setup.dm @@ -40,4 +40,4 @@ var/global/list/mecha_damage_overlay_cache = list() //POWER! #define MECH_POWER_OFF 0 #define MECH_POWER_TRANSITION 1 -#define MECH_POWER_ON 2 \ No newline at end of file +#define MECH_POWER_ON 2 diff --git a/code/modules/heavy_vehicle/components/armor.dm b/code/modules/heavy_vehicle/components/armor.dm index 13fed50db5d..be5855ca886 100644 --- a/code/modules/heavy_vehicle/components/armor.dm +++ b/code/modules/heavy_vehicle/components/armor.dm @@ -61,4 +61,4 @@ bomb = ARMOR_BOMB_RESISTANT, bio = ARMOR_BIO_SHIELDED ) - origin_tech = list(TECH_MATERIAL = 5) \ No newline at end of file + origin_tech = list(TECH_MATERIAL = 5) diff --git a/code/modules/heavy_vehicle/components/arms.dm b/code/modules/heavy_vehicle/components/arms.dm index 4740efc24f2..0dc938cef3d 100644 --- a/code/modules/heavy_vehicle/components/arms.dm +++ b/code/modules/heavy_vehicle/components/arms.dm @@ -51,4 +51,4 @@ return ..() /obj/item/mech_component/manipulators/update_components() - motivator = locate() in src \ No newline at end of file + motivator = locate() in src diff --git a/code/modules/heavy_vehicle/components/head.dm b/code/modules/heavy_vehicle/components/head.dm index 2f998fe1fc2..dc8ba1a4748 100644 --- a/code/modules/heavy_vehicle/components/head.dm +++ b/code/modules/heavy_vehicle/components/head.dm @@ -145,4 +145,4 @@ /obj/item/mech_component/control_module/proc/update_software() installed_software = list() for(var/obj/item/circuitboard/exosystem/program in contents) - installed_software |= program.contains_software \ No newline at end of file + installed_software |= program.contains_software diff --git a/code/modules/heavy_vehicle/components/legs.dm b/code/modules/heavy_vehicle/components/legs.dm index 279ce38f92c..fc5d79ccc40 100644 --- a/code/modules/heavy_vehicle/components/legs.dm +++ b/code/modules/heavy_vehicle/components/legs.dm @@ -58,4 +58,4 @@ return 1 // Inside something, assume you can get out. if(!istype(target_loc)) return 0 // What are you even doing. - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/heavy_vehicle/components/software.dm b/code/modules/heavy_vehicle/components/software.dm index 56dd68a7d57..9e86531e15f 100644 --- a/code/modules/heavy_vehicle/components/software.dm +++ b/code/modules/heavy_vehicle/components/software.dm @@ -31,4 +31,4 @@ icon_state = "mainboard" origin_tech = list(TECH_DATA = 3, TECH_COMBAT = 3) -#undef T_BOARD_MECHA \ No newline at end of file +#undef T_BOARD_MECHA diff --git a/code/modules/heavy_vehicle/equipment/_equipment.dm b/code/modules/heavy_vehicle/equipment/_equipment.dm index d290a719eeb..099dd3ed73a 100644 --- a/code/modules/heavy_vehicle/equipment/_equipment.dm +++ b/code/modules/heavy_vehicle/equipment/_equipment.dm @@ -136,4 +136,4 @@ /obj/item/mecha_equipment/mounted_system/get_cell() if(owner && loc == owner) return owner.get_cell() - return null \ No newline at end of file + return null diff --git a/code/modules/heavy_vehicle/equipment/cult.dm b/code/modules/heavy_vehicle/equipment/cult.dm index 8ec00d777d2..1bca134589a 100644 --- a/code/modules/heavy_vehicle/equipment/cult.dm +++ b/code/modules/heavy_vehicle/equipment/cult.dm @@ -24,4 +24,4 @@ /obj/item/mecha_equipment/doomblade/attack(mob/living/M, mob/living/user) if(!owner) return - doomblade.attack(M, user, user.zone_sel.selecting) \ No newline at end of file + doomblade.attack(M, user, user.zone_sel.selecting) diff --git a/code/modules/heavy_vehicle/mech_helpers.dm b/code/modules/heavy_vehicle/mech_helpers.dm index a63a4a38f0d..78a624c1754 100644 --- a/code/modules/heavy_vehicle/mech_helpers.dm +++ b/code/modules/heavy_vehicle/mech_helpers.dm @@ -120,4 +120,4 @@ var/obj/item/mech_component/MC = zoneToComponent(def_zone) if(MC) return MC.name - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/heavy_vehicle/premade/combat.dm b/code/modules/heavy_vehicle/premade/combat.dm index 6c2a639d53d..feb10deb221 100644 --- a/code/modules/heavy_vehicle/premade/combat.dm +++ b/code/modules/heavy_vehicle/premade/combat.dm @@ -75,4 +75,4 @@ ) ) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/heavy_vehicle/premade/light.dm b/code/modules/heavy_vehicle/premade/light.dm index 1b973fc3f1b..1667239d4fc 100644 --- a/code/modules/heavy_vehicle/premade/light.dm +++ b/code/modules/heavy_vehicle/premade/light.dm @@ -126,4 +126,4 @@ h_back = /obj/item/mecha_equipment/quick_enter h_l_shoulder = /obj/item/mecha_equipment/mounted_system/flarelauncher - h_r_shoulder = /obj/item/mecha_equipment/mounted_system/combat/smg \ No newline at end of file + h_r_shoulder = /obj/item/mecha_equipment/mounted_system/combat/smg diff --git a/code/modules/heavy_vehicle/premade/military.dm b/code/modules/heavy_vehicle/premade/military.dm index 06bd8252448..cb9feda6fb8 100644 --- a/code/modules/heavy_vehicle/premade/military.dm +++ b/code/modules/heavy_vehicle/premade/military.dm @@ -62,4 +62,4 @@ e_color = COLOR_DARK_GUNMETAL h_r_shoulder = /obj/item/mecha_equipment/mounted_system/combat/pulse - h_l_shoulder = /obj/item/mecha_equipment/mounted_system/combat/pulse \ No newline at end of file + h_l_shoulder = /obj/item/mecha_equipment/mounted_system/combat/pulse diff --git a/code/modules/heavy_vehicle/premade/misc.dm b/code/modules/heavy_vehicle/premade/misc.dm index 7d5573656d5..f3e5500438f 100644 --- a/code/modules/heavy_vehicle/premade/misc.dm +++ b/code/modules/heavy_vehicle/premade/misc.dm @@ -31,4 +31,4 @@ power_use = 7500 color = COLOR_WHITE mech_step_sound = 'sound/mecha/tanktread.ogg' - trample_damage = 25 \ No newline at end of file + trample_damage = 25 diff --git a/code/modules/heavy_vehicle/premade/pra.dm b/code/modules/heavy_vehicle/premade/pra.dm index 825bd1b6561..960ba150e0f 100644 --- a/code/modules/heavy_vehicle/premade/pra.dm +++ b/code/modules/heavy_vehicle/premade/pra.dm @@ -96,4 +96,4 @@ /obj/item/mech_component/chassis/pra_egg/armored/prebuild() . = ..() - mech_armor = new /obj/item/robot_parts/robot_component/armor/mech/combat(src) \ No newline at end of file + mech_armor = new /obj/item/robot_parts/robot_component/armor/mech/combat(src) diff --git a/code/modules/holidays/halloween/props.dm b/code/modules/holidays/halloween/props.dm index 01730c7870f..82b589b6c42 100644 --- a/code/modules/holidays/halloween/props.dm +++ b/code/modules/holidays/halloween/props.dm @@ -27,4 +27,4 @@ icon_state = "halloween_l" /obj/structure/sign/flag/halloween/right - icon_state = "halloween_r" \ No newline at end of file + icon_state = "halloween_r" diff --git a/code/modules/hydroponics/beekeeping/bee_pack.dm b/code/modules/hydroponics/beekeeping/bee_pack.dm index ff8af00290a..51644c04921 100644 --- a/code/modules/hydroponics/beekeeping/bee_pack.dm +++ b/code/modules/hydroponics/beekeeping/bee_pack.dm @@ -23,4 +23,4 @@ name = initial(name) desc = initial(desc) full = TRUE - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm index de3ab26baae..dee7f8c9d41 100644 --- a/code/modules/hydroponics/beekeeping/honey_frame.dm +++ b/code/modules/hydroponics/beekeeping/honey_frame.dm @@ -13,4 +13,4 @@ /obj/item/honey_frame/filled/Initialize() . = ..() - add_overlay("honeycomb") \ No newline at end of file + add_overlay("honeycomb") diff --git a/code/modules/hydroponics/beekeeping/wax.dm b/code/modules/hydroponics/beekeeping/wax.dm index 54a06c72ce6..28abb07c8dc 100644 --- a/code/modules/hydroponics/beekeeping/wax.dm +++ b/code/modules/hydroponics/beekeeping/wax.dm @@ -12,4 +12,4 @@ var/global/list/datum/stack_recipe/wax_recipes = list( new /datum/stack_recipe("candle", /obj/item/flame/candle) -) \ No newline at end of file +) diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index ab1f453eb51..9c789fcefdd 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -76,4 +76,4 @@ if(H.shoes?.item_flags & LIGHTSTEP) return var/mob/living/M = AM - M.slip("the [src.name]",4) \ No newline at end of file + M.slip("the [src.name]",4) diff --git a/code/modules/hydroponics/seed_datums/aquaculture.dm b/code/modules/hydroponics/seed_datums/aquaculture.dm index eab68ff7147..30b1a166104 100644 --- a/code/modules/hydroponics/seed_datums/aquaculture.dm +++ b/code/modules/hydroponics/seed_datums/aquaculture.dm @@ -63,4 +63,4 @@ set_trait(TRAIT_PLANT_COLOUR, "#9aaca6") /obj/item/seeds/clam/rasval - seed_type = "rasval clam" \ No newline at end of file + seed_type = "rasval clam" diff --git a/code/modules/hydroponics/seed_datums/fruits.dm b/code/modules/hydroponics/seed_datums/fruits.dm index da527c13add..cf31286e2de 100644 --- a/code/modules/hydroponics/seed_datums/fruits.dm +++ b/code/modules/hydroponics/seed_datums/fruits.dm @@ -473,4 +473,4 @@ set_trait(TRAIT_IDEAL_LIGHT, 6) /obj/item/seeds/richcoffeeseed - seed_type = "richcoffee" \ No newline at end of file + seed_type = "richcoffee" diff --git a/code/modules/hydroponics/seed_datums/unathi.dm b/code/modules/hydroponics/seed_datums/unathi.dm index 37f0133085e..2cbef7c4b18 100644 --- a/code/modules/hydroponics/seed_datums/unathi.dm +++ b/code/modules/hydroponics/seed_datums/unathi.dm @@ -136,4 +136,4 @@ set_trait(TRAIT_NUTRIENT_CONSUMPTION, 0.15) /obj/item/seeds/serkiflowerseed - seed_type = "S'erki flowers" \ No newline at end of file + seed_type = "S'erki flowers" diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 03dc57a7120..d3752e6c770 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -22,4 +22,4 @@ for(var/j = 0;j<=total_yield;j++) var/obj/item/seeds/S = new(get_turf(host)) S.seed_type = name - S.update_seed() \ No newline at end of file + S.update_seed() diff --git a/code/modules/integrated_electronics/core/special_pins/ref_pin.dm b/code/modules/integrated_electronics/core/special_pins/ref_pin.dm index 461965f254b..90901357a23 100644 --- a/code/modules/integrated_electronics/core/special_pins/ref_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/ref_pin.dm @@ -11,4 +11,4 @@ holder.on_data_written() /datum/integrated_io/ref/display_pin_type() - return IC_FORMAT_REF \ No newline at end of file + return IC_FORMAT_REF diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm index 7505ed867ea..ce7708c001e 100644 --- a/code/modules/integrated_electronics/subtypes/arithmetic.dm +++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm @@ -350,4 +350,4 @@ set_pin_data(IC_OUTPUT, 1, max(values)) push_data() - activate_pin(2) \ No newline at end of file + activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/built_in.dm b/code/modules/integrated_electronics/subtypes/built_in.dm index 23002aacd1e..aa49e08ef92 100644 --- a/code/modules/integrated_electronics/subtypes/built_in.dm +++ b/code/modules/integrated_electronics/subtypes/built_in.dm @@ -37,4 +37,4 @@ outputs = list("output" = IC_PINTYPE_ANY) /obj/item/integrated_circuit/built_in/action_button/do_work() - activate_pin(1) \ No newline at end of file + activate_pin(1) diff --git a/code/modules/integrated_electronics/~defines/~defines.dm b/code/modules/integrated_electronics/~defines/~defines.dm index 90aa05acf19..621967d81e7 100644 --- a/code/modules/integrated_electronics/~defines/~defines.dm +++ b/code/modules/integrated_electronics/~defines/~defines.dm @@ -33,4 +33,4 @@ #undef IC_PINTYPE_PULSE_IN #undef IC_PINTYPE_PULSE_OUT -#undef IC_MAX_LIST_LENGTH \ No newline at end of file +#undef IC_MAX_LIST_LENGTH diff --git a/code/modules/item_worth/Value_procs/atoms.dm b/code/modules/item_worth/Value_procs/atoms.dm index e88a886093d..6887b3b747e 100644 --- a/code/modules/item_worth/Value_procs/atoms.dm +++ b/code/modules/item_worth/Value_procs/atoms.dm @@ -1,2 +1,2 @@ /atom/proc/Value(var/base) - return base \ No newline at end of file + return base diff --git a/code/modules/item_worth/Value_procs/mob.dm b/code/modules/item_worth/Value_procs/mob.dm index 1c37bec0f33..d22e0658ee1 100644 --- a/code/modules/item_worth/Value_procs/mob.dm +++ b/code/modules/item_worth/Value_procs/mob.dm @@ -1,4 +1,4 @@ /mob/living/carbon/human/Value(var/base) . = ..() if(species) - . *= species.rarity_value \ No newline at end of file + . *= species.rarity_value diff --git a/code/modules/item_worth/Value_procs/obj.dm b/code/modules/item_worth/Value_procs/obj.dm index 0703330a8ee..d5482ddc89e 100644 --- a/code/modules/item_worth/Value_procs/obj.dm +++ b/code/modules/item_worth/Value_procs/obj.dm @@ -1,4 +1,4 @@ /obj/Value() . = ..() for(var/a in contents) - . += get_value(a) \ No newline at end of file + . += get_value(a) diff --git a/code/modules/item_worth/Value_procs/obj/machinery.dm b/code/modules/item_worth/Value_procs/obj/machinery.dm index 4301061c9a5..e258b2797e8 100644 --- a/code/modules/item_worth/Value_procs/obj/machinery.dm +++ b/code/modules/item_worth/Value_procs/obj/machinery.dm @@ -2,4 +2,4 @@ . = ..() if(stat & BROKEN) . *= 0.5 - . = round(.) \ No newline at end of file + . = round(.) diff --git a/code/modules/item_worth/Value_procs/obj/structures.dm b/code/modules/item_worth/Value_procs/obj/structures.dm index f2b48d9f4a4..402dec629b6 100644 --- a/code/modules/item_worth/Value_procs/obj/structures.dm +++ b/code/modules/item_worth/Value_procs/obj/structures.dm @@ -2,4 +2,4 @@ return material.value /obj/structure/bed/Value() - return ..() * material.value \ No newline at end of file + return ..() * material.value diff --git a/code/modules/item_worth/_helpers.dm b/code/modules/item_worth/_helpers.dm index 8841debc67a..c93239234f3 100644 --- a/code/modules/item_worth/_helpers.dm +++ b/code/modules/item_worth/_helpers.dm @@ -1,3 +1,3 @@ //Workaround by Ginja due to the fact initial(parent_type) does not work. -#define PARENT(x) text2path(replacetext("[x]", regex("/\[^/\]+$"), "")) \ No newline at end of file +#define PARENT(x) text2path(replacetext("[x]", regex("/\[^/\]+$"), "")) diff --git a/code/modules/item_worth/item_worth.dm b/code/modules/item_worth/item_worth.dm index 0b182021a18..f47a53a260d 100644 --- a/code/modules/item_worth/item_worth.dm +++ b/code/modules/item_worth/item_worth.dm @@ -10,4 +10,4 @@ else // Negative. If it's a path, use -x, otherwise call Value() on the instance if(ispath(A)) return -value - return A.Value(-value) \ No newline at end of file + return A.Value(-value) diff --git a/code/modules/item_worth/material_weapons.dm b/code/modules/item_worth/material_weapons.dm index c06d74f3b3f..e76b103e156 100644 --- a/code/modules/item_worth/material_weapons.dm +++ b/code/modules/item_worth/material_weapons.dm @@ -44,4 +44,4 @@ worth_multiplier = 10 /obj/item/material/twohanded/zweihander - worth_multiplier = 35 \ No newline at end of file + worth_multiplier = 35 diff --git a/code/modules/law/law.dm b/code/modules/law/law.dm index de2fb1732a9..f3b8c3a3411 100644 --- a/code/modules/law/law.dm +++ b/code/modules/law/law.dm @@ -48,4 +48,4 @@ $PRISONER_NAME was found guilty of $CRIME on $DATE. Their sentence was $SENTENCE if(max_brig_time >= PERMABRIG_SENTENCE) return "[min_brig_time] minutes - HuT" else - return "[min_brig_time] - [max_brig_time] minutes" \ No newline at end of file + return "[min_brig_time] - [max_brig_time] minutes" diff --git a/code/modules/law/laws/high_severity.dm b/code/modules/law/laws/high_severity.dm index 736e58a0284..d404ab16859 100644 --- a/code/modules/law/laws/high_severity.dm +++ b/code/modules/law/laws/high_severity.dm @@ -91,4 +91,4 @@ id = "i311" min_brig_time = 20 - max_brig_time = 90 \ No newline at end of file + max_brig_time = 90 diff --git a/code/modules/law/laws/low_severity.dm b/code/modules/law/laws/low_severity.dm index b215529fbf7..b477523d736 100644 --- a/code/modules/law/laws/low_severity.dm +++ b/code/modules/law/laws/low_severity.dm @@ -197,4 +197,4 @@ max_brig_time = 10 min_fine = 500 - max_fine = 750 \ No newline at end of file + max_fine = 750 diff --git a/code/modules/maps/helper_landmarks.dm b/code/modules/maps/helper_landmarks.dm index 2bec33a763e..2ba49eaa049 100644 --- a/code/modules/maps/helper_landmarks.dm +++ b/code/modules/maps/helper_landmarks.dm @@ -29,4 +29,4 @@ var/turf/simulated/T = get_turf(src) if(istype(T)) T.fire_act(temp) - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/maps/planet_types/lore/burzsia.dm b/code/modules/maps/planet_types/lore/burzsia.dm index 8007d82e15a..4e16d496577 100644 --- a/code/modules/maps/planet_types/lore/burzsia.dm +++ b/code/modules/maps/planet_types/lore/burzsia.dm @@ -58,4 +58,4 @@ /obj/effect/overmap/visitable/sector/exoplanet/barren/asteroid/burzsia name = "Burzsia II" - generated_name = FALSE \ No newline at end of file + generated_name = FALSE diff --git a/code/modules/martial_arts/gunkata.dm b/code/modules/martial_arts/gunkata.dm index deb8783237c..663b262a2b1 100644 --- a/code/modules/martial_arts/gunkata.dm +++ b/code/modules/martial_arts/gunkata.dm @@ -7,4 +7,4 @@ desc = "A manual containing basic Gun-Kata instruction and techniques." icon_state = "rulebook" item_state = "rulebook" - martial_art = /datum/martial_art/gun_kata \ No newline at end of file + martial_art = /datum/martial_art/gun_kata diff --git a/code/modules/martial_arts/plasma_fist.dm b/code/modules/martial_arts/plasma_fist.dm index af6b91cce93..87c6e231465 100644 --- a/code/modules/martial_arts/plasma_fist.dm +++ b/code/modules/martial_arts/plasma_fist.dm @@ -116,4 +116,4 @@ #undef TORNADO_COMBO #undef THROWBACK_COMBO -#undef PLASMA_COMBO \ No newline at end of file +#undef PLASMA_COMBO diff --git a/code/modules/martial_arts/revenant.dm b/code/modules/martial_arts/revenant.dm index eb01f7c5f02..e00e6c79d2a 100644 --- a/code/modules/martial_arts/revenant.dm +++ b/code/modules/martial_arts/revenant.dm @@ -37,4 +37,4 @@ to_chat(usr, "You think of your former dimension...") to_chat(usr, "Bash Slash: Harm Harm Harm. Deliver a strong slashing strike against the enemy, pushing them away.") -#undef BASH_SLASH \ No newline at end of file +#undef BASH_SLASH diff --git a/code/modules/martial_arts/tajara.dm b/code/modules/martial_arts/tajara.dm index c2cff2a21ef..fa10d44e4b0 100644 --- a/code/modules/martial_arts/tajara.dm +++ b/code/modules/martial_arts/tajara.dm @@ -107,4 +107,4 @@ #undef EYE_RAKE #undef CLAW_PUNCH -#undef RRAKNARR_STAB \ No newline at end of file +#undef RRAKNARR_STAB diff --git a/code/modules/martial_arts/unathi.dm b/code/modules/martial_arts/unathi.dm index 3219ca52f28..3a02e10bed0 100644 --- a/code/modules/martial_arts/unathi.dm +++ b/code/modules/martial_arts/unathi.dm @@ -107,4 +107,4 @@ #undef TAIL_SWEEP #undef SWIFT_DISARM -#undef HAMMERING_STRIKE \ No newline at end of file +#undef HAMMERING_STRIKE diff --git a/code/modules/materials/_material_def.dm b/code/modules/materials/_material_def.dm index b0678001645..6dcd23e47a4 100644 --- a/code/modules/materials/_material_def.dm +++ b/code/modules/materials/_material_def.dm @@ -1 +1 @@ -#define BUILD_AMT "build_amt" // just a silly string intended to show that a structure recipe makes use of build_amt \ No newline at end of file +#define BUILD_AMT "build_amt" // just a silly string intended to show that a structure recipe makes use of build_amt diff --git a/code/modules/materials/~material_def.dm b/code/modules/materials/~material_def.dm index 2854525b101..5d5960ecf0c 100644 --- a/code/modules/materials/~material_def.dm +++ b/code/modules/materials/~material_def.dm @@ -1 +1 @@ -#undef BUILD_AMT \ No newline at end of file +#undef BUILD_AMT diff --git a/code/modules/merchant/merchant_machinery.dm b/code/modules/merchant/merchant_machinery.dm index 7c4fb06f912..c492f592ece 100644 --- a/code/modules/merchant/merchant_machinery.dm +++ b/code/modules/merchant/merchant_machinery.dm @@ -19,4 +19,4 @@ for(var/a in T) if(a == src || (!istype(a,/obj) && !istype(a,/mob/living)) || istype(a,/obj/effect)) continue - . += a \ No newline at end of file + . += a diff --git a/code/modules/mining/machine_input_output_plates.dm b/code/modules/mining/machine_input_output_plates.dm index f4f9184be33..8ae12d15258 100644 --- a/code/modules/mining/machine_input_output_plates.dm +++ b/code/modules/mining/machine_input_output_plates.dm @@ -22,4 +22,4 @@ /obj/machinery/mineral/output/Initialize() . = ..() - icon_state = "blank" \ No newline at end of file + icon_state = "blank" diff --git a/code/modules/mining/ore_datum.dm b/code/modules/mining/ore_datum.dm index 870f9834b7c..a08eaf272d6 100644 --- a/code/modules/mining/ore_datum.dm +++ b/code/modules/mining/ore_datum.dm @@ -141,4 +141,4 @@ var/global/list/ore_data = list() smelts_to = MATERIAL_TRITIUM compresses_to = MATERIAL_HYDROGEN_METALLIC scan_icon = "mineral_rare" - worth = 30 \ No newline at end of file + worth = 30 diff --git a/code/modules/mob/abstract/freelook/ai/cameranet.dm b/code/modules/mob/abstract/freelook/ai/cameranet.dm index 81e3df31ae3..28f17dad205 100644 --- a/code/modules/mob/abstract/freelook/ai/cameranet.dm +++ b/code/modules/mob/abstract/freelook/ai/cameranet.dm @@ -36,4 +36,4 @@ var/mob/living/silicon/AI = c return ..(AI, AI.stat != DEAD) else - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/abstract/freelook/visualnet.dm b/code/modules/mob/abstract/freelook/visualnet.dm index f85d54519f7..ccfe714ddde 100644 --- a/code/modules/mob/abstract/freelook/visualnet.dm +++ b/code/modules/mob/abstract/freelook/visualnet.dm @@ -182,4 +182,4 @@ if(cameranet.is_chunk_generated(x, y, z)) var/datum/chunk/chunk = cameranet.get_chunk(x, y, z) - chunk.visibility_changed(TRUE) \ No newline at end of file + chunk.visibility_changed(TRUE) diff --git a/code/modules/mob/gender.dm b/code/modules/mob/gender.dm index cd410ab8c93..ca42bf5f6d7 100644 --- a/code/modules/mob/gender.dm +++ b/code/modules/mob/gender.dm @@ -75,4 +75,4 @@ var/list/datum/gender/gender_datums = list() /atom/proc/get_pronoun(var/wordtype) var/gender_to_use = get_gender() - return gender_datums[gender_to_use][wordtype] \ No newline at end of file + return gender_datums[gender_to_use][wordtype] diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 3efe277b01a..810aa61fce9 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,4 +1,4 @@ /mob/living/carbon/alien/death(gibbed) if(!gibbed && icon_dead) icon_state = icon_dead - return ..(gibbed,death_msg) \ No newline at end of file + return ..(gibbed,death_msg) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm index 13f3b928535..19515e399eb 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -43,4 +43,4 @@ if(istype(W, /obj/item/material/knife) || istype(W, /obj/item/material/kitchen/utensil/knife)) harvest(user) return - ..(W, user) \ No newline at end of file + ..(W, user) diff --git a/code/modules/mob/living/carbon/alien/diona/update_icons.dm b/code/modules/mob/living/carbon/alien/diona/update_icons.dm index c77ac9b926c..30737ebe6f6 100644 --- a/code/modules/mob/living/carbon/alien/diona/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/diona/update_icons.dm @@ -16,4 +16,4 @@ add_overlay(flower_image) if(hat) - add_overlay(get_hat_icon(hat, 0, -8)) \ No newline at end of file + add_overlay(get_hat_icon(hat, 0, -8)) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index b5f6520d817..f02862bb4c7 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -17,4 +17,4 @@ slot_l_hand_str = 'icons/mob/items/lefthand_books.dmi', slot_r_hand_str = 'icons/mob/items/righthand_books.dmi' ) - can_prepare = 0 \ No newline at end of file + can_prepare = 0 diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index b4e77b8ee0d..f431ee560c2 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -11,4 +11,4 @@ if(loc) if(istype(loc,/obj/item/organ/internal/brain)) qdel(loc)//Gets rid of the brain item - ..(null,1) \ No newline at end of file + ..(null,1) diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index 625f45754f6..2772155f90b 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -37,4 +37,4 @@ return /obj/item/device/mmi/digital/robot/attack_self(mob/user) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6c60272ebca..f44f12381bc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -667,7 +667,7 @@ var/setmedical = tgui_input_list(usr, "Specify a new medical status for this person.", "Medical HUD", list("*SSD*", "*Deceased*", "*Missing*", "Physically Unfit", "Active", "Disabled", "Cancel"), R.physical_status) if(hasHUD(usr,"medical")) - if(setmedical != "Cancel") + if(!isnull(setmedical) && setmedical != "Cancel") R.physical_status = setmedical modified = 1 SSrecords.reset_manifest() diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm index 8b6c8eb4039..8bef8c6adfd 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm @@ -138,4 +138,4 @@ H.equip_to_slot_or_del(S,slot_shoes) /datum/species/get_species_record_sex(var/mob/living/carbon/human/H) - return H.pronouns \ No newline at end of file + return H.pronouns diff --git a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm index 944f2c606c8..9cdb61de980 100644 --- a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm @@ -105,14 +105,14 @@ ) has_organ = list( - BP_BRAIN = /obj/item/organ/internal/brain/unathi, - BP_EYES = /obj/item/organ/internal/eyes/unathi, - BP_HEART = /obj/item/organ/internal/heart/unathi, - BP_LIVER = /obj/item/organ/internal/liver/unathi, - BP_LUNGS = /obj/item/organ/internal/lungs/unathi, - BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi, - BP_STOMACH = /obj/item/organ/internal/stomach/unathi - ) + BP_BRAIN = /obj/item/organ/internal/brain/unathi, + BP_EYES = /obj/item/organ/internal/eyes/unathi, + BP_HEART = /obj/item/organ/internal/heart/unathi, + BP_LIVER = /obj/item/organ/internal/liver/unathi, + BP_LUNGS = /obj/item/organ/internal/lungs/unathi, + BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi, + BP_STOMACH = /obj/item/organ/internal/stomach/unathi + ) alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH) diff --git a/code/modules/mob/living/carbon/human/virtual_reality_mob.dm b/code/modules/mob/living/carbon/human/virtual_reality_mob.dm index 4813d814523..746bbb80e72 100644 --- a/code/modules/mob/living/carbon/human/virtual_reality_mob.dm +++ b/code/modules/mob/living/carbon/human/virtual_reality_mob.dm @@ -2,4 +2,4 @@ /mob/living/carbon/human/virtual_reality/death(gibbed)//the body is deleted when you die to simulate your virtual avatar being deleted ..() - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/living/carbon/slime/_mood.dm b/code/modules/mob/living/carbon/slime/_mood.dm index 4597597bcce..b4c330ab1ff 100644 --- a/code/modules/mob/living/carbon/slime/_mood.dm +++ b/code/modules/mob/living/carbon/slime/_mood.dm @@ -2,4 +2,4 @@ #define SAD "sad" #define ANGRY "angry" #define MISCHIEVOUS "mischevous" -#define HAPPY ":3" \ No newline at end of file +#define HAPPY ":3" diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm index 699032f5a4e..eac3b6707c8 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -89,4 +89,4 @@ send_emote(message, m_type) if(updateicon) regenerate_icons() - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/slime/helpers.dm b/code/modules/mob/living/carbon/slime/helpers.dm index 8294bbc02fc..48f7797d278 100644 --- a/code/modules/mob/living/carbon/slime/helpers.dm +++ b/code/modules/mob/living/carbon/slime/helpers.dm @@ -20,4 +20,4 @@ if(victim && !rabid && !attacked && victim.LAssailant && victim.LAssailant != victim) var/real_assailant = victim.LAssailant.resolve() if(real_assailant) - increase_friendship(real_assailant) \ No newline at end of file + increase_friendship(real_assailant) diff --git a/code/modules/mob/living/carbon/slime/hud.dm b/code/modules/mob/living/carbon/slime/hud.dm index c093d61f8cf..bd655f66992 100644 --- a/code/modules/mob/living/carbon/slime/hud.dm +++ b/code/modules/mob/living/carbon/slime/hud.dm @@ -1,2 +1,2 @@ /mob/living/carbon/slime/handle_regular_hud_updates() - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/slime/subtypes.dm b/code/modules/mob/living/carbon/slime/subtypes.dm index 0f686964730..acba5afb5ba 100644 --- a/code/modules/mob/living/carbon/slime/subtypes.dm +++ b/code/modules/mob/living/carbon/slime/subtypes.dm @@ -76,4 +76,4 @@ slime_mutation[2] = colour slime_mutation[3] = colour slime_mutation[4] = colour - return(slime_mutation) \ No newline at end of file + return(slime_mutation) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index cf0aa7152cd..e6911c2ea55 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -267,7 +267,10 @@ var/list/ai_verbs_default = list( health = maxHealth - getFireLoss() - getBruteLoss() // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine. /mob/living/silicon/ai/proc/setup_icon() - var/datum/custom_synth/sprite = robot_custom_icons[name] + var/datum/custom_synth/sprite = null + if(robot_custom_icons) + sprite = robot_custom_icons[name] + if(istype(sprite) && sprite.synthckey == ckey) custom_sprite = TRUE icon = CUSTOM_ITEM_SYNTH diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 33905de2309..77d569bfe06 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -17,4 +17,4 @@ . = ..(gibbed,"gives one shrill beep before falling lifeless.") density = TRUE - ghostize(FALSE) \ No newline at end of file + ghostize(FALSE) diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index c82bd85dbf7..38d0ebe853e 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -16,4 +16,4 @@ qdel(mind) ..(gibbed) ghostize() - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 4f9cd45991a..576ac71ff13 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -326,4 +326,4 @@ name = "radio" desc = "A modular, multi-frequency radio used by robots and exosuits to enable communication systems. Comes with built-in subspace receivers." icon_state = "radio" - icon_state_broken = "radio_broken" \ No newline at end of file + icon_state_broken = "radio_broken" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index baeb26dcf8e..18a72f1f047 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -35,4 +35,4 @@ QDEL_NULL(hat_overlay) update_icon() else - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm index ad7c677f72b..2055e965f14 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_damage.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_damage.dm @@ -26,4 +26,4 @@ return fireloss /mob/living/silicon/robot/drone/getBruteLoss() - return bruteloss \ No newline at end of file + return bruteloss diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index b58aacc4795..728303724c8 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -7,4 +7,4 @@ visible_message(SPAN_WARNING("The power warning light on \the [src] flashes urgently.")) playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 0) else - to_chat(src, SPAN_WARNING("You can only use this emote when you're out of charge.")) \ No newline at end of file + to_chat(src, SPAN_WARNING("You can only use this emote when you're out of charge.")) diff --git a/code/modules/mob/living/silicon/robot/items/_helpers.dm b/code/modules/mob/living/silicon/robot/items/_helpers.dm index 4424bb60aa2..984afcc6e8e 100644 --- a/code/modules/mob/living/silicon/robot/items/_helpers.dm +++ b/code/modules/mob/living/silicon/robot/items/_helpers.dm @@ -8,4 +8,4 @@ return /obj/item/proc/on_module_deactivate(var/mob/living/silicon/robot/R) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/robot/items/electric_arm.dm b/code/modules/mob/living/silicon/robot/items/electric_arm.dm index 2b21b7ba738..99a365519c4 100644 --- a/code/modules/mob/living/silicon/robot/items/electric_arm.dm +++ b/code/modules/mob/living/silicon/robot/items/electric_arm.dm @@ -17,4 +17,4 @@ M.apply_effect(5, STUTTER) M.stun_effect_act(0, 70, check_zone(hit_zone), src) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/mob/living/silicon/robot/items/form_printer.dm b/code/modules/mob/living/silicon/robot/items/form_printer.dm index 5e226da794f..8ecb455a45c 100644 --- a/code/modules/mob/living/silicon/robot/items/form_printer.dm +++ b/code/modules/mob/living/silicon/robot/items/form_printer.dm @@ -19,4 +19,4 @@ /obj/item/form_printer/proc/deploy_paper(var/turf/T, var/mob/user) T.visible_message(SPAN_NOTICE("\The [user] dispenses a sheet of crisp white paper.")) - new /obj/item/paper(T) \ No newline at end of file + new /obj/item/paper(T) diff --git a/code/modules/mob/living/silicon/robot/items/guns/ballistic_cannon.dm b/code/modules/mob/living/silicon/robot/items/guns/ballistic_cannon.dm index ba959e357f3..16b4deecd1f 100644 --- a/code/modules/mob/living/silicon/robot/items/guns/ballistic_cannon.dm +++ b/code/modules/mob/living/silicon/robot/items/guns/ballistic_cannon.dm @@ -12,4 +12,4 @@ self_recharge = TRUE use_external_power = TRUE recharge_time = 5 - needspin = FALSE \ No newline at end of file + needspin = FALSE diff --git a/code/modules/mob/living/silicon/robot/items/modules/sight.dm b/code/modules/mob/living/silicon/robot/items/modules/sight.dm index 967953f732f..612fbc97a9a 100644 --- a/code/modules/mob/living/silicon/robot/items/modules/sight.dm +++ b/code/modules/mob/living/silicon/robot/items/modules/sight.dm @@ -28,4 +28,4 @@ /obj/item/borg/sight/material name = "\proper material scanner vision" - sight_mode = BORGMATERIAL \ No newline at end of file + sight_mode = BORGMATERIAL diff --git a/code/modules/mob/living/silicon/robot/items/overdrive.dm b/code/modules/mob/living/silicon/robot/items/overdrive.dm index d9335ba01b9..853964922b6 100644 --- a/code/modules/mob/living/silicon/robot/items/overdrive.dm +++ b/code/modules/mob/living/silicon/robot/items/overdrive.dm @@ -1,4 +1,4 @@ /obj/item/borg/overdrive name = "overdrive" icon = 'icons/obj/decals.dmi' - icon_state = "shock" \ No newline at end of file + icon_state = "shock" diff --git a/code/modules/mob/living/silicon/robot/items/robot_id.dm b/code/modules/mob/living/silicon/robot/items/robot_id.dm index 29e78bac0be..f6a2f96e8dc 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_id.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_id.dm @@ -3,4 +3,4 @@ name = "access code transmission device" icon_state = "id-robot" desc = "A circuit grafted onto the bottom of an ID card. It is used to transmit access codes into other robot chassis, \ - allowing you to lock and unlock other robots' panels." \ No newline at end of file + allowing you to lock and unlock other robots' panels." diff --git a/code/modules/mob/living/silicon/robot/items/robot_pen.dm b/code/modules/mob/living/silicon/robot/items/robot_pen.dm index f472023112e..92cf03f39a5 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_pen.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_pen.dm @@ -36,4 +36,4 @@ add_fingerprint(user) #undef WRITE_PAPER -#undef RENAME_PAPER \ No newline at end of file +#undef RENAME_PAPER diff --git a/code/modules/mob/living/silicon/robot/items/robot_tools.dm b/code/modules/mob/living/silicon/robot/items/robot_tools.dm index 5b98876e99b..991ec09469c 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_tools.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_tools.dm @@ -24,4 +24,4 @@ /obj/item/soap/drone name = "integrated soap" desc = "An advanced bar of soap that connects to an internal reservoir of a custodial bot, allowing it to stay wet for longer periods of time." - capacity = 50 \ No newline at end of file + capacity = 50 diff --git a/code/modules/mob/living/silicon/robot/items/robot_tray.dm b/code/modules/mob/living/silicon/robot/items/robot_tray.dm index 9028aa0e8c4..58866896cdb 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_tray.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_tray.dm @@ -24,4 +24,4 @@ spill(user,dropspot) current_weight = 0 - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/silicon/robot/items/upgrades/robot_upgrades.dm b/code/modules/mob/living/silicon/robot/items/upgrades/robot_upgrades.dm index b6f2838be31..ee857566e0b 100644 --- a/code/modules/mob/living/silicon/robot/items/upgrades/robot_upgrades.dm +++ b/code/modules/mob/living/silicon/robot/items/upgrades/robot_upgrades.dm @@ -146,4 +146,4 @@ return FALSE R.crisis_override = TRUE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/silicon/robot/photos.dm b/code/modules/mob/living/silicon/robot/photos.dm index 345228e3da0..dcf3dc7c176 100644 --- a/code/modules/mob/living/silicon/robot/photos.dm +++ b/code/modules/mob/living/silicon/robot/photos.dm @@ -17,4 +17,4 @@ synced = TRUE if(synced) - to_chat(src, SPAN_NOTICE("Images synced with AI. Local images will be retained in the case of loss of connection with the AI.")) \ No newline at end of file + to_chat(src, SPAN_NOTICE("Images synced with AI. Local images will be retained in the case of loss of connection with the AI.")) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 634546d1e7e..2151bc8aabe 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -507,22 +507,6 @@ to_chat(src, SPAN_NOTICE("You [C.toggled ? "disable" : "enable"] [C.name].")) C.toggled = !C.toggled -/mob/living/silicon/robot/verb/view_holomap() - set category = "Robot Commands" - set name = "View Holomap" - set desc = "View a virtual map of the surrounding area." - - var/obj/machinery/station_map/mobile/holo_map_object - if(src.holo_map) - holo_map_object = src.holo_map.resolve() - - // Not an else because weakref.resolve() can return false. Edge case - if(!holo_map_object) - holo_map_object = new(src) - src.holo_map = WEAKREF(holo_map) - - holo_map_object.startWatching(src) - /mob/living/silicon/robot/verb/rebuild_overlays() set category = "Robot Commands" set name = "Rebuild Overlays" diff --git a/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm b/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm index e4a9c803348..b9644c67e21 100644 --- a/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm +++ b/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm @@ -48,4 +48,4 @@ if(loc == target_turf) break step_to(src, target_turf) - sleep(6) \ No newline at end of file + sleep(6) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index e17cdabe0aa..501e4e40448 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -33,4 +33,4 @@ if(turns_since_move >= turns_per_move) Move(get_step(src,pick(4,8))) turns_since_move = 0 - regenerate_icons() \ No newline at end of file + regenerate_icons() diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm index 6cf7a8d5ba3..69a7c2bebfc 100644 --- a/code/modules/mob/living/simple_animal/friendly/tomato.dm +++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm @@ -17,4 +17,4 @@ melee_damage_upper = 15 melee_damage_lower = 10 attacktext = "mauled" - mob_size = 2 \ No newline at end of file + mob_size = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm b/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm index 9a40c34199c..dc39167b5d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm +++ b/code/modules/mob/living/simple_animal/hostile/cavern_geist.dm @@ -109,4 +109,4 @@ melee_damage_lower = 50 melee_damage_upper = 50 - armor_penetration = 40 \ No newline at end of file + armor_penetration = 40 diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/_command_defines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/_command_defines.dm index 72ae6dc7ee7..3000499e896 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/_command_defines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/_command_defines.dm @@ -1,3 +1,3 @@ #define COMMANDED_STOP 6 //basically 'do nothing' #define COMMANDED_FOLLOW 7 //follows a target -#define COMMANDED_MISC 8 //catch all state for misc commands that need one. \ No newline at end of file +#define COMMANDED_MISC 8 //catch all state for misc commands that need one. diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm index fee752d5046..79b18fb7127 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/guard_dog.dm @@ -150,4 +150,4 @@ if(2) adjustFireLoss(rand(5, 10)) if(3) - adjustFireLoss(rand(3, 5)) \ No newline at end of file + adjustFireLoss(rand(3, 5)) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm index 9c1561da7d4..045766b63fe 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_beacon_projectiles.dm @@ -22,4 +22,4 @@ incinerate = 5 muzzle_type = /obj/effect/projectile/muzzle/laser/blue tracer_type = /obj/effect/projectile/tracer/laser/blue - impact_type = /obj/effect/projectile/impact/laser/blue \ No newline at end of file + impact_type = /obj/effect/projectile/impact/laser/blue diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester_projectiles.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester_projectiles.dm index c3e9f726725..23f0f53221e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester_projectiles.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_harvester_projectiles.dm @@ -1,4 +1,4 @@ /obj/item/projectile/beam/hivebot/incendiary/heavy name = "archaic mining laser" damage = 25 - incinerate = 10 \ No newline at end of file + incinerate = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_projectiles.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_projectiles.dm index 0d37f9b2df7..f8e46f09f9e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_projectiles.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/hivebot_projectiles.dm @@ -8,4 +8,4 @@ /obj/item/projectile/bullet/pistol/hivebotspike/needle name = "needle" damage = 5 - armor_penetration = 60 \ No newline at end of file + armor_penetration = 60 diff --git a/code/modules/mob/living/simple_animal/hostile/pra.dm b/code/modules/mob/living/simple_animal/hostile/pra.dm index 99f6498c2e2..298edd6903b 100644 --- a/code/modules/mob/living/simple_animal/hostile/pra.dm +++ b/code/modules/mob/living/simple_animal/hostile/pra.dm @@ -243,4 +243,4 @@ /mob/living/simple_animal/hostile/retaliate/pra_exploration_drone/LostTarget() say("Returning to data gathering.") - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index a636590d297..597614e8425 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -56,4 +56,4 @@ if(weapon1) new weapon1 (src.loc) qdel(src) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm index c8746256e8e..921ac9eca16 100644 --- a/code/modules/mob/living/simple_animal/hostile/spider_queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/spider_queen.dm @@ -116,4 +116,4 @@ if(M != src) M.apply_damage(50, DAMAGE_BRUTE) M.apply_effect(6, STUN, blocked) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 8fa350d7665..efd09155455 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -135,4 +135,4 @@ speed = 0 /mob/living/simple_animal/hostile/syndicate/ranged/space/Allow_Spacemove(var/check_drift = 0) - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 293d280dee5..d75c43d55ee 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -57,4 +57,4 @@ /mob/living/simple_animal/hostile/tree/death() ..(null,"is hacked into pieces!") new /obj/item/stack/material/wood(loc) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/living/simple_animal/mechanical/mechanical.dm b/code/modules/mob/living/simple_animal/mechanical/mechanical.dm index cbb61f6aa67..01dd6828c91 100644 --- a/code/modules/mob/living/simple_animal/mechanical/mechanical.dm +++ b/code/modules/mob/living/simple_animal/mechanical/mechanical.dm @@ -23,4 +23,4 @@ return FALSE /mob/living/simple_animal/mechanical/adjustOxyLoss(amount) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/modular_computers/_description.dm b/code/modules/modular_computers/_description.dm index a1557a4a9c5..7eefa135f34 100644 --- a/code/modules/modular_computers/_description.dm +++ b/code/modules/modular_computers/_description.dm @@ -128,4 +128,4 @@ With addition of various antag programs, IDS(Intrusion Detection System) will be If enabled, this system automatically detects any abnormality and triggers a warning that's visible on the NTNet status screen, as well as generating a security log. IDS can be disabled by simple on/off switch in the configuration. -*/ \ No newline at end of file +*/ diff --git a/code/modules/modular_computers/computers/subtypes/dev_pda.dm b/code/modules/modular_computers/computers/subtypes/dev_pda.dm index f92321059bb..b83d4e6da2c 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_pda.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_pda.dm @@ -30,4 +30,4 @@ icon = 'icons/obj/pda_slate.dmi' /obj/item/modular_computer/handheld/pda/smart - icon = 'icons/obj/pda_smart.dmi' \ No newline at end of file + icon = 'icons/obj/pda_smart.dmi' diff --git a/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm b/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm index 02c5f30486d..24552bf0cba 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_silicon_subtypes.dm @@ -26,4 +26,4 @@ . = ..() hard_drive.store_file(new /datum/computer_file/program/pai_directives(src)) hard_drive.store_file(new /datum/computer_file/program/pai_radio(src)) - hard_drive.store_file(new /datum/computer_file/program/pai_flashlight(src)) \ No newline at end of file + hard_drive.store_file(new /datum/computer_file/program/pai_flashlight(src)) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 4d1177b698f..af420b96d61 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -50,4 +50,4 @@ var/global/file_uid = 0 if(input_password == password) return TRUE else - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/modular_computers/file_system/data.dm b/code/modules/modular_computers/file_system/data.dm index 94905f1632c..121cd9ac3ef 100644 --- a/code/modules/modular_computers/file_system/data.dm +++ b/code/modules/modular_computers/file_system/data.dm @@ -16,4 +16,4 @@ size = max(1, round(length(stored_data) / block_size)) /datum/computer_file/data/logfile - filetype = "LOG" \ No newline at end of file + filetype = "LOG" diff --git a/code/modules/modular_computers/file_system/news_article.dm b/code/modules/modular_computers/file_system/news_article.dm index d04a90c0b63..7e41929b041 100644 --- a/code/modules/modular_computers/file_system/news_article.dm +++ b/code/modules/modular_computers/file_system/news_article.dm @@ -40,4 +40,4 @@ // /datum/computer_file/data/news_article/space/vol_five // filename = "SPACE Magazine vol. 5" // server_file_path = 'news_articles/space_magazine_5.html' -// archived = 0 \ No newline at end of file +// archived = 0 diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm deleted file mode 100644 index 129a07efe87..00000000000 --- a/code/modules/modular_computers/file_system/programs/app_presets.dm +++ /dev/null @@ -1,685 +0,0 @@ -/datum/modular_computer_app_presets - var/name = "default_preset" - var/display_name = "default preset" - var/description = "Description of the preset." - var/available = FALSE - -/datum/modular_computer_app_presets/proc/return_install_programs(var/obj/item/modular_computer/comp) - return list() - -/datum/modular_computer_app_presets/all - name = "all" - display_name = "All Programs" - description = "Contains all programs." - available = FALSE - -/datum/modular_computer_app_presets/all/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list() - for(var/F in typesof(/datum/computer_file/program)) - var/datum/computer_file/program/prog = new F(comp) - _prg_list += prog - return _prg_list - -/datum/modular_computer_app_presets/engineering - name = "engineering" - display_name = "Engineering" - description = "Contains the most common engineering programs." - available = TRUE - -/datum/modular_computer_app_presets/engineering/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/power_monitor(comp), - new /datum/computer_file/program/alarm_monitor/engineering(comp), - new /datum/computer_file/program/atmos_control(comp), - new /datum/computer_file/program/rcon_console(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/lighting_control(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/engineering/atmos - name = "atmos" - display_name = "Engineering - Atmospherics" - description = "Contains the most common engineering programs and atmospheric monitoring software." - available = TRUE - -/datum/modular_computer_app_presets/engineering/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/power_monitor(comp), - new /datum/computer_file/program/alarm_monitor/engineering(comp), - new /datum/computer_file/program/atmos_control(comp), - new /datum/computer_file/program/rcon_console(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/lighting_control(comp), - new /datum/computer_file/program/scanner/gas(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/engineering/ce - name = "engineering_head" - display_name = "Engineering - CE" - description = "Contains the most common engineering programs and command software." - available = FALSE - -/datum/modular_computer_app_presets/engineering/ce/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/power_monitor(comp), - new /datum/computer_file/program/alarm_monitor/engineering(comp), - new /datum/computer_file/program/atmos_control(comp), - new /datum/computer_file/program/rcon_console(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/lighting_control(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/scanner/gas(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/medical - name = "medical" - display_name = "Medical" - description = "Contains the most common medical programs." - available = TRUE - -/datum/modular_computer_app_presets/medical/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/suit_sensors(comp), - new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/chemistry_codex(comp), - new /datum/computer_file/program/scanner/medical(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/medical/cmo - name = "medical_head" - display_name = "Medical - CMO" - description = "Contains the most common medical programs and command software." - available = FALSE - -/datum/modular_computer_app_presets/medical/cmo/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/suit_sensors(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/chemistry_codex(comp), - new /datum/computer_file/program/scanner/medical(comp), - new /datum/computer_file/program/scanner/science(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/research - name = "research" - display_name = "Research" - description = "Contains the most common research programs." - available = TRUE - -/datum/modular_computer_app_presets/research/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/ntnetmonitor(comp), - new /datum/computer_file/program/aidiag(comp), - new /datum/computer_file/program/chemistry_codex(comp), - new /datum/computer_file/program/scanner/science(comp), - new /datum/computer_file/program/scanner/gas(comp), - new /datum/computer_file/program/away_manifest(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/research/rd - name = "research_head" - display_name = "Research - RD" - description = "Contains the most common research programs and command software." - available = FALSE - -/datum/modular_computer_app_presets/research/rd/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/ntnetmonitor(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/chemistry_codex(comp), - new /datum/computer_file/program/scanner/science(comp), - new /datum/computer_file/program/away_manifest(comp), - new /datum/computer_file/program/scanner/gas(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command - name = "command" - display_name = "Command" - description = "Contains the most common command programs." - available = TRUE - -/datum/modular_computer_app_presets/command/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/card_mod(comp), - new /datum/computer_file/program/comm(comp, TRUE), - new /datum/computer_file/program/docks(comp), - new /datum/computer_file/program/away_manifest(comp), - new /datum/computer_file/program/records/employment(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command/teleporter - name = "command_teleporter" - display_name = "Command - Teleporter" - description = "Contains the most common command programs and has a special teleporter control program loaded." - available = FALSE - -/datum/modular_computer_app_presets/command/teleporter/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/teleporter(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command/teleporter/ninja - name = "ninja_teleporter" - display_name = "Offsite - Teleporter" - description = "Contains the most common command programs and has a special teleporter control program loaded." - available = FALSE - -/datum/modular_computer_app_presets/command/teleporter/ninja/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/teleporter/ninja(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command/hop - name = "command_hop" - display_name = "Command - HoP" - description = "Contains the most common command programs." - available = FALSE - -/datum/modular_computer_app_presets/command/hop/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/cargocontrol(comp), - new /datum/computer_file/program/card_mod(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/docks(comp), - new /datum/computer_file/program/away_manifest(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/records/security(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command/captain - name = "captain" - display_name = "Captain" - description = "Contains the most important programs for the Captain." - available = FALSE - -/datum/modular_computer_app_presets/command/captain/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/card_mod(comp), - new /datum/computer_file/program/comm(comp, TRUE), - new /datum/computer_file/program/docks(comp), - new /datum/computer_file/program/away_manifest(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/digitalwarrant(comp), - new /datum/computer_file/program/penal_mechs(comp), - new /datum/computer_file/program/civilian/cargocontrol(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/alarm_monitor/all(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/records/security(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command/account - name = "command_accounting" - display_name = "Command - Accounting" - description = "Contains all the programs you would need to become a god-tier accountant." - available = FALSE - -/datum/modular_computer_app_presets/command/account/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/cargocontrol(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/account_db(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/command/account/centcomm/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/cargocontrol(comp), - new /datum/computer_file/program/records/employment(comp), - new /datum/computer_file/program/account_db(comp, TRUE) - ) - return _prg_list - -/datum/modular_computer_app_presets/security - name = "security" - display_name = "Security" - description = "Contains the most common security programs." - available = TRUE - -/datum/modular_computer_app_presets/security/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/alarm_monitor/security(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/digitalwarrant(comp), - new /datum/computer_file/program/penal_mechs(comp), - new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/guntracker(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/security/armory - name = "security_arm" - display_name = "Security - Armory" - description = "Contains the most common security and armory programs." - available = FALSE - -/datum/modular_computer_app_presets/security/armory/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/alarm_monitor/security(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/comm(comp), - new /datum/computer_file/program/digitalwarrant(comp), - new /datum/computer_file/program/penal_mechs(comp), - new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/guntracker(comp), - new /datum/computer_file/program/implant_tracker(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/security/investigations - name = "security_inv" - display_name = "Security - Investigations" - description = "Contains the most common security and forensics programs." - available = TRUE - -/datum/modular_computer_app_presets/security/investigations/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/alarm_monitor/security(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/digitalwarrant(comp), - new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/records/medical(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/security/hos - name = "security_head" - display_name = "Security - HoS" - description = "Contains the most common security programs and command software." - available = FALSE - -/datum/modular_computer_app_presets/security/hos/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/alarm_monitor/security(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/digitalwarrant(comp), - new /datum/computer_file/program/penal_mechs(comp), - new /datum/computer_file/program/records/security(comp), - new /datum/computer_file/program/records/employment(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/civilian - name = "service" - display_name = "Service" - description = "Contains the most common service programs." - available = TRUE - -/datum/modular_computer_app_presets/civilian/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/game/arcade(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/civilian/janitor - name = "janitor" - display_name = "Janitor" - description = "Contains programs for janitorial service." - available = TRUE - -/datum/modular_computer_app_presets/civilian/janitor/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/janitor(comp), - new /datum/computer_file/program/game/arcade(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/supply - name = "supply" - display_name = "Supply" - description = "Contains the most common cargo programs." - available = TRUE - -/datum/modular_computer_app_presets/supply/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargocontrol(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/cargodelivery(comp), - new /datum/computer_file/program/away_manifest(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/supply/om - name = "operations manager" - display_name = "Operations Manager" - description = "Contains the most common cargo programs as well as the OM's ones." - available = FALSE - -/datum/modular_computer_app_presets/supply/om/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargocontrol(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/civilian/cargodelivery(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/docks(comp), - new /datum/computer_file/program/away_manifest(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/cargo_delivery - name = "cargo_delivery" - display_name = "Cargo Delivery" - description = "Contains the Delivery App." - available = FALSE - -/datum/modular_computer_app_presets/cargo_delivery/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargodelivery(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/supply/machinist - name = "operations_machinist" - display_name = "Operations - Machinist" - description = "Contains the most common supply programs and medical record software." - available = TRUE - -/datum/modular_computer_app_presets/supply/machinist/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/aidiag(comp), - new /datum/computer_file/program/records/medical(comp), - new /datum/computer_file/program/scanner/science(comp), - new /datum/computer_file/program/scanner/gas(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/representative - name = "representative" - display_name = "Representative" - description = "Contains software intended for representatives." - available = FALSE - -/datum/modular_computer_app_presets/representative/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/records/employment(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/wall_generic - name = "wallgeneric" - display_name = "Wall - Generic" - description = "A generic preset for the wall console." - available = FALSE - -/datum/modular_computer_app_presets/wall_generic/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/civilian/cargoorder(comp), - new /datum/computer_file/program/camera_monitor(comp), - new /datum/computer_file/program/alarm_monitor/engineering(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/merc - name = "merc" - display_name = "Mercenary" - description = "Preset for the Merc Console." - available = FALSE - -/datum/modular_computer_app_presets/merc/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/camera_monitor/hacked(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/ert - name = "ert" - display_name = "EmergencyResposeTeam" - description = "Preset for the ERT Console." - available = FALSE - -/datum/modular_computer_app_presets/ert/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/ntnetdownload(comp), - new /datum/computer_file/program/camera_monitor/hacked(comp), - new /datum/computer_file/program/comm(comp, FALSE), - new /datum/computer_file/program/suit_sensors(comp), - new /datum/computer_file/program/alarm_monitor/all(comp), - new /datum/computer_file/program/lighting_control(comp), - new /datum/computer_file/program/aidiag(comp), - new /datum/computer_file/program/records(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/trashcompactor - name = "trashcompactor" - display_name = "Trash Compactor" - description = "A preset for the Trash Compactor Wall Console." - available = FALSE - -/datum/modular_computer_app_presets/trashcompactor/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/crushercontrol(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/merchant - name = "merchant" - display_name = "Merchant" - description = "A preset for the merchant console." - available = FALSE - -/datum/modular_computer_app_presets/merchant/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/merchant(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/merchant/nka/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/merchant/nka(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/merchant/guild/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/merchant/guild(comp) - ) - return _prg_list - - -/datum/modular_computer_app_presets/merchant/golden_deep/return_install_programs(obj/item/modular_computer/comp) - var/list/_prg_list = list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/manifest(comp), - new /datum/computer_file/program/newsbrowser(comp), - new /datum/computer_file/program/chat_client(comp), - new /datum/computer_file/program/merchant/golden_deep(comp) - ) - return _prg_list - -/datum/modular_computer_app_presets/ai - name = "ai" - display_name = "AI" - description = "A preset for the AI consoles." - available = FALSE - -/datum/modular_computer_app_presets/ai/return_install_programs(obj/item/modular_computer/comp) - return list( - new /datum/computer_file/program/filemanager(comp), - new /datum/computer_file/program/ntnetdownload(comp) - ) diff --git a/code/modules/modular_computers/file_system/programs/app_presets_.dm b/code/modules/modular_computers/file_system/programs/app_presets_.dm new file mode 100644 index 00000000000..a05754061d9 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/app_presets_.dm @@ -0,0 +1,68 @@ +/datum/modular_computer_app_presets + var/name = "default_preset" + var/display_name = "default preset" + var/description = "Description of the preset." + var/available = FALSE + +/datum/modular_computer_app_presets/proc/return_install_programs(var/obj/item/modular_computer/comp) + return list() + +/datum/modular_computer_app_presets/all + name = "all" + display_name = "All Programs" + description = "Contains all programs." + available = FALSE + +/datum/modular_computer_app_presets/all/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list() + for(var/F in typesof(/datum/computer_file/program)) + var/datum/computer_file/program/prog = new F(comp) + _prg_list += prog + return flatten_list(_prg_list) + +#define COMPUTER_APP_PRESET_SYSTEM list(\ + new /datum/computer_file/program/ntnetdownload(comp),\ + new /datum/computer_file/program/filemanager(comp),\ +) + +#define COMPUTER_APP_PRESET_HORIZON_CIVILIAN list(\ + new /datum/computer_file/program/newsbrowser(comp),\ + new /datum/computer_file/program/manifest(comp),\ + new /datum/computer_file/program/chat_client(comp),\ + new /datum/computer_file/program/civilian/cargoorder(comp),\ + new /datum/computer_file/program/map(comp),\ +) + +#define COMPUTER_APP_PRESET_HORIZON_ENGINEERING list(\ + new /datum/computer_file/program/power_monitor(comp),\ + new /datum/computer_file/program/alarm_monitor/engineering(comp),\ + new /datum/computer_file/program/atmos_control(comp),\ + new /datum/computer_file/program/rcon_console(comp),\ + new /datum/computer_file/program/camera_monitor(comp),\ + new /datum/computer_file/program/lighting_control(comp)\ +) + +#define COMPUTER_APP_PRESET_HORIZON_MEDICAL list(\ + new /datum/computer_file/program/suit_sensors(comp),\ + new /datum/computer_file/program/records/medical(comp),\ + new /datum/computer_file/program/chemistry_codex(comp),\ + new /datum/computer_file/program/scanner/medical(comp),\ +) + +#define COMPUTER_APP_PRESET_HORIZON_RESEARCH list(\ + new /datum/computer_file/program/ntnetmonitor(comp),\ + new /datum/computer_file/program/aidiag(comp),\ + new /datum/computer_file/program/chemistry_codex(comp),\ + new /datum/computer_file/program/scanner/science(comp),\ + new /datum/computer_file/program/scanner/gas(comp),\ + new /datum/computer_file/program/away_manifest(comp),\ +) + +#define COMPUTER_APP_PRESET_HORIZON_SECURITY list(\ + new /datum/computer_file/program/alarm_monitor/security(comp),\ + new /datum/computer_file/program/camera_monitor(comp),\ + new /datum/computer_file/program/digitalwarrant(comp),\ + new /datum/computer_file/program/penal_mechs(comp),\ + new /datum/computer_file/program/records/security(comp),\ + new /datum/computer_file/program/guntracker(comp),\ +) diff --git a/code/modules/modular_computers/file_system/programs/app_presets_antag.dm b/code/modules/modular_computers/file_system/programs/app_presets_antag.dm new file mode 100644 index 00000000000..7e5c2feb5f7 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/app_presets_antag.dm @@ -0,0 +1,50 @@ + +/datum/modular_computer_app_presets/command/teleporter/ninja + name = "ninja_teleporter" + display_name = "Offsite - Teleporter" + description = "Contains the most common command programs and has a special teleporter control program loaded." + available = FALSE + +/datum/modular_computer_app_presets/command/teleporter/ninja/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/teleporter/ninja(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/merc + name = "merc" + display_name = "Mercenary" + description = "Preset for the Merc Console." + available = FALSE + +/datum/modular_computer_app_presets/merc/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/camera_monitor/hacked(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/ert + name = "ert" + display_name = "EmergencyResposeTeam" + description = "Preset for the ERT Console." + available = FALSE + +/datum/modular_computer_app_presets/ert/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + new /datum/computer_file/program/camera_monitor/hacked(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/suit_sensors(comp), + new /datum/computer_file/program/alarm_monitor/all(comp), + new /datum/computer_file/program/lighting_control(comp), + new /datum/computer_file/program/aidiag(comp), + new /datum/computer_file/program/records(comp) + ) + return flatten_list(_prg_list) diff --git a/code/modules/modular_computers/file_system/programs/app_presets_crew.dm b/code/modules/modular_computers/file_system/programs/app_presets_crew.dm new file mode 100644 index 00000000000..d797f06f838 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/app_presets_crew.dm @@ -0,0 +1,328 @@ + +/datum/modular_computer_app_presets/engineering + name = "engineering" + display_name = "Engineering" + description = "Contains the most common engineering programs." + available = TRUE + +/datum/modular_computer_app_presets/engineering/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_ENGINEERING, + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/engineering/atmos + name = "atmos" + display_name = "Engineering - Atmospherics" + description = "Contains the most common engineering programs and atmospheric monitoring software." + available = TRUE + +/datum/modular_computer_app_presets/engineering/atmos/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_ENGINEERING, + new /datum/computer_file/program/scanner/gas(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/engineering/ce + name = "engineering_head" + display_name = "Engineering - CE" + description = "Contains the most common engineering programs and command software." + available = FALSE + +/datum/modular_computer_app_presets/engineering/ce/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_ENGINEERING, + new /datum/computer_file/program/scanner/gas(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/medical + name = "medical" + display_name = "Medical" + description = "Contains the most common medical programs." + available = TRUE + +/datum/modular_computer_app_presets/medical/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_MEDICAL, + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/medical/cmo + name = "medical_head" + display_name = "Medical - CMO" + description = "Contains the most common medical programs and command software." + available = FALSE + +/datum/modular_computer_app_presets/medical/cmo/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_MEDICAL, + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/scanner/science(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/research + name = "research" + display_name = "Research" + description = "Contains the most common research programs." + available = TRUE + +/datum/modular_computer_app_presets/research/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_RESEARCH, + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/research/rd + name = "research_head" + display_name = "Research - RD" + description = "Contains the most common research programs and command software." + available = FALSE + +/datum/modular_computer_app_presets/research/rd/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_RESEARCH, + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/command + name = "command" + display_name = "Command" + description = "Contains the most common command programs." + available = TRUE + +/datum/modular_computer_app_presets/command/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/card_mod(comp), + new /datum/computer_file/program/comm(comp, TRUE), + new /datum/computer_file/program/docks(comp), + new /datum/computer_file/program/away_manifest(comp), + new /datum/computer_file/program/records/employment(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/command/hop + name = "command_hop" + display_name = "Command - HoP" + description = "Contains the most common command programs." + available = FALSE + +/datum/modular_computer_app_presets/command/hop/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/card_mod(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/docks(comp), + new /datum/computer_file/program/away_manifest(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/records/security(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/command/captain + name = "captain" + display_name = "Captain" + description = "Contains the most important programs for the Captain." + available = FALSE + +/datum/modular_computer_app_presets/command/captain/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/card_mod(comp), + new /datum/computer_file/program/comm(comp, TRUE), + new /datum/computer_file/program/docks(comp), + new /datum/computer_file/program/away_manifest(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/digitalwarrant(comp), + new /datum/computer_file/program/penal_mechs(comp), + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/alarm_monitor/all(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/records/medical(comp), + new /datum/computer_file/program/records/security(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/security + name = "security" + display_name = "Security" + description = "Contains the most common security programs." + available = TRUE + +/datum/modular_computer_app_presets/security/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_SECURITY, + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/security/armory + name = "security_arm" + display_name = "Security - Armory" + description = "Contains the most common security and armory programs." + available = FALSE + +/datum/modular_computer_app_presets/security/armory/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_SECURITY, + new /datum/computer_file/program/implant_tracker(comp), + new /datum/computer_file/program/comm(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/security/investigations + name = "security_inv" + display_name = "Security - Investigations" + description = "Contains the most common security and forensics programs." + available = TRUE + +/datum/modular_computer_app_presets/security/investigations/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/alarm_monitor/security(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/digitalwarrant(comp), + new /datum/computer_file/program/records/security(comp), + new /datum/computer_file/program/records/medical(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/security/hos + name = "security_head" + display_name = "Security - HoS" + description = "Contains the most common security programs and command software." + available = FALSE + +/datum/modular_computer_app_presets/security/hos/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + COMPUTER_APP_PRESET_HORIZON_SECURITY, + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/civilian + name = "service" + display_name = "Service" + description = "Contains the most common service programs." + available = TRUE + +/datum/modular_computer_app_presets/civilian/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/game/arcade(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/civilian/janitor + name = "janitor" + display_name = "Janitor" + description = "Contains programs for janitorial service." + available = TRUE + +/datum/modular_computer_app_presets/civilian/janitor/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/civilian/janitor(comp), + new /datum/computer_file/program/game/arcade(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/supply + name = "supply" + display_name = "Supply" + description = "Contains the most common cargo programs." + available = TRUE + +/datum/modular_computer_app_presets/supply/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/civilian/cargodelivery(comp), + new /datum/computer_file/program/away_manifest(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/supply/om + name = "operations manager" + display_name = "Operations Manager" + description = "Contains the most common cargo programs as well as the OM's ones." + available = FALSE + +/datum/modular_computer_app_presets/supply/om/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/civilian/cargodelivery(comp), + new /datum/computer_file/program/away_manifest(comp), + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/docks(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/supply/machinist + name = "operations_machinist" + display_name = "Operations - Machinist" + description = "Contains the most common supply programs and medical record software." + available = TRUE + +/datum/modular_computer_app_presets/supply/machinist/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/aidiag(comp), + new /datum/computer_file/program/records/medical(comp), + new /datum/computer_file/program/scanner/science(comp), + new /datum/computer_file/program/scanner/gas(comp), + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/representative + name = "representative" + display_name = "Representative" + description = "Contains software intended for representatives." + available = FALSE + +/datum/modular_computer_app_presets/representative/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/records/employment(comp), + ) + return flatten_list(_prg_list) diff --git a/code/modules/modular_computers/file_system/programs/app_presets_equipment.dm b/code/modules/modular_computers/file_system/programs/app_presets_equipment.dm new file mode 100644 index 00000000000..18219cd32a1 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/app_presets_equipment.dm @@ -0,0 +1,100 @@ + +/datum/modular_computer_app_presets/wall_generic + name = "wallgeneric" + display_name = "Wall - Generic" + description = "A generic preset for the wall console." + available = FALSE + +/datum/modular_computer_app_presets/wall_generic/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/chat_client(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/camera_monitor(comp), + new /datum/computer_file/program/alarm_monitor/engineering(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/ai + name = "ai" + display_name = "AI" + description = "A preset for the AI consoles." + available = FALSE + +/datum/modular_computer_app_presets/ai/return_install_programs(obj/item/modular_computer/comp) + return list( + COMPUTER_APP_PRESET_SYSTEM, + ) + +/datum/modular_computer_app_presets/command/teleporter + name = "command_teleporter" + display_name = "Command - Teleporter" + description = "Contains the most common command programs and has a special teleporter control program loaded." + available = FALSE + +/datum/modular_computer_app_presets/command/teleporter/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/comm(comp, FALSE), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/teleporter(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/command/account + name = "command_accounting" + display_name = "Command - Accounting" + description = "Contains all the programs you would need to become a god-tier accountant." + available = FALSE + +/datum/modular_computer_app_presets/command/account/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/account_db(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/command/account/centcomm/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/civilian/cargoorder(comp), + new /datum/computer_file/program/civilian/cargocontrol(comp), + new /datum/computer_file/program/records/employment(comp), + new /datum/computer_file/program/account_db(comp, TRUE) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/trashcompactor + name = "trashcompactor" + display_name = "Trash Compactor" + description = "A preset for the Trash Compactor Wall Console." + available = FALSE + +/datum/modular_computer_app_presets/trashcompactor/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + new /datum/computer_file/program/crushercontrol(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/cargo_delivery + name = "cargo_delivery" + display_name = "Cargo Delivery" + description = "Contains the Delivery App." + available = FALSE + +/datum/modular_computer_app_presets/cargo_delivery/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + COMPUTER_APP_PRESET_SYSTEM, + COMPUTER_APP_PRESET_HORIZON_CIVILIAN, + new /datum/computer_file/program/civilian/cargodelivery(comp) + ) + return flatten_list(_prg_list) diff --git a/code/modules/modular_computers/file_system/programs/app_presets_third_party.dm b/code/modules/modular_computers/file_system/programs/app_presets_third_party.dm new file mode 100644 index 00000000000..305183e3f07 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/app_presets_third_party.dm @@ -0,0 +1,47 @@ + +/datum/modular_computer_app_presets/merchant + name = "merchant" + display_name = "Merchant" + description = "A preset for the merchant console." + available = FALSE + +/datum/modular_computer_app_presets/merchant/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/chat_client(comp), + new /datum/computer_file/program/merchant(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/merchant/nka/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/chat_client(comp), + new /datum/computer_file/program/merchant/nka(comp) + ) + return flatten_list(_prg_list) + +/datum/modular_computer_app_presets/merchant/guild/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/chat_client(comp), + new /datum/computer_file/program/merchant/guild(comp) + ) + return flatten_list(_prg_list) + + +/datum/modular_computer_app_presets/merchant/golden_deep/return_install_programs(obj/item/modular_computer/comp) + var/list/_prg_list = list( + new /datum/computer_file/program/filemanager(comp), + new /datum/computer_file/program/manifest(comp), + new /datum/computer_file/program/newsbrowser(comp), + new /datum/computer_file/program/chat_client(comp), + new /datum/computer_file/program/merchant/golden_deep(comp) + ) + return flatten_list(_prg_list) diff --git a/code/modules/modular_computers/file_system/programs/generic/map.dm b/code/modules/modular_computers/file_system/programs/generic/map.dm new file mode 100644 index 00000000000..1f301858fec --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/generic/map.dm @@ -0,0 +1,55 @@ +/datum/computer_file/program/map + filename = "map" + filedesc = "Map Program" + extended_desc = "This program may be used to see the decks or levels of the vessel, station, or ship." + program_icon_state = "map" + program_key_icon_state = "lightblue_key" + color = LIGHT_COLOR_BLUE + size = 4 + requires_ntnet = TRUE + available_on_ntnet = TRUE + tgui_id = "Map" + + /// If zero/null, show the z-level of the user, otherwise show `z_override` z-level. + var/z_override = 0 + +/datum/computer_file/program/map/ui_data(mob/user) + var/list/data = list() + + // Gather data for computer header + var/headerdata = get_header_data(data["_PC"]) + if(headerdata) + data["_PC"] = headerdata + . = data + + var/z_level = z_override ? z_override : user.z + if(z_level in current_map.station_levels) + data["map_image"] = SSholomap.minimaps_area_colored_base64[z_level] + + data["user_x"] = user.x + data["user_y"] = user.y + data["user_z"] = user.z + data["station_levels"] = current_map.station_levels + data["z_override"] = z_override + + data["dept_colors_map"] = list( + list("d"="Command", "c"=HOLOMAP_AREACOLOR_COMMAND), + list("d"="Security", "c"=HOLOMAP_AREACOLOR_SECURITY), + list("d"="Medical", "c"=HOLOMAP_AREACOLOR_MEDICAL), + list("d"="Science", "c"=HOLOMAP_AREACOLOR_SCIENCE), + list("d"="Engineering", "c"=HOLOMAP_AREACOLOR_ENGINEERING), + list("d"="Operations", "c"=HOLOMAP_AREACOLOR_OPERATIONS), + list("d"="Civilian", "c"=HOLOMAP_AREACOLOR_CIVILIAN), + list("d"="Hallways", "c"=HOLOMAP_AREACOLOR_HALLWAYS), + list("d"="Dock", "c"=HOLOMAP_AREACOLOR_DOCK), + list("d"="Hangar", "c"=HOLOMAP_AREACOLOR_HANGAR), + ) + + return data + +/datum/computer_file/program/map/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + if(action == "z_override") + z_override = text2num(params["z_override"]) diff --git a/code/modules/modular_computers/file_system/programs/pai/access_lock.dm b/code/modules/modular_computers/file_system/programs/pai/access_lock.dm index 07c39de6238..948c88a2c03 100644 --- a/code/modules/modular_computers/file_system/programs/pai/access_lock.dm +++ b/code/modules/modular_computers/file_system/programs/pai/access_lock.dm @@ -25,4 +25,4 @@ /datum/computer_file/program/pai_access_lock/program_hidden() if(!computer.personal_ai) return TRUE - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/modular_computers/file_system/script.dm b/code/modules/modular_computers/file_system/script.dm index 6e766bd2105..94f4db9f806 100644 --- a/code/modules/modular_computers/file_system/script.dm +++ b/code/modules/modular_computers/file_system/script.dm @@ -11,4 +11,4 @@ return temp /datum/computer_file/script/proc/calculate_size() - size = max(1, round(length(code) / block_size)) \ No newline at end of file + size = max(1, round(length(code) / block_size)) diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index f1f2c1e116d..063f9da5bd2 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -39,4 +39,4 @@ if(stored_card) stored_card.forceMove(get_turf(parent_computer)) parent_computer = null - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index d13bfcc9c2a..71b0cacf059 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -80,4 +80,4 @@ battery.charge = battery.maxcharge /obj/item/computer_hardware/battery_module/get_cell() - return battery \ No newline at end of file + return battery diff --git a/code/modules/modular_computers/hardware/hardware.dm b/code/modules/modular_computers/hardware/hardware.dm index 173f3f30bcd..ef391d8dfc0 100644 --- a/code/modules/modular_computers/hardware/hardware.dm +++ b/code/modules/modular_computers/hardware/hardware.dm @@ -96,4 +96,4 @@ // Damages the component. Contains necessary checks. Negative damage "heals" the component. /obj/item/computer_hardware/proc/take_damage(var/amount) damage += round(amount) // We want nice rounded numbers here. - damage = between(0, damage, max_damage) // Clamp the value. \ No newline at end of file + damage = between(0, damage, max_damage) // Clamp the value. diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index c82548df640..91be2ea1fec 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -46,4 +46,4 @@ if(parent_computer?.nano_printer == src) parent_computer.nano_printer = null parent_computer = null - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index 3d71f78c6c8..53f39ad5829 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -109,4 +109,4 @@ var/global/ntnet_card_uid = 1 if(parent_computer?.network_card == src) parent_computer.network_card = null parent_computer = null - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm index 1d5df0d16c4..fcd2912d9fa 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -29,4 +29,4 @@ /obj/item/computer_hardware/hard_drive/portable/New() ..() stored_files = list() - recalculate_size() \ No newline at end of file + recalculate_size() diff --git a/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm b/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm index 96ee9174a1f..fee49b6f236 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive_presets.dm @@ -48,4 +48,4 @@ continue // Check whether the program should be available for station/antag download, if yes, add it to lists. if(prog.available_on_ntnet) - new /obj/item/computer_hardware/hard_drive/portable/backup(src, prog.filename) \ No newline at end of file + new /obj/item/computer_hardware/hard_drive/portable/backup(src, prog.filename) diff --git a/code/modules/modular_computers/hardware/processor_unit.dm b/code/modules/modular_computers/hardware/processor_unit.dm index 6c30c10c665..0b947884920 100644 --- a/code/modules/modular_computers/hardware/processor_unit.dm +++ b/code/modules/modular_computers/hardware/processor_unit.dm @@ -46,4 +46,4 @@ hardware_size = 1 power_usage = 75 max_idle_programs = 3 - origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) \ No newline at end of file + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) diff --git a/code/modules/ntsl2/guide.dm b/code/modules/ntsl2/guide.dm index fe065920d04..7e65abcdac7 100644 --- a/code/modules/ntsl2/guide.dm +++ b/code/modules/ntsl2/guide.dm @@ -4,4 +4,4 @@ item_state ="book3" author = "Collaborative author group" title = "Guide to NTSL2++" - sub_page = "Guide_to_NTSL2%2B%2B" \ No newline at end of file + sub_page = "Guide_to_NTSL2%2B%2B" diff --git a/code/modules/organs/internal/species/diona.dm b/code/modules/organs/internal/species/diona.dm index fe92a8090fb..7b60237f5bf 100644 --- a/code/modules/organs/internal/species/diona.dm +++ b/code/modules/organs/internal/species/diona.dm @@ -57,4 +57,4 @@ /obj/item/organ/internal/stomach/diona name = "digestion cavity" - should_process_alcohol = FALSE \ No newline at end of file + should_process_alcohol = FALSE diff --git a/code/modules/organs/internal/species/unathi.dm b/code/modules/organs/internal/species/unathi.dm index cf22388ce3a..2d5f17d9249 100644 --- a/code/modules/organs/internal/species/unathi.dm +++ b/code/modules/organs/internal/species/unathi.dm @@ -25,4 +25,4 @@ /obj/item/organ/internal/eyes/unathi name = "reptilian eyes" desc = "A pair of reptilian eyes. The pupil is slit and never dialating; you can almost feel it staring at you." - icon = 'icons/obj/organs/unathi_organs.dmi' \ No newline at end of file + icon = 'icons/obj/organs/unathi_organs.dmi' diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index b08fbab1b5f..11149c42199 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -153,4 +153,4 @@ var/global/datum/robolimb/basic_robolimb desc = "This limb design is from old Sedantis, still manufactured by the Hives when providing maintenace to most of the basic Vaurcesian bioforms." icon = 'icons/mob/human_races/vaurca/r_vaurcalimbs.dmi' species_can_use = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR) - allows_internal = FALSE \ No newline at end of file + allows_internal = FALSE diff --git a/code/modules/organs/subtypes/parasite.dm b/code/modules/organs/subtypes/parasite.dm index 9d7f00d728d..9cedb4dce6e 100644 --- a/code/modules/organs/subtypes/parasite.dm +++ b/code/modules/organs/subtypes/parasite.dm @@ -77,7 +77,7 @@ /obj/item/organ/internal/parasite/kois name = "k'ois mycosis" - icon = 'icons/obj/surgery.dmi' + icon = 'icons/obj/organs/organs.dmi' icon_state = "kois-on" dead_icon = "kois-off" @@ -149,7 +149,7 @@ /obj/item/organ/internal/parasite/blackkois name = "k'ois mycosis" - icon = 'icons/obj/surgery.dmi' + icon = 'icons/obj/organs/organs.dmi' icon_state = "black-on" dead_icon = "black-off" subtle = 1 diff --git a/code/modules/organs/subtypes/tajara.dm b/code/modules/organs/subtypes/tajara.dm index 0d856e99af2..dd898f99c75 100644 --- a/code/modules/organs/subtypes/tajara.dm +++ b/code/modules/organs/subtypes/tajara.dm @@ -54,4 +54,4 @@ /obj/item/organ/external/hand/right/tesla_body dislocated = -1 encased = "support frame" - robotize_type = PROSTHETIC_TESLA_BODY \ No newline at end of file + robotize_type = PROSTHETIC_TESLA_BODY diff --git a/code/modules/organs/subtypes/techno_golem.dm b/code/modules/organs/subtypes/techno_golem.dm index 75ffaa648c3..2901fa0d7e2 100644 --- a/code/modules/organs/subtypes/techno_golem.dm +++ b/code/modules/organs/subtypes/techno_golem.dm @@ -31,4 +31,4 @@ min_broken_damage = 125 amputation_point = "locomotion joint" joint = "locomotor" - gendered_icon = FALSE \ No newline at end of file + gendered_icon = FALSE diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm index 9fc70fb376d..d061eb9bd19 100644 --- a/code/modules/organs/subtypes/unbreakable.dm +++ b/code/modules/organs/subtypes/unbreakable.dm @@ -46,4 +46,4 @@ /obj/item/organ/external/head/unbreakable/revenant/get_additional_images(var/mob/living/carbon/human/H) var/image/return_image = image(H.species.eyes_icons, H, "[H.species.eyes]_glow", EFFECTS_ABOVE_LIGHTING_LAYER) return_image.appearance_flags = KEEP_APART - return list(return_image) \ No newline at end of file + return list(return_image) diff --git a/code/modules/overmap/exoplanets/decor/objs/monolith.dm b/code/modules/overmap/exoplanets/decor/objs/monolith.dm index 075a9af8efa..fe50b81fa05 100644 --- a/code/modules/overmap/exoplanets/decor/objs/monolith.dm +++ b/code/modules/overmap/exoplanets/decor/objs/monolith.dm @@ -29,4 +29,4 @@ var/turf/simulated/floor/exoplanet/T = get_turf(src) if(istype(T)) var/image/I = overlay_image(icon, "dugin", T.dirt_color, RESET_COLOR) - add_overlay(I) \ No newline at end of file + add_overlay(I) diff --git a/code/modules/overmap/ship_weaponry/weaponry/blaster.dm b/code/modules/overmap/ship_weaponry/weaponry/blaster.dm index fc4b22f5071..be0439ac576 100644 --- a/code/modules/overmap/ship_weaponry/weaponry/blaster.dm +++ b/code/modules/overmap/ship_weaponry/weaponry/blaster.dm @@ -37,4 +37,4 @@ explosion(target, 2, 5, 7) /obj/machinery/ammunition_loader/blaster - name = "mining blaster loader" \ No newline at end of file + name = "mining blaster loader" diff --git a/code/modules/overmap/ship_weaponry/weaponry/longbow.dm b/code/modules/overmap/ship_weaponry/weaponry/longbow.dm index d41521ac0ac..d4284dec003 100644 --- a/code/modules/overmap/ship_weaponry/weaponry/longbow.dm +++ b/code/modules/overmap/ship_weaponry/weaponry/longbow.dm @@ -49,4 +49,4 @@ target.ex_act(1) if(!QDELING(target) && target.density) qdel(target) - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index d54a2e2d77a..192750cd5dc 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -231,4 +231,4 @@ R.stamped = new R.stamped += /obj/item/stamp R.overlays += stampoverlay - R.stamps += "
This paper has been stamped as \"TOP SECRET\"." \ No newline at end of file + R.stamps += "
This paper has been stamped as \"TOP SECRET\"." diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 5537b24144b..793f77f0685 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1158,6 +1158,7 @@ data["power_cell_charge"] = cell?.percent() data["fail_time"] = failure_timer * 2 data["silicon_user"] = isAdmin || issilicon(user) + data["is_AI"] = isAI(user) data["total_load"] = round(lastused_total) data["total_charging"] = round(lastused_charging) data["is_operating"] = operating diff --git a/code/modules/power/profiling.dm b/code/modules/power/profiling.dm index 3eacfe71f2d..4df8590b494 100644 --- a/code/modules/power/profiling.dm +++ b/code/modules/power/profiling.dm @@ -68,4 +68,4 @@ var/global/list/power_update_requests_by_area = list() to_chat(usr, "Total profiling time: [power_profiled_time] ticks") to_chat(usr, "Total profiling time: [power_profiled_time] ticks") for (var/A in power_update_requests_by_area) - to_chat(usr, "[A] = [power_update_requests_by_area[A]]") \ No newline at end of file + to_chat(usr, "[A] = [power_update_requests_by_area[A]]") diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 1d733fdcda2..6dda3247f5c 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -114,4 +114,4 @@ build_path = /obj/machinery/power/grounding_rod origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) req_components = list("/obj/item/stock_parts/capacitor" = 1) - board_type = "machine" \ No newline at end of file + board_type = "machine" diff --git a/code/modules/projectiles/guns/energy/freezeray.dm b/code/modules/projectiles/guns/energy/freezeray.dm index d1461de8234..c2f7045bd19 100644 --- a/code/modules/projectiles/guns/energy/freezeray.dm +++ b/code/modules/projectiles/guns/energy/freezeray.dm @@ -17,4 +17,4 @@ firemodes = list( list(mode_name="freeze", projectile_type= /obj/item/projectile/beam/freezer, fire_sound='sound/weapons/pulse3.ogg'), list(mode_name="ice bolt", projectile_type= /obj/item/projectile/ice, fire_sound='sound/weapons/crossbow.ogg') - ) \ No newline at end of file + ) diff --git a/code/modules/projectiles/guns/energy/magic.dm b/code/modules/projectiles/guns/energy/magic.dm index 6cf02be9b2f..2800ac60e53 100644 --- a/code/modules/projectiles/guns/energy/magic.dm +++ b/code/modules/projectiles/guns/energy/magic.dm @@ -33,4 +33,4 @@ return 1 /obj/item/gun/energy/wand/toy - origin_tech = null \ No newline at end of file + origin_tech = null diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index c61a86cae6c..49c9001fc80 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -25,4 +25,4 @@ if (..()) return 1 usr.set_machine(src) - src.add_fingerprint(usr) \ No newline at end of file + src.add_fingerprint(usr) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index e4ea744a3ed..63f9a412528 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -327,4 +327,4 @@ name = "bone dart" damage = 10 armor_penetration = 10 - check_armor = "bullet" \ No newline at end of file + check_armor = "bullet" diff --git a/code/modules/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm index 92eff7b2ced..04ac37226c7 100644 --- a/code/modules/projectiles/targeting/targeting_client.dm +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -9,4 +9,4 @@ if(!mob) return 1 // Runtime prevention on N00k agents spawning with SMG screen -= mob.item_use_icon screen -= mob.gun_move_icon - screen -= mob.radio_use_icon \ No newline at end of file + screen -= mob.radio_use_icon diff --git a/code/modules/projectiles/targeting/targeting_gun.dm b/code/modules/projectiles/targeting/targeting_gun.dm index 998b1225e78..fdba7f64243 100644 --- a/code/modules/projectiles/targeting/targeting_gun.dm +++ b/code/modules/projectiles/targeting/targeting_gun.dm @@ -18,4 +18,4 @@ if(ismob(A) && user.aiming) user.aiming.aim_at(A, src) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index adf3bf0b1ef..37b62525e80 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -42,4 +42,4 @@ name = "psychokinetic [emulating]" icon_state = emulating to_chat(owner, SPAN_NOTICE("You begin emulating \a [emulating].")) - playsound(get_turf(src), 'sound/effects/psi/power_fabrication.ogg', 40, TRUE) \ No newline at end of file + playsound(get_turf(src), 'sound/effects/psi/power_fabrication.ogg', 40, TRUE) diff --git a/code/modules/random_map/building/building.dm b/code/modules/random_map/building/building.dm index 98a157c4599..fdaee1ceb6c 100644 --- a/code/modules/random_map/building/building.dm +++ b/code/modules/random_map/building/building.dm @@ -52,4 +52,4 @@ possible_doors -= placing_door target_map.map[placing_door] = DOOR_CHAR - return \ No newline at end of file + return diff --git a/code/modules/random_map/mazes/maze_cell.dm b/code/modules/random_map/mazes/maze_cell.dm index 0b4fa1ac869..6235adcc8af 100644 --- a/code/modules/random_map/mazes/maze_cell.dm +++ b/code/modules/random_map/mazes/maze_cell.dm @@ -15,4 +15,4 @@ var/maze_cell_count = 0 x = nx y = ny ox = nox - oy = noy \ No newline at end of file + oy = noy diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 3ab34c9ab8c..3ef220470ce 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -215,4 +215,4 @@ /singleton/reagent/fuel/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) if(istype(O, /obj/structure/bonfire)) var/obj/structure/bonfire/B = O - B.fuel = max(0, B.fuel + (15 * amount)) \ No newline at end of file + B.fuel = max(0, B.fuel + (15 * amount)) diff --git a/code/modules/reagents/dispenser/cartridge_spawn.dm b/code/modules/reagents/dispenser/cartridge_spawn.dm index b66d461e87d..24312492a72 100644 --- a/code/modules/reagents/dispenser/cartridge_spawn.dm +++ b/code/modules/reagents/dispenser/cartridge_spawn.dm @@ -30,4 +30,4 @@ C.reagents.add_reagent(reagent, C.volume) var/singleton/reagent/R = GET_SINGLETON(reagent) C.setLabel(R.name) - log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr)) \ No newline at end of file + log_admin("[key_name(usr)] spawned a [size] reagent container containing [reagent] at ([usr.x],[usr.y],[usr.z])",admin_key=key_name(usr)) diff --git a/code/modules/reagents/dispenser/coffeebeans.dm b/code/modules/reagents/dispenser/coffeebeans.dm index 1a21998ed23..074bdb2044c 100644 --- a/code/modules/reagents/dispenser/coffeebeans.dm +++ b/code/modules/reagents/dispenser/coffeebeans.dm @@ -12,4 +12,4 @@ possible_transfer_amounts = list(20, 40) unacidable = 1 - spawn_reagent = /singleton/reagent/drink/coffee/espresso \ No newline at end of file + spawn_reagent = /singleton/reagent/drink/coffee/espresso diff --git a/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm b/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm index 70fbf4dea95..b24769e7efc 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/cultural/human.dm @@ -396,4 +396,4 @@ reagents_to_add = list(/singleton/reagent/nutriment/ = 3) reagent_data = list(/singleton/reagent/nutriment = list("blue raspberry" = 5)) drop_sound = 'sound/items/drop/glass.ogg' - pickup_sound = 'sound/items/pickup/glass.ogg' \ No newline at end of file + pickup_sound = 'sound/items/pickup/glass.ogg' diff --git a/code/modules/reagents/reagent_containers/food/snacks/cultural/vaurca.dm b/code/modules/reagents/reagent_containers/food/snacks/cultural/vaurca.dm index ef5be42d277..caae0638839 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/cultural/vaurca.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/cultural/vaurca.dm @@ -183,4 +183,4 @@ /obj/item/reagent_containers/food/snacks/vkrexiwrap/veggie desc = "A food invented by Zo'ra Queenless with the intent of appealing to humans, the v'krexi wrap is similar to a burrito but with a special sauce extracted from v'krexi. This one is filled with veggies." - icon_state = "vkrexiwrap_veggie" \ No newline at end of file + icon_state = "vkrexiwrap_veggie" diff --git a/code/modules/reagents/reagent_containers/food/snacks/eggs.dm b/code/modules/reagents/reagent_containers/food/snacks/eggs.dm index cd8b23f7883..dcee8770375 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/eggs.dm @@ -199,4 +199,4 @@ icon = 'icons/obj/item/reagent_containers/food/egg.dmi' icon_state = "shakshouka" trash = /obj/item/trash/shakshouka - filling_color = "#BB2912" \ No newline at end of file + filling_color = "#BB2912" diff --git a/code/modules/reagents/reagent_containers/food/snacks/noodles.dm b/code/modules/reagents/reagent_containers/food/snacks/noodles.dm index 248b388add6..55995d2f907 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/noodles.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/noodles.dm @@ -82,4 +82,4 @@ /obj/item/reagent_containers/food/snacks/macandcheese/bacon name = "bacon mac and cheese" icon_state = "baconmacandcheese" - reagents_to_add = list(/singleton/reagent/nutriment = 4, /singleton/reagent/nutriment/protein/cheese = 5, /singleton/reagent/water = 5, /singleton/reagent/nutriment/protein = 3) \ No newline at end of file + reagents_to_add = list(/singleton/reagent/nutriment = 4, /singleton/reagent/nutriment/protein/cheese = 5, /singleton/reagent/water = 5, /singleton/reagent/nutriment/protein = 3) diff --git a/code/modules/research/designs/circuit/AI_law_boards.dm b/code/modules/research/designs/circuit/AI_law_boards.dm index 7702b3a3736..02a23ba1dbe 100644 --- a/code/modules/research/designs/circuit/AI_law_boards.dm +++ b/code/modules/research/designs/circuit/AI_law_boards.dm @@ -72,4 +72,4 @@ /datum/design/circuit/aimodule/core/tyrant name = "T.Y.R.A.N.T." req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) - build_path = /obj/item/aiModule/tyrant \ No newline at end of file + build_path = /obj/item/aiModule/tyrant diff --git a/code/modules/research/designs/circuit/hardsuit_circuits.dm b/code/modules/research/designs/circuit/hardsuit_circuits.dm index 5934303934d..5461e8dd6d6 100644 --- a/code/modules/research/designs/circuit/hardsuit_circuits.dm +++ b/code/modules/research/designs/circuit/hardsuit_circuits.dm @@ -62,4 +62,4 @@ /datum/design/circuit/hardsuit/hacker_target name = "Cybersuit Hardsuit Control And Targeting Board" req_tech = list(TECH_DATA = 6, TECH_COMBAT = 3, TECH_ILLEGAL = 3) - build_path = /obj/item/circuitboard/rig_assembly/illegal/targeting/hacker \ No newline at end of file + build_path = /obj/item/circuitboard/rig_assembly/illegal/targeting/hacker diff --git a/code/modules/research/designs/circuit/mecha_upgrades.dm b/code/modules/research/designs/circuit/mecha_upgrades.dm index f111c8f94ce..affd9700541 100644 --- a/code/modules/research/designs/circuit/mecha_upgrades.dm +++ b/code/modules/research/designs/circuit/mecha_upgrades.dm @@ -16,4 +16,4 @@ /datum/design/circuit/exosuit_upgrade/remote/ai name = "AI Remote Control" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4, TECH_MATERIAL = 4) - build_path = /obj/item/remote_mecha/ai \ No newline at end of file + build_path = /obj/item/remote_mecha/ai diff --git a/code/modules/research/designs/circuit/mining_circuits.dm b/code/modules/research/designs/circuit/mining_circuits.dm index aa99ed467fd..caab0d93a93 100644 --- a/code/modules/research/designs/circuit/mining_circuits.dm +++ b/code/modules/research/designs/circuit/mining_circuits.dm @@ -28,4 +28,4 @@ /datum/design/circuit/machine/mining/stacking_machine_console name = "Ore Stacking Console" - build_path = /obj/item/circuitboard/stacking_console \ No newline at end of file + build_path = /obj/item/circuitboard/stacking_console diff --git a/code/modules/research/designs/circuit/misc_electronics.dm b/code/modules/research/designs/circuit/misc_electronics.dm index 76e4c70746f..aca035444bf 100644 --- a/code/modules/research/designs/circuit/misc_electronics.dm +++ b/code/modules/research/designs/circuit/misc_electronics.dm @@ -5,4 +5,4 @@ name = "Secure Airlock Electronics" desc = "Allows for the construction of a tamper-resistant airlock electronics." req_tech = list(TECH_DATA = 3) - build_path = /obj/item/airlock_electronics/secure \ No newline at end of file + build_path = /obj/item/airlock_electronics/secure diff --git a/code/modules/research/designs/circuit/shield_designs.dm b/code/modules/research/designs/circuit/shield_designs.dm index c9e6b76d82b..67aff4c326f 100644 --- a/code/modules/research/designs/circuit/shield_designs.dm +++ b/code/modules/research/designs/circuit/shield_designs.dm @@ -15,4 +15,4 @@ name = "Capacitor" desc = "Allows for the construction of a shield capacitor circuit board." req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4) - build_path = /obj/item/circuitboard/shield_cap \ No newline at end of file + build_path = /obj/item/circuitboard/shield_cap diff --git a/code/modules/research/designs/designs.dm b/code/modules/research/designs/designs.dm index d20487f923c..de2dc7767d5 100644 --- a/code/modules/research/designs/designs.dm +++ b/code/modules/research/designs/designs.dm @@ -62,4 +62,4 @@ other types of metals and chemistry for reagents). return new build_path(newloc) /datum/design/item - build_type = PROTOLATHE \ No newline at end of file + build_type = PROTOLATHE diff --git a/code/modules/research/designs/mechfab/hardsuit/rigs.dm b/code/modules/research/designs/mechfab/hardsuit/rigs.dm index e5b743ad4f5..1e248fbd9b9 100644 --- a/code/modules/research/designs/mechfab/hardsuit/rigs.dm +++ b/code/modules/research/designs/mechfab/hardsuit/rigs.dm @@ -53,4 +53,4 @@ desc = "An assembly for an advanced powered armor suit with many cyberwarfare enhancements. Comes with built-in insulated gloves for safely tampering with electronics." build_path = /obj/item/rig_assembly/combat/illegal/hacker req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_MAGNET = 2, TECH_POWER = 3, TECH_COMBAT = 3, TECH_ILLEGAL = 3) - materials = list(DEFAULT_WALL_MATERIAL = 25000, MATERIAL_GLASS = 12500, MATERIAL_GOLD = 2500, MATERIAL_SILVER = 3500, MATERIAL_URANIUM = 5550) \ No newline at end of file + materials = list(DEFAULT_WALL_MATERIAL = 25000, MATERIAL_GLASS = 12500, MATERIAL_GOLD = 2500, MATERIAL_SILVER = 3500, MATERIAL_URANIUM = 5550) diff --git a/code/modules/research/designs/mechfab/prosthetics/internal.dm b/code/modules/research/designs/mechfab/prosthetics/internal.dm index 9aafb0aad4d..73c6b78abeb 100644 --- a/code/modules/research/designs/mechfab/prosthetics/internal.dm +++ b/code/modules/research/designs/mechfab/prosthetics/internal.dm @@ -31,4 +31,4 @@ /datum/design/item/mechfab/prosthetic/internal/stomach name = "Prosthetic Stomach" - build_path = /obj/item/organ/internal/stomach \ No newline at end of file + build_path = /obj/item/organ/internal/stomach diff --git a/code/modules/research/designs/mechfab/robot/robot.dm b/code/modules/research/designs/mechfab/robot/robot.dm index 1dd47aa0414..22a5c1eccdd 100644 --- a/code/modules/research/designs/mechfab/robot/robot.dm +++ b/code/modules/research/designs/mechfab/robot/robot.dm @@ -93,4 +93,4 @@ desc = "Used to boost prevent damage from EMP. Has limited surge preventions." materials = list(DEFAULT_WALL_MATERIAL = 20000, MATERIAL_GLASS = 6000, MATERIAL_GOLD = 5000, MATERIAL_SILVER = 7500) // Should be expensive req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_MAGNET = 5, TECH_POWER = 5, TECH_ENGINEERING = 4, TECH_COMBAT = 3) - build_path = /obj/item/robot_parts/robot_component/surge \ No newline at end of file + build_path = /obj/item/robot_parts/robot_component/surge diff --git a/code/modules/research/designs/mechfab/robot/robot_upgrades.dm b/code/modules/research/designs/mechfab/robot/robot_upgrades.dm index db87a193bd6..9cecfd69f70 100644 --- a/code/modules/research/designs/mechfab/robot/robot_upgrades.dm +++ b/code/modules/research/designs/mechfab/robot/robot_upgrades.dm @@ -42,4 +42,4 @@ desc = "Allows cyborg-likes to access weaponry hidden within themselves." req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 10000, MATERIAL_GLASS = 15000, MATERIAL_DIAMOND = 10000) - build_path = /obj/item/borg/upgrade/syndicate \ No newline at end of file + build_path = /obj/item/borg/upgrade/syndicate diff --git a/code/modules/research/designs/protolathe/deployable_kits.dm b/code/modules/research/designs/protolathe/deployable_kits.dm index 062cbb1b11a..79e2038c16f 100644 --- a/code/modules/research/designs/protolathe/deployable_kits.dm +++ b/code/modules/research/designs/protolathe/deployable_kits.dm @@ -11,4 +11,4 @@ /datum/design/item/deployable_kit/mech_chair/brig name = "Remote Penal Mech Centre" desc = "A deployable kit of a remote mech chair, capable of listening in to penal remote mech networks." - build_path = /obj/item/deployable_kit/remote_mech/brig \ No newline at end of file + build_path = /obj/item/deployable_kit/remote_mech/brig diff --git a/code/modules/research/designs/protolathe/disk_designs.dm b/code/modules/research/designs/protolathe/disk_designs.dm index 8688bac9d78..fe4dcc69547 100644 --- a/code/modules/research/designs/protolathe/disk_designs.dm +++ b/code/modules/research/designs/protolathe/disk_designs.dm @@ -17,4 +17,4 @@ name = "Flora Data Storage" req_tech = list(TECH_DATA = 1) materials = list(DEFAULT_WALL_MATERIAL = 30, MATERIAL_GLASS = 10) - build_path = /obj/item/disk/botany \ No newline at end of file + build_path = /obj/item/disk/botany diff --git a/code/modules/research/designs/protolathe/integrated_electronics_designs.dm b/code/modules/research/designs/protolathe/integrated_electronics_designs.dm index 61cbdd1e628..6f5084f377d 100644 --- a/code/modules/research/designs/protolathe/integrated_electronics_designs.dm +++ b/code/modules/research/designs/protolathe/integrated_electronics_designs.dm @@ -65,4 +65,4 @@ desc = "Allows the integrated circuit printer to create advanced circuits." req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4) materials = list(DEFAULT_WALL_MATERIAL = 2000) - build_path = /obj/item/disk/integrated_circuit/upgrade/advanced \ No newline at end of file + build_path = /obj/item/disk/integrated_circuit/upgrade/advanced diff --git a/code/modules/research/designs/protolathe/mining_designs.dm b/code/modules/research/designs/protolathe/mining_designs.dm index 5bed4db2d41..4edd3e4acb6 100644 --- a/code/modules/research/designs/protolathe/mining_designs.dm +++ b/code/modules/research/designs/protolathe/mining_designs.dm @@ -209,4 +209,4 @@ /datum/design/item/mining/ka_upgrade07 req_tech = list(TECH_POWER = 4,TECH_MAGNET = 4, TECH_DATA = 4) materials = list(DEFAULT_WALL_MATERIAL = 1000, MATERIAL_GLASS = 2000, MATERIAL_GOLD = 1000) - build_path = /obj/item/custom_ka_upgrade/upgrade_chips/explosive \ No newline at end of file + build_path = /obj/item/custom_ka_upgrade/upgrade_chips/explosive diff --git a/code/modules/research/designs/protolathe/modular_gun_designs.dm b/code/modules/research/designs/protolathe/modular_gun_designs.dm index ef25415e8e8..f3970381391 100644 --- a/code/modules/research/designs/protolathe/modular_gun_designs.dm +++ b/code/modules/research/designs/protolathe/modular_gun_designs.dm @@ -247,4 +247,4 @@ /datum/design/item/modular_weapon/freezing_ray req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 5, TECH_MATERIAL = 4) materials = list(DEFAULT_WALL_MATERIAL = 2000, MATERIAL_GLASS = 1000, MATERIAL_URANIUM = 500) - build_path = /obj/item/laser_components/modulator/freeze \ No newline at end of file + build_path = /obj/item/laser_components/modulator/freeze diff --git a/code/modules/research/designs/protolathe/stock_parts_designs.dm b/code/modules/research/designs/protolathe/stock_parts_designs.dm index 6ba34ce2769..be22f28f819 100644 --- a/code/modules/research/designs/protolathe/stock_parts_designs.dm +++ b/code/modules/research/designs/protolathe/stock_parts_designs.dm @@ -129,4 +129,4 @@ desc = "A component used in telecomms machinery construction." req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) materials = list(MATERIAL_GLASS = 100, MATERIAL_SILVER = 10, MATERIAL_URANIUM = 15) - build_path = /obj/item/stock_parts/subspace/transmitter \ No newline at end of file + build_path = /obj/item/stock_parts/subspace/transmitter diff --git a/code/modules/research/rd-readme.dm b/code/modules/research/rd-readme.dm index b089c082e1b..153e768bac6 100644 --- a/code/modules/research/rd-readme.dm +++ b/code/modules/research/rd-readme.dm @@ -29,4 +29,4 @@ Each tech path should have at LEAST one item at every level (levels 1 - 15). Thi researching. Existing tech (ie, anything you can find on the station or get from the quartermaster) shouldn't go higher then level 5 or 7. Everything past that should be stuff you research. -*/ \ No newline at end of file +*/ diff --git a/code/modules/research/xenoarchaeology/readme.dm b/code/modules/research/xenoarchaeology/readme.dm index c5aa7a2f800..92cba12583f 100644 --- a/code/modules/research/xenoarchaeology/readme.dm +++ b/code/modules/research/xenoarchaeology/readme.dm @@ -2,4 +2,4 @@ //coming soon //there'll probably be some stuff on the wiki at some point -//original code from alfie275 / lunacode, artifacts are from isaidno \ No newline at end of file +//original code from alfie275 / lunacode, artifacts are from isaidno diff --git a/code/modules/shareddream/area.dm b/code/modules/shareddream/area.dm index b0dd7eb523d..baeda85372f 100644 --- a/code/modules/shareddream/area.dm +++ b/code/modules/shareddream/area.dm @@ -1,4 +1,4 @@ /area/centcom/shared_dream name = "\improper The Shared Dream" icon_state = "dream" - ambience = AMBIENCE_OTHERWORLDLY \ No newline at end of file + ambience = AMBIENCE_OTHERWORLDLY diff --git a/code/modules/shuttles/city.dm b/code/modules/shuttles/city.dm index 51e97f47e25..6d5fd187d12 100644 --- a/code/modules/shuttles/city.dm +++ b/code/modules/shuttles/city.dm @@ -1,4 +1,4 @@ /obj/machinery/computer/shuttle_control/city name = "city transit shuttle control console" shuttle_tag = "City Transit Shuttle" - light_color = LIGHT_COLOR_RED \ No newline at end of file + light_color = LIGHT_COLOR_RED diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 364e8ce92db..327b15cfd74 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -47,9 +47,10 @@ if(!docking_controller) return var/docking_tag = docking_controller - docking_controller = SSshuttle.docking_registry[docking_tag] if(!istype(docking_controller)) - LOG_DEBUG("Could not find docking controller for shuttle waypoint '[name]', docking tag was '[docking_tag]'.") + docking_controller = SSshuttle.docking_registry[docking_tag] + if(!istype(docking_controller)) + LOG_DEBUG("Could not find docking controller for shuttle waypoint '[name]', docking tag was '[docking_tag]'.") /obj/effect/shuttle_landmark/forceMove() var/obj/effect/overmap/visitable/map_origin = map_sectors["[z]"] diff --git a/code/modules/spell_system/artifacts/armor/bone_armor.dm b/code/modules/spell_system/artifacts/armor/bone_armor.dm index 9504d12205d..f4243dd1a11 100644 --- a/code/modules/spell_system/artifacts/armor/bone_armor.dm +++ b/code/modules/spell_system/artifacts/armor/bone_armor.dm @@ -17,4 +17,4 @@ item_state = "skull" contained_sprite = TRUE species_restricted = list(BODYTYPE_SKELETON) - armor = list(melee = ARMOR_MELEE_MAJOR, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0) \ No newline at end of file + armor = list(melee = ARMOR_MELEE_MAJOR, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0) diff --git a/code/modules/spell_system/artifacts/items/bone_spear.dm b/code/modules/spell_system/artifacts/items/bone_spear.dm index 7981c2319ed..09ac0428a07 100644 --- a/code/modules/spell_system/artifacts/items/bone_spear.dm +++ b/code/modules/spell_system/artifacts/items/bone_spear.dm @@ -1,3 +1,3 @@ /obj/item/material/twohanded/spear/bone desc = "A spear crafted with bones of some long forgotten creature." - default_material = "cursed bone" \ No newline at end of file + default_material = "cursed bone" diff --git a/code/modules/spell_system/spells/spell_list/aoe_turf.dm b/code/modules/spell_system/spells/spell_list/aoe_turf.dm index 9f79f694ad8..f7bd9ccdfe0 100644 --- a/code/modules/spell_system/spells/spell_list/aoe_turf.dm +++ b/code/modules/spell_system/spells/spell_list/aoe_turf.dm @@ -22,4 +22,4 @@ Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are ex if(!targets.len) //doesn't waste the spell return - return targets \ No newline at end of file + return targets diff --git a/code/modules/spell_system/spells/spell_list/dumbfire.dm b/code/modules/spell_system/spells/spell_list/dumbfire.dm index cd13f7169c8..15a5e3fb52c 100644 --- a/code/modules/spell_system/spells/spell_list/dumbfire.dm +++ b/code/modules/spell_system/spells/spell_list/dumbfire.dm @@ -10,4 +10,4 @@ for(var/i = 1; i <= src.range; i++) current_turf = get_step(current_turf, starting_dir) targets += current_turf - return targets \ No newline at end of file + return targets diff --git a/code/modules/spell_system/spells/spell_list/equip.dm b/code/modules/spell_system/spells/spell_list/equip.dm index c1237c45dab..bef30ae04d5 100644 --- a/code/modules/spell_system/spells/spell_list/equip.dm +++ b/code/modules/spell_system/spells/spell_list/equip.dm @@ -42,4 +42,4 @@ qdel(to_remove) /spell/targeted/equip_item/proc/summon_item(var/newtype) - return new newtype \ No newline at end of file + return new newtype diff --git a/code/modules/spell_system/spells/spell_list/others/area/torment.dm b/code/modules/spell_system/spells/spell_list/others/area/torment.dm index 994c1a74708..10d6864cfed 100644 --- a/code/modules/spell_system/spells/spell_list/others/area/torment.dm +++ b/code/modules/spell_system/spells/spell_list/others/area/torment.dm @@ -31,4 +31,4 @@ loss += 30 - return "[src] will now cause more pain." \ No newline at end of file + return "[src] will now cause more pain." diff --git a/code/modules/spell_system/spells/spell_list/others/equip/party_hardy.dm b/code/modules/spell_system/spells/spell_list/others/equip/party_hardy.dm index dd357bd9f30..561ccbc291c 100644 --- a/code/modules/spell_system/spells/spell_list/others/equip/party_hardy.dm +++ b/code/modules/spell_system/spells/spell_list/others/equip/party_hardy.dm @@ -33,4 +33,4 @@ "[slot_head]" = /obj/item/clothing/head/collectable/wizard) return "Woo! Now everybody gets a cool wizard hat and MORE BOOZE!" - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm index 9b8b3162e14..753402f3866 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target.dm @@ -28,4 +28,4 @@ amt_dam_fire -= 5 amt_organ -= 2 - return "[src] will now heal more." \ No newline at end of file + return "[src] will now heal more." diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm index 8dd0c616236..a1b6cd056d5 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_area.dm @@ -23,4 +23,4 @@ amt_organ -= 1 range += 2 - return "[src] now heals more in a wider area." \ No newline at end of file + return "[src] now heals more in a wider area." diff --git a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm index ad0943a799f..5d50947076c 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/heal_target_major.dm @@ -23,4 +23,4 @@ amt_dam_oxy = -20 amt_organ = -5 - return "[src] now heals oxygen loss and toxic damage." \ No newline at end of file + return "[src] now heals oxygen loss and toxic damage." diff --git a/code/modules/spell_system/spells/spell_list/others/generic/life_steal.dm b/code/modules/spell_system/spells/spell_list/others/generic/life_steal.dm index 7c21b25a70a..a862bd7c723 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/life_steal.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/life_steal.dm @@ -31,4 +31,4 @@ gibs(M.loc) user.adjustBruteLoss(-15) user.adjustFireLoss(-15) - ..() \ No newline at end of file + ..() diff --git a/code/modules/spell_system/spells/spell_list/others/generic/swap.dm b/code/modules/spell_system/spells/spell_list/others/generic/swap.dm index 60314035fb8..5a4a8cee7e7 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/swap.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/swap.dm @@ -39,4 +39,4 @@ amt_eye_blind += 2 amt_weakened += 5 - return "This spell will now weaken and blind the target for a longer period of time." \ No newline at end of file + return "This spell will now weaken and blind the target for a longer period of time." diff --git a/code/modules/spell_system/spells/spell_list/projectile.dm b/code/modules/spell_system/spells/spell_list/projectile.dm index 5f07a304dda..72d43c0a38d 100644 --- a/code/modules/spell_system/spells/spell_list/projectile.dm +++ b/code/modules/spell_system/spells/spell_list/projectile.dm @@ -45,4 +45,4 @@ If the spell_projectile is seeking, it will update its target every process and return targets /spell/targeted/projectile/proc/prox_cast(var/list/targets, var/atom/movable/spell_holder) - return targets \ No newline at end of file + return targets diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/construct_shell.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/construct_shell.dm index c34b10b70d9..63613cb884f 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/construct_shell.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/construct_shell.dm @@ -17,4 +17,4 @@ charge_max = 1800 summon_type = list(/obj/structure/constructshell/cult) hud_state = "const_shell" - override_base = "const" \ No newline at end of file + override_base = "const" diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_altar.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_altar.dm index 647c2acb328..d9a414703cb 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_altar.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_altar.dm @@ -11,4 +11,4 @@ summon_type = list(/obj/structure/cult/talisman) hud_state = "const_altar" - override_base = "const" \ No newline at end of file + override_base = "const" diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_floor.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_floor.dm index 9e50fa5a0ee..045cf541ff2 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_floor.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_floor.dm @@ -14,4 +14,4 @@ /spell/aoe_turf/conjure/floor/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) animation.icon_state = "cultfloor" flick("cultfloor", animation) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), animation), 10) \ No newline at end of file + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), animation), 10) diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forcewall.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forcewall.dm index 4e74867b203..03e1d0fe1ef 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forcewall.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forcewall.dm @@ -23,4 +23,4 @@ appearance_flags = NO_CLIENT_COLOR /obj/effect/forcefield/cult/cultify() - return \ No newline at end of file + return diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forge.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forge.dm index 9f03aa11b8b..5f8c0a8235f 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forge.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_forge.dm @@ -11,4 +11,4 @@ summon_type = list(/obj/structure/cult/forge) hud_state = "const_forge" - override_base = "const" \ No newline at end of file + override_base = "const" diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_wall.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_wall.dm index 45f08dc4abd..cd65b5180a8 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_wall.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/create_wall.dm @@ -27,4 +27,4 @@ range = 0 cast_delay = 50 - summon_type = list(/turf/simulated/wall/cult_reinforced) \ No newline at end of file + summon_type = list(/turf/simulated/wall/cult_reinforced) diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_pylon.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_pylon.dm index 76d0a78323d..ba99382c935 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_pylon.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_pylon.dm @@ -19,4 +19,4 @@ if(P.isbroken) P.repair(usr) continue - return \ No newline at end of file + return diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_soulstone.dm b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_soulstone.dm index e8774960bab..a2f34d00f3c 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_soulstone.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/construct_spells/summon_soulstone.dm @@ -11,4 +11,4 @@ summon_type = list(/obj/item/device/soulstone) hud_state = "const_stone" - override_base = "const" \ No newline at end of file + override_base = "const" diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm b/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm index 2bbbbe5be22..82919cb7df1 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/druidic_spells.dm @@ -39,4 +39,4 @@ newVars = list("maxHealth" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) - return "Your bats are now stronger." \ No newline at end of file + return "Your bats are now stronger." diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_nest.dm b/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_nest.dm index 2203282b829..a35218aa2b1 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_nest.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_nest.dm @@ -11,4 +11,4 @@ summon_type = list(/obj/structure/bed/nest) cast_sound = 'sound/effects/attackblob.ogg' - hud_state = "nest" \ No newline at end of file + hud_state = "nest" diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_node.dm b/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_node.dm index d394cc2a1a3..b8192774c11 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_node.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/morph_spells/create_node.dm @@ -11,4 +11,4 @@ summon_type = list(/obj/structure/gore/tendrils/node) cast_sound = 'sound/effects/attackblob.ogg' - hud_state = "tendril_node" \ No newline at end of file + hud_state = "tendril_node" diff --git a/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm b/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm index ed6108bacae..5c9883672f5 100644 --- a/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm +++ b/code/modules/spell_system/spells/spell_list/self/conjure/radiant_aura.dm @@ -23,4 +23,4 @@ /spell/radiant_aura/starlight spell_flags = 0 - charge_max = 400 \ No newline at end of file + charge_max = 400 diff --git a/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm b/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm index f54daddf9f8..df2488decba 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/mutate.dm @@ -18,4 +18,4 @@ level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0) cooldown_min = 300 - hud_state = "wiz_hulk" \ No newline at end of file + hud_state = "wiz_hulk" diff --git a/code/modules/spell_system/spells/spell_list/self/generic/shadow_shroud.dm b/code/modules/spell_system/spells/spell_list/self/generic/shadow_shroud.dm index 17595bbdd2e..e9e5cb03dd3 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/shadow_shroud.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/shadow_shroud.dm @@ -28,4 +28,4 @@ O.set_light(range, -10, "#FFFFFF") spawn(duration) - qdel(O) \ No newline at end of file + qdel(O) diff --git a/code/modules/spell_system/spells/spell_list/self/generic/shift.dm b/code/modules/spell_system/spells/spell_list/self/generic/shift.dm index 8f8ef57e512..5dae0a71a99 100644 --- a/code/modules/spell_system/spells/spell_list/self/generic/shift.dm +++ b/code/modules/spell_system/spells/spell_list/self/generic/shift.dm @@ -21,4 +21,4 @@ flick("phase_shift2",animation) /spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) - return \ No newline at end of file + return diff --git a/code/modules/spell_system/spells/spell_list/shapeshift.dm b/code/modules/spell_system/spells/spell_list/shapeshift.dm index 22a0529b90b..5bbde48b17e 100644 --- a/code/modules/spell_system/spells/spell_list/shapeshift.dm +++ b/code/modules/spell_system/spells/spell_list/shapeshift.dm @@ -77,4 +77,4 @@ M.key = trans.key playsound(get_turf(M),revert_sound,50,1) M.forceMove(get_turf(trans)) - qdel(trans) \ No newline at end of file + qdel(trans) diff --git a/code/modules/spell_system/spells/spell_projectile.dm b/code/modules/spell_system/spells/spell_projectile.dm index bffdd2f42a5..7e5ec4d3109 100644 --- a/code/modules/spell_system/spells/spell_projectile.dm +++ b/code/modules/spell_system/spells/spell_projectile.dm @@ -54,4 +54,4 @@ return 1 /obj/item/projectile/spell_projectile/seeking - name = "seeking spell" \ No newline at end of file + name = "seeking spell" diff --git a/code/modules/submaps/submap_landmark.dm b/code/modules/submaps/submap_landmark.dm index 245c8a299d8..0c895a50c79 100644 --- a/code/modules/submaps/submap_landmark.dm +++ b/code/modules/submaps/submap_landmark.dm @@ -22,4 +22,4 @@ log_debug( "Submap error - mapped landmark is duplicate of existing.") else log_debug( "Submap error - mapped landmark had invalid archetype.") - return INITIALIZE_HINT_QDEL \ No newline at end of file + return INITIALIZE_HINT_QDEL diff --git a/code/modules/surgery/_defines.dm b/code/modules/surgery/_defines.dm index 63846b55494..40f5f0b7caf 100644 --- a/code/modules/surgery/_defines.dm +++ b/code/modules/surgery/_defines.dm @@ -23,4 +23,4 @@ #define CAVITY_OPEN 1 //macros -#define IS_ORGAN_FULLY_OPEN affected.open == ((affected.encased || affected.robotic) ? ORGAN_ENCASED_RETRACTED : ORGAN_OPEN_RETRACTED) \ No newline at end of file +#define IS_ORGAN_FULLY_OPEN affected.open == ((affected.encased || affected.robotic) ? ORGAN_ENCASED_RETRACTED : ORGAN_OPEN_RETRACTED) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 9a5f948942e..24cd07a9793 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -184,16 +184,18 @@ if(length(affected.implants)) var/list/implants = list() var/shrapnel_present = FALSE - for(var/obj/item/I in affected.implants) + for(var/obj/I in affected.implants) implants += I if(!istype(I, /obj/item/implant)) shrapnel_present = TRUE - for(var/obj/item/I in implants) + for(var/obj/I in implants) /// Prioritize shrapnel instead of stuff like loyalty implants. if(shrapnel_present && istype(I, /obj/item/implant)) continue + if(do_mob(user, target, 0.5 SECONDS)) + user.visible_message("[user] takes [I] out of incision on [target]'s [affected.name] with \the [tool].", \ SPAN_NOTICE("You take [I] out of incision on [target]'s [affected.name]s with \the [tool].") ) target.remove_implant(I, TRUE, affected) @@ -212,6 +214,7 @@ var/obj/item/device/gps/gps = I moved_event.unregister(target, gps) gps.implanted_into = null + playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1) else user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \ diff --git a/code/modules/surgery/~defines.dm b/code/modules/surgery/~defines.dm index 0b419831908..57f70641ffc 100644 --- a/code/modules/surgery/~defines.dm +++ b/code/modules/surgery/~defines.dm @@ -13,4 +13,4 @@ #undef BONE_GLUED #undef BONE_SET #undef CAVITY_OPEN -#undef CAVITY_CLOSED \ No newline at end of file +#undef CAVITY_CLOSED diff --git a/code/modules/synthesized_instruments/echo_editor.dm b/code/modules/synthesized_instruments/echo_editor.dm index ec931895336..c30671cd7ac 100644 --- a/code/modules/synthesized_instruments/echo_editor.dm +++ b/code/modules/synthesized_instruments/echo_editor.dm @@ -60,4 +60,4 @@ if ("desc") to_chat(usr, "[name]: from [bound_min] to [bound_max] (default: [default])
[desc]") - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/synthesized_instruments/env_editor.dm b/code/modules/synthesized_instruments/env_editor.dm index d2b29897b6f..b3c4c2053fe 100644 --- a/code/modules/synthesized_instruments/env_editor.dm +++ b/code/modules/synthesized_instruments/env_editor.dm @@ -62,4 +62,4 @@ if ("desc") to_chat(usr, "[name]: from [bound_min] to [bound_max] (default: [default])
[desc]") - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/synthesized_instruments/globals.dm b/code/modules/synthesized_instruments/globals.dm index 95d17a57a8c..fa00cfd07df 100644 --- a/code/modules/synthesized_instruments/globals.dm +++ b/code/modules/synthesized_instruments/globals.dm @@ -240,4 +240,4 @@ Bit flags that modify the behavior of above properties /datum/sample_pair/New(sample_file, deviation) src.sample = sample_file - src.deviation = deviation \ No newline at end of file + src.deviation = deviation diff --git a/code/modules/synthesized_instruments/instrument_data/fun.dm b/code/modules/synthesized_instruments/instrument_data/fun.dm index a2370f545a6..d35cdc5a871 100644 --- a/code/modules/synthesized_instruments/instrument_data/fun.dm +++ b/code/modules/synthesized_instruments/instrument_data/fun.dm @@ -23,4 +23,4 @@ /datum/instrument/fun/diona name = "Diona" id = "diona" - samples = list("79"='sound/misc/nymphchirp.ogg') \ No newline at end of file + samples = list("79"='sound/misc/nymphchirp.ogg') diff --git a/code/modules/synthesized_instruments/instrument_data/impossible_instruments.dm b/code/modules/synthesized_instruments/instrument_data/impossible_instruments.dm index 9e81e634a7d..7d6c1670c78 100644 --- a/code/modules/synthesized_instruments/instrument_data/impossible_instruments.dm +++ b/code/modules/synthesized_instruments/instrument_data/impossible_instruments.dm @@ -18,4 +18,4 @@ /datum/instrument/tones/saw_wave name = "Ideal sawtooth wave" id = "saw" - samples = list("81"='code/modules/synthesized_instruments/samples/tones/Sawtooth.ogg') \ No newline at end of file + samples = list("81"='code/modules/synthesized_instruments/samples/tones/Sawtooth.ogg') diff --git a/code/modules/synthesized_instruments/instrument_data/obsolete.dm b/code/modules/synthesized_instruments/instrument_data/obsolete.dm index 3d44ad62e87..b750da35e1c 100644 --- a/code/modules/synthesized_instruments/instrument_data/obsolete.dm +++ b/code/modules/synthesized_instruments/instrument_data/obsolete.dm @@ -103,4 +103,4 @@ "104"='code/modules/synthesized_instruments/samples/obsolete/violin/G#8.mid',\ "105"='code/modules/synthesized_instruments/samples/obsolete/violin/An8.mid',\ "106"='code/modules/synthesized_instruments/samples/obsolete/violin/A#8.mid',\ -"107"='code/modules/synthesized_instruments/samples/obsolete/violin/Bn8.mid') \ No newline at end of file +"107"='code/modules/synthesized_instruments/samples/obsolete/violin/Bn8.mid') diff --git a/code/modules/synthesized_instruments/instruments.dm b/code/modules/synthesized_instruments/instruments.dm index 14247b618be..42a20a76ba7 100644 --- a/code/modules/synthesized_instruments/instruments.dm +++ b/code/modules/synthesized_instruments/instruments.dm @@ -31,4 +31,4 @@ var/last_sample = src.samples[musical_config.n2t(last_key)] for (var/key=0 to first_key-1) src.sample_map[musical_config.n2t(key)] = new /datum/sample_pair(first_sample, key-first_key) for (var/key=last_key to 127) src.sample_map[musical_config.n2t(key)] = new /datum/sample_pair(last_sample, key-last_key) - return src.samples \ No newline at end of file + return src.samples diff --git a/code/modules/synthesized_instruments/real_instruments.dm b/code/modules/synthesized_instruments/real_instruments.dm index a5688f4566b..6697a3b14dc 100644 --- a/code/modules/synthesized_instruments/real_instruments.dm +++ b/code/modules/synthesized_instruments/real_instruments.dm @@ -308,4 +308,4 @@ if (..()) return 1 - return real_instrument.Topic_call(href, href_list, usr) \ No newline at end of file + return real_instrument.Topic_call(href, href_list, usr) diff --git a/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm b/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm index 18d5ad2ea9f..afbef1e255b 100644 --- a/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm +++ b/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm @@ -17,4 +17,4 @@ item_state = "eguitar" slot_flags = SLOT_BACK sound_player = /datum/sound_player/synthesizer - path = /datum/instrument/guitar \ No newline at end of file + path = /datum/instrument/guitar diff --git a/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm b/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm index a56e174db3f..7ec2cba0cfe 100644 --- a/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm +++ b/code/modules/synthesized_instruments/real_instruments/Piano/piano.dm @@ -2,4 +2,4 @@ name = "space piano" desc = "A surprisingly high-tech piano with a digital display for modifying sound output." icon_state = "piano" - path = /datum/instrument/piano \ No newline at end of file + path = /datum/instrument/piano diff --git a/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm b/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm index 60a9b757066..e57d91ef207 100644 --- a/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm +++ b/code/modules/synthesized_instruments/real_instruments/Trumpet/trumpet.dm @@ -3,4 +3,4 @@ desc = "The Omnitrumptet series 400 with more than 30 sound samples and fully customizable high fidelity output provides the ultimate means to toot your own horn." icon_state = "trumpet" sound_player = /datum/sound_player/synthesizer - path = /datum/instrument/brass \ No newline at end of file + path = /datum/instrument/brass diff --git a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index 79159ccbd68..bb34e8284a1 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -11,4 +11,4 @@ path = /datum/instrument/obsolete/violin /obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) - return !(src && in_range(src, user)) \ No newline at end of file + return !(src && in_range(src, user)) diff --git a/code/modules/synthesized_instruments/song_editor.dm b/code/modules/synthesized_instruments/song_editor.dm index 3ea8dab6f33..4b08fb600f4 100644 --- a/code/modules/synthesized_instruments/song_editor.dm +++ b/code/modules/synthesized_instruments/song_editor.dm @@ -103,4 +103,4 @@ if ("first_page") src.page = 1 - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/synthesized_instruments/usage_info.dm b/code/modules/synthesized_instruments/usage_info.dm index 9322a96ea05..9f718331a4d 100644 --- a/code/modules/synthesized_instruments/usage_info.dm +++ b/code/modules/synthesized_instruments/usage_info.dm @@ -26,4 +26,4 @@ /datum/nano_module/usage_info/Destroy() player = null - ..() \ No newline at end of file + ..() diff --git a/code/modules/tables/update_triggers.dm b/code/modules/tables/update_triggers.dm index 1c64b0dfb75..02b70dc965a 100644 --- a/code/modules/tables/update_triggers.dm +++ b/code/modules/tables/update_triggers.dm @@ -19,4 +19,4 @@ if(loc != oldloc) for(var/obj/structure/table/T in view(oldloc, 1) | view(loc, 1)) T.update_connections() - T.update_icon() \ No newline at end of file + T.update_icon() diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE index 221f9e1deb2..2bedf9a63aa 100644 --- a/code/modules/tgs/LICENSE +++ b/code/modules/tgs/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2017-2023 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md index 445cee41f57..6319028d810 100644 --- a/code/modules/tgs/README.md +++ b/code/modules/tgs/README.md @@ -7,7 +7,7 @@ This folder should be placed on it's own inside a codebase that wishes to use th - The other versioned folders contain code for the different DMAPI versions. - [v3210](./v3210) contains the final TGS3 API. - [v4](./v4) is the legacy DMAPI 4 (Used in TGS 4.0.X versions). - - [v5](./v5) is the current DMAPI version used by TGS4 >=4.1. + - [v5](./v5) is the current DMAPI version used by TGS >=4.1. - [LICENSE](./LICENSE) is the MIT license for the DMAPI. APIs communicate with TGS in two ways. All versions implement TGS -> DM communication using /world/Topic. DM -> TGS communication, called the bridge method, is different for each version. diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md index aa3c7a9c9db..b82d8f49e29 100644 --- a/code/modules/tgs/core/README.md +++ b/code/modules/tgs/core/README.md @@ -5,4 +5,5 @@ This folder contains all DMAPI code not directly involved in an API. - [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals. - [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code. - [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement. -- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition \ No newline at end of file +- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition +- diff --git a/code/modules/tgs/core/_definitions.dm b/code/modules/tgs/core/_definitions.dm index ebf6d17c2a0..fd98034eb71 100644 --- a/code/modules/tgs/core/_definitions.dm +++ b/code/modules/tgs/core/_definitions.dm @@ -1,2 +1,10 @@ +#if DM_VERSION < 510 +#error The TGS DMAPI does not support BYOND versions < 510! +#endif + #define TGS_UNIMPLEMENTED "___unimplemented" #define TGS_VERSION_PARAMETER "server_service_version" + +#ifndef TGS_DEBUG_LOG +#define TGS_DEBUG_LOG(message) +#endif diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 41a04733945..b9a9f27a28a 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -153,4 +153,9 @@ /world/TgsSecurityLevel() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) - api.SecurityLevel() + return api.SecurityLevel() + +/world/TgsVisibility() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.Visibility() diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 4d37ed662d1..07ce3b68458 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -4,11 +4,22 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) var/datum/tgs_version/version var/datum/tgs_event_handler/event_handler + var/list/warned_deprecated_command_runs + /datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version) . = ..() src.event_handler = event_handler src.version = version +/datum/tgs_api/proc/TerminateWorld() + while(TRUE) + TGS_DEBUG_LOG("About to terminate world. Tick: [world.time], sleep_offline: [world.sleep_offline]") + world.sleep_offline = FALSE // https://www.byond.com/forum/post/2894866 + del(world) + world.sleep_offline = FALSE // just in case, this is BYOND after all... + sleep(1) + TGS_DEBUG_LOG("BYOND DIDN'T TERMINATE THE WORLD!!! TICK IS: [world.time], sleep_offline: [world.sleep_offline]") + /datum/tgs_api/latest parent_type = /datum/tgs_api/v5 @@ -55,3 +66,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/Visibility() + return TGS_UNIMPLEMENTED diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm index 4018074f4e3..23b714f9d06 100644 --- a/code/modules/tgs/includes.dm +++ b/code/modules/tgs/includes.dm @@ -13,5 +13,9 @@ #include "v5\_defines.dm" #include "v5\api.dm" +#include "v5\bridge.dm" +#include "v5\chunking.dm" #include "v5\commands.dm" +#include "v5\serializers.dm" +#include "v5\topic.dm" #include "v5\undefs.dm" diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index 245381b93ea..666201a3225 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -28,6 +28,8 @@ #define SERVICE_RETURN_SUCCESS "SUCCESS" +#define TGS_FILE2LIST(filename) (splittext(trim_left(trim_right(file2text(filename))), "\n")) + /datum/tgs_api/v3210 var/reboot_mode = REBOOT_MODE_NORMAL var/comms_key @@ -53,24 +55,29 @@ return copytext(text, 1, i + 1) return "" -/datum/tgs_api/v3210/proc/file2list(filename) - return splittext(trim_left(trim_right(file2text(filename))), "\n") - /datum/tgs_api/v3210/OnWorldNew(minimum_required_security_level) . = FALSE comms_key = world.params[SERVICE_WORLD_PARAM] instance_name = world.params[SERVICE_INSTANCE_PARAM] if(!instance_name) - instance_name = "TG Station Server" //maybe just upgraded + instance_name = "TG Station Server" //maybe just upgraded - var/list/logs = file2list(".git/logs/HEAD") + var/list/logs = TGS_FILE2LIST(".git/logs/HEAD") if(logs.len) - logs = splittext(logs[logs.len - 1], " ") - commit = logs[2] - logs = file2list(".git/logs/refs/remotes/origin/master") + logs = splittext(logs[logs.len], " ") + if (logs.len >= 2) + commit = logs[2] + else + TGS_ERROR_LOG("Error parsing commit logs") + + logs = TGS_FILE2LIST(".git/logs/refs/remotes/origin/master") if(logs.len) - originmastercommit = splittext(logs[logs.len - 1], " ")[2] + logs = splittext(logs[logs.len], " ") + if (logs.len >= 2) + originmastercommit = logs[2] + else + TGS_ERROR_LOG("Error parsing origin commmit logs") if(world.system_type != MS_WINDOWS) TGS_ERROR_LOG("This API version is only supported on Windows. Not running on Windows. Aborting initialization!") @@ -92,14 +99,18 @@ if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL)) TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.") return - call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval + #if DM_VERSION >= 515 + call_ext(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval + #else + call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval + #endif return TRUE /datum/tgs_api/v3210/OnTopic(T) var/list/params = params2list(T) var/their_sCK = params[SERVICE_CMD_PARAM_KEY] if(!their_sCK) - return FALSE //continue world/Topic + return FALSE //continue world/Topic if(their_sCK != comms_key) return "Invalid comms key!"; @@ -168,7 +179,7 @@ /datum/tgs_api/v3210/Revision() if(!warned_revison) var/datum/tgs_version/api_version = ApiVersion() - TGS_ERROR_LOG("Use of TgsRevision on [api_version.deprefixed_parameter] origin_commit only points to master!") + TGS_WARNING_LOG("Use of TgsRevision on [api_version.deprefixed_parameter] origin_commit only points to master!") warned_revison = TRUE var/datum/tgs_revision_information/ri = new ri.commit = commit @@ -176,22 +187,25 @@ return ri /datum/tgs_api/v3210/EndProcess() - sleep(world.tick_lag) //flush the buffers + sleep(world.tick_lag) //flush the buffers ExportService(SERVICE_REQUEST_KILL_PROCESS) /datum/tgs_api/v3210/ChatChannelInfo() return list() // :omegalul: -/datum/tgs_api/v3210/ChatBroadcast(message, list/channels) +/datum/tgs_api/v3210/ChatBroadcast(datum/tgs_message_content/message, list/channels) if(channels) return TGS_UNIMPLEMENTED + message = UpgradeDeprecatedChatMessage(message) ChatTargetedBroadcast(message, TRUE) ChatTargetedBroadcast(message, FALSE) -/datum/tgs_api/v3210/ChatTargetedBroadcast(message, admin_only) - ExportService("[admin_only ? SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE : SERVICE_REQUEST_IRC_BROADCAST] [message]") +/datum/tgs_api/v3210/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only) + message = UpgradeDeprecatedChatMessage(message) + ExportService("[admin_only ? SERVICE_REQUEST_IRC_ADMIN_CHANNEL_MESSAGE : SERVICE_REQUEST_IRC_BROADCAST] [message.text]") /datum/tgs_api/v3210/ChatPrivateMessage(message, datum/tgs_chat_user/user) + UpgradeDeprecatedChatMessage(message) return TGS_UNIMPLEMENTED /datum/tgs_api/v3210/SecurityLevel() @@ -226,3 +240,5 @@ #undef SERVICE_REQUEST_API_VERSION #undef SERVICE_RETURN_SUCCESS + +#undef TGS_FILE2LIST diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index 4ccfc1a8a60..e65c816320d 100644 --- a/code/modules/tgs/v3210/commands.dm +++ b/code/modules/tgs/v3210/commands.dm @@ -10,9 +10,12 @@ var/warned_about_the_dangers_of_robutussin = !warnings_only for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) if(!warned_about_the_dangers_of_robutussin) - TGS_ERROR_LOG("Custom chat commands in [ApiVersion()] lacks the /datum/tgs_chat_user/sender.channel field!") + TGS_WARNING_LOG("Custom chat commands in [ApiVersion()] lacks the /datum/tgs_chat_user/sender.channel field!") warned_about_the_dangers_of_robutussin = TRUE var/datum/tgs_chat_command/stc = I + if(stc.ignore_type == I) + continue + var/command_name = initial(stc.name) if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\"")) if(warnings_only && !warned_command_names[command_name]) @@ -44,9 +47,12 @@ user.friendly_name = sender // Discord hack, fix the mention if it's only numbers (fuck you IRC trolls) - var/regex/discord_id_regex = regex(@"^[0-9]+$") + var/regex/discord_id_regex = regex("^\[0-9\]+$") if(findtext(sender, discord_id_regex)) sender = "<@[sender]>" user.mention = sender - return stc.Run(user, params) || TRUE + var/datum/tgs_message_content/result = stc.Run(user, params) + result = UpgradeDeprecatedCommandResponse(result, command) + + return result ? result.text : TRUE diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 4eb8e67d928..945e2e41176 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -73,7 +73,7 @@ if(cached_json["apiValidateOnly"]) TGS_INFO_LOG("Validating API and exiting...") Export(TGS4_COMM_VALIDATE, list(TGS4_PARAMETER_DATA = "[minimum_required_security_level]")) - del(world) + TerminateWorld() security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] @@ -118,7 +118,7 @@ var/list/params = params2list(T) var/their_sCK = params[TGS4_INTEROP_ACCESS_IDENTIFIER] if(!their_sCK) - return FALSE //continue world/Topic + return FALSE //continue world/Topic if(their_sCK != access_identifier) return "Invalid comms key!"; @@ -188,24 +188,24 @@ requesting_new_port = TRUE if(!world.OpenPort(0)) //open any port TGS_ERROR_LOG("Unable to open random port to retrieve new port![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() //request a new port export_lock = FALSE - var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose + var/list/new_port_json = Export(TGS4_COMM_NEW_PORT, list(TGS4_PARAMETER_DATA = "[world.port]"), TRUE) //stringify this on purpose if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() var/new_port = new_port_json[TGS4_PARAMETER_DATA] if(!isnum(new_port) || new_port <= 0) TGS_ERROR_LOG("Malformed new port json ([json_encode(new_port_json)])![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() if(new_port != world.port && !world.OpenPort(new_port)) TGS_ERROR_LOG("Unable to open port [new_port]![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() requesting_new_port = FALSE while(export_lock) @@ -235,7 +235,7 @@ var/port = result[TGS4_PARAMETER_DATA] if(!isnum(port)) - return //this is valid, server may just want use to reboot + return //this is valid, server may just want use to reboot if(port == 0) //to byond 0 means any port and "none" means close vOv @@ -256,33 +256,46 @@ /datum/tgs_api/v4/Revision() return cached_revision -/datum/tgs_api/v4/ChatBroadcast(message, list/channels) +/datum/tgs_api/v4/ChatBroadcast(datum/tgs_message_content/message, list/channels) var/list/ids if(length(channels)) ids = list() for(var/I in channels) var/datum/tgs_chat_channel/channel = I ids += channel.id - message = list("message" = message, "channelIds" = ids) + + message = UpgradeDeprecatedChatMessage(message) + + if (!length(channels)) + return + + message = list("message" = message.text, "channelIds" = ids) if(intercepted_message_queue) intercepted_message_queue += list(message) else Export(TGS4_COMM_CHAT, message) -/datum/tgs_api/v4/ChatTargetedBroadcast(message, admin_only) +/datum/tgs_api/v4/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only) var/list/channels = list() for(var/I in ChatChannelInfo()) var/datum/tgs_chat_channel/channel = I if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id - message = list("message" = message, "channelIds" = channels) + + message = UpgradeDeprecatedChatMessage(message) + + if (!length(channels)) + return + + message = list("message" = message.text, "channelIds" = channels) if(intercepted_message_queue) intercepted_message_queue += list(message) else Export(TGS4_COMM_CHAT, message) -/datum/tgs_api/v4/ChatPrivateMessage(message, datum/tgs_chat_user/user) - message = list("message" = message, "channelIds" = list(user.channel.id)) +/datum/tgs_api/v4/ChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user) + message = UpgradeDeprecatedChatMessage(message) + message = list("message" = message.text, "channelIds" = list(user.channel.id)) if(intercepted_message_queue) intercepted_message_queue += list(message) else diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm index 4ca1500167b..25dd6740e3a 100644 --- a/code/modules/tgs/v4/commands.dm +++ b/code/modules/tgs/v4/commands.dm @@ -3,6 +3,9 @@ custom_commands = list() for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) var/datum/tgs_chat_command/stc = new I + if(stc.ignore_type == I) + continue + var/command_name = stc.name if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\"")) TGS_ERROR_LOG("Custom command [command_name] ([I]) can't be used as it is empty or contains illegal characters!") @@ -34,8 +37,8 @@ var/datum/tgs_chat_command/sc = custom_commands[command] if(sc) - var/result = sc.Run(u, params) - if(result == null) - result = "" - return result + var/datum/tgs_message_content/result = sc.Run(u, params) + result = UpgradeDeprecatedCommandResponse(result, command) + + return result ? result.text : TRUE return "Unknown command: [command]!" diff --git a/code/modules/tgs/v5/README.md b/code/modules/tgs/v5/README.md index 5b48d57a1f0..a8a0c748e7b 100644 --- a/code/modules/tgs/v5/README.md +++ b/code/modules/tgs/v5/README.md @@ -2,7 +2,12 @@ This DMAPI implements bridge requests using HTTP GET requests to TGS. It has no security restrictions. +- [__interop_version.dm](./__interop_version.dm) contains the version of the API used between the DMAPI and TGS. - [_defines.dm](./_defines.dm) contains constant definitions. - [api.dm](./api.dm) contains the bulk of the API code. +- [bridge.dm](./bridge.dm) contains functions related to making bridge requests. +- [chunking.dm](./chunking.dm) contains common function for splitting large raw data sets into chunks BYOND can natively process. - [commands.dm](./commands.dm) contains functions relating to `/datum/tgs_chat_command`s. +- [serializers.dm](./serializers.dm) contains function to help convert interop `/datum`s into a JSON encodable `list()` format. +- [topic.dm](./topic.dm) contains functions related to processing topic requests. - [undefs.dm](./undefs.dm) Undoes the work of `_defines.dm`. diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm new file mode 100644 index 00000000000..1b52b31d6a7 --- /dev/null +++ b/code/modules/tgs/v5/__interop_version.dm @@ -0,0 +1 @@ +"5.6.2" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 10bc4cbe406..bdcd4e4dd58 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -4,16 +4,29 @@ #define DMAPI5_BRIDGE_DATA "data" #define DMAPI5_TOPIC_DATA "tgs_data" +#define DMAPI5_BRIDGE_REQUEST_LIMIT 8198 +#define DMAPI5_TOPIC_REQUEST_LIMIT 65528 +#define DMAPI5_TOPIC_RESPONSE_LIMIT 65529 + #define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0 #define DMAPI5_BRIDGE_COMMAND_STARTUP 1 #define DMAPI5_BRIDGE_COMMAND_PRIME 2 #define DMAPI5_BRIDGE_COMMAND_REBOOT 3 #define DMAPI5_BRIDGE_COMMAND_KILL 4 #define DMAPI5_BRIDGE_COMMAND_CHAT_SEND 5 +#define DMAPI5_BRIDGE_COMMAND_CHUNK 6 #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" #define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" +#define DMAPI5_CHUNK "chunk" +#define DMAPI5_CHUNK_PAYLOAD "payload" +#define DMAPI5_CHUNK_TOTAL "totalChunks" +#define DMAPI5_CHUNK_SEQUENCE_ID "sequenceId" +#define DMAPI5_CHUNK_PAYLOAD_ID "payloadId" + +#define DMAPI5_MISSING_CHUNKS "missingChunks" + #define DMAPI5_RESPONSE_ERROR_MESSAGE "errorMessage" #define DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE "commandType" @@ -25,7 +38,6 @@ #define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort" #define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation" -#define DMAPI5_CHAT_MESSAGE_TEXT "text" #define DMAPI5_CHAT_MESSAGE_CHANNEL_IDS "channelIds" #define DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER "accessIdentifier" @@ -36,6 +48,7 @@ #define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" #define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" #define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" +#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility" #define DMAPI5_CHAT_UPDATE_CHANNELS "channels" @@ -63,8 +76,10 @@ #define DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED 4 #define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 5 #define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 6 -#define DMAPI5_TOPIC_COMMAND_HEARTBEAT 7 +#define DMAPI5_TOPIC_COMMAND_HEALTHCHECK 7 #define DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH 8 +#define DMAPI5_TOPIC_COMMAND_SEND_CHUNK 9 +#define DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK 10 #define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" @@ -75,6 +90,7 @@ #define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate" #define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion" +#define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE "commandResponse" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage" #define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses" @@ -93,6 +109,7 @@ #define DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL "isAdminChannel" #define DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL "isPrivateChannel" #define DMAPI5_CHAT_CHANNEL_TAG "tag" +#define DMAPI5_CHAT_CHANNEL_EMBEDS_SUPPORTED "embedsSupported" #define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" #define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 6735ed5dec5..7226f29bba6 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -4,6 +4,7 @@ var/instance_name var/security_level + var/visibility var/reboot_mode = TGS_REBOOT_MODE_NORMAL @@ -17,12 +18,22 @@ var/initialized = FALSE + var/chunked_requests = 0 + var/list/chunked_topics = list() + + var/detached = FALSE + +/datum/tgs_api/v5/New() + . = ..() + TGS_DEBUG_LOG("V5 API created") + /datum/tgs_api/v5/ApiVersion() return new /datum/tgs_version( - #include "interop_version.dm" + #include "__interop_version.dm" ) /datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) + TGS_DEBUG_LOG("OnWorldNew()") server_port = world.params[DMAPI5_PARAM_SERVER_PORT] access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER] @@ -40,10 +51,11 @@ if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY]) TGS_INFO_LOG("DMAPI validation, exiting...") - del(world) + TerminateWorld() version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] @@ -91,189 +103,46 @@ return TRUE /datum/tgs_api/v5/proc/RequireInitialBridgeResponse() + TGS_DEBUG_LOG("RequireInitialBridgeResponse()") + var/logged = FALSE while(!version) + if(!logged) + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") + logged = TRUE + sleep(1) + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Passed") + /datum/tgs_api/v5/OnInitializationComplete() Bridge(DMAPI5_BRIDGE_COMMAND_PRIME) -/datum/tgs_api/v5/proc/TopicResponse(error_message = null) - var/list/response = list() - response[DMAPI5_RESPONSE_ERROR_MESSAGE] = error_message - - return json_encode(response) - /datum/tgs_api/v5/OnTopic(T) + TGS_DEBUG_LOG("OnTopic()") + RequireInitialBridgeResponse() + TGS_DEBUG_LOG("OnTopic passed bridge request gate") var/list/params = params2list(T) var/json = params[DMAPI5_TOPIC_DATA] if(!json) + TGS_DEBUG_LOG("No \"[DMAPI5_TOPIC_DATA]\" entry found, ignoring...") return FALSE // continue to /world/Topic - var/list/topic_parameters = json_decode(json) - if(!topic_parameters) - return TopicResponse("Invalid topic parameters json!"); - if(!initialized) - TGS_WARNING_LOG("Missed topic due to not being initialized: [T]") - return TRUE // too early to handle, but it's still our responsibility - - var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] - if(their_sCK != access_identifier) - return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] from: [json]!"); - - var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] - if(!isnum(command)) - return TopicResponse("Failed to decode [DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] from: [json]!") - - switch(command) - if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND) - var/result = HandleCustomCommand(topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND]) - if(!result) - result = TopicResponse("Error running chat command!") - return result - if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION) - intercepted_message_queue = list() - var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION] - if(!istype(event_notification)) - return TopicResponse("Invalid [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!") - - var/event_type = event_notification[DMAPI5_EVENT_NOTIFICATION_TYPE] - if(!isnum(event_type)) - return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_TYPE]!") - - var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS] - if(event_parameters && !istype(event_parameters)) - return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") - - var/list/event_call = list(event_type) - if(event_parameters) - event_call += event_parameters - - if(event_handler != null) - event_handler.HandleEvent(arglist(event_call)) - - var/list/response = list() - response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue - intercepted_message_queue = null - return json_encode(response) - if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT) - var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] - if (!isnum(new_port) || !(new_port > 0)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") - - if(event_handler != null) - event_handler.HandleEvent(TGS_EVENT_PORT_SWAP, new_port) - - //the topic still completes, miraculously - //I honestly didn't believe byond could do it without exploding - if(!world.OpenPort(new_port)) - return TopicResponse("Port change failed!") - - return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE) - var/new_reboot_mode = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE] - if(!isnum(new_reboot_mode)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE]!") - - if(event_handler != null) - event_handler.HandleEvent(TGS_EVENT_REBOOT_MODE_CHANGE, reboot_mode, new_reboot_mode) - - reboot_mode = new_reboot_mode - return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED) - var/new_instance_name = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME] - if(!istext(new_instance_name)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME]!") - - if(event_handler != null) - event_handler.HandleEvent(TGS_EVENT_INSTANCE_RENAMED, new_instance_name) - - instance_name = new_instance_name - return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE) - var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE] - if(!istype(chat_update_json)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!") - - DecodeChannels(chat_update_json) - return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE) - var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] - if (!isnum(new_port) || !(new_port > 0)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") - - server_port = new_port - return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_HEARTBEAT) - return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) - var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] - var/error_message = null - if (new_port != null) - if (!isnum(new_port) || !(new_port > 0)) - error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]" - else - server_port = new_port - - var/new_version_string = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION] - if (!istext(new_version_string)) - if(error_message != null) - error_message += ", " - error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]" - else - var/datum/tgs_version/new_version = new(new_version_string) - if (event_handler) - event_handler.HandleEvent(TGS_EVENT_WATCHDOG_REATTACH, new_version) - - version = new_version - - return json_encode(list(DMAPI5_RESPONSE_ERROR_MESSAGE = error_message, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) - - return TopicResponse("Unknown command: [command]") - -/datum/tgs_api/v5/proc/Bridge(command, list/data) - if(!data) - data = list() + TGS_WARNING_LOG("Missed topic due to not being initialized: [json]") + return TRUE // too early to handle, but it's still our responsibility - data[DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE] = command - data[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] = access_identifier - - var/json = json_encode(data) - var/encoded_json = url_encode(json) - - // This is an infinite sleep until we get a response - var/export_response = world.Export("http://127.0.0.1:[server_port]/Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]") - if(!export_response) - TGS_ERROR_LOG("Failed export request: [json]") - return - - var/response_json = file2text(export_response["CONTENT"]) - if(!response_json) - TGS_ERROR_LOG("Failed export request, missing content!") - return - - var/list/bridge_response = json_decode(response_json) - if(!bridge_response) - TGS_ERROR_LOG("Failed export request, bad json: [response_json]") - return - - var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE] - if(error) - TGS_ERROR_LOG("Failed export request, bad request: [error]") - return - - return bridge_response + return ProcessTopicJson(json, TRUE) /datum/tgs_api/v5/OnReboot() var/list/result = Bridge(DMAPI5_BRIDGE_COMMAND_REBOOT) if(!result) return - //okay so the standard TGS4 proceedure is: right before rebooting change the port to whatever was sent to us in the above json's data parameter + //okay so the standard TGS proceedure is: right before rebooting change the port to whatever was sent to us in the above json's data parameter var/port = result[DMAPI5_BRIDGE_RESPONSE_NEW_PORT] if(!isnum(port)) - return //this is valid, server may just want use to reboot + return //this is valid, server may just want use to reboot if(port == 0) //to byond 0 means any port and "none" means close vOv @@ -297,7 +166,15 @@ RequireInitialBridgeResponse() return revision -/datum/tgs_api/v5/ChatBroadcast(message, list/channels) +// Common proc b/c it's used by the V3/V4 APIs +/datum/tgs_api/proc/UpgradeDeprecatedChatMessage(datum/tgs_message_content/message) + if(!istext(message)) + return message + + TGS_WARNING_LOG("Received legacy string when a [/datum/tgs_message_content] was expected. Please audit all calls to TgsChatBroadcast, TgsChatTargetedBroadcast, and TgsChatPrivateMessage to ensure they use the new /datum.") + return new /datum/tgs_message_content(message) + +/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message2, list/channels) if(!length(channels)) channels = ChatChannelInfo() @@ -306,36 +183,53 @@ var/datum/tgs_chat_channel/channel = I ids += channel.id - message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = ids) + message2 = UpgradeDeprecatedChatMessage(message2) + + if (!length(channels)) + return + + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids if(intercepted_message_queue) - intercepted_message_queue += list(message) + intercepted_message_queue += list(data) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) -/datum/tgs_api/v5/ChatTargetedBroadcast(message, admin_only) +/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message2, admin_only) var/list/channels = list() for(var/I in ChatChannelInfo()) var/datum/tgs_chat_channel/channel = I if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id - message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = channels) + + message2 = UpgradeDeprecatedChatMessage(message2) + + if (!length(channels)) + return + + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels if(intercepted_message_queue) - intercepted_message_queue += list(message) + intercepted_message_queue += list(data) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) -/datum/tgs_api/v5/ChatPrivateMessage(message, datum/tgs_chat_user/user) - message = list(DMAPI5_CHAT_MESSAGE_TEXT = message, DMAPI5_CHAT_MESSAGE_CHANNEL_IDS = list(user.channel.id)) +/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user) + message2 = UpgradeDeprecatedChatMessage(message2) + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id) if(intercepted_message_queue) - intercepted_message_queue += list(message) + intercepted_message_queue += list(data) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() + WaitForReattach(TRUE) return chat_channels.Copy() /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) + TGS_DEBUG_LOG("DecodeChannels()") var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] if(istype(chat_channels_json)) chat_channels.Cut() @@ -354,8 +248,13 @@ channel.is_admin_channel = channel_json[DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL] channel.is_private_channel = channel_json[DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL] channel.custom_tag = channel_json[DMAPI5_CHAT_CHANNEL_TAG] + channel.embeds_supported = channel_json[DMAPI5_CHAT_CHANNEL_EMBEDS_SUPPORTED] return channel /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level + +/datum/tgs_api/v5/Visibility() + RequireInitialBridgeResponse() + return visibility diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm new file mode 100644 index 00000000000..37f58bcdf63 --- /dev/null +++ b/code/modules/tgs/v5/bridge.dm @@ -0,0 +1,99 @@ +/datum/tgs_api/v5/proc/Bridge(command, list/data) + if(!data) + data = list() + + var/single_bridge_request = CreateBridgeRequest(command, data) + if(length(single_bridge_request) <= DMAPI5_BRIDGE_REQUEST_LIMIT) + return PerformBridgeRequest(single_bridge_request) + + // chunking required + var/payload_id = ++chunked_requests + + var/raw_data = CreateBridgeData(command, data, FALSE) + + var/list/chunk_requests = GenerateChunks(raw_data, TRUE) + + var/list/response + for(var/bridge_request in chunk_requests) + response = PerformBridgeRequest(bridge_request) + if(!response) + // Abort + return + + var/list/missing_sequence_ids = response[DMAPI5_MISSING_CHUNKS] + if(length(missing_sequence_ids)) + do + TGS_WARNING_LOG("Server is still missing some chunks of bridge P[payload_id]! Sending missing chunks...") + if(!istype(missing_sequence_ids)) + TGS_ERROR_LOG("Did not receive a list() for [DMAPI5_MISSING_CHUNKS]!") + return + + for(var/missing_sequence_id in missing_sequence_ids) + if(!isnum(missing_sequence_id)) + TGS_ERROR_LOG("Did not receive a num in [DMAPI5_MISSING_CHUNKS]!") + return + + var/missing_chunk_request = chunk_requests[missing_sequence_id + 1] + response = PerformBridgeRequest(missing_chunk_request) + if(!response) + // Abort + return + + missing_sequence_ids = response[DMAPI5_MISSING_CHUNKS] + while(length(missing_sequence_ids)) + + return response + +/datum/tgs_api/v5/proc/CreateBridgeRequest(command, list/data) + var/json = CreateBridgeData(command, data, TRUE) + var/encoded_json = url_encode(json) + + var/url = "http://127.0.0.1:[server_port]/Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" + return url + +/datum/tgs_api/v5/proc/CreateBridgeData(command, list/data, needs_auth) + data[DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE] = command + if(needs_auth) + data[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] = access_identifier + + var/json = json_encode(data) + return json + +/datum/tgs_api/v5/proc/WaitForReattach(require_channels = FALSE) + if(detached) + // Wait up to one minute + for(var/i in 1 to 600) + sleep(1) + if(!detached && (!require_channels || length(chat_channels))) + break + + // dad went out for milk and cigarettes 20 years ago... + // yes, this affects all other waiters, intentional + if(i == 600) + detached = FALSE + +/datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) + WaitForReattach(FALSE) + + // This is an infinite sleep until we get a response + var/export_response = world.Export(bridge_request) + if(!export_response) + TGS_ERROR_LOG("Failed bridge request: [bridge_request]") + return + + var/response_json = file2text(export_response["CONTENT"]) + if(!response_json) + TGS_ERROR_LOG("Failed bridge request, missing content!") + return + + var/list/bridge_response = json_decode(response_json) + if(!bridge_response) + TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]") + return + + var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE] + if(error) + TGS_ERROR_LOG("Failed bridge request, bad request: [error]") + return + + return bridge_response diff --git a/code/modules/tgs/v5/chunking.dm b/code/modules/tgs/v5/chunking.dm new file mode 100644 index 00000000000..cd5944d34fb --- /dev/null +++ b/code/modules/tgs/v5/chunking.dm @@ -0,0 +1,43 @@ +/datum/tgs_api/v5/proc/GenerateChunks(payload, bridge) + var/limit = bridge ? DMAPI5_BRIDGE_REQUEST_LIMIT : DMAPI5_TOPIC_RESPONSE_LIMIT + + var/payload_id = ++chunked_requests + var/data_length = length(payload) + + var/chunk_count + var/list/chunk_requests + for(chunk_count = 2; !chunk_requests; ++chunk_count) + var/max_chunk_size = -round(-(data_length / chunk_count)) + if(max_chunk_size > limit) + continue + + chunk_requests = list() + for(var/i in 1 to chunk_count) + var/start_index = 1 + ((i - 1) * max_chunk_size) + if (start_index > data_length) + break + + var/end_index = min(1 + (i * max_chunk_size), data_length + 1) + + var/chunk_payload = copytext(payload, start_index, end_index) + + // sequence IDs in interop chunking are always zero indexed + var/list/chunk = list(DMAPI5_CHUNK_PAYLOAD_ID = payload_id, DMAPI5_CHUNK_SEQUENCE_ID = (i - 1), DMAPI5_CHUNK_TOTAL = chunk_count, DMAPI5_CHUNK_PAYLOAD = chunk_payload) + + var/chunk_request = list(DMAPI5_CHUNK = chunk) + var/chunk_length + if(bridge) + chunk_request = CreateBridgeRequest(DMAPI5_BRIDGE_COMMAND_CHUNK, chunk_request) + chunk_length = length(chunk_request) + else + chunk_request = list(chunk_request) // wrap for adding to list + chunk_length = length(json_encode(chunk_request)) + + if(chunk_length > limit) + // Screwed by encoding, no way to preempt it though + chunk_requests = null + break + + chunk_requests += chunk_request + + return chunk_requests diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm index 6d31dd3422d..9557f8a08ed 100644 --- a/code/modules/tgs/v5/commands.dm +++ b/code/modules/tgs/v5/commands.dm @@ -3,14 +3,17 @@ custom_commands = list() for(var/I in typesof(/datum/tgs_chat_command) - /datum/tgs_chat_command) var/datum/tgs_chat_command/stc = new I + if(stc.ignore_type == I) + continue + var/command_name = stc.name if(!command_name || findtext(command_name, " ") || findtext(command_name, "'") || findtext(command_name, "\"")) - TGS_WARNING_LOG("Custom command [command_name] ([I]) can't be used as it is empty or contains illegal characters!") + TGS_ERROR_LOG("Custom command [command_name] ([I]) can't be used as it is empty or contains illegal characters!") continue if(results[command_name]) var/datum/other = custom_commands[command_name] - TGS_WARNING_LOG("Custom commands [other.type] and [I] have the same name (\"[command_name]\"), only [other.type] will be available!") + TGS_ERROR_LOG("Custom commands [other.type] and [I] have the same name (\"[command_name]\"), only [other.type] will be available!") continue results += list(list(DMAPI5_CUSTOM_CHAT_COMMAND_NAME = command_name, DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT = stc.help_text, DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY = stc.admin_only)) custom_commands[command_name] = stc @@ -30,11 +33,28 @@ var/datum/tgs_chat_command/sc = custom_commands[command] if(sc) - var/text_response = sc.Run(u, params) - var/list/topic_response = list() - if(!istext(text_response)) - TGS_ERROR_LOG("Custom command [command] should return a string! Got: \"[text_response]\"") - text_response = null - topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = text_response - return json_encode(topic_response) + var/datum/tgs_message_content/response = sc.Run(u, params) + response = UpgradeDeprecatedCommandResponse(response, command) + + var/list/topic_response = TopicResponse() + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response ? response.text : null + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response ? response._interop_serialize() : null + return topic_response return TopicResponse("Unknown custom chat command: [command]!") + +// Common proc b/c it's used by the V3/V4 APIs +/datum/tgs_api/proc/UpgradeDeprecatedCommandResponse(datum/tgs_message_content/response, command) + // Backwards compatibility, used to return a string + if(istext(response)) + warned_deprecated_command_runs = warned_deprecated_command_runs || list() + if(!warned_deprecated_command_runs[command]) + TGS_WARNING_LOG("Custom chat command \"[command]\" is still returning a string. This behaviour is deprecated, please upgrade it to return a [/datum/tgs_message_content].") + warned_deprecated_command_runs[command] = TRUE + + return new /datum/tgs_message_content(response) + + if(!istype(response)) + TGS_ERROR_LOG("Custom chat command \"[command]\" should return a [/datum/tgs_message_content]! Got: \"[response]\"") + return null + + return response diff --git a/code/modules/tgs/v5/serializers.dm b/code/modules/tgs/v5/serializers.dm new file mode 100644 index 00000000000..3a32848ad51 --- /dev/null +++ b/code/modules/tgs/v5/serializers.dm @@ -0,0 +1,59 @@ +/datum/tgs_message_content/proc/_interop_serialize() + return list("text" = text, "embed" = embed ? embed._interop_serialize() : null) + +/datum/tgs_chat_embed/proc/_interop_serialize() + CRASH("Base /proc/interop_serialize called on [type]!") + +/datum/tgs_chat_embed/structure/_interop_serialize() + var/list/serialized_fields + if(istype(fields, /list)) + serialized_fields = list() + for(var/datum/tgs_chat_embed/field/field as anything in fields) + serialized_fields += list(field._interop_serialize()) + return list( + "title" = title, + "description" = description, + "url" = url, + "timestamp" = timestamp, + "colour" = colour, + "image" = src.image ? src.image._interop_serialize() : null, + "thumbnail" = thumbnail ? thumbnail._interop_serialize() : null, + "video" = video ? video._interop_serialize() : null, + "footer" = footer ? footer._interop_serialize() : null, + "provider" = provider ? provider._interop_serialize() : null, + "author" = author ? author._interop_serialize() : null, + "fields" = serialized_fields + ) + +/datum/tgs_chat_embed/media/_interop_serialize() + return list( + "url" = url, + "width" = width, + "height" = height, + "proxyUrl" = proxy_url + ) + +/datum/tgs_chat_embed/provider/_interop_serialize() + return list( + "url" = url, + "name" = name + ) + +/datum/tgs_chat_embed/provider/author/_interop_serialize() + . = ..() + .["iconUrl"] = icon_url + .["proxyIconUrl"] = proxy_icon_url + +/datum/tgs_chat_embed/footer/_interop_serialize() + return list( + "text" = text, + "iconUrl" = icon_url, + "proxyIconUrl" = proxy_icon_url + ) + +/datum/tgs_chat_embed/field/_interop_serialize() + return list( + "name" = name, + "value" = value, + "isInline" = is_inline + ) diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm new file mode 100644 index 00000000000..d7d47121381 --- /dev/null +++ b/code/modules/tgs/v5/topic.dm @@ -0,0 +1,270 @@ +/datum/tgs_api/v5/proc/TopicResponse(error_message = null) + var/list/response = list() + if(error_message) + response[DMAPI5_RESPONSE_ERROR_MESSAGE] = error_message + return response + +/datum/tgs_api/v5/proc/ProcessTopicJson(json, check_access_identifier) + TGS_DEBUG_LOG("ProcessTopicJson(..., [check_access_identifier])") + var/list/result = ProcessRawTopic(json, check_access_identifier) + if(!result) + result = TopicResponse("Runtime error!") + else if(!length(result)) + return "{}" // quirk of json_encode is an empty list returns "[]" + + var/response_json = json_encode(result) + if(length(response_json) > DMAPI5_TOPIC_RESPONSE_LIMIT) + // cache response chunks and send the first + var/list/chunks = GenerateChunks(response_json, FALSE) + var/payload_id = chunks[1][DMAPI5_CHUNK][DMAPI5_CHUNK_PAYLOAD_ID] + var/cache_key = ResponseTopicChunkCacheKey(payload_id) + + chunked_topics[cache_key] = chunks + + response_json = json_encode(chunks[1]) + + return response_json + +/datum/tgs_api/v5/proc/ProcessRawTopic(json, check_access_identifier) + TGS_DEBUG_LOG("ProcessRawTopic(..., [check_access_identifier])") + var/list/topic_parameters = json_decode(json) + if(!topic_parameters) + TGS_DEBUG_LOG("ProcessRawTopic: json_decode failed") + return TopicResponse("Invalid topic parameters json: [json]!"); + + var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] + if(check_access_identifier && their_sCK != access_identifier) + TGS_DEBUG_LOG("ProcessRawTopic: access identifier check failed") + return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] or it does not match!") + + var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] + if(!isnum(command)) + TGS_DEBUG_LOG("ProcessRawTopic: command type check failed") + return TopicResponse("Failed to decode [DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]!") + + return ProcessTopicCommand(command, topic_parameters) + +/datum/tgs_api/v5/proc/ResponseTopicChunkCacheKey(payload_id) + return "response[payload_id]" + +/datum/tgs_api/v5/proc/ProcessTopicCommand(command, list/topic_parameters) + TGS_DEBUG_LOG("ProcessTopicCommand([command], ...)") + switch(command) + + if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND) + intercepted_message_queue = list() + var/list/result = HandleCustomCommand(topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND]) + if(!result) + result = TopicResponse("Error running chat command!") + result[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue + intercepted_message_queue = null + return result + + if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION) + var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION] + if(!istype(event_notification)) + return TopicResponse("Invalid [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!") + + var/event_type = event_notification[DMAPI5_EVENT_NOTIFICATION_TYPE] + if(!isnum(event_type)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_TYPE]!") + + var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS] + if(event_parameters && !istype(event_parameters)) + . = TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") + else + var/list/response = TopicResponse() + . = response + if(event_handler != null) + var/list/event_call = list(event_type) + if(event_parameters) + event_call += event_parameters + + intercepted_message_queue = list() + event_handler.HandleEvent(arglist(event_call)) + response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue + intercepted_message_queue = null + + if (event_type == TGS_EVENT_WATCHDOG_DETACH) + detached = TRUE + chat_channels.Cut() // https://github.com/tgstation/tgstation-server/issues/1490 + + return + + if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT) + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + if (!isnum(new_port) || !(new_port > 0)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + + if(event_handler != null) + event_handler.HandleEvent(TGS_EVENT_PORT_SWAP, new_port) + + //the topic still completes, miraculously + //I honestly didn't believe byond could do it without exploding + if(!world.OpenPort(new_port)) + return TopicResponse("Port change failed!") + + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_CHANGE_REBOOT_STATE) + var/new_reboot_mode = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE] + if(!isnum(new_reboot_mode)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_REBOOT_STATE]!") + + if(event_handler != null) + event_handler.HandleEvent(TGS_EVENT_REBOOT_MODE_CHANGE, reboot_mode, new_reboot_mode) + + reboot_mode = new_reboot_mode + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED) + var/new_instance_name = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME] + if(!istext(new_instance_name)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME]!") + + if(event_handler != null) + event_handler.HandleEvent(TGS_EVENT_INSTANCE_RENAMED, new_instance_name) + + instance_name = new_instance_name + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE) + TGS_DEBUG_LOG("ProcessTopicCommand: It's a chat update") + var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE] + if(!istype(chat_update_json)) + TGS_DEBUG_LOG("ProcessTopicCommand: failed \"[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]\" check") + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!") + + DecodeChannels(chat_update_json) + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE) + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + if (!isnum(new_port) || !(new_port > 0)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + + server_port = new_port + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK) + if(event_handler && event_handler.receive_health_checks) + event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK) + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) + detached = FALSE + var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] + var/error_message = null + if (new_port != null) + if (!isnum(new_port) || !(new_port > 0)) + error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]" + else + server_port = new_port + + var/new_version_string = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION] + if (!istext(new_version_string)) + if(error_message != null) + error_message += ", " + error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]" + else + var/datum/tgs_version/new_version = new(new_version_string) + if (event_handler) + event_handler.HandleEvent(TGS_EVENT_WATCHDOG_REATTACH, new_version) + + version = new_version + + var/list/reattach_response = TopicResponse(error_message) + reattach_response[DMAPI5_PARAMETER_CUSTOM_COMMANDS] = ListCustomCommands() + return reattach_response + + if(DMAPI5_TOPIC_COMMAND_SEND_CHUNK) + var/list/chunk = topic_parameters[DMAPI5_CHUNK] + if(!istype(chunk)) + return TopicResponse("Invalid [DMAPI5_CHUNK]!") + + var/payload_id = chunk[DMAPI5_CHUNK_PAYLOAD_ID] + if(!isnum(payload_id)) + return TopicResponse("[DMAPI5_CHUNK_PAYLOAD_ID] is not a number!") + + // Always updated the highest known payload ID + chunked_requests = max(chunked_requests, payload_id) + + var/sequence_id = chunk[DMAPI5_CHUNK_SEQUENCE_ID] + if(!isnum(sequence_id)) + return TopicResponse("[DMAPI5_CHUNK_SEQUENCE_ID] is not a number!") + + var/total_chunks = chunk[DMAPI5_CHUNK_TOTAL] + if(!isnum(total_chunks)) + return TopicResponse("[DMAPI5_CHUNK_TOTAL] is not a number!") + + if(total_chunks == 0) + return TopicResponse("[DMAPI5_CHUNK_TOTAL] is zero!") + + var/payload = chunk[DMAPI5_CHUNK_PAYLOAD] + if(!istext(payload)) + return TopicResponse("[DMAPI5_CHUNK_PAYLOAD] is not text!") + + var/cache_key = "request[payload_id]" + var/payloads = chunked_topics[cache_key] + + if(!payloads) + payloads = new /list(total_chunks) + chunked_topics[cache_key] = payloads + + if(total_chunks != length(payloads)) + chunked_topics -= cache_key + return TopicResponse("Received differing total chunks for same [DMAPI5_CHUNK_PAYLOAD_ID]! Invalidating [DMAPI5_CHUNK_PAYLOAD_ID]!") + + var/pre_existing_chunk = payloads[sequence_id + 1] + if(pre_existing_chunk && pre_existing_chunk != payload) + chunked_topics -= cache_key + return TopicResponse("Received differing payload for same [DMAPI5_CHUNK_SEQUENCE_ID]! Invalidating [DMAPI5_CHUNK_PAYLOAD_ID]!") + + payloads[sequence_id + 1] = payload + + var/list/missing_sequence_ids = list() + for(var/i in 1 to total_chunks) + if(!payloads[i]) + missing_sequence_ids += i - 1 + + if(length(missing_sequence_ids)) + return list(DMAPI5_MISSING_CHUNKS = missing_sequence_ids) + + chunked_topics -= cache_key + var/full_json = jointext(payloads, "") + + return ProcessRawTopic(full_json, FALSE) + + if(DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK) + var/payload_id = topic_parameters[DMAPI5_CHUNK_PAYLOAD_ID] + if(!isnum(payload_id)) + return TopicResponse("[DMAPI5_CHUNK_PAYLOAD_ID] is not a number!") + + // Always updated the highest known payload ID + chunked_requests = max(chunked_requests, payload_id) + + var/list/missing_chunks = topic_parameters[DMAPI5_MISSING_CHUNKS] + if(!istype(missing_chunks) || !length(missing_chunks)) + return TopicResponse("Missing or empty [DMAPI5_MISSING_CHUNKS]!") + + var/sequence_id_to_send = missing_chunks[1] + if(!isnum(sequence_id_to_send)) + return TopicResponse("[DMAPI5_MISSING_CHUNKS] contained a non-number!") + + var/cache_key = ResponseTopicChunkCacheKey(payload_id) + var/list/chunks = chunked_topics[cache_key] + if(!chunks) + return TopicResponse("Unknown response chunk set: P[payload_id]!") + + // sequence IDs in interop chunking are always zero indexed + var/chunk_to_send = chunks[sequence_id_to_send + 1] + if(!chunk_to_send) + return TopicResponse("Sequence ID [sequence_id_to_send] is not present in response chunk P[payload_id]!") + + if(length(missing_chunks) == 1) + // sending last chunk, purge the cache + chunked_topics -= cache_key + + return chunk_to_send + + return TopicResponse("Unknown command: [command]") diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index 5885a60e75c..f163adaaafe 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -4,16 +4,29 @@ #undef DMAPI5_BRIDGE_DATA #undef DMAPI5_TOPIC_DATA +#undef DMAPI5_BRIDGE_REQUEST_LIMIT +#undef DMAPI5_TOPIC_REQUEST_LIMIT +#undef DMAPI5_TOPIC_RESPONSE_LIMIT + #undef DMAPI5_BRIDGE_COMMAND_PORT_UPDATE #undef DMAPI5_BRIDGE_COMMAND_STARTUP #undef DMAPI5_BRIDGE_COMMAND_PRIME #undef DMAPI5_BRIDGE_COMMAND_REBOOT #undef DMAPI5_BRIDGE_COMMAND_KILL #undef DMAPI5_BRIDGE_COMMAND_CHAT_SEND +#undef DMAPI5_BRIDGE_COMMAND_CHUNK #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS +#undef DMAPI5_CHUNK +#undef DMAPI5_CHUNK_PAYLOAD +#undef DMAPI5_CHUNK_TOTAL +#undef DMAPI5_CHUNK_SEQUENCE_ID +#undef DMAPI5_CHUNK_PAYLOAD_ID + +#undef DMAPI5_MISSING_CHUNKS + #undef DMAPI5_RESPONSE_ERROR_MESSAGE #undef DMAPI5_BRIDGE_PARAMETER_COMMAND_TYPE @@ -25,7 +38,6 @@ #undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT #undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION -#undef DMAPI5_CHAT_MESSAGE_TEXT #undef DMAPI5_CHAT_MESSAGE_CHANNEL_IDS #undef DMAPI5_RUNTIME_INFORMATION_ACCESS_IDENTIFIER @@ -36,6 +48,7 @@ #undef DMAPI5_RUNTIME_INFORMATION_REVISION #undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES #undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL +#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY #undef DMAPI5_CHAT_UPDATE_CHANNELS @@ -63,7 +76,7 @@ #undef DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED #undef DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE #undef DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE -#undef DMAPI5_TOPIC_COMMAND_HEARTBEAT +#undef DMAPI5_TOPIC_COMMAND_HEALTHCHECK #undef DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH #undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE @@ -75,6 +88,7 @@ #undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE #undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION +#undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE #undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES @@ -93,6 +107,7 @@ #undef DMAPI5_CHAT_CHANNEL_IS_ADMIN_CHANNEL #undef DMAPI5_CHAT_CHANNEL_IS_PRIVATE_CHANNEL #undef DMAPI5_CHAT_CHANNEL_TAG +#undef DMAPI5_CHAT_CHANNEL_EMBEDS_SUPPORTED #undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME #undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 92d74fbc2b9..ccc866b11de 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -112,4 +112,4 @@ Notes: /proc/closeToolTip(mob/user) if(istype(user)) if(user.client && user.client.tooltips) - user.client.tooltips.hide() \ No newline at end of file + user.client.tooltips.hide() diff --git a/code/modules/vehicles/animal.dm b/code/modules/vehicles/animal.dm index 90057e8976e..7f4e84399ed 100644 --- a/code/modules/vehicles/animal.dm +++ b/code/modules/vehicles/animal.dm @@ -43,4 +43,4 @@ desc = "A structure used to ride animals." icon = 'icons/obj/saddle.dmi' icon_state = "saddle" - w_class = ITEMSIZE_NORMAL \ No newline at end of file + w_class = ITEMSIZE_NORMAL diff --git a/code/modules/vehicles/wasp_torpedo.dm b/code/modules/vehicles/wasp_torpedo.dm index e5010b73219..ae68c4b60e7 100644 --- a/code/modules/vehicles/wasp_torpedo.dm +++ b/code/modules/vehicles/wasp_torpedo.dm @@ -106,4 +106,4 @@ if(2.0) if(prob(50)) torpedo_explosion() - ..() \ No newline at end of file + ..() diff --git a/code/modules/ventcrawl/ventcrawl_verb.dm b/code/modules/ventcrawl/ventcrawl_verb.dm index 45d7dfc237b..9cae495803d 100644 --- a/code/modules/ventcrawl/ventcrawl_verb.dm +++ b/code/modules/ventcrawl/ventcrawl_verb.dm @@ -6,4 +6,4 @@ return var/pipe = start_ventcrawl() if(pipe) - handle_ventcrawl(pipe) \ No newline at end of file + handle_ventcrawl(pipe) diff --git a/dependencies.sh b/dependencies.sh index 6c0eeb5d04f..0e77902f781 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -4,7 +4,7 @@ if [ -z ${GITHUB_ENV+x} ]; then GITHUB_ENV=/dev/null; fi export BYOND_MAJOR=515 echo "BYOND_MAJOR=$BYOND_MAJOR" >> "$GITHUB_ENV" -export BYOND_MINOR=1619 +export BYOND_MINOR=1620 echo "BYOND_MINOR=$BYOND_MINOR" >> "$GITHUB_ENV" export RUST_G_VERSION=v1.2.0+a5 diff --git a/html/changelog.html b/html/changelog.html index c6b5252da1f..b110586641f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,71 @@ -->
+

20 November 2023

+

Acetrea updated:

+ +

DreamySkrell updated:

+ +

FluffyGhost updated:

+ +

Geeves updated:

+ +

GeneralCamo, NobleRow updated:

+ +

Lavillastrangiato updated:

+ +

Pirouette, StevIII updated:

+ +

RustingWithYou updated:

+ +

SleepyGemmy updated:

+ +

13 November 2023

CampinKiller24 updated: