From e9e1305b9c6115b8fccbee4c2a6c5c1ec92b391a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 00:46:45 -0500 Subject: [PATCH 01/25] Automatic TGS DMAPI Update (#3245) This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging. Co-authored-by: github-actions --- code/__DEFINES/tgs.dm | 100 ++++++++++++++------ code/modules/tgs/README.md | 2 +- code/modules/tgs/core/README.md | 2 +- code/modules/tgs/core/byond_world_export.dm | 22 +++++ code/modules/tgs/core/core.dm | 7 +- code/modules/tgs/core/datum.dm | 2 +- code/modules/tgs/includes.dm | 1 + code/modules/tgs/v5/__interop_version.dm | 2 +- code/modules/tgs/v5/_defines.dm | 1 + code/modules/tgs/v5/api.dm | 7 +- code/modules/tgs/v5/bridge.dm | 21 ++-- code/modules/tgs/v5/topic.dm | 4 +- code/modules/tgs/v5/undefs.dm | 2 +- 13 files changed, 125 insertions(+), 48 deletions(-) create mode 100644 code/modules/tgs/core/byond_world_export.dm diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index e2c89df90e9b..42f2d5fc31fe 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,18 +1,19 @@ // tgstation-server DMAPI +// The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in IETF RFC 2119. -#define TGS_DMAPI_VERSION "7.1.2" +#define TGS_DMAPI_VERSION "7.3.0" // All functions and datums outside this document are subject to change with any version and should not be relied on. // CONFIGURATION -/// Create this define if you want to do TGS configuration outside of this file. +/// Consumers SHOULD create this define if you want to do TGS configuration outside of this file. #ifndef TGS_EXTERNAL_CONFIGURATION -// Comment this out once you've filled in the below. +// Consumers MUST comment this out once you've filled in the below and are not using [TGS_EXTERNAL_CONFIGURATION]. #error TGS API unconfigured -// Uncomment this if you wish to allow the game to interact with TGS 3.. +// Consumers MUST uncomment this if you wish to allow the game to interact with TGS version 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 @@ -52,7 +53,7 @@ #ifndef TGS_FILE2TEXT_NATIVE #ifdef file2text -#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You can fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses +#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You SHOULD fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses #endif #define TGS_FILE2TEXT_NATIVE file2text #endif @@ -152,16 +153,17 @@ //REQUIRED HOOKS /** - * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! + * Consumers MUST call this somewhere in [/world/proc/New] that is always run. This function may sleep! * * * event_handler - Optional user defined [/datum/tgs_event_handler]. * * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED]. + * * http_handler - Optional user defined [/datum/tgs_http_handler]. */ -/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) +/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler) return /** - * Call this when your initializations are complete and your game is ready to play before any player interactions happen. + * Consumers MUST call this when world initializations are complete and the game is ready to play before any player interactions happen. * * 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 @@ -170,12 +172,10 @@ /world/proc/TgsInitializationComplete() return -/// Put this at the start of [/world/proc/Topic]. +/// Consumers MUST run this macro at the start of [/world/proc/Topic]. #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return -/** - * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()). - */ +/// Consumers MUST call this as late as possible in [world/proc/Reboot] (BEFORE ..()). /world/proc/TgsReboot() return @@ -269,7 +269,7 @@ /// The [/datum/tgs_chat_channel] the user was from. var/datum/tgs_chat_channel/channel -/// User definable handler for TGS events. +/// User definable handler for TGS events This abstract version SHOULD be overridden to be used. /datum/tgs_event_handler /// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events. var/receive_health_checks = FALSE @@ -283,7 +283,41 @@ set waitfor = FALSE return -/// User definable chat command. +/// User definable handler for HTTP calls. This abstract version MUST be overridden to be used. +/datum/tgs_http_handler + +/** + * User definable callback for executing HTTP GET requests. + * MUST perform BYOND sleeps while the request is in flight. + * MUST return a [/datum/tgs_http_result]. + * SHOULD log its own errors + * + * url - The full URL to execute the GET request for including query parameters. + */ +/datum/tgs_http_handler/proc/PerformGet(url) + CRASH("[type]/PerformGet not implemented!") + +/// Result of a [/datum/tgs_http_handler] call. MUST NOT be overridden. +/datum/tgs_http_result + /// HTTP response as text + var/response_text + /// Boolean request success flag. Set for any 2XX response code. + var/success + +/** + * Create a [/datum/tgs_http_result]. + * + * * response_text - HTTP response as text. Must be provided in New(). + * * success - Boolean request success flag. Set for any 2XX response code. Must be provided in New(). + */ +/datum/tgs_http_result/New(response_text, success) + if(response_text && !istext(response_text)) + CRASH("response_text was not text!") + + src.response_text = response_text + src.success = success + +/// User definable chat command. This abstract version MUST be overridden to be used. /datum/tgs_chat_command /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`. var/name = "" @@ -296,21 +330,27 @@ /** * Process command activation. Should return a [/datum/tgs_message_content] to respond to the issuer with. + * MUST be implemented * - * sender - The [/datum/tgs_chat_user] who issued the command. - * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. + * * sender - The [/datum/tgs_chat_user] who issued the command. + * * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. */ /datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params) CRASH("[type] has no implementation for Run()") -/// User definable chat message. +/// User definable chat message. MUST NOT be overridden. /datum/tgs_message_content - /// The tring content of the message. Must be provided in New(). + /// The string 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 +/** + * Create a [/datum/tgs_message_content]. + * + * * text - The string content of the message. + */ /datum/tgs_message_content/New(text) ..() if(!istext(text)) @@ -319,7 +359,7 @@ 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. +/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/message#embed-object for details. /datum/tgs_chat_embed/structure var/title var/description @@ -331,13 +371,13 @@ /// 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. + /// See https://discord.com/developers/docs/resources/message#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. + /// See https://discord.com/developers/docs/resources/message#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. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-video-structure for details. var/datum/tgs_chat_embed/media/video var/datum/tgs_chat_embed/footer/footer @@ -346,7 +386,7 @@ var/list/datum/tgs_chat_embed/field/fields -/// Common datum for similar discord embed medias. +/// Common datum for similar Discord embed medias. /datum/tgs_chat_embed/media /// Must be set in New(). var/url @@ -354,6 +394,7 @@ var/height var/proxy_url +/// Create a [/datum/tgs_chat_embed]. /datum/tgs_chat_embed/media/New(url) ..() if(!istext(url)) @@ -361,13 +402,14 @@ src.url = url -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure for details. +/// See https://discord.com/developers/docs/resources/message#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 +/// Create a [/datum/tgs_chat_embed/footer]. /datum/tgs_chat_embed/footer/New(text) ..() if(!istext(text)) @@ -375,16 +417,17 @@ src.text = text -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure for details. +/// See https://discord.com/developers/docs/resources/message#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(). +/// See https://discord.com/developers/docs/resources/message#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 +/// Create a [/datum/tgs_chat_embed/footer]. /datum/tgs_chat_embed/provider/author/New(name) ..() if(!istext(name)) @@ -392,12 +435,15 @@ 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(). +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-field-structure for details. /datum/tgs_chat_embed/field + /// Must be set in New(). var/name + /// Must be set in New(). var/value var/is_inline +/// Create a [/datum/tgs_chat_embed/field]. /datum/tgs_chat_embed/field/New(name, value) ..() if(!istext(name)) diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md index 6319028d8106..35ca73d7e9a8 100644 --- a/code/modules/tgs/README.md +++ b/code/modules/tgs/README.md @@ -1,6 +1,6 @@ # DMAPI Internals -This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. +This folder should be placed on its own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. - [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest. - The [core](./core) folder includes all code not directly part of any API version. diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md index b82d8f49e297..965e21b549a3 100644 --- a/code/modules/tgs/core/README.md +++ b/code/modules/tgs/core/README.md @@ -3,7 +3,7 @@ This folder contains all DMAPI code not directly involved in an API. - [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals. +- [byond_world_export.dm](./byond_world_export.dm) contains the default `/datum/tgs_http_handler` implementation which uses `world.Export()`. - [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 -- diff --git a/code/modules/tgs/core/byond_world_export.dm b/code/modules/tgs/core/byond_world_export.dm new file mode 100644 index 000000000000..6ef8d841b8f7 --- /dev/null +++ b/code/modules/tgs/core/byond_world_export.dm @@ -0,0 +1,22 @@ +/datum/tgs_http_handler/byond_world_export + +/datum/tgs_http_handler/byond_world_export/PerformGet(url) + // This is an infinite sleep until we get a response + var/export_response = world.Export(url) + TGS_DEBUG_LOG("byond_world_export: Export complete") + + if(!export_response) + TGS_ERROR_LOG("byond_world_export: Failed request: [url]") + return new /datum/tgs_http_result(null, FALSE) + + var/content = export_response["CONTENT"] + if(!content) + TGS_ERROR_LOG("byond_world_export: Failed request, missing content!") + return new /datum/tgs_http_result(null, FALSE) + + var/response_json = TGS_FILE2TEXT_NATIVE(content) + if(!response_json) + TGS_ERROR_LOG("byond_world_export: Failed request, failed to load content!") + return new /datum/tgs_http_result(null, FALSE) + + return new /datum/tgs_http_result(response_json, TRUE) diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 15622228e91f..63cb5a2c3514 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -1,4 +1,4 @@ -/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) +/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler = null) var/current_api = TGS_READ_GLOBAL(tgs) if(current_api) TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?") @@ -55,7 +55,10 @@ TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]") event_handler = null - var/datum/tgs_api/new_api = new api_datum(event_handler, version) + if(!http_handler) + http_handler = new /datum/tgs_http_handler/byond_world_export + + var/datum/tgs_api/new_api = new api_datum(event_handler, version, http_handler) TGS_WRITE_GLOBAL(tgs, new_api) diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index f734fd0527f0..3ca53e9bf7c6 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -6,7 +6,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) var/list/warned_deprecated_command_runs -/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version) +/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler) ..() src.event_handler = event_handler src.version = version diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm index 23b714f9d064..f5118ed55a3c 100644 --- a/code/modules/tgs/includes.dm +++ b/code/modules/tgs/includes.dm @@ -1,4 +1,5 @@ #include "core\_definitions.dm" +#include "core\byond_world_export.dm" #include "core\core.dm" #include "core\datum.dm" #include "core\tgs_version.dm" diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index f4806f7adb97..29ea239ad84d 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.9.0" +"5.10.0" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 92c7a8388a71..a47bfd78000b 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -95,6 +95,7 @@ #define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion" #define DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE "broadcastMessage" +#define DMAPI5_TOPIC_RESPONSE_CLIENT_COUNT "clientCount" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE "commandResponse" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage" #define DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES "chatResponses" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 95b8edd3ee5c..3e328fc7c27d 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -31,9 +31,12 @@ var/detached = FALSE -/datum/tgs_api/v5/New() + var/datum/tgs_http_handler/http_handler + +/datum/tgs_api/v5/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler) . = ..() interop_version = version + src.http_handler = http_handler TGS_DEBUG_LOG("V5 API created: [json_encode(args)]") /datum/tgs_api/v5/ApiVersion() @@ -50,7 +53,9 @@ version = null // we want this to be the TGS version, not the interop version // sleep once to prevent an issue where world.Export on the first tick can hang indefinitely + TGS_DEBUG_LOG("Starting Export bug prevention sleep tick. time:[world.time] sleep_offline:[world.sleep_offline]") sleep(world.tick_lag) + TGS_DEBUG_LOG("Export bug prevention sleep complete") var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort())) if(!istype(bridge_response)) diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index 0c5e701a32b6..62201fcc9e58 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -78,27 +78,24 @@ WaitForReattach(FALSE) TGS_DEBUG_LOG("Bridge request start") - // This is an infinite sleep until we get a response - var/export_response = world.Export(bridge_request) + var/datum/tgs_http_result/result = http_handler.PerformGet(bridge_request) TGS_DEBUG_LOG("Bridge request complete") - if(!export_response) - TGS_ERROR_LOG("Failed bridge request: [bridge_request]") + if(isnull(result)) + TGS_ERROR_LOG("Failed bridge request, handler returned null!") return - var/content = export_response["CONTENT"] - if(!content) - TGS_ERROR_LOG("Failed bridge request, missing content!") + if(!istype(result) || result.type != /datum/tgs_http_result) + TGS_ERROR_LOG("Failed bridge request, handler returned non-[/datum/tgs_http_result]!") return - var/response_json = TGS_FILE2TEXT_NATIVE(content) - if(!response_json) - TGS_ERROR_LOG("Failed bridge request, failed to load content!") + if(!result.success) + TGS_DEBUG_LOG("Failed bridge request, HTTP request failed!") return - var/list/bridge_response = json_decode(response_json) + var/list/bridge_response = json_decode(result.response_text) if(!bridge_response) - TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]") + TGS_ERROR_LOG("Failed bridge request, bad json: [result.response_text]") return var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE] diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index e1f2cb638578..59e5e63e5cd4 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -149,7 +149,9 @@ if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK) if(event_handler && event_handler.receive_health_checks) event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK) - return TopicResponse() + var/list/health_check_response = TopicResponse() + health_check_response[DMAPI5_TOPIC_RESPONSE_CLIENT_COUNT] = TGS_CLIENT_COUNT + return health_check_response; if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) detached = FALSE diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index 237207fdfd05..acd19dfa6411 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -18,7 +18,6 @@ #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS -#undef DMAPI5_PARAMETER_TOPIC_PORT #undef DMAPI5_CHUNK #undef DMAPI5_CHUNK_PAYLOAD @@ -95,6 +94,7 @@ #undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION #undef DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE +#undef DMAPI5_TOPIC_RESPONSE_CLIENT_COUNT #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE #undef DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES From a65efb61ac1d47c88756ff97ecdf269646be9944 Mon Sep 17 00:00:00 2001 From: Theos Date: Thu, 17 Oct 2024 01:51:33 -0400 Subject: [PATCH 02/25] Being thrown over lava now doesn't cause you to fall into it (#3577) ## About The Pull Request Buff to jump boots and kepori trying to make the beef jump ## Why It's Good For The Game im. over the lava.i m oiver it. it cant touch me. because im. not in it. ## Changelog :cl: balance: being thrown over lava by tackling, jump boots, or with assistance now fully clears the lava instead of burning you horribly and setting you on fire /:cl: --- code/game/turfs/open/lava.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 90fd6610721c..159a32a2ccce 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -169,7 +169,7 @@ else if (isliving(thing)) . = 1 var/mob/living/L = thing - if(L.movement_type & FLYING) + if(L.movement_type & FLYING || L.throwing) continue //YOU'RE FLYING OVER IT var/buckle_check = L.buckling if(!buckle_check) From ae151ed656f56162f6b820291cee96f04b382c9f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 17 Oct 2024 01:01:53 -0500 Subject: [PATCH 03/25] Automatic changelog generation for PR #3577 [ci skip] --- html/changelogs/AutoChangeLog-pr-3577.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3577.yml diff --git a/html/changelogs/AutoChangeLog-pr-3577.yml b/html/changelogs/AutoChangeLog-pr-3577.yml new file mode 100644 index 000000000000..6d6ee83313d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3577.yml @@ -0,0 +1,6 @@ +author: SomeguyManperson +changes: + - {balance: 'being thrown over lava by tackling, jump boots, or with assistance + now fully clears the lava instead of burning you horribly and setting you on + fire'} +delete-after: true From b00b2336d84fd2da3ac908a07cf03a03a71bda9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 05:58:13 +0000 Subject: [PATCH 04/25] Bump dompurify from 2.3.1 to 2.5.4 in /tgui (#3379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.3.1 to 2.5.4.
Release notes

Sourced from dompurify's releases.

DOMPurify 2.5.4

  • Fixed a bug with latest isNaN checks affecting MSIE, thanks @​tulach
  • Fixed the tests for MSIE and fixed related test-runner

DOMPurify 2.5.3

  • Fixed several mXSS variations found by and thanks to @​kevin-mizu & @​Ry0taK
  • Added better configurability for comment scrubbing default behavior
  • Added better hardening against Prototype Pollution attacks, thanks @​kevin-mizu
  • Fixed some smaller issues in README and other documentation

DOMPurify 2.5.2

  • Addressed and fixed a mXSS variation found by @​kevin-mizu
  • Addressed and fixed a mXSS variation found by Adam Kues of Assetnote
  • Updated tests for older Safari and Chrome versions

DOMPurify 2.5.1

  • Fixed an mXSS sanitizer bypass reported by @​icesfont
  • Added new code to track element nesting depth
  • Added new code to enforce a maximum nesting depth of 255
  • Added coverage tests and necessary clobbering protections

Note that this is a security release and should be upgraded to immediately. Please also note that further releases may follow as the underlying vulnerability is apparently new and further variations may be discovered.

DOMPurify 2.5.0

  • Added new setting SAFE_FOR_XML to enable better control over comment scrubbing
  • Updated the LICENSE file to show the accurate year number
  • Updated several build and test dependencies

DOMPurify 2.4.9

  • Fixed another conditional bypass caused by Processing Instructions, thanks @​Ry0taK
  • Fixed the regex for HTML Custom Element detection, thanks @​AlekseySolovey3T

DOMPurify 2.4.8

  • Fixed two possible bypasses when sanitizing an XML document and later using it in HTML, thanks @​Slonser

DOMPurify 2.4.7

DOMPurify 2.4.6

  • Fixed a bypass in jsdom 22 in case the noframes element is permitted, thanks @​leeN

DOMPurify 2.4.5

  • Fixed a problem with improper reset of custom HTML options, thanks @​ammaraskar

DOMPurify 2.4.4

DOMPurify 2.4.3

  • Final release that is compatible with MSIE10 & MSIE 11

... (truncated)

Commits
  • 10c1261 docs: Updated README ever so slightly
  • 1c92880 test: Fixed two more tests for MSIE11 and Edge 18
  • 1401208 test: Fixed more tests for MSIE and Edge 18
  • 2c6410a test: Fixed several new tests for MSIE11 and Edge 18
  • 2c9bca9 test: Changed github config to include MSIE tests for 2.x
  • b188787 chore: Preparing 2.5.4 release
  • 707b3d6 fix: Added a better for for the MSIE iNaN issue
  • 62fe3be test: Attempting to get MSIE 11 back into the browser test array
  • f3a9710 fix: Fixed an issue with MSIE and no support for Number.isNaN
  • e1ddfc7 Merge branch '2.x' of github.com:cure53/DOMPurify into 2.x
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dompurify&package-manager=npm_and_yarn&previous-version=2.3.1&new-version=2.5.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/shiptest-ss13/Shiptest/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tgui/packages/tgui-panel/package.json | 2 +- tgui/packages/tgui/package.json | 2 +- tgui/yarn.lock | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tgui/packages/tgui-panel/package.json b/tgui/packages/tgui-panel/package.json index d60ccaaa9b17..f652b74df909 100644 --- a/tgui/packages/tgui-panel/package.json +++ b/tgui/packages/tgui-panel/package.json @@ -4,7 +4,7 @@ "version": "4.3.1", "dependencies": { "common": "workspace:*", - "dompurify": "^2.3.1", + "dompurify": "^2.5.4", "inferno": "^7.4.8", "tgui": "workspace:*", "tgui-dev-server": "workspace:*", diff --git a/tgui/packages/tgui/package.json b/tgui/packages/tgui/package.json index 74ef5f346242..11c36177807e 100644 --- a/tgui/packages/tgui/package.json +++ b/tgui/packages/tgui/package.json @@ -7,7 +7,7 @@ "@types/marked": "^4.0.8", "common": "workspace:*", "dateformat": "^4.5.1", - "dompurify": "^2.3.1", + "dompurify": "^2.5.4", "highlight.js": "^11.5.1", "inferno": "^7.4.8", "inferno-vnode-flags": "^7.4.8", diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 6bb17b2fc675..0bbf5add1c91 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -3910,10 +3910,10 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^2.3.1": - version: 2.3.1 - resolution: "dompurify@npm:2.3.1" - checksum: 9c93cfaa9d1d0b31aa2e926ebfa0621287a63ebb16277c94ad4aad2bcf3ad12e609e699fc10f2eaf69e4698e29a31dec87a69f3c6725ce3f4c7a69ee93123d0c +"dompurify@npm:^2.5.4": + version: 2.5.7 + resolution: "dompurify@npm:2.5.7" + checksum: 9652139743130b5ebaf5278fadec06d9b3920019b80c205565b9b8d52cd0cea90ff690c1994c5c0da5bc9d57a94dc19236cdf1ccabdc1c6cff7c255e1e597031 languageName: node linkType: hard @@ -8953,7 +8953,7 @@ resolve@^2.0.0-next.3: resolution: "tgui-panel@workspace:packages/tgui-panel" dependencies: common: "workspace:*" - dompurify: ^2.3.1 + dompurify: ^2.5.4 inferno: ^7.4.8 tgui: "workspace:*" tgui-dev-server: "workspace:*" @@ -9037,7 +9037,7 @@ resolve@^2.0.0-next.3: "@types/marked": ^4.0.8 common: "workspace:*" dateformat: ^4.5.1 - dompurify: ^2.3.1 + dompurify: ^2.5.4 highlight.js: ^11.5.1 inferno: ^7.4.8 inferno-vnode-flags: ^7.4.8 From e20f2d8e3b6592ea1a03f392ce05ab37d1373a2e Mon Sep 17 00:00:00 2001 From: meem <75212565+meemofcourse@users.noreply.github.com> Date: Thu, 17 Oct 2024 14:55:24 -0300 Subject: [PATCH 05/25] Atlas-class Light Armored Crusier (#3246) ## About The Pull Request ![imagen](https://github.com/user-attachments/assets/e76c2cc9-9b25-496b-b8ff-a82b3b4debc1) ![atlas2](https://github.com/user-attachments/assets/3ca2427c-e333-4d87-8202-9f81842378b3) The Atlas-class is the first Colonial League ship following the CLIP Rework. The decaling and general decoration of the ship needs a revision, but otherwise, it is intended as a small, overall generalist patrol vessel to the likes of the Vaquero. The 4-Minutemen team, lead by one Sergeant, is subordinate to the First Officer and Captain, who overlook the operation of the ship by the Corpsman and the Engineer. It is staffed by: * 1 Captain * 1 First Officer * 1 Sergeant * 1 Corpsman * 1 Engineer * 4 Minutemen * 1 Deckhand ## Why It's Good For The Game it's the clip ship it uses the colon league content ## Changelog :cl: add: Atlas-class Light Armored Crusier /:cl: --------- Signed-off-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Signed-off-by: meem <75212565+meemofcourse@users.noreply.github.com> Co-authored-by: rye-rice <58402542+rye-rice@users.noreply.github.com> --- _maps/configs/minutemen_atlas.json | 50 + _maps/shuttles/minutemen/minutemen_atlas.dmm | 5988 +++++++++++++++++ .../syndicate/syndicate_gorlex_komodo.dmm | 25 +- .../machinery/porta_turret/portable_turret.dm | 4 + code/game/machinery/suit_storage_unit.dm | 7 + code/game/objects/items/storage/guncases.dm | 6 + .../clothing/outfits/factions/minutemen.dm | 41 +- .../clip_lanchester/ballistics.dm | 8 +- 8 files changed, 6079 insertions(+), 50 deletions(-) create mode 100644 _maps/configs/minutemen_atlas.json create mode 100644 _maps/shuttles/minutemen/minutemen_atlas.dmm diff --git a/_maps/configs/minutemen_atlas.json b/_maps/configs/minutemen_atlas.json new file mode 100644 index 000000000000..32f30caa5b75 --- /dev/null +++ b/_maps/configs/minutemen_atlas.json @@ -0,0 +1,50 @@ + { + "$schema": "https://raw.githubusercontent.com/shiptest-ss13/Shiptest/master/_maps/ship_config_schema.json", + "map_name": "Atlas-class Light Armored Crusier", + "prefix": "CMSV", + "namelists": ["GENERAL", "CLIP MINUTEMEN", "NATURAL_AGGRESSIVE"], + "description": "The Atlas-Class is the designation for some of the oldest serving vessels in the Confederated League's military fleet. Originally the Atlantas-class, the design of the Atlantas was taken by the Colonial Militia just before the beginning of the war with the Old Frontiersmen, playing a pivotal role in multiple skirmishes. It is small in size and crew, well-rounded, and well-suited as an unexpensive hit-and-run vessel. Despite its age, the Atlas continues to serve the Confederated League for peacekeeping missions and driving off small crews of pirates from colonies.", + "tags": [ + "Combat", + "Generalist" + ], + "map_short_name": "Atlas-class", + "faction": "/datum/faction/clip", + "starting_funds": 1000, + "map_path": "_maps/shuttles/minutemen/minutemen_atlas.dmm", + "limit": 1, + "job_slots": { + "Captain": { + "outfit": "/datum/outfit/job/clip/minutemen/captain", + "officer": true, + "slots": 1 + }, + "First Officer": { + "outfit": "/datum/outfit/job/clip/first_officer", + "officer": true, + "slots": 1 + }, + "Sergeant": { + "outfit": "/datum/outfit/job/clip/minutemen/grunt/lead", + "officer": true, + "slots": 1 + }, + "Corpsman": { + "outfit": "/datum/outfit/job/clip/minutemen/doctor", + "slots": 1 + }, + "Engineer": { + "outfit": "/datum/outfit/job/clip/minutemen/engineer", + "slots": 1 + }, + "Minuteman": { + "outfit": "/datum/outfit/job/clip/minutemen/grunt", + "slots": 4 + }, + "Reservist": { + "outfit": "/datum/outfit/job/clip/minutemen/grunt/reserve", + "slots": 1 + } + }, + "enabled": true +} diff --git a/_maps/shuttles/minutemen/minutemen_atlas.dmm b/_maps/shuttles/minutemen/minutemen_atlas.dmm new file mode 100644 index 000000000000..407a8f00bcfe --- /dev/null +++ b/_maps/shuttles/minutemen/minutemen_atlas.dmm @@ -0,0 +1,5988 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/turf_decal/corner/transparent/blue{ + dir = 9 + }, +/obj/structure/table/chem, +/obj/item/paper_bin{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 6 + }, +/obj/item/folder/white{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/folder/white{ + pixel_x = -8; + pixel_y = 2 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"af" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"am" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"aw" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"aC" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/spline/fancy/opaque/white/corner, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"aI" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"aS" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"aX" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"bF" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4, +/turf/open/floor/plating/airless, +/area/ship/engineering) +"bK" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"bQ" = ( +/obj/structure/sign/poster/clip/bard{ + pixel_y = 32 + }, +/obj/effect/turf_decal/techfloor{ + dir = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"bS" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"cc" = ( +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"cm" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"ct" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/transparent/blue/line{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"cN" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/steeldecal/steel_decals_central3{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"cV" = ( +/obj/structure/sign/poster/clip/random{ + pixel_y = -32 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/carpet/nanoweave/blue, +/area/ship/crew/crewtwo) +"cY" = ( +/obj/effect/turf_decal/corner/transparent/blue/border{ + dir = 4 + }, +/obj/effect/turf_decal/corner/transparent/blue/mono, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/curtain/cloth, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/turf/open/floor/plasteel/mono/white, +/area/ship/medical) +"da" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewtwo) +"di" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atlas_dorms" + }, +/turf/open/floor/plating, +/area/ship/crew) +"dw" = ( +/obj/effect/turf_decal/minutemen/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"dM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"dV" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"ec" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/mono/dark, +/area/ship/hallway/central) +"em" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/tech, +/area/ship/crew/canteen) +"ev" = ( +/obj/effect/decal/fakelattice, +/obj/structure/railing, +/turf/open/floor/plasteel/elevatorshaft, +/area/ship/hallway/central) +"eB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/grunge{ + name = "Bathroom" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"eH" = ( +/obj/structure/closet/secure_closet{ + icon_state = "cap"; + name = "captain's locker"; + req_access_txt = "20" + }, +/obj/item/storage/pistolcase/cm23, +/obj/item/clothing/suit/armor/clip_capcoat{ + pixel_x = -14 + }, +/obj/item/clothing/under/clip/officer{ + pixel_x = 13 + }, +/obj/item/clothing/under/clip/officer/alt{ + pixel_x = 13 + }, +/obj/item/radio/headset/clip/captain{ + pixel_x = 7 + }, +/obj/item/clothing/head/clip/slouch/officer{ + pixel_y = 13 + }, +/obj/item/storage/backpack/satchel/sec/clip{ + pixel_y = -15 + }, +/obj/item/storage/backpack/security/clip{ + pixel_y = -15 + }, +/turf/open/floor/carpet/blue, +/area/ship/crew/crewthree) +"eJ" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"eK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/tech, +/area/ship/crew/canteen) +"eU" = ( +/obj/effect/landmark/start/security_officer, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"eW" = ( +/obj/effect/decal/cleanable/confetti, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"fd" = ( +/obj/structure/railing{ + layer = 3.31 + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + dir = 8; + color = "#75A2BB" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ + dir = 8 + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"fg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = 20; + pixel_x = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"fi" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"fj" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/industrial/warning{ + layer = 2.456; + dir = 1 + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"fp" = ( +/obj/structure/table, +/obj/machinery/jukebox/boombox, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"fs" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"fF" = ( +/obj/effect/turf_decal/corner/transparent/blue/mono, +/obj/machinery/light/small/directional/east, +/obj/structure/sink{ + pixel_y = 19; + pixel_x = 7 + }, +/turf/open/floor/plasteel/mono/white, +/area/ship/medical) +"fL" = ( +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 + }, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 10 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew/canteen) +"fM" = ( +/obj/structure/cable{ + icon_state = "6-8" + }, +/obj/structure/cable{ + icon_state = "1-6" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"fR" = ( +/turf/open/floor/carpet/blue, +/area/ship/crew) +"gk" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/structure/janitorialcart{ + dir = 8 + }, +/obj/item/mop{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew/canteen) +"gu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"gw" = ( +/obj/effect/turf_decal/corner/transparent/blue{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/medical{ + name = "Medical Bay" + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"gy" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/corner/transparent/blue/mono, +/obj/machinery/light/small/directional/west, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/mono/white, +/area/ship/medical) +"gA" = ( +/obj/machinery/holopad/emergency/command, +/obj/effect/turf_decal/minutemen/middle, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"gE" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"gF" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/effect/turf_decal/minutemen/edge{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"gH" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/industrial/warning{ + layer = 2.456 + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"gR" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atlas_fo" + }, +/turf/open/floor/plating, +/area/ship/crew/crewtwo) +"gT" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/security) +"gU" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"hg" = ( +/obj/effect/turf_decal/trimline/transparent/blue/line, +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -23 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"hq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"hL" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"hQ" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/chair, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"hR" = ( +/obj/structure/table/wood, +/obj/structure/sign/poster/official/moth/smokey{ + pixel_x = -32 + }, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"ia" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"is" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"iw" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"ix" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 4; + layer = 2.456 + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"iN" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "2-9" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) +"iO" = ( +/obj/structure/table/reinforced, +/obj/machinery/fax/clip{ + pixel_y = 7 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"iQ" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"iS" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"iW" = ( +/obj/structure/closet/secure_closet{ + icon_state = "cap"; + name = "first officer's locker"; + req_access_txt = "19" + }, +/obj/item/storage/pistolcase/cm23{ + pixel_y = -4 + }, +/obj/item/clothing/head/clip/slouch/officer{ + pixel_y = 13 + }, +/obj/item/radio/headset/clip/captain{ + pixel_x = 7 + }, +/obj/item/clothing/under/clip/officer/alt{ + pixel_x = 13 + }, +/obj/item/clothing/under/clip/officer{ + pixel_x = 13 + }, +/obj/item/clothing/suit/toggle/lawyer/clip/fo{ + pixel_x = -13 + }, +/obj/item/storage/backpack/satchel/sec/clip{ + pixel_y = -15 + }, +/obj/item/storage/backpack/security/clip{ + pixel_y = -15 + }, +/turf/open/floor/carpet/nanoweave/blue, +/area/ship/crew/crewtwo) +"jc" = ( +/obj/machinery/door/window/brigdoor/southright{ + req_access = list(3); + dir = 4 + }, +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"jp" = ( +/obj/structure/sign/number/random, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewtwo) +"js" = ( +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"jG" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/transparent/blue/line{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"jI" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"jL" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"jQ" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 7; + pixel_x = 12 + }, +/obj/item/melee/chainofcommand{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"jR" = ( +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) +"jY" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"jZ" = ( +/obj/item/chair{ + dir = 8; + pixel_y = -10; + pixel_x = 5 + }, +/obj/item/cigbutt{ + pixel_x = -5; + pixel_y = -4 + }, +/obj/item/cigbutt{ + pixel_x = -10; + pixel_y = -7 + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"kd" = ( +/obj/structure/table, +/obj/item/storage/box/evidence{ + pixel_y = 19; + pixel_x = -7 + }, +/obj/item/storage/box/flares{ + pixel_y = 18; + pixel_x = 7 + }, +/obj/item/storage/box/zipties{ + pixel_x = 2; + pixel_y = 30 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/machinery/recharger{ + pixel_y = 1 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"kt" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 4; + pixel_y = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"kv" = ( +/obj/effect/turf_decal/trimline/transparent/blue/line, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"kE" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 9 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/structure/closet/crate/bin{ + pixel_y = 11 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"kG" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/sign/poster/clip/gold{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"kL" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"kS" = ( +/obj/machinery/door/poddoor{ + id = "atlas_cargo" + }, +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 8; + id = "atlas_holo" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plating, +/area/ship/cargo) +"kX" = ( +/obj/effect/turf_decal/techfloor{ + dir = 4 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"lc" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"le" = ( +/obj/effect/turf_decal/industrial/loading{ + icon_state = "loadingarea_stripes" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"lw" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/landmark/start/head_of_personnel, +/obj/item/radio/intercom/wideband/directional/south, +/obj/machinery/firealarm/directional/west{ + pixel_x = -33; + pixel_y = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"lA" = ( +/obj/machinery/porta_turret/ship/ballistic/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/cargo) +"lJ" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light_switch{ + pixel_y = 22; + pixel_x = 11 + }, +/turf/open/floor/plasteel/tech, +/area/ship/crew) +"lY" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"mf" = ( +/obj/effect/turf_decal/techfloor/orange{ + dir = 4 + }, +/obj/structure/table, +/obj/structure/closet/wall/directional/east, +/obj/item/radio{ + pixel_y = 15; + pixel_x = 7 + }, +/obj/item/radio{ + pixel_y = 9; + pixel_x = 7 + }, +/obj/item/radio{ + pixel_y = 9; + pixel_x = 4 + }, +/obj/item/radio{ + pixel_y = 9 + }, +/obj/item/radio{ + pixel_y = 9; + pixel_x = -4 + }, +/obj/item/radio{ + pixel_y = 9; + pixel_x = -9 + }, +/obj/item/radio{ + pixel_y = 15; + pixel_x = 4 + }, +/obj/item/radio{ + pixel_y = 15 + }, +/obj/item/radio{ + pixel_y = 15; + pixel_x = -4 + }, +/obj/item/radio{ + pixel_y = 15; + pixel_x = -9 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew) +"mh" = ( +/obj/structure/dresser, +/obj/machinery/button/door{ + pixel_y = 23; + id = "atlas_fo"; + name = "private windows button" + }, +/turf/open/floor/carpet/nanoweave/blue, +/area/ship/crew/crewtwo) +"ms" = ( +/obj/machinery/porta_turret/ship/ballistic/clip, +/obj/docking_port/mobile{ + dir = 2; + launch_status = 0; + port_direction = 8; + preferred_direction = 4; + name = "atlas dock" + }, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/engineering) +"mw" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"mK" = ( +/obj/structure/cable/yellow{ + icon_state = "4-10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/catwalk/over, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/turf/open/floor/plating, +/area/ship/engineering) +"mN" = ( +/obj/structure/sign/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/engineering) +"mS" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"nl" = ( +/obj/effect/landmark/start/security_officer, +/obj/structure/chair, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"nm" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + dir = 8; + color = "#75A2BB" + }, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"ny" = ( +/obj/item/gun/ballistic/automatic/smg/cm5/no_mag{ + pixel_y = -4; + pixel_x = 6 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/techfloor{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/guncloset, +/obj/item/gun/ballistic/automatic/assault/cm82{ + spawnwithmagazine = 0; + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/gun/ballistic/automatic/pistol/cm23/no_mag{ + pixel_x = -4; + pixel_y = -8 + }, +/obj/item/gun/ballistic/automatic/pistol/cm23/no_mag{ + pixel_x = -4; + pixel_y = -8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"nO" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/effect/turf_decal/techfloor/orange{ + dir = 6 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew) +"nP" = ( +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/cargo) +"nQ" = ( +/obj/structure/table, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/transparent/blue/corner, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10 + }, +/obj/machinery/microwave{ + pixel_y = 7 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"nS" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black/corner, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"nU" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 9 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"nW" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/security_officer, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"nX" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"nY" = ( +/obj/effect/turf_decal/trimline/transparent/blue/line, +/obj/structure/table, +/obj/item/storage/bag/tray/cafeteria{ + pixel_y = 2 + }, +/obj/item/storage/bag/tray/cafeteria{ + pixel_y = 4 + }, +/obj/item/storage/bag/tray/cafeteria{ + pixel_y = 6 + }, +/obj/item/storage/bag/tray/cafeteria{ + pixel_y = 8 + }, +/obj/item/storage/bag/tray/cafeteria{ + pixel_y = 10 + }, +/obj/item/storage/bag/tray/cafeteria{ + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"oa" = ( +/obj/structure/table, +/obj/item/trash/plate{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/trash/plate{ + pixel_x = -2; + pixel_y = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"of" = ( +/obj/machinery/firealarm/directional/north, +/obj/item/paperplane{ + pixel_y = 5 + }, +/obj/structure/fluff/paper/stack{ + name = "stack of papers"; + desc = "Seems like someone needs to work on their aim."; + pixel_x = 4; + pixel_y = -4; + dir = 4 + }, +/obj/structure/closet/crate/bin{ + pixel_y = 12; + pixel_x = 5 + }, +/obj/item/paperplane{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/item/paperplane{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"ov" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + dir = 8; + color = "#75A2BB" + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"oJ" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 5; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"oX" = ( +/obj/machinery/door/airlock/grunge{ + dir = 4; + name = "Captain's Quarters"; + req_one_access = list(20) + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"oY" = ( +/obj/structure/toilet{ + dir = 1; + pixel_x = 9; + pixel_y = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"pi" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/turf/open/floor/plating, +/area/ship/hallway/central) +"pn" = ( +/obj/effect/turf_decal/corner_steel_grid{ + dir = 9 + }, +/obj/structure/rack, +/obj/item/storage/lockbox/medal{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/item/storage/lockbox/medal/sec{ + pixel_x = -4; + pixel_y = -1 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"pp" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atlas_engi_lockdown" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"pq" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"ps" = ( +/turf/template_noop, +/area/template_noop) +"pE" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 8; + layer = 2.456 + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"qb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 8 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"qc" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_bridge" + }, +/turf/open/floor/plating, +/area/ship/bridge) +"qn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 1 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"qr" = ( +/obj/effect/turf_decal/minutemen/corner{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"qA" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"qG" = ( +/obj/machinery/power/terminal, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/turf_decal/industrial, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"qP" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/effect/turf_decal/minutemen/edge{ + dir = 8 + }, +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/effect/landmark/start/captain, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"qR" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 1 + }, +/obj/effect/landmark/start/warden, +/turf/open/floor/plasteel/mono/dark, +/area/ship/security) +"qS" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ + dir = 8 + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"rk" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"rr" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"ry" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"rz" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 5 + }, +/obj/item/pen{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"rO" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/closet/cabinet{ + name = "formal uniform cabinet" + }, +/obj/item/clothing/under/clip/formal/with_shirt{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/clothing/under/clip/formal/with_shirt{ + pixel_y = 10 + }, +/obj/item/clothing/under/clip/formal/with_shirt{ + pixel_x = -5; + pixel_y = 10 + }, +/obj/item/clothing/under/clip/formal/with_shirt{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/clothing/under/clip/formal/with_shirt/alt{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/clothing/under/clip/formal/with_shirt/alt{ + pixel_x = 2; + pixel_y = -4 + }, +/obj/item/clothing/under/clip/formal/with_shirt/alt{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/clothing/under/clip/formal/with_shirt/alt{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/shoes/laceup{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/effect/turf_decal/siding/thinplating/dark/end{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"rR" = ( +/obj/effect/turf_decal/techfloor{ + dir = 4 + }, +/obj/machinery/light_switch{ + pixel_y = 23 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"sh" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + dir = 8; + pixel_x = 20 + }, +/turf/open/floor/plasteel/stairs{ + icon = 'icons/obj/stairs.dmi'; + dir = 1 + }, +/area/ship/engineering) +"si" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"sl" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/machinery/light_switch{ + pixel_y = -20; + dir = 1 + }, +/obj/structure/closet/secure_closet{ + icon_state = "hop"; + name = "sergeant's locker"; + req_access_txt = "19" + }, +/obj/item/storage/guncase/doublebarrel{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/clothing/shoes/combat{ + pixel_y = -8 + }, +/obj/item/clothing/head/clip/slouch{ + pixel_y = 12 + }, +/obj/item/clothing/under/clip/minutemen{ + pixel_x = -5 + }, +/obj/item/clothing/suit/armor/vest/alt{ + pixel_x = 7 + }, +/obj/effect/turf_decal/box{ + color = "#75A2BB" + }, +/obj/item/storage/backpack/security/clip{ + pixel_x = 13; + pixel_y = -13 + }, +/obj/item/storage/box/ammo/a12g_buckshot{ + pixel_x = -7; + pixel_y = -12 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"sA" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner, +/obj/structure/window/reinforced, +/obj/machinery/suit_storage_unit/minutemen, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/box{ + color = "#75A2BB" + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"sB" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"sD" = ( +/obj/machinery/door/airlock/external{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/warning, +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/engineering) +"sF" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating/dark/end, +/obj/machinery/blackbox_recorder, +/obj/machinery/door/window/brigdoor/northleft, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"sI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/machinery/door/airlock/grunge{ + req_access = list(3); + dir = 4; + name = "Armory" + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"sL" = ( +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"sP" = ( +/obj/machinery/computer/cryopod/directional/west, +/turf/open/floor/plasteel/tech, +/area/ship/crew) +"tc" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_cap" + }, +/turf/open/floor/plating, +/area/ship/crew/crewthree) +"tq" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"tA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"tF" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"tP" = ( +/obj/structure/table, +/obj/item/stamp{ + pixel_x = 9; + pixel_y = 13 + }, +/obj/item/clipboard, +/obj/item/stamp/denied{ + pixel_x = 10; + pixel_y = 4 + }, +/obj/item/binoculars{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"tW" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/canteen) +"us" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"ux" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 4; + pixel_y = 1 + }, +/obj/effect/turf_decal/minutemen/edge{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"uC" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door{ + id = "atlas_bridge_lockdown"; + dir = 1; + pixel_y = 4; + name = "bridge lockdown"; + pixel_x = -6 + }, +/obj/machinery/button/door{ + id = "atlas_bridge"; + dir = 1; + pixel_x = 7; + pixel_y = 4; + name = "bridge shutters" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"uG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"uH" = ( +/obj/structure/table, +/obj/item/clipboard{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/fancy/cigarettes{ + pixel_x = -1; + pixel_y = 3 + }, +/obj/item/storage/fancy/cigarettes{ + pixel_x = -5 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/storage/fancy/cigarettes{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/clothing/mask/cigarette{ + pixel_x = 1 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 5 + }, +/obj/machinery/computer/helm/viewscreen/directional/south, +/turf/open/floor/plasteel/mono/dark, +/area/ship/security) +"uO" = ( +/obj/effect/turf_decal/corner/transparent/blue{ + dir = 6 + }, +/obj/structure/table/chem, +/obj/structure/sink/chem, +/obj/item/roller{ + pixel_y = 15; + pixel_x = -12 + }, +/obj/item/roller{ + pixel_y = 6; + pixel_x = -14 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"uQ" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"uU" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_y = 9; + pixel_x = -5 + }, +/obj/item/trash/can{ + pixel_x = 7; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/cola{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/item/storage/fancy/donut_box{ + pixel_x = -13; + pixel_y = -2 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"uX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"uY" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/mono/dark, +/area/ship/hallway/central) +"vd" = ( +/obj/structure/catwalk/over, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plating, +/area/ship/engineering) +"vo" = ( +/obj/structure/railing, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/machinery/light/directional/west, +/obj/machinery/cell_charger, +/obj/structure/table, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"vw" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/catwalk/over, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-9" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"vy" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 5; + pixel_x = -13 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = -13 + }, +/obj/item/kitchen/fork/plastic{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/kitchen/fork/plastic{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/kitchen/fork/plastic{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/kitchen/fork/plastic{ + pixel_x = 10; + pixel_y = 2 + }, +/obj/item/melee/knife/plastic, +/obj/item/melee/knife/plastic{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/melee/knife/plastic{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/melee/knife/plastic{ + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"vS" = ( +/obj/machinery/porta_turret/ship/ballistic/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/engineering) +"vT" = ( +/obj/structure/dresser{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"vW" = ( +/obj/structure/sign/poster/clip/random{ + pixel_y = 32 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/ship/crew/crewthree) +"vZ" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atlas_engi_lockdown" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"wc" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-6" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"wd" = ( +/obj/structure/sign/warning/nosmoking/circle{ + pixel_x = -28 + }, +/obj/machinery/power/ship_gravity, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"we" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/white, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/structure/closet/secure_closet/wall/directional/north{ + icon_door = "med_wall"; + req_access = list(5) + }, +/obj/item/storage/belt/medical/webbing/clip/prefilled{ + pixel_x = -6; + pixel_y = -7 + }, +/obj/item/clothing/gloves/color/latex/nitrile/clip{ + pixel_x = -11; + pixel_y = 5 + }, +/obj/item/clothing/under/clip/medic{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/item/clothing/head/clip/corpsman{ + pixel_y = 8; + pixel_x = 9 + }, +/obj/item/defibrillator/loaded{ + pixel_y = 26 + }, +/obj/item/storage/belt/medical/surgery{ + pixel_x = -7; + pixel_y = -8 + }, +/obj/item/storage/backpack/satchel/med{ + pixel_x = 11; + pixel_y = -14 + }, +/obj/item/storage/backpack/messenger/med{ + pixel_x = 10; + pixel_y = -10 + }, +/obj/item/storage/backpack/medic{ + pixel_x = 9; + pixel_y = -14 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"wh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"wi" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/techfloor/orange, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew) +"wk" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"wu" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"wy" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"wJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"wU" = ( +/obj/machinery/power/smes/engineering, +/obj/effect/turf_decal/industrial, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"wW" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/chair, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"xi" = ( +/obj/effect/decal/fakelattice{ + icon_state = "lattice-203" + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/ship/external/dark) +"xz" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"xU" = ( +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"yi" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"yn" = ( +/obj/structure/salvageable/computer{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"yo" = ( +/obj/effect/turf_decal/techfloor{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"yx" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/double/grey, +/turf/open/floor/carpet/nanoweave/blue, +/area/ship/crew/crewtwo) +"yB" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 4; + layer = 2.456 + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"yC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/holopad/emergency/counselor, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"yI" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + dir = 8; + color = "#75A2BB" + }, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 6 + }, +/obj/structure/punching_bag, +/obj/machinery/light_switch{ + dir = 1; + pixel_y = -20 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"yL" = ( +/obj/machinery/power/smes/shuttle/precharged, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"yO" = ( +/obj/machinery/computer/helm/viewscreen/directional/north, +/turf/open/floor/carpet/blue, +/area/ship/crew/crewthree) +"yR" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/structure/bed/roller, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"yT" = ( +/obj/machinery/door/firedoor, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/plasteel/mono/dark, +/area/ship/hallway/central) +"yZ" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/techfloor{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/item/clothing/under/clip/minutemen{ + pixel_x = -8; + pixel_y = 11 + }, +/obj/item/clothing/under/clip/minutemen{ + pixel_x = -1; + pixel_y = 9 + }, +/obj/item/clothing/under/clip/minutemen{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/item/clothing/under/clip/minutemen{ + pixel_x = 12; + pixel_y = 9 + }, +/obj/item/clothing/shoes/combat{ + pixel_x = -11; + pixel_y = -6 + }, +/obj/item/clothing/shoes/combat{ + pixel_x = -6; + pixel_y = -7 + }, +/obj/item/clothing/shoes/combat{ + pixel_y = -6 + }, +/obj/item/clothing/shoes/combat{ + pixel_x = 7; + pixel_y = -8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"zc" = ( +/obj/structure/closet/crate/freezer, +/obj/item/tank/internals/anesthetic{ + pixel_x = 12 + }, +/obj/item/tank/internals/anesthetic{ + pixel_x = 12 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = -12; + pixel_x = 5 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = -12; + pixel_x = 6 + }, +/obj/effect/turf_decal/corner/transparent/blue/mono, +/obj/item/storage/firstaid/regular{ + pixel_y = 8; + pixel_x = -8 + }, +/obj/item/storage/box/gloves{ + pixel_x = -10; + pixel_y = 2 + }, +/obj/item/storage/box/masks{ + pixel_y = -5; + pixel_x = -12 + }, +/turf/open/floor/plasteel/mono/white, +/area/ship/medical) +"zf" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/warning, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/layer2{ + dir = 8 + }, +/obj/machinery/advanced_airlock_controller{ + pixel_y = 26 + }, +/obj/structure/closet/emcloset/wall/directional/south, +/obj/item/clothing/suit/space/fragile{ + pixel_x = 6; + pixel_y = -14 + }, +/obj/item/clothing/suit/space/fragile{ + pixel_x = 11; + pixel_y = -17 + }, +/obj/item/clothing/head/helmet/space/fragile{ + pixel_x = -8; + pixel_y = -9 + }, +/obj/item/clothing/head/helmet/space/fragile{ + pixel_x = -2; + pixel_y = -14 + }, +/turf/open/floor/plasteel/dark, +/area/ship/engineering) +"zl" = ( +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 10 + }, +/obj/effect/turf_decal/box/corners{ + dir = 4; + color = "#75A2BB" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew/canteen) +"zq" = ( +/obj/machinery/door/poddoor{ + id = "atlas_cargo" + }, +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 4; + id = "atlas_holo" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plating, +/area/ship/cargo) +"zt" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"zx" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"zE" = ( +/obj/structure/bed{ + dir = 1 + }, +/obj/item/bedsheet/blue{ + dir = 1 + }, +/obj/structure/curtain/cloth, +/obj/machinery/button/door{ + id = "atlas_dorms"; + name = "private windows button"; + pixel_x = -23; + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"zQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/structure/sign/poster/clip/maxin{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Aa" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/effect/turf_decal/trimline/transparent/blue/filled/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"An" = ( +/obj/structure/bed{ + dir = 1 + }, +/obj/item/bedsheet/blue{ + dir = 1 + }, +/obj/structure/curtain/cloth, +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"Av" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp{ + pixel_y = 6; + pixel_x = 1 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"Ay" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/item/paperplane{ + pixel_x = 11; + pixel_y = 9 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"AH" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/effect/turf_decal/spline/fancy/opaque/white{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"AP" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"Bm" = ( +/obj/machinery/power/shuttle/engine/electric, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_engi_lockdown" + }, +/turf/open/floor/plating, +/area/ship/external/dark) +"Bx" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 9 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_y = -28 + }, +/obj/structure/bed/dogbed{ + name = "Mushroom's bed"; + desc = "A comfy-looking dog bed. Despite the name, the owner is a mothroach." + }, +/mob/living/simple_animal/pet/mothroach{ + name = "Mushroom"; + desc = "Master Sergeant Mushroom is assigned to overwatch C-MM armory officers. Don't let her eat the armor."; + gender = "female" + }, +/obj/item/storage/fancy/egg_box{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel/mono/dark, +/area/ship/security) +"BH" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"BI" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"BL" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/railing{ + dir = 1; + layer = 2.89 + }, +/obj/effect/turf_decal/industrial, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"BW" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"Cc" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + dir = 4; + color = "#75A2BB" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8; + piping_layer = 2 + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"Cm" = ( +/obj/structure/sign/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewthree) +"Cn" = ( +/obj/item/cigbutt{ + anchored = 1; + color = "#808080"; + layer = 2; + pixel_x = -4; + pixel_y = 8 + }, +/obj/effect/decal/fakelattice, +/obj/structure/railing, +/turf/open/floor/plasteel/elevatorshaft, +/area/ship/hallway/central) +"Cq" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/arrow_ccw{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Cr" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/item/stack/sheet/mineral/plasma/twenty, +/obj/structure/cable/yellow{ + icon_state = "0-9" + }, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"CM" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_y = 3 + }, +/obj/item/pen{ + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = 16; + pixel_y = 11 + }, +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"CO" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/medical) +"CX" = ( +/obj/machinery/light/directional/west, +/obj/machinery/button/door{ + pixel_y = -23; + id = "atlas_med"; + dir = 1; + name = "medbay shutters" + }, +/obj/effect/turf_decal/siding/white{ + dir = 10 + }, +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"CZ" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"Da" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"Do" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"Dq" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/white, +/obj/structure/mirror{ + pixel_y = 28 + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"DL" = ( +/obj/machinery/photocopier, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Ea" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"Ej" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"Eo" = ( +/obj/structure/railing{ + dir = 1; + layer = 2.89 + }, +/obj/machinery/autolathe, +/obj/machinery/light/directional/west, +/obj/item/stack/sheet/glass/twenty, +/obj/item/stack/sheet/metal/twenty, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"Es" = ( +/obj/structure/curtain/cloth/grey, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"Ey" = ( +/obj/effect/decal/fakelattice{ + icon_state = "lattice-23" + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/ship/external/dark) +"EB" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/carpet/nanoweave/blue, +/area/ship/crew/crewtwo) +"ED" = ( +/obj/item/kirbyplants{ + icon_state = "plant-02"; + pixel_x = -7 + }, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/corner_steel_grid/full, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"EH" = ( +/obj/structure/filingcabinet/double/grey{ + dir = 1; + pixel_y = -3 + }, +/obj/item/folder, +/obj/item/folder/blue, +/obj/item/folder/red, +/obj/item/folder/white, +/obj/item/folder/yellow, +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"EJ" = ( +/obj/item/kirbyplants{ + icon_state = "plant-02" + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"EP" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/arrow_ccw{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"ES" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"EZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 4 + }, +/turf/open/floor/plasteel/stairs{ + icon = 'icons/obj/stairs.dmi'; + dir = 4 + }, +/area/ship/bridge) +"Fu" = ( +/obj/effect/decal/fakelattice{ + icon_state = "lattice-21" + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/ship/external/dark) +"Fv" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning, +/obj/effect/turf_decal/industrial/warning{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"FF" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"FI" = ( +/obj/structure/table, +/obj/item/desk_flag/trans{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/toy/cards/deck{ + pixel_x = 6; + pixel_y = 9 + }, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"FN" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewthree) +"FO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/stairs{ + icon = 'icons/obj/stairs.dmi'; + dir = 4 + }, +/area/ship/bridge) +"FQ" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/spline/fancy/opaque/white{ + dir = 4 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"Gi" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Gj" = ( +/obj/effect/turf_decal/corner_steel_grid{ + dir = 5 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8; + color = "#75A2BB" + }, +/obj/structure/table, +/obj/structure/bedsheetbin, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew/canteen) +"Gt" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/double/blue, +/turf/open/floor/carpet/blue, +/area/ship/crew/crewthree) +"GU" = ( +/obj/machinery/porta_turret/ship/ballistic/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewtwo) +"Hf" = ( +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"Hg" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"Hh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "atlas_engi_lockdown"; + dir = 4; + pixel_y = 2; + name = "engineering shutters"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"Hl" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/light/directional/west, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"Hu" = ( +/obj/machinery/door/poddoor{ + id = "atlas_cargo" + }, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plating, +/area/ship/cargo) +"HW" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew) +"HX" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/hallway/central) +"Ic" = ( +/obj/machinery/turretid, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/bridge) +"Ig" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/railing, +/obj/effect/turf_decal/trimline/transparent/blue/corner{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"Ir" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/effect/turf_decal/minutemen/edge, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"IK" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/obj/structure/closet/crate, +/obj/item/storage/box/emptysandbags, +/obj/item/storage/box/emptysandbags, +/obj/item/shovel, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/machinery/light/directional/east, +/obj/structure/crate_shelf, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"IP" = ( +/obj/structure/table/wood, +/obj/item/melee/knife/letter_opener{ + pixel_x = 9; + pixel_y = -6 + }, +/obj/item/folder/biscuit/unsealed{ + pixel_x = -4 + }, +/obj/item/papercutter{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"IR" = ( +/obj/item/kirbyplants{ + icon_state = "plant-02" + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"IY" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Jb" = ( +/obj/machinery/door/airlock/command{ + dir = 4; + name = "Bridge"; + req_one_access = list(19, 3) + }, +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_bridge_lockdown" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Je" = ( +/turf/open/floor/engine/hull/reinforced, +/area/ship/external/dark) +"JL" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/effect/turf_decal/spline/fancy/opaque/white{ + dir = 1 + }, +/obj/machinery/holopad/emergency/medical, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"JR" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-5" + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"JU" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/chair{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"JV" = ( +/obj/item/kirbyplants{ + icon_state = "plant-02"; + pixel_y = 16; + pixel_x = -6 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/corner_steel_grid/full{ + dir = 8 + }, +/obj/structure/railing, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Kc" = ( +/obj/effect/decal/fakelattice{ + icon_state = "lattice-203" + }, +/obj/structure/lattice/catwalk, +/obj/item/toy/plush/moth/royal{ + pixel_x = 9; + pixel_y = 8; + name = "Specialist Aloe"; + desc = "An adorable mothperson plushy. Judging by a tag attached just beneath its left leg, it is part of the Colonial League's armed forces." + }, +/obj/item/clothing/head/clip{ + pixel_x = 9; + pixel_y = 18 + }, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = 5; + list_reagents = list(/datum/reagent/consumable/ice = 30) + }, +/turf/open/floor/plating, +/area/ship/external/dark) +"Kf" = ( +/obj/structure/chair/plastic{ + dir = 8; + pixel_y = 9; + pixel_x = 7 + }, +/obj/effect/decal/cleanable/confetti, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/components/binary/pump/layer2{ + dir = 8 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) +"Km" = ( +/obj/machinery/computer/helm/viewscreen/directional/south, +/turf/open/floor/carpet/nanoweave/blue, +/area/ship/crew/crewtwo) +"KB" = ( +/obj/effect/turf_decal/trimline/transparent/blue/line, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/thinplating/dark, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Ld" = ( +/obj/item/caution{ + pixel_x = 6 + }, +/obj/effect/decal/cleanable/oil/slippery{ + icon_state = "floor5"; + pixel_x = -12; + pixel_y = 1 + }, +/obj/item/wirecutters{ + pixel_x = -5; + pixel_y = -15 + }, +/obj/item/crowbar/large{ + pixel_y = 14 + }, +/turf/open/floor/plating, +/area/ship/cargo) +"Ln" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"Lp" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/command{ + pixel_y = 6; + pixel_x = -3 + }, +/obj/item/book/manual/wiki/piloting{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Lw" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/stand_clear/white, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/button/door{ + id = "atlas_cargo"; + dir = 4; + pixel_x = -23; + pixel_y = 6; + name = "cargo bay control" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/button/shieldwallgen{ + dir = 4; + pixel_y = -4; + pixel_x = -20; + id = "atlas_holo" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"LE" = ( +/obj/structure/grille, +/turf/open/floor/engine/hull/reinforced, +/area/ship/external/dark) +"LH" = ( +/obj/structure/filingcabinet/double/grey{ + pixel_y = 14 + }, +/obj/item/folder, +/obj/item/folder/blue, +/obj/item/folder/red, +/obj/item/folder/white, +/obj/item/folder/yellow, +/obj/item/reagent_containers/food/snacks/grown/tobacco{ + dry = 1 + }, +/obj/item/reagent_containers/food/snacks/grown/tobacco{ + dry = 1 + }, +/obj/item/reagent_containers/food/snacks/grown/tobacco{ + dry = 1 + }, +/obj/item/reagent_containers/food/snacks/grown/tobacco{ + dry = 1 + }, +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"LM" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/bridge) +"Ml" = ( +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/stand_clear/white, +/obj/machinery/light/directional/east, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"Mq" = ( +/obj/structure/closet/crate/bin{ + pixel_y = 11; + pixel_x = -10 + }, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 9 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Mu" = ( +/obj/effect/landmark/start/station_engineer, +/obj/structure/cable/yellow{ + icon_state = "2-5" + }, +/obj/structure/cable/yellow{ + icon_state = "5-6" + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) +"My" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"MC" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"MH" = ( +/obj/machinery/power/port_gen/pacman{ + anchored = 1 + }, +/obj/structure/cable/yellow, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"MO" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"MQ" = ( +/obj/structure/chair/comfy/beige, +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"Ni" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"No" = ( +/obj/machinery/mech_bay_recharge_port{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/hatch/blue, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"NE" = ( +/obj/structure/closet/emcloset/anchored, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 6 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + dir = 8; + color = "#75A2BB" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"NY" = ( +/obj/structure/chair/comfy/blue{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"Ob" = ( +/obj/structure/sign/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewtwo) +"Oj" = ( +/obj/structure/sign/number/random, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewthree) +"Ot" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -20 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"OA" = ( +/obj/structure/catwalk/over, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ship/engineering) +"OQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"OV" = ( +/obj/effect/turf_decal/rechargefloor, +/obj/item/stack/ore/salvage/scraptitanium{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/stack/ore/salvage/scrapsilver{ + pixel_x = 4; + pixel_y = -8 + }, +/obj/structure/mecha_wreckage/ripley/clip, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"OW" = ( +/obj/effect/decal/fakelattice, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plasteel/elevatorshaft, +/area/ship/hallway/central) +"Pd" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 4; + pixel_y = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Pi" = ( +/obj/machinery/suit_storage_unit/minutemen, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/box{ + color = "#75A2BB" + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"Pk" = ( +/obj/effect/turf_decal/minutemen/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"Pn" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"Py" = ( +/obj/structure/closet/secure_closet/engineering_personal{ + populate = 0 + }, +/obj/effect/decal/cleanable/confetti, +/obj/item/clothing/glasses/meson{ + pixel_x = -1; + pixel_y = -8 + }, +/obj/item/storage/belt/utility/full, +/obj/item/storage/backpack/satchel/eng{ + pixel_y = 10 + }, +/obj/item/clothing/under/clip{ + pixel_x = 7 + }, +/obj/item/clothing/suit/hazardvest{ + pixel_x = -8; + pixel_y = 3 + }, +/obj/item/clothing/suit/space/syndicate/blue, +/obj/item/clothing/head/helmet/space/syndicate/blue, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"PD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 8; + pixel_x = 4 + }, +/obj/structure/curtain, +/obj/machinery/shower{ + dir = 1; + pixel_x = -6 + }, +/obj/effect/turf_decal/floordetail/pryhole, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plastic, +/area/ship/crew) +"PG" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet/blue, +/area/ship/crew/crewthree) +"PK" = ( +/obj/effect/turf_decal/trimline/transparent/blue/line, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/closet/secure_closet/freezer/fridge/open{ + populate = 0 + }, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/obj/item/reagent_containers/food/drinks/waterbottle/large, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"PT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/suit_storage_unit/minutemen, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/box{ + color = "#75A2BB" + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"PU" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/engineering) +"PV" = ( +/obj/machinery/door/airlock/grunge{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"PX" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/catwalk/over, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plating, +/area/ship/engineering) +"Qb" = ( +/obj/machinery/recharge_station, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"Qg" = ( +/obj/item/cigbutt{ + pixel_x = -8; + pixel_y = 11 + }, +/obj/structure/catwalk/over, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ship/engineering) +"Qj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 6 + }, +/obj/item/lipstick{ + pixel_x = -11 + }, +/obj/item/lipstick/black{ + pixel_x = -11 + }, +/obj/item/lipstick/jade{ + pixel_x = -11 + }, +/obj/item/lipstick/purple{ + pixel_x = -11 + }, +/obj/structure/closet/wall/white{ + dir = 4; + pixel_x = 28; + pixel_y = 6 + }, +/obj/structure/mirror{ + pixel_x = -28; + pixel_y = 7 + }, +/obj/item/dyespray{ + pixel_x = 10 + }, +/obj/item/clothing/head/wig/random{ + pixel_x = 11 + }, +/turf/open/floor/plastic, +/area/ship/crew) +"Qt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"Qu" = ( +/obj/machinery/door/airlock/external{ + dir = 4 + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/turf_decal/industrial/warning, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/engineering) +"Qw" = ( +/obj/effect/turf_decal/minutemen/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) +"Qx" = ( +/obj/structure/bed/pod{ + dir = 1 + }, +/obj/item/bedsheet/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Qz" = ( +/obj/structure/sign/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/cargo) +"QC" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"QG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/mono/dark, +/area/ship/hallway/central) +"QM" = ( +/obj/structure/table/reinforced, +/obj/item/radio/weather_monitor{ + pixel_x = -6; + pixel_y = 20 + }, +/obj/item/radio/intercom/table{ + dir = 4; + pixel_y = 3 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"QS" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Rf" = ( +/obj/machinery/door/airlock/grunge{ + name = "Dormitories" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ship/crew) +"Rt" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"Rv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-10" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 4 + }, +/turf/open/floor/plasteel/tech, +/area/ship/engineering) +"Rz" = ( +/obj/structure/rack, +/obj/effect/turf_decal/trimline/transparent/blue/filled, +/obj/item/clothing/suit/armor/vest/bulletproof{ + pixel_y = 13; + pixel_x = 7 + }, +/obj/item/clothing/suit/armor/vest/bulletproof{ + pixel_y = 10; + pixel_x = 6 + }, +/obj/item/clothing/suit/armor/vest/bulletproof{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/clothing/suit/armor/vest/bulletproof{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/clothing/head/helmet/bulletproof/x11/clip{ + pixel_y = 12; + pixel_x = -9 + }, +/obj/item/clothing/head/helmet/bulletproof/x11/clip{ + pixel_y = 10; + pixel_x = -6 + }, +/obj/item/clothing/head/helmet/bulletproof/x11/clip{ + pixel_y = 5; + pixel_x = -10 + }, +/obj/item/clothing/head/helmet/bulletproof/x11/clip{ + pixel_y = 1; + pixel_x = -7 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"RL" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_y = 6; + pixel_x = 2 + }, +/obj/item/storage/fancy/cigarettes/cigars{ + pixel_y = 9; + pixel_x = 1 + }, +/obj/item/clothing/mask/cigarette/pipe{ + pixel_x = 10 + }, +/obj/item/lighter{ + pixel_x = -9 + }, +/turf/open/floor/wood, +/area/ship/crew/crewthree) +"RM" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"RQ" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"RT" = ( +/obj/machinery/porta_turret/ship/ballistic/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew) +"RU" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/computer/monitor{ + dir = 8; + icon_state = "computer-left" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Sb" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Sp" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atlas_cap" + }, +/turf/open/floor/plating, +/area/ship/crew/crewthree) +"Ss" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/spline/fancy/opaque/black/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Sw" = ( +/obj/structure/rack, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled, +/obj/item/storage/box/ammo/c10mm{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/storage/box/ammo/c9mm{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/storage/box/ammo/a556_42{ + pixel_x = 1; + pixel_y = -6 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Sz" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/industrial/warning, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"SB" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/mono/dark, +/area/ship/security) +"SI" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"SK" = ( +/obj/structure/sign/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/medical) +"ST" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/southright{ + req_access = list(3) + }, +/obj/item/radio/intercom/table{ + pixel_y = -3; + pixel_x = 5 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"SW" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/ship/crew/crewtwo) +"Ti" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"Tx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 5 + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"Ty" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"TA" = ( +/obj/item/emptysandbag{ + pixel_x = -10; + pixel_y = -8 + }, +/obj/item/emptysandbag{ + pixel_x = 4; + pixel_y = -8 + }, +/obj/item/emptysandbag{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/emptysandbag{ + pixel_x = -3; + pixel_y = -6 + }, +/obj/item/emptysandbag{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/emptysandbag{ + pixel_x = -10; + pixel_y = -5 + }, +/obj/item/emptysandbag{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/emptysandbag{ + pixel_x = -10 + }, +/obj/item/shovel{ + pixel_x = -18; + pixel_y = -3 + }, +/obj/structure/table, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"TE" = ( +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/cargo) +"TK" = ( +/obj/structure/dresser{ + dir = 1 + }, +/obj/machinery/button/door{ + pixel_y = -23; + id = "atlas_cap"; + dir = 1; + name = "private windows button" + }, +/turf/open/floor/carpet/blue, +/area/ship/crew/crewthree) +"TT" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"Uh" = ( +/obj/structure/rack, +/obj/effect/turf_decal/trimline/transparent/blue/filled, +/obj/item/clothing/head/clip{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/clothing/head/clip{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/clothing/head/clip{ + pixel_x = -9; + pixel_y = -3 + }, +/obj/item/clothing/head/clip{ + pixel_x = -7; + pixel_y = -8 + }, +/obj/item/storage/belt/military/clip{ + pixel_y = 14; + pixel_x = 5 + }, +/obj/item/storage/belt/military/clip{ + pixel_y = 11; + pixel_x = 7 + }, +/obj/item/storage/belt/military/clip{ + pixel_y = 2; + pixel_x = 4 + }, +/obj/item/storage/belt/military/clip{ + pixel_y = -2; + pixel_x = 7 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Um" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/corner{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/machinery/suit_storage_unit/minutemen, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/box{ + color = "#75A2BB" + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"UC" = ( +/obj/effect/turf_decal/corner/transparent/blue/diagonal, +/obj/effect/turf_decal/spline/fancy/opaque/white{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"UG" = ( +/obj/structure/table/optable, +/obj/effect/turf_decal/corner/transparent/blue/mono, +/obj/item/clothing/suit/apron/surgical{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/book/manual/wiki/surgery{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/structure/sign/poster/clip/serene{ + pixel_x = 32 + }, +/obj/machinery/defibrillator_mount{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/mono/white, +/area/ship/medical) +"UK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"UP" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4; + color = "#75A2BB" + }, +/obj/effect/turf_decal/box/corners{ + color = "#75A2BB" + }, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 9 + }, +/obj/structure/weightmachine/weightlifter, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/pod/dark, +/area/ship/cargo) +"US" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/computer/cargo{ + dir = 8; + icon_state = "computer-right" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"UY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/structure/catwalk/over, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"Vk" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_y = 5; + pixel_x = 16 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 16 + }, +/obj/machinery/door/window/brigdoor/southleft{ + req_access = list(3) + }, +/obj/item/flashlight/lamp{ + pixel_x = -8; + pixel_y = 13 + }, +/obj/item/stamp{ + pixel_x = -9 + }, +/obj/item/stamp/denied, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Vl" = ( +/obj/effect/turf_decal/corner/transparent/blue/border{ + dir = 8 + }, +/obj/structure/curtain, +/obj/effect/turf_decal/corner/transparent/blue/mono, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/turf/open/floor/plasteel/mono/white, +/area/ship/medical) +"Vo" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "atlas_med" + }, +/turf/open/floor/plating, +/area/ship/medical) +"Vq" = ( +/obj/structure/rack, +/obj/item/reagent_containers/spray/pepper{ + pixel_y = 12; + pixel_x = 10 + }, +/obj/item/reagent_containers/spray/pepper{ + pixel_y = 13; + pixel_x = 4 + }, +/obj/item/reagent_containers/spray/pepper{ + pixel_y = 10; + pixel_x = 6 + }, +/obj/item/reagent_containers/spray/pepper{ + pixel_y = 8; + pixel_x = 9 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled, +/obj/item/ammo_box/magazine/cm5_9mm{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/ammo_box/magazine/cm5_9mm{ + pixel_x = -1; + pixel_y = -5 + }, +/obj/item/ammo_box/magazine/p16{ + pixel_x = -9 + }, +/obj/item/ammo_box/magazine/p16{ + pixel_x = -9 + }, +/obj/machinery/light/directional/north, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/melee/knife/survival{ + pixel_x = 12; + pixel_y = -3 + }, +/obj/item/melee/knife/survival{ + pixel_x = 10; + pixel_y = -4 + }, +/obj/item/melee/knife/survival{ + pixel_x = 11; + pixel_y = -4 + }, +/obj/item/melee/knife/survival{ + pixel_x = 11; + pixel_y = -6 + }, +/obj/item/melee/knife/survival{ + pixel_x = 11; + pixel_y = -8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"Vw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"VG" = ( +/obj/machinery/modular_computer/console/preset/command{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/catwalk/over/plated_catwalk/dark, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"VK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/engine/hull/interior, +/area/ship/engineering) +"VQ" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plasteel/stairs{ + icon = 'icons/obj/stairs.dmi' + }, +/area/ship/engineering) +"VR" = ( +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/transparent/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/security) +"VT" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black/corner, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"VW" = ( +/obj/effect/decal/fakelattice{ + icon_state = "lattice-6" + }, +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/ship/external/dark) +"We" = ( +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Wg" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/industrial/warning{ + dir = 1; + layer = 2.456 + }, +/turf/open/floor/plating, +/area/ship/hallway/central) +"Wi" = ( +/turf/open/floor/plasteel/grimy, +/area/ship/crew/canteen) +"Wk" = ( +/obj/effect/turf_decal/corner/transparent/blue{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/airlock/medical{ + name = "Medical Bay" + }, +/turf/open/floor/plasteel/white, +/area/ship/medical) +"Wr" = ( +/obj/machinery/door/airlock/grunge{ + dir = 4; + name = "First Officer's Quarters"; + req_one_access = list(19) + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"Wx" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_bridge_lockdown" + }, +/turf/open/floor/plating, +/area/ship/bridge) +"WO" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/effect/turf_decal/techfloor/orange{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew) +"WQ" = ( +/obj/machinery/door/airlock/grunge{ + dir = 4; + name = "Engineering" + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ship/engineering) +"WR" = ( +/obj/structure/bed{ + dir = 1 + }, +/obj/item/bedsheet/blue{ + dir = 1 + }, +/obj/structure/curtain/cloth, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"WZ" = ( +/obj/structure/catwalk/over, +/obj/machinery/firealarm/directional/east, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-10" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/turf/open/floor/plating, +/area/ship/engineering) +"Xc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/machinery/light_switch{ + dir = 4; + pixel_x = -23 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"Xg" = ( +/obj/effect/turf_decal/trimline/transparent/blue/warning{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"Xl" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/railing, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light_switch{ + pixel_y = 23; + pixel_x = 10 + }, +/turf/open/floor/pod/dark, +/area/ship/crew/canteen) +"Xp" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) +"XT" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/transparent/blue/corner{ + dir = 4 + }, +/obj/structure/chair/plastic{ + dir = 8; + pixel_x = -4 + }, +/turf/open/floor/plasteel/dark, +/area/ship/security) +"XZ" = ( +/obj/machinery/porta_turret/ship/ballistic/clip, +/turf/closed/wall/mineral/plastitanium/nodiagonal, +/area/ship/crew/crewthree) +"Ya" = ( +/turf/open/floor/plasteel/tech, +/area/ship/crew/canteen) +"Yt" = ( +/obj/docking_port/stationary{ + width = 30; + height = 15; + dwidth = 15 + }, +/turf/template_noop, +/area/template_noop) +"Yu" = ( +/obj/item/food/cakeslice/birthday{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 6 + }, +/obj/structure/catwalk/over, +/turf/open/floor/plating, +/area/ship/engineering) +"Yw" = ( +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/cargo) +"YG" = ( +/obj/effect/turf_decal/spline/fancy/opaque/black{ + dir = 4; + pixel_y = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"YK" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/firealarm/directional/south, +/obj/item/broken_bottle, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewthree) +"YM" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_fo" + }, +/turf/open/floor/plating, +/area/ship/crew/crewtwo) +"YO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/tech, +/area/ship/cargo) +"Zd" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/canteen) +"Ze" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/corner_steel_grid{ + dir = 10 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1; + color = "#75A2BB" + }, +/turf/open/floor/plasteel/tech/grid, +/area/ship/crew/canteen) +"Zo" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_y = 5; + pixel_x = 11 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 11 + }, +/obj/item/papercutter{ + pixel_x = -2; + pixel_y = 5 + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"Zs" = ( +/obj/machinery/door/airlock/command{ + dir = 4; + name = "Bridge"; + req_one_access = list(19, 3) + }, +/obj/effect/turf_decal/corner_techfloor_gray{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "atlas_bridge_lockdown" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) +"ZE" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/ship/crew/crewtwo) +"ZG" = ( +/obj/structure/sign/poster/clip/enlist{ + pixel_y = 32 + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/ship/crew) +"ZM" = ( +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-5" + }, +/turf/open/floor/plating, +/area/ship/engineering) +"ZU" = ( +/obj/effect/turf_decal/techfloor{ + dir = 4 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plasteel/dark, +/area/ship/hallway/central) +"ZZ" = ( +/obj/structure/catwalk/over/plated_catwalk/dark, +/obj/machinery/computer/helm{ + dir = 8; + icon_state = "computer-middle" + }, +/turf/open/floor/plasteel/telecomms_floor, +/area/ship/bridge) + +(1,1,1) = {" +ps +ps +ps +ps +ms +ps +ps +ps +ps +ps +ps +ps +ps +ps +ps +ps +ps +ps +ps +ps +vS +ps +ps +"} +(2,1,1) = {" +ps +ps +ps +ps +PU +PU +Bm +Bm +PU +ps +ps +PU +sD +PU +ps +ps +PU +Bm +Bm +PU +PU +ps +ps +"} +(3,1,1) = {" +ps +ps +ps +ps +PU +Ti +yL +af +PU +Bm +Bm +PU +zf +PU +Bm +Bm +PU +cN +cN +Hl +PU +ps +ps +"} +(4,1,1) = {" +ps +ps +ps +ps +pp +eW +My +bK +PU +jY +jY +PU +Qu +PU +jY +jY +PU +bK +JR +TA +pp +ps +ps +"} +(5,1,1) = {" +ps +ps +ps +ps +pp +Py +Yu +fM +vo +wc +mw +Hh +Qg +wd +mw +ZM +Eo +Rv +Mu +MH +pp +ps +ps +"} +(6,1,1) = {" +ps +ps +ps +bF +vZ +VK +Kf +jR +iN +sh +vw +UY +OA +vd +WZ +VQ +PX +mK +Xp +Cr +pp +ps +ps +"} +(7,1,1) = {" +ps +ps +ps +ps +mN +PU +Cc +qS +fd +PU +WQ +PU +PU +PU +PU +PU +BL +qG +wU +PU +mN +ps +ps +"} +(8,1,1) = {" +ps +ps +ps +ps +ps +PU +PU +PU +PU +tW +eK +tW +Ze +fL +Gj +tW +PU +PU +PU +PU +ps +ps +ps +"} +(9,1,1) = {" +ps +ps +ps +ps +ps +gT +Qx +Gi +oY +tW +em +tW +zl +Ya +gk +tW +LE +LE +LE +ps +ps +ps +ps +"} +(10,1,1) = {" +ps +ps +ps +ps +gT +gT +jc +XT +gT +tW +VT +Pd +kt +YG +gU +tW +HW +HW +HW +HW +HW +ps +ps +"} +(11,1,1) = {" +ps +ps +ps +gT +gT +kd +gE +Bx +gT +kE +nS +jI +fp +Do +Sb +nQ +HW +WR +us +An +HW +HW +ps +"} +(12,1,1) = {" +ps +ps +ps +gT +Vq +Sw +QS +SB +Vk +jG +IY +jI +vy +nW +FF +PK +HW +ZG +fR +fR +zE +di +ps +"} +(13,1,1) = {" +ps +ps +ps +gT +ny +VR +aX +qR +ST +ct +Aa +nl +oa +nW +FF +nY +HW +fg +wJ +UK +vT +di +ps +"} +(14,1,1) = {" +ps +ps +ps +gT +Rz +Uh +dV +uH +gT +Ig +Aa +Wi +am +dM +BI +cm +Rf +Ej +yi +aI +Qb +di +ps +"} +(15,1,1) = {" +ps +ps +ps +gT +yo +fs +QC +sl +gT +Xl +Aa +wh +Qt +OQ +iS +hg +HW +HW +Es +HW +HW +HW +ps +"} +(16,1,1) = {" +ps +ps +ps +gT +bQ +gT +sI +gT +gT +CZ +EP +eU +FI +Do +FF +kv +NE +HW +lJ +sP +wi +HW +ps +"} +(17,1,1) = {" +ps +ps +ps +gT +yZ +gT +zQ +PT +Um +Cq +wk +jI +Pn +rr +FF +kv +nU +HW +WO +mf +nO +HW +ps +"} +(18,1,1) = {" +ps +ps +ps +gT +gT +gT +Zd +sL +We +sL +IY +jI +uU +rr +FF +KB +HW +HW +HW +HW +HW +RT +ps +"} +(19,1,1) = {" +ps +ps +ps +ps +ps +gT +MC +Pi +sA +eJ +RM +gu +ES +bS +Ss +wy +eB +Qj +PD +HW +ps +ps +ps +"} +(20,1,1) = {" +ps +ps +ps +ps +ps +lA +TE +TE +TE +TE +HX +PV +HX +PV +HX +CO +CO +CO +CO +HW +ps +ps +ps +"} +(21,1,1) = {" +ps +ps +ps +ps +ps +ps +TE +OV +No +TE +ev +sB +Ot +ia +OW +CO +gy +zc +CO +ps +ps +ps +ps +"} +(22,1,1) = {" +ps +ps +ps +ps +ps +Qz +TE +Ld +yn +TE +TE +zt +tF +Ty +CO +CO +cY +cY +CO +SK +ps +ps +ps +"} +(23,1,1) = {" +ps +ps +ps +ps +ps +zq +Lw +le +YO +Hg +Yw +TT +hL +TT +gw +aC +FQ +mS +CX +CO +ps +ps +ps +"} +(24,1,1) = {" +ps +ps +ps +ps +Yt +Hu +nX +tA +jZ +yI +TE +hQ +rk +Ln +CO +Dq +aa +JL +yR +Vo +ps +ps +ps +"} +(25,1,1) = {" +ps +ps +ps +ps +ps +Hu +nX +tA +tA +UP +TE +wW +rk +JU +CO +we +uO +UC +yR +Vo +ps +ps +ps +"} +(26,1,1) = {" +ps +ps +ps +ps +ps +kS +Ml +le +Da +SI +nP +yB +ix +yB +Wk +zx +AH +qA +xU +CO +ps +ps +ps +"} +(27,1,1) = {" +ps +ps +ps +ps +ps +Qz +TE +nm +ov +TE +TE +yT +ec +uY +CO +CO +Vl +Vl +CO +SK +ps +ps +ps +"} +(28,1,1) = {" +ps +ps +ps +ps +ps +ps +TE +IK +xz +TE +MO +Fv +pE +uQ +si +CO +fF +UG +CO +ps +ps +ps +ps +"} +(29,1,1) = {" +ps +ps +jp +VW +Ey +Fu +TE +TE +TE +TE +kG +kL +pi +BW +si +CO +CO +CO +CO +VW +Ey +Fu +da +"} +(30,1,1) = {" +ps +ps +Oj +FN +xi +HX +HX +EJ +aS +uY +is +Xg +lY +oJ +Sz +uY +iQ +IR +HX +HX +Kc +da +da +"} +(31,1,1) = {" +ps +ps +Oj +FN +FN +FN +Cn +lc +gH +QG +Wg +fi +jL +AP +gH +QG +fj +RQ +OW +da +da +da +da +"} +(32,1,1) = {" +ps +ps +Sp +jQ +hR +FN +FN +oX +FN +FN +rR +BH +kX +pq +ZU +da +da +Wr +da +da +SW +Av +gR +"} +(33,1,1) = {" +ps +ps +Sp +rz +NY +hq +Xc +uX +sF +LM +LM +Jb +Wx +Zs +LM +LM +rO +Ni +Tx +iw +MQ +CM +gR +"} +(34,1,1) = {" +ps +ps +Sp +RL +cc +yC +Vw +YK +LM +LM +JV +FO +tq +EZ +ED +LM +LM +of +Ay +aw +Hf +IP +gR +"} +(35,1,1) = {" +ps +ps +XZ +FN +LH +uG +ry +LM +Ic +Mq +qn +Qw +ux +Pk +qb +pn +LM +LM +ZE +Rt +EH +da +GU +"} +(36,1,1) = {" +ps +ps +ps +FN +FN +vW +TK +LM +wu +js +js +Ir +gA +gF +Ea +Ea +lw +LM +mh +cV +da +da +ps +"} +(37,1,1) = {" +ps +ps +ps +Je +FN +yO +PG +LM +tP +DL +Zo +qr +qP +dw +uC +QM +VG +LM +EB +Km +da +Je +ps +"} +(38,1,1) = {" +ps +ps +ps +Je +FN +Gt +eH +LM +qc +LM +iO +RU +ZZ +US +Lp +LM +qc +LM +iW +yx +da +Je +ps +"} +(39,1,1) = {" +ps +ps +ps +ps +Cm +tc +tc +LM +ps +LM +qc +qc +qc +qc +qc +LM +ps +LM +YM +YM +Ob +ps +ps +"} diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index 4b42a90bbb26..fedc993738bd 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -1672,9 +1672,7 @@ /turf/open/floor/plasteel/tech/techmaint, /area/ship/engineering) "pJ" = ( -/obj/machinery/power/smes/shuttle/precharged{ - dir = 4 - }, +/obj/machinery/power/smes/shuttle/precharged, /obj/structure/cable{ icon_state = "0-8" }, @@ -1775,9 +1773,7 @@ /turf/open/floor/mineral/plastitanium, /area/ship/crew/canteen) "qF" = ( -/obj/machinery/power/smes/shuttle/precharged{ - dir = 4 - }, +/obj/machinery/power/smes/shuttle/precharged, /obj/structure/cable{ icon_state = "0-8" }, @@ -3305,7 +3301,6 @@ icon_state = "0-8" }, /obj/docking_port/mobile{ - can_move_docking_ports = 1; dir = 8; launch_status = 0; preferred_direction = 4 @@ -4042,9 +4037,7 @@ /obj/machinery/door/window/eastleft{ name = "Engine Access" }, -/obj/machinery/atmospherics/components/unary/shuttle/fire_heater{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/shuttle/fire_heater, /turf/open/floor/plating, /area/ship/engineering) "MV" = ( @@ -4285,9 +4278,7 @@ id = "warship_engines"; name = "Thruster Blast Door" }, -/obj/machinery/atmospherics/components/unary/shuttle/fire_heater{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/shuttle/fire_heater, /turf/open/floor/plating, /area/ship/engineering) "PA" = ( @@ -5252,9 +5243,7 @@ /turf/open/floor/holofloor/wood, /area/ship/bridge) "Yb" = ( -/obj/machinery/power/shuttle/engine/electric{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/electric, /obj/structure/cable{ icon_state = "0-4" }, @@ -5267,9 +5256,7 @@ /turf/open/floor/engine/hull, /area/ship/external/dark) "Yn" = ( -/obj/machinery/power/shuttle/engine/fire{ - dir = 4 - }, +/obj/machinery/power/shuttle/engine/fire, /turf/open/floor/plating, /area/ship/engineering) "Yp" = ( diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 1e4fde83ae56..5df6e5fce6b3 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -844,6 +844,10 @@ DEFINE_BITFIELD(turret_flags, list( stun_projectile_sound = 'sound/weapons/gun/smg/shot.ogg' desc = "A ballistic machine gun auto-turret." +/* Colonial League turrets */ +/obj/machinery/porta_turret/ship/ballistic/clip + faction = list(FACTION_PLAYER_MINUTEMAN, "turret") + //high rof, range, faster projectile speed /* 'Nanotrasen' turrets */ diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index ea6633370147..cc742c409f0e 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -182,6 +182,13 @@ helmet_type = /obj/item/clothing/head/helmet/space/pilot/random mask_type = /obj/item/clothing/mask/breath +/obj/machinery/suit_storage_unit/minutemen + suit_type = /obj/item/clothing/suit/space/hardsuit/clip_patroller + mask_type = /obj/item/clothing/mask/breath + +/obj/machinery/suit_storage_unit/minutemen/spotter + suit_type = /obj/item/clothing/suit/space/hardsuit/clip_spotter + //End shiptest suits /obj/machinery/suit_storage_unit/open diff --git a/code/game/objects/items/storage/guncases.dm b/code/game/objects/items/storage/guncases.dm index 2feb49af03f7..947ed3d8b914 100644 --- a/code/game/objects/items/storage/guncases.dm +++ b/code/game/objects/items/storage/guncases.dm @@ -213,3 +213,9 @@ /obj/item/storage/pistolcase/iongun/PopulateContents() new /obj/item/gun/energy/ionrifle/empty_cell(src) new /obj/item/stock_parts/cell/gun(src) + +/obj/item/storage/pistolcase/cm23/PopulateContents() + . = ..() + new /obj/item/gun/ballistic/automatic/pistol/cm23/no_mag(src) + new /obj/item/ammo_box/magazine/cm23/empty(src) + new /obj/item/ammo_box/magazine/cm23/empty(src) diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm index 2301855c6809..36530b20754b 100644 --- a/code/modules/clothing/outfits/factions/minutemen.dm +++ b/code/modules/clothing/outfits/factions/minutemen.dm @@ -120,7 +120,7 @@ suit = /obj/item/clothing/suit/toggle/lawyer/clip/fo alt_suit = null - shoes = /obj/item/clothing/shoes/combat + shoes = /obj/item/clothing/shoes/laceup head = /obj/item/clothing/head/clip/slouch/officer backpack = /obj/item/storage/backpack/captain @@ -273,7 +273,7 @@ backpack = /obj/item/storage/backpack/security/clip satchel = /obj/item/storage/backpack/satchel/sec/clip duffelbag = /obj/item/storage/backpack/duffelbag - courierbag = /obj/item/storage/backpack/messenger + courierbag = /obj/item/storage/backpack/satchel/sec/clip box = /obj/item/storage/box/survival/clip/balaclava @@ -298,17 +298,12 @@ ears = /obj/item/radio/headset/clip/alt/captain uniform = /obj/item/clothing/under/clip/officer alt_uniform = null - suit = /obj/item/clothing/suit/armor/clip_capcoat alt_suit = null + suit = /obj/item/clothing/suit/armor/clip_capcoat dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain - shoes = /obj/item/clothing/shoes/combat + shoes = /obj/item/clothing/shoes/jackboots head = /obj/item/clothing/head/clip/slouch/officer - backpack = /obj/item/storage/backpack/captain - satchel = /obj/item/storage/backpack/satchel/cap - duffelbag = /obj/item/storage/backpack/duffelbag/captain - courierbag = /obj/item/storage/backpack/messenger/com - backpack_contents = list(/obj/item/storage/box/ids=1, /obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1) @@ -365,14 +360,9 @@ ears = /obj/item/radio/headset/clip/alt uniform = /obj/item/clothing/under/clip/formal alt_uniform = null - suit = /obj/item/clothing/suit/toggle/lawyer/clip alt_suit = null - shoes = /obj/item/clothing/shoes/combat - - backpack = /obj/item/storage/backpack/captain - satchel = /obj/item/storage/backpack/satchel/cap - duffelbag = /obj/item/storage/backpack/duffelbag/captain - courierbag = /obj/item/storage/backpack/messenger/com + suit = /obj/item/clothing/suit/toggle/lawyer/clip + shoes = /obj/item/clothing/shoes/jackboots backpack_contents = list(/obj/item/modular_computer/tablet/preset/advanced = 1) @@ -382,17 +372,9 @@ job_icon = "clip_navy2" jobtype = /datum/job/doctor - l_hand = /obj/item/storage/firstaid/medical - - backpack = /obj/item/storage/backpack/security/clip - satchel = /obj/item/storage/backpack/satchel/sec/clip - duffelbag = /obj/item/storage/backpack/duffelbag - courierbag = /obj/item/storage/backpack/messenger - uniform = /obj/item/clothing/under/clip/medic shoes = /obj/item/clothing/shoes/sneakers/white head = /obj/item/clothing/head/clip/corpsman - gloves = /obj/item/clothing/gloves/color/latex/nitrile/clip suit = null suit_store = null @@ -513,7 +495,7 @@ job_icon = "clip_cmm2" ears = /obj/item/radio/headset/alt box = /obj/item/storage/box/survival/clip/balaclava - shoes = null + shoes = /obj/item/clothing/shoes/combat // shoos backpack = /obj/item/storage/backpack/security/clip satchel = /obj/item/storage/backpack/satchel/sec/clip @@ -635,7 +617,7 @@ head = /obj/item/clothing/head/clip/slouch suit = /obj/item/clothing/suit/armor/vest/bulletproof belt = /obj/item/storage/belt/military/clip - shoes = /obj/item/clothing/shoes/combat + shoes = /obj/item/clothing/shoes/jackboots l_pocket = /obj/item/flashlight/seclite r_pocket = /obj/item/tank/internals/emergency_oxygen/double @@ -647,8 +629,7 @@ suit_store = /obj/item/gun/ballistic/automatic/assault/cm82 belt = /obj/item/storage/belt/military/clip/cm82 - //replace commander with the cm23 when its impemented, see the cm-f4 above - backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1, /obj/item/gun/ballistic/automatic/pistol/commander=1) + backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1, /obj/item/gun/ballistic/automatic/pistol/cm23=1) /datum/outfit/job/clip/minutemen/grunt/commander name = "CLIP Minutemen - Field Commander" @@ -662,7 +643,7 @@ head = /obj/item/clothing/head/clip/slouch/officer suit = /obj/item/clothing/suit/toggle/lawyer/clip - shoes = /obj/item/clothing/shoes/combat + shoes = /obj/item/clothing/shoes/jackboots glasses = /obj/item/clothing/glasses/sunglasses /datum/outfit/job/clip/minutemen/grunt/major @@ -677,6 +658,6 @@ head = /obj/item/clothing/head/clip/slouch/officer suit = /obj/item/clothing/suit/armor/clip_trenchcoat - shoes = /obj/item/clothing/shoes/combat + shoes = /obj/item/clothing/shoes/jackboots glasses = /obj/item/clothing/glasses/sunglasses diff --git a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm index a244b188863a..b84171d437da 100644 --- a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm +++ b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm @@ -23,9 +23,12 @@ eject_empty_sound = 'sound/weapons/gun/pistol/candor_unload.ogg' recoil_unwielded = 3 +/obj/item/gun/ballistic/automatic/pistol/cm23/no_mag + spawnwithmagazine = FALSE + /obj/item/ammo_box/magazine/cm23 name = "CM-23 pistol magazine (10mm)" - desc = "An 10-round magazine magazine designed for the CM-70 pistol. These rounds do moderate damage, but struggle against armor." + desc = "An 10-round magazine magazine designed for the CM-23 pistol. These rounds do moderate damage, but struggle against armor." icon_state = "cm23_mag-1" base_icon_state = "cm23_mag" ammo_type = /obj/item/ammo_casing/c10mm @@ -36,6 +39,9 @@ . = ..() icon_state = "[base_icon_state]-[!!ammo_count()]" +/obj/item/ammo_box/magazine/cm23/empty + start_empty = TRUE + /obj/item/gun/ballistic/automatic/pistol/cm70 name = "CM-70 machine pistol" desc = "A compact machine pistol designed to rapidly fire 3-round bursts. Popular with officers and certain special units, the CM-70 is incredibly dangerous at close range. Chambered in 9mm." From bb943360572e68c92691235611f58acb6124e82f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 17 Oct 2024 13:06:08 -0500 Subject: [PATCH 06/25] Automatic changelog generation for PR #3246 [ci skip] --- html/changelogs/AutoChangeLog-pr-3246.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3246.yml diff --git a/html/changelogs/AutoChangeLog-pr-3246.yml b/html/changelogs/AutoChangeLog-pr-3246.yml new file mode 100644 index 000000000000..a877fb96e567 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3246.yml @@ -0,0 +1,4 @@ +author: meemofcourse +changes: + - {rscadd: Atlas-class Light Armored Crusier} +delete-after: true From 9cae6b4dc039ebce77998706210a7d310ffb2c66 Mon Sep 17 00:00:00 2001 From: DIB-DOG Date: Thu, 17 Oct 2024 13:51:13 -0500 Subject: [PATCH 07/25] Removes the extra turret from the crying sun and slightly re-organizes the armory (#3477) ## About The Pull Request Removes an extra turret that found it's way onto the hull of the PGF Crying Sun, likely in the recent PGF turret overhaul. Additionally, a locker in the armory has been renamed and the flashbangs have been moved from the Marine equipment locker to the Lieutenant's ordnance locker. I've attached an image below to show how it's now organized. ![Screenshot 2024-10-03 172121](https://github.com/user-attachments/assets/c8c123e3-0c39-4fc6-b7e1-d2c545ac0631) ![Screenshot 2024-10-04 015626](https://github.com/user-attachments/assets/9440b65f-ff3e-48f2-8a35-05ae0f442ad6) ![Screenshot 2024-10-17 131256](https://github.com/user-attachments/assets/d2fe5685-ffb8-487a-9d2f-c7228a8ea099) ## Why It's Good For The Game Ships having automated turrets that they weren't meant to have is generally a bad thing for balance and being able to enjoy the ship's lovingly labored over design. As for the flashbangs, the ship's fragmentation and smoke grenades were already being controlled by the lieutenant so it seems logical to do the same with grenades that can blind and deafen someone. ## Changelog :cl: del: Removed extra turret that wasn't supposed to be on the ship fix: Moved armory flashbangs to a more secure location /:cl: --- _maps/shuttles/pgf/pgf_crying_sun.dmm | 57 +++++++++++---------------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/_maps/shuttles/pgf/pgf_crying_sun.dmm b/_maps/shuttles/pgf/pgf_crying_sun.dmm index 0c740842e5d9..933d8f7fbfe0 100644 --- a/_maps/shuttles/pgf/pgf_crying_sun.dmm +++ b/_maps/shuttles/pgf/pgf_crying_sun.dmm @@ -225,16 +225,13 @@ /turf/open/floor/plating, /area/ship/engineering) "bT" = ( -/obj/item/storage/box/flashbangs{ - pixel_x = -7; - pixel_y = 7 - }, /obj/item/storage/box/zipties{ pixel_y = 7; - pixel_x = 8 + pixel_x = 4 }, /obj/item/storage/box/flashes{ - pixel_y = -1 + pixel_y = -1; + pixel_x = -7 }, /obj/item/screwdriver{ pixel_x = -5; @@ -2373,36 +2370,39 @@ /turf/open/floor/plasteel/telecomms_floor, /area/ship/bridge) "uo" = ( +/obj/structure/closet/secure_closet/wall/directional/west{ + icon_state = "sec_wall"; + name = "ordnance locker" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/corner/opaque/purple{ + dir = 10 + }, +/obj/item/storage/box/flashbangs{ + pixel_y = 6 + }, /obj/item/grenade/frag{ - pixel_x = -8; + pixel_x = -10; pixel_y = -1 }, /obj/item/grenade/frag{ - pixel_x = -3; - pixel_y = -8 + pixel_x = -5; + pixel_y = -6 }, /obj/item/grenade/smokebomb{ - pixel_y = 3; + pixel_y = 2; pixel_x = 13 }, /obj/item/grenade/smokebomb{ - pixel_y = 1; - pixel_x = 7 + pixel_x = 7; + pixel_y = -2 }, /obj/item/grenade/smokebomb{ pixel_x = 11; pixel_y = -5 }, -/obj/structure/closet/secure_closet/wall/directional/west{ - icon_state = "sec_wall"; - name = "equipment locker" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/corner/opaque/purple{ - dir = 10 - }, /turf/open/floor/vault, /area/ship/security/armory) "uq" = ( @@ -3612,17 +3612,6 @@ /obj/item/clothing/head/helmet/space/gezena, /turf/open/floor/plating, /area/ship/engineering) -"DG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/porta_turret/ship/pgf/light{ - dir = 5; - mode = 1; - id = "crying_sun_grid" - }, -/turf/open/floor/engine/hull, -/area/ship/external/dark) "DJ" = ( /obj/effect/turf_decal/industrial/traffic, /obj/structure/sign/flag/gezena{ @@ -7431,7 +7420,7 @@ xz xz xz Si -DG +KB KM Te EM From 4221dff16cd0c0b8573cc6bc5c886b145e1716ea Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 17 Oct 2024 14:01:54 -0500 Subject: [PATCH 08/25] Automatic changelog generation for PR #3477 [ci skip] --- html/changelogs/AutoChangeLog-pr-3477.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3477.yml diff --git a/html/changelogs/AutoChangeLog-pr-3477.yml b/html/changelogs/AutoChangeLog-pr-3477.yml new file mode 100644 index 000000000000..b0f28a0aebcd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3477.yml @@ -0,0 +1,5 @@ +author: DIB-DOG +changes: + - {rscdel: Removed extra turret that wasn't supposed to be on the ship} + - {bugfix: Moved armory flashbangs to a more secure location} +delete-after: true From fa04ceba0851d8ba1954bd849a5f068e751ab48b Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:58:14 -0500 Subject: [PATCH 09/25] Fixes the Frontiersman Soft Cap (#3581) ## About The Pull Request Fixes a typo that broke the sprite whenever you took the hat off or flipped it ## Why It's Good For The Game Fixes good ## Changelog :cl: fix: Fixed a typo in the Frontiersman softcap that made the sprite go invisible /:cl: --- code/modules/clothing/factions/frontiersmen.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm index 77af8138fb40..380456f4f8d7 100644 --- a/code/modules/clothing/factions/frontiersmen.dm +++ b/code/modules/clothing/factions/frontiersmen.dm @@ -129,7 +129,7 @@ name = "frontiersman cap" desc = "An olive-green and grey baseball hat, worn by cargo technicians working under the Frontiersmen. Even they have the rights for a cool cap!" icon_state = "frontiersoft" - soft_type = "frontiersmen" + soft_type = "frontier" icon = 'icons/obj/clothing/faction/frontiersmen/head.dmi' mob_overlay_icon = 'icons/mob/clothing/faction/frontiersmen/head.dmi' From 00d536f266ac23762fcf0ebe9d459ee15c5498cf Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 17 Oct 2024 16:09:06 -0500 Subject: [PATCH 10/25] Automatic changelog generation for PR #3581 [ci skip] --- html/changelogs/AutoChangeLog-pr-3581.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3581.yml diff --git a/html/changelogs/AutoChangeLog-pr-3581.yml b/html/changelogs/AutoChangeLog-pr-3581.yml new file mode 100644 index 000000000000..935fbd451c5b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3581.yml @@ -0,0 +1,4 @@ +author: generalthrax +changes: + - {bugfix: Fixed a typo in the Frontiersman softcap that made the sprite go invisible} +delete-after: true From 445e601983444563f9c0a7f8d9d6322a536f0993 Mon Sep 17 00:00:00 2001 From: Erika Fox <94164348+Erikafox@users.noreply.github.com> Date: Thu, 17 Oct 2024 18:17:42 -0400 Subject: [PATCH 11/25] Wasteplanets Less Explosive (#3575) ## About The Pull Request removes welding fuel tanks from the wasteplanet spawn pool ## Why It's Good For The Game you will explode... less.. ## Changelog :cl: del: Wasteplanets no longer spawn welding fuel tanks. /:cl: Co-authored-by: Erika Fox <94164348+Bjarl@users.noreply.github.com> --- code/datums/mapgen/planetary/WasteGenerator.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/datums/mapgen/planetary/WasteGenerator.dm b/code/datums/mapgen/planetary/WasteGenerator.dm index 67a9e5649a8c..621d5e3b9c4d 100644 --- a/code/datums/mapgen/planetary/WasteGenerator.dm +++ b/code/datums/mapgen/planetary/WasteGenerator.dm @@ -106,7 +106,6 @@ //stuff you can actually use /obj/effect/spawner/lootdrop/waste/girder = 600, - /obj/structure/reagent_dispensers/fueltank = 100, /obj/structure/reagent_dispensers/watertank = 200, /obj/item/stack/cable_coil/cut = 500, /obj/structure/closet/crate/secure/loot = 30, @@ -190,7 +189,6 @@ /obj/effect/spawner/lootdrop/waste/radiation = 300, /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 120, /obj/effect/spawner/lootdrop/waste/girder = 600, - /obj/structure/reagent_dispensers/fueltank = 100, /obj/structure/reagent_dispensers/watertank = 200, /obj/item/stack/cable_coil/cut = 500, /obj/structure/closet/crate/secure/loot = 30, @@ -235,7 +233,6 @@ /obj/effect/spawner/lootdrop/waste/radiation = 80, /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 20, /obj/effect/spawner/lootdrop/waste/girder = 600, - /obj/structure/reagent_dispensers/fueltank = 100, /obj/structure/reagent_dispensers/watertank = 200, /obj/item/stack/cable_coil/cut = 500, /obj/structure/closet/crate/secure/loot = 30, @@ -297,7 +294,6 @@ /obj/effect/spawner/lootdrop/waste/radiation = 80, /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 10, /obj/effect/spawner/lootdrop/waste/girder = 600, - /obj/structure/reagent_dispensers/fueltank = 100, /obj/structure/reagent_dispensers/watertank = 200, /obj/item/stack/cable_coil/cut = 500, /obj/structure/closet/crate/secure/loot = 30, @@ -359,7 +355,6 @@ /obj/effect/spawner/lootdrop/waste/atmos_can/rare = 5, /obj/effect/spawner/lootdrop/waste/salvageable = 150, /obj/effect/spawner/lootdrop/waste/girder = 200, - /obj/structure/reagent_dispensers/fueltank = 10, /obj/structure/reagent_dispensers/watertank = 10, /obj/item/stack/cable_coil/cut = 500, /obj/structure/closet/crate/secure/loot = 30, @@ -393,7 +388,6 @@ /obj/effect/spawner/lootdrop/waste/radiation = 32, /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 4, /obj/effect/spawner/lootdrop/waste/girder = 120, - /obj/structure/reagent_dispensers/fueltank = 20, /obj/structure/reagent_dispensers/watertank = 40, /obj/item/stack/cable_coil/cut = 100, /obj/structure/closet/crate/secure/loot = 6, @@ -427,7 +421,6 @@ /obj/effect/spawner/lootdrop/waste/radiation = 16, /obj/effect/spawner/lootdrop/waste/radiation/more_rads = 2, /obj/effect/spawner/lootdrop/waste/girder = 60, - /obj/structure/reagent_dispensers/fueltank = 10, /obj/structure/reagent_dispensers/watertank = 20, /obj/item/stack/cable_coil/cut = 50, /obj/structure/closet/crate/secure/loot = 3, @@ -466,7 +459,6 @@ /obj/effect/spawner/lootdrop/waste/mechwreck = 20, /obj/effect/spawner/lootdrop/waste/trash = 90, /obj/effect/spawner/lootdrop/waste/radiation = 16, - /obj/structure/reagent_dispensers/fueltank = 10, /obj/structure/reagent_dispensers/watertank = 20, /obj/item/stack/cable_coil/cut = 50, /obj/structure/closet/crate/secure/loot = 3, From 10f2c0bc7f85c96bbfa2845b058c91a37321774d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 17 Oct 2024 17:28:10 -0500 Subject: [PATCH 12/25] Automatic changelog generation for PR #3575 [ci skip] --- html/changelogs/AutoChangeLog-pr-3575.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3575.yml diff --git a/html/changelogs/AutoChangeLog-pr-3575.yml b/html/changelogs/AutoChangeLog-pr-3575.yml new file mode 100644 index 000000000000..da31593b7759 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3575.yml @@ -0,0 +1,4 @@ +author: Erikafox +changes: + - {rscdel: Wasteplanets no longer spawn welding fuel tanks.} +delete-after: true From ebe41368f300d268972dd2e7b80c999bc57cd3a1 Mon Sep 17 00:00:00 2001 From: rye-rice <58402542+rye-rice@users.noreply.github.com> Date: Thu, 17 Oct 2024 16:05:54 -0700 Subject: [PATCH 13/25] resprites the commander (#3580) ## About The Pull Request title Was meant to be apart of another big manufacturer PR, however I do those when i'm taking a break from big projects, so its a bit of a cycle. It appears im in the latter half of the cycle (overmap 5 coming december...), so might as well just PR what i have done ## Why It's Good For The Game ![image](https://github.com/user-attachments/assets/9d518d71-b8f1-487c-9070-06af2d7a6c63) ## Changelog :cl: add: Resprites the commander and Commissioner /:cl: --------- Signed-off-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: retlaw34 <58402542+retlaw34@users.noreply.github.com> Co-authored-by: thgvr <81882910+thgvr@users.noreply.github.com> --- code/__DEFINES/guns.dm | 1 + .../boxes_magazines/external/pistol.dm | 13 ----- .../projectiles/guns/ballistic/pistol.dm | 37 ------------- .../nanotrasen_sharplite/ballistics.dm | 52 ++++++++++++++++++ icons/obj/guns/manufacturer/inteq/48x32.dmi | Bin 2090 -> 2032 bytes .../obj/guns/manufacturer/inteq/lefthand.dmi | Bin 5223 -> 1659 bytes .../obj/guns/manufacturer/inteq/righthand.dmi | Bin 5182 -> 1643 bytes .../nanotrasen_sharplite/48x32.dmi | Bin 27978 -> 28117 bytes .../nanotrasen_sharplite/lefthand.dmi | Bin 35557 -> 35330 bytes .../nanotrasen_sharplite/righthand.dmi | Bin 37047 -> 36809 bytes shiptest.dme | 1 + 11 files changed, 54 insertions(+), 50 deletions(-) create mode 100644 code/modules/projectiles/guns/manufacturer/nanotrasen_sharplite/ballistics.dm diff --git a/code/__DEFINES/guns.dm b/code/__DEFINES/guns.dm index d1cea0d28de4..26f7cfbfb6a9 100644 --- a/code/__DEFINES/guns.dm +++ b/code/__DEFINES/guns.dm @@ -61,6 +61,7 @@ #define MANUFACTURER_EOEHOMA "the Eoehoma Firearms emblem" #define MANUFACTURER_NANOTRASEN_OLD "an outdated Nanotrasen logo" #define MANUFACTURER_NANOTRASEN "the Nanotrasen logo" +#define MANUFACTURER_VIGILITAS "the Vigilitas Interstellar logo" #define MANUFACTURER_BRAZIL "a green flag with a blue circle and a yellow diamond around it" #define MANUFACTURER_INTEQ "an orange crest with the letters 'IRMG'" #define MANUFACTURER_MINUTEMAN "the Lanchester City Firearms Plant logo" diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index 90d2c7e4546e..0cf2a39beef2 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -34,19 +34,6 @@ . = ..() icon_state = "[base_icon_state]-[min(ammo_count(), 8)]" -/obj/item/ammo_box/magazine/co9mm - name = "commander pistol magazine (9mm)" - desc = "A 10-round double-stack magazine for Commander pistols. These rounds do okay damage, but struggle against armor." - icon_state = "commander_mag-10" - base_icon_state = "commander_mag" - ammo_type = /obj/item/ammo_casing/c9mm - caliber = "9mm" - max_ammo = 10 - multiple_sprites = AMMO_BOX_PER_BULLET - -/obj/item/ammo_box/magazine/co9mm/empty - start_empty = TRUE - /obj/item/ammo_box/magazine/pistol556mm name = "Pistole C magazine (5.56mm HITP caseless)" desc = "A 12-round, double-stack magazine for the Pistole C pistol. These rounds do okay damage with average performance against armor." diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 4fcc4cf56b14..cdae6b83df4c 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -98,43 +98,6 @@ EMPTY_GUN_HELPER(automatic/pistol/candor/factory) icon_state = "deaglecamo" item_state = "deagleg" -/obj/item/gun/ballistic/automatic/pistol/commander - name = "\improper Commander" - desc = "A classic handgun in a tasteful black and stainless steel color scheme. An enamel Nanotrasen logo is set into the grips. Chambered in 9mm." - icon_state = "commander" - icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi' - lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi' - righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi' - mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi' - - w_class = WEIGHT_CLASS_NORMAL - mag_type = /obj/item/ammo_box/magazine/co9mm - manufacturer = MANUFACTURER_NANOTRASEN - fire_sound = 'sound/weapons/gun/pistol/rattlesnake.ogg' - load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' - load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' - eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg' - eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg' - - rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg' - lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg' - bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg' - -EMPTY_GUN_HELPER(automatic/pistol/commander) - -/obj/item/gun/ballistic/automatic/pistol/commander/inteq - name = "\improper Commissioner" - desc = "A handgun seized from Nanotrasen armories by deserting troopers and modified to IRMG's standards. A yellow IRMG shield is set into the grips. Chambered in 9mm." - icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi' - lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi' - righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi' - mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi' - icon_state = "commander-inteq" - item_state = "commander-inteq" - manufacturer = MANUFACTURER_INTEQ - -EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) - /obj/item/gun/ballistic/automatic/pistol/commissar name = "\improper Commissar" desc = "A Nanotrasen-issue handgun, modified with a voice box to further enhance its effectiveness in troop discipline." diff --git a/code/modules/projectiles/guns/manufacturer/nanotrasen_sharplite/ballistics.dm b/code/modules/projectiles/guns/manufacturer/nanotrasen_sharplite/ballistics.dm new file mode 100644 index 000000000000..9ba4929cf0a4 --- /dev/null +++ b/code/modules/projectiles/guns/manufacturer/nanotrasen_sharplite/ballistics.dm @@ -0,0 +1,52 @@ +/obj/item/gun/ballistic/automatic/pistol/commander + name = "VI Commander" + desc = "A service pistol produced as Vigilitas Interstellar's standard sidearm. Has a reputation for being easy to use, due to its light recoil and high magazine capacity. Chambered in 9mm." + icon_state = "commander" + item_state = "nt_generic" + icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/48x32.dmi' + lefthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi' + righthand_file = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi' + mob_overlay_icon = 'icons/obj/guns/manufacturer/nanotrasen_sharplite/onmob.dmi' + + w_class = WEIGHT_CLASS_NORMAL + mag_type = /obj/item/ammo_box/magazine/co9mm + manufacturer = MANUFACTURER_VIGILITAS + fire_sound = 'sound/weapons/gun/pistol/rattlesnake.ogg' + load_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' + load_empty_sound = 'sound/weapons/gun/pistol/mag_insert.ogg' + eject_sound = 'sound/weapons/gun/pistol/mag_release.ogg' + eject_empty_sound = 'sound/weapons/gun/pistol/mag_release.ogg' + + rack_sound = 'sound/weapons/gun/pistol/rack_small.ogg' + lock_back_sound = 'sound/weapons/gun/pistol/lock_small.ogg' + bolt_drop_sound = 'sound/weapons/gun/pistol/drop_small.ogg' + +EMPTY_GUN_HELPER(automatic/pistol/commander) + +/obj/item/ammo_box/magazine/co9mm + name = "commander pistol magazine (9mm)" + desc = "A 10-round double-stack magazine for Commander pistols. These rounds do okay damage, but struggle against armor." + icon_state = "commander_mag-10" + base_icon_state = "commander_mag" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 10 + multiple_sprites = AMMO_BOX_PER_BULLET + +/obj/item/ammo_box/magazine/co9mm/empty + start_empty = TRUE + + +/obj/item/gun/ballistic/automatic/pistol/commander/inteq + name = "PS-03 Commissioner" + desc = "A modified version of the VI Commander, issued as standard to Inteq Risk Management Group personnel. Features the same excellent handling and high magazine capacity as the original. Chambered in 9mm." + + icon = 'icons/obj/guns/manufacturer/inteq/48x32.dmi' + lefthand_file = 'icons/obj/guns/manufacturer/inteq/lefthand.dmi' + righthand_file = 'icons/obj/guns/manufacturer/inteq/righthand.dmi' + mob_overlay_icon = 'icons/obj/guns/manufacturer/inteq/onmob.dmi' + icon_state = "commander_inteq" + item_state = "inteq_generic" + manufacturer = MANUFACTURER_INTEQ + +EMPTY_GUN_HELPER(automatic/pistol/commander/inteq) diff --git a/icons/obj/guns/manufacturer/inteq/48x32.dmi b/icons/obj/guns/manufacturer/inteq/48x32.dmi index 021ff448ecb58acb2f8ad2cdb9d38e6fdffa33ef..74adceab3ba16d0a2b7c60e9e96305a9718d8910 100644 GIT binary patch delta 2018 zcmV<82OapT5bzI>B!5UyOjJd{z`(~lE^2grK0i+>C^j%1Buz3r8Vn9@Qe;k8VgJ8o z%x53}05c&aD-aeM&)nvzvCJ41AC^5J3kMAr6&H04F+~m`z`(%XkX||f0004WQchC< zK<3zH0003cdQ@0+L}hbha%pgMX>V=-0C=38lRIyNFcgJn_rkliz z>vYK5&RFsMSs{H4e~G$=XqB(488422vTgP_4mqTtm+#0@XmF9XZ2E zdO&UsUW^UY_J0-$HG-fFy`AeYK4=^8=sKr?3jCYzv4Ni?aZ$!$0YOgucaqN{jS|8Z z#G&HS;MZDzRjb}?f~sCMXJoUiK8uCb?#@ckwwjbZH&A#pXv?yVI2%SWi=7S&AN6ls zS4N9<=0&%YjO5Yh;?0Wuk7D^Arg0H2Hv47ihi@s#%758_J&^49`-gu3p6w+df8Ny@ z000IhNkl42HG*iOzNx+jH*!Qcr?bQBjCu^*qbhot;jL@Jb>=8d?+q zm7xOPRt5?w1BH}lLWPhcqO7>DIO-8ho0uB%Y34p7*zjo1hfOh#Z_6+op=p^kU6;KaF1d>3bM1e*U zaxcm{P!Hws1n2}h4R(r#=f`*=ZXMzNQnhS4ivid{o&ZpsN2$6-pra@;Ks{6dNHle4 zvF`x&P#YZthDz2!DW)IYHFhf?xW;x5gmb01XMZY%ca8)Vq5gj}#&0VFg_MCp%0O9J zSznUY=ak(o{&@UMU-{8%OI=FYbxB-S`{&u3{o< zl1K>eiTu)>J>a1kd;S4EHHv|J^kdoQGf>v2S&YH4zSHZP$LVe5_k38!DMB7;ZwJT|+2N`e< zqeazAqB}vG>lN`dJWAGe-y|%DKK%<|_O}+WKoZ?Q!5O@mqRk+X=(<2u@&!bkaqy#F z0^?U*OiiHqzX1db`>sh?zrHwnf_-ocWPf97-A}TmWEiOG2SA}-a~Y-5Eo$R{MANtf zGA#7LEU)5x+pGe$t-}NEBw)mO75hT4Nr+VI{DmU`Sn4vGxkOc^3S6a;ycv&JopD?w zaWfwDaCI}HtgNi8tgNi8tgNi8tXNUA5vb*bY+6#RN)gw+N{Wh9zN%|U0+N!}0Dk}x zGGK(Ns+yFmhd`7R8w9Ev0+6ighH}PWu{yqfdw{43M<}YzM1$c|0+5nz15HHNk6lEv zSxa=HqHWry3xmf2K^Ku4u+eM^5E9wQeB4n8)KF};BevAqk60p)vo<4L_&cO*PG?+M z0GFo&*`Qr)8%kjU=&3X`35@bz4S(SZfv#rA%F4urpAUkx$p&EK5!w|U=%$$r9* zpYxvrw6Y!O$M+&iqrt4nmOQHmQFvylI>YO$2Ov?W#d`@pX7{A(*dznRR**O|{nj{c zvx3Z!S;H7hkO${Y)u~}xJAlEjjFn7?VI<-FrTb*Byc&9-OZ=4zpZN>0P>~kEEg!_CL*}F_&>Tk4V&iH zf|929^r<@CSXbBxjGCip}TOlqS zHnFq#t_uk_iUv&POVtq@ff98n_X&elfkmG$WVsp7z+H0tf$Am%M1N1!IWph?&aJ`* z#UwQ_D=X{o(Oovjm9yVhsw^Cy>wwD1lYUow9M36VSTgdI;|tp@ecl~6<)zwdx ze2K*H-ttKzB$sQ>c>&N^EJa-s{ZpAY)oZ<{*O-JaD zqh5wHb>QJzy9lP3@_&@07sZ;6@QF;P! z3Xsba@}6?kZlLY&1e@RO11^-JN6hAK>?uzXa_JQI;agkSXEUr>f1M*^LP50A4By}> zIMW+}w2AKww^%~;JLt^@(A0P4v$aShDiGh;Mm@~SCN*#Hlz)DafYj!fVEJyQp&9H! zCb^ZkMdV2$a)j~*leCHM#*>wmm35U8&()7=-+g;W{jm+43{-lb#sHnhGd2*@#_;W{ zg=g|n(kGD~9^Z2x$M7sd2Y{ToLAkxiil#XXG+K;0KVE_)0_uOlKz_J{e*R&I=%IBu z=cNwrI8YhkLtD$U@Bkgw05of84aoL_do`W}p7UJ1K)4BV6qO)@-gQe-e4Bvf5x{{S;SKTjkfFA@wDDJV8hSYa3yA8~hm&)nu3 z3=T(2SC%~>%x52|vCRL!W(x-m78Mt2bbWOVF+~m`z`(%FLw~_6#r`&|XB7?X(yOpckob>Esrufx-Ztq`IZw z+ygaGhln8*M|6JB>9WjYS|D^R$MI_nisC3bMWELxUPhwiGoVCqTpK46A7?-f z6!vV7!8GytcVVo>DAPanqP_(ujy~ zN>esj&&SkpzhG#BfRn0fn&gDAycU4T-+vh;oYVRrWht!0)xJOih}I^c3Aq6gOBuvb zBT5o!K4C%F#P$FxD^fSf3B5s3Lkx)zlR#h?;Y=Ato3nI4Nz(yRej6+2pnXVMAX=7c zhs+5Fx7>p5eKQGE6bcW76NMh<78p+QEs1!c{3Ut-@YK_2#-d3wdqLe@h`hYKyu7@;yu7@;yu571DQ;2=Tb`1#K+RQgdCrFcGQ&Ih&0E5`RQ;X5MZu0aRjqwqS0lkdIg__me(Do%jnRIxpKc z0Gw5*4%j&xTMXfS%3Z<>lpN);-Vj`?Dc>-PxTncF*reVUkby z#dH2mfJUi0ttQitGT|`kvPYgpIZI=nQL0Y2esTvvRO?}zgU9TeR2`XQz<<*TB$n2t z#SYSOU1m+1rkQpZl(eZj6%4D>VG0VZlhat1eRmQ^@Rh^xnB|rHN2c?7tffuWf!k?H zGqrY-h?{aS$hRVCrYw<1P>K8>nY@+;V5;Rn`cxel=hH#f5KjotWgtJOw-2Ey*e^@J zvlTfc`c$2w9NpURq#o9a{(q-MZz2yu4n)O$1Q+&}p|t`?m#Xu4gTlKh4mi2kzgc}4 zf-NsVPSbmuRGqr73*-!rwoto7?=1f>gTDF>Zq}XqE7hjz01zB*y+&uD7KoC&B5Z5i zd_&Wv>g2a3V+YnuS0wnsqM7J9(UAhR7-zToRGqGR?Sv2SHp2M^Wq&jIg9Reg2&75X znVaGg-KH=WTXZ4;j_IaYm#RZ&CQA6K+$S+vWw`0nO?RGqyydb3K3HufEEwx+wFXg)= z>+2lw%)9`g+xEEN2!BcC8go7YsIRiGeKv?5J+;m2W^8$M*4rk!6`mvXLWkn%88!(9 zw1z!&8>mmi83u57u007R81jUD6xq5C_o5)X3RNDo&s+nIUp!TX;%sCkAb)C&c~`CQ(X z?qX^h!LDQ?bBS9>9w$Q2P#$2AHqg;{yu7@;o+Za)^|e}d-Cj_?Z37zvh1x|Mpv`#t z25j2s-o6@W27ezReh{hQ(JkvZx+M#(08-`+!ugvlYns(Sy~nWQ<3|ujK+TUCNDt>Q z&RYfx3r)i*t7^FQK%qqpJsyPyXtg?^QA1Ne(hBO?xDk-%4;@fDsW_e(ThB3Ou(Oc9 zFLVuL+c9=n+XCS)9XcYHKnpIe;|g3~WtINT%gf8_*A~_PRK$D8lwQPn00000NkvXX Hu0mjfYa-31 diff --git a/icons/obj/guns/manufacturer/inteq/lefthand.dmi b/icons/obj/guns/manufacturer/inteq/lefthand.dmi index 84707c2e5cdc429dbae46840a43cb4eeb228bf53..7ed89aacf95e8cec8e47e3fd7494a93fffddb15a 100644 GIT binary patch delta 1655 zcmV--28j9RDEkbM7k_{V0{{R3ySl zcQ73!PFP`TbbTTsB26+pZc=0#3=Td&Pr$&yEiElcNl9Q}VE?~nsjLCTY>%v;Y7A0d!JMQvg8b*negK004@5R9JLGWpiV4 zX>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3K9+y);jWi!&v&s2HS$i!-e#F*g;&Hbkh&%qvMPj89L^OD)PwCa5~i zBp$4Rpu*zpTz^tk7U!npQmm}t>gNIu0s!7iO)%izcJ}}P1vW`UK~#90?VF2M+$t1? z5gbY6V%unFt>gPY=Gj~W1adj`Qdjq{;{>w#*+7QXe3KG_LZMJ76bgkxeL>y4Q|qI? zl-+Kgzg+Ihio15)!Pbk-<#Nb@(_!2UxVzk!75B%CgMaGQnaz=r3MrKyH#59>DEl~< zA9?6xcz<~~vc`fdLLtMgRlXsYZ%gUh1u9NlmSyYG=7WqaWXo=eBO0 zbkc^>^Sz=_C=?2XLZMJ7)Ylf(`ft7$(wf=d&rYK+%Ba2J{p>W>N{E0uwL;j?Yx5Br zv>vQ9EPpU8a$^cvz4E$F_`T$^(SlC!BiZBA6B`{CVipl`IN(wWn7<)|MH9S)j*YEu z*|}bO^zN3emXD5l95t70f}g=Ia7d7Gt|S~t#W}NCFA3UgxNSB@yYb|F_UPR>tP*54 zC#Dpi=UFIM7;FOeh`R*2s{|G8ly4Y(_c&6m4u8D^AJuPUjByDLKW)j5B+Ot)_gAms zE%=_@JX`ecfRCN2>{F}+{1I+UT=rp>248mWB5cyT13p|Rn-09BFNYVDrRY!o{{nH1 zM*BX~BwRk+e}EUQDn3bSnr8RTtNBuv`u-I%#=WUJomgQ$HXRfSg+ifFC=}`+(=NTE zEq}1`adPx-BLmO(x~Cmx`BRCl8$5eoy~Zo~c^k2+4!7_F=irwDhAI}f`eB1I%XM}Pb^ zro=qYFaQte)_jlnrHFhl^a%~wip!+e2x08N>#g_@C+^a z8z^0s@tt?K$P^J06m?_?=+xF$#(!gsT=?FiInXs;ba0JLyL)(w2yX#_Rb9vZ8&3BV zgbd2)%4435?_+&-e-954W}aK-3D8Z`2B=dZ`xW2wJ%ld!3a+^}y8sYA86nZuSPlX@ zv)S8z5(o4qCMXmNg+ifFC=}}J=}qw7d*}$>JNvNQe*A5>uu_fp>KpPb#(xJK;D2ol zt9ucw6GWPL&;H-Vg!e*wEhbs;zjcCDWjiMDKRF4#L{#==n+D#qxF+Jg5Hu(=m;8?; zRuQg?ivQ)$!KEu_;eWGHOGITKYJ+_P?^)0j@m_FXe1ak7{0|NSq2Q8gJ#NLGk+X+vB|?Q}I7otS~WLz#yM#m;a@Rg8x+n!xa6~ z=f%FrGJAmP`r`0jc2>EsA?O0HQi5TcHWFNpsr#NotviqQN$Uhf`H0-rsEpf5?g=Q( zKI1C;OJqO6+?Dzzs)v)=H=9{Sytm|@b46(@Um0OF{|n;TCg0voeQ-|T@MD&sB6N?81c#)5qtKoejo4oFL3txUz?x>{^uU)t|NBsH+(bEb5D}C z)&H*T&+Xsj9~1TE_lEWxlYc^Ly~n(zJqq=&=|9D^M7B@U6hr_3002ovPDHLkV1n!8 B5!e6# literal 5223 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 R+@{^9c31OGsgl{N{|9D}614yT literal 27978 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 Bw`2eS diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/lefthand.dmi index 24ac86c3e0b57784ad56ce29232c14d472ff1248..f91c263424efe7cf547c4eeae585c06d7574330a 100644 GIT binary patch literal 35330 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 diff --git a/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi b/icons/obj/guns/manufacturer/nanotrasen_sharplite/righthand.dmi index b6831ec9696a0c76241e0b598fbfcc9bc37a3953..ef01a242944d810122ef3d25a70679ef6f323cd5 100644 GIT binary patch literal 36809 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 literal 37047 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 Date: Thu, 17 Oct 2024 18:16:26 -0500 Subject: [PATCH 14/25] Automatic changelog generation for PR #3580 [ci skip] --- html/changelogs/AutoChangeLog-pr-3580.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3580.yml diff --git a/html/changelogs/AutoChangeLog-pr-3580.yml b/html/changelogs/AutoChangeLog-pr-3580.yml new file mode 100644 index 000000000000..dbb1e7210b3b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3580.yml @@ -0,0 +1,4 @@ +author: rye-rice +changes: + - {rscadd: Resprites the commander and Commissioner} +delete-after: true From 751f28668e983e6eec4a81b08165146fc7c1c6d6 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 18 Oct 2024 01:02:27 +0000 Subject: [PATCH 15/25] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3246.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3477.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3575.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3577.yml | 6 ------ html/changelogs/AutoChangeLog-pr-3580.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3581.yml | 4 ---- html/changelogs/archive/2024-10.yml | 15 +++++++++++++++ 7 files changed, 15 insertions(+), 27 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3246.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3477.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3575.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3577.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3580.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3581.yml diff --git a/html/changelogs/AutoChangeLog-pr-3246.yml b/html/changelogs/AutoChangeLog-pr-3246.yml deleted file mode 100644 index a877fb96e567..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3246.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: meemofcourse -changes: - - {rscadd: Atlas-class Light Armored Crusier} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3477.yml b/html/changelogs/AutoChangeLog-pr-3477.yml deleted file mode 100644 index b0f28a0aebcd..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3477.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: DIB-DOG -changes: - - {rscdel: Removed extra turret that wasn't supposed to be on the ship} - - {bugfix: Moved armory flashbangs to a more secure location} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3575.yml b/html/changelogs/AutoChangeLog-pr-3575.yml deleted file mode 100644 index da31593b7759..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3575.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Erikafox -changes: - - {rscdel: Wasteplanets no longer spawn welding fuel tanks.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3577.yml b/html/changelogs/AutoChangeLog-pr-3577.yml deleted file mode 100644 index 6d6ee83313d1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3577.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: SomeguyManperson -changes: - - {balance: 'being thrown over lava by tackling, jump boots, or with assistance - now fully clears the lava instead of burning you horribly and setting you on - fire'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3580.yml b/html/changelogs/AutoChangeLog-pr-3580.yml deleted file mode 100644 index dbb1e7210b3b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3580.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: rye-rice -changes: - - {rscadd: Resprites the commander and Commissioner} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3581.yml b/html/changelogs/AutoChangeLog-pr-3581.yml deleted file mode 100644 index 935fbd451c5b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3581.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: generalthrax -changes: - - {bugfix: Fixed a typo in the Frontiersman softcap that made the sprite go invisible} -delete-after: true diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index f53f84907a32..f01ea10489ed 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -238,3 +238,18 @@ - bugfix: Gezena has shoes again - rscdel: Gezenan captain gloves no longer have partial insulation in parity with other captain gloves. +2024-10-18: + DIB-DOG: + - rscdel: Removed extra turret that wasn't supposed to be on the ship + - bugfix: Moved armory flashbangs to a more secure location + Erikafox: + - rscdel: Wasteplanets no longer spawn welding fuel tanks. + SomeguyManperson: + - balance: being thrown over lava by tackling, jump boots, or with assistance now + fully clears the lava instead of burning you horribly and setting you on fire + generalthrax: + - bugfix: Fixed a typo in the Frontiersman softcap that made the sprite go invisible + meemofcourse: + - rscadd: Atlas-class Light Armored Crusier + rye-rice: + - rscadd: Resprites the commander and Commissioner From 9d27e3b35086f75e6f4321ee7a5e006a3f920c60 Mon Sep 17 00:00:00 2001 From: Orchid <71460403+Orchidthederg@users.noreply.github.com> Date: Thu, 17 Oct 2024 19:54:52 -0500 Subject: [PATCH 16/25] Adds Sprites for Overmap Storm Severities (#3578) ## About The Pull Request Gives storms some visual differentiation from the minor/moderate/major versions, adding some visual flavor and readability. ![image](https://github.com/user-attachments/assets/9d4ec565-d207-4a2b-9644-b4861788452f) ### Meteors: ![image](https://github.com/user-attachments/assets/9a10bb88-9908-4535-b9cb-b927ea4d0ab4) ### Electrical Storms: ![image](https://github.com/user-attachments/assets/0dabba78-eab6-4d86-bf01-7e59f055eda5) ### Carp Storms: ![image](https://github.com/user-attachments/assets/4f7cd59d-a934-4637-902f-f68a4ffc6a9c) ## Why It's Good For The Game A ton of people have complained about not being able to pick apart various storm severities, and this makes it pretty obvious which ones will MURDER YOU AND YOUR CREW and which ones will pleasantly tickle your hull ## Changelog :cl: fix: fallback sprite for dust storms was set to the carp sprite for some reason. imageadd: fancy new carp, meteor, and electrical storm imagedel: old carp, meteor, and electrical storm sprites /:cl: (soul: taken out back and shot) --- code/modules/overmap/objects/event_datum.dm | 44 ++++++++++++++++---- icons/misc/overmap.dmi | Bin 5704 -> 12563 bytes 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/code/modules/overmap/objects/event_datum.dm b/code/modules/overmap/objects/event_datum.dm index d798fd74778a..9381e8cae6d5 100644 --- a/code/modules/overmap/objects/event_datum.dm +++ b/code/modules/overmap/objects/event_datum.dm @@ -41,7 +41,7 @@ /datum/overmap/event/meteor name = "asteroid field (moderate)" desc = "An area of space rich with asteroids, going fast through here could prove dangerous" - token_icon_state = "meteor1" + token_icon_state = "meteor_moderate1" chance_to_affect = 15 spread_chance = 50 chain_rate = 4 @@ -55,7 +55,15 @@ /datum/overmap/event/meteor/Initialize(position, ...) . = ..() - token.icon_state = "meteor[rand(1, 4)]" + switch(type) //woop! this picks one of two icon states for the severity of the storm in overmap.dmi + if(/datum/overmap/event/meteor/minor) + token.icon_state = "meteor_minor[rand(1, 2)]" + if(/datum/overmap/event/meteor) + token.icon_state = "meteor_moderate[rand(1, 2)]" + if(/datum/overmap/event/meteor/major) + token.icon_state = "meteor_major[rand(1, 2)]" + else + token.icon_state = "meteor_moderate1" token.color = "#a08444" token.light_color = "#a08444" token.update_appearance() @@ -133,7 +141,7 @@ /datum/overmap/event/electric name = "electrical storm (moderate)" desc = "A spatial anomaly, an unfortunately common sight on the frontier. Disturbing it tends to lead to intense electrical discharges" - token_icon_state = "electrical1" + token_icon_state = "electrical_moderate1" chance_to_affect = 15 spread_chance = 30 chain_rate = 3 @@ -143,7 +151,16 @@ /datum/overmap/event/electric/Initialize(position, ...) . = ..() - token.icon_state = "electrical[rand(1, 4)]" + switch(type) //woop! this picks one of two icon states for the severity of the storm in overmap.dmi + if(/datum/overmap/event/electric/minor) + token.icon_state = "electrical_minor[rand(1, 2)]" + if(/datum/overmap/event/electric) + token.icon_state = "electrical_moderate[rand(1, 2)]" + if(/datum/overmap/event/electric/major) + token.icon_state = "electrical_major[rand(1, 2)]" + else + token.icon_state = "electrical_moderate1" + token.color = "#e8e85c" token.light_color = "#e8e85c" token.update_appearance() @@ -218,7 +235,7 @@ /datum/overmap/event/meteor/carp name = "carp migration (moderate)" desc = "A migratory school of space carp. They travel at high speeds, and flying through them may cause them to impact your ship" - token_icon_state = "carp1" + token_icon_state = "carp_moderate1" chance_to_affect = 15 spread_chance = 50 chain_rate = 4 @@ -230,7 +247,16 @@ /datum/overmap/event/meteor/carp/Initialize(position, ...) . = ..() - token.icon_state = "carp[rand(1, 4)]" + switch(type) //woop! this picks one of two icon states for the severity of the storm in overmap.dmi + if(/datum/overmap/event/meteor/carp/minor) + token.icon_state = "carp_minor[rand(1, 2)]" + if(/datum/overmap/event/meteor/carp) + token.icon_state = "carp_moderate[rand(1, 2)]" + if(/datum/overmap/event/meteor/carp/major) + token.icon_state = "carp_major[rand(1, 2)]" + else + token.icon_state = "carp_moderate1" + token.color = "#7b1ca8" token.light_color = "#7b1ca8" token.update_icon() @@ -238,7 +264,7 @@ /datum/overmap/event/meteor/carp/minor name = "carp migration (minor)" - token_icon_state = "carp1" + token_icon_state = "carp_moderate1" chance_to_affect = 5 spread_chance = 25 chain_rate = 4 @@ -249,7 +275,7 @@ /datum/overmap/event/meteor/carp/major name = "carp migration (major)" - token_icon_state = "carp1" + token_icon_state = "carp_moderate1" chance_to_affect = 25 spread_chance = 25 chain_rate = 4 @@ -263,7 +289,7 @@ /datum/overmap/event/meteor/dust name = "dust cloud" desc = "A cloud of spaceborne dust. Relatively harmless, unless you're travelling at relative speeds" - token_icon_state = "carp1" + token_icon_state = "dust1" chance_to_affect = 30 spread_chance = 50 chain_rate = 4 diff --git a/icons/misc/overmap.dmi b/icons/misc/overmap.dmi index f0c9f6e446779c6989ef3c08927b08a15debdd9a..94ac33e29584879c09ff44eb428b176d61a6a39e 100644 GIT binary patch literal 12563 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 LQ=wAMBJ_U&hRX5T literal 5704 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 uv&bEUgGjHKNpu+39}~G&+v|5NP`V0000 Date: Thu, 17 Oct 2024 20:12:58 -0500 Subject: [PATCH 17/25] Automatic changelog generation for PR #3578 [ci skip] --- html/changelogs/AutoChangeLog-pr-3578.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3578.yml diff --git a/html/changelogs/AutoChangeLog-pr-3578.yml b/html/changelogs/AutoChangeLog-pr-3578.yml new file mode 100644 index 000000000000..6408d55fede1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3578.yml @@ -0,0 +1,6 @@ +author: Orchidthederg +changes: + - {bugfix: fallback sprite for dust storms was set to the carp sprite for some reason.} + - {imageadd: 'fancy new carp, meteor, and electrical storm'} + - {imagedel: 'old carp, meteor, and electrical storm sprites'} +delete-after: true From 50566a1cb4ce89885674f085ebb7e7dfea3f6436 Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Fri, 18 Oct 2024 00:26:16 -0500 Subject: [PATCH 18/25] Emote Stuff (Courtesy of NithaIsTired) (#3562) ## About The Pull Request A really old emote pr made by @NithaIsTired that @rye-rice asked me to pr and finish. Adds stuff like: > visible trembling emote > visible shivering > audible snapping > booping lizard snouts > other stuff i dont remember > its a lot ## Why It's Good For The Game It's cute and cool. ## Changelog :cl: NithaIsTired add: Adds a ton of audible emotes and visible emotes like snapping your fingers or twitching add: You can boop people on the nose by clicking on their mouth with help intent add: Sound variation with a few emotes like snapping and clapping add: Laying down now plays a sound if you aren't on walk intent /:cl: --------- Signed-off-by: rye-rice <58402542+rye-rice@users.noreply.github.com> Co-authored-by: Nitha Co-authored-by: Nitha <132854285+NithaIsTired@users.noreply.github.com> Co-authored-by: rye-rice <58402542+rye-rice@users.noreply.github.com> --- code/__DEFINES/dcs/signals/signals.dm | 1 - .../mood_events/generic_negative_events.dm | 15 ++ .../mood_events/generic_positive_events.dm | 13 ++ code/game/turfs/turf.dm | 4 +- .../mob/living/carbon/carbon_defense.dm | 76 +++++++-- code/modules/mob/living/carbon/emote.dm | 19 --- code/modules/mob/living/emote.dm | 146 ++++++++++++++++++ code/modules/mob/living/living.dm | 9 +- sound/effects/Nose_boop.ogg | Bin 0 -> 27095 bytes sound/effects/boop.ogg | Bin 0 -> 16245 bytes sound/misc/claponce1.ogg | Bin 0 -> 7299 bytes sound/misc/claponce2.ogg | Bin 0 -> 11036 bytes sound/misc/fingersnap1.ogg | Bin 0 -> 7050 bytes sound/misc/fingersnap2.ogg | Bin 0 -> 6004 bytes sound/misc/snap2.ogg | Bin 0 -> 13617 bytes sound/misc/snap3.ogg | Bin 0 -> 18541 bytes 16 files changed, 249 insertions(+), 34 deletions(-) create mode 100644 sound/effects/Nose_boop.ogg create mode 100644 sound/effects/boop.ogg create mode 100644 sound/misc/claponce1.ogg create mode 100644 sound/misc/claponce2.ogg create mode 100644 sound/misc/fingersnap1.ogg create mode 100644 sound/misc/fingersnap2.ogg create mode 100644 sound/misc/snap2.ogg create mode 100644 sound/misc/snap3.ogg diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm index 638b5220bc3c..9e034edeeb2c 100644 --- a/code/__DEFINES/dcs/signals/signals.dm +++ b/code/__DEFINES/dcs/signals/signals.dm @@ -527,7 +527,6 @@ #define COMSIG_CARBON_HUGGED "carbon_hugged" ///When a carbon mob is headpatted, this is called on the carbon that is headpatted. (mob/living/headpatter) #define COMSIG_CARBON_HEADPAT "carbon_headpatted" - ///When a carbon slips. Called on /turf/open/handle_slip() #define COMSIG_ON_CARBON_SLIP "carbon_slip" ///When a carbon gets a vending machine tilted on them diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index f5e51d1d59f4..a3b44b5c29e1 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -302,3 +302,18 @@ description = span_boldwarning("It isn't ending... it isn't ending, come on...\n") mood_change = -18 timeout = 3 MINUTES + +/datum/mood_event/bad_touch_bear_hug + description = "I just got squeezed way too hard." + mood_change = -3 + timeout = 2 MINUTES + +/datum/mood_event/rippedtail + description = "I ripped their tail right off, what have I done!\n" + mood_change = -5 + timeout = 30 SECONDS + +/datum/mood_event/bad_boop + description = "Someone booped my nose... ACK!\n" + mood_change = -3 + timeout = 4 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 1ab201bc0186..e35d798386c8 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -1,6 +1,11 @@ /datum/mood_event/hug description = "Hugs are nice.\n" mood_change = 1 + timeout = 2 + +/datum/mood_event/bear_hug + description = "I got squeezed very tightly, but it was quite nice." + mood_change = 2 timeout = 2 MINUTES /datum/mood_event/betterhug @@ -19,6 +24,14 @@ /datum/mood_event/besthug/add_effects(mob/friend) description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!\n" +/datum/mood_event/best_boop + description = "Someone booped my nose, they are silly!\n" + mood_change = 5 + timeout = 4 MINUTES + +/datum/mood_event/best_boop/add_effects(mob/friend) + description = "[friend.name] booped my nose, [friend.p_they()] [friend.p_are()] silly!\n" + /datum/mood_event/warmhug description = "Warm cozy hugs are the best!\n" mood_change = 1 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e5cc9709559c..8a90ac9fe614 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -582,8 +582,8 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists) /turf/proc/acid_melt() return -/turf/handle_fall(mob/faller) - if(has_gravity(src)) +/turf/handle_fall(mob/faller, fall_sound_played) + if(has_gravity(src) && !fall_sound_played) playsound(src, "bodyfall", 50, TRUE) faller.drop_all_held_items() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 62174120a60f..56b8fe2792d4 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -399,6 +399,8 @@ Paralyze(60) /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) + var/datum/component/mood/hugger_mood = M.GetComponent(/datum/component/mood) + var/nosound = FALSE if(on_fire) to_chat(M, "You can't put [p_them()] out with just your bare hands!") return @@ -426,6 +428,22 @@ mothdust += 10; if(istype(dna.species, /datum/species/moth)) M.mothdust += 10; // End WS edit + + if(M.zone_selected == BODY_ZONE_PRECISE_MOUTH) // Nose boops! + nosound = TRUE + playsound(src, 'sound/effects/boop.ogg', 50, 0) + if (HAS_TRAIT(M, TRAIT_FRIENDLY)) + M.visible_message(span_notice("[M] playfully boops your nose."), span_notice("You playfully boop [src]'s nose.")) + if (hugger_mood.sanity >= SANITY_GREAT) + new /obj/effect/temp_visual/heart(loc) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "best_boop", /datum/mood_event/best_boop, M) + else + M.visible_message(span_notice("[M] boops [src]'s nose."), span_notice("You boop [src] on the nose.")) + if(HAS_TRAIT(src, TRAIT_BADTOUCH)) + to_chat(M, span_warning("A scowl forms on [src]'s face as you daringly press your finger against [p_their()] nose.")) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "bad_boop", /datum/mood_event/bad_boop, M) + + else if(check_zone(M.zone_selected) == BODY_ZONE_HEAD) //Headpats! SEND_SIGNAL(src, COMSIG_CARBON_HEADPAT, M) M.visible_message("[M] gives [src] a pat on the head to make [p_them()] feel better!", \ @@ -440,10 +458,35 @@ if(HAS_TRAIT(src, TRAIT_BADTOUCH)) to_chat(M, "[src] looks visibly upset as you pat [p_them()] on the head.") +// Tail pulls! + else if((M.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.getorgan(/obj/item/organ/tail))) + M.visible_message(span_notice("[M] pulls on [src]'s tail!"), \ + null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(M, src)) + to_chat(M, span_notice("You pull on [src]'s tail!")) + to_chat(src, span_notice("[M] pulls on your tail!")) + +// Rips off fake tails + else if((M.zone_selected == BODY_ZONE_PRECISE_GROIN) && (istype(head, /obj/item/clothing/head/kitty) || istype(head, /obj/item/clothing/head/collectable/kitty))) + var/obj/item/clothing/head/faketail = head + M.visible_message(span_danger("[M] pulls on [src]'s tail... and it rips off!"), \ + null, span_hear("You hear a ripping sound."), DEFAULT_MESSAGE_RANGE, list(M, src)) + to_chat(M, span_danger("You pull on [src]'s tail... and it rips off!")) + to_chat(src, span_userdanger("[M] pulls on your tail... and it rips off!")) + playsound(loc, 'sound/effects/rip1.ogg', 75, TRUE) + dropItemToGround(faketail) + M.put_in_hands(faketail) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "rippedtail", /datum/mood_event/rippedtail) + else if(M.zone_selected == BODY_ZONE_CHEST || M.zone_selected == BODY_ZONE_PRECISE_GROIN) //WS Edit - Adds more help emotes SEND_SIGNAL(src, COMSIG_CARBON_HUGGED, M) SEND_SIGNAL(M, COMSIG_CARBON_HUG, M, src) - M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ + if (M.grab_state >= GRAB_AGGRESSIVE) + M.visible_message(span_notice("[M] embraces [src] in a tight bear hug!"), \ + null, span_hear("You hear the rustling of clothes."), DEFAULT_MESSAGE_RANGE, list(M, src)) + to_chat(M, span_notice("You wrap [src] into a tight bear hug!")) + to_chat(src, span_notice("[M] squeezes you super tightly in a firm bear hug!")) + else + M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") if(istype(M.dna.species, /datum/species/moth)) //WS edit - moth dust from hugging mothdust += 15; @@ -455,12 +498,17 @@ // No moodlets for people who hate touches if(!HAS_TRAIT(src, TRAIT_BADTOUCH)) - if(bodytemperature > M.bodytemperature) - if(!HAS_TRAIT(M, TRAIT_BADTOUCH)) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, src) // Hugger got a warm hug (Unless they hate hugs) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) // Reciver always gets a mood for being hugged - else - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, M) // You got a warm hug + if (M.grab_state >= GRAB_AGGRESSIVE) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/bear_hug) + if(bodytemperature > M.bodytemperature) + if(!HAS_TRAIT(M, TRAIT_BADTOUCH)) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug) // Hugger got a warm hug (Unless they hate hugs) + SEND_SIGNAL(M, "hug", /datum/mood_event/hug) // Receiver always gets a mood for being hugged + else + SEND_SIGNAL(M, "hug", /datum/mood_event/warmhug,) // You got a warm hug + else + if (M.grab_state >= GRAB_AGGRESSIVE) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/bad_touch_bear_hug) // Let people know if they hugged someone really warm or really cold if(M.bodytemperature > M.dna.species.bodytemp_heat_damage_limit) @@ -474,7 +522,6 @@ to_chat(M, "It feels like [src] is freezing as you hug them.") if(HAS_TRAIT(M, TRAIT_FRIENDLY)) - var/datum/component/mood/hugger_mood = M.GetComponent(/datum/component/mood) if (hugger_mood.sanity >= SANITY_GREAT) new /obj/effect/temp_visual/heart(loc) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M) @@ -503,8 +550,17 @@ AdjustParalyzed(-60) AdjustImmobilized(-60) set_resting(FALSE) - - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + if(!nosound) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + +// Shake animation +#define SHAKE_ANIMATION_OFFSET (4) + if (incapacitated()) + var/direction = prob(50) ? -1 : 1 + animate(src, pixel_x = pixel_x + SHAKE_ANIMATION_OFFSET * direction, time = 1, easing = QUAD_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) + animate(pixel_x = pixel_x - (SHAKE_ANIMATION_OFFSET * 2 * direction), time = 1) + animate(pixel_x = pixel_x + SHAKE_ANIMATION_OFFSET * direction, time = 1, easing = QUAD_EASING | EASE_IN) +#undef SHAKE_ANIMATION_OFFSET /// Check ourselves to see if we've got any shrapnel, return true if we do. This is a much simpler version of what humans do, we only indicate we're checking ourselves if there's actually shrapnel /mob/living/carbon/proc/check_self_for_injuries() diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 5e5e8fca6d24..358fa0626092 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -39,25 +39,6 @@ key = "blink_r" message = "blinks rapidly." -/datum/emote/living/carbon/clap - key = "clap" - key_third_person = "claps" - message = "claps." - muzzle_ignore = TRUE - hands_use_check = TRUE - emote_type = EMOTE_AUDIBLE - vary = TRUE - -/datum/emote/living/carbon/clap/get_sound(mob/living/user) - if(ishuman(user)) - if(!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) - return - else - return pick('sound/misc/clap1.ogg', - 'sound/misc/clap2.ogg', - 'sound/misc/clap3.ogg', - 'sound/misc/clap4.ogg') - /datum/emote/living/carbon/crack key = "crack" key_third_person = "cracks" diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 56ae0db795e5..f4042464f981 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -232,6 +232,16 @@ message = "jumps!" hands_use_check = TRUE +/datum/emote/living/jump/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_y = user.pixel_y + 4, time = 0.1 SECONDS) + animate(pixel_y = user.pixel_y - 4, time = 0.1 SECONDS) + +/datum/emote/living/jump/get_sound(mob/living/user) + return 'sound/weapons/thudswoosh.ogg' + /datum/emote/living/kiss key = "kiss" key_third_person = "kisses" @@ -361,6 +371,18 @@ message = "shivers." emote_type = EMOTE_AUDIBLE +#define SHIVER_LOOP_DURATION (1 SECONDS) +/datum/emote/living/shiver/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + for(var/i in 1 to SHIVER_LOOP_DURATION / (0.2 SECONDS)) //desired total duration divided by the iteration duration to give the necessary iteration count + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) +#undef SHIVER_LOOP_DURATION + /datum/emote/living/sigh key = "sigh" key_third_person = "sighs" @@ -460,20 +482,62 @@ key_third_person = "sways" message = "sways around dizzily." +/datum/emote/living/sway/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x + 2, time = 0.5 SECONDS) + for(var/i in 1 to 2) + animate(pixel_x = user.pixel_x - 4, time = 1.0 SECONDS) + animate(pixel_x = user.pixel_x + 4, time = 1.0 SECONDS) + animate(pixel_x = user.pixel_x - 2, time = 0.5 SECONDS) + /datum/emote/living/tremble key = "tremble" key_third_person = "trembles" message = "trembles in fear!" +#define TREMBLE_LOOP_DURATION (4.4 SECONDS) +/datum/emote/living/tremble/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x + 2, time = 0.2 SECONDS) + for(var/i in 1 to TREMBLE_LOOP_DURATION / (0.4 SECONDS)) //desired total duration divided by the iteration duration to give the necessary iteration count + animate(pixel_x = user.pixel_x - 2, time = 0.2 SECONDS) + animate(pixel_x = user.pixel_x + 2, time = 0.2 SECONDS) + animate(pixel_x = user.pixel_x - 2, time = 0.2 SECONDS) +#undef TREMBLE_LOOP_DURATION + /datum/emote/living/twitch key = "twitch" key_third_person = "twitches" message = "twitches violently." +/datum/emote/living/twitch/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + animate(time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + /datum/emote/living/twitch_s key = "twitch_s" message = "twitches." +/datum/emote/living/twitch_s/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + animate(time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + /datum/emote/living/wave key = "wave" key_third_person = "waves" @@ -603,3 +667,85 @@ key_third_person = "clacks" message = "clacks their beak." emote_type = EMOTE_VISIBLE + +/datum/emote/living/tilt + key = "tilt" + key_third_person = "tilts" + message = "tilts their head to the side." + +/datum/emote/living/carbon/snap + key = "snap" + key_third_person = "snaps" + message = "snaps their fingers." + message_param = "snaps their fingers at %t." + emote_type = EMOTE_AUDIBLE + hands_use_check = TRUE + muzzle_ignore = TRUE + +/datum/emote/living/carbon/snap/get_sound(mob/living/user) + if(ishuman(user)) + if(!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) + return + else + return pick('sound/misc/fingersnap1.ogg', + 'sound/misc/fingersnap2.ogg') + +/datum/emote/living/snap2 + key = "snap2" + key_third_person = "snaps twice" + message = "snaps twice." + message_param = "snaps twice at %t." + emote_type = EMOTE_AUDIBLE + muzzle_ignore = TRUE + hands_use_check = TRUE + vary = TRUE + sound = 'sound/misc/snap2.ogg' + +/datum/emote/living/snap3 + key = "snap3" + key_third_person = "snaps thrice" + message = "snaps thrice." + message_param = "snaps thrice at %t." + emote_type = EMOTE_AUDIBLE + muzzle_ignore = TRUE + hands_use_check = TRUE + vary = TRUE + sound = 'sound/misc/snap3.ogg' + +/datum/emote/living/carbon/clap + key = "clap" + key_third_person = "claps" + message = "claps." + muzzle_ignore = TRUE + hands_use_check = TRUE + emote_type = EMOTE_AUDIBLE + vary = TRUE + +/datum/emote/living/carbon/clap/get_sound(mob/living/user) + if(ishuman(user)) + if(!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) + return + else + return pick('sound/misc/clap1.ogg', + 'sound/misc/clap2.ogg', + 'sound/misc/clap3.ogg', + 'sound/misc/clap4.ogg') + +/datum/emote/living/clap1 + key = "clap1" + key_third_person = "claps once" + message = "claps once." + emote_type = EMOTE_AUDIBLE + muzzle_ignore = TRUE + hands_use_check = TRUE + vary = TRUE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) + +/datum/emote/living/clap1/get_sound(mob/living/user) + return pick('sound/misc/claponce1.ogg', + 'sound/misc/claponce2.ogg') + +/datum/emote/living/clap1/can_run_emote(mob/living/carbon/user, status_check = TRUE , intentional) + if(user.usable_hands < 2) + return FALSE + return ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 741dfcc16015..5e3442ba039a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -484,7 +484,9 @@ if(!silent) to_chat(src, "You will now lay down as soon as you are able to.") else - if(!silent) + if(!silent && m_intent == MOVE_INTENT_WALK) + to_chat(src, "You gently lay down.") + else if(!silent) to_chat(src, "You lay down.") set_lying_down() else @@ -1787,12 +1789,15 @@ GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('icons/mob/ssd_indicat /// Changes the value of the [living/body_position] variable. -/mob/living/proc/set_body_position(new_value) +/mob/living/proc/set_body_position(new_value, fall_sound_played) if(body_position == new_value) return . = body_position body_position = new_value if(new_value == LYING_DOWN) // From standing to lying down. + if(has_gravity() && m_intent != MOVE_INTENT_WALK) + playsound(src, "bodyfall", 50, TRUE) // Will play the falling sound if not walking + fall_sound_played = TRUE on_lying_down() else // From lying down to standing up. on_standing_up() diff --git a/sound/effects/Nose_boop.ogg b/sound/effects/Nose_boop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6a742e95eac6eccfe8ec8993a90b667bd49298be GIT binary patch literal 27095 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 A82|tP literal 0 HcmV?d00001 diff --git a/sound/misc/claponce2.ogg b/sound/misc/claponce2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..10dfdba121b4923ee36e49ed4bf3ab86b3d8e8f9 GIT binary patch literal 11036 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 J8gq<{{tdIL^-KT& literal 0 HcmV?d00001 diff --git a/sound/misc/snap2.ogg b/sound/misc/snap2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1537084be43c0faa2291bbdc659735d7c5901554 GIT binary patch literal 13617 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 W(J`vUN*z_@P+P literal 0 HcmV?d00001 From 4b47a6cec938bc3c9187b35136c7f2f18c5b55ed Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 18 Oct 2024 00:36:50 -0500 Subject: [PATCH 19/25] Automatic changelog generation for PR #3562 [ci skip] --- html/changelogs/AutoChangeLog-pr-3562.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3562.yml diff --git a/html/changelogs/AutoChangeLog-pr-3562.yml b/html/changelogs/AutoChangeLog-pr-3562.yml new file mode 100644 index 000000000000..8fb3c3c5b991 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3562.yml @@ -0,0 +1,9 @@ +author: NithaIsTired +changes: + - {rscadd: Adds a ton of audible emotes and visible emotes like snapping your fingers + or twitching} + - {rscadd: You can boop people on the nose by clicking on their mouth with help + intent} + - {rscadd: Sound variation with a few emotes like snapping and clapping} + - {rscadd: Laying down now plays a sound if you aren't on walk intent} +delete-after: true From 744c61af44816bba4b8b6dfd79ed3de6bc89d755 Mon Sep 17 00:00:00 2001 From: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Thu, 17 Oct 2024 23:54:44 -0700 Subject: [PATCH 20/25] To Whom It May Concern - Bullet Writing (#3552) ## About The Pull Request You can now write on bullets with a pen to give your ~~victim~~ recipient a lovely message when they're hit. ![image](https://github.com/user-attachments/assets/859b62ac-5597-40f2-bc70-59bb6091015e) ## Why It's Good For The Game Adds a little personalization to your death dealing, and I think it'd be funny. ## Changelog :cl: add: Bullets can have a message written on them. /:cl: --- .../projectiles/ammunition/_ammo_casing.dm | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/ammunition/_ammo_casing.dm b/code/modules/projectiles/ammunition/_ammo_casing.dm index 02578e4592f8..88b7b42d334a 100644 --- a/code/modules/projectiles/ammunition/_ammo_casing.dm +++ b/code/modules/projectiles/ammunition/_ammo_casing.dm @@ -51,7 +51,20 @@ var/stack_size = 12 /obj/item/ammo_casing/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/ammo_box) && user.is_holding(src)) + if(istype(attacking_item, /obj/item/pen)) + if(!user.is_literate()) + to_chat(user, "You scribble illegibly on the [src]!") + return + var/inputvalue = stripped_input(user, "What would you like to label the round?", "Bullet Labelling", "", MAX_NAME_LEN) + + if(!inputvalue) + return + + if(user.canUseTopic(src, BE_CLOSE)) + name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]" + if(BB) + BB.name = "[initial(BB.name)][(inputvalue ? " - '[inputvalue]'" : null)]" + else if(istype(attacking_item, /obj/item/ammo_box) && user.is_holding(src)) add_fingerprint(user) var/obj/item/ammo_box/ammo_box = attacking_item var/obj/item/ammo_casing/other_casing = ammo_box.get_round(TRUE) @@ -92,6 +105,10 @@ return ..() +/obj/item/ammo_casing/examine(mob/user) + . = ..() + span_notice("You could write a message on \the [src] by writing on it with a pen.") + /obj/item/ammo_casing/proc/try_stacking(obj/item/ammo_casing/other_casing, mob/living/user) if(user) add_fingerprint(user) From bcb4bd61c39471e16e29c49997455c70179e0115 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 18 Oct 2024 02:05:51 -0500 Subject: [PATCH 21/25] Automatic changelog generation for PR #3552 [ci skip] --- html/changelogs/AutoChangeLog-pr-3552.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3552.yml diff --git a/html/changelogs/AutoChangeLog-pr-3552.yml b/html/changelogs/AutoChangeLog-pr-3552.yml new file mode 100644 index 000000000000..f263f974b90b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3552.yml @@ -0,0 +1,4 @@ +author: Gristlebee +changes: + - {rscadd: Bullets can have a message written on them.} +delete-after: true From cafd3ffa6590f717b48e372ca34a56f219bcbbf5 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Fri, 18 Oct 2024 01:31:44 -0700 Subject: [PATCH 22/25] Makes the Cobra not just a better Mongrel (and fixes a typo) (#3437) ## About The Pull Request Reduces the size of the C-20r and Cobra-20's magazines to 24 rounds, identical to the Mongrel. This also means you get two clean reloads out of a box of .45 ammunition instead of having one mag and _almost_ a second mag. Also, fixed the "civillian" typo in the cargo listings for scarborough guns. ## Why It's Good For The Game not getting two reloads out of a box is just plain irritating and also the cobra shouldn't just be a mongrel but better ## Changelog :cl: balance: Reduced Cobra-20 magazine size to 24 rounds fix: removed a typo from Scarborough cargo catalog entries /:cl: --------- Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 8 ++++---- .../manufacturer/scarborough/ballistics.dm | 6 +++--- icons/obj/ammo.dmi | Bin 59485 -> 63668 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 4074f76194d3..acc0be4e62e8 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -31,7 +31,7 @@ /datum/supply_pack/gun/ringneck name = "Ringneck Pistol Crate" - desc = "Contains a civillian variant of the Ringneck pistol, produced by Scarborough Arms and chambered in 10mm." + desc = "Contains a civilian variant of the Ringneck pistol, produced by Scarborough Arms and chambered in 10mm." cost = 1000 contains = list(/obj/item/storage/pistolcase/ringneck) faction = FACTION_SYNDICATE @@ -66,7 +66,7 @@ /datum/supply_pack/gun/viperrevolver name = "Viper-23 Revolver Crate" - desc = "Contains a a civillian variant of the Viper revolver, chambered in .357 magnum." + desc = "Contains a a civilian variant of the Viper revolver, chambered in .357 magnum." cost = 2500 contains = list(/obj/item/storage/pistolcase/viper) @@ -198,14 +198,14 @@ /datum/supply_pack/gun/boomslang90 name = "Boomslang-90 Rifle Crate" - desc = "Contains a civillian variant of the Boomslang Sniper rifle- modified with a 2x scope, rather than a sniper scope. Chambered in the powerful 6.5x57mm CLIP." + desc = "Contains a civilian variant of the Boomslang Sniper rifle- modified with a 2x scope, rather than a sniper scope. Chambered in the powerful 6.5x57mm CLIP." cost = 5000 contains = list(/obj/item/storage/guncase/boomslang) crate_name = "rifle crate" /datum/supply_pack/gun/cobra20 name = "Cobra-20 SMG Crate" - desc = "Contains a civillian variant of the Cobra SMG, manufactured by Scaraborough Arms and chambered in .45" + desc = "Contains a civilian variant of the Cobra SMG, manufactured by Scaraborough Arms and chambered in .45" cost = 3000 contains = list(/obj/item/storage/guncase/cobra) crate_name = "SMG crate" diff --git a/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm b/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm index c6755bc808fb..e4054f0ac1bb 100644 --- a/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm +++ b/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm @@ -421,12 +421,12 @@ EMPTY_GUN_HELPER(automatic/smg/cobra/indie) /obj/item/ammo_box/magazine/m45_cobra name = "Cobra magazine (.45)" - desc = "A 28-round magazine for the Cobra submachine gun. These rounds do moderate damage, but struggle against armor." - icon_state = "cobra_mag-28" + desc = "A 24-round magazine for the Cobra submachine gun. These rounds do moderate damage, but struggle against armor." + icon_state = "cobra_mag-24" base_icon_state = "cobra_mag" ammo_type = /obj/item/ammo_casing/c45 caliber = ".45" - max_ammo = 28 + max_ammo = 24 /obj/item/ammo_box/magazine/m45_cobra/update_icon_state() . = ..() diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index ec5f147485401833d8ad24fb12c0cf6a26dc9a09..633a49eda54cdda76e267094df7c7ec8c584a34c 100644 GIT binary patch literal 63668 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�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

ac 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 jo@1*2Kb7_E_9+R^B^pk%;)x{){M@y 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�|5v&&(+6#QTH|7xXxCio~B9FI+ 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

)AGle|iV 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 Date: Fri, 18 Oct 2024 03:51:36 -0500 Subject: [PATCH 23/25] Automatic changelog generation for PR #3437 [ci skip] --- html/changelogs/AutoChangeLog-pr-3437.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3437.yml diff --git a/html/changelogs/AutoChangeLog-pr-3437.yml b/html/changelogs/AutoChangeLog-pr-3437.yml new file mode 100644 index 000000000000..0c4f39c31eea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3437.yml @@ -0,0 +1,5 @@ +author: Apogee-dev +changes: + - {balance: Reduced Cobra-20 magazine size to 24 rounds} + - {bugfix: removed a typo from Scarborough cargo catalog entries} +delete-after: true From 18171b5e0d408067f7618ed377486d613a27f2c1 Mon Sep 17 00:00:00 2001 From: Erika Fox <94164348+Erikafox@users.noreply.github.com> Date: Fri, 18 Oct 2024 04:54:47 -0400 Subject: [PATCH 24/25] Kill Xenobio Stuff (#3527) ## About The Pull Request Removes Xenobiology (minus slimes since they're good fluffmobs sometimes). ## Why It's Good For The Game cruft. thgvr said they'd get me a therapist if I did this. ## Changelog :cl: del: Xenobiology (minus slimes) /:cl: --------- Signed-off-by: Erika Fox <94164348+Erikafox@users.noreply.github.com> Co-authored-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- .../JungleRuins/jungle_cavecrew.dmm | 12 +- .../RockRuins/rockplanet_budgetcuts.dmm | 14 - _maps/RandomRuins/SpaceRuins/power_puzzle.dmm | 4 +- .../shuttles/nanotrasen/nanotrasen_delta.dmm | 3 - check_regex.yaml | 6 +- code/__DEFINES/atmospherics.dm | 2 +- code/__DEFINES/dcs/signals/signals.dm | 8 - code/__DEFINES/flags.dm | 2 - code/__DEFINES/misc.dm | 9 - code/__DEFINES/mobs.dm | 4 +- code/__HELPERS/icons.dm | 7 - code/__HELPERS/mobs.dm | 22 - code/_globalvars/bitfields.dm | 1 - code/_globalvars/lists/flavor_misc.dm | 7 +- code/datums/components/dejavu.dm | 107 -- code/game/gamemodes/objective_items.dm | 11 - code/game/machinery/syndicatebomb.dm | 15 - .../effects/anomalies/anomalies_bluespace.dm | 2 +- .../circuitboards/computer_circuitboards.dm | 5 - .../circuitboards/machine_circuitboards.dm | 28 - code/game/objects/items/devices/scanners.dm | 60 - .../objects/items/grenades/chem_grenade.dm | 28 - .../objects/items/grenades/clusterbuster.dm | 40 - .../objects/items/implants/implant_misc.dm | 7 - code/game/objects/items/storage/bags.dm | 3 +- .../game/objects/items/storage/uplink_kits.dm | 1 - code/game/objects/structures/salvaging.dm | 2 - code/game/turfs/open/floor/misc_floor.dm | 14 - .../antagonists/changeling/changeling.dm | 14 - .../mission_code/moonoutpost19.dm | 121 -- code/modules/cargo/bounties/slime.dm | 39 - code/modules/cargo/bounty.dm | 16 +- .../clothing/outfits/factions/minutemen.dm | 4 +- .../kitchen_machinery/monkeyrecycler.dm | 103 -- .../kitchen_machinery/processor.dm | 59 +- .../kitchen_machinery/smartfridge.dm | 17 - .../recipes/processor_recipes.dm | 5 - .../recipes/tablecraft/recipes_pie.dm | 1 - code/modules/mining/minebot.dm | 24 - .../living/carbon/alien/special/facehugger.dm | 1 - .../living/carbon/human/species_types/IPC.dm | 2 +- .../carbon/human/species_types/abductors.dm | 2 +- .../carbon/human/species_types/android.dm | 2 +- .../carbon/human/species_types/ethereal.dm | 2 +- .../carbon/human/species_types/flypeople.dm | 2 +- .../carbon/human/species_types/humans.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 134 +-- .../carbon/human/species_types/kepori.dm | 2 +- .../human/species_types/lizardpeople.dm | 2 +- .../carbon/human/species_types/mothmen.dm | 2 +- .../carbon/human/species_types/podpeople.dm | 2 +- .../carbon/human/species_types/spider.dm | 2 +- .../living/carbon/human/species_types/vox.dm | 2 +- .../simple_animal/friendly/butterfly.dm | 1 - .../living/simple_animal/friendly/capybara.dm | 1 - .../mob/living/simple_animal/friendly/cat.dm | 3 - .../mob/living/simple_animal/friendly/crab.dm | 5 - .../mob/living/simple_animal/friendly/dog.dm | 4 - .../simple_animal/friendly/farm_animals.dm | 6 - .../mob/living/simple_animal/friendly/fox.dm | 2 - .../living/simple_animal/friendly/lizard.dm | 1 - .../simple_animal/friendly/mothroach.dm | 1 - .../living/simple_animal/friendly/mouse.dm | 2 - .../living/simple_animal/friendly/penguin.dm | 1 - .../living/simple_animal/friendly/sloth.dm | 3 - .../living/simple_animal/friendly/snake.dm | 1 - .../living/simple_animal/friendly/turtle.dm | 1 - .../mob/living/simple_animal/hostile/alien.dm | 3 - .../mob/living/simple_animal/hostile/bear.dm | 1 - .../mob/living/simple_animal/hostile/bees.dm | 1 - .../mob/living/simple_animal/hostile/carp.dm | 3 - .../living/simple_animal/hostile/cockroach.dm | 2 - .../living/simple_animal/hostile/eyeballs.dm | 1 - .../living/simple_animal/hostile/faithless.dm | 1 - .../simple_animal/hostile/giant_spider.dm | 6 - .../mob/living/simple_animal/hostile/goose.dm | 2 - .../living/simple_animal/hostile/headcrab.dm | 2 - .../living/simple_animal/hostile/hivebot.dm | 1 - .../simple_animal/hostile/human/survivors.dm | 2 +- .../simple_animal/hostile/human/syndicate.dm | 1 - .../simple_animal/hostile/killertomato.dm | 1 - .../hostile/megafauna/colossus.dm | 1 - .../mob/living/simple_animal/hostile/mimic.dm | 97 -- .../hostile/mining_mobs/basilisk.dm | 2 - .../hostile/mining_mobs/goldgrub.dm | 1 - .../hostile/mining_mobs/gutlunch.dm | 2 - .../simple_animal/hostile/netherworld.dm | 2 - .../living/simple_animal/hostile/regalrat.dm | 1 - .../simple_animal/hostile/retaliate/frog.dm | 1 - .../simple_animal/hostile/retaliate/ghost.dm | 1 - .../living/simple_animal/hostile/statue.dm | 1 - .../mob/living/simple_animal/hostile/tree.dm | 1 - .../simple_animal/hostile/wumborian_fugu.dm | 1 - .../mob/living/simple_animal/parrot.dm | 2 - .../mob/living/simple_animal/simple_animal.dm | 2 - .../mob/living/simple_animal/slime/slime.dm | 52 - .../movespeed/modifiers/status_effects.dm | 17 - code/modules/power/cell.dm | 12 - code/modules/reagents/chemistry/holder.dm | 14 - .../reagents/pyrotechnic_reagents.dm | 4 - code/modules/reagents/chemistry/recipes.dm | 32 - .../reagents/chemistry/recipes/others.dm | 20 - .../chemistry/recipes/slime_extracts.dm | 595 --------- .../research/designs/comp_board_designs.dm | 8 - .../research/designs/machine_designs.dm | 9 - code/modules/research/experimentor.dm | 1 - code/modules/research/rdconsole.dm | 23 - code/modules/research/techweb/all_nodes.dm | 4 +- .../xenobiology/crossbreeding/__corecross.dm | 193 --- .../xenobiology/crossbreeding/_clothing.dm | 78 -- .../xenobiology/crossbreeding/_misc.dm | 234 ---- .../xenobiology/crossbreeding/_mobs.dm | 45 - .../xenobiology/crossbreeding/_potions.dm | 217 ---- .../crossbreeding/_status_effects.dm | 971 --------------- .../xenobiology/crossbreeding/_weapons.dm | 38 - .../xenobiology/crossbreeding/burning.dm | 307 ----- .../xenobiology/crossbreeding/charged.dm | 272 ----- .../xenobiology/crossbreeding/chilling.dm | 301 ----- .../xenobiology/crossbreeding/consuming.dm | 460 ------- .../xenobiology/crossbreeding/industrial.dm | 199 --- .../xenobiology/crossbreeding/mutative.dm | 27 - .../xenobiology/crossbreeding/prismatic.dm | 124 -- .../xenobiology/crossbreeding/recurring.dm | 138 --- .../xenobiology/crossbreeding/regenerative.dm | 354 ------ .../xenobiology/crossbreeding/reproductive.dm | 133 -- .../crossbreeding/selfsustaining.dm | 149 --- .../xenobiology/crossbreeding/stabilized.dm | 190 --- .../research/xenobiology/xenobio_camera.dm | 473 -------- .../research/xenobiology/xenobiology.dm | 1072 ----------------- code/modules/surgery/core_removal.dm | 44 - code/modules/unit_tests/create_and_destroy.dm | 2 - code/modules/uplink/uplink_items.dm | 9 - shiptest.dme | 28 - 133 files changed, 41 insertions(+), 7968 deletions(-) delete mode 100644 code/datums/components/dejavu.dm delete mode 100644 code/modules/awaymissions/mission_code/moonoutpost19.dm delete mode 100644 code/modules/cargo/bounties/slime.dm delete mode 100644 code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm delete mode 100644 code/modules/movespeed/modifiers/status_effects.dm delete mode 100644 code/modules/reagents/chemistry/recipes/slime_extracts.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/__corecross.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_clothing.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_misc.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_mobs.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_potions.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_status_effects.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_weapons.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/burning.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/charged.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/chilling.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/consuming.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/industrial.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/mutative.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/prismatic.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/recurring.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/regenerative.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/reproductive.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/selfsustaining.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/stabilized.dm delete mode 100644 code/modules/research/xenobiology/xenobio_camera.dm delete mode 100644 code/modules/research/xenobiology/xenobiology.dm delete mode 100644 code/modules/surgery/core_removal.dm diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index 557a50d9a11e..923e58b4cb05 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -1028,14 +1028,10 @@ pixel_y = 32 }, /obj/structure/closet/secure_closet/freezer/wall/directional/west, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/condiment/enzyme{ pixel_x = -8; pixel_y = 5 diff --git a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm index 183df18879da..3b2b995fd979 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm @@ -960,21 +960,7 @@ /area/overmap_encounter/planetoid/rockplanet/explored) "pj" = ( /obj/structure/table/reinforced, -/obj/item/slime_extract/grey{ - pixel_x = -4; - pixel_y = -1 - }, -/obj/item/slime_extract/grey{ - pixel_x = 8 - }, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/green{ - pixel_x = 4; - pixel_y = -6 - }, /obj/structure/window/reinforced, -/obj/item/slime_scanner, /turf/open/floor/engine, /area/ruin/rockplanet/nanotrasen) "pl" = ( diff --git a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm index e126234531f2..e02a7e328b28 100644 --- a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm +++ b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm @@ -1850,8 +1850,8 @@ /obj/item/reagent_containers/food/drinks/waterbottle/empty, /obj/item/reagent_containers/food/drinks/waterbottle/empty, /obj/item/reagent_containers/food/drinks/waterbottle, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/snacks/sosjerky, /obj/item/reagent_containers/food/snacks/sosjerky, /obj/item/stack/medical/gauze/improvised, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm index 351e8e2df037..0d57e0ca165a 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm @@ -1874,9 +1874,6 @@ /obj/structure/rack, /obj/item/weldingtool/hugetank/empty, /obj/item/clothing/mask/gas/welding, -/obj/item/slimepotion/slime/sentience/mining, -/obj/item/slimepotion/slime/sentience/mining, -/obj/item/slimepotion/slime/sentience/mining, /obj/machinery/light/small/directional/east, /obj/machinery/button/door{ dir = 4; diff --git a/check_regex.yaml b/check_regex.yaml index 94f37cdcf83e..a4e63a1762f8 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -27,11 +27,11 @@ standards: - exactly: [1, "/atom text paths", '"/atom'] - exactly: [1, "/area text paths", '"/area'] - - exactly: [17, "/datum text paths", '"/datum'] + - exactly: [16, "/datum text paths", '"/datum'] - exactly: [4, "/mob text paths", '"/mob'] - - exactly: [36, "/obj text paths", '"/obj'] + - exactly: [35, "/obj text paths", '"/obj'] - exactly: [0, "/turf text paths", '"/turf'] - - exactly: [115, "text2path uses", "text2path"] + - exactly: [114, "text2path uses", "text2path"] - exactly: [18, "world<< uses", 'world[ \t]*<<'] - exactly: [0, "world.log<< uses", 'world.log[ \t]*<<'] diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2870e31eff97..9a576932120f 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -200,7 +200,7 @@ /// the default air mix that open turfs spawn #define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" #define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" -/// -193,15°C telecommunications. also used for xenobiology slime killrooms +/// -193,15°C telecommunications. good fluff for comms areas #define TCOMMS_ATMOS "n2=100;TEMP=80" /// space #define AIRLESS_ATMOS "TEMP=2.7" diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm index 9e034edeeb2c..f68655a7a3a4 100644 --- a/code/__DEFINES/dcs/signals/signals.dm +++ b/code/__DEFINES/dcs/signals/signals.dm @@ -677,14 +677,6 @@ #define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) #define COMPONENT_ACTION_BLOCK_TRIGGER 1 -//Xenobio hotkeys -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) - // /datum/overmap signals /// From overmap Move(): (old_x, old_y) #define COMSIG_OVERMAP_MOVED "overmap_moved" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 77e608ac922e..b97972be8a4c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -97,8 +97,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define HIDDEN_AREA (1<<6) /// If false, loading multiple maps with this area type will create multiple instances. #define UNIQUE_AREA (1<<7) -/// Can the Xenobio management console transverse this area by default? -#define XENOBIOLOGY_COMPATIBLE (1<<8) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c6fe0591ee27..68ef8b65b127 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -335,15 +335,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define SYRINGE_DRAW 0 #define SYRINGE_INJECT 1 -//gold slime core spawning -#define NO_SPAWN 0 -#define HOSTILE_SPAWN 1 -#define FRIENDLY_SPAWN 2 - -//slime core activation type -#define SLIME_ACTIVATE_MINOR 1 -#define SLIME_ACTIVATE_MAJOR 2 - #define LUMINESCENT_DEFAULT_GLOW 2 #define RIDING_OFFSET_ALL "ALL" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7bcca355f34a..0bda789b98d4 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -396,10 +396,8 @@ #define RACE_SWAP (1<<3) //ERT spawn template (avoid races that don't function without correct gear) #define ERT_SPAWN (1<<4) -//xenobio black crossbreed -#define SLIME_EXTRACT (1<<5) //Wabbacjack staff projectiles -#define WABBAJACK (1<<6) +#define WABBAJACK (1<<5) #define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 38e540e996b9..3e676f289458 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1028,13 +1028,6 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) // Pick a random animal instead of the icon, and use that instead /proc/getRandomAnimalImage(atom/A) - if(!GLOB.friendly_animal_types.len) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - if(initial(SA.gold_core_spawnable) == FRIENDLY_SPAWN) - GLOB.friendly_animal_types += SA - - var/mob/living/simple_animal/SA = pick(GLOB.friendly_animal_types) var/icon = initial(SA.icon) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ae5a1c1ce929..31ce8dceee49 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -482,28 +482,6 @@ GLOBAL_LIST_EMPTY(species_list) else to_chat(M, message) -//Used in chemical_mob_spawn. Generates a random mob based on a given gold_core_spawnable value. -/proc/create_random_mob(spawn_location, mob_class = HOSTILE_SPAWN) - var/static/list/mob_spawn_meancritters = list() // list of possible hostile mobs - var/static/list/mob_spawn_nicecritters = list() // and possible friendly mobs - - if(mob_spawn_meancritters.len <= 0 || mob_spawn_nicecritters.len <= 0) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - switch(initial(SA.gold_core_spawnable)) - if(HOSTILE_SPAWN) - mob_spawn_meancritters += T - if(FRIENDLY_SPAWN) - mob_spawn_nicecritters += T - - var/chosen - if(mob_class == FRIENDLY_SPAWN) - chosen = pick(mob_spawn_nicecritters) - else - chosen = pick(mob_spawn_meancritters) - var/mob/living/simple_animal/C = new chosen(spawn_location) - return C - /proc/passtable_on(target, source) var/mob/living/L = target if (!HAS_TRAIT(L, TRAIT_PASSTABLE) && L.pass_flags & PASSTABLE) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index d9957c7db0f1..df6f39cd0bbe 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -56,7 +56,6 @@ DEFINE_BITFIELD(area_flags, list( "NOTELEPORT" = NOTELEPORT, "HIDDEN_AREA" = HIDDEN_AREA, "UNIQUE_AREA" = UNIQUE_AREA, - "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, )) DEFINE_BITFIELD(car_traits, list( diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f9edbc500142..f45781b014ea 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -247,9 +247,8 @@ GLOBAL_LIST_INIT(scarySounds, list('sound/weapons/thudswoosh.ogg','sound/weapons 25 Toxins 26 Dormitories 27 Virology -28 Xenobiology -29 Law Office -30 Detective's Office +28 Law Office +29 Detective's Office */ //The whole system for the sorttype var is determined based on the order of this list, @@ -265,7 +264,7 @@ GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals", "Robotics", "Head of Personnel's Office", "Library", "Chapel", "Theatre", "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics", "Experimentor Lab", "Toxins", "Dormitories", "Virology", - "Xenobiology", "Law Office","Detective's Office")) + , "Law Office","Detective's Office")) GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt")) diff --git a/code/datums/components/dejavu.dm b/code/datums/components/dejavu.dm deleted file mode 100644 index b2a2cddf9c9b..000000000000 --- a/code/datums/components/dejavu.dm +++ /dev/null @@ -1,107 +0,0 @@ -/** - * A component to reset the parent to its previous state after some time passes - */ -/datum/component/dejavu - /// The turf the parent was on when this components was applied, they get moved back here after the duration - var/turf/starting_turf - /// Determined by the type of the parent so different behaviours can happen per type - var/rewind_type - /// How many rewinds will happen before the effect ends - var/rewinds_remaining - /// How long to wait between each rewind - var/rewind_interval - - /// The starting value of clone loss at the beginning of the effect - var/clone_loss = 0 - /// The starting value of toxin loss at the beginning of the effect - var/tox_loss = 0 - /// The starting value of oxygen loss at the beginning of the effect - var/oxy_loss = 0 - /// The starting value of brain loss at the beginning of the effect - var/brain_loss = 0 - /// The starting value of brute loss at the beginning of the effect - /// This only applies to simple animals - var/brute_loss - /// The starting value of integrity at the beginning of the effect - /// This only applies to objects - var/integrity - /// A list of body parts saved at the beginning of the effect - var/list/datum/saved_bodypart/saved_bodyparts - -/datum/component/dejavu/Initialize(rewinds = 1, interval = 10 SECONDS) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - starting_turf = get_turf(parent) - rewinds_remaining = rewinds - rewind_interval = interval - - if(isliving(parent)) - var/mob/living/L = parent - clone_loss = L.getCloneLoss() - tox_loss = L.getToxLoss() - oxy_loss = L.getOxyLoss() - brain_loss = L.getOrganLoss(ORGAN_SLOT_BRAIN) - rewind_type = PROC_REF(rewind_living) - - if(iscarbon(parent)) - var/mob/living/carbon/C = parent - saved_bodyparts = C.save_bodyparts() - rewind_type = PROC_REF(rewind_carbon) - - else if(isanimal(parent)) - var/mob/living/simple_animal/M = parent - brute_loss = M.bruteloss - rewind_type = PROC_REF(rewind_animal) - - else if(isobj(parent)) - var/obj/O = parent - integrity = O.obj_integrity - rewind_type = PROC_REF(rewind_obj) - - addtimer(CALLBACK(src, rewind_type), rewind_interval) - -/datum/component/dejavu/Destroy() - starting_turf = null - saved_bodyparts = null - return ..() - -/datum/component/dejavu/proc/rewind() - to_chat(parent, "You remember a time not so long ago...") - - //comes after healing so new limbs comically drop to the floor - if(starting_turf) - var/atom/movable/master = parent - master.forceMove(starting_turf) - - rewinds_remaining -- - if(rewinds_remaining) - addtimer(CALLBACK(src, rewind_type), rewind_interval) - else - to_chat(parent, "But the memory falls out of your reach.") - qdel(src) - -/datum/component/dejavu/proc/rewind_living() - var/mob/living/master = parent - master.setCloneLoss(clone_loss) - master.setToxLoss(tox_loss) - master.setOxyLoss(oxy_loss) - master.setOrganLoss(ORGAN_SLOT_BRAIN, brain_loss) - rewind() - -/datum/component/dejavu/proc/rewind_carbon() - if(saved_bodyparts) - var/mob/living/carbon/master = parent - master.apply_saved_bodyparts(saved_bodyparts) - rewind_living() - -/datum/component/dejavu/proc/rewind_animal() - var/mob/living/simple_animal/master = parent - master.bruteloss = brute_loss - master.updatehealth() - rewind_living() - -/datum/component/dejavu/proc/rewind_obj() - var/obj/master = parent - master.obj_integrity = integrity - rewind() diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 6a4787607ef2..405ca316b7d5 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -155,17 +155,6 @@ return TRUE return FALSE -/datum/objective_item/steal/slime - name = "an unused sample of slime extract." - targetitem = /obj/item/slime_extract - difficulty = 3 - excludefromjob = list("Research Director","Scientist") - -/datum/objective_item/steal/slime/check_special_completion(obj/item/slime_extract/E) - if(E.Uses > 0) - return 1 - return 0 - /datum/objective_item/steal/blackbox name = "The Blackbox." targetitem = /obj/item/blackbox diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index b3bd14af5a07..7df56b390f1b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -410,14 +410,6 @@ for(var/obj/item/reagent_containers/glass/G in beakers) reactants += G.reagents - for(var/obj/item/slime_extract/S in beakers) - if(S.Uses) - for(var/obj/item/reagent_containers/glass/G in beakers) - G.reagents.trans_to(S, G.reagents.total_volume) - - if(S && S.reagents && S.reagents.total_volume) - reactants += S.reagents - if(!chem_splash(get_turf(src), spread_range, reactants, temp_boost)) playsound(loc, 'sound/items/screwdriver2.ogg', 50, TRUE) return // The Explosion didn't do anything. No need to log, or disappear. @@ -460,16 +452,9 @@ for(var/obj/item/grenade/chem_grenade/G in src) if(istype(G, /obj/item/grenade/chem_grenade/large)) - var/obj/item/grenade/chem_grenade/large/LG = G max_beakers += 1 // Adding two large grenades only allows for a maximum of 7 beakers. spread_range += 2 // Extra range, reduced density. temp_boost += 50 // maximum of +150K blast using only large beakers. Not enough to self ignite. - for(var/obj/item/slime_extract/S in LG.beakers) // And slime cores. - if(beakers.len < max_beakers) - beakers += S - S.forceMove(src) - else - S.forceMove(drop_location()) if(istype(G, /obj/item/grenade/chem_grenade/cryo)) spread_range -= 1 // Reduced range, but increased density. diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index d5825181295c..19d163f131ee 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -63,7 +63,7 @@ if(istype(A, /obj/item/beacon)) continue // don't teleport beacons because that's just insanely stupid if(iscameramob(A)) - continue // Don't mess with AI eye, xenobio or advanced cameras + continue // Don't mess with AI eye, or advanced cameras if(A.anchored) continue diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 9aece73946cc..5e82266f186c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -315,11 +315,6 @@ icon_state = "science" build_path = /obj/machinery/computer/teleporter -/obj/item/circuitboard/computer/xenobiology - name = "circuit board (Xenobiology Console)" - icon_state = "science" - build_path = /obj/machinery/computer/camera_advanced/xenobio - //Security /obj/item/circuitboard/computer/gulag_teleporter_console diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 13d6268c1520..896fa3a3e357 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -570,7 +570,6 @@ var/static/list/fridges_name_paths = list(/obj/machinery/smartfridge = "plant produce", /obj/machinery/smartfridge/food = "food", /obj/machinery/smartfridge/drinks = "drinks", - /obj/machinery/smartfridge/extract = "slimes", /obj/machinery/smartfridge/bloodbank = "blood", /obj/machinery/smartfridge/organ = "organs", /obj/machinery/smartfridge/chemistry = "chems", @@ -983,15 +982,6 @@ /obj/item/airlock_painter = 1, /obj/item/stack/sheet/glass = 1) -/obj/item/circuitboard/machine/monkey_recycler - name = "Monkey Recycler (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/monkey_recycler - req_components = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/stock_parts/manipulator = 1) - needs_anchored = FALSE - /obj/item/circuitboard/machine/nanite_chamber name = "Nanite Chamber (Machine Board)" icon_state = "science" @@ -1018,11 +1008,6 @@ /obj/item/stock_parts/micro_laser = 2, /obj/item/stock_parts/scanning_module = 1) -/obj/item/circuitboard/machine/processor/slime - name = "Slime Processor (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/processor/slime - /obj/item/circuitboard/machine/protolathe/department/science name = "Protolathe (Machine Board) - Science" icon_state = "science" @@ -1278,19 +1263,6 @@ /obj/item/stock_parts/manipulator = 1) needs_anchored = FALSE -/obj/item/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(build_path == /obj/machinery/processor) - name = "Slime Processor (Machine Board)" - build_path = /obj/machinery/processor/slime - to_chat(user, "Name protocols successfully updated.") - else - name = "Food Processor (Machine Board)" - build_path = /obj/machinery/processor - to_chat(user, "Defaulting name protocols.") - else - return ..() - /obj/item/circuitboard/machine/protolathe/department/service name = "Protolathe - Service (Machine Board)" icon_state = "service" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 1f4b2ae6f6a2..1a9ee8ec3cf4 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -5,7 +5,6 @@ CONTAINS: T-RAY HEALTH ANALYZER GAS ANALYZER -SLIME SCANNER NANITE SCANNER GENE SCANNER @@ -616,65 +615,6 @@ GENE SCANNER to_chat(user, examine_block(jointext(render_list, "\n")), type = MESSAGE_TYPE_INFO) return TRUE -//slime scanner - -/obj/item/slime_scanner - name = "slime scanner" - desc = "A device that analyzes a slime's internal composition and measures its stats." - icon = 'icons/obj/device.dmi' - icon_state = "adv_spectrometer" - item_state = "analyzer" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - pickup_sound = 'sound/items/handling/device_pickup.ogg' - drop_sound = 'sound/items/handling/device_drop.ogg' - w_class = WEIGHT_CLASS_SMALL - flags_1 = CONDUCT_1 - throwforce = 0 - throw_speed = 3 - throw_range = 7 - custom_materials = list(/datum/material/iron=30, /datum/material/glass=20) - -/obj/item/slime_scanner/attack(mob/living/M, mob/living/user) - if(user.stat) - return - if (!isslime(M)) - to_chat(user, "This device can only scan slimes!") - return - var/mob/living/simple_animal/slime/T = M - slime_scan(T, user) - -/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user) - var/to_render = "\nSlime scan results:\ - \n[T.colour] [T.is_adult ? "adult" : "baby"] slime\ - \nNutrition: [T.nutrition]/[T.get_max_nutrition()]" - if (T.nutrition < T.get_starve_nutrition()) - to_render += "\nWarning: slime is starving!" - else if (T.nutrition < T.get_hunger_nutrition()) - to_render += "\nWarning: slime is hungry" - to_render += "\nElectric change strength: [T.powerlevel]\nHealth: [round(T.health/T.maxHealth,0.01)*100]%" - if (T.slime_mutation[4] == T.colour) - to_render += "\nThis slime does not evolve any further." - else - if (T.slime_mutation[3] == T.slime_mutation[4]) - if (T.slime_mutation[2] == T.slime_mutation[1]) - to_render += "\nPossible mutation: [T.slime_mutation[3]]\ - \nGenetic destability: [T.mutation_chance/2] % chance of mutation on splitting" - else - to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" - else - to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" - if (T.cores > 1) - to_render += "\nMultiple cores detected" - to_render += "\nGrowth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" - if(T.effectmod) - to_render += "\nCore mutation in progress: [T.effectmod]\ - \nProgress in core mutation: [T.applied] / [(SLIME_EXTRACT_CROSSING_REQUIRED * T.crossbreed_modifier)]" - to_chat(user, examine_block(to_render)) - - /obj/item/nanite_scanner name = "nanite scanner" icon = 'icons/obj/device.dmi' diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index e8b7e0de487f..58fd68157f08 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -217,36 +217,8 @@ if(stage != GRENADE_READY) return - for(var/obj/item/slime_extract/S in beakers) - if(S.Uses) - for(var/obj/item/reagent_containers/glass/G in beakers) - G.reagents.trans_to(S, G.reagents.total_volume) - - //If there is still a core (sometimes it's used up) - //and there are reagents left, behave normally, - //otherwise drop it on the ground for timed reactions like gold. - - if(S) - if(S.reagents && S.reagents.total_volume) - for(var/obj/item/reagent_containers/glass/G in beakers) - S.reagents.trans_to(G, S.reagents.total_volume) - else - S.forceMove(get_turf(src)) - no_splash = TRUE ..() - //I tried to just put it in the allowed_containers list but - //if you do that it must have reagents. If you're going to - //make a special case you might as well do it explicitly. -Sayu -/obj/item/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/slime_extract) && stage == GRENADE_WIRED) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You add [I] to the [initial(name)] assembly.") - beakers += I - else - return ..() - /obj/item/grenade/chem_grenade/cryo // Intended for rare cryogenic mixes. Cools the area moderately upon detonation. name = "cryo grenade" desc = "A custom made cryogenic grenade. Rapidly cools contents upon ignition." diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 5326b303d977..a086cf85b055 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -84,35 +84,6 @@ for(var/i in 1 to steps) step_away(src,loc) -/obj/effect/payload_spawner/random_slime - var/volatile = FALSE - -/obj/effect/payload_spawner/random_slime/volatile - volatile = TRUE - -/obj/item/slime_extract/proc/activate_slime() - var/list/slime_chems = src.activate_reagents - if(!QDELETED(src)) - var/chem = pick(slime_chems) - var/amount = 5 - if(chem == "lesser plasma") //In the rare case we get another rainbow. - chem = /datum/reagent/toxin/plasma - amount = 4 - if(chem == "holy water and uranium") - chem = /datum/reagent/uranium - reagents.add_reagent(/datum/reagent/water/holywater) - reagents.add_reagent(chem,amount) - -/obj/effect/payload_spawner/random_slime/spawn_payload(type, numspawned) - for(var/loop = numspawned ,loop > 0, loop--) - var/chosen = pick(subtypesof(/obj/item/slime_extract)) - var/obj/item/slime_extract/P = new chosen(loc) - if(volatile) - addtimer(CALLBACK(P, TYPE_PROC_REF(/obj/item/slime_extract, activate_slime)), rand(15,60)) - var/steps = rand(1,4) - for(var/i in 1 to steps) - step_away(src,loc) - ////////////////////////////////// //Custom payload clusterbusters ///////////////////////////////// @@ -180,14 +151,3 @@ var/real_type = pick(subtypesof(/obj/item/grenade/clusterbuster)) new real_type(loc) return INITIALIZE_HINT_QDEL - -//rainbow slime effect -/obj/item/grenade/clusterbuster/slime - name = "Blorble Blorble" - icon_state = "slimebang" - base_state = "slimebang" - payload_spawner = /obj/effect/payload_spawner/random_slime - prime_sound = 'sound/effects/bubbles.ogg' - -/obj/item/grenade/clusterbuster/slime/volatile - payload_spawner = /obj/effect/payload_spawner/random_slime/volatile diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index d8f871e1ecc4..4379003d57a8 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -122,13 +122,6 @@ radio_key = /obj/item/encryptionkey/syndicate subspace_transmission = TRUE -/obj/item/implant/radio/slime - name = "slime radio" - icon = 'icons/obj/surgery.dmi' - icon_state = "adamantine_resonator" - radio_key = /obj/item/encryptionkey - subspace_transmission = TRUE - /obj/item/implant/radio/get_data() var/dat = {"Implant Specifications:
Name: Internal Radio Implant
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index ecee3894ccbb..cfe07df070ba 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -407,7 +407,7 @@ )) /* - * Biowaste bag (mostly for xenobiologists) + * Biowaste bag */ /obj/item/storage/bag/bio @@ -424,7 +424,6 @@ STR.max_items = 20 STR.insert_preposition = "in" STR.set_holdable(list( - /obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/glass/beaker, diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 9516c7128090..e8b619b0d712 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -282,7 +282,6 @@ /obj/item/storage/firstaid/tactical, /obj/item/encryptionkey/syndicate, /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/storage/box/syndie_kit/imp_radio, /obj/item/storage/box/syndie_kit/imp_uplink, /obj/item/clothing/gloves/krav_maga/combatglovesplus, diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm index f4aad715db19..a3b3b2b5763f 100644 --- a/code/game/objects/structures/salvaging.dm +++ b/code/game/objects/structures/salvaging.dm @@ -617,7 +617,6 @@ /obj/item/circuitboard/machine/medical_kiosk = 5, /obj/item/circuitboard/machine/medipen_refiller = 5, /obj/item/circuitboard/machine/microwave = 5, - /obj/item/circuitboard/machine/monkey_recycler = 5, /obj/item/circuitboard/machine/ore_redemption = 5, /obj/item/circuitboard/machine/ore_silo = 5, /obj/item/circuitboard/machine/reagentgrinder = 5, @@ -671,7 +670,6 @@ /obj/item/circuitboard/computer/powermonitor/secret = 5, /obj/item/circuitboard/computer/prototype_cloning = 5, /obj/item/circuitboard/computer/stationalert = 5, - /obj/item/circuitboard/computer/xenobiology = 5, /obj/item/circuitboard/computer/teleporter = 5, /obj/item/circuitboard/computer/operating = 5, /obj/item/circuitboard/computer/crew = 5, diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 98ad4658add0..97f3772ec208 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -126,20 +126,6 @@ /turf/open/floor/noslip/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return -/turf/open/floor/bluespace - slowdown = -1 - icon_state = "bluespace" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds." - floor_tile = /obj/item/stack/tile/bluespace - - -/turf/open/floor/sepia - slowdown = 2 - icon_state = "sepia" - desc = "Time seems to flow very slowly around these tiles." - floor_tile = /obj/item/stack/tile/sepia - - /turf/open/floor/bronze name = "bronze floor" desc = "Some heavy bronze tiles." diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 7d9279f1390d..7953f3f7021a 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -539,17 +539,6 @@ newprofile.mob_overlay_icon_list = mob_overlay_icon_list.Copy() newprofile.mob_overlay_state_list = mob_overlay_state_list.Copy() //WS EDIT - Mob Overlay State -/datum/antagonist/changeling/xenobio - name = "Xenobio Changeling" - give_objectives = FALSE - show_in_roundend = FALSE //These are here for admin tracking purposes only - you_are_greet = FALSE - - chem_storage = 25 - geneticpoints = 2 - chem_recharge_rate = 0.5 - dna_max = 3 - /datum/antagonist/changeling/roundend_report() var/list/parts = list() @@ -582,6 +571,3 @@ /datum/antagonist/changeling/antag_listing_name() return ..() + "([changelingID])" - -/datum/antagonist/changeling/xenobio/antag_listing_name() - return ..() + "(Xenobio)" diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm deleted file mode 100644 index 4f13e27001ec..000000000000 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ /dev/null @@ -1,121 +0,0 @@ -// moonoutpost19 - -//Areas -/area/awaymission/moonoutpost19 - name = "space" - icon_state = "awaycontent1" - -/area/awaymission/moonoutpost19/arrivals - name = "MO19 Arrivals" - icon_state = "awaycontent2" - -/area/awaymission/moonoutpost19/research - name = "MO19 Research" - icon_state = "awaycontent3" - -/area/awaymission/moonoutpost19/syndicate - name = "Syndicate Outpost" - icon_state = "awaycontent4" - -/area/awaymission/moonoutpost19/main - name = "Khonsu 19" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - poweralm = FALSE - ambientsounds = list('sound/ambience/ambimine.ogg') - icon_state = "awaycontent5" - -/area/awaymission/moonoutpost19/hive - name = "The Hive" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - poweralm = FALSE - icon_state = "awaycontent6" - -//Papers - -/obj/item/paper/crumpled/awaymissions/moonoutpost19/hastey_note - name = "Hastily Written Note" - default_raw_text = "19 06 2554

I fucking knew it. There was a major breach, that idiotic force field failed and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_social - name = "Larva Xenomorph Social Interactions & Capturing Procedure" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554

Report:
As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.

The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.

The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.

It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen - name = "Queen Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554

Report:
I have studied many interesting and diverse life-forms as a xenobiologist ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.

The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not that much slower than it used to be.

After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.

Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult - name = "Adult Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554

Report:
The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape however by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.

As for its physiology, the creature has an elongated head with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has some what of an inner mouth capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.

Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject, would they?" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_psych - name = "Larva Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554

Report:
When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse and seemed to get larger very suddenly, this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is or will become as it matures fully.

It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/facehugger - name = "'Facehugger' Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554

Report:
The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.

When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off dead and curled its legs up like a spider moments after it had finished with the monkey's body.

While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours until we were horrified to discover it screaming out in pain as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind - name = "The Hivemind Hypothesis" - default_raw_text = "Researcher: Dr. Mark Douglas
Date: 17/06/2554

Report:
Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.

The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior - name = "\improper A Preliminary Study of Alien Behavior" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 08/06/2554

Report:
The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.

The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes - name = "The Xenomorph 'Castes'" - default_raw_text = "Researcher: Dr. Mark Douglas
Date: 06/06/2554

Report:
While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.

Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.

Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.

Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy - name = "Larva Xenomorph Autopsy Report" - default_raw_text = "Researcher: Dr. Mark Douglas
Date: 04/06/2554

Report:
After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.

The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.

We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation - name = "Evacuation Procedure" - default_raw_text = "

In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediately.



Current Xenobiology Containment Level:Secure RUN

" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal - name = "Personal Log" - default_raw_text = "Log 1:
We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.

Log 2:
Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognize his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.

Log 3:
Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2 - name = "Personal Log" - default_raw_text = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.

Log 2:
Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.

Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering - name = "Engineering Instructions" - default_raw_text = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth - name = "Personal Log - Kenneth Cunningham" - default_raw_text = "Entry One - 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.

Entry Two - 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.

Entry Three - 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.

Entry Four - 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.

Entry Five - 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.

Entry Six - 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan - name = "Personal Log - Ivan Volodin" - default_raw_text = "Ivan Volodin Stories:

Entry Won - 28/05/2554:
Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.

Entry Too - 05/06/2554:
I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.

Entry Tree - 08/06/2554:
Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.

Entry Fore - 12/06/2554:
Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?

Entry Fiv - 15/06/2554:
I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.

Entry Sex: 19/06/2554:
Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald - name = "Personal Log - Gerald Rosswell" - default_raw_text = "Personal Log for Research Director Gerald Rosswell

Entry One - 17/05/2554:
You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.

Entry Two - 25/05/2554:
Well, we all expected it at the outpost, CentCom has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.

Entry Three - 27/05/2554:
The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.

Entry Four - 06/06/2554:
My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.

Entry Five - 10/06/2554:
Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.

Entry Six - 17/06/2554:
The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials - name = "Specials This Week" - default_raw_text = "

I Can't Believe It's Not Pasta: Half off on Wednesdays



Burger night every Friday 6PM-10PM, free drinks with purchase of meal!



Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM

" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome - name = "Welcome Notice" - default_raw_text = "

Welcome to Moon Outpost 19! Property of Nanotrasen Inc.




Staff Roster:
-Dr. Gerald Rosswell: Research Director & Acting Captain
-Dr. Sakuma Sano: Xenobiologist
-Dr. Mark Douglas: Xenobiologist
-Kenneth Cunningham: Security Officer-Ivan Volodin: Engineer
-Mathias Kuester: Bartender
-Sven Edling: Chef
-Steve: Assistant

Please enjoy your stay, and report any abnormalities to an officer." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/goodbye_note - name = "Note" - default_raw_text = "Bugs break out. I run to here and lock door. I hear door next to me break open and screams. All nice people here dead now. I no want to be eaten, and bottle always said to be coward way out, but person who say that is stupid. Mira, there is no escape for me, tell Alexis and Elena that father will never come home, and that I love you all." - - diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm deleted file mode 100644 index 4aa0797c7002..000000000000 --- a/code/modules/cargo/bounties/slime.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item/slime - reward = 3000 - -/datum/bounty/item/slime/New() - ..() - description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 - -/datum/bounty/item/slime/green - name = "Green Slime Extract" - wanted_types = list(/obj/item/slime_extract/green) - -/datum/bounty/item/slime/pink - name = "Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/pink) - -/datum/bounty/item/slime/gold - name = "Gold Slime Extract" - wanted_types = list(/obj/item/slime_extract/gold) - -/datum/bounty/item/slime/oil - name = "Oil Slime Extract" - wanted_types = list(/obj/item/slime_extract/oil) - -/datum/bounty/item/slime/black - name = "Black Slime Extract" - wanted_types = list(/obj/item/slime_extract/black) - -/datum/bounty/item/slime/lightpink - name = "Light Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/lightpink) - -/datum/bounty/item/slime/adamantine - name = "Adamantine Slime Extract" - wanted_types = list(/obj/item/slime_extract/adamantine) - -/datum/bounty/item/slime/rainbow - name = "Rainbow Slime Extract" - wanted_types = list(/obj/item/slime_extract/rainbow) diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 3807e9bd6984..96d5218e551e 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. /proc/random_bounty() - switch(rand(1, 13)) + switch(rand(1, 12)) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -103,18 +103,15 @@ GLOBAL_LIST_EMPTY(bounties_list) var/subtype = pick(subtypesof(/datum/bounty/item/science)) return new subtype if(9) - var/subtype = pick(subtypesof(/datum/bounty/item/slime)) - return new subtype - if(10) var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) return new subtype - if(11) + if(10) var/subtype = pick(subtypesof(/datum/bounty/item/mining)) return new subtype - if(12) + if(11) var/subtype = pick(subtypesof(/datum/bounty/item/medical)) return new subtype - if(13) + if(12) var/subtype = pick(subtypesof(/datum/bounty/item/botany)) return new subtype @@ -153,10 +150,7 @@ GLOBAL_LIST_EMPTY(bounties_list) /********************************Dynamic Gens********************************/ for(var/i in 0 to 1) - if(prob(50)) - pick = pick(subtypesof(/datum/bounty/item/slime)) - else - pick = pick(subtypesof(/datum/bounty/item/science)) + pick = pick(subtypesof(/datum/bounty/item/science)) try_add_bounty(new pick) /********************************Cutoff for Non-Low Priority Bounties********************************/ diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm index 36530b20754b..4507d46ea958 100644 --- a/code/modules/clothing/outfits/factions/minutemen.dm +++ b/code/modules/clothing/outfits/factions/minutemen.dm @@ -601,7 +601,7 @@ belt = /obj/item/storage/belt/military/clip/gunner suit_store = /obj/item/gun/ballistic/automatic/hmg/cm40 - backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1) + backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/shredded_beef=1) ///lead, i guess you could reuse this for "Brig Officer" @@ -629,7 +629,7 @@ suit_store = /obj/item/gun/ballistic/automatic/assault/cm82 belt = /obj/item/storage/belt/military/clip/cm82 - backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1, /obj/item/gun/ballistic/automatic/pistol/cm23=1) + backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/shredded_beef=1, /obj/item/gun/ballistic/automatic/pistol/cm23=1) /datum/outfit/job/clip/minutemen/grunt/commander name = "CLIP Minutemen - Field Commander" diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm deleted file mode 100644 index 79382343e1ae..000000000000 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ /dev/null @@ -1,103 +0,0 @@ -GLOBAL_LIST_EMPTY(monkey_recyclers) - -/obj/machinery/monkey_recycler - name = "monkey recycler" - desc = "A machine used for recycling dead monkeys into monkey cubes." - icon = 'icons/obj/kitchen.dmi' - icon_state = "grinder" - layer = BELOW_OBJ_LAYER - density = TRUE - use_power = IDLE_POWER_USE - idle_power_usage = IDLE_DRAW_MINIMAL - active_power_usage = ACTIVE_DRAW_MEDIUM - circuit = /obj/item/circuitboard/machine/monkey_recycler - var/stored_matter = 0 - var/cube_production = 0.2 - var/list/connected = list() //Keeps track of connected xenobio consoles, for deletion in /Destroy() - -/obj/machinery/monkey_recycler/Initialize(mapload) - . = ..() - if (mapload) - GLOB.monkey_recyclers += src - -/obj/machinery/monkey_recycler/Destroy() - GLOB.monkey_recyclers -= src - for(var/thing in connected) - var/obj/machinery/computer/camera_advanced/xenobio/console = thing - console.connected_recycler = null - connected.Cut() - return ..() - -/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled - cube_production = 0 - for(var/obj/item/stock_parts/manipulator/B in component_parts) - cube_production += B.rating * 0.1 - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - cube_production += M.rating * 0.1 - -/obj/machinery/monkey_recycler/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." - -/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) - return - - if(default_pry_open(O)) - return - - if(default_unfasten_wrench(user, O)) - power_change() - return - - if(default_deconstruction_crowbar(O)) - return - - if(machine_stat) //NOPOWER etc - return - else - return ..() - -/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user) - if(!istype(target)) - return - if(ismonkey(target)) - stuff_monkey_in(target, user) - -/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/monkey/target, mob/living/user) - if(!istype(target)) - return - if(target.stat == CONSCIOUS) - to_chat(user, "The monkey is struggling far too much to put it in the recycler.") - return - if(target.buckled || target.has_buckled_mobs()) - to_chat(user, "The monkey is attached to something.") - return - qdel(target) - to_chat(user, "You stuff the monkey into the machine.") - playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - use_power(500) - stored_matter += cube_production - addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x)) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, "The machine now has [stored_matter] monkey\s worth of material stored.")) - -/obj/machinery/monkey_recycler/interact(mob/user) - if(stored_matter >= 1) - to_chat(user, "The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube.") - playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE) - for(var/i in 1 to FLOOR(stored_matter, 1)) - new /obj/item/reagent_containers/food/snacks/monkeycube(src.loc) - stored_matter-- - to_chat(user, "The machine's display flashes that it has [stored_matter] monkeys worth of material left.") - else - to_chat(user, "The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter].") - -/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if(istype(I)) - to_chat(user, "You log [src] in the multitool's buffer.") - I.buffer = src - return TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index bc17a9fd22af..ef3cceed2afc 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -37,7 +37,7 @@ qdel(what) /obj/machinery/processor/proc/select_recipe(X) - for (var/type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob) + for (var/type in subtypesof(/datum/food_processor_process)) var/datum/food_processor_process/recipe = new type() if (!istype(X, recipe.input) || !istype(src, recipe.required_machine)) continue @@ -149,60 +149,3 @@ O.forceMove(drop_location()) for (var/mob/M in src) M.forceMove(drop_location()) - -/obj/machinery/processor/slime - name = "slime processor" - desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." - -/obj/machinery/processor/slime/Initialize() - . = ..() - var/obj/item/circuitboard/machine/B = new /obj/item/circuitboard/machine/processor/slime(null) - B.apply_default_parts(src) - -/obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/AM) - var/static/list/slimecores = subtypesof(/obj/item/slime_extract) - var/i = 0 - if(!(i = slimecores.Find(AM.type))) // If the item is not found - return - if (i <= 16) // If in the first 12 slots - AM.pixel_x = AM.base_pixel_x - 12 + ((i%4)*8) - AM.pixel_y = AM.base_pixel_y - 12 + (round(i/4)*8) - return i - var/ii = i - 16 - AM.pixel_x = AM.base_pixel_x - 12 + ((ii%4)*8) - AM.pixel_y = AM.base_pixel_y - 12 + (round(ii/4)*8) - return i - -/obj/machinery/processor/slime/process() - if(processing) - return - var/mob/living/simple_animal/slime/picked_slime - for(var/mob/living/simple_animal/slime/slime in range(1,src)) - if(slime.loc == src) - continue - if(istype(slime, /mob/living/simple_animal/slime)) - if(slime.stat) - picked_slime = slime - break - if(!picked_slime) - return - var/datum/food_processor_process/P = select_recipe(picked_slime) - if (!P) - return - - visible_message("[picked_slime] is sucked into [src].") - picked_slime.forceMove(src) - -/obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what) - var/mob/living/simple_animal/slime/S = what - if (istype(S)) - var/C = S.cores - if(S.stat != DEAD) - S.forceMove(drop_location()) - S.visible_message("[C] crawls free of the processor!") - return - for(var/i in 1 to (C+rating_amount-1)) - var/atom/movable/item = new S.coretype(drop_location()) - adjust_item_drop_location(item) - SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour) - ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 6016def705b5..6d9945337f71 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -382,23 +382,6 @@ return TRUE return FALSE -// ------------------------------------- -// Xenobiology Slime-Extract Smartfridge -// ------------------------------------- -/obj/machinery/smartfridge/extract - name = "smart slime extract storage" - desc = "A refrigerated storage unit for slime extracts." - -/obj/machinery/smartfridge/extract/accept_check(obj/item/O) - if(istype(O, /obj/item/slime_extract)) - return TRUE - if(istype(O, /obj/item/slime_scanner)) - return TRUE - return FALSE - -/obj/machinery/smartfridge/extract/preloaded - initial_contents = list(/obj/item/slime_scanner = 2) - // ------------------------- // Organ Surgery Smartfridge // ------------------------- diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index c13983c6792d..63ffccdba79c 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -45,11 +45,6 @@ input = /obj/item/reagent_containers/food/snacks/grown/parsnip output = /obj/item/reagent_containers/food/snacks/roastparsnip -/datum/food_processor_process/mob/slime - input = /mob/living/simple_animal/slime - output = null - required_machine = /obj/machinery/processor/slime - /datum/food_processor_process/towercap input = /obj/item/grown/log output = /obj/item/popsicle_stick diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index 5c9bcc56cc7d..42afb89c4228 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -150,7 +150,6 @@ /datum/reagent/consumable/sugar = 5, /obj/item/reagent_containers/food/snacks/pie/plain = 1, /obj/item/reagent_containers/food/snacks/chocolatebar = 3, - /obj/item/slime_extract = 1 //The reason you dont know how to make it! ) result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart subcategory = CAT_PIE diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cc2a9f176c70..45b62eb3897d 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -303,29 +303,5 @@ M.updatehealth() qdel(src) -//AI - -/obj/item/slimepotion/slime/sentience/mining - name = "minebot AI upgrade" - desc = "Can be used to grant sentience to minebots. It's incompatible with minebot armor and melee upgrades, and will override them." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - sentience_type = SENTIENCE_MINEBOT - custom_price = 1000 - var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values - var/base_damage_add = 1 //this thus disables other minebot upgrades - var/base_speed_add = 1 - var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module - -/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/SM) - if(istype(SM, /mob/living/simple_animal/hostile/mining_drone)) - var/mob/living/simple_animal/hostile/mining_drone/M = SM - M.maxHealth = initial(M.maxHealth) + base_health_add - M.melee_damage_lower = initial(M.melee_damage_lower) + base_damage_add - M.melee_damage_upper = initial(M.melee_damage_upper) + base_damage_add - M.move_to_delay = initial(M.move_to_delay) + base_speed_add - if(M.stored_gun) - M.stored_gun.overheat_time += base_cooldown_add - #undef MINEDRONE_COLLECT #undef MINEDRONE_ATTACK diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index c9cdcaf8199c..1db46a4d5415 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -35,7 +35,6 @@ initial_language_holder = /datum/language_holder/alien flags_1 = PREVENT_CONTENTS_EXPLOSION_1 footstep_type = FOOTSTEP_MOB_CLAW - gold_core_spawnable = NO_SPAWN pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY environment_smash = ENVIRONMENT_SMASH_NONE diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 20d3f81aa38d..14b8081e7c0c 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -32,7 +32,7 @@ attack_sound = 'sound/items/trayhit1.ogg' deathsound = "sound/voice/borg_deathsound.ogg" wings_icons = list("Robotic") - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP species_language_holder = /datum/language_holder/ipc loreblurb = "Integrated Positronic Chassis or \"IPC\" for short, are synthetic lifeforms composed of an Artificial \ Intelligence program encased in a bipedal robotic shell. They are fragile, allergic to EMPs, and the butt of endless toaster jokes. \ diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 41bc6721755f..229bdcb21c2f 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -5,7 +5,7 @@ species_traits = list(NOBLOOD,NOEYESPRITES,NO_BONES) inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN ass_image = 'icons/ass/assgrey.png' species_chest = /obj/item/bodypart/chest/abductor diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 623041674516..6bb5956ae0ab 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -11,7 +11,7 @@ reagent_tag = PROCESS_SYNTHETIC species_gibs = "robotic" attack_sound = 'sound/items/trayhit1.ogg' - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN /datum/species/android/on_species_gain(mob/living/carbon/C) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index cfbc682f24de..f3c477fefb85 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -20,7 +20,7 @@ damage_overlay_type = "" //We are too cool for regular damage overlays species_age_max = 300 species_traits = list(DYNCOLORS, EYECOLOR, HAIR, FACEHAIR) - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/ethereal inherent_traits = list(TRAIT_NOHUNGER) sexes = FALSE //no fetish content allowed diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index f5de9f873b3b..7cf8d8ee3e45 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -9,7 +9,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly disliked_food = null liked_food = GORE | RAW // Sure, the raw... the bloody... but I think stuff GROSS, like baseball burgers, are liked - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/fly species_chest = /obj/item/bodypart/chest/fly diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 882fffc9ff41..b45ec4b05f3e 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -9,7 +9,7 @@ skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW | CLOTH liked_food = JUNKFOOD | FRIED | SUGAR - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP loreblurb = "Mostly hairless mammalians. Their home system, Sol, lies in a sort of \"bluespace dead-zone\" that blocks anything from entering or exiting Sol's dead-zone through bluespace without a relay. While it leaves Sol extremely well-defended, it meant that they went unnoticed and uncontacted until they were themselves able to breach it." /datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 14526059354d..bd937acaa09f 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -20,7 +20,7 @@ coldmod = 6 // = 3x cold damage heatmod = 0.5 // = 1/4x heat damage burnmod = 0.5 // = 1/2x generic burn damage - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN inherent_factions = list("slime") species_language_holder = /datum/language_holder/jelly ass_image = 'icons/ass/assslime.png' @@ -222,7 +222,7 @@ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) hair_color = "mutcolor" hair_alpha = 150 - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN var/datum/action/innate/split_body/slime_split var/list/mob/living/carbon/bodies var/datum/action/innate/swap_body/swap_body @@ -517,50 +517,22 @@ id = SPECIES_LUMINESCENT var/glow_intensity = LUMINESCENT_DEFAULT_GLOW var/obj/effect/dummy/luminescent_glow/glow - var/obj/item/slime_extract/current_extract - var/datum/action/innate/integrate_extract/integrate_extract - var/datum/action/innate/use_extract/extract_minor - var/datum/action/innate/use_extract/major/extract_major - var/extract_cooldown = 0 - examine_limb_id = SPECIES_JELLYPERSON //Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW /datum/species/jelly/luminescent/Destroy(force, ...) - current_extract = null QDEL_NULL(glow) - QDEL_NULL(integrate_extract) - QDEL_NULL(extract_major) - QDEL_NULL(extract_minor) return ..() /datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C) ..() - if(current_extract) - current_extract.forceMove(C.drop_location()) - current_extract = null QDEL_NULL(glow) - QDEL_NULL(integrate_extract) - QDEL_NULL(extract_major) - QDEL_NULL(extract_minor) /datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() glow = new(C) update_glow(C) - integrate_extract = new(src) - integrate_extract.Grant(C) - extract_minor = new(src) - extract_minor.Grant(C) - extract_major = new(src) - extract_major.Grant(C) - -/datum/species/jelly/luminescent/proc/update_slime_actions() - integrate_extract.update_name() - integrate_extract.UpdateButtonIcon() - extract_minor.UpdateButtonIcon() - extract_major.UpdateButtonIcon() /datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity) if(intensity) @@ -581,108 +553,6 @@ if(!isliving(loc)) return INITIALIZE_HINT_QDEL - -/datum/action/innate/integrate_extract - name = "Integrate Extract" - desc = "Eat a slime extract to use its properties." - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "slimeconsume" - icon_icon = 'icons/mob/actions/actions_slime.dmi' - background_icon_state = "bg_alien" - -/datum/action/innate/integrate_extract/proc/update_name() - var/datum/species/jelly/luminescent/species = target - if(!species || !species.current_extract) - name = "Integrate Extract" - desc = "Eat a slime extract to use its properties." - else - name = "Eject Extract" - desc = "Eject your current slime extract." - -/datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force) - var/datum/species/jelly/luminescent/species = target - if(!species || !species.current_extract) - button_icon_state = "slimeconsume" - else - button_icon_state = "slimeeject" - ..() - -/datum/action/innate/integrate_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) - ..(current_button, TRUE) - var/datum/species/jelly/luminescent/species = target - if(species?.current_extract) - current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) - -/datum/action/innate/integrate_extract/Activate() - var/mob/living/carbon/human/H = owner - var/datum/species/jelly/luminescent/species = target - if(!is_species(H, /datum/species/jelly/luminescent) || !species) - return - CHECK_DNA_AND_SPECIES(H) - - if(species.current_extract) - var/obj/item/slime_extract/S = species.current_extract - if(!H.put_in_active_hand(S)) - S.forceMove(H.drop_location()) - species.current_extract = null - to_chat(H, "You eject [S].") - species.update_slime_actions() - else - var/obj/item/I = H.get_active_held_item() - if(istype(I, /obj/item/slime_extract)) - var/obj/item/slime_extract/S = I - if(!S.Uses) - to_chat(H, "[I] is spent! You cannot integrate it.") - return - if(!H.temporarilyRemoveItemFromInventory(S)) - return - S.forceMove(H) - species.current_extract = S - to_chat(H, "You consume [I], and you feel it pulse within you...") - species.update_slime_actions() - else - to_chat(H, "You need to hold an unused slime extract in your active hand!") - -/datum/action/innate/use_extract - name = "Extract Minor Activation" - desc = "Pulse the slime extract with energized jelly to activate it." - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "slimeuse1" - icon_icon = 'icons/mob/actions/actions_slime.dmi' - background_icon_state = "bg_alien" - var/activation_type = SLIME_ACTIVATE_MINOR - -/datum/action/innate/use_extract/IsAvailable() - if(..()) - var/datum/species/jelly/luminescent/species = target - if(species && species.current_extract && (world.time > species.extract_cooldown)) - return TRUE - return FALSE - -/datum/action/innate/use_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) - ..(current_button, TRUE) - var/datum/species/jelly/luminescent/species = owner - if(species?.current_extract) - current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) - -/datum/action/innate/use_extract/Activate() - var/mob/living/carbon/human/H = owner - var/datum/species/jelly/luminescent/species = owner - if(!is_species(H, /datum/species/jelly/luminescent) || !species) - return - CHECK_DNA_AND_SPECIES(H) - - if(species.current_extract) - species.extract_cooldown = world.time + 100 - var/cooldown = species.current_extract.activate(H, species, activation_type) - species.extract_cooldown = world.time + cooldown - -/datum/action/innate/use_extract/major - name = "Extract Major Activation" - desc = "Pulse the slime extract with plasma jelly to activate it." - button_icon_state = "slimeuse2" - activation_type = SLIME_ACTIVATE_MAJOR - ///////////////////////////////////STARGAZERS////////////////////////////////////////// //Stargazers are the telepathic branch of jellypeople, able to project psychic messages and to link minds with willing participants. diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm index 39e3cbc3d07a..e4677fbc19f5 100644 --- a/code/modules/mob/living/carbon/human/species_types/kepori.dm +++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm @@ -9,7 +9,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken disliked_food = FRIED | GROSS | CLOTH liked_food = MEAT | GORE - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP loreblurb = "Kepori are a species covered in feathers vaguely reminiscent of earth’s extinct troodontidae. They’re small and sometimes seen as weak by other species due to their hollow bones but make up for that in speed and reflexes. They tend to woop when excited, scared, or for any other reason at all." attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 9d539007df4e..5ee7441e2f54 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -12,7 +12,7 @@ coldmod = 1.5 heatmod = 0.67 default_features = list("mcolor" = "0F0", "tail_lizard" = "Smooth", "face_markings" = "None", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "body_size" = "Normal") - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index f8495f783e36..10375f424e82 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -16,7 +16,7 @@ toxic_food = MEAT | RAW | GORE mutanteyes = /obj/item/organ/eyes/compound //WS Edit - Compound eyes mutanttongue = /obj/item/organ/tongue/moth //WS Edit - Insectoid language - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP species_language_holder = /datum/language_holder/moth loreblurb = "Bug-mammal hybrids resembling Sol's lepidopterans. They share the least DNA with baseline humans of any human-derived geneline, being significant portions insect and modified whole-cloth DNA. Their classification as another human geneline or as something else is highly debated. All evidence that would point to their origin– which is presumably a genelab somewhere– has seemingly disappeared into thin air. Mothpeople themselves have no centralized culture or homeworld, leading to a fractured existence amongst the stars." wings_icons = list("Megamoth", "Mothra") diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index d5ce34ca412f..fe017fdd2a84 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -18,7 +18,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant disliked_food = MEAT | DAIRY liked_food = VEGETABLES | FRUIT | GRAIN | CLOTH //cannibals apparentely - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/plant species_chest = /obj/item/bodypart/chest/pod diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm index 764a7166ff2d..1b66c952172d 100644 --- a/code/modules/mob/living/carbon/human/species_types/spider.dm +++ b/code/modules/mob/living/carbon/human/species_types/spider.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt")) toxic_food = VEGETABLES | DAIRY | CLOTH mutanteyes = /obj/item/organ/eyes/night_vision/spider mutanttongue = /obj/item/organ/tongue/spider - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP species_language_holder = /datum/language_holder/spider loreblurb = "Rachnids are aliens with coincidental physiological similarities to Sol's spiders. Despite visible adaptations that would make them excellent hunters, modern Rachnidian culture revolves around honing the skills and talents of oneself, treating them as forms of self-expression. Rachnids tend to focus on their work intensely, priding themselves on a job well done and languishing if they see themselves as underperforming in their field." var/web_cooldown = 30 diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm index 1a73860ab29f..5c2b91127f27 100644 --- a/code/modules/mob/living/carbon/human/species_types/vox.dm +++ b/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -10,7 +10,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken disliked_food = GRAIN liked_food = MEAT - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP loreblurb = "Vox are a big bird-like species with quills, much larger and much more long-lasting than other species. Sadly, not much else is known." attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index bf4f45e28329..9c6ead823bd5 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -23,7 +23,6 @@ ventcrawler = VENTCRAWLER_ALWAYS mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BUG - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "flutters" verb_ask = "flutters inquisitively" verb_exclaim = "flutters intensely" diff --git a/code/modules/mob/living/simple_animal/friendly/capybara.dm b/code/modules/mob/living/simple_animal/friendly/capybara.dm index 091bf42993f2..f1366aaa89a4 100644 --- a/code/modules/mob/living/simple_animal/friendly/capybara.dm +++ b/code/modules/mob/living/simple_animal/friendly/capybara.dm @@ -43,7 +43,6 @@ real_name = "Caspar" desc = "It's Caspar, the Capybara Captain, the Capy Cappy." gender = MALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/wear_hat = /obj/item/clothing/head/caphat diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 33c8bbdb3ed2..396dc82202a9 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -33,7 +33,6 @@ var/mob/living/simple_animal/mouse/movement_target ///Limits how often cats can spam chasing mice. var/emote_cooldown = 0 - gold_core_spawnable = FRIENDLY_SPAWN collar_type = "cat" held_state = "cat2" @@ -91,7 +90,6 @@ icon_living = "cat" icon_dead = "cat_dead" gender = FEMALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/list/family = list()//var restored from savefile, has count of each child type var/list/children = list()//Actual mob weak references of children @@ -167,7 +165,6 @@ /mob/living/simple_animal/pet/cat/Proc name = "Proc" gender = MALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index bd16daa567f5..a2556f0cc943 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -23,7 +23,6 @@ ventcrawler = VENTCRAWLER_ALWAYS var/obj/item/inventory_head var/obj/item/inventory_mask - gold_core_spawnable = FRIENDLY_SPAWN /mob/living/simple_animal/crab/Life() ..() @@ -44,7 +43,6 @@ real_name = "Coffee" desc = "It's Coffee, the other pet!" gender = FEMALE - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/crab/evil name = "Evil Crab" @@ -53,7 +51,6 @@ icon_state = "evilcrab" icon_living = "evilcrab" icon_dead = "evilcrab_dead" - gold_core_spawnable = FRIENDLY_SPAWN /mob/living/simple_animal/crab/kreb name = "Kreb" @@ -62,7 +59,6 @@ icon_state = "kreb" icon_living = "kreb" icon_dead = "kreb_dead" - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/crab/evil/kreb name = "Evil Kreb" @@ -70,4 +66,3 @@ icon_state = "evilkreb" icon_living = "evilkreb" icon_dead = "evilkreb_dead" - gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index ebfd85f3ca23..2a47d4f0c220 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -88,7 +88,6 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5) animal_species = /mob/living/simple_animal/pet/dog - gold_core_spawnable = FRIENDLY_SPAWN collar_type = "corgi" var/obj/item/inventory_head var/obj/item/inventory_back @@ -121,7 +120,6 @@ icon_living = "pug" icon_dead = "pug_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3) - gold_core_spawnable = FRIENDLY_SPAWN collar_type = "pug" held_state = "pug" @@ -394,7 +392,6 @@ response_disarm_simple = "bop" response_harm_continuous = "kicks" response_harm_simple = "kick" - gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/age = 0 var/record_age = 1 @@ -569,7 +566,6 @@ real_name = "Lisa" gender = FEMALE desc = "She's tearing you apart." - gold_core_spawnable = NO_SPAWN unique_pet = TRUE icon_state = "lisa" icon_living = "lisa" diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 65baddfee360..cc2ab1da9ef6 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -122,7 +122,6 @@ attack_sound = 'sound/weapons/punch1.ogg' health = 50 maxHealth = 50 - gold_core_spawnable = FRIENDLY_SPAWN blood_volume = BLOOD_VOLUME_NORMAL food_type = list(/obj/item/reagent_containers/food/snacks/grown/wheat) tame_chance = 25 @@ -178,7 +177,6 @@ /mob/living/simple_animal/cow/wisdom name = "wisdom cow" desc = "Known for its wisdom, shares it with all" - gold_core_spawnable = FALSE tame_chance = 0 bonus_tame_chance = 0 speak_chance = 15 @@ -229,8 +227,6 @@ var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY - gold_core_spawnable = FRIENDLY_SPAWN - footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/chick/Initialize() @@ -290,7 +286,6 @@ var/list/feedMessages = list("It clucks happily.","It clucks happily.") var/list/layMessage = EGG_LAYING_MESSAGES var/list/validColors = list("brown","black","white") - gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 footstep_type = FOOTSTEP_MOB_CLAW @@ -386,7 +381,6 @@ var/list/feedMessages = list("It clucks happily.","It clucks happily.") var/list/layMessage = EGG_LAYING_MESSAGES var/list/validColors = list("brown","black","white") - gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 environment_smash = ENVIRONMENT_SMASH_NONE melee_damage_lower = 3 diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 8fc52916fa39..164e412cdd1d 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -20,7 +20,6 @@ response_disarm_simple = "gently push aside" response_harm_continuous = "kicks" response_harm_simple = "kick" - gold_core_spawnable = FRIENDLY_SPAWN held_state = "fox" footstep_type = FOOTSTEP_MOB_CLAW @@ -34,5 +33,4 @@ name = "Renault" desc = "Renault, the Captain's trustworthy fox." gender = FEMALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index c854936c7d22..e872fdfcefce 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,7 +23,6 @@ pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE - gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/hostile/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. diff --git a/code/modules/mob/living/simple_animal/friendly/mothroach.dm b/code/modules/mob/living/simple_animal/friendly/mothroach.dm index 881e64d2a70f..083c576e1c17 100644 --- a/code/modules/mob/living/simple_animal/friendly/mothroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/mothroach.dm @@ -17,7 +17,6 @@ health = 25 maxHealth = 25 speed = 1.25 - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "flutters" verb_ask = "flutters inquisitively" verb_exclaim = "flutters loudly" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 7b11d05bcf2c..c647b59f4d49 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -45,7 +45,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) mob_biotypes = MOB_ORGANIC|MOB_BEAST lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //WS Edit var/body_color //brown, gray and white, leave blank for random - gold_core_spawnable = FRIENDLY_SPAWN move_force = MOVE_FORCE_EXTREMELY_WEAK //WS Edit var/chew_probability = 1 var/full = FALSE //WS Edit @@ -261,7 +260,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) response_disarm_simple = "gently push aside" response_harm_continuous = "splats" response_harm_simple = "splat" - gold_core_spawnable = NO_SPAWN /obj/item/reagent_containers/food/snacks/deadmouse name = "dead mouse" diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 5e39c3c8a51d..50ea0a5003cb 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -32,7 +32,6 @@ icon_state = "penguin" icon_living = "penguin" icon_dead = "penguin_dead" - gold_core_spawnable = FRIENDLY_SPAWN butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/reagent_containers/food/snacks/meat/slab/penguin = 3) /mob/living/simple_animal/pet/penguin/baby diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index fa5ab9c9df94..63bc7d76e5dd 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -18,7 +18,6 @@ response_harm_continuous = "kicks" response_harm_simple = "kick" mob_biotypes = MOB_ORGANIC|MOB_BEAST - gold_core_spawnable = FRIENDLY_SPAWN melee_damage_lower = 18 melee_damage_upper = 18 health = 50 @@ -33,7 +32,6 @@ /mob/living/simple_animal/sloth/paperwork name = "Paperwork" desc = "Cargo's pet sloth. About as useful as the rest of the techs." - gold_core_spawnable = NO_SPAWN //Cargo Sloth 2 @@ -45,4 +43,3 @@ icon_dead = "cool_sloth_dead" gender = FEMALE butcher_results = list(/obj/item/toy/spinningtoy = 1) - gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index d33fac8f5c00..38fb4ced3d9f 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -35,7 +35,6 @@ pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE - gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/glasses_overlay_file = 'icons/mob/pets.dmi' diff --git a/code/modules/mob/living/simple_animal/friendly/turtle.dm b/code/modules/mob/living/simple_animal/friendly/turtle.dm index 97b07424d375..3ef772cc4be0 100644 --- a/code/modules/mob/living/simple_animal/friendly/turtle.dm +++ b/code/modules/mob/living/simple_animal/friendly/turtle.dm @@ -19,7 +19,6 @@ response_harm_continuous = "kicks" response_harm_simple = "kick" mob_biotypes = MOB_ORGANIC|MOB_BEAST - gold_core_spawnable = NO_SPAWN melee_damage_lower = 0.5 melee_damage_upper = 1 health = 2500 diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index ec7c76f5ca61..e7d029467f25 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -30,7 +30,6 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE unique_name = 1 - gold_core_spawnable = HOSTILE_SPAWN deathsound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -143,7 +142,6 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 10, /obj/item/stack/sheet/animalhide/xeno = 2) mob_size = MOB_SIZE_LARGE - gold_core_spawnable = NO_SPAWN /obj/projectile/neurotox name = "neurotoxin" @@ -169,7 +167,6 @@ friendly_verb_simple = "caress" obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - gold_core_spawnable = HOSTILE_SPAWN icon_state = "maid" icon_living = "maid" icon_dead = "maid_dead" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index b6f5c58b424e..6cf14fd33c9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -98,7 +98,6 @@ health = 120 maxHealth = 120 armored = TRUE - gold_core_spawnable = HOSTILE_SPAWN /mob/living/simple_animal/hostile/bear/cave name = "brown bear" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 676b58a98520..c56f87178e75 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -47,7 +47,6 @@ mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BUG movement_type = FLYING - gold_core_spawnable = FRIENDLY_SPAWN search_objects = 1 //have to find those plant trays! //Spaceborn beings don't get hurt by space diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 67a80713d8ec..a0986111a4b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -43,7 +43,6 @@ faction = list("carp", "mining") movement_type = FLYING pressure_resistance = 200 - gold_core_spawnable = HOSTILE_SPAWN var/random_color = TRUE //if the carp uses random coloring var/rarechance = 1 //chance for rare color variant @@ -159,7 +158,6 @@ icon_state = "holocarp" icon_living = "holocarp" maxbodytemp = INFINITY - gold_core_spawnable = NO_SPAWN del_on_death = 1 random_color = FALSE food_type = list() @@ -229,7 +227,6 @@ desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot." gender = FEMALE speak_emote = list("squeaks") - gold_core_spawnable = NO_SPAWN faction = list(ROLE_SYNDICATE) AIStatus = AI_OFF rarechance = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/cockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm index c822268a7fe2..5a931b0079b4 100644 --- a/code/modules/mob/living/simple_animal/hostile/cockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -23,7 +23,6 @@ melee_damage_upper = 0 obj_damage = 0 ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "chitters" verb_ask = "chitters inquisitively" verb_exclaim = "chitters loudly" @@ -49,7 +48,6 @@ melee_damage_lower = 5 melee_damage_upper = 5 obj_damage = 20 - gold_core_spawnable = HOSTILE_SPAWN projectilesound = 'sound/weapons/gun/pistol/shot.ogg' projectiletype = /obj/projectile/glockroachbullet casingtype = /obj/item/ammo_casing/glockroach diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 57a33c2ee02a..8a1fe372ee6a 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -29,7 +29,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 1500 - gold_core_spawnable = HOSTILE_SPAWN faction = list("spooky") del_on_death = 1 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index c9c2e131cc09..a814d67ebc86 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -31,7 +31,6 @@ minbodytemp = 0 faction = list("faithless") - gold_core_spawnable = HOSTILE_SPAWN footstep_type = FOOTSTEP_MOB_SHOE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 5e3e8d0b34d5..71b31c9568e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -50,7 +50,6 @@ attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' unique_name = 1 - gold_core_spawnable = HOSTILE_SPAWN lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE footstep_type = FOOTSTEP_MOB_CLAW mob_size = MOB_SIZE_LARGE @@ -122,7 +121,6 @@ var/datum/action/innate/spider/lay_eggs/lay_eggs var/datum/action/innate/spider/set_directive/set_directive var/static/list/consumed_mobs = list() //the refs of mobs that have been consumed by nurse spiders to lay eggs - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize() . = ..() @@ -172,7 +170,6 @@ melee_damage_upper = 20 poison_per_bite = 5 move_to_delay = 5 - gold_core_spawnable = NO_SPAWN //vipers are the rare variant of the hunter, no IMMEDIATE damage but so much poison medical care will be needed fast. /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper @@ -205,7 +202,6 @@ move_to_delay = 8 speed = 9 status_flags = NONE - gold_core_spawnable = NO_SPAWN var/slowed_by_webs = FALSE /mob/living/simple_animal/hostile/poison/giant_spider/tarantula/Moved(atom/oldloc, dir) @@ -225,7 +221,6 @@ maxbodytemp = 1500 poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice name = "giant ice spider" @@ -242,7 +237,6 @@ maxbodytemp = 1500 poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/handle_automated_action() if(!..()) //AIStatus is off diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index a175bb40feca..6a11507beea1 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -29,7 +29,6 @@ speak_emote = list("honks") faction = list("neutral") attack_same = TRUE - gold_core_spawnable = HOSTILE_SPAWN var/random_retaliate = TRUE var/icon_vomit_start = "vomit_start" var/icon_vomit = "vomit" @@ -95,7 +94,6 @@ response_disarm_simple = "gently push aside" response_harm_continuous = "kicks" response_harm_simple = "kick" - gold_core_spawnable = NO_SPAWN random_retaliate = FALSE var/vomiting = FALSE var/vomitCoefficient = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 850ff235375f..292a9fee3658 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -73,8 +73,6 @@ if(origin && (origin.current ? (origin.current.stat == DEAD) : origin.get_ghost())) origin.transfer_to(M) var/datum/antagonist/changeling/C = origin.has_antag_datum(/datum/antagonist/changeling) - if(!C) - C = origin.add_antag_datum(/datum/antagonist/changeling/xenobio) if(C.can_absorb_dna(owner)) C.add_new_profile(owner) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 431229fefc44..b6d7665221af 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -120,7 +120,6 @@ maxHealth = 60 ranged = TRUE rapid = 3 - gold_core_spawnable = HOSTILE_SPAWN var/datum/action/innate/hivebot/foamwall/foam /mob/living/simple_animal/hostile/hivebot/mechanic/Initialize(mapload) diff --git a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm index eccb38bee5bd..d03f0be88083 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm @@ -149,7 +149,7 @@ /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 5, /obj/item/melee/knife/combat = 3, - /obj/item/reagent_containers/food/snacks/rationpack = 30 + /obj/item/storage/ration/shredded_beef = 30 ) ) if (prob(15)) //mayhaps a medkit diff --git a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm index a88a79610b60..4983c53ef88d 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm @@ -283,7 +283,6 @@ limb_destroyer = 1 speak_emote = list("states") bubble_icon = "syndibot" - gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 deathmessage = "is smashed into pieces!" diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 8b1de1c2b8a4..1b1dd1d72901 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -28,4 +28,3 @@ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 150 maxbodytemp = 500 - gold_core_spawnable = HOSTILE_SPAWN diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index ff06df9c6113..a386758b8e6c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -659,7 +659,6 @@ GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = VENTCRAWLER_ALWAYS mob_size = MOB_SIZE_TINY - gold_core_spawnable = HOSTILE_SPAWN verb_say = "warps" verb_ask = "floats inquisitively" verb_exclaim = "zaps" diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 0568533c1e0c..ecdc357b8da3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -267,102 +267,5 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_state = TrueGun.icon_state icon_living = TrueGun.icon_state -/mob/living/simple_animal/hostile/mimic/xenobio - health = 210 - maxHealth = 210 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - speak_emote = list("clatters") - gold_core_spawnable = HOSTILE_SPAWN - var/opened = FALSE - var/open_sound = 'sound/machines/crate_open.ogg' - var/close_sound = 'sound/machines/crate_close.ogg' - var/max_mob_size = MOB_SIZE_HUMAN - var/locked = FALSE - var/datum/action/innate/mimic/lock/lock - -/mob/living/simple_animal/hostile/mimic/xenobio/Initialize() - . = ..() - lock = new - lock.Grant(src) - -/mob/living/simple_animal/hostile/mimic/xenobio/AttackingTarget() - if(src == target) - toggle_open() - return - return ..() - -/mob/living/simple_animal/hostile/mimic/xenobio/attack_hand(mob/living/carbon/human/M) - . = ..() - if(M.a_intent != "help") - return - toggle_open() - -/mob/living/simple_animal/hostile/mimic/xenobio/death() - var/obj/structure/closet/crate/C = new(get_turf(src)) - // Put loot in crate - for(var/atom/movable/AM as anything in src) - AM.forceMove(C) - return ..() - -/mob/living/simple_animal/hostile/mimic/xenobio/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/structure/closet)) - return FALSE - -/mob/living/simple_animal/hostile/mimic/xenobio/proc/toggle_open() - if(locked) - return - if(!opened) - density = FALSE - opened = TRUE - icon_state = "crateopen" - playsound(src, open_sound, 50, TRUE) - for(var/atom/movable/AM as anything in src) - AM.forceMove(loc) - else - density = TRUE - opened = FALSE - icon_state = "crate" - playsound(src, close_sound, 50, TRUE) - for(var/atom/movable/AM in get_turf(src)) - if(insertion_allowed(AM)) - AM.forceMove(src) - -/mob/living/simple_animal/hostile/mimic/xenobio/proc/insertion_allowed(atom/movable/AM) - if(ismob(AM)) - if(!isliving(AM)) //Don't let ghosts and such get trapped in the beast. - return FALSE - var/mob/living/L = AM - if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) - return FALSE - if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. - if(L.density || L.mob_size > max_mob_size) - return FALSE - L.stop_pulling() - - else if(istype(AM, /obj/structure/closet)) - return FALSE - else if(isobj(AM)) - if(AM.anchored || AM.has_buckled_mobs()) - return FALSE - else if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP)) - return TRUE - else - return FALSE - return TRUE - /datum/action/innate/mimic background_icon_state = "bg_default" - -/datum/action/innate/mimic/lock - name = "Lock/Unlock" - desc = "Toggle preventing yourself from being opened or closed." - -/datum/action/innate/mimic/lock/Activate() - var/mob/living/simple_animal/hostile/mimic/xenobio/M = owner - M.locked = !M.locked - if(!M.locked) - to_chat(M, "You loosen up, allowing yourself to be opened and closed.") - else - to_chat(M, "You stiffen up, preventing anyone from opening or closing you.") diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index b03363e956f1..d3040bc7717c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -32,7 +32,6 @@ attack_sound = 'sound/weapons/bladeslice.ogg' aggro_vision_range = 9 turns_per_move = 5 - gold_core_spawnable = HOSTILE_SPAWN loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}, /obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}) var/lava_drinker = TRUE @@ -229,7 +228,6 @@ robust_searching = 1 attack_same = TRUE // So we'll fight basilisks //mob_trophy = /obj/item/mob_trophy/watcher_wing - gold_core_spawnable = NO_SPAWN loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) lava_drinker = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index e4eb7122d391..fede2e8753ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -29,7 +29,6 @@ throw_message = "sinks in slowly, before being pushed out of " deathmessage = "stops moving as green liquid oozes from the carcass!" status_flags = CANPUSH - gold_core_spawnable = HOSTILE_SPAWN search_objects = 1 wanted_objects = list( /obj/item/stack/ore/diamond, diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index e7257c7d39c4..a6457306cda7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -28,7 +28,6 @@ friendly_verb_simple = "pinch" a_intent = INTENT_HELP ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN stat_attack = HARD_CRIT gender = NEUTER stop_automated_movement = FALSE @@ -102,7 +101,6 @@ /mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch name = "grublunch" wanted_objects = list() //They don't eat. - gold_core_spawnable = NO_SPAWN var/growth = 0 //Baby gutlunch diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 25827781b4b8..8ec732defc04 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -14,7 +14,6 @@ attack_sound = 'sound/weapons/bladeslice.ogg' faction = list("nether") speak_emote = list("screams") - gold_core_spawnable = HOSTILE_SPAWN atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE @@ -158,7 +157,6 @@ icon_state = "blank-body" icon_living = "blank-body" icon_dead = "blank-dead" - gold_core_spawnable = NO_SPAWN health = 100 maxHealth = 100 melee_damage_lower = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index cad59e7369b8..f957018dfad1 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -25,7 +25,6 @@ attack_sound = 'sound/weapons/punch1.ogg' ventcrawler = VENTCRAWLER_ALWAYS unique_name = TRUE - gold_core_spawnable = HOSTILE_SPAWN faction = list("rat") var/datum/action/cooldown/coffer var/datum/action/cooldown/riot diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index e8bee6661a5a..6c23f5cefe23 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -28,7 +28,6 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 1) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY - gold_core_spawnable = FRIENDLY_SPAWN var/stepped_sound = 'sound/effects/huuu.ogg' /mob/living/simple_animal/hostile/retaliate/frog/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 8b9d0d666bfb..d72cdf215e22 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -30,7 +30,6 @@ maxbodytemp = 1500 movement_type = FLYING pressure_resistance = 300 - gold_core_spawnable = NO_SPAWN //too spooky for science light_system = MOVABLE_LIGHT light_range = 1 // same glowing as visible player ghosts light_power = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index bac0b4b1d51b..d5b56f758cb1 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -49,7 +49,6 @@ move_force = MOVE_FORCE_EXTREMELY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG pull_force = MOVE_FORCE_EXTREMELY_STRONG - gold_core_spawnable = HOSTILE_SPAWN var/cannot_be_seen = 1 var/mob/living/creator = null diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 41efc6993d9d..c040a2221d0b 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -40,7 +40,6 @@ deathmessage = "is hacked into pieces!" loot = list(/obj/item/stack/sheet/mineral/wood) - gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 var/is_tree = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index b77436c09c89..be3242ed5252 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -32,7 +32,6 @@ aggro_vision_range = 9 mob_size = MOB_SIZE_SMALL environment_smash = ENVIRONMENT_SMASH_NONE - gold_core_spawnable = HOSTILE_SPAWN var/wumbo = 0 var/inflate_cooldown = 0 var/datum/action/innate/fugu/expand/E diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index bc22f78ae7a3..b39793d9a414 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -64,7 +64,6 @@ friendly_verb_simple = "groom" mob_size = MOB_SIZE_SMALL movement_type = FLYING - gold_core_spawnable = FRIENDLY_SPAWN var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created @@ -904,7 +903,6 @@ name = "Polly" desc = "Polly the Parrot. An expert on quantum cracker theory." speak = list("Polly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") - gold_core_spawnable = NO_SPAWN speak_chance = 3 var/memory_saved = FALSE var/rounds_survived = 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 55ea24c81d7d..35e0e535c96d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -98,8 +98,6 @@ var/obj/item/card/id/access_card = null ///In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against. var/buffed = 0 - ///If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood. - var/gold_core_spawnable = NO_SPAWN var/datum/component/spawner/nest diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index cb4b76983563..cafb6cb77bd5 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -43,7 +43,6 @@ // for the sake of cleanliness, though, here they are. status_flags = CANUNCONSCIOUS|CANPUSH - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 var/powerlevel = 0 // 1-10 controls how much electricity they are generating @@ -71,7 +70,6 @@ ///////////TIME FOR SUBSPECIES var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey var/list/slime_mutation[4] var/static/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange", @@ -79,13 +77,6 @@ "gold", "green", "adamantine", "oil", "light pink", "bluespace", "cerulean", "sepia", "black", "pyrite") - ///////////CORE-CROSSING CODE - - var/effectmod //What core modification is being used. - var/crossbreed_modifier = 1 // modifies how many extracts are needed - var/applied = 0 //How many extracts of the modtype have been applied. - - /mob/living/simple_animal/slime/Initialize(mapload, new_colour="grey", new_is_adult=FALSE) var/datum/action/innate/slime/feed/F = new F.Grant(src) @@ -119,8 +110,6 @@ colour = new_colour update_name() slime_mutation = mutation_table(colour) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") regenerate_icons() /mob/living/simple_animal/slime/update_name() @@ -354,50 +343,9 @@ force_effect = round(W.force/2) if(prob(10 + force_effect)) discipline_slime(user) - if(istype(W, /obj/item/storage/bag/bio)) - var/obj/item/storage/P = W - if(!effectmod) - to_chat(user, "The slime is not currently being mutated.") - return - var/hasOutput = FALSE //Have we outputted text? - var/hasFound = FALSE //Have we found an extract to be added? - for(var/obj/item/slime_extract/S in P.contents) - if(S.effectmod == effectmod) - SEND_SIGNAL(P, COMSIG_TRY_STORAGE_TAKE, S, get_turf(src), TRUE) - qdel(S) - applied++ - hasFound = TRUE - if(applied >= (SLIME_EXTRACT_CROSSING_REQUIRED * crossbreed_modifier)) - to_chat(user, "You feed the slime as many of the extracts from the bag as you can, and it mutates!") - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - spawn_corecross() - hasOutput = TRUE - break - if(!hasOutput) - if(!hasFound) - to_chat(user, "There are no extracts in the bag that this slime will accept!") - else - to_chat(user, "You feed the slime some extracts from the bag.") - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) return ..() -/mob/living/simple_animal/slime/proc/spawn_corecross() - var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) - visible_message("[src] shudders, its mutated core consuming the rest of its body!") - playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) - var/crosspath - for(var/X in crossbreeds) - var/obj/item/slimecross/S = X - if(initial(S.colour) == colour && initial(S.effect) == effectmod) - crosspath = S - break - if(crosspath) - new crosspath(loc) - else - visible_message("The mutated core shudders, and collapses into a puddle, unable to maintain its form.") - qdel(src) - /mob/living/simple_animal/slime/proc/apply_water() adjustBruteLoss(rand(15,20)) if(!client) diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm deleted file mode 100644 index 25cbcd42e124..000000000000 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/movespeed_modifier/status_effect/bloodchill - multiplicative_slowdown = 3 - -/datum/movespeed_modifier/status_effect/bonechill - multiplicative_slowdown = 3 - -/datum/movespeed_modifier/status_effect/lightpink - multiplicative_slowdown = -0.25 - blacklisted_movetypes = (FLYING|FLOATING) - -/datum/movespeed_modifier/status_effect/tarfoot - multiplicative_slowdown = 0.5 - blacklisted_movetypes = (FLYING|FLOATING) - -/datum/movespeed_modifier/status_effect/sepia - variable = TRUE - blacklisted_movetypes = (FLYING|FLOATING) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index b1847513a941..74f6d8f3fe6f 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -342,18 +342,6 @@ custom_materials = null grown_battery = TRUE //it has the overlays for wires -/obj/item/stock_parts/cell/high/slime - name = "charged slime core" - desc = "A yellow slime core infused with plasma, it crackles with power." - icon = 'icons/mob/slimes.dmi' - icon_state = "yellow slime extract" - custom_materials = null - rating = 5 //self-recharge makes these desirable - self_recharge = 1 // Infused slime cores self-recharge, over time - -/*Hypercharged slime cell - located in /code/modules/research/xenobiology/crossbreeding/_misc.dm -/obj/item/stock_parts/cell/high/slime/hypercharged */ - /obj/item/stock_parts/cell/emproof name = "\improper EMP-proof cell" desc = "An EMP-proof cell." diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 49765fd6747b..a442ee2a11c8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -519,11 +519,6 @@ if(!C.required_other) matching_other = 1 - else if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 else if(!C.required_container) matching_container = 1 @@ -571,15 +566,6 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - selected_reaction.on_reaction(src, multiplier) reaction_occurred = 1 diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 313fb7475e00..14ded3b571f9 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -299,10 +299,6 @@ shock_timer = 0 //immune to shocks M.AdjustAllImmobility(-40) M.adjustStaminaLoss(-2, 0) - if(isluminescent(M)) - var/mob/living/carbon/human/H = M - var/datum/species/jelly/luminescent/L = H.dna.species - L.extract_cooldown = max(0, L.extract_cooldown - 20) ..() /datum/reagent/firefighting_foam diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 851a9e38a267..d5e74a6766bb 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -18,38 +18,6 @@ return //I recommend you set the result amount to the total volume of all components. -/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_class = HOSTILE_SPAWN, mob_faction = "chemicalsummon", random = TRUE) - if(holder && holder.my_atom) - var/atom/A = holder.my_atom - var/turf/T = get_turf(A) - var/message = "Mobs have been spawned in [ADMIN_VERBOSEJMP(T)] by a [reaction_name] reaction." - message += " (
VV)" - - var/mob/M = get(A, /mob) - if(M) - message += " - Carried By: [ADMIN_LOOKUPFLW(M)]" - else - message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" - - message_admins(message, 0, 1) - log_game("[reaction_name] chemical mob spawn reaction occuring at [AREACOORD(T)] carried by [key_name(M)] with last fingerprint [A.fingerprintslast? A.fingerprintslast : "N/A"]") - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, TRUE) - - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_act() - - for(var/i in 1 to amount_to_spawn) - var/mob/living/simple_animal/S - if(random) - S = create_random_mob(get_turf(holder.my_atom), mob_class) - else - S = new mob_class(get_turf(holder.my_atom))//Spawn our specific mob_class - S.faction |= mob_faction - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(S, pick(NORTH,SOUTH,EAST,WEST)) - ///Simulates a vortex that moves nearby movable atoms towards or away from the turf T. Range also determines the strength of the effect. High values cause nearby objects to be thrown. /proc/goonchem_vortex(turf/T, setting_type, range) for(var/atom/movable/X in orange(range, T)) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index d9b6b782115e..c4eaf50e45d0 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -435,18 +435,6 @@ results = list(/datum/reagent/colorful_reagent = 5) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) -/datum/chemical_reaction/life - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/blood = 1) - -/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) - chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN - -/datum/chemical_reaction/life_friendly - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/consumable/sugar = 1) - -/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) - chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) - /datum/chemical_reaction/corgium required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1) required_temp = 374 @@ -560,14 +548,6 @@ required_container = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom mix_message = "The mushroom's insides bubble and pop and it becomes very limp." -/datum/chemical_reaction/slime_extractification - required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5) - mix_message = "The mixture condenses into a ball." - -/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/slime_extract/grey(location) - /datum/chemical_reaction/metalgen_imprint required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) results = list(/datum/reagent/metalgen = 1) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm deleted file mode 100644 index 7429db4c1dec..000000000000 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ /dev/null @@ -1,595 +0,0 @@ - -/datum/chemical_reaction/slime - var/deletes_extract = TRUE - -/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) - use_slime_core(holder) - -/datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder) - SSblackbox.record_feedback("tally", "slime_cores_used", 1, "type") - if(deletes_extract) - delete_extract(holder) - -/datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder) - var/obj/item/slime_extract/M = holder.my_atom - if(M.Uses <= 0 && !results.len) //if the slime doesn't output chemicals - qdel(M) - -//Grey -/datum/chemical_reaction/slime/slimespawn - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/grey - required_other = TRUE - -/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder) - var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") - S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") - ..() - -/datum/chemical_reaction/slime/slimeinaprov - results = list(/datum/reagent/medicine/epinephrine = 3) - required_reagents = list(/datum/reagent/water = 5) - required_other = TRUE - required_container = /obj/item/slime_extract/grey - -/datum/chemical_reaction/slime/slimemonkey - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/grey - required_other = TRUE - -/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom)) - ..() - -//Green -/datum/chemical_reaction/slime/slimemutate - results = list(/datum/reagent/consumable/berryjuice = 1) // Removal of mutation toxins. This used to be jellyperson toxin, but is now just jelly. - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/green - -/datum/chemical_reaction/slime/unstabletoxin - results = list(/datum/reagent/toxin/mutagen = 1) // Removal of mutation toxins. This used to be unstable toxin, but is now unstable mutagen. - required_reagents = list(/datum/reagent/uranium/radium = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/green - - -//Metal -/datum/chemical_reaction/slime/slimemetal - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/metal - required_other = TRUE - -/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder) - var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/plasteel(location, 5) - new /obj/item/stack/sheet/metal(location, 15) - ..() - -/datum/chemical_reaction/slime/slimeglass - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/metal - required_other = TRUE - -/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder) - var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/rglass(location, 5) - new /obj/item/stack/sheet/glass(location, 15) - ..() - -//Gold -/datum/chemical_reaction/slime/slimemobspawn - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/gold - required_other = TRUE - deletes_extract = FALSE //we do delete, but we don't do so instantly - -/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - summon_mobs(holder, T) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate violently!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 5, "Gold Slime", HOSTILE_SPAWN), 50) - -/datum/chemical_reaction/slime/slimemobspawn/lesser - required_reagents = list(/datum/reagent/blood = 1) - -/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate violently!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50) - -/datum/chemical_reaction/slime/slimemobspawn/friendly - required_reagents = list(/datum/reagent/water = 1) - -/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate adorably!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50) - -/datum/chemical_reaction/slime/slimemobspawn/spider - required_reagents = list(/datum/reagent/spider_extract = 1) - -/datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate crikey-ingly!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, "neutral", FALSE), 50) - - -//Silver -/datum/chemical_reaction/slime/slimebork - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/silver - required_other = TRUE - -/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder) - //BORK BORK BORK - var/turf/T = get_turf(holder.my_atom) - - playsound(T, 'sound/effects/phasein.ogg', 100, TRUE) - - for(var/mob/living/carbon/C in viewers(T, null)) - C.flash_act() - - for(var/i in 1 to 4 + rand(1,2)) - var/chosen = getbork() - var/obj/B = new chosen(T) - if(prob(5))//Fry it! - var/obj/item/food/deepfryholder/fried - fried = new(T, B) - fried.fry() // actually set the name and colour it - B = fried - if(prob(50)) - for(var/j in 1 to rand(1, 3)) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - ..() - -/datum/chemical_reaction/slime/slimebork/proc/getbork() - return get_random_food() - -/datum/chemical_reaction/slime/slimebork/drinks - required_reagents = list(/datum/reagent/water = 1) - -/datum/chemical_reaction/slime/slimebork/drinks/getbork() - return get_random_drink() - -//Blue -/datum/chemical_reaction/slime/slimefrost - results = list(/datum/reagent/consumable/frostoil = 10) - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/blue - required_other = TRUE - -/datum/chemical_reaction/slime/slimestabilizer - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/blue - required_other = TRUE - -/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/stabilizer(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimefoam - required_reagents = list(/datum/reagent/water = 5) - required_container = /obj/item/slime_extract/blue - required_other = TRUE - -/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder) - holder.create_foam(/datum/effect_system/foam_spread,80, "[src] spews out foam!") - -//Dark Blue -/datum/chemical_reaction/slime/slimefreeze - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/darkblue - required_other = TRUE - deletes_extract = FALSE - -/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract starts to feel extremely cold!") - addtimer(CALLBACK(src, PROC_REF(freeze), holder), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder) - if(holder && holder.my_atom) - var/turf/open/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air("n2=50;TEMP=2.7") - -/datum/chemical_reaction/slime/slimefireproof - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/darkblue - required_other = TRUE - -/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom)) - ..() - -//Orange -/datum/chemical_reaction/slime/slimecasp - results = list(/datum/reagent/consumable/capsaicin = 10) - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/orange - required_other = TRUE - -/datum/chemical_reaction/slime/slimefire - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/orange - required_other = TRUE - deletes_extract = FALSE - -/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate adorably!") - addtimer(CALLBACK(src, PROC_REF(slime_burn), holder), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder) - if(holder && holder.my_atom) - var/turf/open/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air("plasma=50;TEMP=1000") - - -/datum/chemical_reaction/slime/slimesmoke - results = list(/datum/reagent/phosphorus = 10, /datum/reagent/potassium = 10, /datum/reagent/consumable/sugar = 10) - required_reagents = list(/datum/reagent/water = 5) - required_container = /obj/item/slime_extract/orange - required_other = TRUE - -//Yellow -/datum/chemical_reaction/slime/slimeoverload - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/yellow - required_other = TRUE - -/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume) - empulse(get_turf(holder.my_atom), 3, 7) - ..() - -/datum/chemical_reaction/slime/slimecell - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/yellow - required_other = TRUE - -/datum/chemical_reaction/slime/slimecell/on_reaction(datum/reagents/holder, created_volume) - new /obj/item/stock_parts/cell/high/slime(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimeglow - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/yellow - required_other = TRUE - -/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") - new /obj/item/flashlight/slime(T) - ..() - -//Purple -/datum/chemical_reaction/slime/slimepsteroid - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/purple - required_other = TRUE - -/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/steroid(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimeregen - results = list(/datum/reagent/medicine/regen_jelly = 5) - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/purple - required_other = TRUE - -//Dark Purple -/datum/chemical_reaction/slime/slimeplasma - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/darkpurple - required_other = TRUE - -/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder) - new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3) - ..() - -//Red -/datum/chemical_reaction/slime/slimemutator - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/red - required_other = TRUE - -/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/mutator(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimebloodlust - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/red - required_other = TRUE - -/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) - if(slime.docile) //Undoes docility, but doesn't make rabid. - slime.visible_message("[slime] forgets its training, becoming wild once again!") - slime.docile = FALSE - slime.update_name() - continue - slime.rabid = 1 - slime.visible_message("The [slime] is driven into a frenzy!") - ..() - -/datum/chemical_reaction/slime/slimespeed - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/red - required_other = TRUE - -/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/speed(get_turf(holder.my_atom)) - ..() - -//Pink -/datum/chemical_reaction/slime/docility - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/pink - required_other = TRUE - -/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/docility(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/gender - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/pink - required_other = TRUE - -/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom)) - ..() - -//Black -/datum/chemical_reaction/slime/slimemutate2 - results = list(/datum/reagent/aslimetoxin = 1) - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/black - -//Oil -/datum/chemical_reaction/slime/slimeexplosion - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/oil - required_other = TRUE - deletes_extract = FALSE - -/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - var/lastkey = holder.my_atom.fingerprintslast - var/touch_msg = "N/A" - if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." - message_admins("Slime Explosion reaction started at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]") - log_game("Slime Explosion reaction started at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") - T.visible_message("The slime extract begins to vibrate violently !") - addtimer(CALLBACK(src, PROC_REF(boom), holder), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder) - if(holder && holder.my_atom) - explosion(get_turf(holder.my_atom), 1 ,3, 6) - - -/datum/chemical_reaction/slime/slimecornoil - results = list(/datum/reagent/consumable/cornoil = 10) - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/oil - required_other = TRUE - -//Light Pink -/datum/chemical_reaction/slime/slimepotion2 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - -/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/sentience(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/renaming - required_container = /obj/item/slime_extract/lightpink - required_reagents = list(/datum/reagent/water = 1) - required_other = TRUE - -/datum/chemical_reaction/slime/renaming/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/renaming(holder.my_atom.drop_location()) - ..() - - -//Adamantine -/datum/chemical_reaction/slime/adamantine - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/adamantine - required_other = TRUE - -/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder) - new /obj/item/stack/sheet/mineral/hidden/hellstone(get_turf(holder.my_atom)) - ..() - -//Bluespace -/datum/chemical_reaction/slime/slimefloor2 - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, created_volume) - new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25) - ..() - - -/datum/chemical_reaction/slime/slimecrystal - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume) - var/obj/item/stack/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") - ..() - -/datum/chemical_reaction/slime/slimeradio - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/reagents/holder, created_volume) - new /obj/item/slimepotion/slime/slimeradio(get_turf(holder.my_atom)) - ..() - -//Cerulean -/datum/chemical_reaction/slime/slimepsteroid2 - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/cerulean - required_other = TRUE - -/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slime_territory - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/cerulean - required_other = TRUE - -/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder) - new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom)) - ..() - -//Sepia -/datum/chemical_reaction/slime/slimestop - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/sepia - required_other = TRUE - -/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder) - addtimer(CALLBACK(src, PROC_REF(slime_stop), holder), 5 SECONDS) - -/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder) - var/obj/item/slime_extract/sepia/extract = holder.my_atom - var/turf/T = get_turf(holder.my_atom) - new /obj/effect/timestop(T, null, null, null) - if(istype(extract)) - if(extract.Uses > 0) - var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) - if(lastheld && !lastheld.equip_to_slot_if_possible(extract, ITEM_SLOT_HANDS, disable_warning = TRUE)) - extract.forceMove(get_turf(lastheld)) - use_slime_core(holder) - -/datum/chemical_reaction/slime/slimecamera - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/sepia - required_other = TRUE - -/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder) - new /obj/item/camera(get_turf(holder.my_atom)) - new /obj/item/camera_film(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimefloor - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/sepia - required_other = TRUE - -/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder) - new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25) - ..() - -//Pyrite -/datum/chemical_reaction/slime/slimepaint - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/pyrite - required_other = TRUE - -/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder) - var/chosen = pick(subtypesof(/obj/item/paint)) - new chosen(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimecrayon - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/pyrite - required_other = TRUE - -/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder) - var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) - new chosen(get_turf(holder.my_atom)) - ..() - -//Rainbow :o) -/datum/chemical_reaction/slime/slimeRNG - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder, created_volume) - if(created_volume >= 5) - var/obj/item/grenade/clusterbuster/slime/S = new (get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to expand uncontrollably!") - S.icon_state = "[S.base_state]_active" - S.active = TRUE - addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, prime)), rand(15,60)) - else - var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") - ..() - -/datum/chemical_reaction/slime/slimebomb - required_reagents = list(/datum/reagent/toxin/slimejelly = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/reagents/holder, created_volume) - var/turf/T = get_turf(holder.my_atom) - var/obj/item/grenade/clusterbuster/slime/volatile/S = new (T) - S.visible_message("Infused with slime jelly, the core begins to expand uncontrollably!") - S.icon_state = "[S.base_state]_active" - S.active = TRUE - addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, prime)), rand(15,60)) - var/lastkey = holder.my_atom.fingerprintslast - var/touch_msg = "N/A" - if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." - message_admins("Brorble Brorble primed at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]") - log_game("Brorble Brorble primed at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") - ..() - -/datum/chemical_reaction/slime/slime_transfer - required_reagents = list(/datum/reagent/blood = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/transference(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/flight_potion - required_reagents = list(/datum/reagent/water/holywater = 5, /datum/reagent/uranium = 5) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder) - new /obj/item/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom)) - ..() diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 2ba8ef1e2d7a..baa48134abbd 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -38,14 +38,6 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/xenobiocamera - name = "Computer Design (Xenobiology Console)" - desc = "Allows for the construction of circuit boards used to build xenobiology camera computers." - id = "xenobioconsole" - build_path = /obj/item/circuitboard/computer/xenobiology - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - /datum/design/board/aiupload name = "Computer Design (AI Upload)" desc = "Allows for the construction of circuit boards used to build an AI Upload Console." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index bbc83dd1e705..737572ef2fc2 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -332,15 +332,6 @@ build_path = /obj/item/circuitboard/machine/smartfridge category = list ("Misc. Machinery") - -/datum/design/board/monkey_recycler - name = "Machine Design (Monkey Recycler Board)" - desc = "The circuit board for a monkey recycler." - id = "monkey_recycler" - build_path = /obj/item/circuitboard/machine/monkey_recycler - category = list ("Misc. Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE - /datum/design/board/seed_extractor name = "Machine Design (Seed Extractor Board)" desc = "The circuit board for a seed extractor." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index ce473ad739cb..64e5a0921b2b 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -82,7 +82,6 @@ /obj/item/grenade, /obj/item/aicard, /obj/item/storage/backpack/holding, - /obj/item/slime_extract, /obj/item/onetankbomb, /obj/item/transfer_valve)) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 8b6acd39ae34..c21e3b1e6fcc 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -123,29 +123,6 @@ Nothing else in the console has ID requirements. return ..() /obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, params) - if(istype(D, /obj/item/slime_extract)) - var/obj/item/slime_extract/E = D - if(!slime_already_researched[E.type]) - if(!E.research) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) - visible_message("[src] buzzes and displays a message: Invalid extract! (You shouldn't be seeing this. If you are, tell someone.)") - return - if(E.Uses <= 0) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) - visible_message("[src] buzzes and displays a message: Extract consumed - no research available.") - return - else - playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("[user] inserts [E] into a slot on the [src]!", "You insert [E] into a slot on the [src], producting [E.research] points from the extract's chemical makeup!") - stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = E.research)) - slime_already_researched[E.type] = TRUE - qdel(D) - return - else - visible_message("[src] buzzes and displays a message: Slime extract already researched!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) - return - if(istype(D, /obj/item/seeds)) var/obj/item/seeds/E = D if(!plant_already_researched[E.type]) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 12dee3405a8c..39770fce5c85 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -119,7 +119,7 @@ display_name = "Biological Processing" description = "From slimes to kitchens." prereq_ids = list("biotech") - design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") + design_ids = list("smartfridge", "gibber", "deepfryer", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -230,7 +230,7 @@ display_name = "Basic Bluespace Theory" description = "Basic studies into the mysterious alternate dimension known as bluespace." prereq_ids = list("base") - design_ids = list("beacon", "xenobioconsole", "telesci_gps", "bluespace_crystal") + design_ids = list("beacon", "telesci_gps", "bluespace_crystal") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm deleted file mode 100644 index e2cfe4b40871..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ /dev/null @@ -1,193 +0,0 @@ -////////////////////////////////////////////// -////////// SLIME CROSSBREEDS ////////// -////////////////////////////////////////////// -// A system of combining two extract types. // -// Performed by feeding a slime 10 of an // -// extract color. // -////////////////////////////////////////////// -/*==========================================*\ -To add a crossbreed: - The file name is automatically selected - by the crossbreeding effect, which uses - the format slimecross/[modifier]/[color]. - - If a crossbreed doesn't exist, don't - worry. If no file is found at that - location, it will simple display that - the crossbreed was too unstable. - - As a result, do not feel the need to - try to add all of the crossbred - effects at once, if you're here and - trying to make a new slime type. Just - get your slimetype in the codebase and - get around to the crossbreeds eventually! -\*==========================================*/ - -/obj/item/slimecross //The base type for crossbred extracts. Mostly here for posterity, and to set base case things. - name = "crossbred slime extract" - desc = "An extremely potent slime extract, formed through crossbreeding." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "base" - var/colour = "null" - var/effect = "null" - var/effect_desc = "null" - force = 0 - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - throw_speed = 3 - throw_range = 6 - -/obj/item/slimecross/examine(mob/user) - . = ..() - if(effect_desc) - . += "[effect_desc]" - -/obj/item/slimecross/Initialize() - . = ..() - name = effect + " " + colour + " extract" - var/itemcolor = "#FFFFFF" - switch(colour) - if("orange") - itemcolor = "#FFA500" - if("purple") - itemcolor = "#B19CD9" - if("blue") - itemcolor = "#ADD8E6" - if("metal") - itemcolor = "#7E7E7E" - if("yellow") - itemcolor = "#FFFF00" - if("dark purple") - itemcolor = "#551A8B" - if("dark blue") - itemcolor = "#0000FF" - if("silver") - itemcolor = "#D3D3D3" - if("bluespace") - itemcolor = "#32CD32" - if("sepia") - itemcolor = "#704214" - if("cerulean") - itemcolor = "#2956B2" - if("pyrite") - itemcolor = "#FAFAD2" - if("red") - itemcolor = "#FF0000" - if("green") - itemcolor = "#00FF00" - if("pink") - itemcolor = "#FF69B4" - if("gold") - itemcolor = "#FFD700" - if("oil") - itemcolor = "#505050" - if("black") - itemcolor = "#000000" - if("light pink") - itemcolor = "#FFB6C1" - if("adamantine") - itemcolor = "#008B8B" - add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) - -/obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals. - name = "result extract" - desc = "You shouldn't see this." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "base" - var/del_on_empty = TRUE - var/list/list_reagents - -/obj/item/slimecrossbeaker/Initialize() - . = ..() - create_reagents(50, INJECTABLE | DRAWABLE) - if(list_reagents) - for(var/reagent in list_reagents) - reagents.add_reagent(reagent, list_reagents[reagent]) - if(del_on_empty) - START_PROCESSING(SSobj,src) - -/obj/item/slimecrossbeaker/Destroy() - STOP_PROCESSING(SSobj,src) - return ..() - -/obj/item/slimecrossbeaker/process() - if(!reagents.total_volume) - visible_message("[src] has been drained completely, and melts away.") - qdel(src) - -/obj/item/slimecrossbeaker/bloodpack //Pack of 50u blood. Deletes on empty. - name = "blood extract" - desc = "A sphere of liquid blood, somehow managing to stay together." - color = "#FF0000" - list_reagents = list(/datum/reagent/blood = 50) - -/obj/item/slimecrossbeaker/pax //5u synthpax. - name = "peace-inducing extract" - desc = "A small blob of synthetic pax." - color = "#FFCCCC" - list_reagents = list(/datum/reagent/pax/peaceborg = 5) - -/obj/item/slimecrossbeaker/omnizine //15u omnizine. - name = "healing extract" - desc = "A gelatinous extract of pure omnizine." - color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/omnizine = 15) - -/obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents. - var/ignore_flags = FALSE - var/self_use_only = FALSE - -/obj/item/slimecrossbeaker/autoinjector/Initialize() - . = ..() - reagents.flags = DRAWABLE // Cannot be refilled, since it's basically an autoinjector! - -/obj/item/slimecrossbeaker/autoinjector/attack(mob/living/M, mob/user) - if(!reagents.total_volume) - to_chat(user, "[src] is empty!") - return - if(!iscarbon(M)) - return - if(self_use_only && M != user) - to_chat(user, "This can only be used on yourself.") - return - if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) - reagents.trans_to(M, reagents.total_volume, transfered_by = user) - if(user != M) - to_chat(M, "[user] presses [src] against you!") - to_chat(user, "You press [src] against [M], injecting [M.p_them()].") - else - to_chat(user, "You press [src] against yourself, and it flattens against you!") - else - to_chat(user, "There's no place to stick [src]!") - -/obj/item/slimecrossbeaker/autoinjector/regenpack - ignore_flags = TRUE //It is, after all, intended to heal. - name = "mending solution" - desc = "A strange glob of sweet-smelling semifluid, which seems to stick to skin rather easily." - color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/regen_jelly = 20) - -/obj/item/slimecrossbeaker/autoinjector/slimejelly //Primarily for slimepeople, but you do you. - self_use_only = TRUE - ignore_flags = TRUE - name = "slime jelly bubble" - desc = "A sphere of slime jelly. It seems to stick to your skin, but avoids other surfaces." - color = "#00FF00" - list_reagents = list(/datum/reagent/toxin/slimejelly = 50) - -/obj/item/slimecrossbeaker/autoinjector/peaceandlove - name = "peaceful distillation" - desc = "A light pink gooey sphere. Simply touching it makes you a little dizzy." - color = "#DDAAAA" - list_reagents = list(/datum/reagent/pax/peaceborg = 10, /datum/reagent/drug/space_drugs = 15) //Peace, dudes - -/obj/item/slimecrossbeaker/autoinjector/peaceandlove/Initialize() - . = ..() - reagents.flags = NONE // It won't be *that* easy to get your hands on pax. - -/obj/item/slimecrossbeaker/autoinjector/slimestimulant - name = "invigorating gel" - desc = "A bubbling purple mixture, designed to heal and boost movement." - color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/regen_jelly = 30, /datum/reagent/drug/methamphetamine = 9) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm deleted file mode 100644 index 3d466983f430..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ /dev/null @@ -1,78 +0,0 @@ -/* -Slimecrossing Armor - Armor added by the slimecrossing system. - Collected here for clarity. -*/ - -//Rebreather mask - Chilling Blue -/obj/item/clothing/mask/nobreath - name = "rebreather mask" - desc = "A transparent mask, resembling a conventional breath mask, but made of bluish slime. Seems to lack any air supply tube, though." - icon_state = "slime" - item_state = "slime" - body_parts_covered = NONE - w_class = WEIGHT_CLASS_SMALL - gas_transfer_coefficient = 0 - permeability_coefficient = 0.5 - flags_cover = MASKCOVERSMOUTH - resistance_flags = NONE - -/obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot) - . = ..() - if(slot == ITEM_SLOT_MASK) - ADD_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") - user.failed_last_breath = FALSE - user.clear_alert("not_enough_oxy") - user.apply_status_effect(/datum/status_effect/rebreathing) - -/obj/item/clothing/mask/nobreath/dropped(mob/living/carbon/human/user) - ..() - REMOVE_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") - user.remove_status_effect(/datum/status_effect/rebreathing) - -/obj/item/clothing/head/peaceflower - name = "heroine bud" - desc = "An extremely addictive flower, full of peace magic." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "peaceflower" - item_state = "peaceflower" - slot_flags = ITEM_SLOT_HEAD - body_parts_covered = NONE - force = 0 - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - throw_speed = 1 - throw_range = 3 - -/obj/item/clothing/head/peaceflower/equipped(mob/living/carbon/human/user, slot) - . = ..() - if(slot == ITEM_SLOT_HEAD) - ADD_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") - -/obj/item/clothing/head/peaceflower/dropped(mob/living/carbon/human/user) - ..() - REMOVE_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") - -/obj/item/clothing/head/peaceflower/attack_hand(mob/user) - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(src == C.head) - to_chat(user, "You feel at peace. Why would you want anything else?") - return - return ..() - -/obj/item/clothing/suit/armor/heavy/adamantine - name = "adamantine armor" - desc = "A full suit of adamantine plate armor. Impressively resistant to damage, but weighs about as much as you do." - icon_state = "adamsuit" - item_state = "adamsuit" - flags_inv = NONE - obj_flags = IMMUTABLE_SLOW - slowdown = 4 - var/hit_reflect_chance = 40 - -/obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone) - if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance)) - return TRUE - else - return FALSE diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm deleted file mode 100644 index 2af2ecf64689..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ /dev/null @@ -1,234 +0,0 @@ -/* -Slimecrossing Items - General items added by the slimecrossing system. - Collected here for clarity. -*/ - -//Rewind camera - I'm already Burning Sepia -/obj/item/camera/rewind - name = "sepia-tinted camera" - desc = "They say a picture is like a moment stopped in time." - pictures_left = 1 - pictures_max = 1 - can_customise = FALSE - default_picture_name = "A nostalgic picture" - var/used = FALSE - -/datum/saved_bodypart - var/obj/item/bodypart/old_part - var/bodypart_type - var/brute_dam - var/burn_dam - var/stamina_dam - -/datum/saved_bodypart/New(obj/item/bodypart/part) - old_part = part - bodypart_type = part.type - brute_dam = part.brute_dam - burn_dam = part.burn_dam - stamina_dam = part.stamina_dam - -/mob/living/carbon/proc/apply_saved_bodyparts(list/datum/saved_bodypart/parts) - var/list/dont_chop = list() - for(var/zone in parts) - var/datum/saved_bodypart/saved_part = parts[zone] - var/obj/item/bodypart/already = get_bodypart(zone) - if(QDELETED(saved_part.old_part)) - saved_part.old_part = new saved_part.bodypart_type - if(!already || already != saved_part.old_part) - saved_part.old_part.replace_limb(src, TRUE) - saved_part.old_part.heal_damage(INFINITY, INFINITY, INFINITY, null, FALSE) - saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam, saved_part.stamina_dam) - dont_chop[zone] = TRUE - for(var/obj/item/bodypart/BP as anything in bodyparts) - if(dont_chop[BP.body_zone]) - continue - BP.drop_limb(TRUE) - -/mob/living/carbon/proc/save_bodyparts() - var/list/datum/saved_bodypart/ret = list() - for(var/_part in bodyparts) - var/obj/item/bodypart/part = _part - var/datum/saved_bodypart/saved_part = new(part) - - ret[part.body_zone] = saved_part - return ret - -/obj/item/camera/rewind/afterattack(atom/target, mob/user, flag) - if(!on || !pictures_left || !isturf(target.loc)) - return - if(!used)//selfie time - if(user == target) - to_chat(user, "You take a selfie!") - else - to_chat(user, "You take a photo with [target]!") - to_chat(target, "[user] takes a photo with you!") - to_chat(target, "You'll remember this moment forever!") - - used = TRUE - target.AddComponent(/datum/component/dejavu, 2) - .=..() - -/obj/item/camera/rewind/loot - pictures_left = 5 - pictures_max = 5 - -//Timefreeze camera - Old Burning Sepia result. Kept in case admins want to spawn it -/obj/item/camera/timefreeze - name = "sepia-tinted camera" - desc = "They say a picture is like a moment stopped in time." - pictures_left = 1 - pictures_max = 1 - var/used = FALSE - -/obj/item/camera/timefreeze/afterattack(atom/target, mob/user, flag) - if(!on || !pictures_left || !isturf(target.loc)) - return - if(!used) //refilling the film does not refill the timestop - new /obj/effect/timestop(get_turf(target), 2, 50, list(user)) - used = TRUE - desc = "This camera has seen better days." - . = ..() - - -//Hypercharged slime cell - Charged Yellow -/obj/item/stock_parts/cell/high/slime/hypercharged - name = "hypercharged slime core" - desc = "A charged yellow slime extract, infused with even more plasma. It almost hurts to touch." - rating = 7 //Roughly 1.5 times the original. - maxcharge = 20000 //2 times the normal one. - chargerate = 2250 //1.5 times the normal rate. - -//Barrier cube - Chilling Grey -/obj/item/barriercube - name = "barrier cube" - desc = "A compressed cube of slime. When squeezed, it grows to massive size!" - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "barriercube" - w_class = WEIGHT_CLASS_TINY - -/obj/item/barriercube/attack_self(mob/user) - if(locate(/obj/structure/barricade/slime) in get_turf(loc)) - to_chat(user, "You can't fit more than one barrier in the same space!") - return - to_chat(user, "You squeeze [src].") - var/obj/B = new /obj/structure/barricade/slime(get_turf(loc)) - B.visible_message("[src] suddenly grows into a large, gelatinous barrier!") - qdel(src) - -//Slime barricade - Chilling Grey -/obj/structure/barricade/slime - name = "gelatinous barrier" - desc = "A huge chunk of grey slime. Bullets might get stuck in it." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "slimebarrier" - proj_pass_rate = 40 - max_integrity = 60 - -//Melting Gel Wall - Chilling Metal -/obj/effect/forcefield/slimewall - name = "solidified gel" - desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!" - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "slimebarrier_thick" - CanAtmosPass = ATMOS_PASS_NO - opacity = TRUE - timeleft = 100 - -//Rainbow barrier - Chilling Rainbow -/obj/effect/forcefield/slimewall/rainbow - name = "rainbow barrier" - desc = "Despite others' urgings, you probably shouldn't taste this." - icon_state = "rainbowbarrier" - -//Ration pack - Chilling Silver -/obj/item/reagent_containers/food/snacks/rationpack - name = "ration pack" - desc = "A square bar that sadly looks like chocolate, packaged in a nondescript grey wrapper. Has saved soldiers' lives before - usually by stopping bullets." - icon_state = "rationpack" - bitesize = 3 - junkiness = 15 - filling_color = "#964B00" - tastes = list("cardboard" = 3, "sadness" = 3) - foodtype = null //Don't ask what went into them. You're better off not knowing. - list_reagents = list(/datum/reagent/consumable/nutriment/stabilized = 10, /datum/reagent/consumable/nutriment = 2) //Won't make you fat. Will make you question your sanity. - -/obj/item/reagent_containers/food/snacks/rationpack/checkLiked(fraction, mob/M) //Nobody likes rationpacks. Nobody. - if(last_check_time + 50 < world.time) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.mind && !HAS_TRAIT(H, TRAIT_AGEUSIA)) - to_chat(H,"That didn't taste very good...") //No disgust, though. It's just not good tasting. - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) - last_check_time = world.time - return - ..() - -//Ice stasis block - Chilling Dark Blue -/obj/structure/ice_stasis - name = "ice block" - desc = "A massive block of ice. You can see something vaguely humanoid inside." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "frozen" - density = TRUE - max_integrity = 100 - armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30) - -/obj/structure/ice_stasis/Initialize() - . = ..() - playsound(src, 'sound/magic/ethereal_exit.ogg', 50, TRUE) - -/obj/structure/ice_stasis/Destroy() - for(var/atom/movable/M in contents) - M.forceMove(loc) - playsound(src, 'sound/effects/glassbr3.ogg', 50, TRUE) - return ..() - -//Gold capture device - Chilling Gold -/obj/item/capturedevice - name = "gold capture device" - desc = "Bluespace technology packed into a roughly egg-shaped device, used to store nonhuman creatures. Can't catch them all, though - it only fits one." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "capturedevice" - -/obj/item/capturedevice/attack(mob/living/M, mob/user) - if(length(contents)) - to_chat(user, "The device already has something inside.") - return - if(!isanimal(M)) - to_chat(user, "The capture device only works on simple creatures.") - return - if(M.mind) - to_chat(user, "You offer the device to [M].") - if(alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", "Yes", "No") == "Yes") - if(user.canUseTopic(src, BE_CLOSE) && user.canUseTopic(M, BE_CLOSE)) - to_chat(user, "You store [M] in the capture device.") - to_chat(M, "The world warps around you, and you're suddenly in an endless void, with a window to the outside floating in front of you.") - store(M, user) - else - to_chat(user, "You were too far away from [M].") - to_chat(M, "You were too far away from [user].") - else - to_chat(user, "[M] refused to enter the device.") - return - else - if(istype(M, /mob/living/simple_animal/hostile) && !("neutral" in M.faction)) - to_chat(user, "This creature is too aggressive to capture.") - return - to_chat(user, "You store [M] in the capture device.") - store(M) - -/obj/item/capturedevice/attack_self(mob/user) - if(contents.len) - to_chat(user, "You open the capture device!") - release() - else - to_chat(user, "The device is empty...") - -/obj/item/capturedevice/proc/store(mob/living/M) - M.forceMove(src) - -/obj/item/capturedevice/proc/release() - for(var/atom/movable/M in contents) - M.forceMove(get_turf(loc)) diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm deleted file mode 100644 index 0d155f2f90f7..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ /dev/null @@ -1,45 +0,0 @@ -/* -Slimecrossing Mobs - Mobs and effects added by the slimecrossing system. - Collected here for clarity. -*/ - -//Slime transformation power - Burning Black -/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform - name = "Slime Transformation" - desc = "Transform from a human to a slime, or back again!" - action_icon_state = "transformslime" - cooldown_min = 0 - charge_max = 0 - invocation_type = "none" - shapeshift_type = /mob/living/simple_animal/slime/transformedslime - convert_damage = TRUE - convert_damage_type = CLONE - var/remove_on_restore = FALSE - -/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/Restore(mob/living/M) - if(remove_on_restore) - if(M.mind) - M.mind.RemoveSpell(src) - ..() - -//Transformed slime - Burning Black -/mob/living/simple_animal/slime/transformedslime - -/mob/living/simple_animal/slime/transformedslime/Reproduce() //Just in case. - to_chat(src, "I can't reproduce...") - return - -//Slime corgi - Chilling Pink -/mob/living/simple_animal/pet/dog/corgi/puppy/slime - name = "\improper slime corgi puppy" - real_name = "slime corgi puppy" - desc = "An unbearably cute pink slime corgi puppy." - icon_state = "slime_puppy" - icon_living = "slime_puppy" - icon_dead = "slime_puppy_dead" - nofur = TRUE - gold_core_spawnable = NO_SPAWN - speak_emote = list("blorbles", "bubbles", "borks") - emote_hear = list("bubbles!", "splorts.", "splops!") - emote_see = list("gets goop everywhere.", "flops.", "jiggles!") diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm deleted file mode 100644 index fc9d9ef06c6a..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ /dev/null @@ -1,217 +0,0 @@ -/* -Slimecrossing Potions - Potions added by the slimecrossing system. - Collected here for clarity. -*/ - -//Extract cloner - Charged Grey -/obj/item/slimepotion/extract_cloner - name = "extract cloning potion" - desc = "An more powerful version of the extract enhancer potion, capable of cloning regular slime extracts." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpurple" - -/obj/item/slimepotion/extract_cloner/afterattack(obj/item/target, mob/user , proximity) - if(!proximity) - return - if(istype(target, /obj/item/reagent_containers)) - return ..(target, user, proximity) - if(istype(target, /obj/item/slimecross)) - to_chat(user, "[target] is too complex for the potion to clone!") - return - if(!istype(target, /obj/item/slime_extract)) - return - var/obj/item/slime_extract/S = target - if(S.recurring) - to_chat(user, "[target] is too complex for the potion to clone!") - return - var/path = S.type - var/obj/item/slime_extract/C = new path(get_turf(target)) - C.Uses = S.Uses - to_chat(user, "You pour the potion onto [target], and the fluid solidifies into a copy of it!") - qdel(src) - return - -//Peace potion - Charged Light Pink -/obj/item/slimepotion/peacepotion - name = "pacification potion" - desc = "A light pink solution of chemicals, smelling like liquid peace. And mercury salts." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potlightpink" - -/obj/item/slimepotion/peacepotion/attack(mob/living/M, mob/user) - if(!isliving(M) || M.stat == DEAD) - to_chat(user, "[src] only works on the living.") - return ..() - if(istype(M, /mob/living/simple_animal/hostile/megafauna)) - to_chat(user, "[src] does not work on beings of pure evil!") - return ..() - if(M != user) - M.visible_message("[user] starts to feed [M] [src]!", - "[user] starts to feed you [src]!") - else - M.visible_message("[user] starts to drink [src]!", - "You start to drink [src]!") - - if(!do_after(user, 100, target = M)) - return - if(M != user) - to_chat(user, "You feed [M] [src]!") - else - to_chat(user, "You drink [src]!") - if(isanimal(M)) - ADD_TRAIT(M, TRAIT_PACIFISM, MAGIC_TRAIT) - else if(iscarbon(M)) - var/mob/living/carbon/C = M - C.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_SURGERY) - qdel(src) - -//Love potion - Charged Pink -/obj/item/slimepotion/lovepotion - name = "love potion" - desc = "A pink chemical mix thought to inspire feelings of love." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpink" - -/obj/item/slimepotion/lovepotion/attack(mob/living/M, mob/user) - if(!isliving(M) || M.stat == DEAD) - to_chat(user, "The love potion only works on living things, sicko!") - return ..() - if(istype(M, /mob/living/simple_animal/hostile/megafauna)) - to_chat(user, "The love potion does not work on beings of pure evil!") - return ..() - if(user == M) - to_chat(user, "You can't drink the love potion. What are you, a narcissist?") - return ..() - if(M.has_status_effect(STATUS_EFFECT_INLOVE)) - to_chat(user, "[M] is already lovestruck!") - return ..() - - M.visible_message("[user] starts to feed [M] a love potion!", - "[user] starts to feed you a love potion!") - - if(!do_after(user, 50, target = M)) - return - to_chat(user, "You feed [M] the love potion!") - to_chat(M, "You develop feelings for [user], and anyone [user.p_they()] like.") - if(M.mind) - M.mind.store_memory("You are in love with [user].") - M.faction |= "[REF(user)]" - M.apply_status_effect(STATUS_EFFECT_INLOVE, user) - qdel(src) - -//Pressure potion - Charged Dark Blue -/obj/item/slimepotion/spaceproof - name = "slime pressurization potion" - desc = "A potent chemical sealant that will render any article of clothing airtight. Has two uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potblue" - var/uses = 2 - -/obj/item/slimepotion/spaceproof/afterattack(obj/item/clothing/C, mob/user, proximity) - . = ..() - if(!uses) - qdel(src) - return - if(!proximity) - return - if(!istype(C)) - to_chat(user, "The potion can only be used on clothing!") - return - if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE) - to_chat(user, "The [C] is already pressure-resistant!") - return ..() - to_chat(user, "You slather the blue gunk over the [C], making it airtight.") - C.name = "pressure-resistant [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) - C.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - C.cold_protection = C.body_parts_covered - C.clothing_flags |= STOPSPRESSUREDAMAGE - uses-- - if(!uses) - qdel(src) - -//Enhancer potion - Charged Cerulean -/obj/item/slimepotion/enhancer/max - name = "extract maximizer" - desc = "An extremely potent chemical mix that will maximize a slime extract's uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpurple" - -//Lavaproofing potion - Charged Red -/obj/item/slimepotion/lavaproof - name = "slime lavaproofing potion" - desc = "A strange, reddish goo said to repel lava as if it were water, without reducing flammability. Has two uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potred" - resistance_flags = LAVA_PROOF | FIRE_PROOF - var/uses = 2 - -/obj/item/slimepotion/lavaproof/afterattack(obj/item/C, mob/user, proximity) - . = ..() - if(!uses) - qdel(src) - return ..() - if(!proximity) - return ..() - if(!istype(C)) - to_chat(user, "You can't coat this with lavaproofing fluid!") - return ..() - to_chat(user, "You slather the red gunk over the [C], making it lavaproof.") - C.name = "lavaproof [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#800000", FIXED_COLOUR_PRIORITY) - C.resistance_flags |= LAVA_PROOF - if (istype(C, /obj/item/clothing)) - var/obj/item/clothing/CL = C - CL.clothing_flags |= LAVAPROTECT - uses-- - if(!uses) - qdel(src) - -//Revival potion - Charged Grey -/obj/item/slimepotion/slime_reviver - name = "slime revival potion" - desc = "Infused with plasma and compressed gel, this brings dead slimes back to life." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potsilver" - -/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The potion only works on slimes!") - return ..() - if(M.stat != DEAD) - to_chat(user, "The slime is still alive!") - return - if(M.maxHealth <= 0) - to_chat(user, "The slime is too unstable to return!") - M.revive(full_heal = TRUE, admin_revive = FALSE) - M.set_stat(CONSCIOUS) - M.visible_message("[M] is filled with renewed vigor and blinks awake!") - M.maxHealth -= 10 //Revival isn't healthy. - M.health -= 10 - M.regenerate_icons() - qdel(src) - -//Stabilizer potion - Charged Blue -/obj/item/slimepotion/slime/chargedstabilizer - name = "slime omnistabilizer" - desc = "An extremely potent chemical mix that will stop a slime from mutating completely." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potcyan" - -/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The stabilizer only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.mutation_chance == 0) - to_chat(user, "The slime already has no chance of mutating!") - return - - to_chat(user, "You feed the slime the omnistabilizer. It will not mutate this cycle!") - M.mutation_chance = 0 - qdel(src) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm deleted file mode 100644 index 651eb2fece14..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ /dev/null @@ -1,971 +0,0 @@ -/atom/movable/screen/alert/status_effect/rainbow_protection - name = "Rainbow Protection" - desc = "You are defended from harm, but so are those you might seek to injure!" - icon_state = "slime_rainbowshield" - -/datum/status_effect/rainbow_protection - id = "rainbow_protection" - duration = 100 - alert_type = /atom/movable/screen/alert/status_effect/rainbow_protection - var/originalcolor - -/datum/status_effect/rainbow_protection/on_apply() - owner.status_flags |= GODMODE - ADD_TRAIT(owner, TRAIT_PACIFISM, /datum/status_effect/rainbow_protection) - owner.visible_message("[owner] shines with a brilliant rainbow light.", - "You feel protected by an unknown force!") - originalcolor = owner.color - return ..() - -/datum/status_effect/rainbow_protection/tick() - owner.color = rgb(rand(0,255),rand(0,255),rand(0,255)) - return ..() - -/datum/status_effect/rainbow_protection/on_remove() - owner.status_flags &= ~GODMODE - owner.color = originalcolor - REMOVE_TRAIT(owner, TRAIT_PACIFISM, /datum/status_effect/rainbow_protection) - owner.visible_message("[owner] stops glowing, the rainbow light fading away.", - "You no longer feel protected...") - -/atom/movable/screen/alert/status_effect/slimeskin - name = "Adamantine Slimeskin" - desc = "You are covered in a thick, non-neutonian gel." - icon_state = "slime_stoneskin" - -/datum/status_effect/slimeskin - id = "slimeskin" - duration = 300 - alert_type = /atom/movable/screen/alert/status_effect/slimeskin - var/originalcolor - -/datum/status_effect/slimeskin/on_apply() - originalcolor = owner.color - owner.color = "#3070CC" - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance += 10 - owner.visible_message("[owner] is suddenly covered in a strange, blue-ish gel!", - "You are covered in a thick, rubbery gel.") - return ..() - -/datum/status_effect/slimeskin/on_remove() - owner.color = originalcolor - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance -= 10 - owner.visible_message("[owner]'s gel coating liquefies and dissolves away.", - "Your gel second-skin dissolves!") - -/datum/status_effect/slimerecall - id = "slime_recall" - duration = -1 //Will be removed by the extract. - alert_type = null - var/interrupted = FALSE - var/mob/target - var/icon/bluespace - -/datum/status_effect/slimerecall/on_apply() - RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(resistField)) - to_chat(owner, "You feel a sudden tug from an unknown force, and feel a pull to bluespace!") - to_chat(owner, "Resist if you wish avoid the force!") - bluespace = icon('icons/effects/effects.dmi',"chronofield") - owner.add_overlay(bluespace) - return ..() - -/datum/status_effect/slimerecall/proc/resistField() - interrupted = TRUE - owner.remove_status_effect(src) -/datum/status_effect/slimerecall/on_remove() - UnregisterSignal(owner, COMSIG_LIVING_RESIST) - owner.cut_overlay(bluespace) - if(interrupted || !ismob(target)) - to_chat(owner, "The bluespace tug fades away, and you feel that the force has passed you by.") - return - owner.visible_message("[owner] disappears in a flurry of sparks!", - "The unknown force snatches briefly you from reality, and deposits you next to [target]!") - do_sparks(3, TRUE, owner) - owner.forceMove(target.loc) - -/atom/movable/screen/alert/status_effect/freon/stasis - desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out." - -/datum/status_effect/frozenstasis - id = "slime_frozen" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 //Will remove self when block breaks. - alert_type = /atom/movable/screen/alert/status_effect/freon/stasis - var/obj/structure/ice_stasis/cube - -/datum/status_effect/frozenstasis/on_apply() - RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(breakCube)) - cube = new /obj/structure/ice_stasis(get_turf(owner)) - owner.forceMove(cube) - owner.status_flags |= GODMODE - return ..() - -/datum/status_effect/frozenstasis/tick() - if(!cube || owner.loc != cube) - owner.remove_status_effect(src) - -/datum/status_effect/frozenstasis/proc/breakCube() - owner.remove_status_effect(src) - -/datum/status_effect/frozenstasis/on_remove() - if(cube) - qdel(cube) - owner.status_flags &= ~GODMODE - UnregisterSignal(owner, COMSIG_LIVING_RESIST) - -/datum/status_effect/slime_clone - id = "slime_cloned" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 - alert_type = null - var/mob/living/clone - var/datum/mind/originalmind //For when the clone gibs. - -/datum/status_effect/slime_clone/on_apply() - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - if(owner.mind) - originalmind = owner.mind - owner.mind.transfer_to(clone) - clone.apply_status_effect(/datum/status_effect/slime_clone_decay) - return ..() - -/datum/status_effect/slime_clone/tick() - if(!istype(clone) || clone.stat != CONSCIOUS) - owner.remove_status_effect(src) - -/datum/status_effect/slime_clone/on_remove() - if(clone && clone.mind && owner) - clone.mind.transfer_to(owner) - else - if(owner && originalmind) - originalmind.transfer_to(owner) - if(originalmind.key) - owner.ckey = originalmind.key - if(clone) - clone.unequip_everything() - qdel(clone) - -/atom/movable/screen/alert/status_effect/clone_decay - name = "Clone Decay" - desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall." - icon_state = "slime_clonedecay" - -/datum/status_effect/slime_clone_decay - id = "slime_clonedecay" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 - alert_type = /atom/movable/screen/alert/status_effect/clone_decay - -/datum/status_effect/slime_clone_decay/tick() - owner.adjustToxLoss(1, 0) - owner.adjustOxyLoss(1, 0) - owner.adjustBruteLoss(1, 0) - owner.adjustFireLoss(1, 0) - owner.color = "#007BA7" - -/atom/movable/screen/alert/status_effect/bloodchill - name = "Bloodchilled" - desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" - icon_state = "bloodchill" - -/datum/status_effect/bloodchill - id = "bloodchill" - duration = 100 - alert_type = /atom/movable/screen/alert/status_effect/bloodchill - -/datum/status_effect/bloodchill/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) - return ..() - -/datum/status_effect/bloodchill/tick() - if(prob(50)) - owner.adjustFireLoss(2) - -/datum/status_effect/bloodchill/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) - -/datum/status_effect/bonechill - id = "bonechill" - duration = 80 - alert_type = /atom/movable/screen/alert/status_effect/bonechill - -/datum/status_effect/bonechill/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) - return ..() - -/datum/status_effect/bonechill/tick() - if(prob(50)) - owner.adjustFireLoss(1) - owner.Jitter(3) - owner.adjust_bodytemperature(-10) - -/datum/status_effect/bonechill/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) -/atom/movable/screen/alert/status_effect/bonechill - name = "Bonechilled" - desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!" - icon_state = "bloodchill" - -/datum/status_effect/rebreathing - id = "rebreathing" - duration = -1 - alert_type = null - -/datum/status_effect/rebreathing/tick() - owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. - -/////////////////////////////////////////////////////// -//////////////////CONSUMING EXTRACTS/////////////////// -/////////////////////////////////////////////////////// - -/datum/status_effect/firecookie - id = "firecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/firecookie/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") - owner.adjust_bodytemperature(110) - return ..() - -/datum/status_effect/firecookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") - -/datum/status_effect/watercookie - id = "watercookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/watercookie/on_apply() - ADD_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie") - return ..() - -/datum/status_effect/watercookie/tick() - for(var/turf/open/T in range(get_turf(owner),1)) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) - -/datum/status_effect/watercookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie") - -/datum/status_effect/metalcookie - id = "metalcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/metalcookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod *= 0.9 - return ..() - -/datum/status_effect/metalcookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod /= 0.9 - -/datum/status_effect/sparkcookie - id = "sparkcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 300 - var/original_coeff - -/datum/status_effect/sparkcookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - original_coeff = H.physiology.siemens_coeff - H.physiology.siemens_coeff = 0 - return ..() - -/datum/status_effect/sparkcookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.siemens_coeff = original_coeff - -/datum/status_effect/toxincookie - id = "toxincookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 600 - -/datum/status_effect/toxincookie/on_apply() - ADD_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") - return ..() - -/datum/status_effect/toxincookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") - -/datum/status_effect/timecookie - id = "timecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 600 - -/datum/status_effect/timecookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H - H.physiology.do_after_speed *= 0.95 - return ..() - -/datum/status_effect/timecookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H - H.physiology.do_after_speed /= 0.95 - -/datum/status_effect/lovecookie - id = "lovecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 300 - -/datum/status_effect/lovecookie/tick() - if(owner.stat != CONSCIOUS) - return - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(C.handcuffed) - return - var/list/huggables = list() - for(var/mob/living/carbon/L in range(get_turf(owner),1)) - if(L != owner) - huggables += L - if(length(huggables)) - var/mob/living/carbon/hugged = pick(huggables) - owner.visible_message("[owner] hugs [hugged]!", "You hug [hugged]!") - -/datum/status_effect/tarcookie - id = "tarcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/tarcookie/tick() - for(var/mob/living/carbon/human/L in range(get_turf(owner),1)) - if(L != owner) - L.apply_status_effect(/datum/status_effect/tarfoot) - -/datum/status_effect/tarfoot - id = "tarfoot" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 30 - -/datum/status_effect/tarfoot/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot) - return ..() - -/datum/status_effect/tarfoot/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot) - -/datum/status_effect/spookcookie - id = "spookcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 300 - -/datum/status_effect/spookcookie/on_apply() - var/image/I = image(icon = 'icons/mob/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner) - I.override = 1 - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I) - return ..() - -/datum/status_effect/spookcookie/on_remove() - owner.remove_alt_appearance("spookyscary") - -/datum/status_effect/peacecookie - id = "peacecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/peacecookie/tick() - for(var/mob/living/L in range(get_turf(owner),1)) - L.apply_status_effect(/datum/status_effect/plur) - -/datum/status_effect/plur - id = "plur" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 30 - -/datum/status_effect/plur/on_apply() - ADD_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") - return ..() - -/datum/status_effect/plur/on_remove() - REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") - -/datum/status_effect/adamantinecookie - id = "adamantinecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/adamantinecookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.burn_mod *= 0.9 - return ..() - -/datum/status_effect/adamantinecookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.burn_mod /= 0.9 - -/////////////////////////////////////////////////////// -//////////////////STABILIZED EXTRACTS////////////////// -/////////////////////////////////////////////////////// - -/datum/status_effect/stabilized //The base stabilized extract effect, has no effect of its' own. - id = "stabilizedbase" - duration = -1 - alert_type = null - var/obj/item/slimecross/stabilized/linked_extract - var/colour = "null" - -/datum/status_effect/stabilized/tick() - if(!linked_extract || !linked_extract.loc) //Sanity checking - qdel(src) - return - if(linked_extract && linked_extract.loc != owner && linked_extract.loc.loc != owner) - linked_extract.linked_effect = null - if(!QDELETED(linked_extract)) - linked_extract.owner = null - START_PROCESSING(SSobj,linked_extract) - qdel(src) - return ..() - -/datum/status_effect/stabilized/null //This shouldn't ever happen, but just in case. - id = "stabilizednull" - - -//Stabilized effects start below. -/datum/status_effect/stabilized/grey - id = "stabilizedgrey" - colour = "grey" - -/datum/status_effect/stabilized/grey/tick() - for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) - if(!(owner in S.Friends)) - to_chat(owner, "[linked_extract] pulses gently as it communicates with [S].") - S.set_friendship(owner, 1) - return ..() - -/datum/status_effect/stabilized/orange - id = "stabilizedorange" - colour = "orange" - -/datum/status_effect/stabilized/orange/tick() - var/body_temperature_difference = owner.get_body_temp_normal(apply_change=FALSE) - owner.bodytemperature - owner.adjust_bodytemperature(min(5,body_temperature_difference)) - return ..() - -/datum/status_effect/stabilized/purple - id = "stabilizedpurple" - colour = "purple" - -/datum/status_effect/stabilized/purple/tick() - var/is_healing = FALSE - if(owner.getBruteLoss() > 0) - owner.adjustBruteLoss(-0.2) - is_healing = TRUE - if(owner.getFireLoss() > 0) - owner.adjustFireLoss(-0.2) - is_healing = TRUE - if(owner.getToxLoss() > 0) - owner.adjustToxLoss(-0.2, forced = TRUE) //Slimepeople should also get healed. - is_healing = TRUE - if(is_healing) - examine_text = "SUBJECTPRONOUN is regenerating slowly, purplish goo filling in small injuries!" - new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000") - else - examine_text = null - ..() - -/datum/status_effect/stabilized/blue - id = "stabilizedblue" - colour = "blue" - -/datum/status_effect/stabilized/blue/on_apply() - ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") - return ..() - -/datum/status_effect/stabilized/blue/on_remove() - REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") - -/datum/status_effect/stabilized/metal - id = "stabilizedmetal" - colour = "metal" - var/cooldown = 30 - var/max_cooldown = 30 - -/datum/status_effect/stabilized/metal/tick() - if(cooldown > 0) - cooldown-- - else - cooldown = max_cooldown - var/list/sheets = list() - for(var/obj/item/stack/sheet/S in owner.GetAllContents()) - if(S.amount < S.max_amount) - sheets += S - - if(sheets.len > 0) - var/obj/item/stack/sheet/S = pick(sheets) - S.amount++ - to_chat(owner, "[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!") - return ..() - - -/datum/status_effect/stabilized/yellow - id = "stabilizedyellow" - colour = "yellow" - var/cooldown = 10 - var/max_cooldown = 10 - examine_text = "Nearby electronics seem just a little more charged wherever SUBJECTPRONOUN goes." - -/datum/status_effect/stabilized/yellow/tick() - if(cooldown > 0) - cooldown-- - return ..() - cooldown = max_cooldown - var/list/batteries = list() - for(var/obj/item/stock_parts/cell/C in owner.GetAllContents()) - if(C.charge < C.maxcharge) - batteries += C - if(batteries.len) - var/obj/item/stock_parts/cell/ToCharge = pick(batteries) - ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum. - to_chat(owner, "[linked_extract] discharges some energy into a device you have.") - return ..() - -/obj/item/hothands - name = "burning fingertips" - desc = "You shouldn't see this." - -/obj/item/hothands/get_temperature() - return 290 //Below what's required to ignite plasma. - -/datum/status_effect/stabilized/darkpurple - id = "stabilizeddarkpurple" - colour = "dark purple" - var/obj/item/hothands/fire - examine_text = "Their fingertips burn brightly!" - -/datum/status_effect/stabilized/darkpurple/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") - fire = new(owner) - return ..() - -/datum/status_effect/stabilized/darkpurple/tick() - var/obj/item/I = owner.get_active_held_item() - var/obj/item/reagent_containers/food/snacks/F = I - if(istype(F)) - if(F.cooked_type) - to_chat(owner, "[linked_extract] flares up brightly, and your hands alone are enough cook [F]!") - var/obj/item/result = F.microwave_act() - if(istype(result)) - owner.put_in_hands(result) - else - I.attackby(fire, owner) - return ..() - -/datum/status_effect/stabilized/darkpurple/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") - qdel(fire) - -/datum/status_effect/stabilized/darkblue - id = "stabilizeddarkblue" - colour = "dark blue" - -/datum/status_effect/stabilized/darkblue/tick() - if(owner.fire_stacks > 0 && prob(80)) - owner.fire_stacks-- - if(owner.fire_stacks <= 0) - to_chat(owner, "[linked_extract] coats you in a watery goo, extinguishing the flames.") - var/obj/O = owner.get_active_held_item() - if(O) - O.extinguish() //All shamelessly copied from water's expose_obj, since I didn't seem to be able to get it here for some reason. - O.acid_level = 0 - // Monkey cube - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) - to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!") - var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O - cube.Expand() - - // Dehydrated carp - else if(istype(O, /obj/item/toy/plush/carpplushie/dehy_carp)) - to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!") - var/obj/item/toy/plush/carpplushie/dehy_carp/dehy = O - dehy.Swell() // Makes a carp - - else if(istype(O, /obj/item/stack/sheet/hairlesshide)) - to_chat(owner, "[linked_extract] kept your hands wet! It wets [O]!") - var/obj/item/stack/sheet/hairlesshide/HH = O - new /obj/item/stack/sheet/wethide(get_turf(HH), HH.amount) - qdel(HH) - ..() - -/datum/status_effect/stabilized/silver - id = "stabilizedsilver" - colour = "silver" - -/datum/status_effect/stabilized/silver/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.hunger_mod *= 0.8 //20% buff - return ..() - -/datum/status_effect/stabilized/silver/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.hunger_mod /= 0.8 - -//Bluespace has an icon because it's kinda active. -/atom/movable/screen/alert/status_effect/bluespaceslime - name = "Stabilized Bluespace Extract" - desc = "You shouldn't see this, since we set it to change automatically!" - icon_state = "slime_bluespace_on" - -/datum/status_effect/bluespacestabilization - id = "stabilizedbluespacecooldown" - duration = 1200 - alert_type = null - -/datum/status_effect/stabilized/bluespace - id = "stabilizedbluespace" - colour = "bluespace" - alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime - var/healthcheck - -/datum/status_effect/stabilized/bluespace/tick() - if(owner.has_status_effect(/datum/status_effect/bluespacestabilization)) - linked_alert.desc = "The stabilized bluespace extract is still aligning you with the bluespace axis." - linked_alert.icon_state = "slime_bluespace_off" - return ..() - else - linked_alert.desc = "The stabilized bluespace extract will try to redirect you from harm!" - linked_alert.icon_state = "slime_bluespace_on" - - if(healthcheck && (healthcheck - owner.health) > 5) - owner.visible_message("[linked_extract] notices the sudden change in [owner]'s physical health, and activates!") - do_sparks(5,FALSE,owner) - var/F = find_safe_turf(zlevels = owner.z, extended_safety_checks = TRUE) - var/range = 0 - if(!F) - F = get_turf(owner) - range = 50 - if(do_teleport(owner, F, range, channel = TELEPORT_CHANNEL_BLUESPACE)) - to_chat(owner, "[linked_extract] will take some time to re-align you on the bluespace axis.") - do_sparks(5,FALSE,owner) - owner.apply_status_effect(/datum/status_effect/bluespacestabilization) - healthcheck = owner.health - return ..() - -/datum/status_effect/stabilized/sepia - id = "stabilizedsepia" - colour = "sepia" - var/mod = 0 - -/datum/status_effect/stabilized/sepia/tick() - if(prob(50) && mod > -1) - mod-- - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = -0.5) - else if(mod < 1) - mod++ - // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0) - return ..() - -/datum/status_effect/stabilized/sepia/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia) - -/datum/status_effect/stabilized/cerulean - id = "stabilizedcerulean" - colour = "cerulean" - var/mob/living/clone - -/datum/status_effect/stabilized/cerulean/on_apply() - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - return ..() - -/datum/status_effect/stabilized/cerulean/tick() - if(owner.stat == DEAD) - if(clone && clone.stat != DEAD) - owner.visible_message("[owner] blazes with brilliant light, [linked_extract] whisking [owner.p_their()] soul away.", - "You feel a warm glow from [linked_extract], and you open your eyes... elsewhere.") - if(owner.mind) - owner.mind.transfer_to(clone) - clone = null - qdel(linked_extract) - if(!clone || clone.stat == DEAD) - to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") - qdel(linked_extract) - ..() - -/datum/status_effect/stabilized/cerulean/on_remove() - if(clone) - clone.visible_message("[clone] dissolves into a puddle of goo!") - clone.unequip_everything() - qdel(clone) - -/datum/status_effect/stabilized/pyrite - id = "stabilizedpyrite" - colour = "pyrite" - var/originalcolor - -/datum/status_effect/stabilized/pyrite/on_apply() - originalcolor = owner.color - return ..() - -/datum/status_effect/stabilized/pyrite/tick() - owner.color = rgb(rand(0,255),rand(0,255),rand(0,255)) - return ..() - -/datum/status_effect/stabilized/pyrite/on_remove() - owner.color = originalcolor - -/datum/status_effect/stabilized/red - id = "stabilizedred" - colour = "red" - -/datum/status_effect/stabilized/red/on_apply() - . = ..() - owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod) - -/datum/status_effect/stabilized/red/on_remove() - owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod) - return ..() - -/datum/status_effect/stabilized/green - id = "stabilizedgreen" - colour = "green" - var/datum/dna/originalDNA - var/originalname - -/datum/status_effect/stabilized/green/on_apply() - to_chat(owner, "You feel different...") - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - originalDNA = new H.dna.type - originalname = H.real_name - H.dna.copy_dna(originalDNA) - randomize_human(H) - return ..() - -/datum/status_effect/stabilized/green/tick() //Only occasionally give examiners a warning. - if(prob(50)) - examine_text = "SUBJECTPRONOUN looks a bit green and gooey..." - else - examine_text = null - return ..() - -/datum/status_effect/stabilized/green/on_remove() - to_chat(owner, "You feel more like yourself.") - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - originalDNA.transfer_identity(H) - H.real_name = originalname - H.updateappearance(mutcolor_update=1) - -/datum/status_effect/brokenpeace - id = "brokenpeace" - duration = 1200 - alert_type = null - -/datum/status_effect/pinkdamagetracker - id = "pinkdamagetracker" - duration = -1 - alert_type = null - var/damage = 0 - var/lasthealth - -/datum/status_effect/pinkdamagetracker/tick() - if((lasthealth - owner.health) > 0) - damage += (lasthealth - owner.health) - lasthealth = owner.health - -/datum/status_effect/stabilized/pink - id = "stabilizedpink" - colour = "pink" - var/list/mobs = list() - var/faction_name - -/datum/status_effect/stabilized/pink/on_apply() - faction_name = owner.real_name - return ..() - -/datum/status_effect/stabilized/pink/tick() - for(var/mob/living/simple_animal/M in view(7,get_turf(owner))) - if(!(M in mobs)) - mobs += M - M.apply_status_effect(/datum/status_effect/pinkdamagetracker) - M.faction |= faction_name - for(var/mob/living/simple_animal/M in mobs) - if(!(M in view(7,get_turf(owner)))) - M.faction -= faction_name - M.remove_status_effect(/datum/status_effect/pinkdamagetracker) - mobs -= M - var/datum/status_effect/pinkdamagetracker/C = M.has_status_effect(/datum/status_effect/pinkdamagetracker) - if(istype(C) && C.damage > 0) - C.damage = 0 - owner.apply_status_effect(/datum/status_effect/brokenpeace) - var/HasFaction = FALSE - for(var/i in owner.faction) - if(i == faction_name) - HasFaction = TRUE - - if(HasFaction && owner.has_status_effect(/datum/status_effect/brokenpeace)) - owner.faction -= faction_name - to_chat(owner, "The peace has been broken! Hostile creatures will now react to you!") - if(!HasFaction && !owner.has_status_effect(/datum/status_effect/brokenpeace)) - to_chat(owner, "[linked_extract] pulses, generating a fragile aura of peace.") - owner.faction |= faction_name - return ..() - -/datum/status_effect/stabilized/pink/on_remove() - for(var/mob/living/simple_animal/M in mobs) - M.faction -= faction_name - M.remove_status_effect(/datum/status_effect/pinkdamagetracker) - for(var/i in owner.faction) - if(i == faction_name) - owner.faction -= faction_name - -/datum/status_effect/stabilized/oil - id = "stabilizedoil" - colour = "oil" - examine_text = "SUBJECTPRONOUN smells of sulfer and oil!" - -/datum/status_effect/stabilized/oil/tick() - if(owner.stat == DEAD) - explosion(get_turf(owner),1,2,4,flame_range = 5) - return ..() - -/datum/status_effect/stabilized/black - id = "stabilizedblack" - colour = "black" - var/messagedelivered = FALSE - var/heal_amount = 1 - -/datum/status_effect/stabilized/black/tick() - if(owner.pulling && isliving(owner.pulling) && owner.grab_state == GRAB_KILL) - var/mob/living/M = owner.pulling - if(M.stat == DEAD) - return - if(!messagedelivered) - to_chat(owner,"You feel your hands melt around [M]'s neck and start to drain [M.p_them()] of life.") - to_chat(owner.pulling, "[owner]'s hands melt around your neck, and you can feel your life starting to drain away!") - messagedelivered = TRUE - examine_text = "SUBJECTPRONOUN is draining health from [owner.pulling]!" - var/list/healing_types = list() - if(owner.getBruteLoss() > 0) - healing_types += BRUTE - if(owner.getFireLoss() > 0) - healing_types += BURN - if(owner.getToxLoss() > 0) - healing_types += TOX - if(owner.getCloneLoss() > 0) - healing_types += CLONE - - owner.apply_damage_type(-heal_amount, damagetype=pick(healing_types)) - owner.adjust_nutrition(3) - M.adjustCloneLoss(heal_amount * 1.2) //This way, two people can't just convert each other's damage away. - else - messagedelivered = FALSE - examine_text = null - return ..() - -/datum/status_effect/stabilized/lightpink - id = "stabilizedlightpink" - colour = "light pink" - -/datum/status_effect/stabilized/lightpink/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - return ..() - -/datum/status_effect/stabilized/lightpink/tick() - for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) - if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) - to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") - H.reagents.add_reagent(/datum/reagent/medicine/epinephrine,5) - return ..() - -/datum/status_effect/stabilized/lightpink/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - -/datum/status_effect/stabilized/adamantine - id = "stabilizedadamantine" - colour = "adamantine" - examine_text = "SUBJECTPRONOUN has a strange metallic coating on their skin." - -/datum/status_effect/stabilized/gold - id = "stabilizedgold" - colour = "gold" - var/mob/living/simple_animal/familiar - -/datum/status_effect/stabilized/gold/tick() - var/obj/item/slimecross/stabilized/gold/linked = linked_extract - if(QDELETED(familiar)) - familiar = new linked.mob_type(get_turf(owner.loc)) - familiar.name = linked.mob_name - familiar.del_on_death = TRUE - familiar.copy_languages(owner, LANGUAGE_MASTER) - if(linked.saved_mind) - linked.saved_mind.transfer_to(familiar) - familiar.update_atom_languages() - familiar.ckey = linked.saved_mind.key - else - if(familiar.mind) - linked.saved_mind = familiar.mind - return ..() - -/datum/status_effect/stabilized/gold/on_remove() - if(familiar) - qdel(familiar) - -/datum/status_effect/stabilized/adamantine/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance += 5 - return ..() - -/datum/status_effect/stabilized/adamantine/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance -= 5 - -/datum/status_effect/stabilized/rainbow - id = "stabilizedrainbow" - colour = "rainbow" - -/datum/status_effect/stabilized/rainbow/tick() - if(owner.health <= 0) - var/obj/item/slimecross/stabilized/rainbow/X = linked_extract - if(istype(X)) - if(X.regencore) - X.regencore.afterattack(owner,owner,TRUE) - X.regencore = null - owner.visible_message("[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!") - qdel(src) - qdel(linked_extract) - return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm deleted file mode 100644 index 2bca49c62913..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ /dev/null @@ -1,38 +0,0 @@ -/* -Slimecrossing Weapons - Weapons added by the slimecrossing system. - Collected here for clarity. -*/ - -//Boneblade - Burning Green -/obj/item/melee/arm_blade/slime - name = "slimy boneblade" - desc = "What remains of the bones in your arm. Incredibly sharp, and painful for both you and your opponents." - force = 22.5 - force_string = "painful" - -/obj/item/melee/arm_blade/slime/attack(mob/living/L, mob/user) - . = ..() - if(prob(20)) - user.force_scream() - -//Adamantine shield - Chilling Adamantine -/obj/item/shield/adamantineshield - name = "adamantine shield" - desc = "A gigantic shield made of solid adamantium." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "adamshield" - item_state = "adamshield" - w_class = WEIGHT_CLASS_HUGE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) - slot_flags = ITEM_SLOT_BACK - block_chance = 50 - force = 0 - throw_range = 1 //How far do you think you're gonna throw a solid crystalline shield...? - throw_speed = 2 - attack_verb = list("bashed","pounded","slammed") - item_flags = SLOWS_WHILE_IN_HAND - -/obj/item/shield/adamantineshield/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm deleted file mode 100644 index 7d19fb0f8cfd..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ /dev/null @@ -1,307 +0,0 @@ -/* -Burning extracts: - Have a unique, primarily offensive effect when - filled with 10u plasma and activated in-hand. -*/ -/obj/item/slimecross/burning - name = "burning extract" - desc = "It's boiling over with barely-contained energy." - effect = "burning" - icon_state = "burning" - -/obj/item/slimecross/burning/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/burning/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/magic/fireball.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/burning/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/burning/grey - colour = "grey" - effect_desc = "Creates a hungry and speedy slime that will love you forever." - -/obj/item/slimecross/burning/grey/do_effect(mob/user) - var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") - S.visible_message("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!") - S.set_friendship(user, 20) //Gas, gas, gas - S.bodytemperature = T0C + 400 //We gonna step on the gas. - S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight! - ..() - -/obj/item/slimecross/burning/orange - colour = "orange" - effect_desc = "Expels pepperspray in a radius when activated." - -/obj/item/slimecross/burning/orange/do_effect(mob/user) - user.visible_message("[src] boils over with a caustic gas!") - var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 100) - - var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 7, get_turf(user)) - smoke.start() - ..() - -/obj/item/slimecross/burning/purple - colour = "purple" - effect_desc = "Creates a clump of invigorating gel, it has healing properties and makes you feel good." - -/obj/item/slimecross/burning/purple/do_effect(mob/user) - user.visible_message("[src] fills with a bubbling liquid!") - new /obj/item/slimecrossbeaker/autoinjector/slimestimulant(get_turf(user)) - ..() - -/obj/item/slimecross/burning/blue - colour = "blue" - effect_desc = "Freezes the floor around you and chills nearby people." - -/obj/item/slimecross/burning/blue/do_effect(mob/user) - user.visible_message("[src] flash-freezes the area!") - for(var/turf/open/T in range(3, get_turf(user))) - T.MakeSlippery(TURF_WET_PERMAFROST, min_wet_time = 10, wet_time_to_add = 5) - for(var/mob/living/carbon/M in range(5, get_turf(user))) - if(M != user && iscarbon(M)) - var/mob/living/carbon/C = M - M.bodytemperature = C.dna.species.bodytemp_cold_damage_limit + 10 //Not quite cold enough to hurt. - to_chat(M, "You feel a chill run down your spine, and the floor feels a bit slippery with frost...") - ..() - -/obj/item/slimecross/burning/metal - colour = "metal" - effect_desc = "Instantly destroys walls around you." - -/obj/item/slimecross/burning/metal/do_effect(mob/user) - for(var/turf/closed/wall/W in range(1,get_turf(user))) - W.dismantle_wall(devastated = TRUE) - playsound(W, 'sound/effects/break_stone.ogg', 50, TRUE) - user.visible_message("[src] pulses violently, and shatters the walls around it!") - ..() - -/obj/item/slimecross/burning/yellow - colour = "yellow" - effect_desc = "Electrocutes people near you." - -/obj/item/slimecross/burning/yellow/do_effect(mob/user) - user.visible_message("[src] explodes into an electrical field!") - playsound(get_turf(src), 'sound/weapons/zapbang.ogg', 50, TRUE) - for(var/mob/living/M in range(4,get_turf(user))) - if(M != user) - var/mob/living/carbon/C = M - if(istype(C)) - C.electrocute_act(25,src) - else - M.adjustFireLoss(25) - to_chat(M, "You feel a sharp electrical pulse!") - ..() - -/obj/item/slimecross/burning/darkpurple - colour = "dark purple" - effect_desc = "Creates a cloud of plasma." - -/obj/item/slimecross/burning/darkpurple/do_effect(mob/user) - user.visible_message("[src] sublimates into a cloud of plasma!") - var/turf/T = get_turf(user) - T.atmos_spawn_air("plasma=60") - ..() - -/obj/item/slimecross/burning/darkblue - colour = "dark blue" - effect_desc = "Expels a burst of chilling smoke while also filling you with cryoxadone." - -/obj/item/slimecross/burning/darkblue/do_effect(mob/user) - user.visible_message("[src] releases a burst of chilling smoke!") - var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent(/datum/reagent/consumable/frostoil, 40) - user.reagents.add_reagent(/datum/reagent/medicine/cryoxadone,10) - var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 7, get_turf(user)) - smoke.start() - ..() - -/obj/item/slimecross/burning/silver - colour = "silver" - effect_desc = "Creates a few pieces of slime jelly laced food." - -/obj/item/slimecross/burning/silver/do_effect(mob/user) - var/amount = rand(3,6) - var/list/turfs = list() - for(var/turf/open/T in range(1,get_turf(user))) - turfs += T - for(var/i = 0, i < amount, i++) - var/path = get_random_food() - var/obj/item/O = new path(pick(turfs)) - O.reagents.add_reagent(/datum/reagent/toxin/slimejelly,5) //Oh god it burns - if(prob(50)) - O.desc += " It smells strange..." - user.visible_message("[src] produces a few pieces of food!") - ..() - -/obj/item/slimecross/burning/bluespace - colour = "bluespace" - effect_desc = "Teleports anyone directly next to you." - -/obj/item/slimecross/burning/bluespace/do_effect(mob/user) - user.visible_message("[src] sparks, and lets off a shockwave of bluespace energy!") - for(var/mob/living/L in range(1, get_turf(user))) - if(L != user) - do_teleport(L, get_turf(L), 6, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //Somewhere between the effectiveness of fake and real BS crystal - new /obj/effect/particle_effect/sparks(get_turf(L)) - playsound(get_turf(L), "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - ..() - -/obj/item/slimecross/burning/sepia - colour = "sepia" - effect_desc = "Turns into a special camera that rewinds time when used." - -/obj/item/slimecross/burning/sepia/do_effect(mob/user) - user.visible_message("[src] shapes itself into a camera!") - new /obj/item/camera/rewind(get_turf(user)) - ..() - -/obj/item/slimecross/burning/cerulean - colour = "cerulean" - effect_desc = "Produces an extract cloning potion, which copies an extract, as well as its extra uses." - -/obj/item/slimecross/burning/cerulean/do_effect(mob/user) - user.visible_message("[src] produces a potion!") - new /obj/item/slimepotion/extract_cloner(get_turf(user)) - ..() - -/obj/item/slimecross/burning/pyrite - colour = "pyrite" - effect_desc = "Shatters all lights in the current room." - -/obj/item/slimecross/burning/pyrite/do_effect(mob/user) - user.visible_message("[src] releases a colorful wave of energy, which shatters the lights!") - var/area/A = get_area(user.loc) - for(var/obj/machinery/light/L in A) //Shamelessly copied from the APC effect. - L.on = TRUE - L.break_light_tube() - L.on = FALSE - stoplag() - ..() - -/obj/item/slimecross/burning/red - colour = "red" - effect_desc = "Makes nearby slimes rabid, and they'll also attack their friends." - -/obj/item/slimecross/burning/red/do_effect(mob/user) - user.visible_message("[src] pulses a hazy red aura for a moment, which wraps around [user]!") - for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user))) - if(user in S.Friends) - var/friendliness = S.Friends[user] - S.clear_friends() - S.set_friendship(user, friendliness) - else - S.clear_friends() - S.rabid = 1 - S.visible_message("The [S] is driven into a dangerous frenzy!") - ..() - -/obj/item/slimecross/burning/green - colour = "green" - effect_desc = "The user gets a dull arm blade in the hand it is used in." - -/obj/item/slimecross/burning/green/do_effect(mob/user) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - var/mob/living/L = user - if(!istype(user)) - return - var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case... - L.dropItemToGround(held) - var/obj/item/melee/arm_blade/slime/blade = new(user) - if(!L.put_in_hands(blade)) - qdel(blade) - user.visible_message("[src] melts onto [user]'s arm, boiling the flesh horribly!") - else - user.visible_message("[src] sublimates the flesh around [user]'s arm, transforming the bone into a gruesome blade!") - user.force_scream() - L.apply_damage(30,BURN,which_hand) - ..() - -/obj/item/slimecross/burning/pink - colour = "pink" - effect_desc = "Creates a beaker of synthpax." - -/obj/item/slimecross/burning/pink/do_effect(mob/user) - user.visible_message("[src] shrinks into a small, gel-filled pellet!") - new /obj/item/slimecrossbeaker/pax(get_turf(user)) - ..() - -/obj/item/slimecross/burning/gold - colour = "gold" - effect_desc = "Creates a gank squad of monsters that are friendly to the user." - -/obj/item/slimecross/burning/gold/do_effect(mob/user) - user.visible_message("[src] shudders violently, and summons an army for [user]!") - for(var/i in 1 to 3) //Less than gold normally does, since it's safer and faster. - var/mob/living/simple_animal/S = create_random_mob(get_turf(user), HOSTILE_SPAWN) - S.faction |= "[REF(user)]" - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(S, pick(NORTH,SOUTH,EAST,WEST)) - ..() - -/obj/item/slimecross/burning/oil - colour = "oil" - effect_desc = "Creates an explosion after a few seconds." - -/obj/item/slimecross/burning/oil/do_effect(mob/user) - user.visible_message("[user] activates [src]. It's going to explode!", "You activate [src]. It crackles in anticipation") - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - -/obj/item/slimecross/burning/oil/proc/boom() - var/turf/T = get_turf(src) - playsound(T, 'sound/effects/explosion2.ogg', 200, TRUE) - for(var/mob/living/M in range(2, T)) - new /obj/effect/temp_visual/explosion(get_turf(M)) - M.ex_act(EXPLODE_HEAVY) - qdel(src) - -/obj/item/slimecross/burning/black - colour = "black" - effect_desc = "Transforms the user into a slime. They can transform back at will and do not lose any items." - -/obj/item/slimecross/burning/black/do_effect(mob/user) - var/mob/living/L = user - if(!istype(L)) - return - user.visible_message("[src] absorbs [user], transforming [user.p_them()] into a slime!") - var/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/S = new() - S.remove_on_restore = TRUE - user.mind.AddSpell(S) - S.cast(list(user),user) - ..() - -/obj/item/slimecross/burning/lightpink - colour = "light pink" - effect_desc = "Paxes everyone in sight." - -/obj/item/slimecross/burning/lightpink/do_effect(mob/user) - user.visible_message("[src] lets off a hypnotizing pink glow!") - for(var/mob/living/carbon/C in view(7, get_turf(user))) - C.reagents.add_reagent(/datum/reagent/pax,5) - ..() - -/obj/item/slimecross/burning/adamantine - colour = "adamantine" - effect_desc = "Creates a mighty adamantine shield." - -/obj/item/slimecross/burning/adamantine/do_effect(mob/user) - user.visible_message("[src] crystallizes into a large shield!") - new /obj/item/shield/adamantineshield(get_turf(user)) - ..() - diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm deleted file mode 100644 index f01b148d4d5e..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ /dev/null @@ -1,272 +0,0 @@ -/* -Charged extracts: - Have a unique, effect when filled with - 10u plasma and activated in-hand, related to their - normal extract effect. -*/ -/obj/item/slimecross/charged - name = "charged extract" - desc = "It sparks with electric power." - effect = "charged" - icon_state = "charged" - -/obj/item/slimecross/charged/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/charged/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/effects/light_flicker.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/charged/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/charged/grey - colour = "grey" - effect_desc = "Produces a slime reviver potion, which revives dead slimes." - -/obj/item/slimecross/charged/grey/do_effect(mob/user) - new /obj/item/slimepotion/slime_reviver(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/orange - colour = "orange" - effect_desc = "Instantly makes a large burst of flame for a moment." - -/obj/item/slimecross/charged/orange/do_effect(mob/user) - for(var/turf/turf in range(5,get_turf(user))) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) - ..() - -/obj/item/slimecross/charged/purple - colour = "purple" - effect_desc = "Creates a packet of omnizine." - -/obj/item/slimecross/charged/purple/do_effect(mob/user) - new /obj/item/slimecrossbeaker/omnizine(get_turf(user)) - user.visible_message("[src] sparks, and floods with a regenerative solution!") - ..() - -/obj/item/slimecross/charged/blue - colour = "blue" - effect_desc = "Creates a potion that neuters the mutation chance of a slime, which passes on to new generations." - -/obj/item/slimecross/charged/blue/do_effect(mob/user) - new /obj/item/slimepotion/slime/chargedstabilizer(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/metal - colour = "metal" - effect_desc = "Produces a bunch of metal and plasteel." - -/obj/item/slimecross/charged/metal/do_effect(mob/user) - new /obj/item/stack/sheet/metal(get_turf(user), 25) - new /obj/item/stack/sheet/plasteel(get_turf(user), 10) - user.visible_message("[src] grows into a plethora of metals!") - ..() - -/obj/item/slimecross/charged/yellow - colour = "yellow" - effect_desc = "Creates a hypercharged slime cell battery, which has high capacity and recharges constantly at a very fast rate." - -/obj/item/slimecross/charged/yellow/do_effect(mob/user) - new /obj/item/stock_parts/cell/high/slime/hypercharged(get_turf(user)) - user.visible_message("[src] sparks violently, and swells with electric power!") - ..() - -/obj/item/slimecross/charged/darkpurple - colour = "dark purple" - effect_desc = "Creates several sheets of plasma." - -/obj/item/slimecross/charged/darkpurple/do_effect(mob/user) - new /obj/item/stack/sheet/mineral/plasma(get_turf(user), 10) - user.visible_message("[src] produces a large amount of plasma!") - ..() - -/obj/item/slimecross/charged/darkblue - colour = "dark blue" - effect_desc = "Produces a pressure proofing potion." - -/obj/item/slimecross/charged/darkblue/do_effect(mob/user) - new /obj/item/slimepotion/spaceproof(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/silver - colour = "silver" - effect_desc = "Creates a slime cake and some drinks." - -/obj/item/slimecross/charged/silver/do_effect(mob/user) - new /obj/item/food/cake/slimecake(get_turf(user)) - for(var/i in 1 to 10) - var/drink_type = get_random_drink() - new drink_type(get_turf(user)) - user.visible_message("[src] produces a party's worth of cake and drinks!") - ..() - -/obj/item/slimecross/charged/bluespace - colour = "bluespace" - effect_desc = "Makes a bluespace polycrystal." - -/obj/item/slimecross/charged/bluespace/do_effect(mob/user) - new /obj/item/stack/sheet/bluespace_crystal(get_turf(user), 10) - user.visible_message("[src] produces several sheets of polycrystal!") - ..() - -/obj/item/slimecross/charged/sepia - colour = "sepia" - effect_desc = "Creates a camera obscura." - -/obj/item/slimecross/charged/sepia/do_effect(mob/user) - new /obj/item/camera/spooky(get_turf(user)) - user.visible_message("[src] flickers in a strange, ethereal manner, and produces a camera!") - ..() - -/obj/item/slimecross/charged/cerulean - colour = "cerulean" - effect_desc = "Creates an extract enhancer, giving whatever it's used on five more uses." - -/obj/item/slimecross/charged/cerulean/do_effect(mob/user) - new /obj/item/slimepotion/enhancer/max(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/pyrite - colour = "pyrite" - effect_desc = "Creates bananium. Oh no." - -/obj/item/slimecross/charged/pyrite/do_effect(mob/user) - new /obj/item/stack/sheet/mineral/hidden/hellstone(get_turf(user), 10) - user.visible_message("[src] solidifies with a horrifying banana stench!") - ..() - -/obj/item/slimecross/charged/red - colour = "red" - effect_desc = "Produces a lavaproofing potion" - -/obj/item/slimecross/charged/red/do_effect(mob/user) - new /obj/item/slimepotion/lavaproof(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/green - colour = "green" - effect_desc = "Lets you choose what slime species you want to be." - -/obj/item/slimecross/charged/green/do_effect(mob/user) - var/mob/living/carbon/human/H = user - if(!istype(H)) - to_chat(user, "You must be a humanoid to use this!") - return - var/racechoice = input(H, "Choose your slime subspecies.", "Slime Selection") as null|anything in sortList(subtypesof(/datum/species/jelly), /proc/cmp_typepaths_asc) - if(!racechoice) - to_chat(user, "You decide not to become a slime for now.") - return - if(!user.canUseTopic(src, BE_CLOSE)) - return - H.set_species(racechoice, icon_update=1) - H.visible_message("[H] suddenly shifts form as [src] dissolves into [H.p_their()] skin!") - ..() - -/obj/item/slimecross/charged/pink - colour = "pink" - effect_desc = "Produces a... lovepotion... no ERP." - -/obj/item/slimecross/charged/pink/do_effect(mob/user) - new /obj/item/slimepotion/lovepotion(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/gold - colour = "gold" - effect_desc = "Slowly spawns 10 hostile monsters." - var/max_spawn = 10 - var/spawned = 0 - -/obj/item/slimecross/charged/gold/do_effect(mob/user) - user.visible_message("[src] starts shuddering violently!") - addtimer(CALLBACK(src, PROC_REF(startTimer)), 50) - -/obj/item/slimecross/charged/gold/proc/startTimer() - START_PROCESSING(SSobj, src) - -/obj/item/slimecross/charged/gold/process() - visible_message("[src] lets off a spark, and produces a living creature!") - new /obj/effect/particle_effect/sparks(get_turf(src)) - playsound(get_turf(src), "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - create_random_mob(get_turf(src), HOSTILE_SPAWN) - spawned++ - if(spawned >= max_spawn) - visible_message("[src] collapses into a puddle of goo.") - qdel(src) - -/obj/item/slimecross/charged/gold/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/slimecross/charged/oil - colour = "oil" - effect_desc = "Creates an explosion after a few seconds." - -/obj/item/slimecross/charged/oil/do_effect(mob/user) - user.visible_message("[src] begins to shake with rapidly increasing force!") - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - -/obj/item/slimecross/charged/oil/proc/boom() - explosion(get_turf(src), 2, 3, 4) //Much smaller effect than normal oils, but devastatingly strong where it does hit. - qdel(src) - -/obj/item/slimecross/charged/black - colour = "black" - effect_desc = "Randomizes the user's species." - -/obj/item/slimecross/charged/black/do_effect(mob/user) - var/mob/living/carbon/human/H = user - if(!istype(H)) - to_chat(user, "You have to be able to have a species to get your species changed.") - return - var/list/allowed_species = list() - for(var/stype in subtypesof(/datum/species)) - var/datum/species/X = stype - if(initial(X.changesource_flags) & SLIME_EXTRACT) - allowed_species += stype - - var/datum/species/changed = pick(allowed_species) - if(changed) - H.set_species(changed, icon_update = 1) - to_chat(H, "You feel very different!") - ..() - -/obj/item/slimecross/charged/lightpink - colour = "light pink" - effect_desc = "Produces a pacification potion, which works on monsters and humanoids." - -/obj/item/slimecross/charged/lightpink/do_effect(mob/user) - new /obj/item/slimepotion/peacepotion(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/adamantine - colour = "adamantine" - effect_desc = "Does nothing. Sorry :)" - -/obj/item/slimecross/charged/rainbow - colour = "rainbow" - effect_desc = "Produces three living slimes of random colors." - -/obj/item/slimecross/charged/rainbow/do_effect(mob/user) - user.visible_message("[src] swells and splits into three new slimes!") - for(var/i in 1 to 3) - var/mob/living/simple_animal/slime/S = new(get_turf(user)) - S.random_colour() - ..() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm deleted file mode 100644 index 8b2aa42f0487..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ /dev/null @@ -1,301 +0,0 @@ -/* -Chilling extracts: - Have a unique, primarily defensive effect when - filled with 10u plasma and activated in-hand. -*/ -/obj/item/slimecross/chilling - name = "chilling extract" - desc = "It's cold to the touch, as if frozen solid." - effect = "chilling" - icon_state = "chilling" - -/obj/item/slimecross/chilling/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/chilling/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/effects/glassbr1.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/chilling/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/chilling/grey - colour = "grey" - effect_desc = "Creates some slime barrier cubes. When used they create slimy barricades." - -/obj/item/slimecross/chilling/grey/do_effect(mob/user) - user.visible_message("[src] produces a few small, grey cubes") - for(var/i in 1 to 3) - new /obj/item/barriercube(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/orange - colour = "orange" - effect_desc = "Creates a ring of fire one tile away from the user." - -/obj/item/slimecross/chilling/orange/do_effect(mob/user) - user.visible_message("[src] shatters, and lets out a jet of heat!") - for(var/turf/T in orange(get_turf(user),2)) - if(get_dist(get_turf(user), T) > 1) - new /obj/effect/hotspot(T) - ..() - -/obj/item/slimecross/chilling/purple - colour = "purple" - effect_desc = "Injects everyone in the area with some regenerative jelly." - -/obj/item/slimecross/chilling/purple/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - if(A.outdoors) - to_chat(user, "[src] can't affect such a large area.") - return - user.visible_message("[src] shatters, and a healing aura fills the room briefly.") - for(var/mob/living/carbon/C in A) - C.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) - ..() - -/obj/item/slimecross/chilling/blue - colour = "blue" - effect_desc = "Creates a rebreather, a tankless mask." - -/obj/item/slimecross/chilling/blue/do_effect(mob/user) - user.visible_message("[src] cracks, and spills out a liquid goo, which reforms into a mask!") - new /obj/item/clothing/mask/nobreath(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/metal - colour = "metal" - effect_desc = "Temporarily surrounds the user with unbreakable walls." - -/obj/item/slimecross/chilling/metal/do_effect(mob/user) - user.visible_message("[src] melts like quicksilver, and surrounds [user] in a wall!") - for(var/turf/T in orange(get_turf(user),1)) - if(get_dist(get_turf(user), T) > 0) - new /obj/effect/forcefield/slimewall(T) - ..() - -/obj/item/slimecross/chilling/yellow - colour = "yellow" - effect_desc = "Recharges the room's APC by 50%." - -/obj/item/slimecross/chilling/yellow/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - user.visible_message("[src] shatters, and a the air suddenly feels charged for a moment.") - for(var/obj/machinery/power/apc/C in A) - if(C.cell) - C.cell.charge = min(C.cell.charge + C.cell.maxcharge/2, C.cell.maxcharge) - ..() - -/obj/item/slimecross/chilling/darkpurple - colour = "dark purple" - effect_desc = "Removes all plasma gas in the area." - -/obj/item/slimecross/chilling/darkpurple/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - if(A.outdoors) - to_chat(user, "[src] can't affect such a large area.") - return - var/filtered = FALSE - for(var/turf/open/T in A) - var/datum/gas_mixture/G = T.air - if(istype(G)) - G.set_moles(GAS_PLASMA, 0) - filtered = TRUE - T.air_update_turf() - if(filtered) - user.visible_message("Cracks spread throughout [src], and some air is sucked in!") - else - user.visible_message("[src] cracks, but nothing happens.") - ..() - -/obj/item/slimecross/chilling/darkblue - colour = "dark blue" - effect_desc = "Seals the user in a protective block of ice." - -/obj/item/slimecross/chilling/darkblue/do_effect(mob/user) - if(isliving(user)) - user.visible_message("[src] freezes over [user]'s entire body!") - var/mob/living/M = user - M.apply_status_effect(/datum/status_effect/frozenstasis) - ..() - -/obj/item/slimecross/chilling/silver - colour = "silver" - effect_desc = "Creates several ration packs." - -/obj/item/slimecross/chilling/silver/do_effect(mob/user) - user.visible_message("[src] crumbles into icy powder, leaving behind several emergency food supplies!") - var/amount = rand(5, 10) - for(var/i in 1 to amount) - new /obj/item/reagent_containers/food/snacks/rationpack(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/bluespace - colour = "bluespace" - effect_desc = "Touching people with this extract adds them to a list, when it is activated it teleports everyone on that list to the user." - var/list/allies = list() - var/active = FALSE - -/obj/item/slimecross/chilling/bluespace/afterattack(atom/target, mob/user, proximity) - if(!proximity || !isliving(target) || active) - return - if(target in allies) - allies -= target - to_chat(user, "You unlink [src] with [target].") - else - allies |= target - to_chat(user, "You link [src] with [target].") - return - -/obj/item/slimecross/chilling/bluespace/do_effect(mob/user) - if(allies.len <= 0) - to_chat(user, "[src] is not linked to anyone!") - return - to_chat(user, "You feel [src] pulse as it begins charging bluespace energies...") - active = TRUE - for(var/mob/living/M in allies) - var/datum/status_effect/slimerecall/S = M.apply_status_effect(/datum/status_effect/slimerecall) - S.target = user - if(do_after(user, 100, target=src)) - to_chat(user, "[src] shatters as it tears a hole in reality, snatching the linked individuals from the void!") - for(var/mob/living/M in allies) - var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall) - M.remove_status_effect(S) - else - to_chat(user, "[src] falls dark, dissolving into nothing as the energies fade away.") - for(var/mob/living/M in allies) - var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall) - if(istype(S)) - S.interrupted = TRUE - M.remove_status_effect(S) - ..() - -/obj/item/slimecross/chilling/sepia - colour = "sepia" - effect_desc = "Touching someone with it adds/removes them from a list. Activating the extract stops time for 7 seconds, and everyone on the list is immune, except the user." - var/list/allies = list() - -/obj/item/slimecross/chilling/sepia/afterattack(atom/target, mob/user, proximity) - if(!proximity || !isliving(target)) - return - if(target in allies) - allies -= target - to_chat(user, "You unlink [src] with [target].") - else - allies |= target - to_chat(user, "You link [src] with [target].") - return - -/obj/item/slimecross/chilling/sepia/do_effect(mob/user) - user.visible_message("[src] shatters, freezing time itself!") - allies -= user //support class - new /obj/effect/timestop(get_turf(user), 2, 70, allies) - ..() - -/obj/item/slimecross/chilling/cerulean - colour = "cerulean" - effect_desc = "Creates a flimsy copy of the user, that they control." - -/obj/item/slimecross/chilling/cerulean/do_effect(mob/user) - if(isliving(user)) - user.visible_message("[src] creaks and shifts into a clone of [user]!") - var/mob/living/M = user - M.apply_status_effect(/datum/status_effect/slime_clone) - ..() - -/obj/item/slimecross/chilling/pyrite - colour = "pyrite" - effect_desc = "Creates a pair of Prism Glasses, which allow the wearer to place colored light crystals." - -/obj/item/slimecross/chilling/pyrite/do_effect(mob/user) - user.visible_message("[src] does nothing sorry lol!") - ..() - -/obj/item/slimecross/chilling/red - colour = "red" - effect_desc = "Pacifies every slime in your vacinity." - -/obj/item/slimecross/chilling/red/do_effect(mob/user) - var/slimesfound = FALSE - for(var/mob/living/simple_animal/slime/S in view(get_turf(user), 7)) - slimesfound = TRUE - S.docile = TRUE - if(slimesfound) - user.visible_message("[src] lets out a peaceful ring as it shatters, and nearby slimes seem calm.") - else - user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...") - ..() - -/obj/item/slimecross/chilling/pink - colour = "pink" - effect_desc = "Creates a slime corgi puppy." - -/obj/item/slimecross/chilling/pink/do_effect(mob/user) - user.visible_message("[src] cracks like an egg, and an adorable puppy comes tumbling out!") - new /mob/living/simple_animal/pet/dog/corgi/puppy/slime(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/gold - colour = "gold" - effect_desc = "Produces a golden capture device" - -/obj/item/slimecross/chilling/gold/do_effect(mob/user) - user.visible_message("[src] lets off golden light as it melts and reforms into an egg-like device!") - new /obj/item/capturedevice(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/oil - colour = "oil" - effect_desc = "It creates a weak, but wide-ranged explosion." - -/obj/item/slimecross/chilling/oil/do_effect(mob/user) - user.visible_message("[src] begins to shake with muted intensity!") - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - -/obj/item/slimecross/chilling/oil/proc/boom() - explosion(get_turf(src), -1, -1, 10, 0) //Large radius, but mostly light damage, and no flash. - qdel(src) - -/obj/item/slimecross/chilling/black - colour = "black" - effect_desc = "Does nothing. :)" - -/obj/item/slimecross/chilling/lightpink - colour = "light pink" - effect_desc = "Creates a Heroine Bud, a special flower that pacifies whoever wears it on their head. They will not be able to take it off without help." - -/obj/item/slimecross/chilling/lightpink/do_effect(mob/user) - user.visible_message("[src] blooms into a beautiful flower!") - new /obj/item/clothing/head/peaceflower(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/adamantine - colour = "adamantine" - effect_desc = "Solidifies into a set of adamantine armor." - -/obj/item/slimecross/chilling/adamantine/do_effect(mob/user) - user.visible_message("[src] creaks and breaks as it shifts into a heavy set of armor!") - new /obj/item/clothing/suit/armor/heavy/adamantine(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/rainbow - colour = "rainbow" - effect_desc = "Makes an unpassable wall in every door in the area." - -/obj/item/slimecross/chilling/rainbow/do_effect(mob/user) - var/area/area = get_area(user) - if(area.outdoors) - to_chat(user, "[src] can't affect such a large area.") - return - user.visible_message("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!") - for(var/obj/machinery/door/airlock/door in area) - new /obj/effect/forcefield/slimewall/rainbow(door.loc) - return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm deleted file mode 100644 index f2a162af3aac..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ /dev/null @@ -1,460 +0,0 @@ -/* -Consuming extracts: - Can eat food items. - After consuming enough, produces special cookies. -*/ -/obj/item/slimecross/consuming - name = "consuming extract" - desc = "It hungers... for more." //My slimecross has finally decided to eat... my buffet! - icon_state = "consuming" - effect = "consuming" - var/nutriment_eaten = 0 - var/nutriment_required = 10 - var/cooldown = 600 //1 minute. - var/last_produced = 0 - var/cookies = 5 //Number of cookies to spawn - var/cookietype = /obj/item/slime_cookie - -/obj/item/slimecross/consuming/attackby(obj/item/O, mob/user) - if(istype(O,/obj/item/reagent_containers/food/snacks)) - if(last_produced + cooldown > world.time) - to_chat(user, "[src] is still digesting after its last meal!") - return - var/datum/reagent/N = O.reagents.has_reagent(/datum/reagent/consumable/nutriment) - if(N) - nutriment_eaten += N.volume - to_chat(user, "[src] opens up and swallows [O] whole!") - qdel(O) - playsound(src, 'sound/items/eatfood.ogg', 20, TRUE) - else - to_chat(user, "[src] burbles unhappily at the offering.") - if(nutriment_eaten >= nutriment_required) - nutriment_eaten = 0 - user.visible_message("[src] swells up and produces a small pile of cookies!") - playsound(src, 'sound/effects/splat.ogg', 40, TRUE) - last_produced = world.time - for(var/i in 1 to cookies) - var/obj/item/S = spawncookie() - S.pixel_x = base_pixel_x + rand(-5, 5) - S.pixel_y = base_pixel_y + rand(-5, 5) - return - ..() - -/obj/item/slimecross/consuming/proc/spawncookie() - return new cookietype(get_turf(src)) - -/obj/item/slime_cookie //While this technically acts like food, it's so removed from it that I made it its' own type. - name = "error cookie" - desc = "A weird slime cookie. You shouldn't see this." - icon = 'icons/obj/food/slimecookies.dmi' - var/taste = "error" - var/nutrition = 5 - icon_state = "base" - force = 0 - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - throw_speed = 3 - throw_range = 6 - -/obj/item/slime_cookie/proc/do_effect(mob/living/M, mob/user) - return - -/obj/item/slime_cookie/attack(mob/living/M, mob/user) - var/fed = FALSE - if(M == user) - M.visible_message("[user] eats [src]!", "You eat [src].") - fed = TRUE - else - M.visible_message("[user] tries to force [M] to eat [src]!", "[user] tries to force you to eat [src]!") - if(do_after(user, 20, target = M)) - fed = TRUE - M.visible_message("[user] forces [M] to eat [src]!", "[user] forces you to eat [src].") - if(fed) - var/mob/living/carbon/human/H = M - - if(!istype(H) || !HAS_TRAIT(H, TRAIT_AGEUSIA)) - to_chat(M, "Tastes like [taste].") - playsound(get_turf(M), 'sound/items/eatfood.ogg', 20, TRUE) - if(nutrition) - M.reagents.add_reagent(/datum/reagent/consumable/nutriment,nutrition) - do_effect(M, user) - qdel(src) - return - ..() - -/obj/item/slimecross/consuming/grey - colour = "grey" - effect_desc = "Creates a slime cookie." - cookietype = /obj/item/slime_cookie/grey - -/obj/item/slime_cookie/grey - name = "slime cookie" - desc = "A grey-ish transparent cookie. Nutritious, probably." - icon_state = "grey" - taste = "goo" - nutrition = 15 - -/obj/item/slimecross/consuming/orange - colour = "orange" - effect_desc = "Creates a slime cookie that heats the target up and grants cold immunity for a short time." - cookietype = /obj/item/slime_cookie/orange - -/obj/item/slime_cookie/orange - name = "fiery cookie" - desc = "A orange cookie with a fiery pattern. Feels warm." - icon_state = "orange" - taste = "cinnamon and burning" - -/obj/item/slime_cookie/orange/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/firecookie) - -/obj/item/slimecross/consuming/purple - colour = "purple" - effect_desc = "Creates a slime cookie that heals the target from every type of damage." - cookietype = /obj/item/slime_cookie/purple - -/obj/item/slime_cookie/purple - name = "health cookie" - desc = "A purple cookie with a cross pattern. Soothing." - icon_state = "purple" - taste = "fruit jam and cough medicine" - -/obj/item/slime_cookie/purple/do_effect(mob/living/M, mob/user) - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - M.adjustToxLoss(-5, forced=1) //To heal slimepeople. - M.adjustOxyLoss(-5) - M.adjustCloneLoss(-5) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) - -/obj/item/slimecross/consuming/blue - colour = "blue" - effect_desc = "Creates a slime cookie that wets the floor around you and makes you immune to water based slipping for a short time." - cookietype = /obj/item/slime_cookie/blue - -/obj/item/slime_cookie/blue - name = "water cookie" - desc = "A transparent blue cookie. Constantly dripping wet." - icon_state = "blue" - taste = /datum/reagent/water - -/obj/item/slime_cookie/blue/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/watercookie) - -/obj/item/slimecross/consuming/metal - colour = "metal" - effect_desc = "Creates a slime cookie that increases the target's resistance to brute damage." - cookietype = /obj/item/slime_cookie/metal - -/obj/item/slime_cookie/metal - name = "metallic cookie" - desc = "A shiny grey cookie. Hard to the touch." - icon_state = "metal" - taste = /datum/reagent/copper - -/obj/item/slime_cookie/metal/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/metalcookie) - -/obj/item/slimecross/consuming/yellow - colour = "yellow" - effect_desc = "Creates a slime cookie that makes the target immune to electricity for a short time." - cookietype = /obj/item/slime_cookie/yellow - -/obj/item/slime_cookie/yellow - name = "sparking cookie" - desc = "A yellow cookie with a lightning pattern. Has a rubbery texture." - icon_state = "yellow" - taste = "lemon cake and rubber gloves" - -/obj/item/slime_cookie/yellow/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/sparkcookie) - -/obj/item/slimecross/consuming/darkpurple - colour = "dark purple" - effect_desc = "Creates a slime cookie that reverses how the target's body treats toxins." - cookietype = /obj/item/slime_cookie/darkpurple - -/obj/item/slime_cookie/darkpurple - name = "toxic cookie" - desc = "A dark purple cookie, stinking of plasma." - icon_state = "darkpurple" - taste = "slime jelly and toxins" - -/obj/item/slime_cookie/darkpurple/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/toxincookie) - -/obj/item/slimecross/consuming/darkblue - colour = "dark blue" - effect_desc = "Creates a slime cookie that chills the target and extinguishes them." - cookietype = /obj/item/slime_cookie/darkblue - -/obj/item/slime_cookie/darkblue - name = "frosty cookie" - desc = "A dark blue cookie with a snowflake pattern. Feels cold." - icon_state = "darkblue" - taste = "mint and bitter cold" - -/obj/item/slime_cookie/darkblue/do_effect(mob/living/M, mob/user) - M.adjust_bodytemperature(-110) - M.ExtinguishMob() - -/obj/item/slimecross/consuming/silver - colour = "silver" - effect_desc = "Creates a slime cookie that never gets the target fat." - cookietype = /obj/item/slime_cookie/silver - -/obj/item/slime_cookie/silver - name = "waybread cookie" - desc = "A warm, crispy cookie, sparkling silver in the light. Smells wonderful." - icon_state = "silver" - taste = "masterful elven baking" - nutrition = 0 //We don't want normal nutriment - -/obj/item/slime_cookie/silver/do_effect(mob/living/M, mob/user) - M.reagents.add_reagent(/datum/reagent/consumable/nutriment/stabilized,10) - -/obj/item/slimecross/consuming/bluespace - colour = "bluespace" - effect_desc = "Creates a slime cookie that teleports the target to a random place in the area." - cookietype = /obj/item/slime_cookie/bluespace - -/obj/item/slime_cookie/bluespace - name = "space cookie" - desc = "A white cookie with green icing. Surprisingly hard to hold." - icon_state = "bluespace" - taste = "sugar and starlight" - -/obj/item/slime_cookie/bluespace/do_effect(mob/living/M, mob/user) - var/list/L = get_area_turfs(get_area(M)) - var/turf/target - while (L.len && !target) - var/I = rand(1, L.len) - var/turf/T = L[I] - if (is_centcom_level(T)) - L.Cut(I,I+1) - continue - if(!T.density) - var/clear = TRUE - for(var/obj/O in T) - if(O.density) - clear = FALSE - break - if(clear) - target = T - if (!target) - L.Cut(I,I+1) - - if(target) - do_teleport(M, target, 0, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - new /obj/effect/particle_effect/sparks(get_turf(M)) - playsound(get_turf(M), "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - -/obj/item/slimecross/consuming/sepia - colour = "sepia" - effect_desc = "Creates a slime cookie that makes the target do things slightly faster." - cookietype = /obj/item/slime_cookie/sepia - -/obj/item/slime_cookie/sepia - name = "time cookie" - desc = "A light brown cookie with a clock pattern. Takes some time to chew." - icon_state = "sepia" - taste = "brown sugar and a metronome" - -/obj/item/slime_cookie/sepia/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/timecookie) - -/obj/item/slimecross/consuming/cerulean - colour = "cerulean" - effect_desc = "Creates a slime cookie that has a chance to make another once you eat it." - cookietype = /obj/item/slime_cookie/cerulean - cookies = 3 //You're gonna get more. - -/obj/item/slime_cookie/cerulean - name = "duplicookie" - desc = "A cerulean cookie with strange proportions. It feels like it could break apart easily." - icon_state = "cerulean" - taste = "a sugar cookie" - -/obj/item/slime_cookie/cerulean/do_effect(mob/living/M, mob/user) - if(prob(50)) - to_chat(M, "A piece of [src] breaks off while you chew, and falls to the ground.") - var/obj/item/slime_cookie/cerulean/C = new(get_turf(M)) - C.taste = taste + " and a sugar cookie" - -/obj/item/slimecross/consuming/pyrite - colour = "pyrite" - effect_desc = "Creates a slime cookie that randomly colors the target." - cookietype = /obj/item/slime_cookie/pyrite - -/obj/item/slime_cookie/pyrite - name = "color cookie" - desc = "A yellow cookie with rainbow-colored icing. Reflects the light strangely." - icon_state = "pyrite" - taste = "vanilla and " //Randomly selected color dye. - var/colour = "#FFFFFF" - -/obj/item/slime_cookie/pyrite/Initialize() - . = ..() - var/tastemessage = "paint remover" - switch(rand(1,7)) - if(1) - tastemessage = "red dye" - colour = "#FF0000" - if(2) - tastemessage = "orange dye" - colour = "#FFA500" - if(3) - tastemessage = "yellow dye" - colour = "#FFFF00" - if(4) - tastemessage = "green dye" - colour = "#00FF00" - if(5) - tastemessage = "blue dye" - colour = "#0000FF" - if(6) - tastemessage = "indigo dye" - colour = "#4B0082" - if(7) - tastemessage = "violet dye" - colour = "#FF00FF" - taste += tastemessage - -/obj/item/slime_cookie/pyrite/do_effect(mob/living/M, mob/user) - M.add_atom_colour(colour,WASHABLE_COLOUR_PRIORITY) - -/obj/item/slimecross/consuming/red - colour = "red" - effect_desc = "Creates a slime cookie that creates a spatter of blood on the floor, while also restoring some of the target's blood." - cookietype = /obj/item/slime_cookie/red - -/obj/item/slime_cookie/red - name = "blood cookie" - desc = "A red cookie, oozing a thick red fluid. Vampires might enjoy it." - icon_state = "red" - taste = "red velvet and iron" - -/obj/item/slime_cookie/red/do_effect(mob/living/M, mob/user) - new /obj/effect/decal/cleanable/blood(get_turf(M)) - playsound(get_turf(M), 'sound/effects/splat.ogg', 10, TRUE) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.blood_volume += 25 //Half a vampire drain. - -/obj/item/slimecross/consuming/green - colour = "green" - effect_desc = "Creates a slime cookie that is absolutely disgusting, makes the target vomit, however all reagent in their body are also removed." - cookietype = /obj/item/slime_cookie/green - -/obj/item/slime_cookie/green - name = "gross cookie" - desc = "A disgusting green cookie, seeping with pus. You kind of feel ill just looking at it." - icon_state = "green" - taste = "the contents of your stomach" - -/obj/item/slime_cookie/green/do_effect(mob/living/M, mob/user) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.vomit(25) - M.reagents.remove_all() - -/obj/item/slimecross/consuming/pink - colour = "pink" - effect_desc = "Creates a slime cookie that makes the target want to spread the love." - cookietype = /obj/item/slime_cookie/pink - -/obj/item/slime_cookie/pink - name = "love cookie" - desc = "A pink cookie with an icing heart. D'aww." - icon_state = "pink" - taste = "love and hugs" - -/obj/item/slime_cookie/pink/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/lovecookie) - -/obj/item/slimecross/consuming/gold - colour = "gold" - effect_desc = "Creates a slime cookie that has a gold coin inside." - cookietype = /obj/item/slime_cookie/gold - -/obj/item/slime_cookie/gold - name = "gilded cookie" - desc = "A buttery golden cookie, closer to a bread than anything. May good fortune find you." - icon_state = "gold" - taste = "sweet cornbread and wealth" - -/obj/item/slime_cookie/gold/do_effect(mob/living/M, mob/user) - var/obj/item/held = M.get_active_held_item() //This should be itself, but just in case... - M.dropItemToGround(held) - var/newcoin = /obj/item/coin/gold - var/obj/item/coin/C = new newcoin(get_turf(M)) - playsound(get_turf(C), 'sound/items/coinflip.ogg', 50, TRUE) - M.put_in_hand(C) - -/obj/item/slimecross/consuming/oil - colour = "oil" - effect_desc = "Creates a slime cookie that slows anyone next to the user." - cookietype = /obj/item/slime_cookie/oil - -/obj/item/slime_cookie/oil - name = "tar cookie" - desc = "An oily black cookie, which sticks to your hands. Smells like chocolate." - icon_state = "oil" - taste = "rich molten chocolate and tar" - -/obj/item/slime_cookie/oil/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/tarcookie) - -/obj/item/slimecross/consuming/black - colour = "black" - effect_desc = "Creates a slime cookie that makes the target look like a spooky skeleton for a little bit." - cookietype = /obj/item/slime_cookie/black - -/obj/item/slime_cookie/black - name = "spooky cookie" - desc = "A pitch black cookie with an icing ghost on the front. Spooky!" - icon_state = "black" - taste = "ghosts and stuff" - -/obj/item/slime_cookie/black/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/spookcookie) - -/obj/item/slimecross/consuming/lightpink - colour = "light pink" - effect_desc = "Creates a slime cookie that makes the target, and anyone next to the target, pacifistic for a small amount of time." - cookietype = /obj/item/slime_cookie/lightpink - -/obj/item/slime_cookie/lightpink - name = "peace cookie" - desc = "A light pink cookie with a peace symbol in the icing. Lovely!" - icon_state = "lightpink" - taste = "strawberry icing and P.L.U.R" //Literal candy raver. - -/obj/item/slime_cookie/lightpink/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/peacecookie) - -/obj/item/slimecross/consuming/adamantine - colour = "adamantine" - effect_desc = "Creates a slime cookie that increases the target's resistance to burn damage." - cookietype = /obj/item/slime_cookie/adamantine - -/obj/item/slime_cookie/adamantine - name = "crystal cookie" - desc = "A translucent rock candy in the shape of a cookie. Surprisingly chewy." - icon_state = "adamantine" - taste = "crystalline sugar and metal" - -/obj/item/slime_cookie/adamantine/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/adamantinecookie) - -/obj/item/slimecross/consuming/rainbow - colour = "rainbow" - effect_desc = "Creates a slime cookie that has the effect of a random cookie." - -/obj/item/slimecross/consuming/rainbow/spawncookie() - var/cookie_type = pick(subtypesof(/obj/item/slime_cookie)) - var/obj/item/slime_cookie/S = new cookie_type(get_turf(src)) - S.name = "rainbow cookie" - S.desc = "A beautiful rainbow cookie, constantly shifting colors in the light." - S.icon_state = "rainbow" - return S diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm deleted file mode 100644 index da9387883f0c..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ /dev/null @@ -1,199 +0,0 @@ -/* -Industrial extracts: - Slowly consume plasma, produce items with it. -*/ -/obj/item/slimecross/industrial - name = "industrial extract" - desc = "A gel-like, sturdy extract, fond of plasma and industry." - effect = "industrial" - icon_state = "industrial_still" - var/plasmarequired = 2 //Units of plasma required to be consumed to produce item. - var/itempath = /obj/item //The item produced by the extract. - var/plasmaabsorbed = 0 //Units of plasma aborbed by the extract already. Absorbs at a rate of 2u/obj tick. - var/itemamount = 1 //How many items to spawn - -/obj/item/slimecross/industrial/examine(mob/user) - . = ..() - . += "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units." - -/obj/item/slimecross/industrial/proc/do_after_spawn(obj/item/spawned) - return - -/obj/item/slimecross/industrial/Initialize() - . = ..() - create_reagents(100, INJECTABLE | DRAWABLE) - START_PROCESSING(SSobj,src) - -/obj/item/slimecross/industrial/Destroy() - STOP_PROCESSING(SSobj,src) - return ..() - -/obj/item/slimecross/industrial/process() - var/IsWorking = FALSE - if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 2) && plasmarequired > 1) //Can absorb as much as 2 - IsWorking = TRUE - reagents.remove_reagent(/datum/reagent/toxin/plasma,2) - plasmaabsorbed += 2 - else if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 1)) //Can absorb as little as 1 - IsWorking = TRUE - reagents.remove_reagent(/datum/reagent/toxin/plasma,1) - plasmaabsorbed += 1 - - if(plasmaabsorbed >= plasmarequired) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - plasmaabsorbed -= plasmarequired - for(var/i = 0, i < itemamount, i++) - do_after_spawn(new itempath(get_turf(src))) - else if(IsWorking) - playsound(src, 'sound/effects/bubbles.ogg', 5, TRUE) - if(IsWorking) - icon_state = "industrial" - else - icon_state = "industrial_still" - -/obj/item/slimecross/industrial/grey - colour = "grey" - effect_desc = "Produces monkey cubes." - itempath = /obj/item/reagent_containers/food/snacks/monkeycube - itemamount = 5 - -/obj/item/slimecross/industrial/orange - colour = "orange" - effect_desc = "Produces slime zippo lighters." - plasmarequired = 6 - itempath = /obj/item/lighter/slime - -/obj/item/slimecross/industrial/purple - colour = "purple" - effect_desc = "Produces autoinjectors with regen jelly inside." - plasmarequired = 5 - itempath = /obj/item/slimecrossbeaker/autoinjector/regenpack - -/obj/item/slimecross/industrial/blue - colour = "blue" - effect_desc = "Produces full fire extinguishers." - plasmarequired = 10 - itempath = /obj/item/extinguisher - -/obj/item/slimecross/industrial/metal - colour = "metal" - effect_desc = "Produces metal sheets." - plasmarequired = 3 - itempath = /obj/item/stack/sheet/metal/ten - -/obj/item/slimecross/industrial/yellow - colour = "yellow" - effect_desc = "Produces high capacity power cells, which are not fully charged on creation." - plasmarequired = 5 - itempath = /obj/item/stock_parts/cell/high - -/obj/item/slimecross/industrial/yellow/do_after_spawn(obj/item/spawned) - var/obj/item/stock_parts/cell/high/C = spawned - if(istype(C)) - C.charge = rand(0,C.maxcharge/2) - -/obj/item/slimecross/industrial/darkpurple - colour = "dark purple" - effect_desc = "Produces plasma... for plasma." - plasmarequired = 10 - itempath = /obj/item/stack/sheet/mineral/plasma - -/obj/item/slimecross/industrial/darkblue - colour = "dark blue" - effect_desc = "Produces one-use fireproofing potions." - plasmarequired = 6 - itempath = /obj/item/slimepotion/fireproof - -/obj/item/slimecross/industrial/darkblue/do_after_spawn(obj/item/spawned) - var/obj/item/slimepotion/fireproof/potion = spawned - if(istype(potion)) - potion.uses = 1 - -/obj/item/slimecross/industrial/silver - colour = "silver" - effect_desc = "Produces random food and drink items." - plasmarequired = 1 - //Item picked below. - -/obj/item/slimecross/industrial/silver/process() - itempath = pick(list(get_random_food(), get_random_drink())) - ..() - -/obj/item/slimecross/industrial/bluespace - colour = "bluespace" - effect_desc = "Produces synthetic bluespace crystals." - plasmarequired = 7 - itempath = /obj/item/stack/ore/bluespace_crystal/artificial - -/obj/item/slimecross/industrial/sepia - colour = "sepia" - effect_desc = "Produces cameras." - plasmarequired = 2 - itempath = /obj/item/camera - -/obj/item/slimecross/industrial/cerulean - colour = "cerulean" - effect_desc = "Produces normal slime extract enhancers." - plasmarequired = 5 - itempath = /obj/item/slimepotion/enhancer - -/obj/item/slimecross/industrial/pyrite - colour = "pyrite" - effect_desc = "Produces cans of spraypaint." - plasmarequired = 2 - itempath = /obj/item/toy/crayon/spraycan - -/obj/item/slimecross/industrial/red - colour = "red" - effect_desc = "Produces blood orbs." - plasmarequired = 5 - itempath = /obj/item/slimecrossbeaker/bloodpack - -/obj/item/slimecross/industrial/green - colour = "green" - effect_desc = "Produces self-use-only slime jelly autoinjectors." - plasmarequired = 7 - itempath = /obj/item/slimecrossbeaker/autoinjector/slimejelly - -/obj/item/slimecross/industrial/pink - colour = "pink" - effect_desc = "Produces synthpax and space drug autoinjectors." - plasmarequired = 6 - itempath = /obj/item/slimecrossbeaker/autoinjector/peaceandlove - -/obj/item/slimecross/industrial/gold - colour = "gold" - effect_desc = "Produces random coins." - plasmarequired = 10 - -/obj/item/slimecross/industrial/gold/process() - itempath = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) - ..() - -/obj/item/slimecross/industrial/oil - colour = "oil" - effect_desc = "Produces IEDs." - plasmarequired = 4 - itempath = /obj/item/grenade/iedcasing/spawned - -/obj/item/slimecross/industrial/black //What does this have to do with black slimes? No clue! Fun, though - colour = "black" - effect_desc = "Produces slime brand regenerative cigarettes." - plasmarequired = 6 - itempath = /obj/item/storage/fancy/cigarettes/cigpack_xeno - -/obj/item/slimecross/industrial/lightpink - colour = "light pink" - effect_desc = "Produces heart shaped boxes that have candies in them." - plasmarequired = 3 - itempath = /obj/item/storage/fancy/heart_box - -/obj/item/slimecross/industrial/rainbow - colour = "rainbow" - effect_desc = "Produces random slime extracts." - plasmarequired = 5 - //Item picked below. - -/obj/item/slimecross/industrial/rainbow/process() - itempath = pick(subtypesof(/obj/item/slime_extract)) - ..() diff --git a/code/modules/research/xenobiology/crossbreeding/mutative.dm b/code/modules/research/xenobiology/crossbreeding/mutative.dm deleted file mode 100644 index 043e124641ab..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/mutative.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/item/slimecross/mutative - name = "mutative extract" - desc = "It's softly pulsing with mutagenic energy." - effect = "mutative" - icon_state = "mutative" - -/obj/item/slimecross/mutative/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/mutative/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/magic/fireball.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/mutative/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/mutative/rainbow - colour = "rainbow" - effect_desc = "Hardens into a shard of slimy crystal. Prick yourself with it to bring forth a Slime Guardian." diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm deleted file mode 100644 index 9cfc4542d526..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ /dev/null @@ -1,124 +0,0 @@ -/* -Prismatic extracts: - Becomes an infinite-use paintbrush. -*/ -/obj/item/slimecross/prismatic - name = "prismatic extract" - desc = "It's constantly wet with a semi-transparent, colored goo." - effect = "prismatic" - effect_desc = "When used it paints whatever it hits." - icon_state = "prismatic" - var/paintcolor = "#FFFFFF" - -/obj/item/slimecross/prismatic/afterattack(turf/target, mob/user, proximity) - if(!proximity) - return - if(!istype(target) || isspaceturf(target)) - return - target.add_atom_colour(paintcolor, WASHABLE_COLOUR_PRIORITY) - playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) - -/obj/item/slimecross/prismatic/grey/ - colour = "grey" - desc = "It's constantly wet with a pungent-smelling, clear chemical." - -/obj/item/slimecross/prismatic/grey/afterattack(turf/target, mob/user, proximity) - . = ..() - if(!proximity) - return - if(istype(target) && target.color != initial(target.color)) - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) - -/obj/item/slimecross/prismatic/orange - paintcolor = "#FFA500" - colour = "orange" - -/obj/item/slimecross/prismatic/purple - paintcolor = "#B19CD9" - colour = "purple" - -/obj/item/slimecross/prismatic/blue - paintcolor = "#ADD8E6" - colour = "blue" - -/obj/item/slimecross/prismatic/metal - paintcolor = "#7E7E7E" - colour = "metal" - -/obj/item/slimecross/prismatic/yellow - paintcolor = "#FFFF00" - colour = "yellow" - -/obj/item/slimecross/prismatic/darkpurple - paintcolor = "#551A8B" - colour = "dark purple" - -/obj/item/slimecross/prismatic/darkblue - paintcolor = "#0000FF" - colour = "dark blue" - -/obj/item/slimecross/prismatic/silver - paintcolor = "#D3D3D3" - colour = "silver" - -/obj/item/slimecross/prismatic/bluespace - paintcolor = "#32CD32" - colour = "bluespace" - -/obj/item/slimecross/prismatic/sepia - paintcolor = "#704214" - colour = "sepia" - -/obj/item/slimecross/prismatic/cerulean - paintcolor = "#2956B2" - colour = "cerulean" - -/obj/item/slimecross/prismatic/pyrite - paintcolor = "#FAFAD2" - colour = "pyrite" - -/obj/item/slimecross/prismatic/red - paintcolor = "#FF0000" - colour = "red" - -/obj/item/slimecross/prismatic/green - paintcolor = "#00FF00" - colour = "green" - -/obj/item/slimecross/prismatic/pink - paintcolor = "#FF69B4" - colour = "pink" - -/obj/item/slimecross/prismatic/gold - paintcolor = "#FFD700" - colour = "gold" - -/obj/item/slimecross/prismatic/oil - paintcolor = "#505050" - colour = "oil" - -/obj/item/slimecross/prismatic/black - paintcolor = "#000000" - colour = "black" - -/obj/item/slimecross/prismatic/lightpink - paintcolor = "#FFB6C1" - colour = "light pink" - -/obj/item/slimecross/prismatic/adamantine - paintcolor = "#008B8B" - colour = "adamantine" - -/obj/item/slimecross/prismatic/rainbow - paintcolor = "#FFFFFF" - colour = "rainbow" - -/obj/item/slimecross/prismatic/rainbow/attack_self(mob/user) - var/newcolor = input(user, "Choose the slime color:", "Color change",paintcolor) as color|null - if(user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - return - if(!newcolor) - return - paintcolor = newcolor - return diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm deleted file mode 100644 index 4a094744f7f8..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ /dev/null @@ -1,138 +0,0 @@ -/* -Recurring extracts: - Generates a new charge every few seconds. - If depleted of its' last charge, stops working. -*/ -/obj/item/slimecross/recurring - name = "recurring extract" - desc = "A tiny, glowing core, wrapped in several layers of goo." - effect = "recurring" - icon_state = "recurring" - var/extract_type - var/obj/item/slime_extract/extract - var/cooldown = 0 - var/max_cooldown = 5 //In sets of 2 seconds. - -/obj/item/slimecross/recurring/Initialize() - . = ..() - extract = new extract_type(src.loc) - visible_message("[src] wraps a layer of goo around itself!") - extract.name = name - extract.desc = desc - extract.icon = icon - extract.icon_state = icon_state - extract.color = color - extract.recurring = TRUE - src.forceMove(extract) - START_PROCESSING(SSobj,src) - -/obj/item/slimecross/recurring/process() - if(cooldown > 0) - cooldown-- - else if(extract.Uses < 10 && extract.Uses > 0) - extract.Uses++ - cooldown = max_cooldown - else if(extract.Uses <= 0) - extract.visible_message("The light inside [extract] flickers and dies out.") - extract.desc = "A tiny, inert core, bleeding dark, cerulean-colored goo." - extract.icon_state = "prismatic" - qdel(src) - -/obj/item/slimecross/recurring/Destroy() - . = ..() - STOP_PROCESSING(SSobj,src) - -/obj/item/slimecross/recurring/grey - extract_type = /obj/item/slime_extract/grey - colour = "grey" - -/obj/item/slimecross/recurring/orange - extract_type = /obj/item/slime_extract/orange - colour = "orange" - -/obj/item/slimecross/recurring/purple - extract_type = /obj/item/slime_extract/purple - colour = "purple" - -/obj/item/slimecross/recurring/blue - extract_type = /obj/item/slime_extract/blue - colour = "blue" - -/obj/item/slimecross/recurring/metal - extract_type = /obj/item/slime_extract/metal - colour = "metal" - max_cooldown = 10 - -/obj/item/slimecross/recurring/yellow - extract_type = /obj/item/slime_extract/yellow - colour = "yellow" - max_cooldown = 10 - -/obj/item/slimecross/recurring/darkpurple - extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" - max_cooldown = 10 - -/obj/item/slimecross/recurring/darkblue - extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" - -/obj/item/slimecross/recurring/silver - extract_type = /obj/item/slime_extract/silver - colour = "silver" - -/obj/item/slimecross/recurring/bluespace - extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" - -/obj/item/slimecross/recurring/sepia - extract_type = /obj/item/slime_extract/sepia - colour = "sepia" - max_cooldown = 18 //No infinite timestop for you! - -/obj/item/slimecross/recurring/cerulean - extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" - -/obj/item/slimecross/recurring/pyrite - extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" - -/obj/item/slimecross/recurring/red - extract_type = /obj/item/slime_extract/red - colour = "red" - -/obj/item/slimecross/recurring/green - extract_type = /obj/item/slime_extract/green - colour = "green" - -/obj/item/slimecross/recurring/pink - extract_type = /obj/item/slime_extract/pink - colour = "pink" - -/obj/item/slimecross/recurring/gold - extract_type = /obj/item/slime_extract/gold - colour = "gold" - max_cooldown = 15 - -/obj/item/slimecross/recurring/oil - extract_type = /obj/item/slime_extract/oil - colour = "oil" //Why would you want this? - -/obj/item/slimecross/recurring/black - extract_type = /obj/item/slime_extract/black - colour = "black" - -/obj/item/slimecross/recurring/lightpink - extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" - -/obj/item/slimecross/recurring/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - max_cooldown = 10 - -/obj/item/slimecross/recurring/rainbow - extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" - max_cooldown = 20 //It's pretty powerful. diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm deleted file mode 100644 index 75a1201d924a..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ /dev/null @@ -1,354 +0,0 @@ -/* -Regenerative extracts: - Work like a legion regenerative core. - Has a unique additional effect. -*/ -/obj/item/slimecross/regenerative - name = "regenerative extract" - desc = "It's filled with a milky substance, and pulses like a heartbeat." - effect = "regenerative" - icon_state = "regenerative" - - var/oxy_loss = 0 - var/tox_loss = 0 - var/fire_loss = 0 - var/brute_loss = 0 - var/stamina_loss = 0 - var/blood_loss = 100 - var/organ_loss = 3 - var/slime_heal_modifier = 1 //Specialised types only heal half - var/jelly_amount = 7.5 - var/bone_loss = FALSE - var/life_loss = FALSE - var/slime_delay = 10 - -/obj/item/slimecross/regenerative/proc/core_effect(mob/living/carbon/human/target, mob/user) - return -/obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user) - return - -/obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox) - . = ..() - if(!prox || !isliving(target)) - return - var/mob/living/H = target - if(H.stat == DEAD && life_loss) - slime_delay = 200 //Reviving the dead takes a while, 20 seconds to be exact - to_chat(user, "You begin using the [src] to try and bring [H] back from the dead...") - else - slime_delay = 10 - if(H.stat == DEAD && !life_loss) // Won't revive the dead, except for specific extracts - to_chat(user, "[src] will not work on the dead!") - return - if(H != user) - if(!do_after(user, slime_delay, H)) // 1 second delay - return FALSE - user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating some of [H.p_their()] injuries!", - "You squeeze the [src], and it bursts over [H], the milky goo regenerating some of [H.p_their()] injuries.") - else - if(!do_after(user, (slime_delay * 1.5), H)) // 1.5 second delay - return FALSE - user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating some of [user.p_their()] injuries!", - "You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates some of your injuries!") -// Slimes are good at healing clone damage, but don't heal other damage types as much. Additionally heals 15 organ damage. - core_effect_before(H, user) // can affect heal multiplier - oxy_loss = (12.5 + (H.getOxyLoss() * 0.4 * slime_heal_modifier)) - tox_loss = (12.5 + (H.getToxLoss() * 0.4 * slime_heal_modifier)) - fire_loss = (12.5 + (H.getFireLoss() * 0.4 * slime_heal_modifier)) - brute_loss = (12.5 + (H.getBruteLoss() * 0.4 * slime_heal_modifier)) - stamina_loss = (12.5 + (H.getStaminaLoss() * 0.5 * slime_heal_modifier)) - core_effect(H, user) // can affect specific healing values - H.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,jelly_amount) // Splits the healing effect across an instant heal, and a smaller heal after. - H.specific_heal(brute_amt = brute_loss, fire_amt = fire_loss, tox_amt = tox_loss, oxy_amt = oxy_loss, stam_amt = stamina_loss, organ_amt = organ_loss, clone_amt = 100, blood_amt = blood_loss, specific_bones = bone_loss, specific_revive = life_loss) - playsound(target, 'sound/effects/splat.ogg', 40, TRUE) - qdel(src) - -/obj/item/slimecross/regenerative/grey - colour = "grey" //Has no bonus effect. - effect_desc = "Partially heals the target and does nothing else." - -/obj/item/slimecross/regenerative/orange - colour = "orange" - -/obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) - target.visible_message("The [src] boils over!") - for(var/turf/turf in range(1,target)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) - -/obj/item/slimecross/regenerative/purple - colour = "purple" - effect_desc = "Weakly heals the target, but treats toxin damage especially well. Additionally injects them with some additional regen jelly." - -/obj/item/slimecross/regenerative/purple/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.75 - -/obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) - tox_loss = (10 + (target.getBruteLoss() * 0.8)) - jelly_amount += 10 - -/obj/item/slimecross/regenerative/blue - colour = "blue" - effect_desc = "Weakly heals the target, but extra effective at treating burns. Additionally makes the floor wet." - -/obj/item/slimecross/regenerative/blue/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user) - if(isturf(target.loc)) - var/turf/open/T = get_turf(target) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) - target.visible_message("The milky goo in the extract gets all over the floor!") - fire_loss = (10 + (target.getFireLoss() * 0.8)) - jelly_amount *= 0.2 - -/obj/item/slimecross/regenerative/metal - colour = "metal" - effect_desc = "Barely heals the target, but fixes their bones .Additionally encases the target in a locker." - -/obj/item/slimecross/regenerative/metal/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.1 - -/obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user) - target.visible_message("The milky goo hardens and reshapes itself, encasing [target]!") - var/obj/structure/closet/C = new /obj/structure/closet(target.loc) - C.name = "slimy closet" - C.desc = "Looking closer, it seems to be made of a sort of solid, opaque, metal-like goo." - target.forceMove(C) - bone_loss = TRUE - jelly_amount *= 0.2 - -/obj/item/slimecross/regenerative/yellow - colour = "yellow" - effect_desc = "Partially heals the target, can revive the dead. additionally Partially recharges a single item on the target." - life_loss = TRUE //Will revive the dead. Heals normally unless target is dead, in which case it heals less. - -/obj/item/slimecross/regenerative/yellow/core_effect_before(mob/living/target, mob/user) - if(target.stat == DEAD) - slime_heal_modifier = 0.1 //use surgery to fix wounds - else - slime_heal_modifier = 0.75 //discourages spamming these to revive a target, combine with other cores - -/obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) - var/list/batteries = list() - for(var/obj/item/stock_parts/cell/C in target.GetAllContents()) - if(C.charge < C.maxcharge) - batteries += C - if(batteries.len) - var/obj/item/stock_parts/cell/ToCharge = pick(batteries) - ToCharge.charge = ToCharge.maxcharge - to_chat(target, "You feel a strange electrical pulse, and one of your electrical items was recharged.") - if(target.stat == DEAD) - blood_loss = 100 - organ_loss = 30 // More effective at fixing organs if the target is dead - jelly_amount *= 0.2 - target.visible_message("The [src] sparks as it tries to revive [target]!") - -/obj/item/slimecross/regenerative/darkpurple - colour = "dark purple" - effect_desc = "Partially heals the target and gives them purple clothing if they are naked." - -/obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) - var/equipped = 0 - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), ITEM_SLOT_FEET) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), ITEM_SLOT_ICLOTHING) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), ITEM_SLOT_GLOVES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), ITEM_SLOT_HEAD) - if(equipped > 0) - target.visible_message("The milky goo congeals into clothing!") - -/obj/item/slimecross/regenerative/darkblue - colour = "dark blue" - effect_desc = "Partially heals the target and fireproofs their clothes." - -/obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user) - if(!ishuman(target)) - return - var/mob/living/carbon/human/H = target - var/fireproofed = FALSE - if(H.get_item_by_slot(ITEM_SLOT_OCLOTHING)) - fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) - fireproof(C) - if(H.get_item_by_slot(ITEM_SLOT_HEAD)) - fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_HEAD) - fireproof(C) - if(fireproofed) - target.visible_message("Some of [target]'s clothing gets coated in the goo, and turns blue!") - -/obj/item/slimecross/regenerative/darkblue/proc/fireproof(obj/item/clothing/C) - C.name = "fireproofed [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) - C.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - C.heat_protection = C.body_parts_covered - C.resistance_flags |= FIRE_PROOF - -/obj/item/slimecross/regenerative/silver - colour = "silver" - effect_desc = "Partially heals the target and makes their belly feel round and full." - -/obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) - target.set_nutrition(NUTRITION_LEVEL_FULL - 1) - to_chat(target, "You feel satiated.") - -/obj/item/slimecross/regenerative/bluespace - colour = "bluespace" - effect_desc = "Partially heals the target and teleports them to where this core was created." - var/turf/open/T - -/obj/item/slimecross/regenerative/bluespace/core_effect(mob/living/target, mob/user) - target.visible_message("[src] disappears in a shower of sparks!","The milky goo teleports you somewhere it remembers!") - do_sparks(5,FALSE,target) - target.forceMove(T) - do_sparks(5,FALSE,target) - -/obj/item/slimecross/regenerative/bluespace/Initialize() - . = ..() - T = get_turf(src) - -/obj/item/slimecross/regenerative/sepia - colour = "sepia" - effect_desc = "Partially heals the target and stops time." - -/obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user) - to_chat(target, "You try to forget how you feel.") - target.AddComponent(/datum/component/dejavu) - -/obj/item/slimecross/regenerative/cerulean - colour = "cerulean" - effect_desc = "Slightly heals the target, but provides a boost of oxygen for a while. Additionally makes a second regenerative core with no special effects." - -/obj/item/slimecross/regenerative/cerulean/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user) - src.forceMove(user.loc) - var/obj/item/slimecross/X = new /obj/item/slimecross/regenerative(user.loc) - X.name = name - X.desc = desc - user.put_in_active_hand(X) - oxy_loss = 150 - target.reagents.add_reagent(/datum/reagent/medicine/salbutamol,15) //Similar to the luminescent effect, lets you breathe without oxygen for a while. - to_chat(user, "Some of the milky goo congeals in your hand!") - -/obj/item/slimecross/regenerative/pyrite - colour = "pyrite" - effect_desc = "Partially heals and randomly colors the target." - -/obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user) - target.visible_message("The milky goo coating [target] leaves [target.p_them()] a different color!") - target.add_atom_colour(rgb(rand(0,255),rand(0,255),rand(0,255)),WASHABLE_COLOUR_PRIORITY) - -/obj/item/slimecross/regenerative/red - colour = "red" - effect_desc = "Slightly heals the target and injects them with a lot of blood, what a rush!" - -/obj/item/slimecross/regenerative/red/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user) - to_chat(target, "You feel... faster.") - target.reagents.add_reagent(/datum/reagent/medicine/ephedrine,3) - blood_loss += 700 - -/obj/item/slimecross/regenerative/green - colour = "green" - effect_desc = "Weakly heals the target, but fixes their organs .Additionally changes the spieces or color of a slime or jellyperson." - -/obj/item/slimecross/regenerative/green/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) - if(isslime(target)) - target.visible_message("The [target] suddenly changes color!") - var/mob/living/simple_animal/slime/S = target - S.random_colour() - organ_loss += 17 - - -/obj/item/slimecross/regenerative/pink - colour = "pink" - effect_desc = "Partially heals the target and injects them with some krokodil." - -/obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user) - to_chat(target, "You feel more calm.") - target.reagents.add_reagent(/datum/reagent/drug/krokodil,4) - -/obj/item/slimecross/regenerative/gold - colour = "gold" - effect_desc = "Partially heals the target and produces a random coin." - -/obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) - var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) - var/obj/item/coin/C = new newcoin(target.loc) - playsound(C, 'sound/items/coinflip.ogg', 50, TRUE) - target.put_in_hand(C) - -/obj/item/slimecross/regenerative/oil - colour = "oil" - effect_desc = "Partially heals the target and flashes everyone in sight." - -/obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) - playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) - for(var/mob/living/L in view(user,7)) - L.flash_act() - -/obj/item/slimecross/regenerative/black - colour = "black" - effect_desc = "Partially heals the target and creates a duplicate of them, that drops dead soon after." - -/obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) - var/dummytype = target.type - var/mob/living/dummy = new dummytype(target.loc) - to_chat(target, "The milky goo flows from your skin, forming an imperfect copy of you.") - if(iscarbon(target)) - var/mob/living/carbon/T = target - var/mob/living/carbon/D = dummy - T.dna.transfer_identity(D) - D.updateappearance(mutcolor_update=1) - D.real_name = T.real_name - dummy.adjustBruteLoss(target.getBruteLoss()) - dummy.adjustFireLoss(target.getFireLoss()) - dummy.adjustToxLoss(target.getToxLoss()) - dummy.adjustOxyLoss(200) - -/obj/item/slimecross/regenerative/lightpink - colour = "light pink" - effect_desc = "Partially heals the target and also heals the user." - -// Doesn't heal the user as much as the target -/obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user) - if(!isliving(user)) - return - if(target == user) - return - var/mob/living/U = user - var/oxy_loss = (10 + (U.getOxyLoss() * 0.3)) - var/tox_loss = (10 + (U.getToxLoss() * 0.3)) - var/fire_loss = (10 + (U.getFireLoss() * 0.3)) - var/brute_loss = (10 + (U.getBruteLoss() * 0.3)) - var/stamina_loss = (10 + (U.getStaminaLoss() * 0.35)) - U.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) // Splits the healing effect across an instant heal, and a smaller heal after. - U.specific_heal(brute_amt = brute_loss, fire_amt = fire_loss, tox_amt = tox_loss, oxy_amt = oxy_loss, stam_amt = stamina_loss, organ_amt = 2, clone_amt = 100) - to_chat(U, "Some of the milky goo sprays onto you, as well!") - -/obj/item/slimecross/regenerative/adamantine - colour = "adamantine" - effect_desc = "weakly heals the target, but extra effective at treating brute trauma. Additionally boosts their armor." - -/obj/item/slimecross/regenerative/adamantine/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.3 - -/obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. - target.apply_status_effect(STATUS_EFFECT_SLIMESKIN) - brute_loss = (10 + (target.getBruteLoss() * 0.65)) //most common damage type, let's not go overboard - jelly_amount *= 0.5 - -/obj/item/slimecross/regenerative/rainbow - colour = "rainbow" - effect_desc = "Partially heals the target and temporarily makes them immortal, but pacifistic." - -/obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user) - target.apply_status_effect(STATUS_EFFECT_RAINBOWPROTECTION) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm deleted file mode 100644 index f51c5a271177..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ /dev/null @@ -1,133 +0,0 @@ -/* -Reproductive extracts: - When fed three monkey cubes, produces between - 1 and 4 normal slime extracts of the same colour. -*/ -/obj/item/slimecross/reproductive - name = "reproductive extract" - desc = "It pulses with a strange hunger." - icon_state = "reproductive" - effect = "reproductive" - effect_desc = "When fed monkey cubes it produces more extracts. Bio bag compatible as well." - var/extract_type = /obj/item/slime_extract/ - var/cubes_eaten = 0 - var/last_produce = 0 - var/cooldown = 30 // 3 seconds. - -/obj/item/slimecross/reproductive/attackby(obj/item/O, mob/user) - if((last_produce + cooldown) > world.time) - to_chat(user, "[src] is still digesting!") - return - if(istype(O, /obj/item/storage/bag/bio)) - var/list/inserted = list() - SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted) - if(inserted.len) - var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1] - if(istype(M)) - eat_cube(M, user) - else - to_chat(user, "There are no monkey cubes in the bio bag!") - if(istype(O,/obj/item/reagent_containers/food/snacks/monkeycube)) - eat_cube(O, user) - if(cubes_eaten >= 3) - var/cores = rand(1,4) - visible_message("[src] briefly swells to a massive size, and expels [cores] extract[cores > 1 ? "s":""]!") - playsound(src, 'sound/effects/splat.ogg', 40, TRUE) - last_produce = world.time - for(var/i = 0, i < cores, i++) - new extract_type(get_turf(loc)) - cubes_eaten = 0 - -/obj/item/slimecross/reproductive/proc/eat_cube(obj/item/reagent_containers/food/snacks/monkeycube, mob/user) - qdel(monkeycube) - cubes_eaten++ - to_chat(user, "You feed [monkeycube] to [src], and it pulses gently.") - playsound(src, 'sound/items/eatfood.ogg', 20, TRUE) - -/obj/item/slimecross/reproductive/grey - extract_type = /obj/item/slime_extract/grey - colour = "grey" - -/obj/item/slimecross/reproductive/orange - extract_type = /obj/item/slime_extract/orange - colour = "orange" - -/obj/item/slimecross/reproductive/purple - extract_type = /obj/item/slime_extract/purple - colour = "purple" - -/obj/item/slimecross/reproductive/blue - extract_type = /obj/item/slime_extract/blue - colour = "blue" - -/obj/item/slimecross/reproductive/metal - extract_type = /obj/item/slime_extract/metal - colour = "metal" - -/obj/item/slimecross/reproductive/yellow - extract_type = /obj/item/slime_extract/yellow - colour = "yellow" - -/obj/item/slimecross/reproductive/darkpurple - extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" - -/obj/item/slimecross/reproductive/darkblue - extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" - -/obj/item/slimecross/reproductive/silver - extract_type = /obj/item/slime_extract/silver - colour = "silver" - -/obj/item/slimecross/reproductive/bluespace - extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" - -/obj/item/slimecross/reproductive/sepia - extract_type = /obj/item/slime_extract/sepia - colour = "sepia" - -/obj/item/slimecross/reproductive/cerulean - extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" - -/obj/item/slimecross/reproductive/pyrite - extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" - -/obj/item/slimecross/reproductive/red - extract_type = /obj/item/slime_extract/red - colour = "red" - -/obj/item/slimecross/reproductive/green - extract_type = /obj/item/slime_extract/green - colour = "green" - -/obj/item/slimecross/reproductive/pink - extract_type = /obj/item/slime_extract/pink - colour = "pink" - -/obj/item/slimecross/reproductive/gold - extract_type = /obj/item/slime_extract/gold - colour = "gold" - -/obj/item/slimecross/reproductive/oil - extract_type = /obj/item/slime_extract/oil - colour = "oil" - -/obj/item/slimecross/reproductive/black - extract_type = /obj/item/slime_extract/black - colour = "black" - -/obj/item/slimecross/reproductive/lightpink - extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" - -/obj/item/slimecross/reproductive/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - -/obj/item/slimecross/reproductive/rainbow - extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm deleted file mode 100644 index 814083c3bb50..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ /dev/null @@ -1,149 +0,0 @@ -/* -Self-sustaining extracts: - Produces 4 extracts that do not need reagents. -*/ -/obj/item/slimecross/selfsustaining - name = "self-sustaining extract" - effect = "self-sustaining" - icon_state = "selfsustaining" - var/extract_type = /obj/item/slime_extract - -/obj/item/autoslime - name = "autoslime" - desc = "It resembles a normal slime extract, but seems filled with a strange, multi-colored fluid." - var/obj/item/slime_extract/extract - var/effect_desc = "A self-sustaining slime extract. When used, lets you choose which reaction you want." - -//Just divides into the actual item. -/obj/item/slimecross/selfsustaining/Initialize() - ..() - visible_message("The [src] shudders, and splits into four smaller extracts.") - for(var/i = 0, i < 4, i++) - var/obj/item/autoslime/A = new /obj/item/autoslime(src.loc) - var/obj/item/slime_extract/X = new extract_type(A) - A.extract = X - A.icon = icon - A.icon_state = icon_state - A.color = color - A.name = "self-sustaining " + colour + " extract" - return INITIALIZE_HINT_QDEL - -/obj/item/autoslime/Initialize() - return ..() - -/obj/item/autoslime/attack_self(mob/user) - var/reagentselect = input(user, "Choose the reagent the extract will produce.", "Self-sustaining Reaction") as null|anything in sortList(extract.activate_reagents, /proc/cmp_typepaths_asc) - var/amount = 5 - var/secondary - - if (user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - return - if(!reagentselect) - return - if(reagentselect == "lesser plasma") - amount = 4 - reagentselect = /datum/reagent/toxin/plasma - if(reagentselect == "holy water and uranium") - reagentselect = /datum/reagent/water/holywater - secondary = /datum/reagent/uranium - extract.forceMove(user.drop_location()) - qdel(src) - user.put_in_active_hand(extract) - extract.reagents.add_reagent(reagentselect,amount) - if(secondary) - extract.reagents.add_reagent(secondary,amount) - -/obj/item/autoslime/examine(mob/user) - . = ..() - if(effect_desc) - . += "[effect_desc]" - -//Different types. - -/obj/item/slimecross/selfsustaining/grey - extract_type = /obj/item/slime_extract/grey - colour = "grey" - -/obj/item/slimecross/selfsustaining/orange - extract_type = /obj/item/slime_extract/orange - colour = "orange" - -/obj/item/slimecross/selfsustaining/purple - extract_type = /obj/item/slime_extract/purple - colour = "purple" - -/obj/item/slimecross/selfsustaining/blue - extract_type = /obj/item/slime_extract/blue - colour = "blue" - -/obj/item/slimecross/selfsustaining/metal - extract_type = /obj/item/slime_extract/metal - colour = "metal" - -/obj/item/slimecross/selfsustaining/yellow - extract_type = /obj/item/slime_extract/yellow - colour = "yellow" - -/obj/item/slimecross/selfsustaining/darkpurple - extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" - -/obj/item/slimecross/selfsustaining/darkblue - extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" - -/obj/item/slimecross/selfsustaining/silver - extract_type = /obj/item/slime_extract/silver - colour = "silver" - -/obj/item/slimecross/selfsustaining/bluespace - extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" - -/obj/item/slimecross/selfsustaining/sepia - extract_type = /obj/item/slime_extract/sepia - colour = "sepia" - -/obj/item/slimecross/selfsustaining/cerulean - extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" - -/obj/item/slimecross/selfsustaining/pyrite - extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" - -/obj/item/slimecross/selfsustaining/red - extract_type = /obj/item/slime_extract/red - colour = "red" - -/obj/item/slimecross/selfsustaining/green - extract_type = /obj/item/slime_extract/green - colour = "green" - -/obj/item/slimecross/selfsustaining/pink - extract_type = /obj/item/slime_extract/pink - colour = "pink" - -/obj/item/slimecross/selfsustaining/gold - extract_type = /obj/item/slime_extract/gold - colour = "gold" - -/obj/item/slimecross/selfsustaining/oil - extract_type = /obj/item/slime_extract/oil - colour = "oil" - -/obj/item/slimecross/selfsustaining/black - extract_type = /obj/item/slime_extract/black - colour = "black" - -/obj/item/slimecross/selfsustaining/lightpink - extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" - -/obj/item/slimecross/selfsustaining/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - -/obj/item/slimecross/selfsustaining/rainbow - extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm deleted file mode 100644 index eee23636f780..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ /dev/null @@ -1,190 +0,0 @@ -/* -Stabilized extracts: - Provides a passive buff to the holder. -*/ - -//To add: Create an effect in crossbreeding/_status_effects.dm with the name "/datum/status_effect/stabilized/[color]" -//Status effect will automatically be applied while held, and lost on drop. - -/obj/item/slimecross/stabilized - name = "stabilized extract" - desc = "It seems inert, but anything it touches glows softly..." - effect = "stabilized" - icon_state = "stabilized" - var/datum/status_effect/linked_effect - var/mob/living/owner - -/obj/item/slimecross/stabilized/Initialize() - . = ..() - START_PROCESSING(SSobj,src) - -/obj/item/slimecross/stabilized/Destroy() - STOP_PROCESSING(SSobj,src) - qdel(linked_effect) - return ..() - -/obj/item/slimecross/stabilized/process() - var/humanfound = null - if(ishuman(loc)) - humanfound = loc - if(ishuman(loc.loc)) //Check if in backpack. - humanfound = (loc.loc) - if(!humanfound) - return - var/mob/living/carbon/human/H = humanfound - var/effectpath = /datum/status_effect/stabilized - var/static/list/effects = subtypesof(/datum/status_effect/stabilized) - for(var/X in effects) - var/datum/status_effect/stabilized/S = X - if(initial(S.colour) == colour) - effectpath = S - break - if(!H.has_status_effect(effectpath)) - var/datum/status_effect/stabilized/S = H.apply_status_effect(effectpath) - owner = H - S.linked_extract = src - STOP_PROCESSING(SSobj,src) - - - -//Colors and subtypes: -/obj/item/slimecross/stabilized/grey - colour = "grey" - effect_desc = "Makes slimes friendly to the owner" - -/obj/item/slimecross/stabilized/orange - colour = "orange" - effect_desc = "Passively tries to increase or decrease the owner's body temperature to normal" - -/obj/item/slimecross/stabilized/purple - colour = "purple" - effect_desc = "Provides a regeneration effect" - -/obj/item/slimecross/stabilized/blue - colour = "blue" - effect_desc = "Makes the owner immune to slipping on water, soap or foam. Space lube and ice are still too slippery." - -/obj/item/slimecross/stabilized/metal - colour = "metal" - effect_desc = "Every 30 seconds, adds a sheet of material to a random stack in the owner's backpack." - -/obj/item/slimecross/stabilized/yellow - colour = "yellow" - effect_desc = "Every ten seconds it recharges a device on the owner by 10%." - -/obj/item/slimecross/stabilized/darkpurple - colour = "dark purple" - effect_desc = "Gives you burning fingertips, automatically cooking any microwavable food you hold." - -/obj/item/slimecross/stabilized/darkblue - colour = "dark blue" - effect_desc = "Slowly extinguishes the owner if they are on fire, also wets items like monkey cubes, creating a monkey." - -/obj/item/slimecross/stabilized/silver - colour = "silver" - effect_desc = "Slows the rate at which the owner loses nutrition" - -/obj/item/slimecross/stabilized/bluespace - colour = "bluespace" - effect_desc = "On a two minute cooldown, when the owner has taken enough damage, they are teleported to a safe place." - -/obj/item/slimecross/stabilized/sepia - colour = "sepia" - effect_desc = "Randomly adjusts the owner's speed." - -/obj/item/slimecross/stabilized/cerulean - colour = "cerulean" - effect_desc = "Creates a duplicate of the owner. If the owner dies they will take control of the duplicate, unless the death was from beheading or gibbing." - -/obj/item/slimecross/stabilized/pyrite - colour = "pyrite" - effect_desc = "Randomly colors the owner every few seconds." - -/obj/item/slimecross/stabilized/red - colour = "red" - effect_desc = "Nullifies all equipment based slowdowns." - -/obj/item/slimecross/stabilized/green - colour = "green" - effect_desc = "Changes the owner's name and appearance while holding this extract." - -/obj/item/slimecross/stabilized/pink - colour = "pink" - effect_desc = "As long as no creatures are harmed in the owner's presense, they will not attack you. If the peace is broken it takes two minutes to restore." - -/obj/item/slimecross/stabilized/gold - colour = "gold" - effect_desc = "Creates a pet when held." - var/mob_type - var/datum/mind/saved_mind - var/mob_name = "Familiar" - -/obj/item/slimecross/stabilized/gold/proc/generate_mobtype() - var/static/list/mob_spawn_pets = list() - if(mob_spawn_pets.len <= 0) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - switch(initial(SA.gold_core_spawnable)) - if(FRIENDLY_SPAWN) - mob_spawn_pets += T - mob_type = pick(mob_spawn_pets) - -/obj/item/slimecross/stabilized/gold/Initialize() - . = ..() - generate_mobtype() - -/obj/item/slimecross/stabilized/gold/attack_self(mob/user) - var/choice = input(user, "Which do you want to reset?", "Familiar Adjustment") as null|anything in sortList(list("Familiar Location", "Familiar Species", "Familiar Sentience", "Familiar Name")) - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(isliving(user)) - var/mob/living/L = user - if(L.has_status_effect(/datum/status_effect/stabilized/gold)) - L.remove_status_effect(/datum/status_effect/stabilized/gold) - if(choice == "Familiar Location") - to_chat(user, "You prod [src], and it shudders slightly.") - START_PROCESSING(SSobj, src) - if(choice == "Familiar Species") - to_chat(user, "You squeeze [src], and a shape seems to shift around inside.") - generate_mobtype() - START_PROCESSING(SSobj, src) - if(choice == "Familiar Sentience") - to_chat(user, "You poke [src], and it lets out a glowing pulse.") - saved_mind = null - START_PROCESSING(SSobj, src) - if(choice == "Familiar Name") - var/newname = sanitize_name(stripped_input(user, "Would you like to change the name of [mob_name]", "Name change", mob_name, MAX_NAME_LEN)) - if(newname) - mob_name = newname - to_chat(user, "You speak softly into [src], and it shakes slightly in response.") - START_PROCESSING(SSobj, src) - -/obj/item/slimecross/stabilized/oil - colour = "oil" - effect_desc = "The owner will violently explode when they die while holding this extract." - -/obj/item/slimecross/stabilized/black - colour = "black" - effect_desc = "While strangling someone, the owner's hands melt around their neck, draining their life in exchange for food and healing." - -/obj/item/slimecross/stabilized/lightpink - colour = "light pink" - effect_desc = "The owner moves at high speeds while holding this extract, also stabilizes anyone in critical condition around you using Epinephrine." - -/obj/item/slimecross/stabilized/adamantine - colour = "adamantine" - effect_desc = "Owner gains a slight boost in damage resistance to all types." - -/obj/item/slimecross/stabilized/rainbow - colour = "rainbow" - effect_desc = "Accepts a regenerative extract and automatically uses it if the owner enters a critical condition." - var/obj/item/slimecross/regenerative/regencore - -/obj/item/slimecross/stabilized/rainbow/attackby(obj/item/O, mob/user) - var/obj/item/slimecross/regenerative/regen = O - if(istype(regen) && !regencore) - to_chat(user, "You place [O] in [src], prepping the extract for automatic application!") - regencore = regen - regen.forceMove(src) - return - return ..() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm deleted file mode 100644 index 81ac7db98b01..000000000000 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ /dev/null @@ -1,473 +0,0 @@ -//Xenobio control console -/mob/camera/aiEye/remote/xenobio - visible_icon = TRUE - icon = 'icons/mob/cameramob.dmi' - icon_state = "generic_camera" - var/allowed_area = null - -/mob/camera/aiEye/remote/xenobio/Initialize() - var/area/A = get_area(loc) - allowed_area = A.name - . = ..() - -/mob/camera/aiEye/remote/xenobio/setLoc(t) - var/area/new_area = get_area(t) - if(new_area && new_area.name == allowed_area || new_area && (new_area.area_flags & XENOBIOLOGY_COMPATIBLE)) - return ..() - else - return - -/obj/machinery/computer/camera_advanced/xenobio - name = "Slime management console" - desc = "A computer used for remotely handling slimes." - networks = list("ss13") - circuit = /obj/item/circuitboard/computer/xenobiology - var/datum/action/innate/slime_place/slime_place_action - var/datum/action/innate/slime_pick_up/slime_up_action - var/datum/action/innate/feed_slime/feed_slime_action - var/datum/action/innate/monkey_recycle/monkey_recycle_action - var/datum/action/innate/slime_scan/scan_action - var/datum/action/innate/feed_potion/potion_action - var/datum/action/innate/hotkey_help/hotkey_help - - var/obj/machinery/monkey_recycler/connected_recycler - var/list/stored_slimes - var/obj/item/slimepotion/slime/current_potion - var/max_slimes = 5 - var/monkeys = 0 - - icon_screen = "slime_comp" - icon_keyboard = "rd_key" - - light_color = LIGHT_COLOR_PINK - -/obj/machinery/computer/camera_advanced/xenobio/Initialize(mapload) - . = ..() - slime_place_action = new - slime_up_action = new - feed_slime_action = new - monkey_recycle_action = new - scan_action = new - potion_action = new - hotkey_help = new - stored_slimes = list() - for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) - if(get_area(recycler.loc) == get_area(loc)) - connected_recycler = recycler - connected_recycler.connected += src - -/obj/machinery/computer/camera_advanced/xenobio/Destroy() - QDEL_NULL(current_potion) - for(var/thing in stored_slimes) - var/mob/living/simple_animal/slime/S = thing - S.forceMove(drop_location()) - stored_slimes.Cut() - if(connected_recycler) - connected_recycler.connected -= src - connected_recycler = null - return ..() - -/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A) - if(A == current_potion) - current_potion = null - if(A in stored_slimes) - stored_slimes -= A - return ..() - -/obj/machinery/computer/camera_advanced/xenobio/CreateEye() - eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) - eyeobj.origin = src - eyeobj.visible_icon = TRUE - eyeobj.icon = 'icons/mob/cameramob.dmi' - eyeobj.icon_state = "generic_camera" - -/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user) - ..() - - if(slime_up_action) - slime_up_action.target = src - slime_up_action.Grant(user) - actions += slime_up_action - - if(slime_place_action) - slime_place_action.target = src - slime_place_action.Grant(user) - actions += slime_place_action - - if(feed_slime_action) - feed_slime_action.target = src - feed_slime_action.Grant(user) - actions += feed_slime_action - - if(monkey_recycle_action) - monkey_recycle_action.target = src - monkey_recycle_action.Grant(user) - actions += monkey_recycle_action - - if(scan_action) - scan_action.target = src - scan_action.Grant(user) - actions += scan_action - - if(potion_action) - potion_action.target = src - potion_action.Grant(user) - actions += potion_action - - if(hotkey_help) - hotkey_help.target = src - hotkey_help.Grant(user) - actions += hotkey_help - - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, PROC_REF(XenoSlimeClickCtrl)) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, PROC_REF(XenoSlimeClickAlt)) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, PROC_REF(XenoSlimeClickShift)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, PROC_REF(XenoTurfClickShift)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, PROC_REF(XenoTurfClickCtrl)) - RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, PROC_REF(XenoMonkeyClickCtrl)) - - //Checks for recycler on every interact, prevents issues with load order on certain maps. - if(!connected_recycler) - for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) - if(get_area(recycler.loc) == get_area(loc)) - connected_recycler = recycler - connected_recycler.connected += src - -/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) - ..() - -/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) - monkeys++ - to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") - qdel(O) - return - else if(istype(O, /obj/item/storage/bag)) - var/obj/item/storage/P = O - var/loaded = FALSE - for(var/obj/G in P.contents) - if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube)) - loaded = TRUE - monkeys++ - qdel(G) - if(loaded) - to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.") - return - else if(istype(O, /obj/item/slimepotion/slime)) - var/replaced = FALSE - if(user && !user.transferItemToLoc(O, src)) - return - if(!QDELETED(current_potion)) - current_potion.forceMove(drop_location()) - replaced = TRUE - current_potion = O - to_chat(user, "You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].") - return - ..() - -/obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if (istype(I) && istype(I.buffer,/obj/machinery/monkey_recycler)) - to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") - connected_recycler = I.buffer - connected_recycler.connected += src - return TRUE - -/datum/action/innate/slime_place - name = "Place Slimes" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_down" - -/datum/action/innate/slime_place/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in X.stored_slimes) - S.forceMove(remote_eye.loc) - S.visible_message("[S] warps in!") - X.stored_slimes -= S - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/slime_pick_up - name = "Pick up Slime" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_up" - -/datum/action/innate/slime_pick_up/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - if(X.stored_slimes.len >= X.max_slimes) - break - if(!S.ckey) - if(S.buckled) - S.Feedstop(silent = TRUE) - S.visible_message("[S] vanishes in a flash of light!") - S.forceMove(X) - X.stored_slimes += S - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - - -/datum/action/innate/feed_slime - name = "Feed Slimes" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "monkey_down" - -/datum/action/innate/feed_slime/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - if(X.monkeys >= 1) - var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner) - if (!QDELETED(food)) - food.LAssailant = WEAKREF(C) - X.monkeys-- - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - to_chat(owner, "[X] now has [X.monkeys] monkeys stored.") - else - to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - - -/datum/action/innate/monkey_recycle - name = "Recycle Monkeys" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "monkey_up" - -/datum/action/innate/monkey_recycle/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - var/obj/machinery/monkey_recycler/recycler = X.connected_recycler - - if(!recycler) - to_chat(owner, "There is no connected monkey recycler. Use a multitool to link one.") - return - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/monkey/M in remote_eye.loc) - if(M.stat) - M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!") - recycler.use_power(500) - X.monkeys += recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - qdel(M) - to_chat(owner, "[X] now has [X.monkeys] monkeys available.") - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/slime_scan - name = "Scan Slime" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_scan" - -/datum/action/innate/slime_scan/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - slime_scan(S, C) - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/feed_potion - name = "Apply Potion" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_potion" - -/datum/action/innate/feed_potion/Activate() - if(!target || !isliving(owner)) - return - - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(QDELETED(X.current_potion)) - to_chat(owner, "No potion loaded.") - return - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - X.current_potion.attack(S, C) - break - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/hotkey_help - name = "Hotkey Help" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "hotkey_help" - -/datum/action/innate/hotkey_help/Activate() - if(!target || !isliving(owner)) - return - to_chat(owner, "Click shortcuts:") - to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.") - to_chat(owner, "Ctrl-click a slime to scan it.") - to_chat(owner, "Alt-click a slime to feed it a potion.") - to_chat(owner, "Ctrl-click or a dead monkey to recycle it, or the floor to place a new monkey.") - -// -// Alternate clicks for slime, monkey and open turf if using a xenobio console - -// Scans slime -/mob/living/simple_animal/slime/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) - ..() - -//Feeds a potion to slime -/mob/living/simple_animal/slime/AltClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) - ..() - -//Picks up slime -/mob/living/simple_animal/slime/ShiftClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) - ..() - -//Place slimes -/turf/open/ShiftClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) - ..() - -//Place monkey -/turf/open/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) - ..() - -//Pick up monkey -/mob/living/carbon/monkey/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) - ..() - -// Scans slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) - slime_scan(S, C) - -//Feeds a potion to slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(S.loc) - if(QDELETED(X.current_potion)) - to_chat(C, "No potion loaded.") - return - if(mobarea.name == E.allowed_area ||(mobarea & XENOBIOLOGY_COMPATIBLE)) - X.current_potion.attack(S, C) - -//Picks up slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) - if(X.stored_slimes.len >= X.max_slimes) - to_chat(C, "Slime storage is full.") - return - if(S.ckey) - to_chat(C, "The slime wiggled free!") - return - if(S.buckled) - S.Feedstop(silent = TRUE) - S.visible_message("[S] vanishes in a flash of light!") - S.forceMove(X) - X.stored_slimes += S - -//Place slimes -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T) - if(!GLOB.cameranet.checkTurfVis(T)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || (turfarea & XENOBIOLOGY_COMPATIBLE)) - for(var/mob/living/simple_animal/slime/S in X.stored_slimes) - S.forceMove(T) - S.visible_message("[S] warps in!") - X.stored_slimes -= S - -//Place monkey -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T) - if(!GLOB.cameranet.checkTurfVis(T)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || (turfarea & XENOBIOLOGY_COMPATIBLE)) - if(X.monkeys >= 1) - var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C) - if (!QDELETED(food)) - food.LAssailant = WEAKREF(C) - X.monkeys-- - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - to_chat(C, "[X] now has [X.monkeys] monkeys stored.") - else - to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") - -//Pick up monkey -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M) - if(!isturf(M.loc) || !GLOB.cameranet.checkTurfVis(M.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(M.loc) - if(!X.connected_recycler) - to_chat(C, "There is no connected monkey recycler. Use a multitool to link one.") - return - if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) - if(!M.stat) - return - M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!") - X.connected_recycler.use_power(500) - X.monkeys += connected_recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - qdel(M) - to_chat(C, "[X] now has [X.monkeys] monkeys available.") diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm deleted file mode 100644 index c907f11c1cfa..000000000000 --- a/code/modules/research/xenobiology/xenobiology.dm +++ /dev/null @@ -1,1072 +0,0 @@ -/// Slime Extracts /// - -/obj/item/slime_extract - name = "slime extract" - desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey slime extract" - force = 0 - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - throw_speed = 3 - throw_range = 6 - grind_results = list() - var/Uses = 1 ///uses before it goes inert - var/qdel_timer = null ///deletion timer, for delayed reactions - var/effectmod ///Which type of crossbred - var/crossbreed_modifier = 1 //Modifies how many extracts are needed to cross a core. - var/list/activate_reagents = list() ///Reagents required for activation - var/recurring = FALSE - var/research ///Research point value for slime cores. These are defines stored in [/__DEFINES/research] - the actual values are updated there. - -/obj/item/slime_extract/examine(mob/user) - . = ..() - if(Uses > 1) - . += "It has [Uses] uses remaining." - -/obj/item/slime_extract/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/slimepotion/enhancer)) - if(Uses >= 5 || recurring) - to_chat(user, "You cannot enhance this extract further!") - return ..() - if(O.type == /obj/item/slimepotion/enhancer) //Seriously, why is this defined here...? - to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") - Uses++ - if(O.type == /obj/item/slimepotion/enhancer/max) - to_chat(user, "You dump the maximizer on the slime extract. It can now be used a total of 5 times!") - Uses = 5 - qdel(O) - ..() - -/obj/item/slime_extract/Initialize() - . = ..() - create_reagents(100, INJECTABLE | DRAWABLE) - -/obj/item/slime_extract/on_grind() - if(Uses) - grind_results[/datum/reagent/toxin/slimejelly] = 20 - -/** -* Effect when activated by a Luminescent. -* -* This proc is called whenever a Luminescent consumes a slime extract. Each one is separated into major and minor effects depending on the extract. Cooldown is measured in deciseconds. -* -* * arg1 - The mob absorbing the slime extract. -* * arg2 - The valid species for the absorbtion. Should always be a Luminescent unless something very major has changed. -* * arg3 - Whether or not the activation is major or minor. Major activations have large, complex effects, minor are simple. -*/ -/obj/item/slime_extract/proc/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - to_chat(user, "Nothing happened... This slime extract cannot be activated this way.") - return 0 - -/** -* Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract. -* -* By using a valid core on a living adult slime, then feeding it nine more of the same type, you can mutate it into more useful items. Not every slime type has an implemented core cross. -*/ -/obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(!M.is_adult) - to_chat(user, "The slime must be an adult to cross its core!") - return - if(M.effectmod && M.effectmod != effectmod) - to_chat(user, "The slime is already being crossed with a different extract!") - return - - if(!M.effectmod) - M.effectmod = effectmod - M.crossbreed_modifier = crossbreed_modifier - - M.applied++ - qdel(src) - to_chat(user, "You feed the slime [src], [M.applied == 1 ? "starting to mutate its core." : "further mutating its core."]") - playsound(M, 'sound/effects/attackblob.ogg', 50, TRUE) - - if(M.applied >= (SLIME_EXTRACT_CROSSING_REQUIRED * crossbreed_modifier)) - M.spawn_corecross() - -/obj/item/slime_extract/grey - name = "grey slime extract" - icon_state = "grey slime extract" - effectmod = "reproductive" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_0 - custom_price = 1000 - -/obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/reagent_containers/food/snacks/monkeycube/M = new - if(!user.put_in_active_hand(M)) - M.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - to_chat(user, "You spit out a monkey cube.") - return 120 - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "Your [name] starts pulsing...") - if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey") - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - to_chat(user, "You spit out [S].") - return 350 - else - return 0 - -/obj/item/slime_extract/gold - name = "gold slime extract" - icon_state = "gold slime extract" - effectmod = "symbiont" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/gold/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.visible_message("[user] starts shaking!","Your [name] starts pulsing gently...") - if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), FRIENDLY_SPAWN) - S.faction |= "neutral" - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [S]!", "You spit out [S]!") - return 300 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user] starts shaking violently!","Your [name] starts pulsing violently...") - if(do_after(user, 50, target = user)) - var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), HOSTILE_SPAWN) - if(user.a_intent != INTENT_HARM) - S.faction |= "neutral" - else - S.faction |= "slime" - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [S]!", "You spit out [S]!") - return 600 - -/obj/item/slime_extract/silver - name = "silver slime extract" - icon_state = "silver slime extract" - effectmod = "consuming" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/silver/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/food_type = get_random_food() - var/obj/O = new food_type - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 200 - if(SLIME_ACTIVATE_MAJOR) - var/drink_type = get_random_drink() - var/obj/O = new drink_type - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 200 - -/obj/item/slime_extract/metal - name = "metal slime extract" - icon_state = "metal slime extract" - effectmod = "industrial" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/stack/sheet/glass/O = new(null, 5) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/obj/item/stack/sheet/metal/O = new(null, 5) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 200 - -/obj/item/slime_extract/purple - name = "purple slime extract" - icon_state = "purple slime extract" - effectmod = "regenerative" - crossbreed_modifier = 0.3 - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.adjust_nutrition(50) - user.blood_volume += 50 - to_chat(user, "You activate [src], and your body is refilled with fresh slime jelly!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You activate [src], and it releases regenerative chemicals!") - user.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) - return 600 - -/obj/item/slime_extract/darkpurple - name = "dark purple slime extract" - icon_state = "dark purple slime extract" - effectmod = "self-sustaining" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/stack/sheet/mineral/plasma/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/turf/open/T = get_turf(user) - if(istype(T)) - T.atmos_spawn_air("plasma=20") - to_chat(user, "You activate [src], and a cloud of plasma bursts out of your skin!") - return 900 - -/obj/item/slime_extract/orange - name = "orange slime extract" - icon_state = "orange slime extract" - effectmod = "burning" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. You start feeling hot!") - user.reagents.add_reagent(/datum/reagent/consumable/capsaicin,10) - return 150 - - if(SLIME_ACTIVATE_MAJOR) - user.reagents.add_reagent(/datum/reagent/phosphorus,5)// - user.reagents.add_reagent(/datum/reagent/potassium,5) // = smoke, along with any reagents inside mr. slime - user.reagents.add_reagent(/datum/reagent/consumable/sugar,5) // - to_chat(user, "You activate [src], and a cloud of smoke bursts out of your skin!") - return 450 - -/obj/item/slime_extract/yellow - name = "yellow slime extract" - icon_state = "yellow slime extract" - effectmod = "charged" - crossbreed_modifier = 0.8 - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(species.glow_intensity != LUMINESCENT_DEFAULT_GLOW) - to_chat(user, "Your glow is already enhanced!") - return - species.update_glow(user, 5) - addtimer(CALLBACK(species, TYPE_PROC_REF(/datum/species/jelly/luminescent, update_glow), user, LUMINESCENT_DEFAULT_GLOW), 600) - to_chat(user, "You start glowing brighter.") - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin starts flashing intermittently...", "Your skin starts flashing intermittently...") - if(do_after(user, 25, target = user)) - empulse(user, 1, 2) - user.visible_message("[user]'s skin flashes!", "Your skin flashes as you emit an electromagnetic pulse!") - return 600 - -/obj/item/slime_extract/red - name = "red slime extract" - icon_state = "red slime extract" - effectmod = "sanguine" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. You start feeling fast!") - user.reagents.add_reagent(/datum/reagent/medicine/ephedrine,5) - return 450 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin flashes red for a moment...", "Your skin flashes red as you emit rage-inducing pheromones...") - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null)) - slime.rabid = TRUE - slime.visible_message("The [slime] is driven into a frenzy!") - return 600 - -/obj/item/slime_extract/blue - name = "blue slime extract" - icon_state = "blue slime extract" - effectmod = "stabilized" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. Your genome feels more stable!") - user.adjustCloneLoss(-15) - user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) - user.reagents.add_reagent(/datum/reagent/medicine/potass_iodide, 10) - return 250 - - if(SLIME_ACTIVATE_MAJOR) - user.reagents.create_foam(/datum/effect_system/foam_spread,20) - user.visible_message("Foam spews out from [user]'s skin!", "You activate [src], and foam bursts out of your skin!") - return 600 - -/obj/item/slime_extract/darkblue - name = "dark blue slime extract" - icon_state = "dark blue slime extract" - effectmod = "chilling" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. You start feeling colder!") - user.ExtinguishMob() - user.adjust_fire_stacks(-20) - user.reagents.add_reagent(/datum/reagent/consumable/frostoil,4) - user.reagents.add_reagent(/datum/reagent/medicine/cryoxadone,5) - return 100 - - if(SLIME_ACTIVATE_MAJOR) - var/turf/open/T = get_turf(user) - if(istype(T)) - T.atmos_spawn_air("nitrogen=40;TEMP=2.7") - to_chat(user, "You activate [src], and icy air bursts out of your skin!") - return 900 - -/obj/item/slime_extract/pink - name = "pink slime extract" - icon_state = "pink slime extract" - effectmod = "gentle" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(user.gender != MALE && user.gender != FEMALE) - to_chat(user, "You can't swap your gender!") - return - - if(user.gender == MALE) - user.gender = FEMALE - user.visible_message("[user] suddenly looks more feminine!", "You suddenly feel more feminine!") - else - user.gender = MALE - user.visible_message("[user] suddenly looks more masculine!", "You suddenly feel more masculine!") - return 100 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin starts flashing hypnotically...", "Your skin starts forming odd patterns, pacifying creatures around you.") - for(var/mob/living/carbon/C in viewers(user, null)) - if(C != user) - C.reagents.add_reagent(/datum/reagent/pax,2) - return 600 - -/obj/item/slime_extract/green - name = "green slime extract" - icon_state = "green slime extract" - effectmod = "mutative" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You feel yourself reverting to human form...") - if(do_after(user, 120, target = user)) - to_chat(user, "You feel human again!") - user.set_species(/datum/species/human) - return - to_chat(user, "You stop the transformation.") - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You feel yourself radically changing your slime type...") - if(do_after(user, 120, target = user)) - to_chat(user, "You feel different!") - user.set_species(pick(/datum/species/jelly/slime, /datum/species/jelly/stargazer)) - return - to_chat(user, "You stop the transformation.") - -/obj/item/slime_extract/lightpink - name = "light pink slime extract" - icon_state = "light pink slime extract" - effectmod = "loyal" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/slimepotion/slime/renaming/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/obj/item/slimepotion/slime/sentience/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 450 - -/obj/item/slime_extract/black - name = "black slime extract" - icon_state = "black slime extract" - effectmod = "transformative" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You feel something wrong inside you...") - user.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) - return 100 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You feel your own light turning dark...") - if(do_after(user, 120, target = user)) - to_chat(user, "You feel a longing for darkness.") - user.set_species(pick(/datum/species/shadow)) - return - to_chat(user, "You stop feeding [src].") - -/obj/item/slime_extract/oil - name = "oil slime extract" - icon_state = "oil slime extract" - effectmod = "detonating" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You vomit slippery oil.") - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - new /obj/effect/decal/cleanable/oil/slippery(get_turf(user)) - return 450 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin starts pulsing and glowing ominously...", "You feel unstable...") - if(do_after(user, 60, target = user)) - to_chat(user, "You explode!") - explosion(get_turf(user), 1 ,3, 6) - user.gib() - return - to_chat(user, "You stop feeding [src], and the feeling passes.") - -/obj/item/slime_extract/adamantine - name = "adamantine slime extract" - icon_state = "adamantine slime extract" - effectmod = "crystalline" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(species.armor > 0) - to_chat(user, "Your skin is already hardened!") - return - to_chat(user, "You feel your skin harden and become more resistant.") - species.armor += 25 - addtimer(CALLBACK(src, PROC_REF(reset_armor), species), 1200) - return 450 - -/obj/item/slime_extract/adamantine/proc/reset_armor(datum/species/jelly/luminescent/species) - if(istype(species)) - species.armor -= 25 - -/obj/item/slime_extract/bluespace - name = "bluespace slime extract" - icon_state = "bluespace slime extract" - effectmod = "warping" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - var/teleport_ready = FALSE - var/teleport_x = 0 - var/teleport_y = 0 - var/teleport_z = 0 - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/bluespace/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You feel your body vibrating...") - if(do_after(user, 25, target = user)) - to_chat(user, "You teleport!") - do_teleport(user, get_turf(user), 6, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - return 300 - - if(SLIME_ACTIVATE_MAJOR) - if(!teleport_ready) - to_chat(user, "You feel yourself anchoring to this spot...") - var/turf/T = get_turf(user) - teleport_x = T.x - teleport_y = T.y - teleport_z = T.z - teleport_ready = TRUE - else - teleport_ready = FALSE - if(teleport_x && teleport_y && teleport_z) - var/turf/T = locate(teleport_x, teleport_y, teleport_z) - to_chat(user, "You snap back to your anchor point!") - do_teleport(user, T, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - return 450 - - -/obj/item/slime_extract/pyrite - name = "pyrite slime extract" - icon_state = "pyrite slime extract" - effectmod = "prismatic" - crossbreed_modifier = 0.5 - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) - var/obj/item/O = new chosen(null) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/blacklisted_cans = list(/obj/item/toy/crayon/spraycan/borg, /obj/item/toy/crayon/spraycan/infinite) - var/chosen = pick(subtypesof(/obj/item/toy/crayon/spraycan) - blacklisted_cans) - var/obj/item/O = new chosen(null) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 250 - -/obj/item/slime_extract/cerulean - name = "cerulean slime extract" - icon_state = "cerulean slime extract" - effectmod = "recurring" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.reagents.add_reagent(/datum/reagent/medicine/salbutamol,15) - to_chat(user, "You feel like you don't need to breathe!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/turf/open/T = get_turf(user) - if(istype(T)) - T.atmos_spawn_air("o2=11;n2=41;TEMP=293.15") - to_chat(user, "You activate [src], and fresh air bursts out of your skin!") - return 600 - -/obj/item/slime_extract/sepia - name = "sepia slime extract" - icon_state = "sepia slime extract" - effectmod = "lengthened" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/camera/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You feel time slow down...") - if(do_after(user, 30, target = user)) - new /obj/effect/timestop(get_turf(user), 2, 50, list(user)) - return 900 - -/obj/item/slime_extract/rainbow - name = "rainbow slime extract" - icon_state = "rainbow slime extract" - effectmod = "hyperchromatic" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. - research = SLIME_RESEARCH_TIER_RAINBOW - -/obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.dna.features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") - user.updateappearance(mutcolor_update=1) - species.update_glow(user) - to_chat(user, "You feel different...") - return 100 - - if(SLIME_ACTIVATE_MAJOR) - var/chosen = pick(subtypesof(/obj/item/slime_extract)) - var/obj/item/O = new chosen(null) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - -////Slime-derived potions/// - -/** -* #Slime potions -* -* Feed slimes potions either by hand or using the slime console. -* -* Slime potions either augment the slime's behavior, its extract output, or its intelligence. These all come either from extract effects or cross cores. -* A few of the more powerful ones can modify someone's equipment or gender. -* New ones should probably be accessible only through cross cores as all the normal core types already have uses. Rule of thumb is 'stronger effects go in cross cores'. -*/ - -/obj/item/slimepotion - name = "slime potion" - desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." - w_class = WEIGHT_CLASS_BULKY - -/obj/item/slimepotion/afterattack(obj/item/reagent_containers/target, mob/user , proximity) - . = ..() - if(!proximity) - return - if (istype(target)) - to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb." ) - return - -/obj/item/slimepotion/slime/docility - name = "docility potion" - desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potsilver" - -/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The potion only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.rabid) //Stops being rabid, but doesn't become truly docile. - to_chat(M, "You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.") - to_chat(user, "You feed the slime the potion, calming its rabid rage.") - M.rabid = FALSE - qdel(src) - return - M.docile = 1 - M.set_nutrition(700) - to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") - to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") - var/newname = sanitize_name(stripped_input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime", MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - M.name = newname - M.real_name = newname - qdel(src) - -/obj/item/slimepotion/slime/sentience - name = "intelligence potion" - desc = "A miraculous chemical mix that grants human like intelligence to living beings." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpink" - var/list/not_interested = list() - var/being_used = FALSE - var/sentience_type = SENTIENCE_ORGANIC - -/obj/item/slimepotion/slime/sentience/attack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled - to_chat(user, "[M] is already too intelligent for this to work!") - return - if(M.stat) - to_chat(user, "[M] is dead!") - return - var/mob/living/simple_animal/SM = M - if(SM.sentience_type != sentience_type) - to_chat(user, "[src] won't work on [SM].") - return - - to_chat(user, "You offer [src] to [SM]...") - being_used = TRUE - - var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - SM.key = C.key - SM.mind.enslave_mind_to_creator(user) - SM.sentience_act() - to_chat(SM, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!") - to_chat(SM, "You are grateful to be self aware and owe [user.real_name] a great debt. Serve [user.real_name], and assist [user.p_them()] in completing [user.p_their()] goals at any cost.") - if(SM.flags_1 & HOLOGRAM_1) //Check to see if it's a holodeck creature - to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.") - to_chat(user, "[SM] accepts [src] and suddenly becomes attentive and aware. It worked!") - SM.copy_languages(user) - after_success(user, SM) - qdel(src) - else - to_chat(user, "[SM] looks interested for a moment, but then looks back down. Maybe you should try again later.") - being_used = FALSE - ..() - -/obj/item/slimepotion/slime/sentience/proc/after_success(mob/living/user, mob/living/simple_animal/SM) - return - -/obj/item/slimepotion/slime/sentience/nuclear - name = "syndicate intelligence potion" - desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems." - -/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM) - var/obj/item/implant/radio/syndicate/imp = new(src) - imp.implant(SM, user) - - SM.access_card = new /obj/item/card/id/syndicate(SM) - ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/obj/item/slimepotion/transference - name = "consciousness transference potion" - desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potorange" - var/prompted = 0 - var/animal_type = SENTIENCE_ORGANIC - -/obj/item/slimepotion/transference/afterattack(mob/living/M, mob/user, proximity) - if(!proximity) - return - if(prompted || !ismob(M)) - return - if(!isanimal(M) || M.ckey) //much like sentience, these will not work on something that is already player controlled - to_chat(user, "[M] already has a higher consciousness!") - return ..() - if(M.stat) - to_chat(user, "[M] is dead!") - return ..() - var/mob/living/simple_animal/SM = M - if(SM.sentience_type != animal_type) - to_chat(user, "You cannot transfer your consciousness to [SM]." ) - return ..() - var/jb = is_banned_from(user.ckey, ROLE_MIND_TRANSFER) - if(QDELETED(src) || QDELETED(M) || QDELETED(user)) - return - - if(jb) - to_chat(user, "Your mind goes blank as you attempt to use the potion.") - return - - prompted = 1 - if(alert("This will permanently transfer your consciousness to [SM]. Are you sure you want to do this?",,"Yes","No")=="No") - prompted = 0 - return - - to_chat(user, "You drink the potion then place your hands on [SM]...") - - - user.mind.transfer_to(SM) - SM.faction = user.faction.Copy() - SM.sentience_act() //Same deal here as with sentience - user.death() - to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]!") - to_chat(SM, "You are now [SM]. Your allegiances, alliances, and role is still the same as it was prior to consciousness transfer!") - SM.name = "[user.real_name]" - qdel(src) - -/obj/item/slimepotion/slime/steroid - name = "slime steroid" - desc = "A potent chemical mix that will cause a baby slime to generate more extract." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potred" - -/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M))//If target is not a slime. - to_chat(user, "The steroid only works on baby slimes!") - return ..() - if(M.is_adult) //Can't steroidify adults - to_chat(user, "Only baby slimes can use the steroid!") - return - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.cores >= 5) - to_chat(user, "The slime already has the maximum amount of extract!") - return - - to_chat(user, "You feed the slime the steroid. It will now produce one more extract.") - M.cores++ - qdel(src) - -/obj/item/slimepotion/enhancer - name = "extract enhancer" - desc = "A potent chemical mix that will give a slime extract an additional use." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpurple" - -/obj/item/slimepotion/slime/stabilizer - name = "slime stabilizer" - desc = "A potent chemical mix that will reduce the chance of a slime mutating." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potcyan" - -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The stabilizer only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.mutation_chance == 0) - to_chat(user, "The slime already has no chance of mutating!") - return - - to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") - M.mutation_chance = clamp(M.mutation_chance-15,0,100) - qdel(src) - -/obj/item/slimepotion/slime/mutator - name = "slime mutator" - desc = "A potent chemical mix that will increase the chance of a slime mutating." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potgreen" - -/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The mutator only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.mutator_used) - to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!") - return - if(M.mutation_chance == 100) - to_chat(user, "The slime is already guaranteed to mutate!") - return - - to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") - M.mutation_chance = clamp(M.mutation_chance+12,0,100) - M.mutator_used = TRUE - qdel(src) - -/obj/item/slimepotion/speed - name = "slime speed potion" - desc = "A potent chemical mix that will reduce the slowdown from any item." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potyellow" - -/obj/item/slimepotion/speed/afterattack(obj/C, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!istype(C)) - to_chat(user, "The potion can only be used on items or vehicles!") - return - if(isitem(C)) - var/obj/item/I = C - if(I.slowdown <= 0.25 || I.obj_flags & IMMUTABLE_SLOW) - to_chat(user, "The [C] can't be made any faster!") - return ..() - I.slowdown = 0.25 - - if(istype(C, /obj/vehicle)) - var/obj/vehicle/V = C - var/datum/component/riding/R = V.GetComponent(/datum/component/riding) - if(R) - var/vehicle_speed_mod = round(CONFIG_GET(number/movedelay/run_delay) * 0.85, 0.01) - if(R.vehicle_move_delay <= vehicle_speed_mod) - to_chat(user, "The [C] can't be made any faster!") - return ..() - R.vehicle_move_delay = vehicle_speed_mod - - to_chat(user, "You slather the red gunk over the [C], making it faster.") - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) - qdel(src) - -/obj/item/slimepotion/fireproof - name = "slime chill potion" - desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potblue" - resistance_flags = FIRE_PROOF - var/uses = 3 - -/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!uses) - qdel(src) - return - if(!istype(C)) - to_chat(user, "The potion can only be used on clothing!") - return - if(C.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) - to_chat(user, "The [C] is already fireproof!") - return - to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") - C.name = "fireproofed [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) - C.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - C.heat_protection = C.body_parts_covered - C.resistance_flags |= FIRE_PROOF - uses -- - if(!uses) - qdel(src) - -/obj/item/slimepotion/genderchange - name = "gender change potion" - desc = "An interesting chemical mix that changes the biological gender of what its applied to. Cannot be used on things that lack gender entirely." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potlightpink" - -/obj/item/slimepotion/genderchange/attack(mob/living/L, mob/user) - if(!istype(L) || L.stat == DEAD) - to_chat(user, "The potion can only be used on living things!") - return - - if(L.gender != MALE && L.gender != FEMALE) - to_chat(user, "The potion can only be used on gendered things!") - return - - if(L.gender == MALE) - L.gender = FEMALE - L.visible_message("[L] suddenly looks more feminine!", "You suddenly feel more feminine!") - else - L.gender = MALE - L.visible_message("[L] suddenly looks more masculine!", "You suddenly feel more masculine!") - L.regenerate_icons() - qdel(src) - -/obj/item/slimepotion/slime/renaming - name = "renaming potion" - desc = "A potion that allows a self-aware being to change what name it subconciously presents to the world." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potgreen" - - var/being_used = FALSE - -/obj/item/slimepotion/slime/renaming/attack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!M.ckey) //only works on animals that aren't player controlled - to_chat(user, "[M] is not self aware, and cannot pick its own name.") - return - - being_used = TRUE - - to_chat(user, "You offer [src] to [user]...") - - var/new_name = stripped_input(M, "What would you like your name to be?", "Input a name", M.real_name, MAX_NAME_LEN) - - if(!new_name || QDELETED(src) || QDELETED(M) || new_name == M.real_name || !M.Adjacent(user)) - being_used = FALSE - return - - M.visible_message("[M] has a new name, [new_name].", "Your old name of [M.real_name] fades away, and your new name [new_name] anchors itself in your mind.") - message_admins("[ADMIN_LOOKUPFLW(user)] used [src] on [ADMIN_LOOKUPFLW(M)], letting them rename themselves into [new_name].") - - // pass null as first arg to not update records or ID/PDA - M.fully_replace_character_name(null, new_name) - - qdel(src) - -/obj/item/slimepotion/slime/slimeradio - name = "bluespace radio potion" - desc = "A strange chemical that grants those who ingest it the ability to broadcast and receive subscape radio waves." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potgrey" - -/obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user) - if(!ismob(M)) - return - if(!isanimal(M)) - to_chat(user, "[M] is too complex for the potion!") - return - if(M.stat) - to_chat(user, "[M] is dead!") - return - - to_chat(user, "You feed the potion to [M].") - to_chat(M, "Your mind tingles as you are fed the potion. You can hear radio waves now!") - var/obj/item/implant/radio/slime/imp = new(src) - imp.implant(M, user) - qdel(src) - -///Definitions for slime products that don't have anywhere else to go (Floor tiles, blueprints). - -/obj/item/stack/tile/bluespace - name = "bluespace floor tile" - singular_name = "floor tile" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds." - icon_state = "tile-bluespace" - item_state = "tile-bluespace" - w_class = WEIGHT_CLASS_NORMAL - force = 6 - custom_materials = list(/datum/material/iron=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags_1 = CONDUCT_1 - max_amount = 60 - turf_type = /turf/open/floor/bluespace - - -/obj/item/stack/tile/sepia - name = "sepia floor tile" - singular_name = "floor tile" - desc = "Time seems to flow very slowly around these tiles." - icon_state = "tile-sepia" - item_state = "tile-sepia" - w_class = WEIGHT_CLASS_NORMAL - force = 6 - custom_materials = list(/datum/material/iron=500) - throwforce = 10 - throw_speed = 0.1 - throw_range = 28 - flags_1 = CONDUCT_1 - max_amount = 60 - turf_type = /turf/open/floor/sepia - - -/obj/item/areaeditor/blueprints/slime - name = "cerulean prints" - desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console." - color = "#2956B2" - -/obj/item/areaeditor/blueprints/slime/edit_area() - ..() - var/area/A = get_area(src) - for(var/turf/T in A) - T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) - A.area_flags |= XENOBIOLOGY_COMPATIBLE - qdel(src) diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm deleted file mode 100644 index c5bfd1108202..000000000000 --- a/code/modules/surgery/core_removal.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/surgery/core_removal - name = "Core removal" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/extract_core) - target_mobtypes = list(/mob/living/simple_animal/slime) - possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) - lying_required = FALSE - ignore_clothes = TRUE - -/datum/surgery/core_removal/can_start(mob/user, mob/living/target) - if(target.stat == DEAD) - return 1 - return 0 - -//extract brain -/datum/surgery_step/extract_core - name = "extract core" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 100) - time = 16 - -/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, "You begin to extract a core from [target]...", - "[user] begins to extract a core from [target].", - "[user] begins to extract a core from [target].") - -/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/simple_animal/slime/slime = target - if(slime.cores > 0) - slime.cores-- - display_results(user, target, "You successfully extract a core from [target]. [slime.cores] core\s remaining.", - "[user] successfully extracts a core from [target]!", - "[user] successfully extracts a core from [target]!") - - new slime.coretype(slime.loc) - - if(slime.cores <= 0) - slime.icon_state = "[slime.colour] baby slime dead-nocore" - return ..() - else - return 0 - else - to_chat(user, "There aren't any cores left in [target]!") - return ..() diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 0e0248162fc8..f16ad0055056 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -13,8 +13,6 @@ /turf/template_noop, //Never meant to be created, errors out the ass for mobcode reasons /mob/living/carbon, - //And another - /obj/item/slimecross/recurring, //This should be obvious /obj/machinery/doomsday_device, //Template type diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 4bfe534940f1..ef38d21a7740 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1506,15 +1506,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/clothing/glasses/thermal/syndi cost = 4 -/datum/uplink_item/device_tools/potion - name = "Syndicate Sentience Potion" - item = /obj/item/slimepotion/slime/sentience/nuclear - desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \ - Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." - cost = 4 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) - restricted = TRUE - /datum/uplink_item/device_tools/guerillagloves name = "Guerilla Gloves" desc = "A pair of highly robust combat gripper gloves that excels at performing takedowns at close range, with an added lining of insulation. Careful not to hit a wall!" diff --git a/shiptest.dme b/shiptest.dme index 87d8ceed34a0..529ab2cfb100 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -497,7 +497,6 @@ #include "code\datums\components\construction.dm" #include "code\datums\components\creamed.dm" #include "code\datums\components\deadchat_control.dm" -#include "code\datums\components\dejavu.dm" #include "code\datums\components\deployable.dm" #include "code\datums\components\dooropendeathproc.dm" #include "code\datums\components\earprotection.dm" @@ -1839,7 +1838,6 @@ #include "code\modules\awaymissions\mission_code\caves.dm" #include "code\modules\awaymissions\mission_code\centcomAway.dm" #include "code\modules\awaymissions\mission_code\challenge.dm" -#include "code\modules\awaymissions\mission_code\moonoutpost19.dm" #include "code\modules\awaymissions\mission_code\murderdome.dm" #include "code\modules\awaymissions\mission_code\research.dm" #include "code\modules\awaymissions\mission_code\snowdin.dm" @@ -1900,7 +1898,6 @@ #include "code\modules\cargo\bounties\reagent.dm" #include "code\modules\cargo\bounties\science.dm" #include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\slime.dm" #include "code\modules\cargo\bounties\special.dm" #include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\gear.dm" @@ -2179,7 +2176,6 @@ #include "code\modules\food_and_drinks\kitchen_machinery\grill.dm" #include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" #include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" #include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" #include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" #include "code\modules\food_and_drinks\recipes\drinks_recipes.dm" @@ -2853,7 +2849,6 @@ #include "code\modules\movespeed\modifiers\misc.dm" #include "code\modules\movespeed\modifiers\mobs.dm" #include "code\modules\movespeed\modifiers\reagent.dm" -#include "code\modules\movespeed\modifiers\status_effects.dm" #include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\ninja_event.dm" @@ -3142,7 +3137,6 @@ #include "code\modules\reagents\chemistry\recipes\medicine.dm" #include "code\modules\reagents\chemistry\recipes\others.dm" #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" #include "code\modules\reagents\chemistry\recipes\special.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" @@ -3241,27 +3235,6 @@ #include "code\modules\research\techweb\_techweb.dm" #include "code\modules\research\techweb\_techweb_node.dm" #include "code\modules\research\techweb\all_nodes.dm" -#include "code\modules\research\xenobiology\xenobio_camera.dm" -#include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" -#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" -#include "code\modules\research\xenobiology\crossbreeding\_misc.dm" -#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" -#include "code\modules\research\xenobiology\crossbreeding\_potions.dm" -#include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" -#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" -#include "code\modules\research\xenobiology\crossbreeding\burning.dm" -#include "code\modules\research\xenobiology\crossbreeding\charged.dm" -#include "code\modules\research\xenobiology\crossbreeding\chilling.dm" -#include "code\modules\research\xenobiology\crossbreeding\consuming.dm" -#include "code\modules\research\xenobiology\crossbreeding\industrial.dm" -#include "code\modules\research\xenobiology\crossbreeding\mutative.dm" -#include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" -#include "code\modules\research\xenobiology\crossbreeding\recurring.dm" -#include "code\modules\research\xenobiology\crossbreeding\regenerative.dm" -#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm" -#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm" -#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" #include "code\modules\ruins\rockplanet_ruin_code.dm" #include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm" #include "code\modules\ruins\icemoonruin_code\library.dm" @@ -3335,7 +3308,6 @@ #include "code\modules\surgery\bone_repair.dm" #include "code\modules\surgery\brain_surgery.dm" #include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\coronary_bypass.dm" #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\experimental_dissection.dm" From cd88cfe298a12c116aed69e8e142cfcf888a96bd Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 18 Oct 2024 04:05:17 -0500 Subject: [PATCH 25/25] Automatic changelog generation for PR #3527 [ci skip] --- html/changelogs/AutoChangeLog-pr-3527.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3527.yml diff --git a/html/changelogs/AutoChangeLog-pr-3527.yml b/html/changelogs/AutoChangeLog-pr-3527.yml new file mode 100644 index 000000000000..bdcc4553c462 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3527.yml @@ -0,0 +1,4 @@ +author: Erikafox +changes: + - {rscdel: Xenobiology (minus slimes)} +delete-after: true