diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index fdfec5e8ca08..dc49d2c6f02c 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,6 +1,6 @@ // tgstation-server DMAPI -#define TGS_DMAPI_VERSION "7.0.2" +#define TGS_DMAPI_VERSION "7.1.0" // All functions and datums outside this document are subject to change with any version and should not be relied on. @@ -50,6 +50,13 @@ #endif +#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 +#endif +#define TGS_FILE2TEXT_NATIVE file2text +#endif + // EVENT CODES /// Before a reboot mode change, extras parameters are the current and new reboot mode enums. @@ -489,6 +496,16 @@ /// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsChatChannelInfo() return + +/** + * Trigger an event in TGS. Requires TGS version >= 6.3.0. Returns [TRUE] if the event was triggered successfully, [FALSE] otherwise. This function may sleep! + * + * event_name - The name of the event to trigger + * parameters - Optional list of string parameters to pass as arguments to the event script. The first parameter passed to a script will always be the running game's directory followed by these parameters. + * wait_for_completion - If set, this function will not return until the event has run to completion. + */ +/world/proc/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + return /* The MIT License diff --git a/code/game/objects/structures/reagent_dispensers.dm b/code/game/objects/structures/reagent_dispensers.dm index 1981dcaba569..a89f35ce38f3 100644 --- a/code/game/objects/structures/reagent_dispensers.dm +++ b/code/game/objects/structures/reagent_dispensers.dm @@ -5,6 +5,7 @@ icon_state = "watertank" density = TRUE anchored = FALSE + drag_delay = 1 health = 100 // Can be destroyed in 2-4 slashes. flags_atom = CAN_BE_SYRINGED wrenchable = TRUE @@ -432,6 +433,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "peppertank" anchored = TRUE + drag_delay = 3 wrenchable = FALSE density = FALSE amount_per_transfer_from_this = 45 @@ -445,6 +447,7 @@ icon_state = "water_cooler" possible_transfer_amounts = null anchored = TRUE + drag_delay = 3 chemical = "water" /obj/structure/reagent_dispensers/water_cooler/walk_past @@ -460,6 +463,7 @@ icon_state = "beertankTEMP" amount_per_transfer_from_this = 10 chemical = "beer" + drag_delay = 3 /obj/structure/reagent_dispensers/beerkeg/alt icon_state = "beertank_alt" @@ -474,6 +478,7 @@ icon_state = "virusfoodtank" amount_per_transfer_from_this = 10 anchored = TRUE + drag_delay = 3 wrenchable = FALSE density = FALSE chemical = "virusfood" diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm index d09b1984420e..3b41b2db02c7 100644 --- a/code/modules/clothing/under/marine_uniform.dm +++ b/code/modules/clothing/under/marine_uniform.dm @@ -988,7 +988,7 @@ /obj/item/clothing/under/marine/cbrn //CBRN MOPP suit name = "\improper M3 MOPP suit" - desc = "M3 MOPP suits are specially designed and engineered to protect the wearer from unshielded exposure to any Chemical, Biological, Radiological, or Nuclear (CBRN) threats in the field. Despite somewhat resembling commonplace synthetic rubber HAZMAT suits, the Venlar composition provides a significantly more dense and durable baseline material, allowing for modifications without the loss of its air-tight nature. The wearer’s comfort has been significantly taken into consideration, with the suit providing sufficient freedom of movement for even delicate maneuvers and movements once it is donned. As the sealed environment retains many issues from the past, measures have been taken to significantly reduce the suit's passive heat absorption and increase internal absorbance through linings, as well as the capability to fully integrate with external cooling, air cycling, and other life support systems. Strips of M11 detector paper are included with each suit, designed to be slotted into the dominant arm of the wearer’s protective suit, the non-dominant wrist, and then back to the knee, providing at-a-glance warning signs across alternating sides of the body while working. The arm and knee markers are intended to be on the user's dominant The papers change color upon contact with harmful chemical agents, displaying a clear white initially and turning red when activated. The suit has a recommended lifespan of twenty-four hours once contact with a toxic environment is made, but depending on the severity this can be shortened to eight hours or less. Beyond that point, the accuracy of the detector papers deteriorates significantly, as does the protection of the suit itself." + desc = "M3 MOPP suits are specially designed and engineered to protect the wearer from unshielded exposure to any Chemical, Biological, Radiological, or Nuclear (CBRN) threats in the field. The suit has a recommended lifespan of twenty-four hours once contact with a toxic environment is made, but depending on the severity this can be shortened to eight hours or less." desc_lore = "Since the outbreak of the New Earth Plague in 2157 and the subsequent Interstellar Commerce Commission (ICC) sanctioned decontamination of the colony and its 40 million inhabitants, the abandoned colony has been left under a strict quarantine blockade to prevent any potential scavengers from spreading what’s left of the highly-durable airborne flesh-eating bacteria. Following those events, the three major superpowers have been investing heavily in the development and procurement of CBRN equipment, in no small part due to the extensive damage that the plague and other similar bioweapons could do. The \"Marine 70\" upgrade package and the launch of the M3 pattern armor series saw the first M3-M prototypes approved for CBRN usage." flags_atom = NO_NAME_OVERRIDE|NO_SNOW_TYPE icon_state = "cbrn" diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 8be96f27404a..15622228e91f 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -166,3 +166,11 @@ var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) return api.Visibility() + +/world/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + if(!istype(parameters, /list)) + parameters = list() + + return api.TriggerEvent(event_name, parameters, wait_for_completion) diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 07ce3b684584..898516f12486 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -17,7 +17,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) world.sleep_offline = FALSE // https://www.byond.com/forum/post/2894866 del(world) world.sleep_offline = FALSE // just in case, this is BYOND after all... - sleep(1) + sleep(world.tick_lag) TGS_DEBUG_LOG("BYOND DIDN'T TERMINATE THE WORLD!!! TICK IS: [world.time], sleep_offline: [world.sleep_offline]") /datum/tgs_api/latest @@ -69,3 +69,6 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/Visibility() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/TriggerEvent(event_name, list/parameters, wait_for_completion) + return FALSE diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index 945e2e411767..7c87922750b9 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -181,7 +181,7 @@ var/json = json_encode(data) while(requesting_new_port && !override_requesting_new_port) - sleep(1) + sleep(world.tick_lag) //we need some port open at this point to facilitate return communication if(!world.port) @@ -209,7 +209,7 @@ requesting_new_port = FALSE while(export_lock) - sleep(1) + sleep(world.tick_lag) export_lock = TRUE last_interop_response = null @@ -217,7 +217,7 @@ text2file(json, server_commands_json_path) for(var/I = 0; I < EXPORT_TIMEOUT_DS && !last_interop_response; ++I) - sleep(1) + sleep(world.tick_lag) if(!last_interop_response) TGS_ERROR_LOG("Failed to get export result for: [json]") diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 616263098fd3..f4806f7adb97 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.8.0" +"5.9.0" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index 1c7d67d20cdf..92c7a8388a71 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -14,6 +14,7 @@ #define DMAPI5_BRIDGE_COMMAND_KILL 4 #define DMAPI5_BRIDGE_COMMAND_CHAT_SEND 5 #define DMAPI5_BRIDGE_COMMAND_CHUNK 6 +#define DMAPI5_BRIDGE_COMMAND_EVENT 7 #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" #define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" @@ -34,6 +35,7 @@ #define DMAPI5_BRIDGE_PARAMETER_VERSION "version" #define DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE "chatMessage" #define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel" +#define DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION "eventInvocation" #define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort" #define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation" @@ -81,6 +83,7 @@ #define DMAPI5_TOPIC_COMMAND_SEND_CHUNK 9 #define DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK 10 #define DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST 11 +#define DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT 12 #define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" @@ -116,3 +119,9 @@ #define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" #define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" #define DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY "adminOnly" + +#define DMAPI5_EVENT_ID "eventId" + +#define DMAPI5_EVENT_INVOCATION_NAME "eventName" +#define DMAPI5_EVENT_INVOCATION_PARAMETERS "parameters" +#define DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION "notifyCompletion" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index a5c064a8eaf1..9b64931f8f92 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -27,6 +27,8 @@ var/chunked_requests = 0 var/list/chunked_topics = list() + var/list/pending_events = list() + var/detached = FALSE /datum/tgs_api/v5/New() @@ -125,7 +127,7 @@ TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") logged = TRUE - sleep(1) + sleep(world.tick_lag) TGS_DEBUG_LOG("RequireInitialBridgeResponse: Passed") @@ -249,6 +251,40 @@ WaitForReattach(TRUE) return chat_channels.Copy() +/datum/tgs_api/v5/TriggerEvent(event_name, list/parameters, wait_for_completion) + RequireInitialBridgeResponse() + WaitForReattach(TRUE) + + if(interop_version.minor < 9) + TGS_WARNING_LOG("Interop version too low for custom events!") + return FALSE + + var/str_parameters = list() + for(var/i in parameters) + str_parameters += "[i]" + + var/list/response = Bridge(DMAPI5_BRIDGE_COMMAND_EVENT, list(DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION = list(DMAPI5_EVENT_INVOCATION_NAME = event_name, DMAPI5_EVENT_INVOCATION_PARAMETERS = str_parameters, DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION = wait_for_completion))) + if(!response) + return FALSE + + var/event_id = response[DMAPI5_EVENT_ID] + if(!event_id) + return FALSE + + TGS_DEBUG_LOG("Created event ID: [event_id]") + if(!wait_for_completion) + return TRUE + + TGS_DEBUG_LOG("Waiting for completion of event ID: [event_id]") + + while(!pending_events[event_id]) + sleep(world.tick_lag) + + TGS_DEBUG_LOG("Completed wait on event ID: [event_id]") + pending_events -= event_id + + return TRUE + /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) TGS_DEBUG_LOG("DecodeChannels()") var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index a0ab35987670..0c5e701a32b6 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -65,7 +65,7 @@ if(detached) // Wait up to one minute for(var/i in 1 to 600) - sleep(1) + sleep(world.tick_lag) if(!detached && (!require_channels || length(chat_channels))) break @@ -77,8 +77,11 @@ /datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) 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) + TGS_DEBUG_LOG("Bridge request complete") + if(!export_response) TGS_ERROR_LOG("Failed bridge request: [bridge_request]") return @@ -88,7 +91,7 @@ TGS_ERROR_LOG("Failed bridge request, missing content!") return - var/response_json = file2text(content) + var/response_json = TGS_FILE2TEXT_NATIVE(content) if(!response_json) TGS_ERROR_LOG("Failed bridge request, failed to load content!") return diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index 05e6c4e1b214..e66edc27206a 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -176,6 +176,9 @@ var/list/reattach_response = TopicResponse(error_message) reattach_response[DMAPI5_PARAMETER_CUSTOM_COMMANDS] = ListCustomCommands() reattach_response[DMAPI5_PARAMETER_TOPIC_PORT] = GetTopicPort() + + pending_events.Cut() + return reattach_response if(DMAPI5_TOPIC_COMMAND_SEND_CHUNK) @@ -276,6 +279,15 @@ TGS_WORLD_ANNOUNCE(message) return TopicResponse() + if(DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT) + var/event_id = topic_parameters[DMAPI5_EVENT_ID] + if (!istext(event_id)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_ID]") + + TGS_DEBUG_LOG("Completing event ID [event_id]...") + pending_events[event_id] = TRUE + return TopicResponse() + return TopicResponse("Unknown command: [command]") /datum/tgs_api/v5/proc/WorldBroadcast(message) diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index d531d4b7b9dd..237207fdfd05 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -14,6 +14,7 @@ #undef DMAPI5_BRIDGE_COMMAND_KILL #undef DMAPI5_BRIDGE_COMMAND_CHAT_SEND #undef DMAPI5_BRIDGE_COMMAND_CHUNK +#undef DMAPI5_BRIDGE_COMMAND_EVENT #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS @@ -34,6 +35,7 @@ #undef DMAPI5_BRIDGE_PARAMETER_VERSION #undef DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE #undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL +#undef DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION #undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT #undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION @@ -81,6 +83,7 @@ #undef DMAPI5_TOPIC_COMMAND_SEND_CHUNK #undef DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK #undef DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST +#undef DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT #undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE #undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND @@ -116,3 +119,9 @@ #undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME #undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT #undef DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY + +#undef DMAPI5_EVENT_ID + +#undef DMAPI5_EVENT_INVOCATION_NAME +#undef DMAPI5_EVENT_INVOCATION_PARAMETERS +#undef DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION diff --git a/html/changelogs/AutoChangeLog-pr-5165.yml b/html/changelogs/AutoChangeLog-pr-5165.yml deleted file mode 100644 index afedcb496a37..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5165.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - code_imp: "Updated mapping backend from /tg/ upstream." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5432.yml b/html/changelogs/AutoChangeLog-pr-5432.yml deleted file mode 100644 index 73d5a2476ff2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5432.yml +++ /dev/null @@ -1,16 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - rscadd: "Added a new ability to the predalien \"Feral Rush\" that increases it's armor and speed for a short duration." - - rscadd: "Added two new abilities to the predalien \"Feral Frenzy\" and a toggle. The predalien can now switch between a single target GUT and an AOE one, both of which has damage that scale with your kills." - - rscdel: "Removed the predaliens gib ability" - - rscdel: "Removed the predaliens \"pounce\" ability" - - rscdel: "Removed the predaliens \"Ground Smash\" ability" - - balance: "Predalien no longer has plasma costs, or plasma." - - balance: "The Plasma Rifle, which is ONLY used to hunt abominations now has a higher ROF and has incin bullets." - - spellcheck: "Re-wrote the predalien text to be more up to date and remove missinformation" - - qol: "Everyone can see how many kills the predalien has by examining it." - - rscadd: "Added a \"Feral Smash\" ability that lets you grab somebody and smash them to the ground, this scales with kills and is a devastating attack." - - balance: "Removed screenshake from predalien's screech" - - balance: "Predalien removes fire stacks faster." - - bugfix: "Girders are now slashable by very_sharp_claws instead of just having a queen chack" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5699.yml b/html/changelogs/AutoChangeLog-pr-5699.yml deleted file mode 100644 index 40ed67292072..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5699.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - maptweak: "split each Hallway area port and starboard into three areas.(fore midship aft)" - - maptweak: "change the area around north and south west staircase to remove emergency shutters." - - maptweak: "change the area west of squad preparation room to remove emergency shutter." - - maptweak: "change the area west of lower engi to make emergency shutter be at the frontier of the area." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5772.yml b/html/changelogs/AutoChangeLog-pr-5772.yml deleted file mode 100644 index 1d592106b2c6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5772.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - balance: "Increased same tile weed expansion delay for queen from 7s to 10s" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5773.yml b/html/changelogs/AutoChangeLog-pr-5773.yml deleted file mode 100644 index 702fda68396b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5773.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed Xenomorphs not having their caste's tackle duration values applied to them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5775.yml b/html/changelogs/AutoChangeLog-pr-5775.yml deleted file mode 100644 index 45218da2d90c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5775.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed the search function of TGUI input lists." - - qol: "Made the TGUI input list search bar automatically focus when toggled." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5778.yml b/html/changelogs/AutoChangeLog-pr-5778.yml deleted file mode 100644 index 991c5e794906..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5778.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AtticusRezzer" -delete-after: True -changes: - - bugfix: "Fixed the incorrect area flag in lifeboats allowing tunneling" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5782.yml b/html/changelogs/AutoChangeLog-pr-5782.yml new file mode 100644 index 000000000000..fce959009947 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5782.yml @@ -0,0 +1,4 @@ +author: "TopHatPenguin" +delete-after: True +changes: + - rscdel: "Removes part of MOPP suit desc." \ No newline at end of file diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml index f54127866f02..386c13c0cf92 100644 --- a/html/changelogs/archive/2024-02.yml +++ b/html/changelogs/archive/2024-02.yml @@ -304,3 +304,45 @@ - rscadd: CIC can now view helmet cameras of Command Staff. Literally 1984 iloveloopers: - qol: Autolathes are now significantly faster. +2024-02-23: + AtticusRezzer: + - bugfix: Fixed the incorrect area flag in lifeboats allowing tunneling + Drathek: + - balance: Increased same tile weed expansion delay for queen from 7s to 10s + Huffie56: + - maptweak: split each Hallway area port and starboard into three areas.(fore midship + aft) + - maptweak: change the area around north and south west staircase to remove emergency + shutters. + - maptweak: change the area west of squad preparation room to remove emergency shutter. + - maptweak: change the area west of lower engi to make emergency shutter be at the + frontier of the area. + InsaneRed: + - rscadd: Added a new ability to the predalien "Feral Rush" that increases it's + armor and speed for a short duration. + - rscadd: Added two new abilities to the predalien "Feral Frenzy" and a toggle. + The predalien can now switch between a single target GUT and an AOE one, both + of which has damage that scale with your kills. + - rscdel: Removed the predaliens gib ability + - rscdel: Removed the predaliens "pounce" ability + - rscdel: Removed the predaliens "Ground Smash" ability + - balance: Predalien no longer has plasma costs, or plasma. + - balance: The Plasma Rifle, which is ONLY used to hunt abominations now has a higher + ROF and has incin bullets. + - spellcheck: Re-wrote the predalien text to be more up to date and remove missinformation + - qol: Everyone can see how many kills the predalien has by examining it. + - rscadd: Added a "Feral Smash" ability that lets you grab somebody and smash them + to the ground, this scales with kills and is a devastating attack. + - balance: Removed screenshake from predalien's screech + - balance: Predalien removes fire stacks faster. + - bugfix: Girders are now slashable by very_sharp_claws instead of just having a + queen chack + SabreML: + - bugfix: Fixed the search function of TGUI input lists. + - qol: Made the TGUI input list search bar automatically focus when toggled. + - bugfix: Fixed Xenomorphs not having their caste's tackle duration values applied + to them. + fira: + - code_imp: Updated mapping backend from /tg/ upstream. + iloveloopers: + - qol: Reagent tanks can now be dragged faster.