From 495a38f8fbe4e068e797515d989e03aff1e42165 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 24 Nov 2023 01:04:20 +0000 Subject: [PATCH 01/25] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-504.yml | 4 -- html/changelogs/AutoChangeLog-pr-764.yml | 8 ---- html/changelogs/AutoChangeLog-pr-765.yml | 8 ---- html/changelogs/AutoChangeLog-pr-766.yml | 4 -- html/changelogs/AutoChangeLog-pr-768.yml | 5 --- html/changelogs/AutoChangeLog-pr-769.yml | 4 -- html/changelogs/AutoChangeLog-pr-771.yml | 4 -- html/changelogs/AutoChangeLog-pr-772.yml | 4 -- html/changelogs/AutoChangeLog-pr-773.yml | 5 --- html/changelogs/AutoChangeLog-pr-784.yml | 4 -- html/changelogs/AutoChangeLog-pr-786.yml | 4 -- html/changelogs/AutoChangeLog-pr-787.yml | 4 -- html/changelogs/AutoChangeLog-pr-788.yml | 5 --- html/changelogs/AutoChangeLog-pr-790.yml | 4 -- html/changelogs/AutoChangeLog-pr-793.yml | 4 -- html/changelogs/AutoChangeLog-pr-794.yml | 4 -- html/changelogs/AutoChangeLog-pr-795.yml | 4 -- html/changelogs/archive/2023-11.yml | 55 ++++++++++++++++++++++++ 18 files changed, 55 insertions(+), 79 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-504.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-764.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-765.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-766.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-768.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-769.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-771.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-772.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-773.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-784.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-786.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-787.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-788.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-790.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-793.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-794.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-795.yml diff --git a/html/changelogs/AutoChangeLog-pr-504.yml b/html/changelogs/AutoChangeLog-pr-504.yml deleted file mode 100644 index 2c3a0bcb2e3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-504.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LovliestPlant" -delete-after: True -changes: - - rscadd: "Adds links to any special rules or metaprotections to antag's objective panels." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-764.yml b/html/changelogs/AutoChangeLog-pr-764.yml deleted file mode 100644 index 8a41e1c0adc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-764.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - balance: "Transformation sting now lasts 8 minutes, down from permanent. However, the effect is paused for dead and stasis mobs, making it permanent SO LONG AS they stay dead or in stasis. The effect is also permanent if used on a monkey." - - balance: "Transformation sting now costs 33 chemicals, down from 50." - - balance: "Transformation sting now costs 2 dna points, down from 3." - - bugfix: "Transformation sting works on monkeys again." - - refactor: "Refactored a bit of human randomization." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-765.yml b/html/changelogs/AutoChangeLog-pr-765.yml deleted file mode 100644 index b0dee4bb57a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-765.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - bugfix: "The plasma river is about as deadly for animals as it is for humans." - - bugfix: "Golems can now wade in the plasma river unscathed." - - bugfix: "Undismemberable limbs will no longer be dismembered by the plasma river." - - balance: "Golems and plasmamen cannot become husked." - - image: "Robotic and Skeletal parts will remain distinct while the rest of the body is husked." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-766.yml b/html/changelogs/AutoChangeLog-pr-766.yml deleted file mode 100644 index 5f68fc311e2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-766.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - refactor: "Refactors how ethereals update their color when damaged." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-768.yml b/html/changelogs/AutoChangeLog-pr-768.yml deleted file mode 100644 index 5cf1a7ecd62..00000000000 --- a/html/changelogs/AutoChangeLog-pr-768.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "autolathe does not diminish materials from custom material items like toolboxes when printing them in bulk. Also does not gray out that item in the UI" - - bugfix: "autloathe correctly updates UI after inserting items into it" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-769.yml b/html/changelogs/AutoChangeLog-pr-769.yml deleted file mode 100644 index eb9509a7aa4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-769.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "aaaa1023" -delete-after: True -changes: - - qol: "adds pixel perfect 4x, 4.5x, and 5x" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-771.yml b/html/changelogs/AutoChangeLog-pr-771.yml deleted file mode 100644 index 0c02064c9b3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-771.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "vinylspiders" -delete-after: True -changes: - - bugfix: "fullupgrade chem dispensers will now spawn with all their chems" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-772.yml b/html/changelogs/AutoChangeLog-pr-772.yml deleted file mode 100644 index 07ed14a6044..00000000000 --- a/html/changelogs/AutoChangeLog-pr-772.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lizardqueenlexi" -delete-after: True -changes: - - bugfix: "Skillsoft's skillchip stations are now ADA-compliant (Astronauts with Disabilities Act). Paraplegic characters can now implant themselves with skillchips, the same as anyone else." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-773.yml b/html/changelogs/AutoChangeLog-pr-773.yml deleted file mode 100644 index 2b841d6dd8d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-773.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Y0SH1M4S73R" -delete-after: True -changes: - - rscadd: "Certain types of pens now function like you expect they would when inserted into a foam dart" - - qol: "Examining a foam dart closely will show you how to modify it, or what it is modified with" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-784.yml b/html/changelogs/AutoChangeLog-pr-784.yml deleted file mode 100644 index 2d911e132c8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-784.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RatFromTheJungle" -delete-after: True -changes: - - bugfix: "fixes punches doing like triple stamina damage, by removing a 2.6x multiplier." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-786.yml b/html/changelogs/AutoChangeLog-pr-786.yml deleted file mode 100644 index 9cb91ae6647..00000000000 --- a/html/changelogs/AutoChangeLog-pr-786.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Nerev4r" -delete-after: True -changes: - - bugfix: "Chameleon mutation is toggleable again." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-787.yml b/html/changelogs/AutoChangeLog-pr-787.yml deleted file mode 100644 index da74cef81fe..00000000000 --- a/html/changelogs/AutoChangeLog-pr-787.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TwistedSilicon" -delete-after: True -changes: - - bugfix: "Window damage overlays have been fixed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-788.yml b/html/changelogs/AutoChangeLog-pr-788.yml deleted file mode 100644 index e9429200cfc..00000000000 --- a/html/changelogs/AutoChangeLog-pr-788.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "jjpark-kb" -delete-after: True -changes: - - rscadd: "you can craft the gutlunch trough" - - qol: "you can fill the gutlunch trough with a mining bag" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-790.yml b/html/changelogs/AutoChangeLog-pr-790.yml deleted file mode 100644 index db441e24d90..00000000000 --- a/html/changelogs/AutoChangeLog-pr-790.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Smol42" -delete-after: True -changes: - - rscadd: "Added four acrador snouts." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-793.yml b/html/changelogs/AutoChangeLog-pr-793.yml deleted file mode 100644 index f375987f1c4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-793.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xander3359" -delete-after: True -changes: - - admin: "Remove \"Make AI\" from VV dropdown" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-794.yml b/html/changelogs/AutoChangeLog-pr-794.yml deleted file mode 100644 index 5575fc89378..00000000000 --- a/html/changelogs/AutoChangeLog-pr-794.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SyncIt21" -delete-after: True -changes: - - bugfix: "RCD can build directional windows on top of existing grills & without them." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-795.yml b/html/changelogs/AutoChangeLog-pr-795.yml deleted file mode 100644 index 01610a2bd18..00000000000 --- a/html/changelogs/AutoChangeLog-pr-795.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "jjpark-kb" -delete-after: True -changes: - - bugfix: "gutlunches now produce miner salve instead of milk, as well as the other reagents if fed the correct ore" \ No newline at end of file diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml index 9764f72e362..2241ce8267d 100644 --- a/html/changelogs/archive/2023-11.yml +++ b/html/changelogs/archive/2023-11.yml @@ -1164,3 +1164,58 @@ - code_imp: 'The currently operating rust-g version on a live server is posted to places like the runtime.log, in the same place where the revision information and any applicable test merges already were. /:cl:' +2023-11-24: + Jacquerel: + - bugfix: The plasma river is about as deadly for animals as it is for humans. + - bugfix: Golems can now wade in the plasma river unscathed. + - bugfix: Undismemberable limbs will no longer be dismembered by the plasma river. + - balance: Golems and plasmamen cannot become husked. + - image: Robotic and Skeletal parts will remain distinct while the rest of the body + is husked. + LovliestPlant: + - rscadd: Adds links to any special rules or metaprotections to antag's objective + panels. + Melbert: + - balance: Transformation sting now lasts 8 minutes, down from permanent. However, + the effect is paused for dead and stasis mobs, making it permanent SO LONG AS + they stay dead or in stasis. The effect is also permanent if used on a monkey. + - balance: Transformation sting now costs 33 chemicals, down from 50. + - balance: Transformation sting now costs 2 dna points, down from 3. + - bugfix: Transformation sting works on monkeys again. + - refactor: Refactored a bit of human randomization. + - refactor: Refactors how ethereals update their color when damaged. + Nerev4r: + - bugfix: Chameleon mutation is toggleable again. + RatFromTheJungle: + - bugfix: fixes punches doing like triple stamina damage, by removing a 2.6x multiplier. + Smol42: + - rscadd: Added four acrador snouts. + SyncIt21: + - bugfix: autolathe does not diminish materials from custom material items like + toolboxes when printing them in bulk. Also does not gray out that item in the + UI + - bugfix: autloathe correctly updates UI after inserting items into it + - bugfix: RCD can build directional windows on top of existing grills & without + them. + TwistedSilicon: + - bugfix: Window damage overlays have been fixed. + Xander3359: + - admin: Remove "Make AI" from VV dropdown + Y0SH1M4S73R: + - rscadd: Certain types of pens now function like you expect they would when inserted + into a foam dart + - qol: Examining a foam dart closely will show you how to modify it, or what it + is modified with + aaaa1023: + - qol: adds pixel perfect 4x, 4.5x, and 5x + jjpark-kb: + - bugfix: gutlunches now produce miner salve instead of milk, as well as the other + reagents if fed the correct ore + - rscadd: you can craft the gutlunch trough + - qol: you can fill the gutlunch trough with a mining bag + lizardqueenlexi: + - bugfix: Skillsoft's skillchip stations are now ADA-compliant (Astronauts with + Disabilities Act). Paraplegic characters can now implant themselves with skillchips, + the same as anyone else. + vinylspiders: + - bugfix: fullupgrade chem dispensers will now spawn with all their chems From bd0c91bbb4c376aaa9d422b56733bf0511ea90ad Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 11:45:14 +0300 Subject: [PATCH 02/25] [MIRROR] Converts more js files to jsx [MDB IGNORE] (#807) * Converts more js files to jsx (#79894) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> --- tgui/packages/tgui-panel/chat/{renderer.js => renderer.jsx} | 2 +- tgui/packages/tgui-panel/{index.js => index.jsx} | 0 .../tgui/stories/{Blink.stories.js => Blink.stories.jsx} | 0 .../stories/{BlockQuote.stories.js => BlockQuote.stories.jsx} | 0 tgui/packages/tgui/stories/{Box.stories.js => Box.stories.jsx} | 0 .../tgui/stories/{Button.stories.js => Button.stories.jsx} | 0 .../tgui/stories/{ByondUi.stories.js => ByondUi.stories.jsx} | 0 .../stories/{Collapsible.stories.js => Collapsible.stories.jsx} | 0 .../packages/tgui/stories/{Flex.stories.js => Flex.stories.jsx} | 0 .../tgui/stories/{Input.stories.js => Input.stories.jsx} | 0 .../stories/{LabeledList.stories.js => LabeledList.stories.jsx} | 0 .../tgui/stories/{Popper.stories.js => Popper.stories.jsx} | 0 .../stories/{ProgressBar.stories.js => ProgressBar.stories.jsx} | 0 .../tgui/stories/{Stack.stories.js => Stack.stories.jsx} | 0 .../tgui/stories/{Storage.stories.js => Storage.stories.jsx} | 0 .../packages/tgui/stories/{Tabs.stories.js => Tabs.stories.jsx} | 0 .../tgui/stories/{Themes.stories.js => Themes.stories.jsx} | 0 .../tgui/stories/{Tooltip.stories.js => Tooltip.stories.jsx} | 0 tgui/packages/tgui/stories/{common.js => common.jsx} | 0 19 files changed, 1 insertion(+), 1 deletion(-) rename tgui/packages/tgui-panel/chat/{renderer.js => renderer.jsx} (99%) rename tgui/packages/tgui-panel/{index.js => index.jsx} (100%) rename tgui/packages/tgui/stories/{Blink.stories.js => Blink.stories.jsx} (100%) rename tgui/packages/tgui/stories/{BlockQuote.stories.js => BlockQuote.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Box.stories.js => Box.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Button.stories.js => Button.stories.jsx} (100%) rename tgui/packages/tgui/stories/{ByondUi.stories.js => ByondUi.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Collapsible.stories.js => Collapsible.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Flex.stories.js => Flex.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Input.stories.js => Input.stories.jsx} (100%) rename tgui/packages/tgui/stories/{LabeledList.stories.js => LabeledList.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Popper.stories.js => Popper.stories.jsx} (100%) rename tgui/packages/tgui/stories/{ProgressBar.stories.js => ProgressBar.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Stack.stories.js => Stack.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Storage.stories.js => Storage.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Tabs.stories.js => Tabs.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Themes.stories.js => Themes.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Tooltip.stories.js => Tooltip.stories.jsx} (100%) rename tgui/packages/tgui/stories/{common.js => common.jsx} (100%) diff --git a/tgui/packages/tgui-panel/chat/renderer.js b/tgui/packages/tgui-panel/chat/renderer.jsx similarity index 99% rename from tgui/packages/tgui-panel/chat/renderer.js rename to tgui/packages/tgui-panel/chat/renderer.jsx index 7a528cd4fd7..5d6337148fb 100644 --- a/tgui/packages/tgui-panel/chat/renderer.js +++ b/tgui/packages/tgui-panel/chat/renderer.jsx @@ -11,7 +11,7 @@ import { COMBINE_MAX_MESSAGES, COMBINE_MAX_TIME_WINDOW, IMAGE_RETRY_DELAY, IMAGE import { render } from 'inferno'; import { canPageAcceptType, createMessage, isSameMessage } from './model'; import { highlightNode, linkifyNode } from './replaceInTextNode'; -import { Tooltip } from '../../tgui/components'; +import { Tooltip } from 'tgui/components'; const logger = createLogger('chatRenderer'); diff --git a/tgui/packages/tgui-panel/index.js b/tgui/packages/tgui-panel/index.jsx similarity index 100% rename from tgui/packages/tgui-panel/index.js rename to tgui/packages/tgui-panel/index.jsx diff --git a/tgui/packages/tgui/stories/Blink.stories.js b/tgui/packages/tgui/stories/Blink.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Blink.stories.js rename to tgui/packages/tgui/stories/Blink.stories.jsx diff --git a/tgui/packages/tgui/stories/BlockQuote.stories.js b/tgui/packages/tgui/stories/BlockQuote.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/BlockQuote.stories.js rename to tgui/packages/tgui/stories/BlockQuote.stories.jsx diff --git a/tgui/packages/tgui/stories/Box.stories.js b/tgui/packages/tgui/stories/Box.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Box.stories.js rename to tgui/packages/tgui/stories/Box.stories.jsx diff --git a/tgui/packages/tgui/stories/Button.stories.js b/tgui/packages/tgui/stories/Button.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Button.stories.js rename to tgui/packages/tgui/stories/Button.stories.jsx diff --git a/tgui/packages/tgui/stories/ByondUi.stories.js b/tgui/packages/tgui/stories/ByondUi.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/ByondUi.stories.js rename to tgui/packages/tgui/stories/ByondUi.stories.jsx diff --git a/tgui/packages/tgui/stories/Collapsible.stories.js b/tgui/packages/tgui/stories/Collapsible.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Collapsible.stories.js rename to tgui/packages/tgui/stories/Collapsible.stories.jsx diff --git a/tgui/packages/tgui/stories/Flex.stories.js b/tgui/packages/tgui/stories/Flex.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Flex.stories.js rename to tgui/packages/tgui/stories/Flex.stories.jsx diff --git a/tgui/packages/tgui/stories/Input.stories.js b/tgui/packages/tgui/stories/Input.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Input.stories.js rename to tgui/packages/tgui/stories/Input.stories.jsx diff --git a/tgui/packages/tgui/stories/LabeledList.stories.js b/tgui/packages/tgui/stories/LabeledList.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/LabeledList.stories.js rename to tgui/packages/tgui/stories/LabeledList.stories.jsx diff --git a/tgui/packages/tgui/stories/Popper.stories.js b/tgui/packages/tgui/stories/Popper.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Popper.stories.js rename to tgui/packages/tgui/stories/Popper.stories.jsx diff --git a/tgui/packages/tgui/stories/ProgressBar.stories.js b/tgui/packages/tgui/stories/ProgressBar.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/ProgressBar.stories.js rename to tgui/packages/tgui/stories/ProgressBar.stories.jsx diff --git a/tgui/packages/tgui/stories/Stack.stories.js b/tgui/packages/tgui/stories/Stack.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Stack.stories.js rename to tgui/packages/tgui/stories/Stack.stories.jsx diff --git a/tgui/packages/tgui/stories/Storage.stories.js b/tgui/packages/tgui/stories/Storage.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Storage.stories.js rename to tgui/packages/tgui/stories/Storage.stories.jsx diff --git a/tgui/packages/tgui/stories/Tabs.stories.js b/tgui/packages/tgui/stories/Tabs.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Tabs.stories.js rename to tgui/packages/tgui/stories/Tabs.stories.jsx diff --git a/tgui/packages/tgui/stories/Themes.stories.js b/tgui/packages/tgui/stories/Themes.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Themes.stories.js rename to tgui/packages/tgui/stories/Themes.stories.jsx diff --git a/tgui/packages/tgui/stories/Tooltip.stories.js b/tgui/packages/tgui/stories/Tooltip.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Tooltip.stories.js rename to tgui/packages/tgui/stories/Tooltip.stories.jsx diff --git a/tgui/packages/tgui/stories/common.js b/tgui/packages/tgui/stories/common.jsx similarity index 100% rename from tgui/packages/tgui/stories/common.js rename to tgui/packages/tgui/stories/common.jsx From 8718b689b10d41dad315508e973ee10efe6beaee Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:06:10 +0300 Subject: [PATCH 03/25] [MIRROR] Adds INTJ skillchip [MDB IGNORE] (#803) * Adds INTJ skillchip (#79902) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Jacquerel --- code/__DEFINES/traits/declarations.dm | 3 +++ code/_globalvars/lists/maintenance_loot.dm | 1 + code/_globalvars/traits/_traits.dm | 1 + code/datums/components/food/edible.dm | 10 ++++++++++ code/modules/library/skill_learning/skillchip.dm | 9 +++++++++ code/modules/mob/living/brain/brain_item.dm | 1 + .../living/carbon/human/species_types/abductors.dm | 11 ++++++----- code/modules/power/supermatter/supermatter.dm | 11 +++++++++-- code/modules/reagents/reagent_containers.dm | 5 ++++- code/modules/vending/games.dm | 3 ++- 10 files changed, 46 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index bb0a65fc5d2..bd63f013f85 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -212,6 +212,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Added to mob or mind, changes the icons of the fish shown in the minigame UI depending on the possible reward. #define TRAIT_REVEAL_FISH "reveal_fish" +/// Added to a mob, allows that mob to experience flavour-based moodlets when examining food +#define TRAIT_REMOTE_TASTING "remote_tasting" + /// Stops the mob from slipping on water, or banana peels, or pretty much anything that doesn't have [GALOSHES_DONT_HELP] set #define TRAIT_NO_SLIP_WATER "noslip_water" /// Stops the mob from slipping on permafrost ice (not any other ice) (but anything with [SLIDE_ICE] set) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index a54799b7bb1..05aa4e419a2 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -351,6 +351,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/disk/nuclear/fake = 1, /obj/item/disk/surgery/advanced_plastic_surgery = 1, /obj/item/skillchip/brainwashing = 1, + /obj/item/skillchip/intj = 1, /obj/item/tattoo_kit = 1, /obj/item/folder/ancient_paperwork = 1, ) = 1, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 7ec768e619a..8d445921fff 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -351,6 +351,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, "TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC, "TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER, + "TRAIT_REMOTE_TASTING" = TRAIT_REMOTE_TASTING, "TRAIT_RESEARCH_SCANNER" = TRAIT_RESEARCH_SCANNER, "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 1e724f0e404..9986b2a4d43 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -264,6 +264,16 @@ Behavior that's still missing from this component that original food items had t for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list) examine_list += span_notice("- [reagent.name] [reagent.volume]u: [round(reagent.purity * 100)]% pure") + if(!HAS_TRAIT(user, TRAIT_REMOTE_TASTING)) + return + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) + checkLiked(fraction, user) + if (!owner.reagents.get_reagent_amount(/datum/reagent/consumable/salt)) + examine_list += span_notice("It could use a little more Sodium Chloride...") + if (isliving(user)) + var/mob/living/living_user = user + living_user.taste(owner.reagents) + /datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) SIGNAL_HANDLER diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm index 762e8e0162c..89822976993 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -498,4 +498,13 @@ activate_message = span_notice("You feel the knowledge and passion of several sunbaked, seasoned fishermen burn within you.") deactivate_message = span_notice("You no longer feel like casting a fishing rod by the sunny riverside.") +/obj/item/skillchip/intj + name = "Integrated Intuitive Thinking and Judging skillchip" + auto_traits = list(TRAIT_REMOTE_TASTING) + skill_name = "Mental Flavour Calculus" + skill_description = "When examining food, you can experience the flavours just as well as if you were eating it." + skill_icon = FA_ICON_DRUMSTICK_BITE + activate_message = span_notice("You think of your favourite food and realise that you can rotate its flavour in your mind.") + deactivate_message = span_notice("You feel your food-based mind palace crumbling...") + #undef SKILLCHIP_CATEGORY_GENERAL diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 9d54d95516d..8f29a7d2be7 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -433,6 +433,7 @@ desc = "A piece of juicy meat found in an ayy lmao's head." icon_state = "brain-x" brain_size = 1.3 + organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_LITERATE, TRAIT_REMOTE_TASTING) ////////////////////////////////////TRAUMAS//////////////////////////////////////// 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 345e30264ba..74d2bedf3a7 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -3,14 +3,15 @@ id = SPECIES_ABDUCTOR sexes = FALSE inherent_traits = list( - TRAIT_NO_UNDERWEAR, + TRAIT_CHUNKYFINGERS_IGNORE_BATON, + TRAIT_NEVER_WOUNDED, + TRAIT_NOBLOOD, TRAIT_NOBREATH, + TRAIT_NODISMEMBER, TRAIT_NOHUNGER, + TRAIT_NO_UNDERWEAR, + TRAIT_REMOTE_TASTING, TRAIT_VIRUSIMMUNE, - TRAIT_NOBLOOD, - TRAIT_CHUNKYFINGERS_IGNORE_BATON, - TRAIT_NODISMEMBER, - TRAIT_NEVER_WOUNDED ) mutanttongue = /obj/item/organ/internal/tongue/abductor mutantstomach = null diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 580d2a66f96..c38036e6eab 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -243,8 +243,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/examine(mob/user) . = ..() var/immune = HAS_MIND_TRAIT(user, TRAIT_MADNESS_IMMUNE) - if(isliving(user) && !immune && (get_dist(user, src) < SM_HALLUCINATION_RANGE(internal_energy))) - . += span_danger("You get headaches just from looking at it.") + if(isliving(user)) + if (!immune && (get_dist(user, src) < SM_HALLUCINATION_RANGE(internal_energy))) + . += span_danger("You get headaches just from looking at it.") + var/mob/living/living_user = user + if (HAS_TRAIT(user, TRAIT_REMOTE_TASTING)) + to_chat(user, span_warning("The taste is overwhelming and indescribable!")) + living_user.electrocute_act(shock_damage = 15, source = src, flags = SHOCK_KNOCKDOWN | SHOCK_NOGLOVES) + . += span_notice("It could use a little more Sodium Chloride...") + . += delamination_strategy.examine(src) return . diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 5234018bbd9..d58df6a1d6b 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -61,13 +61,16 @@ reagents.add_reagent(/datum/reagent/blood, disease_amount, data) add_initial_reagents() -/obj/item/reagent_containers/examine() +/obj/item/reagent_containers/examine(mob/user) . = ..() if(has_variable_transfer_amount) if(possible_transfer_amounts.len > 1) . += span_notice("Left-click or right-click in-hand to increase or decrease its transfer amount.") else if(possible_transfer_amounts.len) . += span_notice("Left-click or right-click in-hand to view its transfer amount.") + if(isliving(user) && HAS_TRAIT(user, TRAIT_REMOTE_TASTING)) + var/mob/living/living_user = user + living_user.taste(reagents) /obj/item/reagent_containers/create_reagents(max_vol, flags) . = ..() diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index e51205c00e4..5e3d9d3b055 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -52,11 +52,12 @@ /obj/item/skillchip/appraiser = 2, /obj/item/skillchip/basketweaving = 2, /obj/item/skillchip/bonsai = 2, + /obj/item/skillchip/intj = 2, /obj/item/skillchip/light_remover = 2, + /obj/item/skillchip/master_angler = 2, /obj/item/skillchip/sabrage = 2, /obj/item/skillchip/useless_adapter = 5, /obj/item/skillchip/wine_taster = 2, - /obj/item/skillchip/master_angler = 2, ), ), list( From 0bfb17ff21ae080c22bc46a5e282a8f8df25812b Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:06:36 +0300 Subject: [PATCH 04/25] Automatic changelog for PR #803 [ci skip] --- html/changelogs/AutoChangeLog-pr-803.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-803.yml diff --git a/html/changelogs/AutoChangeLog-pr-803.yml b/html/changelogs/AutoChangeLog-pr-803.yml new file mode 100644 index 00000000000..ce9dc0871e8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-803.yml @@ -0,0 +1,5 @@ +author: "Jacquerel" +delete-after: True +changes: + - rscadd: "A new skill chip can be found in maintenance or purchased from the vendor, allowing you to experience food in new and exciting ways." + - rscadd: "Abductors also have access to this incredible power, simply using their genius level brains." \ No newline at end of file From 2f00a6964861f5b1e231c4d0c8e4f5f65960506f Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:06:59 +0300 Subject: [PATCH 05/25] [MIRROR] Android doesn't need epipen [MDB IGNORE] (#767) * Android doesn't need epipen * Merge Master, Resolve conflict --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Xackii <120736708+Xackii@users.noreply.github.com> Co-authored-by: SomeRandomOwl <2568378+SomeRandomOwl@users.noreply.github.com> Co-authored-by: Iajret --- code/__DEFINES/traits/declarations.dm | 2 ++ code/_globalvars/traits/_traits.dm | 1 + code/modules/mob/living/carbon/human/_species.dm | 2 +- code/modules/mob/living/carbon/human/species_types/android.dm | 1 + code/modules/reagents/chemistry/holder.dm | 2 +- 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index bd63f013f85..98a8df19b7c 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -164,6 +164,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NOBLOOD "noblood" /// This just means that the carbon will always have functional liverless metabolism #define TRAIT_LIVERLESS_METABOLISM "liverless_metabolism" +/// This carbon can't be overdosed by chems +#define TRAIT_OVERDOSEIMMUNE "overdose_immune" /// Humans with this trait cannot be turned into zombies #define TRAIT_NO_ZOMBIFY "no_zombify" /// Carbons with this trait can't have their DNA copied by diseases nor changelings diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 8d445921fff..3d45a9b78bd 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -320,6 +320,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN, + "TRAIT_OVERDOSEIMMUNE" = TRAIT_OVERDOSEIMMUNE, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, "TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED, "TRAIT_PACIFISM" = TRAIT_PACIFISM, diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 2d4518bd034..48956982eb1 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1068,7 +1068,7 @@ GLOBAL_LIST_EMPTY(features_by_species) affected.blood_volume = min(affected.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM) affected.reagents.del_reagent(chem.type) return COMSIG_MOB_STOP_REAGENT_CHECK - if(!chem.overdosed && chem.overdose_threshold && chem.volume >= chem.overdose_threshold) + if(!chem.overdosed && chem.overdose_threshold && chem.volume >= chem.overdose_threshold && !HAS_TRAIT(affected, TRAIT_OVERDOSEIMMUNE)) chem.overdosed = TRUE chem.overdose_start(affected) affected.log_message("has started overdosing on [chem.name] at [chem.volume] units.", LOG_GAME) 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 dec4fd9e306..5988ad3b890 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -15,6 +15,7 @@ TRAIT_NO_DNA_COPY, TRAIT_NO_PLASMA_TRANSFORM, TRAIT_NO_UNDERWEAR, + TRAIT_OVERDOSEIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_RADIMMUNE, TRAIT_RESISTCOLD, diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 20d4da62f2b..5f9d7f81995 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -765,7 +765,7 @@ if(!reagent.metabolizing) reagent.metabolizing = TRUE reagent.on_mob_metabolize(owner) - if(can_overdose) + if(can_overdose && !HAS_TRAIT(owner, TRAIT_OVERDOSEIMMUNE)) if(reagent.overdose_threshold) if(reagent.volume >= reagent.overdose_threshold && !reagent.overdosed) reagent.overdosed = TRUE From 4b3b976534da632d6750109e16c477f1bdc59595 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:07:22 +0300 Subject: [PATCH 06/25] Automatic changelog for PR #767 [ci skip] --- html/changelogs/AutoChangeLog-pr-767.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-767.yml diff --git a/html/changelogs/AutoChangeLog-pr-767.yml b/html/changelogs/AutoChangeLog-pr-767.yml new file mode 100644 index 00000000000..cbdde26ed49 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-767.yml @@ -0,0 +1,4 @@ +author: "Steals-The-PRs" +delete-after: True +changes: + - bugfix: "Androids cannot have overdose effect by any chems." \ No newline at end of file From 0534ce0d8641b2b21abac4d679c84ffbde8f1f6d Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:07:49 +0300 Subject: [PATCH 07/25] [MIRROR] Fix refresh button in log viewer [MDB IGNORE] (#775) * Fix refresh button in log viewer (#79520) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: vvvv-vvvv <136390975+vvvv-vvvv@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: Iajret --- code/game/world.dm | 2 +- code/modules/logging/log_holder.dm | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/code/game/world.dm b/code/game/world.dm index de638624319..99cffb74ad2 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -190,7 +190,7 @@ GLOBAL_VAR(restart_counter) data["tick_usage"] = world.tick_usage data["tick_lag"] = world.tick_lag data["time"] = world.time - data["timestamp"] = logger.unix_timestamp_string() + data["timestamp"] = rustg_unix_timestamp() return data /world/proc/SetupLogs() diff --git a/code/modules/logging/log_holder.dm b/code/modules/logging/log_holder.dm index 7d8386e77b6..1cea0e554be 100644 --- a/code/modules/logging/log_holder.dm +++ b/code/modules/logging/log_holder.dm @@ -107,7 +107,7 @@ GENERAL_PROTECT_DATUM(/datum/log_holder) return switch(action) - if("re-render") + if("refresh") cache_ui_data() SStgui.update_uis(src) return TRUE @@ -121,7 +121,7 @@ GENERAL_PROTECT_DATUM(/datum/log_holder) CRASH("Attempted to call init_logging twice!") round_id = GLOB.round_id - logging_start_timestamp = unix_timestamp_string() + logging_start_timestamp = rustg_unix_timestamp() log_categories = list() disabled_categories = list() @@ -243,13 +243,10 @@ GENERAL_PROTECT_DATUM(/datum/log_holder) if(human_readable_enabled) rustg_file_write("\[[human_readable_timestamp()]\] Starting up round ID [round_id].\n - -------------------------\n", category_instance.get_output_file(null, "log")) -/datum/log_holder/proc/unix_timestamp_string() // pending change to rust-g - return RUSTG_CALL(RUST_G, "unix_timestamp")() - /datum/log_holder/proc/human_readable_timestamp(precision = 3) var/start = time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss") // now we grab the millis from the rustg timestamp - var/rustg_stamp = unix_timestamp_string() + var/rustg_stamp = rustg_unix_timestamp() var/list/timestamp = splittext(rustg_stamp, ".") #ifdef UNIT_TESTS if(length(timestamp) != 2) From 7afb32e901652f2c9730f39c246cb861e1656712 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:19:32 +0300 Subject: [PATCH 08/25] Automatic changelog for PR #775 [ci skip] --- html/changelogs/AutoChangeLog-pr-775.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-775.yml diff --git a/html/changelogs/AutoChangeLog-pr-775.yml b/html/changelogs/AutoChangeLog-pr-775.yml new file mode 100644 index 00000000000..c585c229470 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-775.yml @@ -0,0 +1,4 @@ +author: "vvvv-vvvv" +delete-after: True +changes: + - bugfix: "Fix refresh button in log viewer" \ No newline at end of file From 1e1afd86c76df859b9cb02aa53c00d335519ee42 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:42:20 +0300 Subject: [PATCH 09/25] hammerable glass shards (for sand) (#782) * hammerable glass shards (for sand) * good point, zero points * Update modular_skyrat/modules/primitive_production/code/misc.dm * color and no meshing this sand --------- Co-authored-by: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../ashwalkers/code/items/ash_seedmesh.dm | 15 ++++---- .../modules/primitive_production/code/misc.dm | 35 +++++++++++++++++++ .../research/xenoarch/xenoarch_tool.dm | 1 + tgstation.dme | 1 + 4 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 modular_skyrat/modules/primitive_production/code/misc.dm diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm index a0882c288a1..205e357313e 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_seedmesh.dm @@ -9,23 +9,26 @@ /obj/item/seed_mesh/attackby(obj/item/attacking_item, mob/user, params) if(istype(attacking_item, /obj/item/stack/ore/glass)) - var/obj/item/stack/stack_item = attacking_item + var/obj/item/stack/ore/ore_item = attacking_item + if(ore_item.points == 0) + user.balloon_alert(user, "[ore_item] is worthless!") + return - while(stack_item.amount >= 5) + while(ore_item.amount >= 5) if(!do_after(user, 5 SECONDS, src)) user.balloon_alert(user, "have to stand still!") return - if(!stack_item.use(5)) - user.balloon_alert(user, "unable to use five of [stack_item]!") + if(!ore_item.use(5)) + user.balloon_alert(user, "unable to use five of [ore_item]!") return if(prob(70)) - user.balloon_alert(user, "[stack_item] reveals nothing!") + user.balloon_alert(user, "[ore_item] reveals nothing!") continue var/spawn_seed = pick(subtypesof(/obj/item/seeds) - seeds_blacklist) new spawn_seed(get_turf(src)) - user.balloon_alert(user, "[stack_item] revealed something!") + user.balloon_alert(user, "[ore_item] revealed something!") return ..() diff --git a/modular_skyrat/modules/primitive_production/code/misc.dm b/modular_skyrat/modules/primitive_production/code/misc.dm new file mode 100644 index 00000000000..18bcafa8664 --- /dev/null +++ b/modular_skyrat/modules/primitive_production/code/misc.dm @@ -0,0 +1,35 @@ +/obj/item/shard/attackby(obj/item/item, mob/user, params) + //xenoarch hammer, forging hammer, etc. + if(item.tool_behaviour == TOOL_HAMMER) + var/added_color + switch(src.type) + if(/obj/item/shard) + added_color = "#88cdf1" + + if(/obj/item/shard/plasma) + added_color = "#ff80f4" + + if(/obj/item/shard/plastitanium) + added_color = "#5d3369" + + if(/obj/item/shard/titanium) + added_color = "#cfbee0" + + var/obj/colored_item = new /obj/item/stack/ore/glass/zero_cost(get_turf(src)) + colored_item.add_atom_colour(added_color, FIXED_COLOUR_PRIORITY) + new /obj/effect/decal/cleanable/glass(get_turf(src)) + user.balloon_alert(user, "[src] shatters!") + playsound(src, SFX_SHATTER, 30, TRUE) + qdel(src) + return TRUE + + return ..() + +/obj/item/stack/ore/glass/zero_cost + points = 0 + merge_type = /obj/item/stack/ore/glass/zero_cost + +/obj/item/stack/ore/examine(mob/user) + . = ..() + if(points == 0) + . += span_warning("
[src] is worthless and will not reward any mining points!") diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm index 50f695c2011..5d58fa29b84 100644 --- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm +++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/xenoarch_tool.dm @@ -7,6 +7,7 @@ /obj/item/xenoarch/hammer name = "parent dev item" desc = "A hammer that can be used to remove dirt from strange rocks." + tool_behaviour = TOOL_HAMMER var/dig_amount = 1 var/dig_speed = 1 SECONDS var/advanced = FALSE diff --git a/tgstation.dme b/tgstation.dme index 35b9780d62d..97709cd1a6c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7749,6 +7749,7 @@ #include "modular_skyrat\modules\primitive_cooking_additions\code\stone_stove.dm" #include "modular_skyrat\modules\primitive_production\code\ceramics.dm" #include "modular_skyrat\modules\primitive_production\code\glassblowing.dm" +#include "modular_skyrat\modules\primitive_production\code\misc.dm" #include "modular_skyrat\modules\primitive_production\code\production_skill.dm" #include "modular_skyrat\modules\primitive_structures\code\fencing.dm" #include "modular_skyrat\modules\primitive_structures\code\storage_structures.dm" From 9148e6c2d5be0f6b6309fa0d9f1fbfc6137fdb20 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:42:47 +0300 Subject: [PATCH 10/25] Automatic changelog for PR #782 [ci skip] --- html/changelogs/AutoChangeLog-pr-782.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-782.yml diff --git a/html/changelogs/AutoChangeLog-pr-782.yml b/html/changelogs/AutoChangeLog-pr-782.yml new file mode 100644 index 00000000000..bea28e92212 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-782.yml @@ -0,0 +1,4 @@ +author: "jjpark-kb" +delete-after: True +changes: + - rscadd: "you can hammer glass shards to get back sand" \ No newline at end of file From 14b08cf6de36acb5222d1eddecc0c3b09231e0f6 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:42:58 +0300 Subject: [PATCH 11/25] Removes Kilostation completely from the Automapper (#791) removes it Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> --- .../skyrat/automapper/automapper_config.toml | 33 - .../kilostation/kilostation_armory.dmm | 144 - .../kilostation/kilostation_arrivals.dmm | 357 -- .../kilostation/kilostation_cryo.dmm | 204 -- .../kilostation/kilostation_ert_bay.dmm | 3119 ----------------- 5 files changed, 3857 deletions(-) delete mode 100644 _maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm delete mode 100644 _maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm delete mode 100644 _maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm delete mode 100644 _maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm diff --git a/_maps/skyrat/automapper/automapper_config.toml b/_maps/skyrat/automapper/automapper_config.toml index 1683d43dae8..00c9ae33593 100644 --- a/_maps/skyrat/automapper/automapper_config.toml +++ b/_maps/skyrat/automapper/automapper_config.toml @@ -197,39 +197,6 @@ required_map = "IceBoxStation.dmm" coordinates = [202, 16, 2] trait_name = "Station" -# KILOSTATION MAP EDITS -# Kilostation Arrivals -[templates.kilostation_arrivals] -map_files = ["kilostation_arrivals.dmm"] -directory = "_maps/skyrat/automapper/templates/kilostation/" -required_map = "KiloStation.dmm" -coordinates = [151, 80, 1] -trait_name = "Station" - -# Kilostation ERT Bay and Barber -[templates.kilostation_ert_bay] -map_files = ["kilostation_ert_bay.dmm"] -directory = "_maps/skyrat/automapper/templates/kilostation/" -required_map = "KiloStation.dmm" -coordinates = [77, 151, 1] -trait_name = "Station" - -# Kilostation Cryo -[templates.kilostation_cryo] -map_files = ["kilostation_cryo.dmm"] -directory = "_maps/skyrat/automapper/templates/kilostation/" -required_map = "KiloStation.dmm" -coordinates = [59, 118, 1] -trait_name = "Station" - -# Kilostation Armory -[templates.kilostation_armory] -map_files = ["kilostation_armory.dmm"] -directory = "_maps/skyrat/automapper/templates/kilostation/" -required_map = "KiloStation.dmm" -coordinates = [81, 80, 1] -trait_name = "Station" - # TRAMSTATION MAP EDITS # Tramstation Arrivals [templates.tramstation_arrivals] diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm deleted file mode 100644 index 229c3d31bd0..00000000000 --- a/_maps/skyrat/automapper/templates/kilostation/kilostation_armory.dmm +++ /dev/null @@ -1,144 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"e" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/armory_kiboko, -/turf/open/floor/iron/showroomfloor, -/area/station/ai_monitored/security/armory) -"q" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/microfusion, -/turf/open/floor/iron/showroomfloor, -/area/station/ai_monitored/security/armory) -"u" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/clothing/head/helmet/sec{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/head/helmet/sec, -/obj/item/clothing/head/helmet/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/suit/armor/vest/alt/sec, -/obj/item/clothing/suit/armor/vest/alt/sec{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"w" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/smg, -/turf/open/floor/iron/showroomfloor, -/area/station/ai_monitored/security/armory) -"G" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/rack/gunrack, -/obj/effect/spawner/armory_spawn/shotguns, -/turf/open/floor/iron/showroomfloor, -/area/station/ai_monitored/security/armory) -"N" = ( -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas/sechailer, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/item/flashlight/seclite, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/item/storage/barricade{ - pixel_y = -5 - }, -/obj/item/storage/barricade, -/obj/item/storage/barricade{ - pixel_y = 5 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"S" = ( -/turf/template_noop, -/area/template_noop) - -(1,1,1) = {" -N -S -S -S -"} -(2,1,1) = {" -u -S -S -S -"} -(3,1,1) = {" -S -S -w -e -"} -(4,1,1) = {" -S -S -q -G -"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm deleted file mode 100644 index dc4d9060ab2..00000000000 --- a/_maps/skyrat/automapper/templates/kilostation/kilostation_arrivals.dmm +++ /dev/null @@ -1,357 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/floor/plating/airless, -/area/space) -"e" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/computer/shuttle/arrivals/recall{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"f" = ( -/turf/closed/wall/rust, -/area/station/hallway/secondary/entry) -"h" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/box, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"i" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/stripes/line, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"j" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/directional/west, -/obj/machinery/status_display/shuttle/directional/west{ - shuttle_id = "arrivals_shuttle" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"k" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"n" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"p" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"q" = ( -/turf/closed/wall, -/area/station/hallway/secondary/entry) -"r" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/bluespace_vendor/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"s" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/flora/bush/pale/style_random, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"t" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/directional/east, -/obj/machinery/status_display/shuttle/directional/east{ - shuttle_id = "arrivals_shuttle" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"v" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/flora/grass/jungle/a/style_random, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"x" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"z" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"A" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"D" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"E" = ( -/obj/machinery/door/airlock/external{ - name = "Arrival Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"F" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"G" = ( -/obj/machinery/door/airlock/external{ - name = "Arrival Shuttle Airlock"; - space_dir = 2 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"I" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall, -/area/station/hallway/secondary/entry) -"J" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"M" = ( -/turf/closed/mineral/random/labormineral, -/area/space/nearstation) -"O" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 1; - height = 13; - shuttle_id = "arrivals_stationary"; - name = "arrivals"; - width = 5 - }, -/turf/open/floor/plating/airless, -/area/space) -"S" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/flora/grass/jungle/b/style_random, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"T" = ( -/obj/structure/sign/warning/secure_area{ - name = "EMERGENCY STORAGE" - }, -/turf/closed/wall, -/area/station/hallway/secondary/entry) -"V" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/vending/clothing, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"W" = ( -/obj/machinery/door/airlock/external{ - name = "Arrival Shuttle Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"X" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/closet/firecloset, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/entry) -"Y" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) - -(1,1,1) = {" -x -f -M -S -a -a -a -a -"} -(2,1,1) = {" -X -q -M -v -a -O -a -a -"} -(3,1,1) = {" -T -f -q -I -a -a -a -a -"} -(4,1,1) = {" -r -E -j -G -a -a -a -a -"} -(5,1,1) = {" -A -F -F -F -a -a -a -a -"} -(6,1,1) = {" -h -n -F -s -a -a -a -a -"} -(7,1,1) = {" -Y -V -k -v -a -a -a -a -"} -(8,1,1) = {" -J -z -F -D -a -a -a -a -"} -(9,1,1) = {" -J -e -F -v -a -a -a -a -"} -(10,1,1) = {" -p -F -F -F -a -a -a -a -"} -(11,1,1) = {" -i -W -t -G -a -a -a -a -"} -(12,1,1) = {" -f -q -f -I -a -a -a -a -"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm deleted file mode 100644 index d3035bcc07a..00000000000 --- a/_maps/skyrat/automapper/templates/kilostation/kilostation_cryo.dmm +++ /dev/null @@ -1,204 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/wall, -/area/station/common/cryopods) -"c" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/greater) -"d" = ( -/obj/effect/turf_decal/bot, -/obj/structure/frame/computer{ - anchored = 1; - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/greater) -"e" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "greylair"; - name = "Lair Privacy Shutter" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"g" = ( -/turf/open/floor/iron, -/area/station/common/cryopods) -"j" = ( -/obj/machinery/computer/cryopod/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/common/cryopods) -"l" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/common/cryopods) -"o" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/common/cryopods) -"r" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "greylair"; - name = "Lair Privacy Shutter" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"u" = ( -/obj/effect/turf_decal/bot, -/obj/structure/frame/computer{ - anchored = 1; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/greater) -"x" = ( -/obj/machinery/cryopod, -/obj/effect/turf_decal/siding/white, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/common/cryopods) -"z" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryopods" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/common/cryopods) -"A" = ( -/obj/machinery/cryopod, -/obj/effect/turf_decal/siding/white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/common/cryopods) -"D" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/common/cryopods) -"J" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/camera/directional/east, -/obj/machinery/time_clock/directional/east, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark, -/area/station/common/cryopods) -"O" = ( -/obj/machinery/cryopod, -/obj/effect/turf_decal/siding/white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/common/cryopods) -"Q" = ( -/obj/structure/table, -/obj/item/storage/briefcase/secure, -/obj/item/taperecorder, -/obj/structure/sign/warning/electric_shock/directional/south, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/greater) -"R" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "greylair"; - name = "Lair Privacy Shutter" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"S" = ( -/obj/machinery/cryopod{ - dir = 1 - }, -/obj/effect/turf_decal/siding/white{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/common/cryopods) -"U" = ( -/turf/closed/wall, -/area/station/maintenance/port/greater) -"W" = ( -/obj/machinery/cryopod, -/obj/effect/turf_decal/siding/white, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/common/cryopods) -"X" = ( -/obj/effect/turf_decal/bot, -/obj/structure/frame/computer{ - anchored = 1; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/greater) - -(1,1,1) = {" -Q -a -a -a -a -a -"} -(2,1,1) = {" -d -r -W -o -g -l -"} -(3,1,1) = {" -X -e -O -g -g -z -"} -(4,1,1) = {" -u -R -A -D -S -l -"} -(5,1,1) = {" -c -r -x -j -J -l -"} -(6,1,1) = {" -U -a -a -a -a -a -"} diff --git a/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm b/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm deleted file mode 100644 index 34e0fbcad74..00000000000 --- a/_maps/skyrat/automapper/templates/kilostation/kilostation_ert_bay.dmm +++ /dev/null @@ -1,3119 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ad" = ( -/obj/structure/transit_tube/diagonal/topleft, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"an" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aK" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"bb" = ( -/obj/machinery/door/airlock/maintenance/external{ - name = "Transit Intersection" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"bj" = ( -/obj/machinery/bluespace_vendor/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/public/glass{ - name = "Salon Hallway" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"bB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/south, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"bH" = ( -/obj/structure/transit_tube/diagonal/crossing/topleft, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"bV" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"ca" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"cc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"cf" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"cm" = ( -/obj/structure/filingcabinet/employment, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"cW" = ( -/obj/structure/fans/tiny/forcefield{ - dir = 1 - }, -/obj/structure/sign/warning/vacuum/external/directional/east, -/obj/machinery/door/poddoor/preopen{ - name = "Dock Shutter" - }, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"cX" = ( -/obj/structure/closet/secure_closet/nanotrasen_consultant/station, -/obj/item/assembly/flash/handheld, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"df" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/hallway/primary/fore) -"ds" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/primary/fore) -"dC" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"dG" = ( -/obj/machinery/camera/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"dV" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/middle, -/obj/structure/transit_tube, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"dY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"dZ" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"ew" = ( -/obj/structure/sign/departments/custodian, -/turf/closed/wall, -/area/station/maintenance/fore) -"ey" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/machinery/vending/barbervend, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"eL" = ( -/obj/structure/closet{ - name = "maid locker" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/white, -/obj/item/clothing/accessory/maidapron{ - pixel_x = -4; - pixel_y = -4 - }, -/obj/item/clothing/shoes/laceup, -/obj/structure/mirror/directional/north, -/turf/open/floor/iron/dark, -/area/station/maintenance/fore) -"eQ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/mousetraps{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/flashlight, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/dark, -/area/station/maintenance/fore) -"eZ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/barricade/wooden/crude, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/service/janitor, -/turf/open/floor/iron/dark, -/area/station/maintenance/fore) -"fb" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"fc" = ( -/obj/effect/turf_decal/siding/white{ - dir = 5 - }, -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"fr" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"fx" = ( -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"fA" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"fF" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"fR" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall, -/area/space/nearstation) -"fT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"gk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/hallway/primary/fore) -"gv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"gw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"gx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"gy" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"gH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"gW" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"gX" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"ha" = ( -/obj/structure/sign/departments/holy{ - pixel_y = 30 - }, -/turf/open/floor/iron/stairs/right{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"hd" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hg" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"hj" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"hs" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"hS" = ( -/obj/structure/transit_tube/diagonal/crossing/topleft, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"iv" = ( -/obj/structure/cable, -/turf/open/floor/iron/stairs/old{ - dir = 8 - }, -/area/station/maintenance/fore/lesser) -"iy" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"iD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"iM" = ( -/obj/structure/fans/tiny/forcefield{ - dir = 1 - }, -/obj/machinery/door/poddoor/preopen{ - name = "Dock Shutter" - }, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"iV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"jA" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/lights/mixed{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/storage/belt/janitor, -/obj/item/storage/bag/trash, -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6/directional/north, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/dark, -/area/station/maintenance/fore) -"jC" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"jJ" = ( -/obj/structure/transit_tube/crossing, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"jK" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"jS" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"jV" = ( -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"jY" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space) -"kh" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"ku" = ( -/obj/machinery/camera/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"kz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - name = "Privacy Shutter"; - id = "nt_rep_priv_2" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/nt_rep) -"kE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"kI" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"kP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"lr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Fore Hallway Monastary Tube"; - name = "fore camera" - }, -/obj/structure/chair/sofa/bench, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"lw" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/transit_tube/crossing, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"lU" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/structure/closet/secure_closet/barber, -/obj/effect/decal/cleanable/dirt, -/obj/item/pushbroom, -/obj/item/reagent_containers/spray/cleaner, -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"mi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"mU" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"mZ" = ( -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"nc" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ne" = ( -/turf/closed/wall, -/area/space/nearstation) -"nv" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"nA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/structure/sink/directional/east, -/obj/item/reagent_containers/cup/bucket, -/obj/item/mop, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/button/door/directional/south{ - id = "maidbay"; - name = "Maid Bay Toggle" - }, -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"nE" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"nF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"nN" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"nS" = ( -/obj/structure/chair/sofa/bench/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/camera/directional/south, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/primary/fore) -"nW" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"oi" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"oR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - name = "Privacy Shutter"; - id = "nt_rep_priv" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/nt_rep) -"oZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall/rust, -/area/station/command/heads_quarters/nt_rep) -"pf" = ( -/turf/closed/wall, -/area/station/maintenance/fore) -"qg" = ( -/obj/structure/closet/crate, -/obj/item/hand_labeler, -/obj/item/storage/crayons, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"qj" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"qr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"qM" = ( -/obj/machinery/button/door/directional/north{ - name = "Privacy Shutters Control"; - id = "nt_rep_priv" - }, -/obj/structure/table/wood, -/obj/item/folder/yellow{ - pixel_x = 8; - pixel_y = -1 - }, -/obj/item/folder/red{ - pixel_x = -4; - pixel_y = -2 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/folder/blue{ - pixel_y = 6; - pixel_x = -2 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"qS" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/noticeboard/directional/north{ - dir = 2; - name = "Chapel Notice Board" - }, -/obj/machinery/light/directional/north, -/obj/structure/chair/sofa/bench/right, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"qU" = ( -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/primary/fore) -"rk" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/landmark/start/barber, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"rt" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"rz" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/camera/directional/north, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"rE" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"rL" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light_switch/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"rT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"su" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"sz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"tg" = ( -/turf/closed/wall/rust, -/area/station/maintenance/fore) -"tx" = ( -/obj/structure/transit_tube/crossing, -/obj/effect/turf_decal/sand/plating, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"tz" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/sign/warning/secure_area/directional/east, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"tU" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"ud" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"uf" = ( -/obj/effect/landmark/start/nanotrasen_consultant, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"uj" = ( -/obj/structure/lattice, -/obj/structure/grille/broken, -/turf/open/space/basic, -/area/space/nearstation) -"uI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"uM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/button/curtain{ - id = "barbershopcurtains1"; - pixel_x = -25; - pixel_y = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"uX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/obj/structure/chair/sofa/bench, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"vp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"vs" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"vE" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"vJ" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"vS" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_x = -5; - pixel_y = 9 - }, -/obj/item/camera_film, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"vV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"wh" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"wF" = ( -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"wK" = ( -/obj/machinery/door/airlock/public{ - name = "Massage Parlour" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/service/barber) -"wL" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Ferry Dock" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"wQ" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Barbershop" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/service/barber) -"wT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"xV" = ( -/turf/closed/wall/r_wall/rust, -/area/station/command/heads_quarters/nt_rep) -"yd" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/dark/corner, -/area/station/hallway/primary/fore) -"yC" = ( -/turf/closed/wall/rust, -/area/station/service/barber) -"yM" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"zb" = ( -/turf/closed/wall/r_wall, -/area/station/command/heads_quarters/nt_rep) -"ze" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"zf" = ( -/obj/structure/lattice, -/obj/structure/sign/warning/secure_area/directional/south, -/turf/open/space/basic, -/area/space/nearstation) -"zu" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"zF" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/item/pen/fountain, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"zR" = ( -/obj/effect/spawner/structure/window, -/obj/structure/curtain/cloth/fancy/mechanical{ - id = "barbershopcurtains1"; - name = "Massage Parlour Drapes" - }, -/turf/open/floor/plating, -/area/station/service/barber) -"zZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/station/hallway/primary/fore) -"Ag" = ( -/turf/closed/wall/rust, -/area/station/maintenance/fore/lesser) -"AB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Be" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/bed/pod, -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"Bs" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/camera/directional/east{ - c_tag = "NT Consultant's Office"; - name = "command camera" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Bx" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"BU" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/landmark/start/barber, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"BZ" = ( -/obj/structure/transit_tube/diagonal/crossing/topleft, -/turf/open/space/basic, -/area/space/nearstation) -"Ce" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"Cf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Cm" = ( -/obj/structure/flora/rock/style_random, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"Da" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Dh" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Dl" = ( -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"Dp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/east, -/obj/machinery/camera/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"DC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Salon Hallway" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"DJ" = ( -/turf/closed/wall/rust, -/area/station/command/heads_quarters/nt_rep) -"Ef" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Eg" = ( -/turf/closed/wall, -/area/station/hallway/primary/fore) -"Eh" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"Ek" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"En" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Ferry Dock" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Ev" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/nanotrasen_consultant, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"EG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/office{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"EI" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"EO" = ( -/obj/structure/transit_tube/curved/flipped, -/turf/open/space/basic, -/area/space/nearstation) -"EP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"EX" = ( -/obj/structure/table/wood, -/obj/item/stamp{ - pixel_y = 8; - pixel_x = -6 - }, -/obj/item/stamp/denied{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/item/stamp/centcom{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"Fg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"Fi" = ( -/turf/closed/wall, -/area/station/service/barber) -"Fl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Fz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"FM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"FQ" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"FU" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"Gh" = ( -/turf/open/space/basic, -/area/space) -"Gw" = ( -/obj/structure/chair/sofa/bench/left, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"GN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/mapping_helpers/burnt_floor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"GU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/random/directional/north, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"GX" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"Ho" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"HJ" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/noticeboard/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"HV" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/table/reinforced/rglass, -/obj/item/hairbrush{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/clothing/gloves/latex, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"HW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Ia" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Ib" = ( -/turf/closed/wall, -/area/station/maintenance/fore/lesser) -"Iv" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"IX" = ( -/obj/structure/table/wood, -/obj/item/taperecorder{ - pixel_y = 5; - pixel_x = 5 - }, -/obj/item/camera{ - pixel_x = -4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Ja" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"Jl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Jm" = ( -/obj/structure/cable, -/obj/machinery/status_display/ai/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Jn" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Jq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"JP" = ( -/obj/machinery/camera/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"KA" = ( -/obj/machinery/photocopier, -/obj/machinery/button/door/directional/north{ - id = "nt_rep_priv_2"; - name = "Privacy Shutters Control" - }, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"KE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"KL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"Lw" = ( -/obj/structure/transit_tube/diagonal/topleft, -/turf/open/space/basic, -/area/space/nearstation) -"LI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Me" = ( -/obj/structure/lattice, -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"Mt" = ( -/turf/closed/wall/rust, -/area/station/hallway/primary/fore) -"Mu" = ( -/obj/structure/flora/rock/pile/style_2, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"Mw" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"MG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"MO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"MP" = ( -/turf/closed/wall/rust, -/area/space/nearstation) -"Ng" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Nu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/generic_maintenance_landmark, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"NU" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"Op" = ( -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Oq" = ( -/obj/docking_port/stationary{ - dheight = 3; - dir = 8; - dwidth = 8; - height = 11; - shuttle_id = "ferry_home"; - name = "Port Bay 2"; - width = 20 - }, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"Oy" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"OJ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"OO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/hallway/primary/fore) -"OR" = ( -/obj/machinery/modular_computer/preset/command{ - dir = 4 - }, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) -"OY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"Pd" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/dark/corner{ - dir = 8 - }, -/area/station/hallway/primary/fore) -"Po" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/dropper, -/obj/item/hairbrush/comb{ - pixel_y = 10 - }, -/obj/machinery/button/curtain{ - id = "barbershopcurtains"; - pixel_x = 10; - pixel_y = -26 - }, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"Pt" = ( -/obj/structure/fans/tiny/forcefield{ - dir = 1 - }, -/obj/structure/sign/warning/vacuum/external/directional/west, -/obj/machinery/door/poddoor/preopen{ - name = "Dock Shutter" - }, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"Pw" = ( -/obj/structure/transit_tube, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"PD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"Qy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"Re" = ( -/obj/effect/turf_decal/tile/purple/opposingcorners{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) -"Rf" = ( -/obj/structure/chair/sofa/bench{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Rj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Ry" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"RA" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"Sa" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"Sg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"SC" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"SH" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Th" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"TD" = ( -/obj/structure/transit_tube, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/grimy, -/area/station/hallway/primary/fore) -"TG" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"TS" = ( -/turf/template_noop, -/area/template_noop) -"TU" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/razor{ - pixel_x = -6 - }, -/obj/item/reagent_containers/spray/barbers_aid{ - pixel_x = 6 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"Uc" = ( -/obj/structure/transit_tube/diagonal/topleft, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"Ul" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/food/pie_smudge, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"Um" = ( -/obj/structure/flora/rock/pile/style_random, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"Uw" = ( -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"UZ" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"Vp" = ( -/obj/structure/chair/comfy/barber_chair, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"VG" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"Wi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"WA" = ( -/obj/effect/spawner/structure/window, -/obj/structure/curtain/cloth/fancy/mechanical{ - id = "barbershopcurtains"; - name = "Barber Shop Drapes" - }, -/turf/open/floor/plating, -/area/station/service/barber) -"WE" = ( -/obj/machinery/door/airlock/corporate{ - name = "NT Consultant's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/cent_com/rep_door, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/command/heads_quarters/nt_rep) -"WY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/landmark/start/barber, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"Xo" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/hallway/primary/fore) -"Xp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"XI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"XJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/spawner/random/structure/crate, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"XL" = ( -/turf/closed/mineral/random/labormineral, -/area/space/nearstation) -"XP" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"Yl" = ( -/obj/structure/table/reinforced/rglass, -/obj/structure/mirror/directional/south, -/obj/item/lipstick/random{ - pixel_x = -6; - pixel_y = -5 - }, -/obj/item/lipstick/random, -/obj/item/reagent_containers/spray/quantum_hair_dye{ - pixel_x = 9 - }, -/turf/open/floor/iron/dark, -/area/station/service/barber) -"YD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"YS" = ( -/obj/effect/turf_decal/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"Zb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) -"Ze" = ( -/obj/structure/transit_tube/crossing, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"Zv" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"ZN" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet/executive, -/area/station/command/heads_quarters/nt_rep) - -(1,1,1) = {" -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -jY -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -BZ -dZ -Gh -Gh -Gh -Gh -Dl -Dl -vs -XL -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(2,1,1) = {" -XL -Gh -Gh -Gh -Gh -Dl -Dl -Gh -Gh -Gh -nN -nN -nN -nN -nN -nN -Gh -Gh -Gh -Gh -Gh -Gh -ad -dZ -dZ -dZ -dZ -dZ -XP -gW -vE -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(3,1,1) = {" -XL -Dl -Gh -Gh -Dl -Dl -Dl -Dl -Gh -nN -nN -rE -wh -kh -rE -nN -nN -Gh -Gh -Gh -Gh -Gh -Gh -Lw -Dl -Dl -Dl -Dl -Dl -Dl -hj -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(4,1,1) = {" -XL -Dl -Dl -Gh -Mu -Dl -Dl -Dl -Dl -nN -Uw -Rj -jK -jK -cc -Uw -nN -Dl -Dl -Dl -Dl -Gh -Dl -Dl -hS -Dl -Dl -Dl -Dl -Dl -hj -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(5,1,1) = {" -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -nN -nN -jK -bV -mU -gy -Sa -jV -nN -nN -Dl -Mu -Dl -Dl -Dl -Dl -Dl -Uc -Dl -Dl -Dl -XL -hj -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(6,1,1) = {" -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Eg -rz -jK -LI -Uw -jK -ud -Uw -tU -Eg -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Uc -Dl -Gh -Gh -yM -OJ -YS -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(7,1,1) = {" -Dl -Dl -Mt -Mt -Eg -nN -nN -nN -Eg -jS -qj -Rf -Jn -jC -nE -Da -hs -Mt -Mt -nN -nN -nN -Eg -Eg -nN -Eg -Gh -bH -dZ -dZ -dZ -fR -hj -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(8,1,1) = {" -Gh -Gh -Eg -ku -cf -EP -nW -MG -nW -nW -wF -rT -wF -wF -XI -nW -nW -jV -fc -fF -kI -wF -fr -EP -nW -nN -Gh -dZ -Lw -Gh -Gh -dZ -hj -TS -TS -TS -TS -TS -TS -TS -TS -TS -"} -(9,1,1) = {" -Gh -Gh -Eg -Ef -AB -Jl -Jl -Fl -Fl -Fl -sz -sz -Fl -Fl -Fl -sz -sz -Fl -Fl -Fl -Fl -Fl -Fl -Dh -MG -nN -Gh -dZ -dZ -Lw -Gh -XP -yM -OJ -OJ -OJ -OJ -nc -fA -RA -TS -TS -"} -(10,1,1) = {" -Gh -Gh -Pt -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -HW -iD -nN -Gh -Gh -dZ -dZ -EO -Ze -Pw -Pw -Ze -Pw -Pw -tx -lw -jJ -dV -TD -"} -(11,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -HW -hd -Eg -dZ -dZ -dZ -dZ -dZ -XP -tz -Dl -Dl -Dl -Dl -hg -rt -gH -Fz -zZ -"} -(12,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -HW -JP -Eg -Gh -Gh -dZ -Gh -dZ -dZ -Fi -Fi -yC -Fi -Fi -yC -Ib -bb -Ag -ha -"} -(13,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -Wi -kE -nN -Gh -Gh -Fi -yC -Fi -yC -yC -lU -EI -vJ -rk -Po -Ib -vp -Ib -qS -"} -(14,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -MO -nW -nN -Gh -Gh -yC -Be -uM -Ho -yC -ey -Mw -dC -Vp -Yl -Ib -iv -Ag -uX -"} -(15,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -gw -nW -nN -Gh -Gh -yC -HV -WY -SC -wK -FU -Re -Re -BU -TU -Ib -GU -Ib -lr -"} -(16,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -gw -HJ -Eg -nN -nN -Fi -zR -zR -zR -Fi -WA -WA -wQ -WA -WA -Ag -iy -Ib -Gw -"} -(17,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -Oq -jV -jV -jV -jV -jV -jV -jV -jV -HW -FQ -En -gv -Oy -En -gv -GX -GX -Pd -GX -GX -Fg -nF -nF -nF -Eh -DC -Ce -"} -(18,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -gw -TG -wL -gx -NU -wL -UZ -fb -Bx -Zv -Zv -Xo -su -su -FM -su -dY -bj -oi -"} -(19,1,1) = {" -Gh -Gh -iM -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -gw -ze -Eg -nN -nN -Eg -Eg -Eg -OO -wF -qU -zb -oR -oR -WE -oZ -GN -pf -tg -"} -(20,1,1) = {" -Gh -Gh -cW -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -jV -gw -VG -nN -Dl -Dl -Dl -Dl -Mt -gk -wF -yd -xV -qM -vS -rL -zb -bB -pf -qg -"} -(21,1,1) = {" -Gh -Gh -Eg -Iv -iV -Sg -Sg -Qy -Qy -Qy -kP -Jq -kP -kP -kP -kP -Jq -Jq -Jq -KE -Jq -Jq -Jq -Ry -wF -nN -Dl -Dl -Dl -Um -Mt -df -ds -nS -zb -IX -uf -Jm -xV -fT -pf -pf -"} -(22,1,1) = {" -Gh -Gh -Eg -dG -nW -nW -Th -an -kE -nW -Ia -Op -wF -wF -wF -wF -nv -Dp -nW -nW -kE -wF -Op -Xp -wF -nN -Dl -Dl -Dl -Dl -Eg -Mt -xV -kz -xV -Ng -wT -fx -zb -Ek -Ja -qr -"} -(23,1,1) = {" -Gh -Gh -Mt -nN -nN -nN -Eg -Mt -nN -nN -nN -Eg -Eg -nN -nN -nN -Eg -Eg -nN -nN -nN -Eg -Eg -nN -nN -Mt -Dl -Dl -Gh -XL -XL -XL -xV -KA -OR -ZN -gX -Zb -zb -XJ -OY -KL -"} -(24,1,1) = {" -Gh -Gh -Gh -Gh -Gh -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Cm -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Gh -Gh -XL -XL -XL -zb -ca -Ev -EX -EG -Cf -xV -ew -eZ -pf -"} -(25,1,1) = {" -Gh -Gh -Gh -Gh -Gh -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Dl -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -jY -Gh -XL -XL -DJ -cX -mZ -zF -SH -YD -zb -jA -PD -nA -"} -(26,1,1) = {" -Gh -Gh -Gh -Gh -Dl -Dl -Dl -Um -XL -XL -Dl -Dl -Dl -Dl -Dl -Dl -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -Gh -XL -zb -cm -aK -zu -Bs -YD -zb -eL -Nu -vV -"} -(27,1,1) = {" -Gh -Gh -Gh -Gh -Dl -Dl -XL -XL -XL -MP -mi -fR -XL -Dl -Um -XL -fR -dZ -uj -Me -Me -Me -dZ -fR -dZ -uj -Me -Me -Me -Me -zf -ne -xV -zb -zb -zb -zb -zb -xV -eQ -Ul -uI -"} From ae02eba4190a533aba33f23bb8eee5f48a79e9d8 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:44:35 +0300 Subject: [PATCH 12/25] [MIRROR] [READY] The Tackleling: Unarmed bonuses and features contribute to tackle success and failure, significant outcome overhaul, among other things [MDB IGNORE] (#776) * [READY] The Tackleling: Unarmed bonuses and features contribute to tackle success and failure, significant outcome overhaul, among other things * Update tackle.dm * Update living.dm * Update tackle.dm --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- code/__DEFINES/combat.dm | 6 +- code/__DEFINES/status_effects.dm | 5 + code/datums/components/tackle.dm | 235 +++++++++++++----- .../status_effects/debuffs/staggered.dm | 41 +++ code/game/objects/items/storage/garment.dm | 1 + .../objects/structures/beds_chairs/chair.dm | 5 +- .../crates_lockers/closets/secure/security.dm | 1 + code/modules/clothing/gloves/tacklers.dm | 2 +- code/modules/clothing/shoes/_shoes.dm | 4 +- code/modules/clothing/suits/armor.dm | 5 +- .../mob/living/carbon/carbon_defense.dm | 19 +- .../mob/living/carbon/human/_species.dm | 14 +- code/modules/mob/living/living.dm | 3 +- code/modules/movespeed/modifiers/mobs.dm | 4 +- code/modules/vending/security.dm | 2 +- tgstation.dme | 1 + 16 files changed, 249 insertions(+), 99 deletions(-) create mode 100644 code/datums/status_effects/debuffs/staggered.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index d619da64d48..5df4128be62 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -171,9 +171,9 @@ DEFINE_BITFIELD(status_flags, list( #define SHOVE_KNOCKDOWN_TABLE 20 #define SHOVE_KNOCKDOWN_COLLATERAL 1 #define SHOVE_CHAIN_PARALYZE 30 -//Shove slowdown -#define SHOVE_SLOWDOWN_LENGTH 30 -#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier +//Staggered slowdown, an effect caused by shoving and a few other features, such as tackling +#define STAGGERED_SLOWDOWN_LENGTH 30 +#define STAGGERED_SLOWDOWN_STRENGTH 0.85 //multiplier //Shove disarming item list GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( /obj/item/gun))) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 03a3bf49ebb..768f1faa514 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -114,6 +114,11 @@ #define set_dizzy(duration) set_timed_status_effect(duration, /datum/status_effect/dizziness) #define set_dizzy_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/dizziness, TRUE) +#define adjust_staggered(duration) adjust_timed_status_effect(duration, /datum/status_effect/staggered) +#define adjust_staggered_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/staggered, up_to) +#define set_staggered(duration) set_timed_status_effect(duration, /datum/status_effect/staggered) +#define set_staggered_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/staggered, TRUE) + #define adjust_jitter(duration) adjust_timed_status_effect(duration, /datum/status_effect/jitter) #define adjust_jitter_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/jitter, up_to) #define set_jitter(duration) set_timed_status_effect(duration, /datum/status_effect/jitter) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index a5b5606bf72..1148e2b5993 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -96,7 +96,7 @@ to_chat(user, span_warning("You're not ready to tackle!")) return - if(user.has_movespeed_modifier(/datum/movespeed_modifier/shove)) // can't tackle if you just got shoved + if(user.get_timed_status_effect_duration(/datum/status_effect/staggered)) // can't tackle if you're staggered to_chat(user, span_warning("You're too off balance to tackle!")) return @@ -131,12 +131,9 @@ * Check [rollTackle()][/datum/component/tackler/proc/rollTackle] for a more thorough explanation on the modifiers at play. * * Then, we figure out what effect we want, and we get to work! Note that with standard gripper gloves and no modifiers, the range of rolls is (-3, 3). The results are as follows, based on what we rolled: - * * -inf to -5: Seriously botched tackle, tackler suffers a concussion, brute damage, and a 3 second paralyze, target suffers nothing - * * -4 to -2: weak tackle, tackler gets 3 second knockdown, target gets shove slowdown but is otherwise fine - * * -1 to 0: decent tackle, tackler gets up a bit quicker than the target - * * 1: solid tackle, tackler has more of an advantage getting up quicker - * * 2 to 4: expert tackle, tackler has sizeable advantage and lands on their feet with a free passive grab - * * 5 to inf: MONSTER tackle, tackler gets up immediately and gets a free aggressive grab, target takes sizeable stamina damage from the hit and is paralyzed for one and a half seconds and knocked down for three seconds + * * -inf to -1: We have a negative roll result, which means something unfortunate or less than ideal happens to our sacker! Could mean just getting knocked down, but it could also mean they get a concussion. Ouch. + * * 0: We get a relatively neutral result, mildly favouring the tackler. + * * 1 to inf: We get a positive roll result, which means we get a reasonable to significant advantage against the target! * * Finally, we return a bitflag to [COMSIG_MOVABLE_IMPACT] that forces the hitpush to false so that we don't knock them away. */ @@ -155,53 +152,74 @@ return var/mob/living/carbon/target = hit - var/mob/living/carbon/human/T = target - var/mob/living/carbon/human/S = user - var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // SKYRAT EDIT - FELINE TRAITS. Was: isfelinid(user) + var/tackle_word = isfeline(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". // SKYRAT EDIT - FELINE TRAITS - ORIGINAL : var/tackle_word = isfelinid(user) ? "pounce" : "tackle" + + if(target.check_block(user, 0, user.name, attack_type = LEAP_ATTACK)) + user.visible_message(span_danger("[user]'s tackle is blocked by [target], softening the effect!"), span_userdanger("Your tackle is blocked by [target], softening the effect!"), ignored_mobs = target) + to_chat(target, span_userdanger("[target] blocks [user]'s tackle attempt, softening the effect!")) + neutral_outcome(user, target, tackle_word) //Forces a neutral outcome so you're not screwed too much from being blocked while tackling + return var/roll = rollTackle(target) tackling = FALSE tackle.gentle = TRUE switch(roll) - if(-INFINITY to -5) - user.visible_message(span_danger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!"), span_userdanger("You botch your [tackle_word] and slam your head into [target], knocking yourself silly!"), ignored_mobs = target) - to_chat(target, span_userdanger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!")) + if(-INFINITY to -1) + negative_outcome(user, target, roll, tackle_word) //OOF - user.Paralyze(3 SECONDS) - var/obj/item/bodypart/head/hed = user.get_bodypart(BODY_ZONE_HEAD) - if(hed) - hed.receive_damage(brute = 15, updating_health = TRUE, wound_bonus = CANT_WOUND) - user.gain_trauma(/datum/brain_trauma/mild/concussion) + if(0) //nothing good, nothing bad + neutral_outcome(user, target, tackle_word) - if(-4 to -2) // glancing blow at best - user.visible_message(span_warning("[user] lands a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!"), span_userdanger("You land a weak [tackle_word] on [target], briefly knocking [target.p_them()] off-balance!"), ignored_mobs = target) - to_chat(target, span_userdanger("[user] lands a weak [tackle_word] on you, briefly knocking you off-balance!")) + if(1 to INFINITY) + positive_outcome(user, target, roll, tackle_word) - user.Knockdown(30) - if(ishuman(target) && !T.has_movespeed_modifier(/datum/movespeed_modifier/shove)) - T.add_movespeed_modifier(/datum/movespeed_modifier/shove) // maybe define a slightly more severe/longer slowdown for this - addtimer(CALLBACK(T, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH * 2) + return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH - if(-1 to 0) // decent hit, both parties are about equally inconvenienced - user.visible_message(span_warning("[user] lands a passable [tackle_word] on [target], sending them both tumbling!"), span_userdanger("You land a passable [tackle_word] on [target], sending you both tumbling!"), ignored_mobs = target) - to_chat(target, span_userdanger("[user] lands a passable [tackle_word] on you, sending you both tumbling!")) +/** + * Our positive tackling outcomes. + * + * We pass our tackle result here to determine the potential outcome of the tackle. Typically, this results in a very poor state for the tackled, and a positive outcome for the tackler. + * + * First, we determine severity by taking our roll result, multiplying it by 10, and then rolling within that value. + * + * If our target is human, their armor will reduce the severity of the roll. We pass along any MELEE armor as a percentage reduction. + * If they're not human (such as a carbon), we give them a small grace of a 10% reduction. + * + * Finally, we figure out what effect our target receives. Note that all positive outcomes inflict staggered, resulting in a much harder time escaping the potential grab: + * * 1 to 20: Our target is briefly stunned and knocked down. suffers 30 stamina damage, and our tackler is also knocked down. + * * 21 to 49: Our target is knocked down, dealt 40 stamina damage, and put into a passive grab. Given they are staggered, this means the target must resist to escape! + * * 50 to inf: Our target is hit with a significant chunk of stamina damage, put into an aggressive grab, and knocked down. They're probably not escaping after this. If our tackler is stamcrit when they land this, so is our target. +*/ - target.adjustStaminaLoss(stamina_cost) - target.Paralyze(0.5 SECONDS) - user.Knockdown(2 SECONDS) - target.Knockdown(2.5 SECONDS) +/datum/component/tackler/proc/positive_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = 1, tackle_word = "tackle") + var/potential_outcome = (roll * 10) - if(1 to 2) // solid hit, tackler has a slight advantage + if(ishuman(target)) + var/mob/living/carbon/human/human_target = target + var/target_armor = human_target.run_armor_check(BODY_ZONE_CHEST, MELEE) + potential_outcome *= ((100 - target_armor) /100) + else + potential_outcome *= 0.9 + + var/mob/living/carbon/human/human_target = target + var/mob/living/carbon/human/human_sacker = user + + switch(potential_outcome) + if(-INFINITY to 0) //I don't want to know how this has happened, okay? + neutral_outcome(user, target, roll, tackle_word) //Default to neutral + + if(1 to 20) user.visible_message(span_warning("[user] lands a solid [tackle_word] on [target], knocking them both down hard!"), span_userdanger("You land a solid [tackle_word] on [target], knocking you both down hard!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands a solid [tackle_word] on you, knocking you both down hard!")) - target.adjustStaminaLoss(30) + target.apply_damage(30, STAMINA) target.Paralyze(0.5 SECONDS) user.Knockdown(1 SECONDS) target.Knockdown(2 SECONDS) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) - if(3 to 4) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land + if(21 to 49) // really good hit, the target is definitely worse off here. Without positive modifiers, this is as good a tackle as you can land user.visible_message(span_warning("[user] lands an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on [user.p_their()] feet with a passive grip!"), span_userdanger("You land an expert [tackle_word] on [target], knocking [target.p_them()] down hard while landing on your feet with a passive grip!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands an expert [tackle_word] on you, knocking you down hard and maintaining a passive grab!")) @@ -209,22 +227,24 @@ user.SetKnockdown(0, ignore_canstun = TRUE) user.get_up(TRUE) user.forceMove(get_turf(target)) - target.adjustStaminaLoss(40) + target.apply_damage(40, STAMINA) target.Paralyze(0.5 SECONDS) target.Knockdown(3 SECONDS) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(S.dna.species, TYPE_PROC_REF(/datum/species, grab), S, T) - S.setGrabState(GRAB_PASSIVE) + INVOKE_ASYNC(human_sacker.dna.species, TYPE_PROC_REF(/datum/species, grab), human_sacker, human_target) + human_sacker.setGrabState(GRAB_PASSIVE) - if(5 to INFINITY) // absolutely BODIED + if(50 to INFINITY) // absolutely BODIED var/stamcritted_user = HAS_TRAIT_FROM(user, TRAIT_INCAPACITATED, STAMINA) - if(stamcritted_user) // in case the user went into stamcrit from the tackle itself and cannot actually aggro grab (since they will be crit) we make the tackle a bit more effective on the target + if(stamcritted_user) // in case the user went into stamcrit from the tackle itself and cannot actually aggro grab (since they will be crit) we make the tackle effectivelly mutually assured...stamina crit user.visible_message(span_warning("[user] lands a monsterly reckless [tackle_word] on [target], knocking both of them senseless!"), span_userdanger("You land a monsterly reckless [tackle_word] on [target], knocking both of you senseless!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands a monsterly reckless [tackle_word] on you, knocking the both of you senseless!")) user.forceMove(get_turf(target)) - target.adjustStaminaLoss(60) + target.apply_damage(100, STAMINA) // CRASHING THIS PLANE WITH NO SURVIVORS target.Paralyze(1 SECONDS) target.Knockdown(5 SECONDS) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS) else user.visible_message(span_warning("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), span_userdanger("You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), ignored_mobs = target) to_chat(target, span_userdanger("[user] lands a monster [tackle_word] on you, knocking you senseless and aggressively pinning you!")) @@ -233,15 +253,90 @@ user.SetKnockdown(0, ignore_canstun = TRUE) user.get_up(TRUE) user.forceMove(get_turf(target)) - target.adjustStaminaLoss(40) + target.apply_damage(60, STAMINA) target.Paralyze(0.5 SECONDS) target.Knockdown(3 SECONDS) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS) if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(S.dna.species, TYPE_PROC_REF(/datum/species, grab), S, T) - S.setGrabState(GRAB_AGGRESSIVE) + INVOKE_ASYNC(human_sacker.dna.species, TYPE_PROC_REF(/datum/species, grab), human_sacker, human_target) + human_sacker.setGrabState(GRAB_AGGRESSIVE) +/** + * Our neutral tackling outcome. + * + * Our tackler and our target are staggered. The target longer than the tackler. However, the tackler stands up after this outcome. This is maybe less neutral than it appears, but the tackler initiated, so... + * This outcome also occurs when our target has blocked the tackle in some way, preventing situations where someone tackling into a blocker is too severely punished as a result. Hence, this has its own proc. +*/ - return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH +/datum/component/tackler/proc/neutral_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = 1, tackle_word = "tackle") + + + user.visible_message(span_warning("[user] lands a [tackle_word] on [target], briefly staggering them both!"), span_userdanger("You land a [tackle_word] on [target], briefly staggering [target.p_them()] and yourself!"), ignored_mobs = target) + to_chat(target, span_userdanger("[user] lands a [tackle_word] on you, briefly staggering you both!")) + + user.get_up(TRUE) + user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) //okay maybe slightly good for the sacker, it's a mild benefit okay? + +/** + * Our negative tackling outcomes. + * + * We pass our tackle result here to determine the potential outcome of the tackle. Typically, this results in a very poor state for the tackler, and a mostly okay outcome for the tackled. + * + * First, we determine severity by taking our roll result, multiplying it by -10, and then rolling within that value. + * + * If our tackler is human, their armor will reduce the severity of the roll. We pass along any MELEE armor as a percentage reduction. + * If they're not human (such as a carbon), we give them a small grace of a 10% reduction. + * + * Finally, we figure out what effect our target receives and what our tackler receives: + * * 1 to 20: Our tackler is knocked down and become staggered, and our target suffers stamina damage and is knocked staggered. So not all bad, but the target most likely can punish you for this. + * * 21 to 49: Our tackler is knocked down, suffers stamina damage, and is staggered. Ouch. + * * 50 to inf: Our tackler suffers a catastrophic failure, receiving significant stamina damage, a concussion, and is paralyzed for 3 seconds. Oh, and they're staggered for a LONG time. +*/ + +/datum/component/tackler/proc/negative_outcome(mob/living/carbon/user, mob/living/carbon/target, roll = -1, tackle_word = "tackle") + var/potential_roll_outcome = (roll * -10) + + if(ishuman(user)) + var/mob/living/carbon/human/human_sacker = target + var/attacker_armor = human_sacker.run_armor_check(BODY_ZONE_CHEST, MELEE) + potential_roll_outcome *= ((100 - attacker_armor) /100) + else + potential_roll_outcome *= 0.9 + + var/actual_roll = rand(1, potential_roll_outcome) + + switch(actual_roll) + + if(-INFINITY to 0) //I don't want to know how this has happened, okay? + neutral_outcome(user, target, roll, tackle_word) //Default to neutral + + if(1 to 20) // It's not completely terrible! But you are somewhat vulernable for doing it. + user.visible_message(span_warning("[user] lands a weak [tackle_word] on [target], briefly staggering [target.p_them()]!"), span_userdanger("You land a weak [tackle_word] on [target], briefly staggering [target.p_them()]!"), ignored_mobs = target) + to_chat(target, span_userdanger("[user] lands a weak [tackle_word] on you, staggering you!")) + + user.Knockdown(1 SECONDS) + user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) + target.apply_damage(20, STAMINA) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) + + if(21 to 49) // oughe + user.visible_message(span_warning("[user] lands a dreadful [tackle_word] on [target], briefly knocking [user.p_them()] to the ground!"), span_userdanger("You land a dreadful [tackle_word] on [target], briefly knocking you to the ground!"), ignored_mobs = target) + to_chat(target, span_userdanger("[user] lands a dreadful [tackle_word] on you, briefly knocking [user.p_them()] to the ground!")) + + user.Knockdown(3 SECONDS) + user.apply_damage(40, STAMINA) + user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 2, 10 SECONDS) + + if(50 to INFINITY) // It has been decided that you will suffer + user.visible_message(span_danger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into [target], knocking [user.p_them()]self silly!"), span_userdanger("You botch your [tackle_word] and slam your head into [target], knocking yourself silly!"), ignored_mobs = target) + to_chat(target, span_userdanger("[user] botches [user.p_their()] [tackle_word] and slams [user.p_their()] head into you, knocking [user.p_them()]self silly!")) + + user.Paralyze(3 SECONDS) + user.apply_damage(80, STAMINA) + user.apply_damage(20, BRUTE, BODY_ZONE_HEAD) + user.gain_trauma(/datum/brain_trauma/mild/concussion) + user.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH * 3, 10 SECONDS) /** * This handles all of the modifiers for the actual carbon-on-carbon tackling, and gets its own proc because of how many there are (with plenty more in mind!) @@ -266,14 +361,21 @@ else if(target_drunkenness > 30) defense_mod -= 1 + //Arms contribute a great deal to potential tackling prowess and defense. Better arms = better bonus + var/obj/item/bodypart/arm/defender_arm = target.get_active_hand() + + if(defender_arm) //the target may not actually have arms + defense_mod += (defender_arm.unarmed_effectiveness/10) + else //sucks to be you if you don't though haha + defense_mod -= 2 + if(HAS_TRAIT(target, TRAIT_CLUMSY)) defense_mod -= 2 if(HAS_TRAIT(target, TRAIT_FAT)) // chonkers are harder to knock over defense_mod += 1 if(HAS_TRAIT(target, TRAIT_GRABWEAKNESS)) defense_mod -= 2 - if(HAS_TRAIT(target, TRAIT_DWARF)) - defense_mod -= 2 + if(HAS_TRAIT(target, TRAIT_GIANT)) defense_mod += 2 if(target.get_organic_health() < 50) @@ -289,15 +391,15 @@ if(ishuman(target)) var/mob/living/carbon/human/tackle_target = target + if(tackle_target.get_mob_height() <= HUMAN_HEIGHT_SHORTEST) //WHO ARE YOU CALLING SHORT? + defense_mod -= 2 + if(isnull(tackle_target.wear_suit) && isnull(tackle_target.w_uniform)) // who honestly puts all of their effort into tackling a naked guy? defense_mod += 2 if(tackle_target.mob_negates_gravity()) defense_mod += 1 if(tackle_target.is_shove_knockdown_blocked()) // riot armor and such defense_mod += 5 - if(tackle_target.is_holding_item_of_type(/obj/item/shield)) - defense_mod += 2 - var/obj/item/organ/external/tail/lizard/el_tail = tackle_target.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL) if(HAS_TRAIT(tackle_target, TRAIT_TACKLING_TAILED_DEFENDER) && !el_tail) @@ -308,6 +410,15 @@ // OF-FENSE var/mob/living/carbon/sacker = parent var/sacker_drunkenness = sacker.get_drunk_amount() + + //Arms contribute a great deal to potential tackling prowess and defense. Better arms = better bonus + var/obj/item/bodypart/arm/sacker_arm = sacker.get_active_hand() + + if(sacker_arm) //I have no idea how you would be tackling without hands, but just in case + attack_mod += (sacker_arm.unarmed_effectiveness/10) + else //I don't want to know how you got to this point but if you have, fuck you, good luck tackling without ARMS + attack_mod -= 4 + if(sacker_drunkenness > 60) // you're far too drunk to hold back! attack_mod += 1 else if(sacker_drunkenness > 30) // if you're only a bit drunk though, you're just sloppy @@ -315,10 +426,10 @@ if(HAS_TRAIT(sacker, TRAIT_CLUMSY)) attack_mod -= 2 - if(HAS_TRAIT(sacker, TRAIT_DWARF)) - attack_mod -= 2 if(HAS_TRAIT(sacker, TRAIT_GIANT)) attack_mod += 2 + if(HAS_TRAIT(sacker, TRAIT_NOGUNS)) //Those dedicated to martial combat are particularly skilled tacklers + attack_mod += 2 if(HAS_TRAIT(sacker, TRAIT_TACKLING_WINGED_ATTACKER)) var/obj/item/organ/external/wings/moth/sacker_moth_wing = sacker.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) @@ -328,16 +439,22 @@ if(sacker_wing) attack_mod += 2 - if(ishuman(target)) - var/mob/living/carbon/human/S = sacker + if(ishuman(sacker)) + var/mob/living/carbon/human/human_sacker = sacker - var/suit_slot = S.get_item_by_slot(ITEM_SLOT_OCLOTHING) - if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/armor/riot))) // tackling in riot armor is more effective, but tiring + if(human_sacker.get_mob_height() <= HUMAN_HEIGHT_SHORTEST) //JUST YOU WAIT TILL I FIND A CHAIR, BUDDY, THEN YOU'LL BE SORRY + attack_mod -= 2 + + if(human_sacker.mob_mood.sanity_level == SANITY_INSANE) //I've gone COMPLETELY INSANE + attack_mod += 15 + human_sacker.adjustStaminaLoss(100) //AHAHAHAHAHAHAHAHA + + if(human_sacker.is_shove_knockdown_blocked()) // tackling with riot specialized armor, like riot armor, is effective but tiring attack_mod += 2 - sacker.adjustStaminaLoss(20) + human_sacker.adjustStaminaLoss(20) - var/r = rand(-3, 3) - defense_mod + attack_mod + skill_mod - return r + var/randomized_tackle_roll = rand(-3, 3) - defense_mod + attack_mod + skill_mod + return randomized_tackle_roll /** diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm new file mode 100644 index 00000000000..5723bc16013 --- /dev/null +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -0,0 +1,41 @@ +/datum/status_effect/staggered + id = "staggered" + tick_interval = 0.5 SECONDS + alert_type = null + remove_on_fullheal = TRUE + +/datum/status_effect/staggered/on_creation(mob/living/new_owner, duration = 10 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/staggered/on_apply() + + //a very mild animation, but you can't stagger the dead. + if(owner.stat == DEAD) + owner.do_stagger_animation(duration / 10) + return FALSE + + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_staggered)) + owner.add_movespeed_modifier(/datum/movespeed_modifier/staggered) + return TRUE + +/datum/status_effect/staggered/on_remove() + UnregisterSignal(owner, COMSIG_LIVING_DEATH) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/staggered) + // Resetting both X on remove so we're back to normal + owner.pixel_x = owner.base_pixel_x + +/// Signal proc that self deletes our staggered effect +/datum/status_effect/staggered/proc/clear_staggered(datum/source) + SIGNAL_HANDLER + + qdel(src) + +/datum/status_effect/staggered/tick(seconds_between_ticks) + owner.do_stagger_animation() + +/// Helper proc that causes the mob to do a stagger animation. +/// Doesn't change significantly, just meant to represent swaying back and forth +/mob/living/proc/do_stagger_animation() + animate(src, pixel_x = 4, time = 0.2 SECONDS, loop = 6, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + animate(pixel_x = -4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE) diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index 9398b675b1b..e9ff2f28ce1 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -82,6 +82,7 @@ new /obj/item/clothing/under/rank/security/head_of_security/grey(src) new /obj/item/clothing/under/rank/security/head_of_security/parade(src) new /obj/item/clothing/under/rank/security/head_of_security/parade/female(src) + new /obj/item/clothing/gloves/tackler/combat(src) new /obj/item/clothing/suit/armor/hos(src) new /obj/item/clothing/suit/armor/hos/hos_formal(src) new /obj/item/clothing/suit/armor/hos/trenchcoat/winter(src) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index b9c80fd7f6c..ddb588db782 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -380,11 +380,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) new /obj/item/stack/rods(get_turf(loc), 2) qdel(src) - - - /obj/item/chair/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) - if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance)) + if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance) || attack_type == LEAP_ATTACK && prob(hit_reaction_chance)) owner.visible_message(span_danger("[owner] fends off [attack_text] with [src]!")) return TRUE return FALSE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index f25c9cfec5d..3a2b54b74f5 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -109,6 +109,7 @@ new /obj/item/radio/headset/headset_sec/alt(src) new /obj/item/clothing/glasses/hud/security/sunglasses(src) new /obj/item/flashlight/seclite(src) + new /obj/item/clothing/gloves/tackler(src) /obj/structure/closet/secure_closet/security/sec diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 888ecac39ee..986d8356b1a 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -21,7 +21,7 @@ /// See: [/datum/component/tackler/var/speed] var/tackle_speed = 1 /// See: [/datum/component/tackler/var/skill_mod] - var/skill_mod = 0 + var/skill_mod = 1 /obj/item/clothing/gloves/tackler/Destroy() tackler = null diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 118c28c0e51..e7d87f34bca 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -254,9 +254,7 @@ if(14 to 25) // 1.3ish% chance to stumble and be a bit off balance (like being disarmed) to_chat(our_guy, span_danger("You stumble a bit on your untied shoelaces!")) - if(!our_guy.has_movespeed_modifier(/datum/movespeed_modifier/shove)) - our_guy.add_movespeed_modifier(/datum/movespeed_modifier/shove) - addtimer(CALLBACK(our_guy, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH) + our_guy.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) if(26 to 1000) wiser = FALSE diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index e2af151e49d..ae8b786fbef 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -369,13 +369,14 @@ /obj/item/clothing/suit/armor/swat name = "MK.I SWAT Suit" - desc = "A tactical suit first developed in a joint effort by the defunct IS-ERI and Nanotrasen in 2321 for military operations. It has a minor slowdown, but offers decent protection." + desc = "A tactical suit first developed in a joint effort by the defunct IS-ERI and Nanotrasen in 2321 for military operations. \ + It has a minor slowdown, but offers decent protection and helps the wearer resist shoving in close quarters." icon_state = "heavy" inhand_icon_state = "swat_suit" armor_type = /datum/armor/armor_swat strip_delay = 120 resistance_flags = FIRE_PROOF | ACID_PROOF - clothing_flags = THICKMATERIAL + clothing_flags = BLOCKS_SHOVE_KNOCKDOWN | THICKMATERIAL cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF heat_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 2032eb511ff..0eb3945af8c 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -383,21 +383,14 @@ if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) //It's too expensive we'll get caught target_held_item = null - if(!target.has_movespeed_modifier(/datum/movespeed_modifier/shove)) - target.add_movespeed_modifier(/datum/movespeed_modifier/shove) - target.emote("sway") - if(target_held_item) - append_message = "loosening [target.p_their()] grip on [target_held_item]" - target.visible_message(span_danger("[target.name]'s grip on \the [target_held_item] loosens!"), //He's already out what are you doing - span_warning("Your grip on \the [target_held_item] loosens!"), null, COMBAT_MESSAGE_RANGE) - addtimer(CALLBACK(target, TYPE_PROC_REF(/mob/living/carbon, clear_shove_slowdown)), SHOVE_SLOWDOWN_LENGTH) - - else if(target_held_item) + if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered)) target.dropItemToGround(target_held_item) append_message = "causing [target.p_them()] to drop [target_held_item]" target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"), span_warning("You drop \the [target_held_item]!"), null, COMBAT_MESSAGE_RANGE) + target.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS) + log_combat(src, target, "shoved", append_message) /mob/living/carbon/proc/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this @@ -406,12 +399,6 @@ return TRUE return FALSE -/mob/living/carbon/proc/clear_shove_slowdown() - remove_movespeed_modifier(/datum/movespeed_modifier/shove) - var/active_item = get_active_held_item() - if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) - visible_message(span_warning("[name] regains their grip on \the [active_item]!"), span_warning("You regain your grip on \the [active_item]"), null, COMBAT_MESSAGE_RANGE) - /mob/living/carbon/blob_act(obj/structure/blob/B) if (stat == DEAD) return diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 48956982eb1..a5a41ef0b1f 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1175,14 +1175,14 @@ GLOBAL_LIST_EMPTY(features_by_species) return FALSE user.do_attack_animation(target, atk_effect) - //has our target been shoved recently? If so, they're off-balance and we get an easy hit. - var/off_balance = FALSE + //has our target been shoved recently? If so, they're staggered and we get an easy hit. + var/staggered = FALSE //Someone in a grapple is much more vulnerable to being harmed by punches. var/grappled = FALSE - if(target.has_movespeed_modifier(/datum/movespeed_modifier/shove)) - off_balance = TRUE + if(target.get_timed_status_effect_duration(/datum/status_effect/staggered)) + staggered = TRUE if(target.pulledby && target.pulledby.grab_state >= GRAB_AGGRESSIVE) grappled = TRUE @@ -1194,7 +1194,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases if(attacking_bodypart.unarmed_damage_low) - if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || off_balance) //kicks and attacks against off-balance targets never miss (provided your species deals more than 0 damage) + if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || staggered) //kicks and attacks against staggered targets never miss (provided your species deals more than 0 damage) miss_chance = 0 else miss_chance = clamp(UNARMED_MISS_CHANCE_BASE - limb_accuracy + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 0, UNARMED_MISS_CHANCE_MAX) //Limb miss chance + various damage. capped at 80 so there is at least a chance to land a hit. @@ -1237,8 +1237,8 @@ GLOBAL_LIST_EMPTY(features_by_species) target.force_say() log_combat(user, target, "punched") - //If we rolled a punch high enough to hit our stun threshold, or our target is off-balance and they have at least 40 damage+stamina loss, we knock them down - if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && off_balance && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) + //If we rolled a punch high enough to hit our stun threshold, or our target is staggered and they have at least 40 damage+stamina loss, we knock them down + if((target.stat != DEAD) && prob(limb_accuracy) || (target.stat != DEAD) && staggered && (target.getStaminaLoss() + user.getBruteLoss()) >= 40) target.visible_message(span_danger("[user] knocks [target] down!"), \ span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user) to_chat(user, span_danger("You knock [target] down!")) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 5e4a564125c..8611bf85eb4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1163,7 +1163,8 @@ /mob/living/resist_grab(moving_resist) . = TRUE - if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || has_movespeed_modifier(/datum/movespeed_modifier/shove) && getStaminaLoss() > STAMINA_THRESHOLD_HARD_RESIST) //SKYRAT EDIT CHANGE - ORIGINAL : if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || has_movespeed_modifier(/datum/movespeed_modifier/shove) && getStaminaLoss() >= 30) + //If we're in an aggressive grab or higher, we're lying down, we're vulnerable to grabs, or we're staggered and we have some amount of stamina loss, we must resist + if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || get_timed_status_effect_duration(/datum/status_effect/staggered) && getStaminaLoss() > STAMINA_THRESHOLD_HARD_RESIST) //SKYRAT EDIT CHANGE - ORIGINAL : if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) || get_timed_status_effect_duration(/datum/status_effect/staggered) && getStaminaLoss() >= 30) var/altered_grab_state = pulledby.grab_state if(body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS) && pulledby.grab_state < GRAB_KILL) //If prone, resisting out of a grab is equivalent to 1 grab state higher. won't make the grab state exceed the normal max, however - SKYRAT EDIT CHANGE: if((resting || HAS_TRAIT(src, TRAIT_GRABWEAKNESS)) && pulledby.grab_state < GRAB_KILL) //If resting, resisting out of a grab is equivalent to 1 grab state higher. won't make the grab state exceed the normal max, however altered_grab_state++ diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index 49358223e35..b782f2fc959 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -81,8 +81,8 @@ blacklisted_movetypes = FLOATING variable = TRUE -/datum/movespeed_modifier/shove - multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH +/datum/movespeed_modifier/staggered + multiplicative_slowdown = STAGGERED_SLOWDOWN_STRENGTH /datum/movespeed_modifier/human_carry multiplicative_slowdown = HUMAN_CARRY_SLOWDOWN diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index b54edffe4c0..feae0499655 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -16,6 +16,7 @@ /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, /obj/item/restraints/legcuffs/bola/energy = 7, + /obj/item/clothing/gloves/tackler = 5, ) contraband = list( /obj/item/clothing/glasses/sunglasses = 2, @@ -26,7 +27,6 @@ /obj/item/coin/antagtoken = 1, /obj/item/clothing/head/helmet/blueshirt = 1, /obj/item/clothing/suit/armor/vest/blueshirt = 1, - /obj/item/clothing/gloves/tackler = 5, /obj/item/grenade/stingbang = 1, /obj/item/watertank/pepperspray = 2, /obj/item/storage/belt/holster/energy = 4, diff --git a/tgstation.dme b/tgstation.dme index 97709cd1a6c..feefc44cb28 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1850,6 +1850,7 @@ #include "code\datums\status_effects\debuffs\slimed.dm" #include "code\datums\status_effects\debuffs\spacer.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" +#include "code\datums\status_effects\debuffs\staggered.dm" #include "code\datums\status_effects\debuffs\static_vision.dm" #include "code\datums\status_effects\debuffs\strandling.dm" #include "code\datums\status_effects\debuffs\terrified.dm" From aa3b263ec29573f06a4df6efa76a55cd9c3e26d2 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:44:59 +0300 Subject: [PATCH 13/25] [PORT] Gives Synths Internal Computers (& One Other Thing) (#792) * initial d * wew * amazing * you got it boss * thanks * blackpilled once again * Apply suggestions from code review * Apply suggestions from code review * Update brain.dm * Apply suggestions from code review * Update modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm * swag * yee * Apply suggestions from code review * Update modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm * Update modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm --------- Co-authored-by: Nerevar <12636964+Nerev4r@users.noreply.github.com> Co-authored-by: Snakebittenn <12636964+Snakebittenn@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> --- .../code/bodyparts/internal_computer/brain.dm | 11 ++ .../internal_computer/internal_computer.dm | 117 ++++++++++++++++++ tgstation.dme | 2 + 3 files changed, 130 insertions(+) create mode 100644 modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm create mode 100644 modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm new file mode 100644 index 00000000000..9b65b3f6772 --- /dev/null +++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/brain.dm @@ -0,0 +1,11 @@ +/obj/item/organ/internal/brain/synth + var/obj/item/modular_computer/pda/synth/internal_computer + actions_types = list(/datum/action/item_action/synth/open_internal_computer) + +/obj/item/organ/internal/brain/synth/Initialize(mapload) + . = ..() + internal_computer = new(src) + +/obj/item/organ/internal/brain/synth/Destroy() + QDEL_NULL(internal_computer) + return ..() diff --git a/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm new file mode 100644 index 00000000000..89f24cdcede --- /dev/null +++ b/modular_skyrat/modules/synths/code/bodyparts/internal_computer/internal_computer.dm @@ -0,0 +1,117 @@ +/// Custom computer for synth brains +/obj/item/modular_computer/pda/synth + name = "virtual persocom" + + base_active_power_usage = 0 + base_idle_power_usage = 0 + + long_ranged = TRUE //Synths have good antennae + + max_idle_programs = 3 + + max_capacity = 32 + +/obj/item/modular_computer/pda/synth/Initialize(mapload) + . = ..() + + // prevent these from being created outside of synth brains + if(!istype(loc, /obj/item/organ/internal/brain/synth)) + return INITIALIZE_HINT_QDEL + +/datum/action/item_action/synth/open_internal_computer + name = "Open persocom emulation" + desc = "Accesses your built-in virtual machine." + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/synth/open_internal_computer/Trigger(trigger_flags) + . = ..() + var/obj/item/organ/internal/brain/synth/targetmachine = target + targetmachine.internal_computer.interact(owner) + +/obj/item/modular_computer/pda/synth/ui_state(mob/user) + return GLOB.default_state + +/obj/item/modular_computer/pda/synth/ui_status(mob/user) + var/obj/item/organ/internal/brain/synth/brain_loc = loc + if(!istype(brain_loc)) + return UI_CLOSE + + if(!QDELETED(brain_loc.owner)) + if(brain_loc.owner == user) + return min( + ui_status_user_is_abled(user, src), + ui_status_only_living(user), + ) + else return UI_CLOSE + return ..() + +/obj/item/modular_computer/pda/synth/RemoveID(mob/user) + var/obj/item/organ/internal/brain/synth/brain_loc = loc + if(!istype(brain_loc)) + return ..() + + if(!computer_id_slot) + return ..() + + if(crew_manifest_update) + GLOB.manifest.modify(computer_id_slot.registered_name, computer_id_slot.assignment, computer_id_slot.get_trim_assignment()) + + if(user && !issilicon(user) && in_range(brain_loc.owner || brain_loc, user)) + user.put_in_hands(computer_id_slot) + else + computer_id_slot.forceMove(brain_loc.owner ? brain_loc.owner.drop_location() : brain_loc.drop_location()) //We actually update the physical on brain removal/insert + + computer_id_slot = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + balloon_alert(user, "removed ID") + +/obj/item/modular_computer/pda/synth/get_ntnet_status() + . = NTNET_NO_SIGNAL + // NTNet is down and we are not connected via wired connection. The synth is no more + var/obj/item/organ/internal/brain/synth/brain_loc = loc + if(!istype(brain_loc)) + return + if(!find_functional_ntnet_relay() || isnull(brain_loc.owner)) + return + var/turf/current_turf = get_turf(brain_loc.owner || brain_loc) + if(is_station_level(current_turf.z)) + return NTNET_GOOD_SIGNAL + else if(long_ranged && !is_centcom_level(current_turf.z)) // Centcom is excluded because cafe + return NTNET_LOW_SIGNAL + +/* +So, I am not snowflaking more code.. except this +Attacking a synth with an id loads it into its slot.. pain and probably shitcode +*/ + +/obj/item/card/id/attack(mob/living/target_mob, mob/living/user, params) + var/mob/living/carbon/human/targetmachine = target_mob + if(!istype(targetmachine)) + return ..() + + var/obj/item/organ/internal/brain/synth/robotbrain = targetmachine.get_organ_slot(ORGAN_SLOT_BRAIN) + if(istype(robotbrain)) + if(user.zone_selected == BODY_ZONE_PRECISE_EYES) + balloon_alert(user, "Inserting ID into persocom slot...") + if(do_after(user, 5 SECONDS)) + balloon_alert(user, "ID slot interface registered!") + to_chat(targetmachine, span_notice("[user] inserts [src] into your persocom's card slot.")) + robotbrain.internal_computer.InsertID(src, user) + return + return ..() + +/obj/item/modular_computer/pda/attack(mob/living/target_mob, mob/living/user, params) + var/mob/living/carbon/human/targetmachine = target_mob + if(!istype(targetmachine)) + return ..() + + var/obj/item/organ/internal/brain/synth/robotbrain = targetmachine.get_organ_slot(ORGAN_SLOT_BRAIN) + if(istype(robotbrain)) + if(user.zone_selected == BODY_ZONE_PRECISE_EYES) + balloon_alert(user, "Establishing SSH login with persocom...") + if(do_after(user, 5 SECONDS)) + balloon_alert(user, "Connection established!") + to_chat(targetmachine, span_notice("[user] establishes an SSH connection between [src] and your persocom emulation.")) + robotbrain.internal_computer.interact(user) + return + return ..() diff --git a/tgstation.dme b/tgstation.dme index feefc44cb28..76e55f89a08 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7869,6 +7869,8 @@ #include "modular_skyrat\modules\synths\code\bodyparts\silicon_alt_brains.dm" #include "modular_skyrat\modules\synths\code\bodyparts\stomach.dm" #include "modular_skyrat\modules\synths\code\bodyparts\tongue.dm" +#include "modular_skyrat\modules\synths\code\bodyparts\internal_computer\brain.dm" +#include "modular_skyrat\modules\synths\code\bodyparts\internal_computer\internal_computer.dm" #include "modular_skyrat\modules\synths\code\reagents\blood_pack.dm" #include "modular_skyrat\modules\synths\code\reagents\pill.dm" #include "modular_skyrat\modules\synths\code\reagents\pill_bottles.dm" From b2b96e54b98922d823a372d3749259e00b4741aa Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:45:28 +0300 Subject: [PATCH 14/25] [MIRROR] Fixes hearing messages from speakers on another z level (515 fix) [MDB IGNORE] (#799) * Fixes hearing messages from speakers on another z level (515 fix) (#79888) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Emmett Gaines --- code/__DEFINES/dcs/signals/signals_object.dm | 2 ++ code/game/machinery/telecomms/broadcasting.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 3 +- code/modules/mob/living/living_say.dm | 2 +- code/modules/unit_tests/say.dm | 31 +++++++++++++++++-- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index c1d9e88786a..1f17b3646da 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -310,6 +310,8 @@ #define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" ///called from base of /obj/item/radio/proc/talk_into(): (atom/movable/M, message, channel) #define COMSIG_RADIO_NEW_MESSAGE "radio_new_message" +///called from base of /obj/item/radio/proc/on_receive_messgae(): (list/data) +#define COMSIG_RADIO_RECEIVE_MESSAGE "radio_receive_message" // /obj/item/pen signals diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 97ecd19e470..e8ecb72393f 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -155,7 +155,7 @@ radios += independent_radio for(var/obj/item/radio/called_radio as anything in radios) - called_radio.on_recieve_message() + called_radio.on_recieve_message(data) // From the list of radios, find all mobs who can hear those. var/list/receive = get_hearers_in_radio_ranges(radios) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 1bc96c35122..1a356686a74 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -388,7 +388,8 @@ return TRUE return FALSE -/obj/item/radio/proc/on_recieve_message() +/obj/item/radio/proc/on_recieve_message(list/data) + SEND_SIGNAL(src, COMSIG_RADIO_RECEIVE_MESSAGE, data) flick_overlay_view(overlay_speaker_active, 5 SECONDS) /obj/item/radio/ui_state(mob/user) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 50b4abf8035..de01642f0c6 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -283,7 +283,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/dist = get_dist(speaker, src) - message_range if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) // ghosts can hear all messages clearly raw_message = stars(raw_message) - if (dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) + if (message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING) && !isobserver(src)) return FALSE // Too far away and don't have good hearing, you can't hear anything // we need to send this signal before compose_message() is used since other signals need to modify diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index 3ae55a12e37..ec58dcedc88 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -58,12 +58,15 @@ /// This runs some simple speech tests on a speaker and listener and determines if a person can hear whispering or speaking as they are moved a distance away /datum/unit_test/speech - var/list/handle_speech_result = null - var/list/handle_hearing_result = null var/mob/living/carbon/human/speaker var/mob/living/carbon/human/listener + var/list/handle_speech_result = null + var/list/handle_hearing_result = null + var/obj/item/radio/speaker_radio var/obj/item/radio/listener_radio + var/speaker_radio_heard_message = FALSE + var/listener_radio_received_message = FALSE /datum/unit_test/speech/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER @@ -99,6 +102,16 @@ handle_hearing_result = list() handle_hearing_result += hearing_args +/datum/unit_test/speech/proc/handle_radio_hearing(datum/source, mob/living/user, message, channel) + SIGNAL_HANDLER + + speaker_radio_heard_message = TRUE + +/datum/unit_test/speech/proc/handle_radio_speech(datum/source, list/data) + SIGNAL_HANDLER + + listener_radio_received_message = TRUE + /datum/unit_test/speech/Run() speaker = allocate(/mob/living/carbon/human/consistent) // Name changes to make understanding breakpoints easier @@ -114,7 +127,10 @@ listener.mock_client = mock_client RegisterSignal(speaker, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + RegisterSignal(speaker_radio, COMSIG_RADIO_NEW_MESSAGE, PROC_REF(handle_radio_hearing)) + RegisterSignal(listener, COMSIG_MOVABLE_HEAR, PROC_REF(handle_hearing)) + RegisterSignal(listener_radio, COMSIG_RADIO_RECEIVE_MESSAGE, PROC_REF(handle_radio_speech)) // speaking and whispering should be hearable conversation(distance = 1) @@ -169,6 +185,9 @@ handle_hearing_result = null /datum/unit_test/speech/proc/radio_test() + speaker_radio_heard_message = FALSE + listener_radio_received_message = FALSE + speaker.forceMove(run_loc_floor_bottom_left) listener.forceMove(locate((run_loc_floor_bottom_left.x + 10), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) @@ -186,11 +205,15 @@ speaker.say(pangram_quote) TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired (radio test)") - TEST_ASSERT(islist(handle_hearing_result), "Listener failed to hear radio message (radio test)") + TEST_ASSERT(speaker_radio_heard_message, "Speaker's radio did not hear them speak (radio test)") TEST_ASSERT_EQUAL(speaker_radio.get_frequency(), listener_radio.get_frequency(), "Radio frequencies were not equal (radio test)") + TEST_ASSERT(listener_radio_received_message, "Listener's radio did not receive the broadcast (radio test)") + TEST_ASSERT(islist(handle_hearing_result), "Listener failed to hear radio message (radio test)") handle_speech_result = null handle_hearing_result = null + speaker_radio_heard_message = FALSE + listener_radio_received_message = FALSE speaker_radio.set_frequency(FREQ_CTF_RED) speaker.say(pangram_quote) @@ -200,6 +223,8 @@ handle_speech_result = null handle_hearing_result = null + speaker_radio_heard_message = FALSE + listener_radio_received_message = FALSE speaker_radio.set_broadcasting(FALSE) #undef NORMAL_HEARING_RANGE From 3e17fce319ada9d0f777f7f316f4eac926db9ad6 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:45:45 +0300 Subject: [PATCH 15/25] [MIRROR] Gives roundstart prisoners a key memory of what their crime is [MDB IGNORE] (#805) * Gives roundstart prisoners a key memory of what their crime is (#79881) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: die_amond <58376695+dieamond13@users.noreply.github.com> --- code/datums/memory/key_memories.dm | 22 ++++++++++++++++++++++ code/modules/jobs/job_types/prisoner.dm | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/code/datums/memory/key_memories.dm b/code/datums/memory/key_memories.dm index 5cc581f14c7..d777df72e38 100644 --- a/code/datums/memory/key_memories.dm +++ b/code/datums/memory/key_memories.dm @@ -191,3 +191,25 @@ "[protagonist_name] being implanted by a scientist.", "[protagonist_name] having surgery done on them by a scientist.", ) + +/datum/memory/key/permabrig_crimes + var/crimes + +/datum/memory/key/permabrig_crimes/New( + datum/mind/memorizer_mind, + atom/protagonist, + atom/deuteragonist, + atom/antagonist, + crimes, +) + src.crimes = crimes + return ..() + +/datum/memory/key/permabrig_crimes/get_names() + return list("[protagonist_name]'s crime of \"[crimes]\".") + +/datum/memory/key/permabrig_crimes/get_starts() + return list( + "[protagonist_name] being arrested by security for [crimes].", + "[protagonist_name] committing the crimes of [crimes].", + ) diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 33369d44ce4..cf4c9f65910 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -45,6 +45,7 @@ var/datum/crime/past_crime = new(crime.name, crime.desc, "Central Command", "Indefinite.") target_record.crimes += past_crime to_chat(crewmember, span_warning("You are imprisoned for \"[crime_name]\".")) + crewmember.add_mob_memory(/datum/memory/key/permabrig_crimes, crimes = crime_name) /datum/outfit/job/prisoner name = "Prisoner" @@ -69,7 +70,6 @@ if(!crime_name) return var/datum/prisoner_crime/crime = GLOB.prisoner_crimes[crime_name] - var/list/limbs_to_tat = new_prisoner.bodyparts.Copy() for(var/i in 1 to crime.tattoos) if(!length(SSpersistence.prison_tattoos_to_use) || visualsOnly) From fce4f6fb267f17175abe9c05c7568a1095e91a34 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:46:08 +0300 Subject: [PATCH 16/25] [MIRROR] [NO GBP] Makes dart insert projectile var modification code slightly better [MDB IGNORE] (#800) * [NO GBP] Makes dart insert projectile var modification code slightly better (#79886) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: Y0SH1M4S73R --- code/__DEFINES/dcs/signals/signals_object.dm | 14 -------- code/datums/components/dart_insert.dm | 8 +++-- code/modules/paperwork/pen.dm | 36 ++++++++++++-------- 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 1f17b3646da..903182b21db 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -501,19 +501,5 @@ /// from /datum/component/dart_insert/remove_from_dart() : (obj/ammo_casing/dart, mob/user) #define COMSIG_DART_INSERT_REMOVED "dart_insert_removed" -/** - * from /datum/component/dart_insert/get_dart_var_modifiers() : (list/out_modifiers) - * - * valid indices for `out_modifiers` are: - * - `damage`: number - * - `speed`: number - * - `armour_penetration`: number - * - `wound_bonus`: number - * - `bare_wound_bonus`: number - * - `demolition_mod`: number - * - `embedding`: list with embedding params - */ -#define COMSIG_DART_INSERT_GET_VAR_MODIFIERS "dart_insert_get_var_modifiers" - /// from /datum/component/dart_insert/on_reskin() #define COMSIG_DART_INSERT_PARENT_RESKINNED "dart_insert_parent_reskinned" diff --git a/code/datums/components/dart_insert.dm b/code/datums/components/dart_insert.dm index 03d1d689357..19eea67ab3a 100644 --- a/code/datums/components/dart_insert.dm +++ b/code/datums/components/dart_insert.dm @@ -20,14 +20,17 @@ var/projectile_overlay_icon /// The icon state used for the overlay applied over the containing projectile var/projectile_overlay_icon_state + /// Optional callback to invoke when acquiring projectile var modifiers + var/datum/callback/modifier_getter -/datum/component/dart_insert/Initialize(_casing_overlay_icon, _casing_overlay_icon_state, _projectile_overlay_icon, _projectile_overlay_icon_state) +/datum/component/dart_insert/Initialize(_casing_overlay_icon, _casing_overlay_icon_state, _projectile_overlay_icon, _projectile_overlay_icon_state, datum/callback/_modifier_getter) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE casing_overlay_icon = _casing_overlay_icon casing_overlay_icon_state = _casing_overlay_icon_state projectile_overlay_icon = _projectile_overlay_icon projectile_overlay_icon_state = _projectile_overlay_icon_state + modifier_getter = _modifier_getter /datum/component/dart_insert/RegisterWithParent() . = ..() @@ -130,8 +133,7 @@ new_overlays += mutable_appearance(projectile_overlay_icon, projectile_overlay_icon_state) /datum/component/dart_insert/proc/apply_var_modifiers(obj/projectile/projectile) - LAZYINITLIST(var_modifiers) - SEND_SIGNAL(parent, COMSIG_DART_INSERT_GET_VAR_MODIFIERS, var_modifiers) + var_modifiers = istype(modifier_getter) ? modifier_getter.Invoke() : list() projectile.damage += var_modifiers["damage"] if(var_modifiers["speed"]) var_modifiers["speed"] = reciprocal_add(projectile.speed, var_modifiers["speed"]) - projectile.speed diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 3750acddc42..40e99eefe6a 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -37,23 +37,29 @@ /obj/item/pen/Initialize(mapload) . = ..() - AddComponent(/datum/component/dart_insert, dart_insert_icon, dart_insert_casing_icon_state, dart_insert_icon, dart_insert_projectile_icon_state) + AddComponent(/datum/component/dart_insert, \ + dart_insert_icon, \ + dart_insert_casing_icon_state, \ + dart_insert_icon, \ + dart_insert_projectile_icon_state, \ + CALLBACK(src, PROC_REF(get_dart_var_modifiers))\ + ) RegisterSignal(src, COMSIG_DART_INSERT_ADDED, PROC_REF(on_inserted_into_dart)) RegisterSignal(src, COMSIG_DART_INSERT_REMOVED, PROC_REF(on_removed_from_dart)) - RegisterSignal(src, COMSIG_DART_INSERT_GET_VAR_MODIFIERS, PROC_REF(get_dart_var_modifiers)) /obj/item/pen/proc/on_inserted_into_dart(datum/source, obj/projectile/dart, mob/user, embedded = FALSE) SIGNAL_HANDLER -/obj/item/pen/proc/get_dart_var_modifiers(datum/source, list/modifiers) - SIGNAL_HANDLER - modifiers["damage"] = max(5, throwforce) - modifiers["speed"] = max(0, throw_speed - 3) - modifiers["embedding"] = embedding - modifiers["armour_penetration"] = armour_penetration - modifiers["wound_bonus"] = wound_bonus - modifiers["bare_wound_bonus"] = bare_wound_bonus - modifiers["demolition_mod"] = demolition_mod +/obj/item/pen/proc/get_dart_var_modifiers() + return list( + "damage" = max(5, throwforce), + "speed" = max(0, throw_speed - 3), + "embedding" = embedding, + "armour_penetration" = armour_penetration, + "wound_bonus" = wound_bonus, + "bare_wound_bonus" = bare_wound_bonus, + "demolition_mod" = demolition_mod, + ) /obj/item/pen/proc/on_removed_from_dart(datum/source, obj/projectile/dart, mob/user) SIGNAL_HANDLER @@ -366,12 +372,12 @@ if(istype(projectile)) UnregisterSignal(projectile, list(COMSIG_PROJECTILE_FIRE, COMSIG_PROJECTILE_ON_SPAWN_DROP, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED)) -/obj/item/pen/edagger/get_dart_var_modifiers(datum/source, list/modifiers) +/obj/item/pen/edagger/get_dart_var_modifiers() . = ..() var/datum/component/transforming/transform_comp = GetComponent(/datum/component/transforming) - modifiers["damage"] = max(5, transform_comp.throwforce_on) - modifiers["speed"] = max(0, transform_comp.throw_speed_on - 3) - var/list/embed_params = modifiers["embedding"] + .["damage"] = max(5, transform_comp.throwforce_on) + .["speed"] = max(0, transform_comp.throw_speed_on - 3) + var/list/embed_params = .["embedding"] embed_params["embed_chance"] = 100 /obj/item/pen/edagger/proc/on_containing_dart_fired(obj/projectile/source) From a2a34af6ce6803bd96266045f9dec57eec6dff78 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Fri, 24 Nov 2023 12:46:32 +0300 Subject: [PATCH 17/25] [MIRROR] Updates the Mafia UI [MDB IGNORE] (#801) * Updates the Mafia UI (#79856) --------- Co-authored-by: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com> --- code/modules/mafia/controller_ui.dm | 7 +++++ tgui/packages/tgui/interfaces/MafiaPanel.tsx | 32 ++++++++++++++------ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/code/modules/mafia/controller_ui.dm b/code/modules/mafia/controller_ui.dm index cc901392d22..578555d21f4 100644 --- a/code/modules/mafia/controller_ui.dm +++ b/code/modules/mafia/controller_ui.dm @@ -29,6 +29,8 @@ if(turn) data["turn"] = " - Day [turn]" + if(phase == MAFIA_PHASE_JUDGEMENT) + data["person_voted_up_ref"] = REF(on_trial) if(phase == MAFIA_PHASE_SETUP) data["lobbydata"] = list() for(var/key in GLOB.mafia_signup + GLOB.mafia_bad_signup + GLOB.pda_mafia_signup) @@ -41,8 +43,10 @@ data["timeleft"] = next_phase_timer ? timeleft(next_phase_timer) : 0 var/datum/mafia_role/user_role = get_role_player(user) + if(user_role) data["user_notes"] = user_role.written_notes + data["player_voted_up"] = (user_role == on_trial) var/list/ui_messages = list() for(var/i = user_role.role_messages.len to 1 step -1) ui_messages.Add(list(list( @@ -56,6 +60,9 @@ player_info["name"] = role.body.real_name player_info["ref"] = REF(role) player_info["alive"] = role.game_status == MAFIA_ALIVE + player_info["role_revealed"] = FALSE + if(role.role_flags & ROLE_REVEALED) + player_info["role_revealed"] = role.name player_info["possible_actions"] = list() if(user_role) //not observer diff --git a/tgui/packages/tgui/interfaces/MafiaPanel.tsx b/tgui/packages/tgui/interfaces/MafiaPanel.tsx index ee63d105dd1..23b4b45a27a 100644 --- a/tgui/packages/tgui/interfaces/MafiaPanel.tsx +++ b/tgui/packages/tgui/interfaces/MafiaPanel.tsx @@ -16,6 +16,7 @@ type RoleInfo = { type PlayerInfo = { name: string; + role_revealed: string; is_you: BooleanLike; ref: string; alive: string; @@ -49,11 +50,13 @@ type MafiaData = { is_observer: boolean; all_roles: string[]; admin_controls: boolean; + person_voted_up_ref: string; + player_voted_up: BooleanLike; }; export const MafiaPanelData = (props, context) => { const { act, data } = useBackend(context); - const { phase, roleinfo, admin_controls, messages } = data; + const { phase, roleinfo, admin_controls, messages, player_voted_up } = data; const [mafia_tab, setMafiaMode] = useLocalState( context, 'mafia_tab', @@ -90,7 +93,7 @@ export const MafiaPanelData = (props, context) => { - {phase === 'Judgment' && ( + {phase === 'Judgment' && !player_voted_up && ( @@ -401,17 +404,20 @@ const MafiaJudgement = (props, context) => { const { act, data } = useBackend(context); return (
- + +