From 102aa6cf9e0b6b0356bde416d41f7836c4e2ad3b Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 16 Jul 2024 00:22:40 +0000 Subject: [PATCH 01/49] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-83262.yml | 5 -- html/changelogs/AutoChangeLog-pr-84646.yml | 5 -- html/changelogs/AutoChangeLog-pr-84731.yml | 4 - html/changelogs/AutoChangeLog-pr-84779.yml | 4 - html/changelogs/AutoChangeLog-pr-84790.yml | 5 -- html/changelogs/AutoChangeLog-pr-84827.yml | 4 - html/changelogs/AutoChangeLog-pr-84840.yml | 5 -- html/changelogs/AutoChangeLog-pr-84843.yml | 4 - html/changelogs/AutoChangeLog-pr-84860.yml | 5 -- html/changelogs/AutoChangeLog-pr-84861.yml | 4 - html/changelogs/AutoChangeLog-pr-84865.yml | 5 -- html/changelogs/AutoChangeLog-pr-84881.yml | 4 - html/changelogs/AutoChangeLog-pr-84891.yml | 4 - html/changelogs/AutoChangeLog-pr-84895.yml | 8 -- html/changelogs/AutoChangeLog-pr-84905.yml | 4 - html/changelogs/AutoChangeLog-pr-84917.yml | 4 - html/changelogs/AutoChangeLog-pr-84918.yml | 4 - html/changelogs/AutoChangeLog-pr-84921.yml | 4 - html/changelogs/AutoChangeLog-pr-84924.yml | 4 - html/changelogs/AutoChangeLog-pr-84925.yml | 4 - html/changelogs/AutoChangeLog-pr-84927.yml | 4 - html/changelogs/AutoChangeLog-pr-84930.yml | 4 - html/changelogs/AutoChangeLog-pr-84933.yml | 4 - html/changelogs/AutoChangeLog-pr-84936.yml | 4 - html/changelogs/AutoChangeLog-pr-84940.yml | 4 - html/changelogs/AutoChangeLog-pr-84941.yml | 4 - html/changelogs/AutoChangeLog-pr-84943.yml | 4 - html/changelogs/AutoChangeLog-pr-84945.yml | 4 - html/changelogs/AutoChangeLog-pr-84946.yml | 4 - html/changelogs/AutoChangeLog-pr-84947.yml | 5 -- html/changelogs/AutoChangeLog-pr-84949.yml | 4 - html/changelogs/AutoChangeLog-pr-84952.yml | 4 - html/changelogs/AutoChangeLog-pr-84956.yml | 4 - html/changelogs/AutoChangeLog-pr-84957.yml | 5 -- html/changelogs/AutoChangeLog-pr-84958.yml | 4 - html/changelogs/AutoChangeLog-pr-84959.yml | 4 - html/changelogs/AutoChangeLog-pr-84960.yml | 7 -- html/changelogs/archive/2024-07.yml | 97 ++++++++++++++++++++++ 38 files changed, 97 insertions(+), 163 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-83262.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84646.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84731.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84779.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84790.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84827.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84840.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84843.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84860.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84861.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84865.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84881.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84891.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84895.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84905.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84917.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84918.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84921.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84924.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84925.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84927.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84930.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84933.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84936.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84940.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84941.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84943.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84945.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84946.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84947.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84949.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84952.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84956.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84957.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84958.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84959.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84960.yml diff --git a/html/changelogs/AutoChangeLog-pr-83262.yml b/html/changelogs/AutoChangeLog-pr-83262.yml deleted file mode 100644 index 0635b7956c837..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-83262.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xackii" -delete-after: True -changes: - - rscadd: "new wizard spells category - perks." - - rscadd: "adds 9 wizard perks." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84646.yml b/html/changelogs/AutoChangeLog-pr-84646.yml deleted file mode 100644 index d0054cb8f14b3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84646.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Examining high-value paintings now can give a positive moodlet." - - qol: "Observers can now zoom paintings in and out in the UI." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84731.yml b/html/changelogs/AutoChangeLog-pr-84731.yml deleted file mode 100644 index 2d3b87db1f818..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84731.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MTandi" -delete-after: True -changes: - - qol: "Research nodes can be queued, one per player. RDs can place their node at the beginning of the queue." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84779.yml b/html/changelogs/AutoChangeLog-pr-84779.yml deleted file mode 100644 index ca8c222b88b4d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84779.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "tweaked the Linked Closets station trait." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84790.yml b/html/changelogs/AutoChangeLog-pr-84790.yml deleted file mode 100644 index fd4e76d0d67d8..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84790.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "ACTUALLY fixed hoverboards being able to be used in space." - - balance: "However, you can soar space with the holy skateboard. at a slower speed." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84827.yml b/html/changelogs/AutoChangeLog-pr-84827.yml deleted file mode 100644 index 2fd1418dda2d1..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84827.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "paganiy" -delete-after: True -changes: - - rscadd: "If you can't shoot a gun, then... JUST TOSS IT AT THEM (for 0.5 seconds of knockdown and 10-20 an additional brute damage)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84840.yml b/html/changelogs/AutoChangeLog-pr-84840.yml deleted file mode 100644 index a0db9885bb229..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84840.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - rscadd: "Love is now stored in the heart." - - balance: "Characters with the Friendly quirk now have physically bigger hearts." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84843.yml b/html/changelogs/AutoChangeLog-pr-84843.yml deleted file mode 100644 index 6235c182c1a1b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84843.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscadd: "Megaphones now affect text-to-speech." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84860.yml b/html/changelogs/AutoChangeLog-pr-84860.yml deleted file mode 100644 index 9081bdbc3226b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84860.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Sadboysuss" -delete-after: True -changes: - - sound: "all materials now have a sound for picking up and dropping" - - code_imp: "items now have pitch vary sound support for dropping and picking up items" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84861.yml b/html/changelogs/AutoChangeLog-pr-84861.yml deleted file mode 100644 index e9203c51f338d..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84861.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hardly3D" -delete-after: True -changes: - - bugfix: "Added a preview assistant outfit, allowing assistant jumpskirts to be previewed again on character preferences." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84865.yml b/html/changelogs/AutoChangeLog-pr-84865.yml deleted file mode 100644 index 4686b3104da41..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84865.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - qol: "removed a redundant, annoying reach check that prevents casting a fishing rod before the projectile is generated." - - qol: "You can now unhook the currently hooked item of a fishing rod with right-click." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84881.yml b/html/changelogs/AutoChangeLog-pr-84881.yml deleted file mode 100644 index 1ec13a1734f8a..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84881.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Sadboysuss" -delete-after: True -changes: - - bugfix: "Wawastation xenobio is no longer filled with BZ" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84891.yml b/html/changelogs/AutoChangeLog-pr-84891.yml deleted file mode 100644 index d3a4abccc1837..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84891.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Fixes overwatch glasses not adding HUDs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84895.yml b/html/changelogs/AutoChangeLog-pr-84895.yml deleted file mode 100644 index 079ace6685d4e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84895.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "reduced the prices of some blackmarket items across the board." - - balance: "the thermite bottle (from the contraband spawner and the blackmarket), now spawns with 50u of thermite vs 30, enough to melt one reinforced wall." - - rscadd: "Replaced the science googles from the blackmarket with a security + health scanner HUD." - - rscadd: "Replaced the single shotgun dart from the blackmarket with a box of XL shotgun darts." - - rscadd: "The donk pocket box from the blackmarket now comes in different flavors." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84905.yml b/html/changelogs/AutoChangeLog-pr-84905.yml deleted file mode 100644 index aa77c54a6ec47..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84905.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "itseasytosee" -delete-after: True -changes: - - image: "Changed some default options in the character creator." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84917.yml b/html/changelogs/AutoChangeLog-pr-84917.yml deleted file mode 100644 index 0bfb0cadab199..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84917.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - qol: "Lattices now make the same footstep sound as catwalks" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84918.yml b/html/changelogs/AutoChangeLog-pr-84918.yml deleted file mode 100644 index c3882e601572b..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84918.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MrDas" -delete-after: True -changes: - - bugfix: "Clown operative reinforcements' uplink no longer break the syndicates' economy by creating TC from nothingness." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84921.yml b/html/changelogs/AutoChangeLog-pr-84921.yml deleted file mode 100644 index 873f3660780c7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84921.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ben10Omintrix" -delete-after: True -changes: - - bugfix: "mothroaches will no longer be crawling out of bags every minute" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84924.yml b/html/changelogs/AutoChangeLog-pr-84924.yml deleted file mode 100644 index 55e9c85e8cbf2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84924.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TheBoondock" -delete-after: True -changes: - - sound: "added pickup, dropping and opening sound for pill bottle" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84925.yml b/html/changelogs/AutoChangeLog-pr-84925.yml deleted file mode 100644 index 5e47956edec24..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84925.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GPeckman" -delete-after: True -changes: - - bugfix: "You can't attach guns/drills/etc. to the Justice traitor mech anymore." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84927.yml b/html/changelogs/AutoChangeLog-pr-84927.yml deleted file mode 100644 index 697c145aaab01..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84927.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - qol: "Pathfinder MODule can now be triggered while wearing the MODsuit to implant yourself without having to pull it out of the suit." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84930.yml b/html/changelogs/AutoChangeLog-pr-84930.yml deleted file mode 100644 index f20fe9a2998df..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84930.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - admin: "Outfit manager UI no longer harddels after closing and thus is usable more than once" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84933.yml b/html/changelogs/AutoChangeLog-pr-84933.yml deleted file mode 100644 index ea174ad4a6375..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84933.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "r3dj4ck0424" -delete-after: True -changes: - - bugfix: "Destroying the jungle grass tiles in Tramstation's science wing should no longer open a chasm." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84936.yml b/html/changelogs/AutoChangeLog-pr-84936.yml deleted file mode 100644 index 72ff6982d3c67..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84936.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lizardqueenlexi" -delete-after: True -changes: - - bugfix: "You can no longer cause a bluescreen by attempting to recolor non-recolorable loadout items." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84940.yml b/html/changelogs/AutoChangeLog-pr-84940.yml deleted file mode 100644 index 30ed28bce2a25..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84940.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - admin: "Ghosts can no longer create deathmatch lobbies or join existing ones when admins disable minigames" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84941.yml b/html/changelogs/AutoChangeLog-pr-84941.yml deleted file mode 100644 index 3120b917ad7e3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84941.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Accelerator cannon projectiles no longer grow to absurd sizes after a bit of travel." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84943.yml b/html/changelogs/AutoChangeLog-pr-84943.yml deleted file mode 100644 index 7c7df08159daa..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84943.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "larentoun" -delete-after: True -changes: - - bugfix: "Correct emote plays when a human scream. Should have sound now." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84945.yml b/html/changelogs/AutoChangeLog-pr-84945.yml deleted file mode 100644 index b878f33ebec15..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84945.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FlufflesTheDog" -delete-after: True -changes: - - bugfix: "Attachment points on toolset implants have been improved, to prevent against recycler related decouplings." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84946.yml b/html/changelogs/AutoChangeLog-pr-84946.yml deleted file mode 100644 index b20f28982b2a9..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84946.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - qol: "If you're in oxycrit (>50 oxy damage) or otherwise made unconscious through other means, blood loss will only kill you if you're *actually* missing a lethal amount of blood." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84947.yml b/html/changelogs/AutoChangeLog-pr-84947.yml deleted file mode 100644 index 6c2d183cfb5e9..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84947.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - spellcheck: "Firelocks no longer output their full name in their balloon alert." - - spellcheck: "Failure message when a xenomorph tries to force open a welded firelock is now a balloon alert." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84949.yml b/html/changelogs/AutoChangeLog-pr-84949.yml deleted file mode 100644 index 3bca324862bee..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84949.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "Grinding fish no longer gives you uselessly high amount of blood and gibs (unless they're very big)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84952.yml b/html/changelogs/AutoChangeLog-pr-84952.yml deleted file mode 100644 index 23e21d669ee35..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84952.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FearfulFurnishing" -delete-after: True -changes: - - bugfix: "fixing speech modifiers being applied to a tongue's native languages." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84956.yml b/html/changelogs/AutoChangeLog-pr-84956.yml deleted file mode 100644 index b5cb51610cafa..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84956.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "You can no longer fit an infinite amount of drivers into a clown car - making spy-acquired clown cars usable!" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84957.yml b/html/changelogs/AutoChangeLog-pr-84957.yml deleted file mode 100644 index 00bab247c1aba..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84957.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "lizardqueenlexi" -delete-after: True -changes: - - bugfix: "The Icebox ordnance lab is now once again a habitable temperature." - - bugfix: "Icebox cytology now has cameras in it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84958.yml b/html/changelogs/AutoChangeLog-pr-84958.yml deleted file mode 100644 index e29af268d4d42..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84958.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lizardqueenlexi" -delete-after: True -changes: - - bugfix: "Atmosphere can no longer flow through closed necropolis gates." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84959.yml b/html/changelogs/AutoChangeLog-pr-84959.yml deleted file mode 100644 index 97ce8febaaa9e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84959.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Profakos" -delete-after: True -changes: - - bugfix: "Fixes dead raptors getting excited when petted or groomed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84960.yml b/html/changelogs/AutoChangeLog-pr-84960.yml deleted file mode 100644 index e2c2ce470aee7..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84960.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "necromanceranne" -delete-after: True -changes: - - rscadd: "Pipe pistols now magdump their entire magazine when fired." - - rscadd: "Pipeguns and their subtypes have a knockback effect." - - bugfix: "Pipe pistols cannot be bayoneted, as intended." - - bugfix: "Junk rounds now actually do their extra damage effects against certain mob types. Borgs across the Spinward tremble at the knowledge that these junk weapons can obliterate them with ease." \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index f1020236ab78b..556da22ed8801 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -798,3 +798,100 @@ 2024-07-15: Thedragmeme: - bugfix: Fixes the Plague hat having what the Plague mask should have +2024-07-16: + 00-Steven: + - rscadd: Love is now stored in the heart. + - balance: Characters with the Friendly quirk now have physically bigger hearts. + Ben10Omintrix: + - bugfix: mothroaches will no longer be crawling out of bags every minute + FearfulFurnishing: + - bugfix: fixing speech modifiers being applied to a tongue's native languages. + FlufflesTheDog: + - bugfix: Attachment points on toolset implants have been improved, to prevent against + recycler related decouplings. + GPeckman: + - bugfix: You can't attach guns/drills/etc. to the Justice traitor mech anymore. + Ghommie: + - balance: Grinding fish no longer gives you uselessly high amount of blood and + gibs (unless they're very big) + - balance: tweaked the Linked Closets station trait. + - rscadd: Megaphones now affect text-to-speech. + - rscadd: Examining high-value paintings now can give a positive moodlet. + - qol: Observers can now zoom paintings in and out in the UI. + - bugfix: ACTUALLY fixed hoverboards being able to be used in space. + - balance: However, you can soar space with the holy skateboard. at a slower speed. + - qol: removed a redundant, annoying reach check that prevents casting a fishing + rod before the projectile is generated. + - qol: You can now unhook the currently hooked item of a fishing rod with right-click. + - balance: reduced the prices of some blackmarket items across the board. + - balance: the thermite bottle (from the contraband spawner and the blackmarket), + now spawns with 50u of thermite vs 30, enough to melt one reinforced wall. + - rscadd: Replaced the science googles from the blackmarket with a security + health + scanner HUD. + - rscadd: Replaced the single shotgun dart from the blackmarket with a box of XL + shotgun darts. + - rscadd: The donk pocket box from the blackmarket now comes in different flavors. + Hardly3D: + - bugfix: Added a preview assistant outfit, allowing assistant jumpskirts to be + previewed again on character preferences. + MTandi: + - qol: Research nodes can be queued, one per player. RDs can place their node at + the beginning of the queue. + Melbert: + - qol: Lattices now make the same footstep sound as catwalks + - qol: If you're in oxycrit (>50 oxy damage) or otherwise made unconscious through + other means, blood loss will only kill you if you're *actually* missing a lethal + amount of blood. + MrDas: + - bugfix: Clown operative reinforcements' uplink no longer break the syndicates' + economy by creating TC from nothingness. + Profakos: + - bugfix: Fixes dead raptors getting excited when petted or groomed + Sadboysuss: + - sound: all materials now have a sound for picking up and dropping + - code_imp: items now have pitch vary sound support for dropping and picking up + items + - bugfix: Wawastation xenobio is no longer filled with BZ + SmArtKar: + - admin: Ghosts can no longer create deathmatch lobbies or join existing ones when + admins disable minigames + - admin: Outfit manager UI no longer harddels after closing and thus is usable more + than once + - qol: Pathfinder MODule can now be triggered while wearing the MODsuit to implant + yourself without having to pull it out of the suit. + - spellcheck: Firelocks no longer output their full name in their balloon alert. + - spellcheck: Failure message when a xenomorph tries to force open a welded firelock + is now a balloon alert. + - bugfix: You can no longer fit an infinite amount of drivers into a clown car - + making spy-acquired clown cars usable! + - bugfix: Accelerator cannon projectiles no longer grow to absurd sizes after a + bit of travel. + - bugfix: Fixes overwatch glasses not adding HUDs + TheBoondock: + - sound: added pickup, dropping and opening sound for pill bottle + Xackii: + - rscadd: new wizard spells category - perks. + - rscadd: adds 9 wizard perks. + itseasytosee: + - image: Changed some default options in the character creator. + larentoun: + - bugfix: Correct emote plays when a human scream. Should have sound now. + lizardqueenlexi: + - bugfix: The Icebox ordnance lab is now once again a habitable temperature. + - bugfix: Icebox cytology now has cameras in it. + - bugfix: Atmosphere can no longer flow through closed necropolis gates. + - bugfix: You can no longer cause a bluescreen by attempting to recolor non-recolorable + loadout items. + necromanceranne: + - rscadd: Pipe pistols now magdump their entire magazine when fired. + - rscadd: Pipeguns and their subtypes have a knockback effect. + - bugfix: Pipe pistols cannot be bayoneted, as intended. + - bugfix: Junk rounds now actually do their extra damage effects against certain + mob types. Borgs across the Spinward tremble at the knowledge that these junk + weapons can obliterate them with ease. + paganiy: + - rscadd: If you can't shoot a gun, then... JUST TOSS IT AT THEM (for 0.5 seconds + of knockdown and 10-20 an additional brute damage) + r3dj4ck0424: + - bugfix: Destroying the jungle grass tiles in Tramstation's science wing should + no longer open a chasm. From 1f65065ec0b128b7c484620aa5b837c7dd3b8f3e Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+00-Steven@users.noreply.github.com> Date: Tue, 16 Jul 2024 03:58:59 +0200 Subject: [PATCH 02/49] Allows humans with a robotic voicebox installed, MMIs, and posibrains to use silicon emotes, and simple/basic bots to beep (#84912) ## About The Pull Request ### EDITED, see spoiler for previous about section. This pr adds the `TRAIT_SILICON_EMOTES_ALLOWED`, which is now used to determine what can perform silicons emotes instead of typechecks. We do this by adding a `trait_required` var to emotes, which if set is checked for in `can_run_emote(...)` and means the mob must have that trait to use the emote. We then adds this trait to all of the mobs previously capable of using silicon emotes and the beep emote, being: All silicons, basic bots, simple bots, orbies, and brain mobs. In addition, we add the trait to robotic voicebox users. Finally, it makes beeping a silicon emote. What this changes is that robotic voicebox users can beep and use other silicon emotes, basic and simple bots can actually beep, sentient orbies could use other silicon emotes, and brains can beep and use silicon emotes. Previously brains where on the allowed types list for beeping, but living emotes also blocked brains generally, so they couldn't _actually_ beep.
Previous About Section All this really does is add a new trait, `TRAIT_SILICON_EMOTES_ALLOWED`, which when given to a human allows them to use silicon emotes. It does this by adding the `/mob/living/carbon/human` type to the allowed types for these emotes, but then adding an additional check to `can_run_emote(...)` for these emotes to block it for humans if they don't have the trait. We add it to the typecache because the base checks for `can_run_emote(...)` would block if not for that, but we _do_ want the other checks it runs.
## Why It's Good For The Game I just think it'd be fun, really. Like, _I'd_ want to beep at people when I'm going out of my way to augment the shit out of my character. It's an item primarily accessible by roboticists and transhumanists, both of which are encouraged/required to interact with silicons, so I think this'd lead to fun interactions for those that do commit to getting the silicon-speech tongue replacement. Finally, I mean, it's a funky synthesizer that makes you sound like a silicon. Why shouldn't it let you synthesize these sounds too? Hell, even its attack verbs are beeping and booping already. ### EDITED, additional justification: It's weird for basic/simple bots to be able to use all other silicon emotes except beeping. MMI'd brains/posibrains being able to beep looked intentional, just broken. This fixes that. I feel we might as well just allow them to use other silicon emotes while we're at it. --- code/__DEFINES/traits/declarations.dm | 2 ++ code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + code/datums/emotes.dm | 4 ++++ code/modules/mob/living/basic/bots/_bots.dm | 2 +- code/modules/mob/living/basic/pets/orbie/orbie.dm | 1 + code/modules/mob/living/brain/brain.dm | 1 + code/modules/mob/living/emote.dm | 9 --------- code/modules/mob/living/silicon/robot/emote.dm | 11 +++++++++-- code/modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/mob/living/silicon/silicon.dm | 1 + code/modules/mob/living/simple_animal/bot/bot.dm | 1 + .../file_system/programs/virtual_pet.dm | 2 +- .../modules/surgery/organs/internal/tongue/_tongue.dm | 1 + 14 files changed, 25 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index a2925ee2e5b68..504e451f88c3e 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -234,6 +234,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EXAMINE_FITNESS "reveal_power_level" /// These mobs have particularly hygienic tongues #define TRAIT_WOUND_LICKER "wound_licker" +/// Mobs with this trait are allowed to use silicon emotes +#define TRAIT_SILICON_EMOTES_ALLOWED "silicon_emotes_allowed" /// This trait designate that the mob was originally a monkey #define TRAIT_BORN_MONKEY "born_as_a_monkey" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index d098e1c11fb82..1cf3678dbd3f9 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -439,6 +439,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, + "TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index a0ec998701541..d3617ccc87762 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -200,6 +200,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, + "TRAIT_SILICON_EMOTES_ALLOWED" = TRAIT_SILICON_EMOTES_ALLOWED, "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 7006d6d6daa71..71631de2d9887 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -44,6 +44,8 @@ var/list/mob_type_blacklist_typecache /// Types that can use this emote regardless of their state. var/list/mob_type_ignore_stat_typecache + /// Trait that is required to use this emote. + var/trait_required /// In which state can you use this emote? (Check stat.dm for a full list of them) var/stat_allowed = CONSCIOUS /// Sound to play when emote is called. @@ -297,6 +299,8 @@ * Returns a bool about whether or not the user can run the emote. */ /datum/emote/proc/can_run_emote(mob/user, status_check = TRUE, intentional = FALSE) + if(trait_required && !HAS_TRAIT(user, trait_required)) + return FALSE if(!is_type_in_typecache(user, mob_type_allowed_typecache)) return FALSE if(is_type_in_typecache(user, mob_type_blacklist_typecache)) diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 86fe0b5cf5704..aad840aa18548 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(command_strings, list( RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(handle_loop_movement)) RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(after_attacked)) RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) - ADD_TRAIT(src, TRAIT_NO_GLIDE, INNATE_TRAIT) + add_traits(list(TRAIT_NO_GLIDE, TRAIT_SILICON_EMOTES_ALLOWED), INNATE_TRAIT) GLOB.bots_list += src // Give bots a fancy new ID card that can hold any access. diff --git a/code/modules/mob/living/basic/pets/orbie/orbie.dm b/code/modules/mob/living/basic/pets/orbie/orbie.dm index 735f63977d362..c0c6dd7b023fc 100644 --- a/code/modules/mob/living/basic/pets/orbie/orbie.dm +++ b/code/modules/mob/living/basic/pets/orbie/orbie.dm @@ -50,6 +50,7 @@ var/static/list/food_types = list(/obj/item/food/virtual_chocolate) AddComponent(/datum/component/obeys_commands, pet_commands) AddElement(/datum/element/basic_eating, food_types = food_types) + ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) RegisterSignal(src, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled)) RegisterSignal(src, COMSIG_VIRTUAL_PET_LEVEL_UP, PROC_REF(on_level_up)) RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 1bacc08a8b6ff..17f5be02a91cf 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -16,6 +16,7 @@ forceMove(OB) if(!container?.mecha && (!container || container.immobilize)) //Unless inside a mecha, brains are rather helpless. add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), BRAIN_UNAIDED) + ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) /mob/living/brain/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) var/obj/item/organ/internal/brain/brain_loc = loc diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 9ccc26eec6cc2..ae79d87627243 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -715,15 +715,6 @@ /datum/emote/living/custom/replace_pronoun(mob/user, message) return message -/datum/emote/living/beep - key = "beep" - key_third_person = "beeps" - message = "beeps." - message_param = "beeps at %t." - sound = 'sound/machines/twobeep.ogg' - mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon, /mob/living/basic/orbie) - emote_type = EMOTE_AUDIBLE - /datum/emote/living/inhale key = "inhale" key_third_person = "inhales" diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index fb7857d458541..2215864782325 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,5 +1,5 @@ /datum/emote/silicon - mob_type_allowed_typecache = list(/mob/living/silicon, /mob/living/simple_animal/bot, /mob/living/basic/bot) + trait_required = TRAIT_SILICON_EMOTES_ALLOWED emote_type = EMOTE_AUDIBLE /datum/emote/silicon/boop @@ -7,6 +7,14 @@ key_third_person = "boops" message = "boops." +/datum/emote/silicon/beep + key = "beep" + key_third_person = "beeps" + message = "beeps." + message_param = "beeps at %t." + emote_type = EMOTE_AUDIBLE + sound = 'sound/machines/twobeep.ogg' + /datum/emote/silicon/buzz key = "buzz" key_third_person = "buzzes" @@ -15,7 +23,6 @@ emote_type = EMOTE_AUDIBLE sound = 'sound/machines/buzz-sigh.ogg' - /datum/emote/silicon/buzz2 key = "buzz2" message = "buzzes twice." diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 0c26e7c57e278..4813d97d12d38 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -11,7 +11,7 @@ post_tipped_callback = CALLBACK(src, PROC_REF(after_tip_over)), \ post_untipped_callback = CALLBACK(src, PROC_REF(after_righted)), \ roleplay_friendly = TRUE, \ - roleplay_emotes = list(/datum/emote/silicon/buzz, /datum/emote/silicon/buzz2, /datum/emote/living/beep), \ + roleplay_emotes = list(/datum/emote/silicon/buzz, /datum/emote/silicon/buzz2, /datum/emote/silicon/beep), \ roleplay_callback = CALLBACK(src, PROC_REF(untip_roleplay))) set_wires(new /datum/wires/robot(src)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 9ca655740cd08..6916c01f4d394 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -80,6 +80,7 @@ ) add_traits(traits_to_apply, ROUNDSTART_TRAIT) + ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) RegisterSignal(src, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_silicon_shocked)) /mob/living/silicon/Destroy() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 49b44122ac0e7..50b30b09aa88c 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -202,6 +202,7 @@ pa_system = new(src, automated_announcements = automated_announcements) pa_system.Grant(src) RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) + ADD_TRAIT(src, TRAIT_SILICON_EMOTES_ALLOWED, INNATE_TRAIT) /mob/living/simple_animal/bot/Destroy() GLOB.bots_list -= src diff --git a/code/modules/modular_computers/file_system/programs/virtual_pet.dm b/code/modules/modular_computers/file_system/programs/virtual_pet.dm index 7a0adba3cce6d..78a9148b013fe 100644 --- a/code/modules/modular_computers/file_system/programs/virtual_pet.dm +++ b/code/modules/modular_computers/file_system/programs/virtual_pet.dm @@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(virtual_pets_list) /datum/emote/living/jump, /datum/emote/living/shiver, /datum/emote/spin, - /datum/emote/living/beep, + /datum/emote/silicon/beep, ) data["possible_emotes"] = list("none") for(var/datum/emote/target_emote as anything in possible_emotes) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 7904c4bea91cc..fa034acf22bd7 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -546,6 +546,7 @@ GLOBAL_LIST_INIT(english_to_zombie, list()) attack_verb_simple = list("beep", "boop") modifies_speech = TRUE taste_sensitivity = 25 // not as good as an organic tongue + organ_traits = list(TRAIT_SILICON_EMOTES_ALLOWED) voice_filter = "alimiter=0.9,acompressor=threshold=0.2:ratio=20:attack=10:release=50:makeup=2,highpass=f=1000" /obj/item/organ/internal/tongue/robot/could_speak_language(datum/language/language_path) From b5e1251136842ecff478e46c4005183a78a605d3 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:59:20 +1200 Subject: [PATCH 03/49] Automatic changelog for PR #84912 [ci skip] --- html/changelogs/AutoChangeLog-pr-84912.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84912.yml diff --git a/html/changelogs/AutoChangeLog-pr-84912.yml b/html/changelogs/AutoChangeLog-pr-84912.yml new file mode 100644 index 0000000000000..9aa4c71dfa2b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84912.yml @@ -0,0 +1,7 @@ +author: "00-Steven" +delete-after: True +changes: + - rscadd: "Having a robotic voicebox installed now lets you use silicon emotes." + - balance: "MMI'd brains/posibrains can now use silicon emotes." + - balance: "Simple and basic bots can actually beep." + - bugfix: "MMI'd brains/posibrains are no longer both allowed AND blocked from beeping, now just being allowed to beep." \ No newline at end of file From 8d9534969fe20a671fcf67aa71170d340ee95b4a Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 16 Jul 2024 04:25:35 +0100 Subject: [PATCH 04/49] Fixes bookshelf attackby (#84929) ## About The Pull Request Closes #84884 Adds early returns, cleans up and fixes whatever was going in bookshelf attackby code due to lack of early returns and state weirdness. ## Changelog :cl: fix: You can attack bookshelves in a variety of states once more /:cl: --- code/modules/library/bookcase.dm | 128 ++++++++++++++++++------------- 1 file changed, 73 insertions(+), 55 deletions(-) diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index 16925dd5138e7..004db281c75c3 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -94,63 +94,81 @@ I.forceMove(Tsec) update_appearance() -/obj/structure/bookcase/attackby(obj/item/I, mob/user, params) - switch(state) - if(BOOKCASE_UNANCHORED) - if(I.tool_behaviour == TOOL_WRENCH) - if(I.use_tool(src, user, 20, volume=50)) - to_chat(user, span_notice("You wrench the frame into place.")) - set_anchored(TRUE) - else if(I.tool_behaviour == TOOL_CROWBAR) - if(I.use_tool(src, user, 20, volume=50)) - to_chat(user, span_notice("You pry the frame apart.")) - deconstruct(TRUE) +/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, params) + if(state == BOOKCASE_UNANCHORED) + if(attacking_item.tool_behaviour == TOOL_WRENCH) + if(attacking_item.use_tool(src, user, 20, volume=50)) + balloon_alert(user, "wrenched in place") + set_anchored(TRUE) + return + + if(attacking_item.tool_behaviour == TOOL_CROWBAR) + if(attacking_item.use_tool(src, user, 20, volume=50)) + balloon_alert(user, "pried apart") + deconstruct(TRUE) + return + return ..() - if(BOOKCASE_ANCHORED) - if(istype(I, /obj/item/stack/sheet/mineral/wood)) - var/obj/item/stack/sheet/mineral/wood/W = I - if(W.get_amount() >= 2) - W.use(2) - to_chat(user, span_notice("You add a shelf.")) - state = BOOKCASE_FINISHED - update_appearance() - else if(I.tool_behaviour == TOOL_WRENCH) - I.play_tool_sound(src, 100) - to_chat(user, span_notice("You unwrench the frame.")) - set_anchored(FALSE) + if(state == BOOKCASE_ANCHORED) + if(istype(attacking_item, /obj/item/stack/sheet/mineral/wood)) + var/obj/item/stack/sheet/mineral/wood/W = attacking_item + if(W.get_amount() < 2) + balloon_alert(user, "not enough wood") + return + W.use(2) + balloon_alert(user, "shelf added") + state = BOOKCASE_FINISHED + update_appearance() + return + + if(attacking_item.tool_behaviour == TOOL_WRENCH) + attacking_item.play_tool_sound(src, 100) + balloon_alert(user, "unwrenched the frame") + set_anchored(FALSE) + return + return ..() - if(BOOKCASE_FINISHED) - if(isbook(I)) - if(!user.transferItemToLoc(I, src)) - return - update_appearance() - else if(atom_storage) - for(var/obj/item/T in I.contents) - if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook)) - atom_storage.attempt_remove(T, src) - to_chat(user, span_notice("You empty \the [I] into \the [src].")) - update_appearance() - else if(IS_WRITING_UTENSIL(I)) - if(!user.can_perform_action(src) || !user.can_write(I)) - return - var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN) - if(!user.can_perform_action(src) || !user.can_write(I)) - return - if(!newname) - return - else - name = "bookcase ([sanitize(newname)])" - else if(I.tool_behaviour == TOOL_CROWBAR) - if(length(contents)) - to_chat(user, span_warning("You need to remove the books first!")) - else - I.play_tool_sound(src, 100) - to_chat(user, span_notice("You pry the shelf out.")) - new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) - state = BOOKCASE_ANCHORED - update_appearance() - else - return ..() + if(isbook(attacking_item)) + if(!user.transferItemToLoc(attacking_item, src)) + return ..() + update_appearance() + return + + if(atom_storage) + var/found_anything = FALSE + for(var/obj/item/T in attacking_item.contents) + if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook)) + atom_storage.attempt_remove(T, src) + found_anything = TRUE + + if (found_anything) + balloon_alert(user, "emptied into [src]") + update_appearance() + return + + if(IS_WRITING_UTENSIL(attacking_item)) + if(!user.can_perform_action(src) || !user.can_write(attacking_item)) + return ..() + var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN) + if(!user.can_perform_action(src) || !user.can_write(attacking_item)) + return ..() + if(!newname) + return + name = "bookcase ([sanitize(newname)])" + return + + if(attacking_item.tool_behaviour == TOOL_CROWBAR) + if(length(contents)) + balloon_alert(user, "remove the books first") + return + attacking_item.play_tool_sound(src, 100) + balloon_alert(user, "pried the shelf out") + new /obj/item/stack/sheet/mineral/wood(drop_location(), 2) + state = BOOKCASE_ANCHORED + update_appearance() + return + + return ..() /obj/structure/bookcase/attack_hand(mob/living/user, list/modifiers) . = ..() From 6c01e02a5a76250175dfcde434ae03ff7325b272 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:25:54 +1200 Subject: [PATCH 05/49] Automatic changelog for PR #84929 [ci skip] --- html/changelogs/AutoChangeLog-pr-84929.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84929.yml diff --git a/html/changelogs/AutoChangeLog-pr-84929.yml b/html/changelogs/AutoChangeLog-pr-84929.yml new file mode 100644 index 0000000000000..2a4ac91e68442 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84929.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "You can attack bookshelves in a variety of states once more" \ No newline at end of file From 338ff5b2a8c7c2a34f0a950af6f6256e3eb54c4e Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 16 Jul 2024 04:26:24 +0100 Subject: [PATCH 06/49] You can no longer move chairs as a ghost (#84972) ## About The Pull Request Partially handles #84971 ## Changelog :cl: fix: Ghosts can no longer move chairs /:cl: --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> --- .../objects/structures/beds_chairs/chair.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 1783d4b236a63..9d0a60a5c9ca3 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -264,15 +264,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) return /obj/structure/chair/mouse_drop_dragged(atom/over_object, mob/user, src_location, over_location, params) - if(over_object == user) - if(!item_chair || has_buckled_mobs()) - return - user.visible_message(span_notice("[user] grabs \the [src.name]."), span_notice("You grab \the [src.name].")) - var/obj/item/C = new item_chair(loc) - C.set_custom_materials(custom_materials) - TransferComponents(C) - user.put_in_hands(C) - qdel(src) + if(!isliving(user) || over_object != user) + return + if(!item_chair || has_buckled_mobs()) + return + user.visible_message(span_notice("[user] grabs \the [src.name]."), span_notice("You grab \the [src.name].")) + var/obj/item/C = new item_chair(loc) + C.set_custom_materials(custom_materials) + TransferComponents(C) + user.put_in_hands(C) + qdel(src) /obj/structure/chair/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) return ..() From 7eb826ade031c5c23ef2496718b3d4745b734b9e Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:26:47 +1200 Subject: [PATCH 07/49] Automatic changelog for PR #84972 [ci skip] --- html/changelogs/AutoChangeLog-pr-84972.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84972.yml diff --git a/html/changelogs/AutoChangeLog-pr-84972.yml b/html/changelogs/AutoChangeLog-pr-84972.yml new file mode 100644 index 0000000000000..69e048c3ccca3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84972.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Ghosts can no longer move chairs" \ No newline at end of file From a378fea3e0893fbdd37faf95fbe60aeb0cd861f6 Mon Sep 17 00:00:00 2001 From: carlarctg <53100513+carlarctg@users.noreply.github.com> Date: Tue, 16 Jul 2024 00:33:05 -0300 Subject: [PATCH 08/49] Split security gloves from black gloves, gave sprites to those and tackling gloves, moves tackling to right-click (#84909) ## About The Pull Request Added security gloves, which have the fast cuff trait. Normal black gloves no longer have them. Adds sprites for security and tackling gloves, moves tackling to right-click! Also added blue security gloves for the blue sec PR. Whoever merges it first will, assumedly, add it then. Sprites here: ![image](https://github.com/user-attachments/assets/034628df-91b4-4c17-b018-a67beb76ae1c) Moved tackling to right click. ## Why It's Good For The Game > Added security gloves, which have the fast cuff trait. Normal black gloves no longer have them. Didn't make any sense that normie gloves had these. It was an undocumented feature! Why can jannies fast cuff! > Adds sprites for security and tackling gloves, moves tackling to right-click! Really smells that these don't have sprites so I quickly slapped some up, edited from tackler and CE insuls. > Also added blue security gloves for the blue sec PR. Whoever merges it first will, assumedly, add it then. We can't have blue sec with red gloves!!! > Moved tackling to right click. It's so fuckin annoying to accidentally tackle when you're trying to throw something. It's the biggest thing that prevents me from putting on gloves. Now it'll rarely, if ever, be a problem: Pressing right click while thowing mode is on is unlikely to ever happen accidentally. ## Changelog :cl: add: Added security gloves, which have the fast cuff trait. Normal black gloves no longer have them. imageadd: Adds sprites for security and tackling gloves, moves tackling to right-click! imageadd: Also added blue security gloves for the blue sec PR. Whoever merges it first will, assumedly, add it then. qol: Moved tackling to right click. /:cl: --- code/_globalvars/lists/maintenance_loot.dm | 2 +- code/datums/components/tackle.dm | 5 ++++- code/game/machinery/washing_machine.dm | 2 +- .../game/objects/items/storage/uplink_kits.dm | 2 +- code/modules/clothing/gloves/color.dm | 10 +++++++++- code/modules/clothing/gloves/tacklers.dm | 8 ++++---- .../jobs/job_types/head_of_security.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/warden.dm | 2 +- code/modules/mafia/outfits.dm | 6 +++--- code/modules/vending/security.dm | 1 + code/modules/vending/wardrobes.dm | 3 ++- icons/mob/clothing/hands.dmi | Bin 19292 -> 17735 bytes icons/obj/clothing/gloves.dmi | Bin 26409 -> 31473 bytes 14 files changed, 29 insertions(+), 16 deletions(-) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 76c69425bf54b..e44516d2f2873 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -312,7 +312,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items list(//equipment /obj/item/clothing/glasses/hud/security = 1, /obj/item/clothing/glasses/sunglasses = 1, - /obj/item/clothing/gloves/color/black = 1, + /obj/item/clothing/gloves/color/black/security = 1, /obj/item/clothing/gloves/color/yellow = 1, /obj/item/clothing/gloves/tackler/combat = 1, /obj/item/clothing/head/helmet/toggleable/justice = 1, diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index b8621d382f6fb..8e902ced2fdbf 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -43,7 +43,7 @@ src.min_distance = min_distance var/mob/P = parent - to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and clicking on your target with an empty hand.")) + to_chat(P, span_notice("You are now able to launch tackles! You can do so by activating throw mode, and ") + span_boldnotice("RIGHT-CLICKING on your target with an empty hand.")) addtimer(CALLBACK(src, PROC_REF(resetTackle)), base_knockdown, TIMER_STOPPABLE) @@ -74,6 +74,9 @@ if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) return + if(!modifiers[RIGHT_CLICK]) + return + if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated()) return diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 21804def7e361..b3aba350c3368 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_INIT(dye_registry, list( DYE_QM = /obj/item/clothing/gloves/color/brown, DYE_CAPTAIN = /obj/item/clothing/gloves/captain, DYE_HOP = /obj/item/clothing/gloves/color/grey, - DYE_HOS = /obj/item/clothing/gloves/color/black, + DYE_HOS = /obj/item/clothing/gloves/color/black/security, DYE_CE = /obj/item/clothing/gloves/chief_engineer, DYE_RD = /obj/item/clothing/gloves/color/grey, DYE_CMO = /obj/item/clothing/gloves/latex/nitrile, diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index d3e41b21a986b..eacd0b4b630d0 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -267,7 +267,7 @@ if(KIT_MR_FREEZE) new /obj/item/clothing/glasses/cold(src) - new /obj/item/clothing/gloves/color/black(src) + new /obj/item/clothing/gloves/color/black/security/blu(src) new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/suit/hooded/wintercoat(src) new /obj/item/clothing/shoes/winterboots(src) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index bb0e12809955e..82b1eb8f37954 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -9,7 +9,6 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE cut_type = /obj/item/clothing/gloves/fingerless - clothing_traits = list(TRAIT_FAST_CUFFING) /obj/item/clothing/gloves/color/black/Initialize(mapload) . = ..() @@ -20,6 +19,15 @@ slapcraft_recipes = slapcraft_recipe_list,\ ) +/obj/item/clothing/gloves/color/black/security + name = "security gloves" + desc = "These security gloves come with microchips that help the user quickly restrain suspects." + icon_state = "sec" + clothing_traits = list(TRAIT_FAST_CUFFING) + +/obj/item/clothing/gloves/color/black/security/blu + icon_state = "sec_blu" + /obj/item/clothing/gloves/fingerless name = "fingerless gloves" desc = "Plain black gloves without fingertips for the hard-working." diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index 4adb374d92bd7..bbe7f5dba18b4 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -59,9 +59,8 @@ /obj/item/clothing/gloves/tackler/combat name = "gorilla gloves" desc = "Premium quality combative gloves, heavily reinforced to give the user an edge in close combat tackles, though they are more taxing to use than normal gripper gloves. Fireproof to boot!" - icon_state = "black" - inhand_icon_state = "greyscale_gloves" - greyscale_colors = "#2f2e31" + icon_state = "gorilla" + inhand_icon_state = null tackle_stam_cost = 30 base_knockdown = 1.25 SECONDS @@ -77,6 +76,7 @@ /obj/item/clothing/gloves/tackler/combat/insulated name = "guerrilla gloves" desc = "Superior quality combative gloves, good for performing tackle takedowns as well as absorbing electrical shocks." + icon_state = "guerrilla" siemens_coefficient = 0 armor_type = /datum/armor/combat_insulated @@ -101,7 +101,7 @@ desc = "Ratty looking fingerless gloves wrapped with sticky tape. Beware anyone wearing these, for they clearly have no shame and nothing to lose." icon_state = "fingerless" inhand_icon_state = null - + clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) tackle_stam_cost = 30 base_knockdown = 1.75 SECONDS min_distance = 2 diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 999117dc1be15..f3627c3c2a257 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -59,7 +59,7 @@ belt = /obj/item/modular_computer/pda/heads/hos ears = /obj/item/radio/headset/heads/hos/alt glasses = /obj/item/clothing/glasses/hud/security/sunglasses - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/color/black/security head = /obj/item/clothing/head/hats/hos/beret shoes = /obj/item/clothing/shoes/jackboots/sec l_pocket = /obj/item/restraints/handcuffs diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 4fb52ec77a026..9b2dc91137cd5 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -218,7 +218,7 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) ) belt = /obj/item/modular_computer/pda/security ears = /obj/item/radio/headset/headset_sec/alt - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/color/black/security head = /obj/item/clothing/head/helmet/sec shoes = /obj/item/clothing/shoes/jackboots/sec l_pocket = /obj/item/restraints/handcuffs diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 643611201c8c1..c1d2c032901f7 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -56,7 +56,7 @@ belt = /obj/item/modular_computer/pda/warden ears = /obj/item/radio/headset/headset_sec/alt glasses = /obj/item/clothing/glasses/hud/security/sunglasses - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/color/black/security head = /obj/item/clothing/head/hats/warden/red shoes = /obj/item/clothing/shoes/jackboots/sec l_pocket = /obj/item/restraints/handcuffs diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index 3b805bd92f9c0..0fdc90c2f3213 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -89,7 +89,7 @@ name = "Mafia Security Officer" uniform = /obj/item/clothing/under/rank/security/officer - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/color/black/security head = /obj/item/clothing/head/helmet/sec suit = /obj/item/clothing/suit/armor/vest/alt shoes = /obj/item/clothing/shoes/jackboots @@ -116,7 +116,7 @@ uniform = /obj/item/clothing/under/rank/security/head_of_security shoes = /obj/item/clothing/shoes/jackboots suit = /obj/item/clothing/suit/armor/hos/trenchcoat - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/color/black/security head = /obj/item/clothing/head/hats/hos/beret glasses = /obj/item/clothing/glasses/hud/security/sunglasses @@ -126,7 +126,7 @@ uniform = /obj/item/clothing/under/rank/security/warden shoes = /obj/item/clothing/shoes/jackboots suit = /obj/item/clothing/suit/armor/vest/warden/alt - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/color/black/security head = /obj/item/clothing/head/hats/warden/red glasses = /obj/item/clothing/glasses/hud/security/sunglasses diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index ebecb03e1302c..32ef86a302b26 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -26,6 +26,7 @@ /obj/item/storage/belt/security/webbing = 5, /obj/item/coin/antagtoken = 1, /obj/item/clothing/head/helmet/blueshirt = 1, + /obj/item/clothing/gloves/color/black/security/blu = 1, /obj/item/clothing/suit/armor/vest/blueshirt = 1, /obj/item/grenade/stingbang = 1, /obj/item/watertank/pepperspray = 2, diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 3f82a219e56c9..ef2eff9d991ec 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -50,10 +50,11 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/clothing/under/rank/security/officer/grey = 3, /obj/item/clothing/under/pants/slacks = 3, /obj/item/clothing/under/rank/security/officer/blueshirt = 3, + /obj/item/clothing/gloves/color/black/security/blu = 3, /obj/item/clothing/suit/armor/vest/secjacket = 3, /obj/item/clothing/suit/hooded/wintercoat/security = 3, /obj/item/clothing/suit/armor/vest = 3, - /obj/item/clothing/gloves/color/black = 3, + /obj/item/clothing/gloves/color/black/security = 3, /obj/item/clothing/shoes/jackboots/sec = 3, /obj/item/storage/backpack/security = 3, /obj/item/storage/backpack/satchel/sec = 3, diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index ded01542e31b6b8a015f9cc3c042ae3c98bd8fe0..b62b6a0a8ee583f8673f588692f382ca686d5e0d 100644 GIT binary patch literal 17735 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:TSAHht&NOJUzo^QTn} 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 From 985b84d617bacb2c15747d1ab15a70251748c9ed Mon Sep 17 00:00:00 2001 From: Thedragmeme <81540056+Draggeru@users.noreply.github.com> Date: Mon, 15 Jul 2024 21:38:23 -0600 Subject: [PATCH 09/49] Lavaland raptor barn improvements (#84967) ## About The Pull Request This PR re-maps the lavaland raptor barn to: 1. Have bridge access from public and regular mining so people are not forced to build one themselves 2. Give the area a bit of spice to look more visually interesting 3. Gives anyone working on raptors less of a giant walk to go eat ![pee arr](https://github.com/user-attachments/assets/34c44db8-878a-48a4-9888-850a6770d74e)
In game screenshots ![Merde Stopover Theta 2024-07-14 165108](https://github.com/user-attachments/assets/025157b7-2b6d-4447-8d98-ec3efde4fc10) ![Merde Stopover Theta 2024-07-14 165104](https://github.com/user-attachments/assets/36e98170-977a-4288-8ad1-8684c4510a65) ![Merde Stopover Theta 2024-07-14 165059](https://github.com/user-attachments/assets/1a264fc1-5dbd-4d82-a68b-1b004141429e) ![Merde Stopover Theta 2024-07-14 165036](https://github.com/user-attachments/assets/fa96b5f2-338e-4370-9bcc-8bf4a0f9543f) ![Merde Stopover Theta 2024-07-14 165031](https://github.com/user-attachments/assets/b333df16-38bd-472d-aad0-4f868d4e6a77)
## Why It's Good For The Game It seems like a major oversight that there was no reliable walkway to and from the barn. Additionally, the barn currently looks out of place. This PR makes it a cohesive themed area, making it more comfortable and attractive to interact with while fitting better into the overall "on lavaland" theme. ## Changelog :cl: Thedragmeme qol: re-maps the raptor barn to not stick out like a sore thumb fix: Miners and the public both can access the raptor barn without having to make a bridge themselves /:cl: --- _maps/map_files/Mining/Lavaland.dmm | 3510 ++++++++++++++++----------- code/game/area/areas/mining.dm | 4 + 2 files changed, 2040 insertions(+), 1474 deletions(-) diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 5bc3a711a1b03..c60ba12150276 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -82,6 +82,12 @@ /obj/item/clothing/glasses/meson, /turf/open/floor/iron/dark, /area/mine/storage/public) +"as" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "av" = ( /obj/machinery/computer/arcade/orion_trail{ dir = 4 @@ -93,6 +99,16 @@ /obj/structure/cable, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"aF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) +"aH" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "aM" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "lavaland_living_east_maint" @@ -137,6 +153,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/maintenance/service) +"aX" = ( +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) +"ba" = ( +/obj/structure/chair/sofa/middle{ + dir = 1; + color = "#AA4A44" + }, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "bb" = ( /obj/structure/closet/crate/internals, /obj/item/tank/internals/emergency_oxygen, @@ -154,6 +184,13 @@ dir = 4 }, /area/mine/laborcamp/production) +"be" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Raptor Ranch External Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lobby/raptor) "bf" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, @@ -197,6 +234,10 @@ }, /turf/open/floor/plating, /area/mine/maintenance/production) +"bE" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "bH" = ( /obj/structure/table, /obj/item/book/manual/chef_recipes{ @@ -344,11 +385,10 @@ /turf/open/floor/plating, /area/mine/maintenance/service) "ct" = ( -/obj/structure/railing/wooden_fence{ - dir = 6 - }, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/marker_beacon/purple, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "cw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -506,6 +546,13 @@ }, /turf/open/floor/iron/white, /area/mine/cafeteria) +"de" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/lattice/catwalk/mining, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "dh" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -581,6 +628,19 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"dF" = ( +/obj/structure/table/wood, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) +"dI" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lobby/raptor) "dJ" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -628,6 +688,12 @@ /obj/item/soap/homemade, /turf/open/floor/iron/freezer, /area/mine/laborcamp) +"ej" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "eo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -713,6 +779,18 @@ dir = 8 }, /area/mine/cafeteria) +"eL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) +"eN" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "eP" = ( /obj/structure/chair/sofa/left/brown, /obj/effect/turf_decal/tile/bar/opposingcorners{ @@ -754,6 +832,9 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/laborcamp/security/maintenance) +"fa" = ( +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "fb" = ( /obj/structure/railing/corner{ dir = 4 @@ -855,6 +936,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/maintenance/service) +"fK" = ( +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/railing, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "fL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1197,6 +1283,10 @@ /obj/structure/sign/poster/official/cleanliness/directional/north, /turf/open/floor/iron/freezer, /area/mine/living_quarters) +"hl" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "hn" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -1315,8 +1405,12 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "hM" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/lavaland/surface) +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "hR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1418,7 +1512,7 @@ "il" = ( /obj/item/flashlight/lantern/on, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "io" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1523,6 +1617,13 @@ dir = 1 }, /area/mine/living_quarters) +"jb" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/structure/lattice/catwalk/mining, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "jc" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -1598,6 +1699,10 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"jt" = ( +/obj/structure/fireplace, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "jw" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -1642,6 +1747,11 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"jJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "jL" = ( /obj/structure/stone_tile/surrounding_tile, /obj/structure/stone_tile/surrounding_tile{ @@ -1692,11 +1802,12 @@ }, /area/mine/production) "jX" = ( -/obj/structure/railing/wooden_fence{ +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "ka" = ( /obj/structure/table, /obj/machinery/newscaster/directional/north, @@ -1707,9 +1818,19 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) +"kf" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "kg" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp) +"ki" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lobby/raptor) "kk" = ( /obj/structure/stone_tile/block{ dir = 8 @@ -1959,10 +2080,7 @@ /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) "lt" = ( -/obj/structure/railing/wooden_fence{ - dir = 5 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/turf/open/misc/hay/lavaland, /area/lavaland/surface/outdoors) "lv" = ( /obj/structure/stone_tile/block/cracked{ @@ -2100,6 +2218,10 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/mine/lounge) +"lP" = ( +/obj/item/flashlight/lantern/on, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "lQ" = ( /obj/structure/stone_tile/surrounding/cracked{ dir = 6 @@ -2200,7 +2322,7 @@ }, /obj/item/raptor_dex, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "ml" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -2613,6 +2735,12 @@ /obj/effect/spawner/random/trash/food_packaging, /turf/open/floor/iron/checker, /area/mine/laborcamp) +"nO" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "nP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/scrubber, @@ -2789,6 +2917,15 @@ /obj/effect/turf_decal/trimline/green/filled/line, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"oO" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining External Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lobby/raptor) "oS" = ( /obj/machinery/door/airlock/external/glass{ name = "Mining External Airlock" @@ -2935,6 +3072,12 @@ }, /turf/open/floor/plating, /area/mine/laborcamp) +"pF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "pH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2960,6 +3103,10 @@ /obj/structure/sign/poster/official/cleanliness/directional/north, /turf/open/floor/iron/freezer, /area/mine/laborcamp/quarters) +"pM" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/mine/lobby/raptor) "pO" = ( /obj/machinery/shower/directional/south, /obj/machinery/door/window/left/directional/south, @@ -3051,12 +3198,6 @@ dir = 4 }, /area/mine/laborcamp/quarters) -"qi" = ( -/obj/structure/railing/wooden_fence{ - dir = 4 - }, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) "qo" = ( /obj/machinery/door/airlock/glass{ name = "Equipment Storage" @@ -3125,6 +3266,11 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) +"qB" = ( +/obj/machinery/smartfridge/drying_rack, +/obj/item/food/cheese/firm_cheese, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "qH" = ( /obj/machinery/door/airlock{ id_tag = "miningbathroomprivate"; @@ -3184,6 +3330,35 @@ }, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) +"rf" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) +"rj" = ( +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = -1; + pixel_x = 5 + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = 9; + pixel_x = 8 + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?" + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "rm" = ( /obj/structure/sign/warning/gas_mask/directional/west, /obj/effect/decal/cleanable/dirt, @@ -3225,6 +3400,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/maintenance/service) +"rB" = ( +/obj/structure/chair/sofa/corner{ + dir = 1; + color = "#AA4A44" + }, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "rF" = ( /turf/closed/wall/r_wall, /area/mine/maintenance/labor) @@ -3299,7 +3481,7 @@ /obj/structure/table/wood, /obj/item/flashlight/lantern/on, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "se" = ( /turf/open/floor/iron/dark/textured_large, /area/mine/eva) @@ -3399,7 +3581,7 @@ "sQ" = ( /obj/structure/ore_container/food_trough/raptor_trough, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "sR" = ( /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, @@ -3473,6 +3655,13 @@ dir = 4 }, /area/mine/cafeteria) +"tf" = ( +/obj/structure/chair/sofa/corner{ + dir = 8; + color = "#AA4A44" + }, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "tg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance{ @@ -3628,6 +3817,12 @@ /obj/item/crowbar/large/emergency, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"up" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "uq" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -3654,7 +3849,7 @@ "uw" = ( /obj/effect/spawner/random/lavaland_mob/raptor, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "ux" = ( /obj/machinery/door/airlock{ id_tag = "miningdorm1"; @@ -3817,6 +4012,12 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/hydroponics) +"vr" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "vu" = ( /obj/structure/bed/medical/emergency, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3885,6 +4086,14 @@ /obj/item/cigbutt, /turf/open/floor/iron/smooth, /area/mine/laborcamp) +"vM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "vN" = ( /obj/machinery/computer/records/security, /obj/structure/cable, @@ -3936,6 +4145,12 @@ /obj/effect/turf_decal/siding/wideplating_new, /turf/open/floor/iron/checker, /area/mine/laborcamp) +"wa" = ( +/obj/machinery/camera/autoname/directional/north{ + network = list("mine") + }, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "wb" = ( /obj/structure/chair{ dir = 8 @@ -4225,6 +4440,12 @@ dir = 1 }, /area/mine/storage/public) +"xW" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "yc" = ( /obj/docking_port/stationary{ dir = 2; @@ -4399,8 +4620,7 @@ /turf/open/floor/plating, /area/mine/maintenance/service) "ze" = ( -/obj/effect/spawner/random/lavaland_mob/raptor, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/turf/open/misc/ashplanet/rocky, /area/lavaland/surface/outdoors) "zf" = ( /obj/machinery/door/airlock{ @@ -4459,9 +4679,12 @@ /turf/open/floor/iron/smooth, /area/mine/laborcamp) "zs" = ( -/obj/structure/railing/wooden_fence, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/lattice/catwalk/mining, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "zw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4552,6 +4775,13 @@ /obj/structure/cable, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"zX" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "Ae" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4567,6 +4797,13 @@ }, /turf/open/floor/plating, /area/mine/laborcamp/production) +"Ah" = ( +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "Ai" = ( /obj/structure/stone_tile/cracked{ dir = 1 @@ -4602,11 +4839,21 @@ /obj/effect/mapping_helpers/airlock/access/any/supply/mining_station, /turf/open/floor/iron/dark/textured_large, /area/mine/production) +"Av" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "Ax" = ( /obj/item/pickaxe, /obj/effect/mob_spawn/corpse/human/miner, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Az" = ( +/obj/item/flashlight/lantern/on, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "AA" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment, @@ -4620,6 +4867,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/mine/laborcamp) +"AF" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "AI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4797,12 +5051,31 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) -"Cv" = ( -/obj/structure/railing/wooden_fence{ - dir = 5 +"Cn" = ( +/obj/structure/table/wood, +/obj/item/plate{ + pixel_x = 6; + pixel_y = 7 }, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/obj/item/plate{ + pixel_x = -6; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) +"Cv" = ( +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/marker_beacon/purple, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "Cz" = ( /obj/machinery/door/airlock/medical/glass{ name = "Infirmary" @@ -4901,6 +5174,9 @@ /obj/structure/curtain, /turf/open/floor/iron/freezer, /area/mine/living_quarters) +"CV" = ( +/turf/closed/wall/mineral/iron, +/area/mine/lobby/raptor) "CX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -4978,10 +5254,9 @@ /turf/closed/wall, /area/mine/medical) "DB" = ( -/obj/structure/railing/wooden_fence{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/obj/structure/marker_beacon/purple, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) "DF" = ( /obj/structure/cable, @@ -5149,6 +5424,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/mine/maintenance/service) +"EL" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lounge) "EM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -5162,6 +5441,12 @@ dir = 1 }, /area/mine/production) +"EP" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "EQ" = ( /turf/open/floor/iron/smooth_edge{ dir = 8 @@ -5216,6 +5501,12 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Fo" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "Fp" = ( /obj/structure/table, /obj/machinery/recharger, @@ -5224,6 +5515,13 @@ }, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) +"Fr" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining Shuttle Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/turf/open/floor/iron/dark/textured_large, +/area/mine/production) "Fs" = ( /obj/effect/turf_decal/sand/plating/volcanic, /obj/effect/spawner/random/maintenance/two, @@ -5267,6 +5565,10 @@ "FH" = ( /turf/closed/wall, /area/lavaland/surface/outdoors) +"FI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "FL" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small/directional/west, @@ -5388,11 +5690,8 @@ }, /area/mine/production) "GG" = ( -/obj/structure/railing/wooden_fence{ - dir = 9 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "GH" = ( /obj/machinery/door/airlock/glass{ name = "Arrival Lounge" @@ -5402,6 +5701,12 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/mine/lounge) +"GI" = ( +/obj/structure/rack, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/lighter, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "GL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5464,6 +5769,18 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/mine/maintenance/public/north) +"Hj" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Mining External Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lounge) +"Hl" = ( +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lounge) "Hp" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -5781,6 +6098,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/mine/laborcamp) +"Jg" = ( +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "Jh" = ( /obj/structure/cable, /obj/machinery/light/small/directional/east, @@ -5950,6 +6274,13 @@ dir = 1 }, /area/mine/living_quarters) +"JQ" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Raptor Ranch External Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lounge) "JR" = ( /obj/structure/stone_tile, /obj/structure/stone_tile{ @@ -6031,6 +6362,41 @@ /obj/structure/girder, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Km" = ( +/obj/structure/rack, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?" + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = 9 + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = 6 + }, +/obj/item/food/grown/grass/fairy{ + name = "weird hay"; + desc = "Somehow, somewhere, this tells you it should increase your friendship level with your animals. Too bad that doesn't work, right?"; + pixel_y = 6; + pixel_x = 9 + }, +/obj/item/crowbar/large, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "Kn" = ( /obj/machinery/telecomms/relay/preset/mining, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6123,6 +6489,12 @@ }, /turf/open/floor/iron/checker, /area/mine/cafeteria) +"KO" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "KV" = ( /obj/structure/table, /obj/machinery/light/directional/east, @@ -6243,6 +6615,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/mine/storage) +"Lv" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "Lw" = ( /obj/effect/turf_decal/sand/plating/volcanic, /obj/effect/turf_decal/stripes/line{ @@ -6348,6 +6729,13 @@ }, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) +"LV" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/structure/lattice/catwalk/mining, +/turf/open/lava/smooth/lava_land_surface, +/area/lavaland/surface/outdoors) "LY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -6392,6 +6780,10 @@ dir = 8 }, /area/mine/lounge) +"Mf" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "Mr" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -6574,6 +6966,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth_large, /area/mine/laborcamp/production) +"Ns" = ( +/obj/structure/flora/ash/fireblossom, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Nt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/small/directional/west, @@ -6627,11 +7023,8 @@ /turf/open/floor/iron/dark, /area/mine/production) "NK" = ( -/obj/structure/railing/wooden_fence{ - dir = 1 - }, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/turf/open/misc/ashplanet/ash, +/area/lavaland/surface/outdoors) "NL" = ( /obj/structure/railing, /obj/structure/lattice/catwalk/mining, @@ -6641,6 +7034,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/laborcamp/security/maintenance) +"NP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating/lavaland_atmos, +/area/mine/lobby/raptor) "NR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -6652,7 +7052,7 @@ /area/mine/laborcamp/production) "NS" = ( /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "NT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6747,6 +7147,13 @@ }, /turf/open/floor/iron, /area/mine/lounge) +"Oo" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/item/reagent_containers/cup/bucket/wooden, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Op" = ( /obj/structure/stone_tile/slab, /turf/open/misc/asteroid/basalt/lava_land_surface, @@ -6768,6 +7175,16 @@ dir = 4 }, /area/mine/laborcamp/security) +"OE" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "OH" = ( /obj/item/storage/fancy/cigarettes/cigpack_robust{ pixel_x = -8; @@ -6824,7 +7241,7 @@ }, /obj/item/soap/deluxe, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "OZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6834,6 +7251,10 @@ dir = 1 }, /area/mine/mechbay) +"Pb" = ( +/obj/structure/water_source/puddle, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Pc" = ( /obj/structure/closet/crate/grave, /turf/open/misc/asteroid/basalt/lava_land_surface, @@ -6844,6 +7265,13 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating/lavaland_atmos, /area/lavaland/surface/outdoors) +"Pe" = ( +/obj/structure/lattice/catwalk/mining, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "Pi" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, @@ -6881,6 +7309,12 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/mine/cafeteria) +"Pn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "Po" = ( /obj/structure/table, /obj/item/paper/guides/jobs/security/labor_camp, @@ -7187,6 +7621,28 @@ }, /turf/open/floor/iron/dark, /area/mine/production) +"Ri" = ( +/obj/item/canvas/twentythree_nineteen, +/obj/structure/easel, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) +"Rj" = ( +/obj/machinery/suit_storage_unit/mining, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_edge{ + dir = 8 + }, +/area/mine/eva) +"Rm" = ( +/obj/structure/bed, +/obj/effect/spawner/random/bedsheet, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "Ro" = ( /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -7271,6 +7727,13 @@ /obj/structure/lattice/catwalk, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"RO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/mine/eva) "RV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -7332,6 +7795,11 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Sj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "Sm" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/yellow, @@ -7345,6 +7813,14 @@ }, /turf/open/floor/iron/dark, /area/mine/hydroponics) +"Sp" = ( +/obj/structure/easel, +/obj/item/canvas/fortyfive_twentyseven, +/obj/item/canvas/thirtysix_twentyfour, +/obj/item/canvas/twentythree_nineteen, +/obj/item/paint_palette, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "Sq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable, @@ -7517,17 +7993,22 @@ }, /area/mine/production) "Tt" = ( -/obj/structure/railing/wooden_fence{ - dir = 10 +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 }, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "Tu" = ( /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/smooth, /area/mine/laborcamp) +"Tw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "Tx" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -7706,6 +8187,10 @@ }, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Uz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "UD" = ( /obj/structure/toilet{ dir = 8 @@ -7713,9 +8198,7 @@ /turf/open/floor/iron/freezer, /area/mine/living_quarters) "UI" = ( -/obj/structure/railing/wooden_fence{ - dir = 4 - }, +/obj/structure/flora/ash/stem_shroom, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "UK" = ( @@ -7796,11 +8279,9 @@ /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Vd" = ( -/obj/structure/railing/wooden_fence{ - dir = 9 - }, +/obj/structure/railing, /turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/area/mine/lobby/raptor) "Ve" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, @@ -7922,6 +8403,15 @@ }, /turf/open/floor/iron/checker, /area/mine/laborcamp) +"VI" = ( +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet/red, +/area/mine/lobby/raptor) "VJ" = ( /obj/structure/closet/crate, /obj/item/food/mint, @@ -7945,11 +8435,11 @@ /turf/open/floor/plating, /area/mine/maintenance/labor) "VP" = ( -/obj/structure/railing/wooden_fence{ +/obj/effect/turf_decal/siding/wood/end{ dir = 8 }, -/turf/open/misc/hay/lavaland, -/area/lavaland/surface) +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "VS" = ( /obj/machinery/hydroponics/constructable, /obj/effect/decal/cleanable/dirt, @@ -7959,6 +8449,12 @@ /obj/item/seeds/potato, /turf/open/floor/iron/dark, /area/mine/laborcamp) +"VU" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "VX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -7989,6 +8485,18 @@ /obj/effect/turf_decal/sand/plating/volcanic, /turf/open/floor/plating/lavaland_atmos, /area/mine/lounge) +"Wh" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Wk" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) "Wl" = ( /obj/machinery/door/airlock/external/glass{ name = "Mining External Airlock" @@ -8008,6 +8516,12 @@ dir = 1 }, /area/mine/laborcamp/security) +"Wq" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) "Wt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/disposalpipe/segment, @@ -8174,6 +8688,10 @@ dir = 4 }, /area/mine/production) +"Xk" = ( +/obj/effect/spawner/random/lavaland_mob/raptor, +/turf/open/misc/hay/lavaland, +/area/lavaland/surface/outdoors) "Xp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8265,7 +8783,7 @@ /area/mine/laborcamp) "XM" = ( /obj/structure/sign/directions/evac/directional/south{ - pixel_x = 32; + pixel_x = -32; pixel_y = 0 }, /turf/open/floor/iron/dark/textured_large, @@ -8360,6 +8878,8 @@ /area/mine/lounge) "Yg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/mine/eva) "Yk" = ( @@ -8438,6 +8958,14 @@ /obj/structure/barricade/wooden, /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"YP" = ( +/obj/structure/bookcase/random/reference, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) "YR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8520,6 +9048,10 @@ }, /turf/open/floor/iron/smooth, /area/mine/laborcamp/production) +"Zs" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "Zt" = ( /turf/closed/wall, /area/mine/laborcamp) @@ -8559,6 +9091,18 @@ dir = 8 }, /area/mine/lounge) +"ZB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/mine/lobby/raptor) +"ZF" = ( +/obj/effect/turf_decal/sand/plating/volcanic, +/obj/effect/turf_decal/sand/plating/volcanic, +/turf/open/floor/plating/lavaland_atmos, +/area/lavaland/surface/outdoors) "ZH" = ( /obj/structure/closet/secure_closet/labor_camp_security, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -8567,6 +9111,13 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/mine/laborcamp/security) +"ZL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/wood, +/obj/structure/cable, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "ZM" = ( /obj/structure/railing{ dir = 8 @@ -8597,6 +9148,17 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /turf/open/floor/plating, /area/mine/maintenance/public/north) +"ZU" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/misc/hay/lavaland, +/area/mine/lobby/raptor) +"ZX" = ( +/obj/structure/table/wood, +/obj/item/knife, +/turf/open/floor/wood/parquet, +/area/mine/lobby/raptor) "ZY" = ( /turf/closed/mineral/random/volcanic, /area/lavaland/surface/outdoors/unexplored) @@ -41748,8 +42310,8 @@ eA eA pU pU -aj -aj +pU +pU aj aj aj @@ -41998,16 +42560,16 @@ MS QP LE os -SP +JQ +Hl +Hj +pU +BP +pU +NK +ze pU -ai -ai -ai pU -aj -aj -aj -aj aj aj "} @@ -42255,16 +42817,16 @@ JZ PR ib os -SP +EL +EL +EL pU pU -ai -ai +ze +BP +ze +pU pU -aj -aj -aj -aj aj aj "} @@ -42515,12 +43077,12 @@ Jt Zq pU pU -ai pU -aj -aj -aj -aj +pU +ze +ze +pU +pU aj aj aj @@ -42773,11 +43335,11 @@ Zq pU pU aj -aj -aj pU -aj -aj +pU +DB +BP +DB aj aj aj @@ -43030,11 +43592,11 @@ pU pU aj aj -pU -pU -aj aj aj +LV +tF +jb aj aj aj @@ -43289,9 +43851,9 @@ aj aj aj aj -aj -aj -pU +zs +tF +de aj aj aj @@ -43546,9 +44108,9 @@ aj aj aj pU -aj -pU -pU +DB +BP +DB aj aj aj @@ -43803,9 +44365,9 @@ aj aj aj pU -ad -ad -ai +pU +pU +pU aj aj aj @@ -44059,11 +44621,11 @@ aj aj aj pU -ai -ad -ad -ai -aj +pU +pU +BP +pU +pU aj aj "} @@ -44315,14 +44877,14 @@ aj aj aj aj -pU -ad -ad -ad -ad +aj +aj +NK +NK pU aj aj +aj "} (140,1,1) = {" aa @@ -44573,13 +45135,13 @@ aj aj aj aj -ad -ad -ad -ad +pU +pU +ze pU aj aj +aj "} (141,1,1) = {" aa @@ -44831,10 +45393,10 @@ aj aj aj pU -ad -ad -ad -ai +BP +ze +pU +pU aj aj "} @@ -45088,11 +45650,11 @@ aj aj aj pU -ai -ad -ad -ad -aj +NK +pU +pU +pU +pU aj "} (143,1,1) = {" @@ -45344,10 +45906,10 @@ aj aj aj aj +aj +pU pU pU -ai -ai pU aj aj @@ -45603,9 +46165,9 @@ aj aj aj aj -pU -pU -aj +DB +BP +DB aj aj "} @@ -45860,9 +46422,9 @@ aj aj aj aj -aj -aj -aj +LV +tF +jb aj aj "} @@ -46116,10 +46678,10 @@ aj aj aj aj -pU -aj -aj aj +zs +tF +de aj aj "} @@ -46372,11 +46934,11 @@ pU aj aj aj -aj pU -ai -aj -aj +pU +DB +BP +DB aj aj "} @@ -46628,12 +47190,12 @@ pU pU aj aj -aj pU -ad -ad pU -aj +pU +pU +pU +pU aj aj "} @@ -46882,16 +47444,16 @@ BP BP Lw pU -pU -aj -aj -aj -aj -ai -ad aj aj aj +pU +pU +NK +BP +ze +pU +pU aj "} (150,1,1) = {" @@ -47139,14 +47701,14 @@ BP BP Lw pU -pU -aj -aj aj aj aj pU -aj +ze +ze +ze +ze aj aj aj @@ -47381,7 +47943,7 @@ lb Yl Le Le -NU +Fr Le Le BP @@ -47396,14 +47958,14 @@ BP BP Lw pU -pU -aj -aj aj aj aj pU -aj +BP +ze +NK +pU aj aj aj @@ -47637,9 +48199,9 @@ Ra oh pK NU -pU -aj -aj +BP +BP +BP JD BP BP @@ -47656,11 +48218,11 @@ pU pU aj aj -aj -aj -aj -aj -aj +pU +NK +NK +pU +pU aj aj aj @@ -47894,9 +48456,9 @@ Kc mT pK pU -aj -aj -pU +BP +ZF +BP JD BP BP @@ -47913,12 +48475,12 @@ pU pU aj aj -aj -aj pU pU -aj -aj +pU +pU +pU +pU aj aj "} @@ -48151,9 +48713,9 @@ Yg li dK pU -aj -aj -pU +Cv +BP +Cv zk mc mc @@ -48170,14 +48732,14 @@ pU pU aj aj -aj pU +DB +BP +DB pU aj aj aj -aj -aj "} (155,1,1) = {" aa @@ -48408,9 +48970,9 @@ Yg TQ dK pU -aj -aj -pU +aX +BP +Jg pU pU pU @@ -48428,9 +48990,9 @@ pU aj aj aj -pU -aj -aj +LV +tF +jb aj aj aj @@ -48661,13 +49223,13 @@ lb pK Ob IL -IL +Rj KV pK aj -aj -aj -aj +yV +BP +fK pU pU pU @@ -48685,9 +49247,9 @@ aj aj aj aj -aj -aj -aj +yV +tF +NL aj aj aj @@ -48918,13 +49480,13 @@ NU pK pK dK -dK +RO pK pK aj -aj -aj -aj +yV +tF +NL aj aj pU @@ -48942,9 +49504,9 @@ aj aj aj aj -aj -aj -aj +zs +tF +de aj aj aj @@ -49175,13 +49737,13 @@ NU ai pU pU +Pn pU aj aj -aj -pU -pU -aj +yV +tF +NL aj aj aj @@ -49197,11 +49759,11 @@ aj aj pU pU -pU -pU -pU -pU -pU +aj +aj +DB +BP +DB pU pU aj @@ -49432,37 +49994,37 @@ pU pU pU pU -aj +AF aj aj pU -ad -ad +yV +tF +NL +aj +aj pU aj aj aj aj +pU +aj +aj aj aj pU pU +pU +pU aj +pU +pU +pU +pU aj aj aj -GG -DB -DB -hM -hM -hM -hM -hM -hM -hM -hM -hM "} (160,1,1) = {" aa @@ -49689,16 +50251,16 @@ pU aj aj aj +AF aj -aj -pU -pU -pU pU aj +yV +tF +NL aj pU -aj +pU aj aj aj @@ -49708,18 +50270,18 @@ aj aj aj pU -jX pU pU -NK -sQ -NS -zs -NS -NS -sQ -NS -hM +pU +ze +ze +ze +pU +pU +pU +aj +aj +aj "} (161,1,1) = {" aa @@ -49946,37 +50508,37 @@ aj aj aj aj +AF aj aj aj -pU -aj -aj -aj -aj +zs +tF +de aj aj aj aj aj +pU aj aj aj aj aj pU -jX pU pU +ze NK -il -NS -zs -NS -NS -il -NS -hM +ze +BP +pU +pU +pU +aj +aj +pU "} (162,1,1) = {" aa @@ -50203,13 +50765,13 @@ aj aj aj aj +AF aj aj aj -aj -aj -aj -aj +ct +BP +ct pU aj aj @@ -50220,20 +50782,20 @@ aj aj aj aj -aj pU -jX pU pU +ze +BP NK -NS -NS -zs -NS -NS -NS -NS -hM +ze +pU +pU +pU +aj +aj +pU +pU "} (163,1,1) = {" aa @@ -50460,37 +51022,37 @@ ai ai pU pU -pU -pU -aj +AF aj aj aj +BP +BP +BP pU pU aj aj -aj -aj -aj -aj +pU +pU +pU pU aj pU pU pU -jX +ze +ze +NK +ze +lP +pU +pU +pU +aj +aj pU pU -Cv -qi -NS -ct -NS -NS -qi -qi -hM "} (164,1,1) = {" aa @@ -50717,37 +51279,37 @@ ai ai ai ai +Pn +AF +AF +AF +Pe +BP +BP +BP +BP pU pU pU pU -aj -aj pU -aj -aj -aj -pU -aj -aj -aj pU pU +lt +Ri +eN pU +ze +ze +ze +ze pU pU +aj +aj +aj pU -ze pU -NS -NS -NS -NS -NS -uw -NS -NS -hM "} (165,1,1) = {" aa @@ -50978,33 +51540,33 @@ ai pU pU pU +AF +BP +BP +BP +BP +ct pU -aj -aj -aj -aj pU pU -aj -aj pU pU +lt +Ns +lt pU pU pU pU +ze pU pU +aj +aj +aj +aj +pU pU -NS -mk -sa -NS -NS -NS -OW -sa -hM "} (166,1,1) = {" aa @@ -51232,36 +51794,36 @@ aj aj ai ai -pU -pU -pU -pU -aj -aj -aj -aj -pU +CV +CV +ki +NP +ki +CV +CV +CV +lt pU pU pU pU pU pU +lt pU +lP pU +BP pU pU pU +aj +aj +aj +aj +aj +aj pU -NS -NS -uw -NS -NS -NS -NS -NS -hM "} (167,1,1) = {" aa @@ -51488,14 +52050,19 @@ aj aj aj aj -aj -pU -pU -pU -pU +CV +CV +Km +qB +eL +Ah +VI +ZX +ki +Ns +lt pU -aj -aj +BP pU pU pU @@ -51506,19 +52073,14 @@ pU pU pU pU +aj +aj +aj pU -jX pU +aj +aj pU -Vd -VP -NS -Tt -NS -NS -VP -VP -hM "} (168,1,1) = {" aa @@ -51745,37 +52307,37 @@ aj aj aj aj -aj -aj -pU -pU -pU -pU -pU -aj -pU -pU -pU -pU +CV +GG +jX +Tw +eL +aF +pF +dF +ki +lt +lt +lt pU pU pU +BP +NK +NK +ze pU pU pU +aj +aj +aj pU -jX pU pU -NK -NS -NS -zs -NS -NS -NS -NS -hM +aj +aj +aj "} (169,1,1) = {" aa @@ -52002,296 +52564,39 @@ ai pU aj aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU +CV +Sp +OE +as +ZL +Cn +zX +CV +CV pU +lt pU pU -jX pU pU +ze NK -il -NS -zs -NS -NS -il -NS -hM -"} -(170,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -ad -ad -ai -ai -ai -ai -ad +ze +BP pU pU pU aj aj aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -fQ -fQ -ZY -ZY -ZY -ZY -ZY -ZY -ZY -pU -pU -pU -pU -pU -pU -pU pU pU -pU -ai -ai -ai -ai -pU aj aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -jX -pU -pU -NK -sQ -NS -zs -NS -NS -sQ -NS -hM +aj +aj "} -(171,1,1) = {" +(170,1,1) = {" aa aa aa @@ -52306,14 +52611,14 @@ aa pU pU pU -pU +ad ad ai ai ai ai ad -ad +pU pU pU aj @@ -52482,162 +52787,152 @@ fQ fQ fQ fQ -fQ -fQ -fQ -ZY -ZY -ZY -ZY -fQ -fQ -fQ -fQ -fQ -fQ -ZY -ZY -ZY -ZY -ZY -ZY -ZY -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -lt -UI -UI -hM -hM -hM -hM -hM -hM -hM -hM -hM -"} -(172,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ad -ai -ai -ai -ai -ad -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +fQ +fQ +ZY +ZY +ZY +ZY +ZY +ZY +ZY +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +ai +ai +ai +ai +pU +CV +GG +Tt +fa +eL +ZB +GG +CV +pU +pU +pU +lP +pU +BP +pU +ze +NK +pU +UI +pU +pU +pU +pU +aj +aj +aj +aj +aj +aj +aj +aj +"} +(171,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +pU +pU +pU +pU +ad +ai +ai +ai +ai +ad +ad +pU +pU +aj +aj +aj +aj +aj +aj +aj +pU +pU +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ fQ fQ fQ @@ -52756,6 +53051,16 @@ ZY ZY ZY ZY +fQ +fQ +fQ +fQ +fQ +fQ +ZY +ZY +ZY +ZY ZY ZY ZY @@ -52770,42 +53075,42 @@ aj aj aj aj -aj -pU ai ai +ai +CV +wa +rB +fa +eL +Lv +CV +CV +CV +ct pU pU pU pU pU +ze pU pU +lt +lt +lt +UI pU +aj pU pU +aj pU pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj aj aj "} -(173,1,1) = {" +(172,1,1) = {" aa aa aa @@ -52817,7 +53122,7 @@ aa aa aa aa -ok +pU pU pU pU @@ -52827,7 +53132,7 @@ ai ai ai ad -pU +ad pU pU aj @@ -53009,7 +53314,6 @@ fQ fQ fQ fQ -fQ ZY ZY ZY @@ -53022,47 +53326,48 @@ pU pU pU pU +pU +pU aj aj aj aj aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU pU +ai +CV +jt +ba +fa +jJ +ZB +be +dI +oO +BP pU +BP pU pU pU +ct +BP +lt +lt +Ns +lt +lt pU pU pU pU pU -aj -aj -aj -aj -aj -aj -aj pU -aj pU aj aj "} -(174,1,1) = {" +(173,1,1) = {" aa aa aa @@ -53074,7 +53379,7 @@ aa aa aa aa -ad +ok pU pU pU @@ -53274,8 +53579,8 @@ ZY ZY ZY ZY -ZY -ZY +pU +pU pU pU pU @@ -53287,39 +53592,39 @@ aj aj aj aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU +CV +GG +tf +fa +Sj +ZB +CV +CV +CV +ct pU pU pU pU pU +BP +Av +Wh +Wh +CV +ki +ki +CV +CV +ki +ki +CV +CV pU pU aj -aj -aj -aj -aj -aj -aj "} -(175,1,1) = {" +(174,1,1) = {" aa aa aa @@ -53332,15 +53637,15 @@ aa aa aa ad -ad pU pU -Si +pU +ad ai ai ai ai -yy +ad pU pU pU @@ -53524,7 +53829,6 @@ fQ fQ fQ fQ -fQ ZY ZY ZY @@ -53545,41 +53849,39 @@ aj aj aj aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU +CV +rf +VP +fa +Sj +ZB +Mf +CV +hl pU +lt +lt pU pU +lt +lt +up +lt pU -aj -aj +vr +sQ +NS +Vd +NS +NS +sQ +NS +CV pU pU aj -aj -aj "} -(176,1,1) = {" -aa -aa -aa +(175,1,1) = {" aa aa aa @@ -53591,12 +53893,16 @@ aa aa aa aa -ok +ad +ad +pU pU +Si ai ai ai ai +yy pU pU pU @@ -53607,7 +53913,6 @@ aj aj aj aj -aj pU pU fQ @@ -53782,8 +54087,6 @@ fQ fQ fQ fQ -fQ -ZY ZY ZY ZY @@ -53802,38 +54105,40 @@ aj aj aj aj +aj +CV +GI +vM +FI +jJ +Fo +hM +CV +CV +Ns +lt pU pU +lt +lt +lt +up pU pU +vr +il +NS +Vd +NS +NS +il +NS +ki pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -aj -aj -aj -aj aj aj "} -(177,1,1) = {" +(176,1,1) = {" aa aa aa @@ -53848,12 +54153,12 @@ aa aa aa aa +ok pU -pU -pU -ad -ad -pU +ai +ai +ai +ai pU pU pU @@ -54040,8 +54345,7 @@ fQ fQ fQ fQ -fQ -fQ +ZY ZY ZY ZY @@ -54054,43 +54358,44 @@ ZY pU pU pU +aj +aj +aj +aj +aj +CV +pM +YP +GG +Uz +Uz +Uz +Zs +ki +lt +lt pU pU pU +lt pU +Wk +UI +ct +vr +NS +NS +Vd +NS +NS +NS +NS +ki pU pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj aj "} -(178,1,1) = {" +(177,1,1) = {" aa aa aa @@ -54108,8 +54413,8 @@ aa pU pU pU -pU -pU +ad +ad pU pU pU @@ -54299,111 +54604,110 @@ fQ fQ fQ fQ -fQ -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +pU +pU +pU +pU +pU +aj +aj +CV +CV +YP +GG +fa +fa +Rm +bE +ki +lt +pU +pU +pU +pU +pU +pU +Wk +pU +lt +Wq +EP +NS +ZU +NS +NS +EP +EP +CV +CV +pU +aj +"} +(178,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +pU +pU +pU +pU +pU +pU +pU +pU +pU +aj +aj +aj +aj +aj +aj +aj +aj +pU +pU +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ fQ fQ fQ @@ -54567,44 +54871,48 @@ ZY ZY ZY ZY -ZY -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU pU pU pU pU pU +aj +aj +CV +CV +ki +ki +ki +CV +CV +CV +lt pU pU +lt pU pU pU -aj -aj -aj -aj -aj +VU +Xk +lt +NS +NS +NS +NS +NS +uw +NS +NS +NS +ki pU aj -aj -aj "} -(180,1,1) = {" +(179,1,1) = {" +aa +aa +aa aa aa aa @@ -54616,8 +54924,6 @@ aa aa aa aa -HX -pU ad pU pU @@ -54628,10 +54934,9 @@ pU pU pU pU -pU -pU -pU -pU +aj +aj +aj aj aj aj @@ -54815,8 +55120,7 @@ fQ fQ fQ fQ -fQ -fQ +ZY ZY ZY ZY @@ -54830,6 +55134,9 @@ pU pU pU pU +aj +aj +aj pU pU pU @@ -54839,29 +55146,27 @@ pU pU pU pU +Ns +Az pU pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj +lt +lt +lt +NS +mk +sa +NS +NS +NS +OW +sa +NS +ki aj -pU aj "} -(181,1,1) = {" +(180,1,1) = {" aa aa aa @@ -54873,7 +55178,9 @@ aa aa aa aa +HX pU +ad pU pU pU @@ -54887,10 +55194,8 @@ pU pU pU pU -pU -pU -pU -pU +aj +aj aj aj pU @@ -55098,27 +55403,27 @@ pU pU pU pU +lt +lt pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -pU -pU -aj -aj +xW +lt +lt +lt +NS +NS +uw +NS +NS +NS +NS +NS +NS +ki pU aj "} -(182,1,1) = {" +(181,1,1) = {" aa aa aa @@ -55143,11 +55448,11 @@ pU pU pU pU -aj -aj -aj -aj -aj +pU +pU +pU +pU +pU aj aj pU @@ -55340,12 +55645,6 @@ ZY ZY ZY ZY -ZY -pU -pU -pU -pU -pU pU pU pU @@ -55362,20 +55661,26 @@ pU pU pU pU +lt pU pU -aj -aj -pU -pU -pU -pU +Wk +lt +lt +kf +KO +NS +aH +NS +NS +KO +KO +CV +CV pU aj -aj -aj "} -(183,1,1) = {" +(182,1,1) = {" aa aa aa @@ -55399,7 +55704,7 @@ pU pU pU pU -aj +pU aj aj aj @@ -55616,23 +55921,23 @@ pU pU pU pU +Wk pU +ct +vr +NS +rj +Vd +NS +NS +NS +NS +ki pU -pU -pU -pU -pU -pU -pU -pU -aj -aj aj aj -aj -pU "} -(184,1,1) = {" +(183,1,1) = {" aa aa aa @@ -55645,8 +55950,8 @@ aa aa aa pU -ad -ai +pU +pU pU pU pU @@ -55871,25 +56176,25 @@ pU pU pU pU +lt +lt +Wk pU pU +vr +il +NS +Vd +NS +NS +il +NS +ki pU pU pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -pU -aj -aj "} -(185,1,1) = {" +(184,1,1) = {" aa aa aa @@ -55901,10 +56206,10 @@ aa aa aa aa -ad +pU ad ai -wv +pU pU pU pU @@ -55922,7 +56227,6 @@ aj aj aj pU -pU fQ fQ fQ @@ -56112,6 +56416,7 @@ ZY ZY ZY ZY +ZY pU pU pU @@ -56127,26 +56432,26 @@ pU pU pU pU +lt +Ns +lt +up +Pb pU +vr +sQ +NS +Vd +NS +NS +sQ +NS +CV pU pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -aj -aj -aj aj "} -(186,1,1) = {" +(185,1,1) = {" aa aa aa @@ -56161,7 +56466,7 @@ aa ad ad ai -ad +wv pU pU pU @@ -56360,225 +56665,155 @@ fQ fQ fQ fQ -ZY -ZY -ZY -ZY -ZY -ZY -ZY -ZY -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -"} -(187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ai -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +ZY +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +lt +lt +BP +Oo +ej +nO +CV +ki +ki +CV +CV +ki +ki +CV +CV +pU +aj +aj +"} +(186,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ai +ad +pU +pU +pU +pU +pU +pU +pU +pU +aj +aj +aj +aj +aj +aj +aj +aj +pU +pU +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ fQ fQ fQ @@ -56618,6 +56853,77 @@ fQ fQ fQ fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +ZY +ZY ZY ZY ZY @@ -56642,9 +56948,14 @@ pU pU pU pU +ct +BP pU pU pU +lt +pU +pU pU pU pU @@ -56652,15 +56963,9 @@ pU pU pU pU -aj -aj -aj -aj -aj -aj aj "} -(188,1,1) = {" +(187,1,1) = {" aa aa aa @@ -56675,6 +56980,7 @@ aa ad ad ai +ad pU pU pU @@ -56691,7 +56997,6 @@ aj aj aj aj -aj pU pU fQ @@ -56884,7 +57189,6 @@ ZY pU pU pU -yc pU pU pU @@ -56902,22 +57206,23 @@ pU pU pU pU +lt pU pU +lt +Ns +lt +lt +pU pU pU pU pU pU -aj -aj -aj -aj -aj aj aj "} -(189,1,1) = {" +(188,1,1) = {" aa aa aa @@ -56930,8 +57235,8 @@ aa aa aa ad -HX -pU +ad +ai pU pU pU @@ -57157,24 +57462,24 @@ pU pU pU pU +lt +lt +lt pU +lt +lt +lt +lt +lt pU pU -pU -pU -pU -pU -pU -pU -aj -aj aj aj aj aj aj "} -(190,1,1) = {" +(189,1,1) = {" aa aa aa @@ -57186,6 +57491,7 @@ aa aa aa aa +ad HX pU pU @@ -57196,19 +57502,17 @@ pU pU pU pU -pU -pU -pU aj -pU +aj +aj +aj +aj +aj +aj aj aj pU pU -pU -pU -pU -fQ fQ fQ fQ @@ -57395,10 +57699,266 @@ ZY ZY ZY ZY +ZY +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +Ns +pU +pU +UI +lt +lt +Ns +lt +pU +aj +aj +aj +aj +aj +aj +"} +(190,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HX +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +pU +aj +pU +aj +aj +pU pU pU pU pU +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +fQ +ZY +ZY +ZY +ZY +ZY +pU +pU pU pU pU @@ -57422,6 +57982,8 @@ pU pU pU pU +lt +lt pU aj aj @@ -58430,7 +58992,7 @@ pU pU pU pU -pU +yc pU pU pU diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index ff8e22b17b8fa..031a6dd5039d7 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -18,6 +18,10 @@ name = "Mining Station Public Storage" icon_state = "mining_storage" +/area/mine/lobby/raptor + name = "Nanotrasen Raptor Farm" + icon_state = "mining_storage" + /area/mine/production name = "Mining Station Production Wing" icon_state = "mining_production" From 1d290063a7f82c096ddcdbf7e271337516f5d7a4 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Mon, 15 Jul 2024 23:39:41 -0400 Subject: [PATCH 10/49] Human AIs get a portable crew monitor, loses borg costume and implant (#84965) ## About The Pull Request Removes Human AI's teleport blocker implant and borg costume and gives them a portable crew monitor in their bag instead. ## Why It's Good For The Game I originally gave human AIs a teleport blocker so it would be a little harder to leave the SAT, but I don't think it should be impossible. With enough effort and determination, it should be possible for a human AI to go get their own food or go interact with crew and whatnot. Their slowness is meant to be a deterrent and I think it is a fine one that doesn't need this extra implant, not to mention that I'd like to keep cybernetics on the human AI to a minimum. In the original Human AI PR, I had given them a borg costume before they got their own custom outfit. Now that I gave them that, the borg costume is now just outdated. They shouldn't look like a borg to their borgs, they should stand out. As for the portable crew monitor, I thought it would be the best way to give human AIs the ability to see people's vitals like AIs could, but only if their sensors are maxed. AIs can only see people's medhuds if the person's sensors are on so they don't necessarily need one, they just won't see things like diseases and such, which I think is fine. ## Changelog :cl: balance: Human AIs no longer have a teleport blocking implant or borg costume, but now has a portable crew monitor. /:cl: --- code/modules/jobs/job_types/station_trait/human_ai.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/modules/jobs/job_types/station_trait/human_ai.dm b/code/modules/jobs/job_types/station_trait/human_ai.dm index 0768505b66553..032ad08af5a60 100644 --- a/code/modules/jobs/job_types/station_trait/human_ai.dm +++ b/code/modules/jobs/job_types/station_trait/human_ai.dm @@ -98,9 +98,7 @@ /obj/item/door_remote/omni = 1, /obj/item/machine_remote = 1, /obj/item/secure_camera_console_pod = 1, - ) - implants = list( - /obj/item/implant/teleport_blocker, + /obj/item/sensor_device = 1, ) uniform = /obj/item/clothing/under/rank/station_trait/human_ai @@ -108,9 +106,6 @@ ears = /obj/item/radio/headset/silicon/human_ai glasses = /obj/item/clothing/glasses/hud/diagnostic - suit = /obj/item/clothing/suit/costume/cardborg - head = /obj/item/clothing/head/costume/cardborg - l_pocket = /obj/item/laser_pointer/infinite_range //to punish borgs, this works through the camera console. r_pocket = /obj/item/assembly/flash/handheld From 881f99560fbc9ae76cc68f7b53319491783450ce Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 16 Jul 2024 04:40:13 +0100 Subject: [PATCH 11/49] You can fire PKAs/plasma cutters point blank at turfs (#84974) ## About The Pull Request Due to point blank checks in guncode you weren't able to fire PKAs or plasma cutters at turfs point blank, requiring you to aim at least 1 tile away - making mining with those annoying without mesons. ## Why It's Good For The Game If you click at a turf in front of you with a mining tool, you expect it to actually work. ## Changelog :cl: qol: You can fire PKAs/plasma cutters point blank at turfs. /:cl: --- code/modules/projectiles/guns/energy/kinetic_accelerator.dm | 4 ++++ code/modules/projectiles/guns/energy/special.dm | 3 +++ 2 files changed, 7 insertions(+) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index ab023d38b55ef..b6a960e05ad98 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -84,6 +84,9 @@ else to_chat(user, span_notice("There are no modifications currently installed.")) +/obj/item/gun/energy/recharge/kinetic_accelerator/try_fire_gun(atom/target, mob/living/user, params) + return fire_gun(target, user, user.Adjacent(target) && !isturf(target), params) + /obj/item/gun/energy/recharge/kinetic_accelerator/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) @@ -192,6 +195,7 @@ var/pressure_decrease = 0.25 var/obj/item/gun/energy/recharge/kinetic_accelerator/kinetic_gun + /obj/projectile/kinetic/Destroy() kinetic_gun = null return ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 961d32c96ee8b..d06a36056d1c0 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -169,6 +169,9 @@ else . = ..(amount=1) +/obj/item/gun/energy/plasmacutter/try_fire_gun(atom/target, mob/living/user, params) + return fire_gun(target, user, user.Adjacent(target) && !isturf(target), params) + #undef PLASMA_CUTTER_CHARGE_WELD /obj/item/gun/energy/plasmacutter/adv From e0bf1871253ec4b4b94b0416656e03a2ea7100dc Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:41:59 +1200 Subject: [PATCH 12/49] Automatic changelog for PR #84967 [ci skip] --- html/changelogs/AutoChangeLog-pr-84967.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84967.yml diff --git a/html/changelogs/AutoChangeLog-pr-84967.yml b/html/changelogs/AutoChangeLog-pr-84967.yml new file mode 100644 index 0000000000000..42050d3c36a1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84967.yml @@ -0,0 +1,5 @@ +author: "Thedragmeme" +delete-after: True +changes: + - qol: "re-maps the raptor barn to not stick out like a sore thumb" + - bugfix: "Miners and the public both can access the raptor barn without having to make a bridge themselves" \ No newline at end of file From 6b73fda6de5e95a10590edba81111fa996ad8200 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:42:04 +1200 Subject: [PATCH 13/49] Automatic changelog for PR #84965 [ci skip] --- html/changelogs/AutoChangeLog-pr-84965.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84965.yml diff --git a/html/changelogs/AutoChangeLog-pr-84965.yml b/html/changelogs/AutoChangeLog-pr-84965.yml new file mode 100644 index 0000000000000..67eca3dcae302 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84965.yml @@ -0,0 +1,4 @@ +author: "JohnFulpWillard" +delete-after: True +changes: + - balance: "Human AIs no longer have a teleport blocking implant or borg costume, but now has a portable crew monitor." \ No newline at end of file From 7d19c04a8eedbea29ac594db6adf2c74a9f28576 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:42:07 +1200 Subject: [PATCH 14/49] Automatic changelog for PR #84974 [ci skip] --- html/changelogs/AutoChangeLog-pr-84974.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84974.yml diff --git a/html/changelogs/AutoChangeLog-pr-84974.yml b/html/changelogs/AutoChangeLog-pr-84974.yml new file mode 100644 index 0000000000000..e0ffb28d458b4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84974.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "You can fire PKAs/plasma cutters point blank at turfs." \ No newline at end of file From a61e8eaef5cf354733bc42ff71a09e46beda3611 Mon Sep 17 00:00:00 2001 From: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Date: Tue, 16 Jul 2024 08:05:21 +0300 Subject: [PATCH 15/49] fixes a big harddel source (#83987) ## About The Pull Request this hard delete would happen everytime a player joins/observers the round. upon using the ref tracker i discovered this problem was caused by movable/screens not cleaning up after their owning huds if it gets deleted. i didnt weakref it was cause it meant id have to resolve it in so many places, but if weakrefing is preferable i will do it ![image](https://github.com/tgstation/tgstation/assets/138636438/d4b5465e-85b6-4e79-80a7-551684bdd831) ## Why It's Good For The Game fixes a hard delete --- code/_onclick/hud/new_player.dm | 3 +-- code/_onclick/hud/parallax/parallax.dm | 2 +- code/_onclick/hud/screen_objects.dm | 20 ++++++++++++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 5fa44b7f0542b..371341aec0bf5 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -63,8 +63,7 @@ ///Set the HUD in New, as lobby screens are made before Atoms are Initialized. /atom/movable/screen/lobby/New(loc, datum/hud/our_hud, ...) - if(our_hud) - hud = our_hud + set_new_hud(our_hud) return ..() ///Run sleeping actions after initialize diff --git a/code/_onclick/hud/parallax/parallax.dm b/code/_onclick/hud/parallax/parallax.dm index bcdcd0e74fed1..0a3732e134fc4 100644 --- a/code/_onclick/hud/parallax/parallax.dm +++ b/code/_onclick/hud/parallax/parallax.dm @@ -275,7 +275,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) . = ..() // Parallax layers are independant of hud, they care about client // Not doing this will just create a bunch of hard deletes - hud = null + set_new_hud(hud_owner = null) if(template) return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 8cc29740870ca..315efe4877810 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -45,8 +45,9 @@ /atom/movable/screen/Initialize(mapload, datum/hud/hud_owner) . = ..() - if(hud_owner && istype(hud_owner)) - hud = hud_owner + if(isnull(hud_owner)) //some screens set their hud owners on /new, this prevents overriding them with null post atoms init + return + set_new_hud(hud_owner) /atom/movable/screen/Destroy() master_ref = null @@ -72,10 +73,25 @@ /atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params) return +///setter used to set our new hud +/atom/movable/screen/proc/set_new_hud(datum/hud/hud_owner) + if(hud) + UnregisterSignal(hud, COMSIG_QDELETING) + if(isnull(hud_owner)) + hud = null + return + hud = hud_owner + RegisterSignal(hud, COMSIG_QDELETING, PROC_REF(on_hud_delete)) + /// Returns the mob this is being displayed to, if any /atom/movable/screen/proc/get_mob() return hud?.mymob +/atom/movable/screen/proc/on_hud_delete(datum/source) + SIGNAL_HANDLER + + set_new_hud(hud_owner = null) + /atom/movable/screen/text icon = null icon_state = null From cd506f8f08ada34c2bc33740c1fea468e55a1c8f Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:09:58 +0100 Subject: [PATCH 16/49] Adjusts style meter fonts to not be blurry, fixes text overlapping with meter/shifting up when you gain actions (#84979) ## About The Pull Request Currently the fonts are blurry due to using wrong sizes and also overlap with the style bar above them. Also they move upwards when actions are gained due to wrong length coefficient. Here's how it looks now: ![image](https://github.com/user-attachments/assets/d0f0adec-08e0-404f-b40e-7f9dddbabf98) ## Changelog :cl: fix: Style meter text is no longer blurry and doesnt overlap with UI anymore. /:cl: --- code/datums/components/style/style.dm | 12 ++++-------- code/datums/components/style/style_meter.dm | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index f39379d636783..fcf62dead1a59 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -219,7 +219,7 @@ rank = rank_changed meter.maptext = "[format_rank_string(rank)][generate_multiplier()][generate_actions()]" - meter.maptext_y = 100 - 9 * length(actions) + meter.maptext_y = 94 - 12 * length(actions) update_meter(point_to_rank(), go_back) /datum/component/style/proc/update_meter(new_rank, go_back) @@ -270,19 +270,15 @@ return "SPACED!" /datum/component/style/proc/format_rank_string(new_rank) - var/rank_string = rank_to_string(new_rank) - var/final_string = "" - final_string += "[rank_string[1]]" - final_string += "[copytext(rank_string, 2)]" - return final_string + return MAPTEXT_PIXELLARI("[rank_to_string(new_rank)]") /datum/component/style/proc/generate_multiplier() - return "
MULTIPLIER: [point_multiplier]X" + return "
" + MAPTEXT_GRAND9K("MULTIPLIER: [point_multiplier]X") /datum/component/style/proc/generate_actions() var/action_string = "" for(var/action in actions) - action_string += "
+ [actions[action]]" + action_string += "
" + MAPTEXT_GRAND9K("+ [actions[action]]") return action_string /datum/component/style/proc/action_to_color(action) diff --git a/code/datums/components/style/style_meter.dm b/code/datums/components/style/style_meter.dm index 94263700dda21..cc02baec1d5e0 100644 --- a/code/datums/components/style/style_meter.dm +++ b/code/datums/components/style/style_meter.dm @@ -132,7 +132,7 @@ maptext_height = 120 maptext_width = 105 maptext_x = 5 - maptext_y = 100 + maptext_y = 94 maptext = "" layer = SCREENTIP_LAYER From ac745206f70cd0d259e261aec4ede01954bf5086 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 00:10:29 +1200 Subject: [PATCH 17/49] Automatic changelog for PR #84979 [ci skip] --- html/changelogs/AutoChangeLog-pr-84979.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84979.yml diff --git a/html/changelogs/AutoChangeLog-pr-84979.yml b/html/changelogs/AutoChangeLog-pr-84979.yml new file mode 100644 index 0000000000000..03a22c982a51e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84979.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Style meter text is no longer blurry and doesnt overlap with UI anymore." \ No newline at end of file From 34f3f479ae24558762706c15b0db294e7f0b359d Mon Sep 17 00:00:00 2001 From: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Date: Tue, 16 Jul 2024 18:14:08 -0500 Subject: [PATCH 18/49] Small hulk cleanup / nukes `TRAIT_IGNOREDAMAGESLOWDOWN` (#85003) ## About The Pull Request I was investigating a bug with hulk in which using it while damaged doesn't put you back on full speed I noticed `TRAIT_IGNOREDAMAGESLOWDOWN` on its own was subtly broken, in that it did nothing if the user did not call `updatehealth` afterwards And guess what, most (if not all) uses of the trait did not do this, so it never applied correctly So I nuked the trait entirely, made all uses of it use the same thing morphine uses (`/datum/movespeed_modifier/damage_slowdown`) And since I was auditing this I saw the ball module was broke, it removed the immunity but never added it. Quick fix I also cleaned up some Hulk stuff while I was in the area because I was in the area. I removed all instances of `check_mutation` and replaced it with trait checking because it made more sense. I also also fixed a bug with the simple flying element never removing on detach because I touched something that uses it for the above change. ## Changelog :cl: Melbert fix: Using hulk (and a myriad of similar effects) now properly updates your movespeed to ignore the damage movespeed penalty fix: Some things which temporarily make you fly don't make you fly forever fix: MODsuit ball module now properly makes you immune to damage movespeed penalty when in ball form fix: Adding Hulk via VV dropdown doesn't default to adding the strongest hulk available (that which is used by the medieval pirates) /:cl: --- code/__DEFINES/traits/declarations.dm | 2 +- code/__DEFINES/traits/sources.dm | 2 -- code/_globalvars/traits/_traits.dm | 1 - code/_globalvars/traits/admin_tooling.dm | 1 - code/datums/elements/simple_flying.dm | 1 + code/datums/martial/sleeping_carp.dm | 3 +-- code/datums/mutations/hulk.dm | 7 ++++--- code/datums/status_effects/buffs.dm | 14 ++++++++------ .../items/devices/scanners/health_analyzer.dm | 2 +- code/game/objects/items/dualsaber.dm | 18 ++++++++---------- code/game/objects/items/hand_items.dm | 4 ++-- .../changeling/powers/adrenaline.dm | 8 +++++--- .../antagonists/heretic/knowledge/rust_lore.dm | 5 +++-- .../heretic/status_effects/buffs.dm | 4 ++-- .../nightmare/nightmare_equipment.dm | 3 +-- code/modules/mob/living/carbon/human/human.dm | 6 +----- code/modules/mod/modules/modules_supply.dm | 1 + .../projectiles/projectile/energy/stun.dm | 2 +- .../organs/internal/cyberimp/augments_arms.dm | 3 +-- .../internal/cyberimp/augments_internal.dm | 15 +++++++++++---- 20 files changed, 52 insertions(+), 50 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 504e451f88c3e..6c2fc4be7a02f 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -72,7 +72,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // Trait added to the user of a hippocratic oath status effect #define TRAIT_HIPPOCRATIC_OATH "hippocratic_oath" #define TRAIT_IGNORESLOWDOWN "ignoreslow" -#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" /// Makes it so the mob can use guns regardless of tool user status #define TRAIT_GUN_NATURAL "gunnatural" /// Causes death-like unconsciousness @@ -974,6 +973,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// changelings with this trait can no longer talk over the hivemind #define TRAIT_CHANGELING_HIVEMIND_MUTE "ling_mute" +/// This guy is a hulk! (Bulky and green, lacks tact) #define TRAIT_HULK "hulk" /// Isn't attacked harmfully by blob structures #define TRAIT_BLOB_ALLY "blob_ally" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index 759101dc2abd5..47887ede45ebf 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -225,8 +225,6 @@ #define SPEED_TRAIT "speed_trait" /// Trait given to mobs that have been autopsied #define AUTOPSY_TRAIT "autopsy_trait" -/// Trait given by [/datum/status_effect/blessing_of_insanity] -#define MAD_WIZARD_TRAIT "mad_wizard_trait" ///From the market_crash event #define MARKET_CRASH_EVENT_TRAIT "crashed_market_event" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 1cf3678dbd3f9..df177e568609e 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -273,7 +273,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_HUSK" = TRAIT_HUSK, "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, - "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index d3617ccc87762..4cb03eedba8eb 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -101,7 +101,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_HOLY" = TRAIT_HOLY, "TRAIT_HUSK" = TRAIT_HUSK, "TRAIT_IGNORE_ELEVATION" = TRAIT_IGNORE_ELEVATION, - "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, diff --git a/code/datums/elements/simple_flying.dm b/code/datums/elements/simple_flying.dm index 49b8771687bd9..e6d8f42db838b 100644 --- a/code/datums/elements/simple_flying.dm +++ b/code/datums/elements/simple_flying.dm @@ -17,6 +17,7 @@ /datum/element/simple_flying/Detach(datum/target) . = ..() UnregisterSignal(target, COMSIG_MOB_STATCHANGE) + REMOVE_TRAIT(target, TRAIT_MOVE_FLYING, ELEMENT_TRAIT(type)) ///signal called by the stat of the target changing /datum/element/simple_flying/proc/on_stat_change(mob/living/target, new_stat) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index cd8065a72a3a8..330c224070c3e 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -188,8 +188,7 @@ return FALSE if(!(carp_user.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE return FALSE - var/datum/dna/dna = carp_user.has_dna() - if(dna?.check_mutation(/datum/mutation/human/hulk)) //NO HULK + if(HAS_TRAIT(carp_user, TRAIT_HULK)) //NO HULK return FALSE if(!isturf(carp_user.loc)) //NO MOTHERFLIPPIN MECHS! return FALSE diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index dbe91091ab89c..4bc6c77a9fe81 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -17,7 +17,6 @@ mutation_traits = list( TRAIT_CHUNKYFINGERS, TRAIT_HULK, - TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PUSHIMMUNE, TRAIT_STUNIMMUNE, ) @@ -38,6 +37,7 @@ owner.add_mood_event("hulk", /datum/mood_event/hulk) RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(check_swing)) + owner.add_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown) /datum/mutation/human/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) SIGNAL_HANDLER @@ -99,6 +99,7 @@ owner.clear_mood_event("hulk") UnregisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) UnregisterSignal(owner, COMSIG_MOB_CLICKON) + owner.remove_movespeed_mod_immunities("hulk", /datum/movespeed_modifier/damage_slowdown) /// How many steps it takes to throw the mob #define HULK_TAILTHROW_STEPS 28 @@ -257,6 +258,7 @@ log_combat(the_hulk, yeeted_person, "has thrown by tail") /datum/mutation/human/hulk/wizardly + name = "Hulk (Magical)" species_allowed = null //yes skeleton/lizard hulk - note that species that dont have skintone changing (like skellies) get custom handling health_req = 0 instability = 0 @@ -264,19 +266,18 @@ /// List of traits to add/remove when someone gets this mutation. mutation_traits = list( TRAIT_HULK, - TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PUSHIMMUNE, TRAIT_STUNIMMUNE, ) // no chunk /datum/mutation/human/hulk/superhuman + name = "Hulk (Super)" health_req = 0 instability = 0 /// List of traits to add/remove when someone gets this mutation. mutation_traits = list( TRAIT_CHUNKYFINGERS, TRAIT_HULK, - TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_PUSHIMMUNE, diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 04ab2ee8f1783..2a66475c6e2fc 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -84,7 +84,7 @@ icon_state = "blooddrunk" /datum/status_effect/blooddrunk/on_apply() - ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT) + owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) if(ishuman(owner)) var/mob/living/carbon/human/human_owner = owner human_owner.physiology.brute_mod *= 0.1 @@ -104,7 +104,7 @@ human_owner.physiology.tox_mod *= 10 human_owner.physiology.oxy_mod *= 10 human_owner.physiology.stamina_mod *= 10 - REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, BLOODDRUNK_TRAIT) + owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) owner.remove_stun_absorption(id) //Used by changelings to rapidly heal @@ -383,7 +383,7 @@ show_duration = TRUE /datum/status_effect/regenerative_core/on_apply() - ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT) + owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) owner.adjustBruteLoss(-25) owner.adjustFireLoss(-25) owner.fully_heal(HEAL_CC_STATUS) @@ -394,7 +394,7 @@ return TRUE /datum/status_effect/regenerative_core/on_remove() - REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT) + owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) /datum/status_effect/lightningorb id = "Lightning Orb" @@ -570,7 +570,8 @@ owner.AddElement(/datum/element/forced_gravity, 0) owner.AddElement(/datum/element/simple_flying) owner.add_stun_absorption(source = id, priority = 4) - owner.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAD_WIZARD_TRAIT) + owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) + ADD_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id) owner.playsound_local(get_turf(owner), 'sound/chemistry/ahaha.ogg', vol = 100, vary = TRUE, use_reverb = TRUE) return TRUE @@ -587,7 +588,8 @@ owner.RemoveElement(/datum/element/forced_gravity, 0) owner.RemoveElement(/datum/element/simple_flying) owner.remove_stun_absorption(id) - owner.remove_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_FREE_HYPERSPACE_MOVEMENT), MAD_WIZARD_TRAIT) + owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) + REMOVE_TRAIT(owner, TRAIT_FREE_HYPERSPACE_MOVEMENT, id) /// Gives you a brief period of anti-gravity /datum/status_effect/jump_jet diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index c8c76c583e103..bebafbdab83b7 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -320,7 +320,7 @@ // Hulk and body temperature var/datum/species/targetspecies = humantarget.dna.species - var/mutant = humantarget.dna.check_mutation(/datum/mutation/human/hulk) + var/mutant = HAS_TRAIT(humantarget, TRAIT_HULK) render_list += "Species: [targetspecies.name][mutant ? "-derived mutant" : ""]\n" var/core_temperature_message = "Core temperature: [round(humantarget.coretemperature-T0C, 0.1)] °C ([round(humantarget.coretemperature*1.8-459.67,0.1)] °F)" diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 8f838c0c0412f..86b99e8c47e4e 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -56,10 +56,9 @@ /// Triggered on wield of two handed item /// Specific hulk checks due to reflection chance for balance issues and switches hitsounds. /obj/item/dualsaber/proc/on_wield(obj/item/source, mob/living/carbon/user) - if(user?.has_dna()) - if(user.dna.check_mutation(/datum/mutation/human/hulk)) - to_chat(user, span_warning("You lack the grace to wield this!")) - return COMPONENT_TWOHANDED_BLOCK_WIELD + if(user && HAS_TRAIT(user, TRAIT_HULK)) + to_chat(user, span_warning("You lack the grace to wield this!")) + return COMPONENT_TWOHANDED_BLOCK_WIELD update_weight_class(w_class_on) hitsound = 'sound/weapons/blade1.ogg' START_PROCESSING(SSobj, src) @@ -123,12 +122,11 @@ . = ..() /obj/item/dualsaber/attack(mob/target, mob/living/carbon/human/user) - if(user.has_dna()) - if(user.dna.check_mutation(/datum/mutation/human/hulk)) - to_chat(user, span_warning("You grip the blade too hard and accidentally drop it!")) - if(HAS_TRAIT(src, TRAIT_WIELDED)) - user.dropItemToGround(src, force=TRUE) - return + if(HAS_TRAIT(user, TRAIT_HULK)) + to_chat(user, span_warning("You grip the blade too hard and accidentally drop it!")) + if(HAS_TRAIT(src, TRAIT_WIELDED)) + user.dropItemToGround(src, force=TRUE) + return ..() if(!HAS_TRAIT(src, TRAIT_WIELDED)) return diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index 371ecee6ff803..23fa5f2ad40c9 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -143,7 +143,7 @@ affix_desc = "on [target.p_their()] sensitive antennae" affix_desc_target = "on your highly sensitive antennae" brutal_noogie = TRUE - if(user.dna?.check_mutation(/datum/mutation/human/hulk)) + if(HAS_TRAIT(user, TRAIT_HULK)) prefix_desc = "sickeningly brutal" brutal_noogie = TRUE @@ -178,7 +178,7 @@ var/damage = rand(1, 5) if(HAS_TRAIT(target, TRAIT_ANTENNAE)) damage += rand(3,7) - if(user.dna?.check_mutation(/datum/mutation/human/hulk)) + if(HAS_TRAIT(user, TRAIT_HULK)) damage += rand(3,7) if(damage >= 5) diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 3b6a550b18b0f..72bf91f1919f2 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -14,7 +14,7 @@ if(!.) return FALSE - if(HAS_TRAIT_FROM(user, TRAIT_IGNOREDAMAGESLOWDOWN, CHANGELING_TRAIT)) + if(HAS_TRAIT_FROM(user, TRAIT_PARALYSIS_L_ARM, CHANGELING_TRAIT) || HAS_TRAIT_FROM(user, TRAIT_PARALYSIS_R_ARM, CHANGELING_TRAIT)) user.balloon_alert(user, "already boosted!") return FALSE @@ -40,7 +40,8 @@ var/our_leg_zones = (GLOB.all_body_zones - GLOB.leg_zones) user.regenerate_limbs(excluded_zones = our_leg_zones) // why is this exclusive rather than inclusive - user.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT) + user.add_traits(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT) + user.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) // Revert above mob changes. addtimer(CALLBACK(src, PROC_REF(unsting_action), user), 20 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE) @@ -57,4 +58,5 @@ /datum/action/changeling/adrenaline/proc/unsting_action(mob/living/user) to_chat(user, span_changeling("The muscles in our limbs shift back to their usual places.")) - user.remove_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT) + user.remove_traits(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM), CHANGELING_TRAIT) + user.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 5e96119135f71..fe0d03ec18f50 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -220,7 +220,6 @@ /// A static list of traits we give to the heretic when on rust. var/static/list/conditional_immunities = list( TRAIT_BOMBIMMUNE, - TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_IGNORESLOWDOWN, TRAIT_NO_SLIP_ALL, TRAIT_NOBREATH, @@ -306,7 +305,7 @@ * * Gives our heretic ([source]) buffs if they stand on rust. */ -/datum/heretic_knowledge/ultimate/rust_final/proc/on_move(mob/source, atom/old_loc, dir, forced, list/old_locs) +/datum/heretic_knowledge/ultimate/rust_final/proc/on_move(mob/living/source, atom/old_loc, dir, forced, list/old_locs) SIGNAL_HANDLER // If we're on a rusty turf, and haven't given out our traits, buff our guy @@ -314,12 +313,14 @@ if(HAS_TRAIT(our_turf, TRAIT_RUSTY)) if(!immunities_active) source.add_traits(conditional_immunities, type) + source.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) immunities_active = TRUE // If we're not on a rust turf, and we have given out our traits, nerf our guy else if(immunities_active) source.remove_traits(conditional_immunities, type) + source.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) immunities_active = FALSE /** diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 35a6ab9268784..c72e6bfdef113 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -53,11 +53,11 @@ alert_type = /atom/movable/screen/alert/status_effect/marshal /datum/status_effect/marshal/on_apply() - ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT) + owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) return TRUE /datum/status_effect/marshal/on_remove() - REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, STATUS_EFFECT_TRAIT) + owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/damage_slowdown) /datum/status_effect/marshal/tick(seconds_between_ticks) if(!iscarbon(owner)) diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index ec07639cb449c..6fbe6c6097bec 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -52,10 +52,9 @@ if(!has_crit) return playsound(target, 'sound/effects/wounds/crackandbleed.ogg', 100, TRUE) - var/datum/dna/target_dna = target.has_dna() if(target.stat == DEAD) user.visible_message(span_warning("[user] gores [target] with [src]!"), span_warning("You gore [target] with [src], which doesn't accomplish much, but it does make you feel a little better.")) - else if(!target_dna?.check_mutation(/datum/mutation/human/hulk) && (iscarbon(target) || issilicon(target))) + else if(!HAS_TRAIT(target, TRAIT_HULK) && (iscarbon(target) || issilicon(target))) user.visible_message(span_boldwarning("[user] gores [target] with [src], bringing them to a halt!"), span_userdanger("You gore [target] with [src], bringing them to a halt!")) target.Paralyze(issilicon(target) ? 2 SECONDS : 1 SECONDS) else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 612801695fd2c..9816012218225 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -516,7 +516,7 @@ #undef CPR_PANIC_SPEED /mob/living/carbon/human/cuff_resist(obj/item/I) - if(dna?.check_mutation(/datum/mutation/human/hulk)) + if(HAS_TRAIT(src, TRAIT_HULK)) say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") if(..(I, cuff_break = FAST_CUFFBREAK)) dropItemToGround(I) @@ -980,10 +980,6 @@ /mob/living/carbon/human/updatehealth() . = ..() - if(HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) - remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) - remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) - return var/health_deficiency = max((maxHealth - health), staminaloss) if(health_deficiency >= 40) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, multiplicative_slowdown = health_deficiency / 75) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 0e2bffd0aa6a7..616534cd3dd79 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -499,6 +499,7 @@ mod.wearer.add_traits(user_traits, MOD_TRAIT) mod.wearer.RemoveElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) mod.wearer.AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) + mod.wearer.add_movespeed_mod_immunities(MOD_TRAIT, /datum/movespeed_modifier/damage_slowdown) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere) RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 66ea4d2c86593..b393dc3415fe5 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -19,7 +19,7 @@ var/mob/living/carbon/C = target C.add_mood_event("tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) - if(C.dna && C.dna.check_mutation(/datum/mutation/human/hulk)) + if(HAS_TRAIT(C, TRAIT_HULK)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") else if(!C.check_stun_immunity(CANKNOCKDOWN)) addtimer(CALLBACK(C, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 20), 0.5 SECONDS) diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm index 324b2c538b840..5632688cb476b 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_arms.dm @@ -423,8 +423,7 @@ return NONE if(!isliving(target)) return NONE - var/datum/dna/dna = source.has_dna() - if(dna?.check_mutation(/datum/mutation/human/hulk)) //NO HULK + if(HAS_TRAIT(source, TRAIT_HULK)) //NO HULK return NONE if(!source.can_unarmed_attack()) return COMPONENT_SKIP_ATTACK diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index a50912416ef87..f36c6cfe838b8 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -120,6 +120,7 @@ . = ..() UnregisterSignal(implant_owner, signalCache) UnregisterSignal(implant_owner, COMSIG_LIVING_ENTER_STAMCRIT) + remove_stun_buffs(implant_owner) /obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver) . = ..() @@ -151,10 +152,8 @@ sparks.set_up(5, 1, src) sparks.start() - owner.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_BATON_RESISTANCE, TRAIT_STUNIMMUNE), REF(src)) - addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_IGNOREDAMAGESLOWDOWN, REF(src)), stun_resistance_time) - addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_BATON_RESISTANCE, REF(src)), stun_resistance_time) - addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_STUNIMMUNE, REF(src)), stun_resistance_time) + give_stun_buffs(owner) + addtimer(CALLBACK(src, PROC_REF(remove_stun_buffs), owner), stun_resistance_time) COOLDOWN_START(src, implant_cooldown, 60 SECONDS) addtimer(CALLBACK(src, PROC_REF(implant_ready)),60 SECONDS) @@ -163,6 +162,14 @@ if(owner) to_chat(owner, span_purple("Your rebooter implant is ready.")) +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/give_stun_buffs(mob/living/give_to = owner) + give_to.add_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) + give_to.add_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown) + +/obj/item/organ/internal/cyberimp/brain/anti_stun/proc/remove_stun_buffs(mob/living/remove_from = owner) + remove_from.remove_traits(list(TRAIT_STUNIMMUNE, TRAIT_BATON_RESISTANCE), REF(src)) + remove_from.remove_movespeed_mod_immunities(REF(src), /datum/movespeed_modifier/damage_slowdown) + /obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity) . = ..() if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) From 8eb0a4bb4d190863b2f5f9af2682f1061d5d38bd Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:14:27 +1200 Subject: [PATCH 19/49] Automatic changelog for PR #85003 [ci skip] --- html/changelogs/AutoChangeLog-pr-85003.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-85003.yml diff --git a/html/changelogs/AutoChangeLog-pr-85003.yml b/html/changelogs/AutoChangeLog-pr-85003.yml new file mode 100644 index 0000000000000..e609b073aad60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85003.yml @@ -0,0 +1,7 @@ +author: "Melbert" +delete-after: True +changes: + - bugfix: "Using hulk (and a myriad of similar effects) now properly updates your movespeed to ignore the damage movespeed penalty" + - bugfix: "Some things which temporarily make you fly don't make you fly forever" + - bugfix: "MODsuit ball module now properly makes you immune to damage movespeed penalty when in ball form" + - bugfix: "Adding Hulk via VV dropdown doesn't default to adding the strongest hulk available (that which is used by the medieval pirates)" \ No newline at end of file From 240f59fe79400c9ce9631bb5bd94b1137f5df2cb Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 17 Jul 2024 00:34:57 +0000 Subject: [PATCH 20/49] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-84912.yml | 7 ------ html/changelogs/AutoChangeLog-pr-84929.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84965.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84967.yml | 5 ---- html/changelogs/AutoChangeLog-pr-84972.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84974.yml | 4 ---- html/changelogs/AutoChangeLog-pr-84979.yml | 4 ---- html/changelogs/AutoChangeLog-pr-85003.yml | 7 ------ html/changelogs/archive/2024-07.yml | 27 ++++++++++++++++++++++ 9 files changed, 27 insertions(+), 39 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-84912.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84929.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84965.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84967.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84972.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84974.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-84979.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-85003.yml diff --git a/html/changelogs/AutoChangeLog-pr-84912.yml b/html/changelogs/AutoChangeLog-pr-84912.yml deleted file mode 100644 index 9aa4c71dfa2b2..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84912.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "00-Steven" -delete-after: True -changes: - - rscadd: "Having a robotic voicebox installed now lets you use silicon emotes." - - balance: "MMI'd brains/posibrains can now use silicon emotes." - - balance: "Simple and basic bots can actually beep." - - bugfix: "MMI'd brains/posibrains are no longer both allowed AND blocked from beeping, now just being allowed to beep." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84929.yml b/html/changelogs/AutoChangeLog-pr-84929.yml deleted file mode 100644 index 2a4ac91e68442..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84929.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "You can attack bookshelves in a variety of states once more" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84965.yml b/html/changelogs/AutoChangeLog-pr-84965.yml deleted file mode 100644 index 67eca3dcae302..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84965.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JohnFulpWillard" -delete-after: True -changes: - - balance: "Human AIs no longer have a teleport blocking implant or borg costume, but now has a portable crew monitor." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84967.yml b/html/changelogs/AutoChangeLog-pr-84967.yml deleted file mode 100644 index 42050d3c36a1e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84967.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Thedragmeme" -delete-after: True -changes: - - qol: "re-maps the raptor barn to not stick out like a sore thumb" - - bugfix: "Miners and the public both can access the raptor barn without having to make a bridge themselves" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84972.yml b/html/changelogs/AutoChangeLog-pr-84972.yml deleted file mode 100644 index 69e048c3ccca3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84972.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Ghosts can no longer move chairs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84974.yml b/html/changelogs/AutoChangeLog-pr-84974.yml deleted file mode 100644 index e0ffb28d458b4..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84974.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - qol: "You can fire PKAs/plasma cutters point blank at turfs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84979.yml b/html/changelogs/AutoChangeLog-pr-84979.yml deleted file mode 100644 index 03a22c982a51e..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84979.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Style meter text is no longer blurry and doesnt overlap with UI anymore." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-85003.yml b/html/changelogs/AutoChangeLog-pr-85003.yml deleted file mode 100644 index e609b073aad60..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-85003.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - bugfix: "Using hulk (and a myriad of similar effects) now properly updates your movespeed to ignore the damage movespeed penalty" - - bugfix: "Some things which temporarily make you fly don't make you fly forever" - - bugfix: "MODsuit ball module now properly makes you immune to damage movespeed penalty when in ball form" - - bugfix: "Adding Hulk via VV dropdown doesn't default to adding the strongest hulk available (that which is used by the medieval pirates)" \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml index 556da22ed8801..bfaf0581737c7 100644 --- a/html/changelogs/archive/2024-07.yml +++ b/html/changelogs/archive/2024-07.yml @@ -895,3 +895,30 @@ r3dj4ck0424: - bugfix: Destroying the jungle grass tiles in Tramstation's science wing should no longer open a chasm. +2024-07-17: + 00-Steven: + - rscadd: Having a robotic voicebox installed now lets you use silicon emotes. + - balance: MMI'd brains/posibrains can now use silicon emotes. + - balance: Simple and basic bots can actually beep. + - bugfix: MMI'd brains/posibrains are no longer both allowed AND blocked from beeping, + now just being allowed to beep. + JohnFulpWillard: + - balance: Human AIs no longer have a teleport blocking implant or borg costume, + but now has a portable crew monitor. + Melbert: + - bugfix: Using hulk (and a myriad of similar effects) now properly updates your + movespeed to ignore the damage movespeed penalty + - bugfix: Some things which temporarily make you fly don't make you fly forever + - bugfix: MODsuit ball module now properly makes you immune to damage movespeed + penalty when in ball form + - bugfix: Adding Hulk via VV dropdown doesn't default to adding the strongest hulk + available (that which is used by the medieval pirates) + SmArtKar: + - bugfix: Ghosts can no longer move chairs + - bugfix: You can attack bookshelves in a variety of states once more + - bugfix: Style meter text is no longer blurry and doesnt overlap with UI anymore. + - qol: You can fire PKAs/plasma cutters point blank at turfs. + Thedragmeme: + - qol: re-maps the raptor barn to not stick out like a sore thumb + - bugfix: Miners and the public both can access the raptor barn without having to + make a bridge themselves From b4ec871ec3bafb610824f5ca8a00259aaf3f5d19 Mon Sep 17 00:00:00 2001 From: Odairu Date: Tue, 16 Jul 2024 21:57:29 -0400 Subject: [PATCH 21/49] Gives a speaking mob megaphone text when standing on top of a closed crate (#84942) ## About The Pull Request Gives you loudmode when you speak while standing on top of a crate (it does not apply to comms or open mics) ## Why It's Good For The Game The assistants have trouble finding megaphones sometimes, now they can bug command who are in ear shot more effectively ## Proof of Testing ![image](https://github.com/user-attachments/assets/af8cc4ba-f13d-4a88-ae29-1cfc026c4452) ## Changelog :cl: add: standing on a closed crate now gives loud mode /:cl: --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Odairu Co-authored-by: Odairu <39929315+Odairu@users.noreply.github.com> --- code/__DEFINES/say.dm | 2 +- code/__DEFINES/span.dm | 1 + code/datums/components/soapbox.dm | 42 +++++++++++++++++++ code/game/machinery/telecomms/broadcasting.dm | 6 ++- .../game/objects/items/devices/radio/radio.dm | 1 - .../structures/crates_lockers/crates.dm | 1 + interface/stylesheet.dm | 1 + tgstation.dme | 1 + .../tgui-panel/styles/tgchat/chat-dark.scss | 5 +++ .../tgui-panel/styles/tgchat/chat-light.scss | 5 +++ 10 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 code/datums/components/soapbox.dm diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 5db7227521a3f..eacdd868a9556 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -76,7 +76,7 @@ #define SPAN_SINGING "singing" #define SPAN_TAPE_RECORDER "tape_recorder" #define SPAN_SMALL_VOICE "small" - +#define SPAN_SOAPBOX "soapbox" //bitflag #defines for return value of the radio() proc. /// Makes the message use italics #define ITALICS (1<<0) diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 0447e87f532fe..fadd00053156d 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -120,6 +120,7 @@ #define span_small(str) ("" + str + "") #define span_smallnotice(str) ("" + str + "") #define span_smallnoticeital(str) ("" + str + "") +#define span_soapbox(str) ("" + str + "") #define span_spiderbroodmother(str) ("" + str + "") #define span_spiderscout(str) ("" + str + "") #define span_spiderbreacher(str) ("" + str + "") diff --git a/code/datums/components/soapbox.dm b/code/datums/components/soapbox.dm new file mode 100644 index 0000000000000..61132bf68faa9 --- /dev/null +++ b/code/datums/components/soapbox.dm @@ -0,0 +1,42 @@ +/datum/component/soapbox + /// List of our current soapboxxer(s) who are gaining loud speech + var/list/soapboxers = list() + /// Gives atoms moving over us the soapbox speech and takes it away when they leave + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_loc_entered), + COMSIG_ATOM_EXITED = PROC_REF(on_loc_exited) + ) + +/datum/component/soapbox/Initialize(...) + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + add_connect_loc_behalf_to_parent() + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved)) + +///Applies loud speech to our movable when entering the turf our parent is on +/datum/component/soapbox/proc/on_loc_entered(datum/source, atom/movable/soapbox_arrive) + SIGNAL_HANDLER + RegisterSignal(soapbox_arrive, COMSIG_MOB_SAY, PROC_REF(soapbox_speech)) + soapboxers += soapbox_arrive + +///Takes away loud speech from our movable when it leaves the turf our parent is on +/datum/component/soapbox/proc/on_loc_exited(datum/source, atom/movable/soapbox_leave) + SIGNAL_HANDLER + if(soapbox_leave in soapboxers) + UnregisterSignal(soapbox_leave, COMSIG_MOB_SAY) + soapboxers -= soapbox_leave + +///We don't want our soapboxxer to keep their loud say if the parent is moved out from under them +/datum/component/soapbox/proc/parent_moved(datum/source) + SIGNAL_HANDLER + for(var/atom/movable/loud as anything in soapboxers) + UnregisterSignal(loud, COMSIG_MOB_SAY) + soapboxers = list() + +///Gives a mob a unique say span +/datum/component/soapbox/proc/soapbox_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= SPAN_SOAPBOX + +/datum/component/soapbox/proc/add_connect_loc_behalf_to_parent() + AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index 4c53cc5e4189d..5887c77667506 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -13,6 +13,10 @@ /// If this list contains `0`, then it will be receivable on every single /// z-level. var/list/levels + /// Blacklisted spans we don't want being put into comms by anything, ever - a place to put any new spans we want to make without letting them annoy people on comms + var/list/blacklisted_spans = list( + SPAN_SOAPBOX, + ) /datum/signal/subspace/New(data) src.data = data || list() @@ -175,7 +179,7 @@ if(!hearer) stack_trace("null found in the hearers list returned by the spatial grid. this is bad") continue - + spans -= blacklisted_spans hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods, message_range = INFINITY) // This following recording is intended for research and feedback in the use of department radio channels diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 912e1d66b0929..7f28724e68b12 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -397,7 +397,6 @@ // left hands are odd slots if (idx && (idx % 2) == (message_mods[RADIO_EXTENSION] == MODE_L_HAND)) return - talk_into(speaker, raw_message, , spans, language=message_language, message_mods=filtered_mods) /// Checks if this radio can receive on the given frequency. diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index baf239284ac2f..7b64b6569d6cc 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -62,6 +62,7 @@ ) if(paint_jobs) paint_jobs = crate_paint_jobs + AddComponent(/datum/component/soapbox) /obj/structure/closet/crate/Destroy() QDEL_NULL(manifest) diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 36c85642ad23c..1ee06ed48550d 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -133,6 +133,7 @@ h1.alert, h2.alert {color: #000000;} .robot {font-family: "Courier New", cursive, sans-serif;} .command_headset {font-weight: bold; font-size: 3;} +.soapbox {font-weight: bold; font-size: 3;} .small {font-size: 1;} .big {font-size: 3;} .reallybig {font-size: 4;} diff --git a/tgstation.dme b/tgstation.dme index e0fb60d58cf9b..f340a6efd2c93 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1207,6 +1207,7 @@ #include "code\datums\components\slime_friends.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\smooth_tunes.dm" +#include "code\datums\components\soapbox.dm" #include "code\datums\components\soul_stealer.dm" #include "code\datums\components\soulstoned.dm" #include "code\datums\components\sound_player.dm" diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 22a725e71da73..8f3fddc9469ff 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -747,6 +747,11 @@ em { font-size: 160%; } +.soapbox { + font-weight: bold; + font-size: 135%; +} + .small { font-size: 60%; } diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 7e8908545ed2f..e15e8aa3a5ac2 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -774,6 +774,11 @@ h2.alert { font-size: 160%; } +.soapbox { + font-weight: bold; + font-size: 135%; +} + .small { font-size: 60%; } From b25a6bb85015525489e08e8bbc0cd62653789492 Mon Sep 17 00:00:00 2001 From: xXPawnStarrXx <53197594+xXPawnStarrXx@users.noreply.github.com> Date: Wed, 17 Jul 2024 03:00:54 +0100 Subject: [PATCH 22/49] Fish quality fixes and recipes. (#84996) ## About The Pull Request In this PR I am adding the ability for freshly caught fish to be of the finest quality (excluding a few exceptions like donkfish, they nasty...) This means you chefs won't be losing quality from fresh fish, That makes no sense to me. ![image](https://github.com/user-attachments/assets/8722c964-7a98-4e78-b145-2398a37b9325) I am also adding a recipe to create jellyfish soups with fresh fillets and adding the ability to crush koibeans into fake fish (like butterbeans and meatwheat). ![image](https://github.com/user-attachments/assets/819dccca-c180-4684-8cd3-5059ba66bf18) ![image](https://github.com/user-attachments/assets/765d44f0-92ad-4554-94de-3a1a132092d0) ## Why It's Good For The Game Fresh food shouldn't bring down the quality of your other ingredients, making more fish accessable for cooking and some usable in the first place. ## Changelog :cl: qol: made fish better quality when butchered, smushy koibeans and useable gunner jellyfish. /:cl: --- code/game/objects/items/food/meatdish.dm | 2 ++ .../food_and_drinks/recipes/soup_mixtures.dm | 14 ++++++++++++++ .../recipes/tablecraft/recipes_lizard.dm | 4 ++++ code/modules/hydroponics/grown/beans.dm | 12 +++++++++++- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/food/meatdish.dm b/code/game/objects/items/food/meatdish.dm index 537c7688d2dd4..c03470ff416b3 100644 --- a/code/game/objects/items/food/meatdish.dm +++ b/code/game/objects/items/food/meatdish.dm @@ -34,6 +34,7 @@ foodtypes = SEAFOOD eatverbs = list("bite", "chew", "gnaw", "swallow", "chomp") w_class = WEIGHT_CLASS_SMALL + starting_reagent_purity = 1.0 /obj/item/food/fishmeat/carp name = "carp fillet" @@ -88,6 +89,7 @@ name = "donkfillet" desc = "The dreaded donkfish fillet. No sane spaceman would eat this, and it does not get better when cooked." icon_state = "donkfillet" + starting_reagent_purity = 0.3 /obj/item/food/fishmeat/octopus name = "octopus tentacle" diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index ef75de8db8672..446782d00cbf4 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -1469,6 +1469,20 @@ /datum/reagent/water = 5, ) +//Fresh Jellyfish fillet soup! +/datum/chemical_reaction/food/soup/jellyfish_stew_two + required_reagents = list(/datum/reagent/water = 50) + required_ingredients = list( + /obj/item/food/fishmeat/gunner_jellyfish = 1, + /obj/item/food/grown/soybeans = 1, + /obj/item/food/grown/redbeet = 1, + /obj/item/food/grown/potato = 1 + ) + results = list( + /datum/reagent/consumable/nutriment/soup/jellyfish = 50, + ) + + // Rootbread Soup /datum/reagent/consumable/nutriment/soup/rootbread name = "Rootbread Soup" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm index 100e74fd91682..71716a1ee7c2a 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm @@ -480,6 +480,10 @@ reaction = /datum/chemical_reaction/food/soup/jellyfish_stew category = CAT_LIZARD +/datum/crafting_recipe/food/reaction/soup/jellyfish_stew_two + reaction = /datum/chemical_reaction/food/soup/jellyfish_stew_two + category = CAT_LIZARD + /datum/crafting_recipe/food/reaction/soup/rootbread_soup reaction = /datum/chemical_reaction/food/soup/rootbread_soup category = CAT_LIZARD diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index fb82737711404..974b19889ecba 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -44,12 +44,22 @@ /obj/item/food/grown/koibeans seed = /obj/item/seeds/soya/koi name = "koibean" - desc = "Something about these seems fishy." + desc = "Something about these seems fishy, they seem really soft, almost squeezable!" icon_state = "koibeans" foodtypes = VEGETABLES tastes = list("koi" = 1) wine_power = 40 +//Now squeezable for imitation carpmeat +/obj/item/food/grown/koibeans/attack_self(mob/living/user) + user.visible_message(span_notice("[user] crushes [src] into a slab of carplike meat."), span_notice("You crush [src] into something that resembles a slab of carplike meat.")) + playsound(user, 'sound/effects/blobattack.ogg', 50, TRUE) + var/obj/item/food/fishmeat/carp/imitation/fishie = new(null) + fishie.reagents.set_all_reagents_purity(seed.get_reagent_purity()) + qdel(src) + user.put_in_hands(fishie) + return TRUE + //Butterbeans, the beans wid da butta! // Butterbeans! - Squeeze for a single butter slice! /obj/item/seeds/soya/butter From 249761751dac1c30de3031ff2e3181f6b45abac4 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:03:22 +1200 Subject: [PATCH 23/49] Automatic changelog for PR #84942 [ci skip] --- html/changelogs/AutoChangeLog-pr-84942.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84942.yml diff --git a/html/changelogs/AutoChangeLog-pr-84942.yml b/html/changelogs/AutoChangeLog-pr-84942.yml new file mode 100644 index 0000000000000..0feec6261f532 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84942.yml @@ -0,0 +1,4 @@ +author: "imedial" +delete-after: True +changes: + - rscadd: "standing on a closed crate now gives loud mode" \ No newline at end of file From ee829182528106782067a027a3d6fe5fb6517387 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:03:41 +1200 Subject: [PATCH 24/49] Automatic changelog for PR #84996 [ci skip] --- html/changelogs/AutoChangeLog-pr-84996.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84996.yml diff --git a/html/changelogs/AutoChangeLog-pr-84996.yml b/html/changelogs/AutoChangeLog-pr-84996.yml new file mode 100644 index 0000000000000..654d0b1da31c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84996.yml @@ -0,0 +1,4 @@ +author: "xXPawnStarrXx" +delete-after: True +changes: + - qol: "made fish better quality when butchered, smushy koibeans and useable gunner jellyfish." \ No newline at end of file From 4d05a291fde6b960dfa1256e3c07f3933bb6f65f Mon Sep 17 00:00:00 2001 From: Yobrocharlie <126765898+Yobrocharlie@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:01:20 -1000 Subject: [PATCH 25/49] Update Island_brawl.dmm (#85000) ## About The Pull Request Removes the fax from the bitrunning ruin https://github.com/tgstation/tgstation/issues/84948 ## Why It's Good For The Game this was an oversight ## Changelog Removes fax ruin from beach_brawl replaces it with donk pockets :cl: fix: Removed bitrunning beach brawl fax machine /:cl: --- _maps/virtual_domains/island_brawl.dmm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm index 2c8a12c6c5793..6648b51f55dfc 100644 --- a/_maps/virtual_domains/island_brawl.dmm +++ b/_maps/virtual_domains/island_brawl.dmm @@ -3466,12 +3466,7 @@ /area/virtual_domain/fullbright) "Rk" = ( /obj/structure/table/glass, -/obj/machinery/fax{ - fax_name = "Beach Hotel Fax"; - name = "Beach Hotel's Fax Machine"; - pixel_y = 8; - visible_to_network = 0 - }, +/obj/item/storage/box/donkpockets, /turf/open/floor/iron/dark/diagonal, /area/virtual_domain) "Rs" = ( From 09773e11bb4c4e7423b90c7d86ec0d735969264b Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:01:41 +1200 Subject: [PATCH 26/49] Automatic changelog for PR #85000 [ci skip] --- html/changelogs/AutoChangeLog-pr-85000.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-85000.yml diff --git a/html/changelogs/AutoChangeLog-pr-85000.yml b/html/changelogs/AutoChangeLog-pr-85000.yml new file mode 100644 index 0000000000000..9cda6ec758a07 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85000.yml @@ -0,0 +1,4 @@ +author: "Yobrocharlie" +delete-after: True +changes: + - bugfix: "Removed bitrunning beach brawl fax machine" \ No newline at end of file From d61c8905e3c3b6b6c6f81e5aa7a29f71b127de23 Mon Sep 17 00:00:00 2001 From: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:27:56 +0530 Subject: [PATCH 27/49] Borgs cant put their integrated tools into the reagent grinder (#85009) ## About The Pull Request - Fixes #85004 Dont `forceMove` but `transferItemToLoc` which checks for `TRAIT_NODROP` ## Changelog :cl: fix: borgs can't put their integrated tools into the reagent grinder /:cl: --- .../reagents/chemistry/machinery/reagentgrinder.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index a4fa10cb88c63..3b0272240b0df 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -204,7 +204,11 @@ if(weapon.w_class + total_weight > maximum_weight) to_chat(user, span_warning("[weapon] is too big to fit into [src].")) continue - weapon.forceMove(src) + + //try to remove the right way + if(!user.transferItemToLoc(weapon, src)) + continue + total_weight += weapon.w_class items_transfered += 1 to_chat(user, span_notice("[weapon] was loaded into [src].")) @@ -212,8 +216,8 @@ return items_transfered /obj/machinery/reagentgrinder/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1) || !can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH)) - return NONE + if(user.combat_mode || (tool.item_flags & ABSTRACT) || (tool.flags_1 & HOLOGRAM_1)) + return ITEM_INTERACT_SKIP_TO_ATTACK //add the beaker if (is_reagent_container(tool) && tool.is_open_container()) From 4e68b0b20872b5cfa2cd3a636e03e8712d0887d3 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 17 Jul 2024 07:58:04 +0100 Subject: [PATCH 28/49] You can properly aim mining bombs at turfs now (#85006) ## About The Pull Request Due to lacking can_target_turfs mining bombs currently travel until they hit a solid object or reach their range, making aiming often frustrating. ## Why It's Good For The Game This doesn't have a balance impact but makes mining with them a bit easier as you can actually position them where you want. ## Changelog :cl: qol: You can properly aim mining bombs at turfs now /:cl: --- code/modules/mod/modules/modules_supply.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 616534cd3dd79..18c1ac6926763 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -561,6 +561,7 @@ light_power = 1 light_color = COLOR_LIGHT_ORANGE embed_type = null + can_hit_turfs = TRUE /obj/projectile/bullet/mining_bomb/Initialize(mapload) . = ..() From 71ac87e78ba1e122fd9fcd2292937cf1b465a01a Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 17 Jul 2024 07:58:12 +0100 Subject: [PATCH 29/49] Fixes hulks being able to activate dualsabers despite not being able to actually do anything with them (#85005) ## About The Pull Request Closes #85002 This order change shouldn't cause any issues with other uses of on_wield ## Changelog :cl: fix: Fixes hulks being able to activate dualsabers despite not being able to actually do anything with them /:cl: --- code/datums/components/twohanded.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 5a3ff4b4cb070..dcb8d63a3c43e 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -217,10 +217,11 @@ if(SEND_SIGNAL(parent, COMSIG_TWOHANDED_WIELD, user) & COMPONENT_TWOHANDED_BLOCK_WIELD) user.dropItemToGround(parent, force = TRUE) return COMPONENT_EQUIPPED_FAILED // blocked wield from item + if (wield_callback?.Invoke(parent, user) & COMPONENT_TWOHANDED_BLOCK_WIELD) + return wielded = TRUE ADD_TRAIT(parent, TRAIT_WIELDED, REF(src)) RegisterSignal(user, COMSIG_MOB_SWAPPING_HANDS, PROC_REF(on_swapping_hands)) - wield_callback?.Invoke(parent, user) // update item stats and name var/obj/item/parent_item = parent From 1e8e94b605ae9d76faa3d799b6eef91318236d88 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:58:15 +1200 Subject: [PATCH 30/49] Automatic changelog for PR #85009 [ci skip] --- html/changelogs/AutoChangeLog-pr-85009.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-85009.yml diff --git a/html/changelogs/AutoChangeLog-pr-85009.yml b/html/changelogs/AutoChangeLog-pr-85009.yml new file mode 100644 index 0000000000000..ad8ce9011b4f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85009.yml @@ -0,0 +1,4 @@ +author: "SyncIt21" +delete-after: True +changes: + - bugfix: "borgs can't put their integrated tools into the reagent grinder" \ No newline at end of file From 53a489f8ef2f33a82e8a5db10a0605fd2d906f23 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:58:24 +1200 Subject: [PATCH 31/49] Automatic changelog for PR #85006 [ci skip] --- html/changelogs/AutoChangeLog-pr-85006.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-85006.yml diff --git a/html/changelogs/AutoChangeLog-pr-85006.yml b/html/changelogs/AutoChangeLog-pr-85006.yml new file mode 100644 index 0000000000000..83c9c3ec18857 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85006.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "You can properly aim mining bombs at turfs now" \ No newline at end of file From 620733a972b1cbd5a82a2c59b9a8f6c3e0d219d7 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:58:33 +1200 Subject: [PATCH 32/49] Automatic changelog for PR #85005 [ci skip] --- html/changelogs/AutoChangeLog-pr-85005.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-85005.yml diff --git a/html/changelogs/AutoChangeLog-pr-85005.yml b/html/changelogs/AutoChangeLog-pr-85005.yml new file mode 100644 index 0000000000000..e554b62ccdbb0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-85005.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Fixes hulks being able to activate dualsabers despite not being able to actually do anything with them" \ No newline at end of file From fcd067abefa6b2b77d0ce4c5fc4fcad3189ae3e5 Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:13:56 +0300 Subject: [PATCH 33/49] Adds missing cable to Wawastation perma (#84986) ## About The Pull Request I don't understand how linters didn't catch this but a prisoner pointed it out ingame and it turned out to be true ![image](https://github.com/user-attachments/assets/946e47c9-c80e-4981-8e17-8a939c0d6ea3) ## Changelog :cl: fix: added a missing cable to Wawastation perma /:cl: --- _maps/map_files/wawastation/wawastation.dmm | 1 + 1 file changed, 1 insertion(+) diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 2250cc17d409b..17a558b4f5efc 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -55250,6 +55250,7 @@ "tvQ" = ( /obj/structure/chair/sofa/bench, /obj/effect/landmark/start/prisoner, +/obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) "twf" = ( From c3f66f62741da46ffd6d601d982527d3626cf45c Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:14:07 +0100 Subject: [PATCH 34/49] Stopping orbiting now automatically breaks you out of autoobserve (#84987) ## About The Pull Request If you move off someone you automatically stop autoobserve (stop viewing their UI and seeing from their perspective) ## Why It's Good For The Game Only way to stop autoobserve right now is via orbit UI, and following in chat does not break you out of it either. And if you have closed your orbit window, you need to open it from ghost tab as you no longer have a button for it, which can be annoying. ## Changelog :cl: qol: Stopping orbiting now automatically breaks you out of autoobserve /:cl: --- code/modules/mob/dead/observer/observer.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c1a81b9d33847..070189a1ff399 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -506,6 +506,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp . = ..() //restart our floating animation after orbit is done. pixel_y = base_pixel_y + // if we were autoobserving, reset perspective + if (!isnull(client) && !isnull(client.eye)) + reset_perspective(null) /mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" From 3f9838edea80b8d2528665bb503a4f4d4cbd9839 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:14:17 +1200 Subject: [PATCH 35/49] Automatic changelog for PR #84986 [ci skip] --- html/changelogs/AutoChangeLog-pr-84986.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84986.yml diff --git a/html/changelogs/AutoChangeLog-pr-84986.yml b/html/changelogs/AutoChangeLog-pr-84986.yml new file mode 100644 index 0000000000000..91e9981c3bc8b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84986.yml @@ -0,0 +1,4 @@ +author: "Sadboysuss" +delete-after: True +changes: + - bugfix: "added a missing cable to Wawastation perma" \ No newline at end of file From dd7738800373288a4b9cb548376855c7ee2b6ed0 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:14:26 +1200 Subject: [PATCH 36/49] Automatic changelog for PR #84987 [ci skip] --- html/changelogs/AutoChangeLog-pr-84987.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84987.yml diff --git a/html/changelogs/AutoChangeLog-pr-84987.yml b/html/changelogs/AutoChangeLog-pr-84987.yml new file mode 100644 index 0000000000000..941b6d80d9ba5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84987.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - qol: "Stopping orbiting now automatically breaks you out of autoobserve" \ No newline at end of file From 1df9138f67ccfc4150cb930084e5b4d9856f5682 Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:14:44 +0300 Subject: [PATCH 37/49] Fixes carrot sword description (#84989) ## About The Pull Request closes https://github.com/tgstation/tgstation/issues/84988 ## Changelog :cl: grungususs spellcheck: fixed a typo for carrot sword description /:cl: --- code/game/objects/items/weaponry.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 5384a11cf3bbe..fbe11fe933d1b 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -162,7 +162,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/claymore/carrot name = "carrot sword" - desc = "A full-sized carrot sword. Definitely \not\ good for the eyes, not anymore." + desc = "A full-sized carrot sword. Definitely not good for the eyes, not anymore." icon_state = "carrot_sword" inhand_icon_state = "carrot_sword" worn_icon_state = "carrot_sword" From 9e47b85167454f1cc5cefced7961fad2e47be281 Mon Sep 17 00:00:00 2001 From: afonamos <74638922+afonamos2@users.noreply.github.com> Date: Wed, 17 Jul 2024 03:14:57 -0400 Subject: [PATCH 38/49] Adds input sanitization to malf ai voice changer module (#84991) ## About The Pull Request Adds input sanitization to the malf ai voice changer module. ## Why It's Good For The Game XSS is bad. ## Changelog :cl: fix: malf ai voice changer no longer accepts dangerous inputs /:cl: Co-authored-by: afonamos --- code/modules/antagonists/malf_ai/malf_ai_modules.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index a80ccec73bf37..57e6ec444196e 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -1044,14 +1044,14 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) owner.speech_span = say_span to_chat(usr, span_notice("Voice set to [selection].")) if("verb") - say_verb = params["verb"] + say_verb = strip_html(params["verb"], MAX_NAME_LEN) if(changing_voice) owner.verb_say = say_verb owner.verb_ask = say_verb owner.verb_exclaim = say_verb owner.verb_yell = say_verb if("name") - say_name = params["name"] + say_name = strip_html(params["name"], MAX_NAME_LEN) /datum/ai_module/utility/emag name = "Targeted Safeties Override" From 5c03505a284c3ca9e7fcd41b90e6c574faf10682 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:15:05 +1200 Subject: [PATCH 39/49] Automatic changelog for PR #84989 [ci skip] --- html/changelogs/AutoChangeLog-pr-84989.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84989.yml diff --git a/html/changelogs/AutoChangeLog-pr-84989.yml b/html/changelogs/AutoChangeLog-pr-84989.yml new file mode 100644 index 0000000000000..89e1e0e4a744e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84989.yml @@ -0,0 +1,4 @@ +author: "grungususs" +delete-after: True +changes: + - spellcheck: "fixed a typo for carrot sword description" \ No newline at end of file From 2e93e7df06d21a3cc72717423fa62a28a8b7c5d6 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:15:19 +1200 Subject: [PATCH 40/49] Automatic changelog for PR #84991 [ci skip] --- html/changelogs/AutoChangeLog-pr-84991.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84991.yml diff --git a/html/changelogs/AutoChangeLog-pr-84991.yml b/html/changelogs/AutoChangeLog-pr-84991.yml new file mode 100644 index 0000000000000..cc34488a039f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84991.yml @@ -0,0 +1,4 @@ +author: "afonamos2" +delete-after: True +changes: + - bugfix: "malf ai voice changer no longer accepts dangerous inputs" \ No newline at end of file From 136b87eba73bf37ff5b1c131d5511ee951321344 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:17:01 +0100 Subject: [PATCH 41/49] Added unit test for embedding (#84981) ## About The Pull Request Added a unit test that checks if embed chance modification, embedding and embed modification passing to shrapnel is correct. There seems to be an inconsistent embedding failure right now that @necromanceranne discovered, hopefully this can catch it further down the line. ## Changelog No player facing changes. --- code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/embedding.dm | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 code/modules/unit_tests/embedding.dm diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 8a869071c7c48..911887cc8b900 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -139,6 +139,7 @@ #include "dummy_spawn.dm" #include "dynamic_ruleset_sanity.dm" #include "egg_glands.dm" +#include "embedding.dm" #include "emoting.dm" #include "ensure_subtree_operational_datum.dm" #include "explosion_action.dm" diff --git a/code/modules/unit_tests/embedding.dm b/code/modules/unit_tests/embedding.dm new file mode 100644 index 0000000000000..05e8cc8b8aa27 --- /dev/null +++ b/code/modules/unit_tests/embedding.dm @@ -0,0 +1,14 @@ +/datum/unit_test/embedding + +/datum/unit_test/embedding/Run() + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/firer = allocate(/mob/living/carbon/human/consistent) + var/obj/projectile/bullet/c38/bullet = new(get_turf(firer)) + bullet.set_embed(bullet.get_embed().generate_with_values(embed_chance = 100)) + TEST_ASSERT_EQUAL(bullet.get_embed().embed_chance, 100, "embed_chance failed to modify") + bullet.preparePixelProjectile(victim, firer) + bullet.fire(get_angle(firer, victim), victim) + var/list/components = victim.GetComponents(/datum/component/embedded) + TEST_ASSERT_EQUAL(components.len, 1, "Projectile with 100% embed chance didn't embed, or embedded multiple times") + var/datum/component/embedded/comp = components[1] + TEST_ASSERT_EQUAL(comp.weapon.get_embed().embed_chance, 100, "embed_chance modification did not transfer to shrapnel") From 01f7be4ea4e0b2b2c80292a8bd519983dda0ee25 Mon Sep 17 00:00:00 2001 From: Rhials <28870487+Rhials@users.noreply.github.com> Date: Wed, 17 Jul 2024 03:18:01 -0400 Subject: [PATCH 42/49] Xenos have their resist UI element again (#84995) ## About The Pull Request This restores the "resist" UI element for xenos. It's been there the whole time, even having the screen item get made every time a Xeno player occupies a body. It wouldn't render, however, since the actual screen element wouldn't be modified to use the xeno UI theme. ![image](https://github.com/user-attachments/assets/ee6a8ddd-da51-4e58-9485-676f3d7085c2) ## Why It's Good For The Game Xenos have plenty to be resisting from. Stop-drop-and-rolling, instantly breaking out of handcuffs or straitjackets, buckle-combat. The thing is, it's been here to whole time too, and even had a sprite already set up, so it leads me to believe that this was somehow just taken out by accident one day and went mostly unnoticed. ## Changelog :cl: Rhials fix: Xenos have a "resist" ui element now. Cool! /:cl: --- code/_onclick/hud/alien.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index c3b91173a45f5..476140acb1edd 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -79,6 +79,7 @@ using = new /atom/movable/screen/resist(null, src) using.icon = ui_style using.screen_loc = ui_above_movement + using.update_appearance() hotkeybuttons += using throw_icon = new /atom/movable/screen/throw_catch(null, src) From 9327bdebb21d86c7d395ad463a581473b84bd539 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:18:20 +1200 Subject: [PATCH 43/49] Automatic changelog for PR #84995 [ci skip] --- html/changelogs/AutoChangeLog-pr-84995.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84995.yml diff --git a/html/changelogs/AutoChangeLog-pr-84995.yml b/html/changelogs/AutoChangeLog-pr-84995.yml new file mode 100644 index 0000000000000..83a9ec235465b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84995.yml @@ -0,0 +1,4 @@ +author: "Rhials" +delete-after: True +changes: + - bugfix: "Xenos have a \"resist\" ui element now. Cool!" \ No newline at end of file From 11a11e260194d355d8e02dbf892439394a2723af Mon Sep 17 00:00:00 2001 From: grungussuss <96586172+Sadboysuss@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:18:55 +0300 Subject: [PATCH 44/49] You can now buckle to bar stools (#84978) ## About The Pull Request https://github.com/user-attachments/assets/9184fc20-e114-42ff-b442-a491692a388b ## Why It's Good For The Game Sitting with a pixel offset on bar stools will further the bar RP experience, it'll also show the barkeep that you're here to drink or talk. ## Changelog :cl: grungussuss add: You can now buckle to bar stools /:cl: --- code/game/objects/structures/beds_chairs/chair.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 9d0a60a5c9ca3..e1581422d0570 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -283,6 +283,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) desc = "It has some unsavory stains on it..." icon_state = "bar" item_chair = /obj/item/chair/stool/bar + can_buckle = TRUE + +/obj/structure/chair/stool/bar/post_buckle_mob(mob/living/M) + M.pixel_y += 4 + +/obj/structure/chair/stool/bar/post_unbuckle_mob(mob/living/M) + M.pixel_y -= 4 MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) From aefea93c7924b1229dad0eaad02873de2439cb98 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:19:14 +1200 Subject: [PATCH 45/49] Automatic changelog for PR #84978 [ci skip] --- html/changelogs/AutoChangeLog-pr-84978.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84978.yml diff --git a/html/changelogs/AutoChangeLog-pr-84978.yml b/html/changelogs/AutoChangeLog-pr-84978.yml new file mode 100644 index 0000000000000..e49418a569618 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84978.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - rscadd: "You can now buckle to bar stools" \ No newline at end of file From ea6c23c689ba96fb3a39aae00a3f59b2417be7fd Mon Sep 17 00:00:00 2001 From: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:20:19 +0100 Subject: [PATCH 46/49] [NO GBP]Fixes space heaters. Makes their effectiveness independant of cell defines. (#84962) ## About The Pull Request Makes BASE_HEATING_ENERGY be 40 KILO JOULES. It shouldn't have any scaling with the cell defines because it impacts how powerful the space heater interacts with the air, and doesn't impact how much energy is actually used per energy it changed in the air. Makes the efficiency variable inversely scale with STANDARD_CELL_CHARGE. This makes the consumption relative to the standard cell charge, so changing the defines won't impact how long the space heater lasts. Makes the heating_energy var use initial() instead of the defines, so they respect subtypes better. Makes the improvised chemical heater also scale their variables based on the initial one. Also sets the improvised chemical heater's settable_temperature_range to what it would be set to with tier 1 parts in RefreshParts(). Renames chem_heating_power to beaker_conduction_power to more accurately describe its effect of scaling how fast it heats or cools things. Removes the pointless multiplication that is done to it in every instance of using it, and instead just scale the variable down. Gives a more accurate description of the improvised chemical heater's heating power in its heating_examine(). Gives better feedback with balloon alerts when attempting to turn on a space heater while it is lacking a cell, has no charge or is broken. ## Why It's Good For The Game Closes #84892 This will make their relative energy usage behave identical to before the power changes. It will make their effectiveness independant of the cell scale. Also the improvised chemical heater's heating power description was misleading and nonsensical. Gives a more accurate one. Space heaters give better feedback when attempting to turn it on while it's missing a cell, has no charge or is broken. ## Changelog :cl: fix: Fixes space heater cell relative consumption inadvertently being changed from the introduction of megacells. qol: The improvised chemical heater gives a more accurate description of its heating power on examine. qol: Improved feedback when attempting to turn on a space heater that is lacking a cell, has no charge or is broken. code: Space heater relative cell consumption is consistent regardless of the cell charge scale. /:cl: --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> --- code/game/machinery/spaceheater.dm | 52 +++++++++++++++++++----------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 1c69dbecb7ea0..af6221d89219d 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -2,7 +2,7 @@ #define HEATER_MODE_HEAT "heat" #define HEATER_MODE_COOL "cool" #define HEATER_MODE_AUTO "auto" -#define BASE_HEATING_ENERGY (STANDARD_CELL_RATE * 4) +#define BASE_HEATING_ENERGY (40 KILO JOULES) /obj/machinery/space_heater anchored = FALSE @@ -32,7 +32,7 @@ ///How much heat/cold we can deliver var/heating_energy = BASE_HEATING_ENERGY ///How efficiently we can deliver that heat/cold (higher indicates less cell consumption) - var/efficiency = 200 + var/efficiency = 20 MEGA JOULES / STANDARD_CELL_CHARGE ///The amount of degrees above and below the target temperature for us to change mode to heater or cooler var/temperature_tolerance = 1 ///What's the middle point of our settable temperature (30 °C) @@ -176,7 +176,7 @@ for(var/datum/stock_part/capacitor/capacitor in component_parts) cap += capacitor.tier - heating_energy = laser * BASE_HEATING_ENERGY + heating_energy = laser * initial(heating_energy) settable_temperature_range = cap * initial(settable_temperature_range) efficiency = (cap + 1) * initial(efficiency) * 0.5 @@ -295,7 +295,14 @@ on = !on mode = HEATER_MODE_STANDBY if(!isnull(user)) - balloon_alert(user, "turned [on ? "on" : "off"]") + if(QDELETED(cell)) + balloon_alert(user, "no cell!") + else if(!cell.charge()) + balloon_alert(user, "no charge!") + else if(!is_operational) + balloon_alert(user, "not operational!") + else + balloon_alert(user, "turned [on ? "on" : "off"]") update_appearance() if(on) SSair.start_processing_machine(src) @@ -310,11 +317,18 @@ //We inherit the cell from the heater prior cell = null interaction_flags_click = FORBID_TELEKINESIS_REACH + display_panel = FALSE + settable_temperature_range = 50 ///The beaker within the heater var/obj/item/reagent_containers/beaker = null - ///How powerful the heating is, upgrades with parts. (ala chem_heater.dm's method, basically the same level of heating, but this is restricted) - var/chem_heating_power = 1 - display_panel = FALSE + /// How quickly it delivers heat to the reagents. In watts per joule of the thermal energy difference of the reagent from the temperature difference of the current and target temperatures. + var/beaker_conduction_power = 0.1 + /// The subsystem we're being processed by. + var/datum/controller/subsystem/processing/our_subsystem + +/obj/machinery/space_heater/improvised_chem_heater/Initialize(mapload) + our_subsystem = locate(subsystem_type) in Master.subsystems + . = ..() /obj/machinery/space_heater/improvised_chem_heater/Destroy() . = ..() @@ -322,11 +336,10 @@ /obj/machinery/space_heater/improvised_chem_heater/heating_examine() . = ..() - - var/power_mod = 0.1 * chem_heating_power - if(set_mode == HEATER_MODE_AUTO) - power_mod *= 0.5 - . += span_notice("Heating power for beaker: [display_power(heating_energy * power_mod, convert = TRUE)]") + // Conducted energy per joule of thermal energy difference in a tick. + var/conduction_energy = beaker_conduction_power * (set_mode == HEATER_MODE_AUTO ? 0.5 : 1) * our_subsystem.wait / (1 SECONDS) + // This accounts for the timestep inaccuracy. + . += span_notice("Reagent conduction power: [conduction_energy < 1 ? display_power(-log(1 - conduction_energy) SECONDS / our_subsystem.wait, convert = FALSE) : "∞W"]/J") /obj/machinery/space_heater/improvised_chem_heater/toggle_power(user) . = ..() @@ -341,10 +354,10 @@ return PROCESS_KILL if(beaker.reagents.total_volume) - var/power_mod = 0.1 * chem_heating_power + var/conduction_modifier = beaker_conduction_power switch(set_mode) if(HEATER_MODE_AUTO) - power_mod *= 0.5 + conduction_modifier *= 0.5 if(HEATER_MODE_HEAT) if(target_temperature < beaker.reagents.chem_temp) return @@ -352,7 +365,7 @@ if(target_temperature > beaker.reagents.chem_temp) return - var/required_energy = abs(target_temperature - beaker.reagents.chem_temp) * power_mod * seconds_per_tick * beaker.reagents.heat_capacity() + var/required_energy = abs(target_temperature - beaker.reagents.chem_temp) * conduction_modifier * seconds_per_tick * beaker.reagents.heat_capacity() required_energy = min(required_energy, heating_energy, cell.charge * efficiency) if(required_energy < 1) return @@ -468,16 +481,17 @@ for(var/datum/stock_part/capacitor/capacitor in component_parts) capacitors_rating += capacitor.tier - heating_energy = lasers_rating * BASE_HEATING_ENERGY + heating_energy = lasers_rating * initial(heating_energy) - settable_temperature_range = capacitors_rating * 50 //-20 - 80 at base - efficiency = (capacitors_rating + 1) * 10 + settable_temperature_range = capacitors_rating * initial(settable_temperature_range) //-20 - 80 at base + efficiency = (capacitors_rating + 1) * initial(efficiency) * 0.5 target_temperature = clamp(target_temperature, max(settable_temperature_median - settable_temperature_range, TCMB), settable_temperature_median + settable_temperature_range) - chem_heating_power = efficiency / 20 + // No time integration is used, so we should clamp this to prevent being able to overshoot if there was a subtype with a high initial value. + beaker_conduction_power = min((capacitors_rating + 1) * 0.5 * initial(beaker_conduction_power), 1 SECONDS / our_subsystem.wait) #undef HEATER_MODE_STANDBY #undef HEATER_MODE_HEAT From 1d6bcabfc14e58d0f207cd921d40765accd5eed7 Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:20:38 +1200 Subject: [PATCH 47/49] Automatic changelog for PR #84962 [ci skip] --- html/changelogs/AutoChangeLog-pr-84962.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84962.yml diff --git a/html/changelogs/AutoChangeLog-pr-84962.yml b/html/changelogs/AutoChangeLog-pr-84962.yml new file mode 100644 index 0000000000000..0bdc3cca7923e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84962.yml @@ -0,0 +1,7 @@ +author: "Pickle-Coding" +delete-after: True +changes: + - bugfix: "Fixes space heater cell relative consumption inadvertently being changed from the introduction of megacells." + - qol: "The improvised chemical heater gives a more accurate description of its heating power on examine." + - qol: "Improved feedback when attempting to turn on a space heater that is lacking a cell, has no charge or is broken." + - code_imp: "Space heater relative cell consumption is consistent regardless of the cell charge scale." \ No newline at end of file From 69c935dbf1bdfa0f699ae31881ac5070b4f1eb45 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 17 Jul 2024 10:22:43 +0300 Subject: [PATCH 48/49] Emitters and Shieldgens work roundstart, APCs charge evenly (#84983) ## About The Pull Request Fixed the issue when the power priority was preferring random machinery around the station over the crucial Emitters and Shieldgens. Because of how the consumers are selected right now, PACMAN attached to a station network will give power for the machinery/lights/environment of a random APC instead of the emitters next to it. This also makes power sinks process before APCs. Also made APCs charge in cascades within a powernet: 1. APCs try to charge to 5% to enable environment channel. 2. When all are above 5%, then allow APCs to charge to 20% to enable lighting channel 2. When all are above 20%, then allow APCs to charge to 35% to enable equipment channel 3. When all are above 35%, then allow APC to charge to full battery As a result, a low-rate power source can provide enough power to at least make all airlocks working and have dim lights enabled. Charlie station APCs after you run PACMAN with 15 uranium sheets: ![image](https://github.com/user-attachments/assets/7bb282da-2189-4123-a31b-c5f294a092cb) ## Why It's Good For The Game Makes emitters actually work, instead of having people fire kisses at SM to raise the internal energy. Makes it possible to use PACMAN to kickstart SM. Gives a reason to set up solars. Makes the power distribution more fair and equal after the recent APC battery buff. ## Changelog :cl: fix: Fixed emitters, shield gens and other wired machinery having lower power consumption priority than APCs qol: Made APCs charge more evenly to ensure that environment and lights are working everywhere before giving the power for equipment /:cl: --- code/__DEFINES/subsystems.dm | 9 ++- code/controllers/subsystem/machines.dm | 56 +++++++++-------- code/modules/power/apc/apc_main.dm | 83 ++++++++++++++++++-------- 3 files changed, 94 insertions(+), 54 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8d460c3aecb6f..5e9f2b35ef04d 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -298,9 +298,12 @@ #define SSEXPLOSIONS_THROWS 3 // Machines subsystem subtasks. -#define SSMACHINES_APCS_EARLY 1 -#define SSMACHINES_MACHINES 2 -#define SSMACHINES_APCS_LATE 3 +#define SSMACHINES_MACHINES 1 +#define SSMACHINES_APCS_EARLY 2 +#define SSMACHINES_APCS_ENVIRONMENT 3 +#define SSMACHINES_APCS_LIGHTS 4 +#define SSMACHINES_APCS_EQUIPMENT 5 +#define SSMACHINES_APCS_LATE 6 // Wardrobe subsystem tasks #define SSWARDROBE_STOCK 1 diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index 3e07eca8a2e87..25c2b3365fbe6 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -11,10 +11,17 @@ SUBSYSTEM_DEF(machines) VAR_PRIVATE/list/all_machines = list() var/list/processing = list() + var/list/processing_apcs = list() + var/list/currentrun = list() - var/list/apc_early_processing = list() - var/list/apc_late_processing = list() - var/current_part = SSMACHINES_APCS_EARLY + var/current_part = SSMACHINES_MACHINES + var/list/apc_steps = list( + SSMACHINES_APCS_ENVIRONMENT, + SSMACHINES_APCS_LIGHTS, + SSMACHINES_APCS_EQUIPMENT, + SSMACHINES_APCS_EARLY, + SSMACHINES_APCS_LATE + ) ///List of all powernets on the server. var/list/datum/powernet/powernets = list() @@ -82,25 +89,10 @@ SUBSYSTEM_DEF(machines) if (!resumed) for(var/datum/powernet/powernet as anything in powernets) powernet.reset() //reset the power state. - current_part = SSMACHINES_APCS_EARLY - src.currentrun = apc_early_processing.Copy() - - //APC early processing. Draws static power usages from their grids. - if(current_part == SSMACHINES_APCS_EARLY) - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/machinery/power/apc/apc = currentrun[currentrun.len] - currentrun.len-- - if(QDELETED(apc) || apc.early_process(wait * 0.1) == PROCESS_KILL) - apc_early_processing -= apc - apc.datum_flags &= ~DF_ISPROCESSING - if(MC_TICK_CHECK) - return current_part = SSMACHINES_MACHINES src.currentrun = processing.Copy() - //General machine processing. Their power usage can be dynamic and based on surplus power, so they come after static power usage have been applied. + //Processing all machines if(current_part == SSMACHINES_MACHINES) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun @@ -112,22 +104,34 @@ SUBSYSTEM_DEF(machines) thing.datum_flags &= ~DF_ISPROCESSING if (MC_TICK_CHECK) return - current_part = SSMACHINES_APCS_LATE - src.currentrun = apc_late_processing.Copy() + current_part = apc_steps[1] + src.currentrun = processing_apcs.Copy() - //APC late processing. APCs will use the remaining power on the grid to charge their cells if needed. - //This is applied at the end so charging APCs don't cause others to discharge by taking all the power from the grid before machines use power. - if(current_part == SSMACHINES_APCS_LATE) + //Processing APCs + while(current_part in apc_steps) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun while(currentrun.len) var/obj/machinery/power/apc/apc = currentrun[currentrun.len] currentrun.len-- - if(QDELETED(apc) || apc.late_process(wait * 0.1) == PROCESS_KILL) - apc_late_processing -= apc + if(QDELETED(apc)) + processing_apcs -= apc apc.datum_flags &= ~DF_ISPROCESSING + switch(current_part) + if(SSMACHINES_APCS_EARLY) + apc.early_process(wait * 0.1) + if(SSMACHINES_APCS_LATE) + apc.charge_channel(null, wait * 0.1) + apc.late_process(wait * 0.1) + else + apc.charge_channel(current_part, wait * 0.1) if(MC_TICK_CHECK) return + var/next_index = apc_steps.Find(current_part) + 1 + if (next_index > apc_steps.len) + return + current_part = apc_steps[next_index] + src.currentrun = processing_apcs.Copy() /datum/controller/subsystem/machines/proc/setup_template_powernets(list/cables) var/obj/structure/cable/PC diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 329f77ab7186d..ca765ac0514a4 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -7,6 +7,12 @@ ///Cap for how fast cells charge, as a percentage per second (.01 means cellcharge is capped to 1% per second) #define CHARGELEVEL 0.01 +///Charge percentage at which the lights channel stops working +#define APC_CHANNEL_LIGHT_TRESHOLD 15 +///Charge percentage at which the equipment channel stops working +#define APC_CHANNEL_EQUIP_TRESHOLD 30 +///Charge percentage at which the APC icon indicates discharging +#define APC_CHANNEL_ALARM_TRESHOLD 75 /obj/machinery/power/apc name = "area power controller" @@ -49,6 +55,8 @@ var/operating = TRUE ///State of the apc charging (not charging, charging, fully charged) var/charging = APC_NOT_CHARGING + ///Previous state of charging, to detect the change + var/last_charging ///Can the APC charge? var/chargemode = TRUE ///Is the apc interface locked? @@ -67,6 +75,8 @@ var/lastused_environ = 0 ///Total amount of power used by the three channels var/lastused_total = 0 + ///Total amount of power put into the battery + var/lastused_charge = 0 ///State of the apc external power (no power, low power, has power) var/main_status = APC_NO_POWER powernet = FALSE // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( @@ -146,8 +156,7 @@ //APCs get added to their own processing tasks for the machines subsystem. if (!(datum_flags & DF_ISPROCESSING)) datum_flags |= DF_ISPROCESSING - SSmachines.apc_early_processing += src - SSmachines.apc_late_processing += src + SSmachines.processing_apcs += src //Pixel offset its appearance based on its direction dir = ndir @@ -516,11 +525,13 @@ disconnect_remote_access() /** - * APC early processing. This gets processed before any other machine does. + * APC early processing. This gets processed after any other machine on the powernet does. * This adds up the total static power usage for the apc's area, then draw that power usage from the grid or APC cell. - * This is done early so machines that use dynamic power get a more truthful surplus when accessing available energy. */ /obj/machinery/power/apc/proc/early_process() + if(isnull(area)) + return + var/total_static_energy_usage = 0 total_static_energy_usage += APC_CHANNEL_IS_ON(lighting) * area.energy_usage[AREA_USAGE_STATIC_LIGHT] total_static_energy_usage += APC_CHANNEL_IS_ON(equipment) * area.energy_usage[AREA_USAGE_STATIC_EQUIP] @@ -551,15 +562,12 @@ lastused_environ = APC_CHANNEL_IS_ON(environ) ? area.energy_usage[AREA_USAGE_ENVIRON] + area.energy_usage[AREA_USAGE_STATIC_ENVIRON] : 0 area.clear_usage() - lastused_total = lastused_light + lastused_equip + lastused_environ - + lastused_total = lastused_light + lastused_equip + lastused_environ + lastused_charge //store states to update icon if any change var/last_lt = lighting var/last_eq = equipment var/last_en = environ - var/last_ch = charging - var/excess = surplus() if(!avail()) @@ -579,7 +587,7 @@ if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights)) low_power_nightshift_lights = TRUE INVOKE_ASYNC(src, PROC_REF(set_nightshift), TRUE) - else if(cell.percent() < 15) // <15%, turn off lighting & equipment + else if(cell.percent() < APC_CHANNEL_LIGHT_TRESHOLD) // turn off lighting & equipment equipment = autoset(equipment, AUTOSET_OFF) lighting = autoset(lighting, AUTOSET_OFF) environ = autoset(environ, AUTOSET_ON) @@ -587,7 +595,7 @@ if(!nightshift_lights || (nightshift_lights && !low_power_nightshift_lights)) low_power_nightshift_lights = TRUE INVOKE_ASYNC(src, PROC_REF(set_nightshift), TRUE) - else if(cell.percent() < 30) // <30%, turn off equipment + else if(cell.percent() < APC_CHANNEL_EQUIP_TRESHOLD) // turn off equipment equipment = autoset(equipment, AUTOSET_OFF) lighting = autoset(lighting, AUTOSET_ON) environ = autoset(environ, AUTOSET_ON) @@ -603,21 +611,9 @@ low_power_nightshift_lights = FALSE if(!SSnightshift.nightshift_active) INVOKE_ASYNC(src, PROC_REF(set_nightshift), FALSE) - if(cell.percent() > 75) + if(cell.percent() > APC_CHANNEL_ALARM_TRESHOLD) alarm_manager.clear_alarm(ALARM_POWER) - charging = APC_NOT_CHARGING - // now trickle-charge the cell - if(chargemode && operating && excess && cell.used_charge()) - // Max charge is capped to % per second constant. - lastused_total += charge_cell(min(cell.chargerate, cell.maxcharge * CHARGELEVEL) * seconds_per_tick, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE) - charging = APC_CHARGING - - // show cell as fully charged if so - if(cell.charge >= cell.maxcharge) - cell.charge = cell.maxcharge - charging = APC_FULLY_CHARGED - else // no cell, switch everything off charging = APC_NOT_CHARGING equipment = autoset(equipment, AUTOSET_FORCE_OFF) @@ -626,13 +622,47 @@ alarm_manager.send_alarm(ALARM_POWER) // update icon & area power if anything changed - if(last_lt != lighting || last_eq != equipment || last_en != environ || force_update) force_update = FALSE queue_icon_update() update() - else if(last_ch != charging) + if(charging != last_charging) queue_icon_update() + // show cell as fully charged if so + if(cell.charge >= cell.maxcharge) + cell.charge = cell.maxcharge + charging = APC_FULLY_CHARGED + +// charge until the battery is full or to the treshold of the provided channel +/obj/machinery/power/apc/proc/charge_channel(channel = null, seconds_per_tick) + if(channel == SSMACHINES_APCS_ENVIRONMENT) + lastused_charge = 0 + last_charging = charging + charging = APC_NOT_CHARGING + + if(!cell || shorted || !operating || !chargemode || !surplus() || !cell.used_charge()) + return + + // no overcharge past the next treshold + var/need_charge_for_channel + switch(channel) + if(SSMACHINES_APCS_ENVIRONMENT) + need_charge_for_channel = (cell.maxcharge * 0.05) - cell.charge + if(SSMACHINES_APCS_LIGHTS) + need_charge_for_channel = (cell.maxcharge * (APC_CHANNEL_LIGHT_TRESHOLD + 5) * 0.01) - cell.charge + if(SSMACHINES_APCS_EQUIPMENT) + need_charge_for_channel = (cell.maxcharge * (APC_CHANNEL_EQUIP_TRESHOLD + 5) * 0.01) - cell.charge + else + need_charge_for_channel = cell.used_charge() + + var/remaining_charge_rate = min(cell.chargerate, cell.maxcharge * CHARGELEVEL) - lastused_charge + var/need_charge = min(need_charge_for_channel, remaining_charge_rate) * seconds_per_tick + //check if we can charge the battery + if(need_charge < 0) + return + + lastused_charge += charge_cell(need_charge, cell = cell, grid_only = TRUE, channel = AREA_USAGE_APC_CHARGE) + charging = APC_CHARGING /obj/machinery/power/apc/proc/reset(wire) switch(wire) @@ -752,3 +782,6 @@ return null #undef CHARGELEVEL +#undef APC_CHANNEL_LIGHT_TRESHOLD +#undef APC_CHANNEL_EQUIP_TRESHOLD +#undef APC_CHANNEL_ALARM_TRESHOLD From df4bb22bb6a2075c35c95adfa53cb0a54eabbaaf Mon Sep 17 00:00:00 2001 From: orange man <61334995+comfyorange@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:23:02 +1200 Subject: [PATCH 49/49] Automatic changelog for PR #84983 [ci skip] --- html/changelogs/AutoChangeLog-pr-84983.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-84983.yml diff --git a/html/changelogs/AutoChangeLog-pr-84983.yml b/html/changelogs/AutoChangeLog-pr-84983.yml new file mode 100644 index 0000000000000..aff73f61b86bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84983.yml @@ -0,0 +1,5 @@ +author: "MTandi" +delete-after: True +changes: + - bugfix: "Fixed emitters, shield gens and other wired machinery having lower power consumption priority than APCs" + - qol: "Made APCs charge more evenly to ensure that environment and lights are working everywhere before giving the power for equipment" \ No newline at end of file