mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 13:10:02 +01:00
mayfools
2955
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
753d8e5ba4 | Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-25-04a | ||
|
|
36788ee05f |
Weather DLC - Make it Rain Anything! (#89550)
## About The Pull Request ##### Disclaimer - Some of the code/icons/sounds were ported from TMGC. Introducing more weather types! And yes, you can now have rain be reagent based! <details> <summary>Regular Rain</summary>  </details> <details> <summary>Blood Rain</summary>  </details> <details> <summary>Acid Rain</summary>  </details> You can even make it rain ants, plasma, or drugs. All of their effects get applied to turfs, objects, and mobs depending on the weather options you select. Did I mention... there is thunder? <details> <summary>Thunder Strikes</summary>  </details> <details> <summary>Sand Storms</summary>  </details> Despite all this new stuff, none of it has been directly added to the game but the code can be used in the future for: - Wizard event - Similar to lava on floor, but this time make the reagent random or picked from a list and give wizard immunity - Chaplain ability - Maybe make this a benefit or ability once enough favor has been obtained - Admin events - I have added a BUNCH of admin tooling to run customized weather events that let you control a lot of options - New station maps/biomes for downstreams (Jungle Station, etc.) - Change Ion storms to use the new weather system that triggers EMP/thunder effects across the station - IceBox could get plasma rain - Lavaland could get thunder effects applied to ash storms Relevant PRs that removed/added some of the weather stuff I used: - #60303 - #25222 --- #### Attribution - Rain sprites were added via [novaepee](https://github.com/novaepee) in https://github.com/tgstation/TerraGov-Marine-Corps/pull/9675 - Sand sprites were added via [TiviPlus](https://github.com/TiviPlus) (who commissioned them from bimmer) in https://github.com/tgstation/TerraGov-Marine-Corps/pull/4645 - Rain sounds [already existed on tg](https://github.com/tgstation/tgstation/pull/25222#discussion_r106794579) and were provided by provided by Cuboos, using Royalty Free sounds, presumed under default tg sound license - Creative Commons 3.0 BY-SA - Siren sound is from siren.wav by IFartInUrGeneralDirection -- [Freesound](https://freesound.org/s/46092/) -- License: Attribution 4.0 The original `siren.ogg` sound used on a lot of SS13 servers doesn't seem to have any attribution that I could locate. The sound was added about 15 years ago. So I just looked for a somewhat similar sounding siren noise on Freesound. ## Why It's Good For The Game More weather customization! ## Changelog 🆑 add: Added new weather types for rain and sandstorms. Rain now uses a reagent that gets exposed to the turfs, mobs, and objects. There is also a thunder strike setting you can apply to any weather. add: Hydro trays and soil will now add reagents to their trays when exposed to a chemical reaction. (weather, shower, chem spills, foam grenades, etc.) add: Weather temperature now affects weather reagents and mobs body temperature. bal: Snowstorm temperature calculations were tweaked to allow universal weather temperature effects. sound: Added weather sounds from TGMC for rain and sirens (attributed to Cuboos and IFartInUrGeneralDirection ) image: Added weather images from TGMC for rain and sand storms (attributed to Novaepee and Bimmer) refactor: Refactored a lot of the weather code to be more robust admin: Admins can now control more weather related options when running weather events. The weather admin verbs have been moved to their own "Weather" category under the Admin tab. /🆑 --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
6c017cf1e1 |
Refactors subsystems to use dependency-ordering to determine init order. Subsystems can now declare their own dependencies. (#90268)
## About The Pull Request
As the title says.
`init_order` is no more, subsystems ordering now depends on their
declared dependencies.
Subsystems can now declare which other subsystems need to init before
them using a list and the subsystem's typepath
I.e.
```dm
dependencies = list(
/datum/controller/subsystem/atoms,
/datum/controller/subsystem/mapping
)
```
The reverse can also be done, if a subsystem must initialize after your
own:
```dm
dependents = list(
/datum/controller/subsystem/atoms
)
```
Cyclical dependencies are not allowed and will throw an error on
initialization if one is found.
There's also a debug tool to visualize the dependency graph, although
it's a bit basic:

Subsystem load ordering can still be controlled using `init_stage`, some
subsystems use this in cases where they must initialize first or last
regardless of dependencies. An error will be thrown if a subsystem has
an `init_stage` before one of their dependencies.
## Why It's Good For The Game
Makes dealing with subsystem dependencies easier, and reduces the chance
of making a dependency error when needing to shift around subsystem
inits.
## Changelog
🆑
refactor: Refactored subsystem initialization
/🆑
|
||
|
|
d653870a91 |
Refactor debugger and byond-tracy init (#90288)
## About The Pull Request This refactors code related to debugger and byond-tracy `/datum/debugger` and `/datum/tracy` - which live in the `GLOBAL_REAL` vars `Debugger` and `Tracy` respectively. This allows code related to those two to be grouped together in their own files, rather than mashed into `world.dm` with a bunch of other shit - while it still initializes during the same stages of init. In addition, this also ports https://github.com/BeeStation/BeeStation-Hornet/pull/8947, which prints runtime errors to chat when the debugger is enabled. <details> <summary><h3>Proof of Testing</h3></summary>      </details> ## Why It's Good For The Game Reduces some `GLOB` pollution, and groups a bunch of related code into dedicated files and datums. It's simply cleaner. Printing runtime errors to chat is also very useful, as it allows you to see when shit is fuck, if you don't want a breakpoint pause for each error. ## Changelog 🆑 refactor: Refactored some code related to initialization. code: Runtime errors will now print to the chat while debugging. /🆑 |
||
|
|
88c2213f1e |
Force UTC±0 for time2text logging and IC times (#90347)
## About The Pull Request This won't actually do anything on live, since those are all set to UTC±0 currently Pins logging and IC uses of time2text to UTC±0 instead of using the system timezone (byond default) Timezones not being set to utc0 caused issues before (and is again) All timezones are now passed explicitly to make it more likely it's cargo culted properly at least Deletes worldtime2text cus it was gameTimestamp default args ## Why It's Good For The Game Server timezone changes probably shouldn't affect logging, round times, file hashes, IC time, when you caught fish, etc ## Changelog 🆑 refactor: Logging and IC timestamps will now always use UTC±0 and not be affected by server system timezone changes fix: Station and round times will not longer be incorrect if the system timezone is not UTC±0 /🆑 --------- Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com> |
||
|
|
6b83a91956 |
Revert "Refactor for storage initialization & organization (#89543)" (#90332)
## About The Pull Request Reverts the storage initialization refactor and all subsequent related PRs. The original PR is below our standards both for code quality and testing, and is majorly flawed at its core. This has been discussed with other maintainers and headcoder(s?) over on discord. A lot of changes from the PR could be brought over later, but in its current state it should not have been merged. - Closes #90322 - Closes #90313 - Closes #90315 - Closes #90320 - Closes #90312 - Closes #90344 ## Why It's Good For The Game This PR causes a series of major issues which cannot be resolved without either completely rewriting a lot of the original PR, or bad code. Not matching our standards is grounds for not merging a PR, and the fact that a PR should not have been merged is a reason for a revert. ## Changelog 🆑 fix: Fixed a series of storage-related bugs caused by a refactor PR. /🆑 |
||
|
|
b9500efdf8 |
Internet web sounds will automatically stop lobby music. End of round music will not play if there is ongoing web sounds. (#90330)
## About The Pull Request As the title says. Also moves lobby music to use variable instead of the timer subsystem since it needs to track on client time rather than server time and variable cooldowns are more relevant for this usecase. ## Why It's Good For The Game Removes the need for admins to stop all playing sounds. Also, people with admin sounds turned off will still be able to hear the lobby music so their experience is improved. Makes the web sound cooldown timings more consistent, hopefully. ## Changelog 🆑 admin: Play Internet Sound will now automatically stop lobby music and prevent lobby music from playing at roundend whilst active. /🆑 |
||
|
|
732c5f63a5 |
Fixes the _winget SDQL2/Lua wrapper (#90327)
## About The Pull Request this makes it so the `_winget` wrapper actually _returns_ what `winget` returns. ## Why It's Good For The Game this wrapper is literally useless otherwise ## Changelog 🆑 fix: Fixed the _winget SDQL2/Lua wrapper, so it actually returns the return value of winget. /🆑 |
||
|
|
f776000677 |
Prevent admins from using restart option which can leak DB connections. Adds timeouts to TTS HTTPS requests (rust-g version bump required). (#90182)
🆑 config: Added `TTS_HTTP_TIMEOUT_SECONDS` for setting the maximum duration TTS HTTP requests can run for before being aborted. /🆑 DNM because we need the rust-g PR to get released: https://github.com/tgstation/rust-g/pull/210 Crit prio because rounds will not restart if there are hung TTS requests and the TTS server is absolute dogshit and doesn't prevent them. |
||
|
|
77823ad210 |
Pathfinding Visualization, JPS fixes, Misc Improvement (#90233)
## About The Pull Request [cleans up poor namespacing on light debugging tools](https://github.com/tgstation/tgstation/commit/93cc9070d56ee4dbeb600ebd4616b047adf9d648) [Implements a pathfinding visualization tool](https://github.com/tgstation/tgstation/commit/ed91f69ac42a92329c10ccdbba308d213fc8c759) It holds a set of inputs from the client, and uses them to generate and display paths from source/target. Left click sets the source, right click sets the target. Pathmap support too, if no target is set we display the paths from every turf in the map to the source, if one is set we build a path TO it from the source. I had to add COMSIG_MOB_CLICKON to observers to make this work (tho idk why it didn't exist already), I also removed the everpresent colorblind datum from admin datums, only needs to exist if they're using it. [Adds a mutable_appearance helper that dirlocks them, wallening port which I thought might be useful here, and will likely be useful elsewhere in future](https://github.com/tgstation/tgstation/commit/87f752e7c361ff47d62452f2f1ea805458f71b66) [Fixes an infinite loop in pathmaps if we tried to pull a cached path to an unreachable target, && not || 4head](https://github.com/tgstation/tgstation/commit/10086a655df817c9f4494f9aac879c85a6059719) [Fixes JPS not dealing with border objects properly. They violate some of the assumptions JPS makes, so we need to backfill them with checks. These basically read as (if the thing that should normally take this path can't reach this turf, can we?)](https://github.com/tgstation/tgstation/commit/f56cc4dd434cecee89879aea500bd1c9d2f38ce6) ## Why It's Good For The Game Maybe deals with #80619? Adds more robust testing tools for pathfinding, should allow people to better understand/debug these systems. I added this with the idea of adding multiz support but I don't have the time for that rn. JPS will work around thindows better, that's nice. https://file.house/IrBiR0bGxoKw1jJJoxgMRQ==.mp4 ## Changelog 🆑 fix: Fixed our pathfinding logic getting deeply confused by border objects admin: Added clientside displayed pathfinding debug tools, give em a go /🆑 |
||
|
|
8ea51f3268 |
Fix the ispath SDQL2/Lua wrapper (and add a is_type_in_typecache wrapper) (#90207)
## About The Pull Request This fixes the `_ispath` SDQL2 / Lua wrapper: it always passed two arguments, meaning it couldn't be used to just simply check if something was a path _at all_. In addition, I just added wrapper around `is_type_in_typecache` (as it's a define), as that's the whole reason I was using `_ispath` anyways, so it can't hurt. ## Why It's Good For The Game things working properly is nice ## Changelog 🆑 fix: The _ispath SDQL2/Lua wrapper can now be used to actually check if something is a path. code: Added the _is_type_in_typecache wrapper, for SDQL2 / Lua scripts. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
0f57a23830 |
Refactor for storage initialization & organization (#89543)
## About The Pull Request A Huge chunk of changes just comes from moving existing storage code into new files & seperating `atom_storage` code into its own subtype under the already existing `storage/subtypes` folder. With that the changes in this PR can be organized into 3 categories. **1. Refactors how `/obj/item/storage/PopulateContents()` initializes storages** - Fixes #88747 and every other storage item that has a similar variant of this problem The problem with `PopulateContents()` is that it allows you to create atoms directly inside the storage via `new(src)` thus bypassing all the access restrictions enforced by `/datum/storage/can_insert()` resulting in storages holding stuff they shouldn't be able to hold. Now how this proc works has been changed. It must now only return a list of items(each item in the list can either be a typepath or a solid atom or a mix of them in any order) that should be inserted into the storage. Each item is then passed into `can_insert()` to check if it can fit in the storage. If your list contains solid atoms they must be first moved to/Initialized in nullspace so `can_insert()` won't count it as already inserted. `can_insert()` has now also been refactored to throw stack traces but explaining exactly why the item could not fit in the storage thus giving you more debugging details to fix your stuff. A large majority of changes is refactoring `PopulateContents()` to return a list instead of simply creating the item in place so simple 1 line changes & with that we have fixed all broken storages(medical toolbox. electrical toolbox, cruisader armor boxes & many more) that hold more items they can handle **2. Organizes initialization of `atom_storage` for storage subtypes.** All subtypes of `/obj/item/storage` should(not enforced) create their own `/datum/storage/` subtype under the folder `storage/subtypes` if the default values are not sufficient. This is the 2nd change done across all existing storages Not only does this bring code cleanliness & organization (separating storage code from item code like how `/datum/wire` code is separated into its own sub folder) but it also makes storage initialization slightly faster (because you are not modifying default values after `atom_storage` is initialized but you are directly setting the default value in place). You now cannot & should not modify `atom_storage` values inside `PopulateContents()`. This will make that proc as pure as possible so less side effects. Of course this principle is not enforced and you can still modify the storage value after `Initialize()` but this should not be encouraged in the future **3. Adds support for automatic storage computations** Most people don't understand how `atom_storage` values work. The comment here clearly states that https://github.com/tgstation/tgstation/blob/55bbfef0da70d87455ca8d6fd5c95107eb8dbefb/code/game/objects/items/storage/toolbox.dm#L327-L329 Because of that the linked issue occurs not just for medical toolbox but for a lot of other items as well. Which is why if you do not know what you doing, `PopulateContents()` now comes with a new storage parameter i.e. `/datum/storage_config` This datum allows you to compute storage values that will perfectly fit with the initial contents of your storage. It allows you to do stuff like computing `max_slots`, `max_item_weight`, `max_total_weight` etc based on your storage initial contents so that all the contents can fit perfectly leaving no space for excess. ## Changelog 🆑 fix: storages are no longer initialized with items that can't be put back in after taking them out refactor: storage initialization has been refactored. Please report bugs on github /🆑 |
||
|
|
5d3519b9cf |
Adds Dustself, dust smite, divine smites (#89973)
## About The Pull Request - Adds `dustself` admin verb - Adds Dust admin smite - Does what it says on the tin - Adds Divine smites - Variations of smites that come with the prayer sound and special effects - so you can get the message across that this is a punishment from god. https://github.com/user-attachments/assets/1cf89ece-3e89-4135-a984-79ca10c278a6 ## Why It's Good For The Game - Request. Parity for `gibself` - Request. Parity with "Gib" - Request. Someone wanted to add some more flair to smites so I obliged. ## Changelog 🆑 Melbert admin: Adds "Dustself" admin: Adds "Dust" smite. Does what it says on the tin admin: Adds "Divine" smites. They are variations of normal smites themed around divine intervention. /🆑 |
||
|
|
68b687b13f |
some more 516 compat fixes (#89766)
Ports the helpers from https://github.com/BeeStation/BeeStation-Hornet/pull/12240 This should fix some more of the 516 issues that I've seen while giving a quick check through the code The remaining browse should work now. Also fixing another sass warning while being on it. ## About The Pull Request ## Why It's Good For The Game ## Changelog 🆑 fix: tgui say 516 will no longer change channels when the button is used to drag it fix: tgui say 516 will no longer leak radio messages into the wrong channel fix: runechat flickering when faded up messages fade out /🆑 |
||
|
|
9ebcabb077 |
IconForge: rust-g Spritesheet Generation (#89478)
Replaces the asset subsystem's spritesheet generator with a rust-based implementation (https://github.com/tgstation/rust-g/pull/160). This is a rough port of https://github.com/BeeStation/BeeStation-Hornet/pull/10404, but it includes fixes for some cases I didn't catch that apply on TG. (FWIW we've been using this system on prod for over a year and encountered no major issues.)  `/datum/asset/spritesheet_batched`: A version of the spritesheet system that collects a list of `/datum/universal_icon`s and sends them off to rustg asynchronously, and the generation also runs on another thread, so the game doesn't block during realize_spritesheet. The rust generation is about 10x faster when it comes to actual icon generation, but the biggest perk of the batched spritesheets is the caching system. This PR notably does not convert a few things to the new spritesheet generator. - Species and antagonist icons in the preferences view because they use getFlatIcon ~~which can't be converted to universal icons~~. - Yes, this is still a *massive* cost to init, unfortunately. On Bee, I actually enabled the 'legacy' cache on prod and development, which you can see in my PR. That's why I added the 'clear cache' verb and the `unregister()` procs, because it can force a regeneration at runtime. I decided not to port this, since I think it would be detrimental to the large amount of contributors here. - It is *technically* possible to port parts of this to the uni_icon system by making a uni_icon version of getFlatIcon. However, some overlays use runtime-generated icons which are ~~completely unparseable to IconForge, since they're stored in the RSC and don't exist as files anywhere~~. This is most noticeable with things like hair (which blend additively with the hair mask on the server, thus making them invisible to `get_flat_uni_icon`). It also doesn't help that species and antag icons will still need to generate a bunch of dummies and delete them to even verify cache validity. - It is actually possible to write the RSC icons to the filesystem (using fcopy) and reference them in IconForge. However, I'm going to wait on doing this until I port my GAGS implementation because it requires GAGS to exist on the filesystem as well. IconForge generates a cache based on the set of icons used, all transform operations applied, and the source DMIs of each icon used within the spritesheet. It can compare the hashes and invalidate the cache automatically if any of these change. This means we can enable caching on development, and have absolutely no downsides, because if anything changes, the cache invalidates itself. The caching has a mean cost of ~5ms and saves a lot of time compared to generating the spritesheet, even with rust's faster generation. The main downside is that the cache still requires building the list of icons and their transforms, then json encoding it to send to rustg. Here's an abbreviated example of a cache JSON. All of these need to match for the cache to be valid. `input_hash` contains the transform definitions for all the sprites in the spritesheet, so if the input to iconforge changes, that hash catches it. The `sizes` and `sprites` are loaded into DM. ```json { "input_hash": "99f1bc67d590e000", "dmi_hashes": { "icons/ui/achievements/achievements.dmi": "771200c75da11c62" }, "sizes": [ "76x76" ], "sprites": { "achievement-rustascend": { "size_id": "76x76", "position": 1 } }, "rustg_version": "3.6.0", "dm_version": 1 } ``` Universal icons are just a collection of DMI, Icon State, and any icon transformation procs you apply (blends, crops, scales). They can be convered to DM icons via `to_icon()`. I've included an implementation of GAGS that produces universal icons, allowing GAGS items to be converted into them. IconForge can read universal icons and add them to spritesheets. It's basically just a wrapper that reimplements BYOND icon procs. Converts some uses of md5asfile within legacy spritesheets to use rustg_hash_file instead, improving the performance of their generation. Fixes lizard body markings not showing in previews, and re-adds eyes to the ethereal color preview. This is a side effect of IconForge having *much* better error handling than DM icon procs. Invalid stuff that gets passed around will error instead of silently doing nothing. Changes the CSS used in legacy spritesheet generation to split `background: url(...) no-repeat` into separate props. This is necessary for WebView2, as IE treats these properties differently - adding `background-color` to an icon object (as seen in the R&D console) won't work if you don't split these out. Deletes unused spritesheets and their associated icons (condiments spritesheet, old PDA spritesheet) If you press "Character Setup", the 10-13sec of lag is now approximately 0.5-2 seconds. Tracy profile showing the time spent on get_asset_datum. I pressed the preferences button during init on both branches. Do note that this was ran with a smart cache HIT, so no generation occurred.  Much lower worst-case for /datum/asset/New (which includes `create_spritesheets()` and `register()`)  Here's a look at the internal costs from rustg - as you can see `generate_spritesheet()` is very fast:  **Before**  **After**  🆑 fix: Fixed lizard body markings and ethereal feature previews in the preference menu missing some overlays. refactor: Optimized spritesheet asset generation greatly using rustg IconForge, greatly reducing post-initialization lag as well as reducing init times and saving server computation. config: Added 'smart' asset caching, for batched rustg IconForge spritesheets. It is persistent and suitable for use on local, with automatic invalidation. add: Added admin verbs - Debug -> Clear Smart/Legacy Asset Cache for spritesheets. fix: Fixed R&D console icons breaking on WebView2/516 /🆑 |
||
|
|
b9c803a9d8 |
Base implementation of /datum/persistent_client (#89449)
Converts `/datum/player_details` into `/datum/persistent_client`. Persistent Clients persist across connections. The only time a mob's persistent client will change is if the ckey it's bound to logs into a different mob, or the mob is deleted (duh). Also adds PossessByPlayer() so that transfering mob control is cleaner and makes more immediate sense if you don't know byond-fu. Clients are an abstract representation of a connection that can be dropped at almost any moment so putting things that should be stable to access at any time onto an undying object is ideal. This allows for future expansions like abstracting away client.screen and managing everything cleanly. |
||
|
|
9195d0f5d6 |
Adds a very simple admin verb to view everything in the policy json (#89541)
## About The Pull Request Adds `Policy Panel` admin verb. It opens up a very plain, very simple tgui that shows you a dropdown of all `policy.json` entries, allowing you to refer to them if necessary. There's also a search bar.  ## Why It's Good For The Game Half request, half something I thought would be useful. While admins could VV into config and find the `policy.json`, they generally appreciate something more user-facing. ## Changelog 🆑 Melbert admin: Adds the Policy Panel verb, which shows you all the policy the server has set. /🆑 |
||
|
|
406fd6a739 |
Fix map vote revert, add admin verb (#89505)
## About The Pull Request Fixes revert_next_map() not actually reverting the map vote. Also added an admin verb for it for ease of access. ## Why It's Good For The Game Fix bug, revert map vote without having to poke around in the subsystem. ## Changelog 🆑 LT3 fix: Revert next map command actually reverts the map vote admin: Admins now have a verb to revert the map vote /🆑 |
||
|
|
683356368a |
Refactor GLOB.admin/debug/fun_state into cached /datum/ui_state/admin_state instances (#89417)
## About The Pull Request So, some admin verbs/tools that used tguis, i.e edit/debug planes, were available to admins with +DEBUG... but the ui_state used `GLOB.admin_state`, which checks for +ADMIN - meaning that if they _only_ had +DEBUG, they would have the verb... but it would do nothing when they used it. I've refactored `GLOB.admin_state`, `GLOB.debug_state`, and `GLOB.fun_state` into a merged `/datum/ui_state/admin_state`, with a var for which specific permissions are being checked for. You now use the `ADMIN_STATE(perms)` macro to get the UI state for those specific perms, i.e `admin_state(R_ADMIN)` or `admin_state(R_DEBUG)`, and the resulting UI state will check for _those specific perms_. These are initialized and cached in `GLOB.admin_states` (which should never be directly accessed). So, I've went thru every single usage of `GLOB.admin_state`, `GLOB.fun_state`, and `GLOB.debug_state`, and made them all use `ADMIN_STATE()` with the actual permission flags needed to use said UI in the first place. ## Why It's Good For The Game Kinda dumb for specific admin permissions to be granted verbs that don't let them use it anyways. ## Changelog 🆑 admin: Certain UI-based tools (plane debugger, filter editor, etc) that were given to admins with only +VAREDIT or +DEBUG, but refused to open without +ADMIN, now actually work for admins that have the needed permission. /🆑 |
||
|
|
1299d6231f |
Sound Mixer Part 2 (#89251)
Part 1 by grungussuss: https://github.com/tgstation/tgstation/pull/87529  gives players more control over how loud they want certain sounds to be 🆑 Rengan sound: the volume that vox, admin sound, insturments play at can now be tweaked in preferences, check your preferences! sound: Elevator now uses ambience volume preference, jukeboxes uses instrument volume preference and end of round musics uses admin music volume preference. /🆑 |
||
|
|
ced6c0392a |
Creates a "Secrets" panel button for debugging cargo orders (#89469)
## About The Pull Request -Creates a new button in the "Secrets" menu that can override the cooldown for ordering items from department consoles. It can be used to make the cooldown longer, shorter or non-existent. -Creates a new global var to manage this override on every console in dept_order.dm ## Why It's Good For The Game This tool assists in finding and fixing bugs related to cargo orders and cargo crates. The wait time for these cooldowns can be ten minutes or longer, and this speeds up the process significantly. It could also be used by admins during play to make the cooldown lower, or cause absolute mayhem on cargo by setting the cooldown duration to 0. ## Changelog 🆑 add: Added a button in the "Secrets" menu to alter the department console order delay. qol: Button makes it easier to find cargo related bugs. code: Changed code in department_order.dm to allow for overriding the order cooldown duration. admin: Created an admin button in the "Secrets" panel. /🆑 --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> |
||
|
|
434e4e435e |
Removes Secondary & Final Objectives from Traitors (#89466)
## About The Pull Request  Pre-discussed with @Watermelon914, this PR removes Secondary & Final Objectives from all Traitors, rather than just midround ones. It also removes all of the surrounding supporting code. Randomly assigned Primary Objectives still exist, I just used the ability to rewrite mine to take the screenshot. In terms of final objectives, the surrounding items that were available still exist but don't necessarily have sources. If anyone has good ideas for readding these in some other form it can be done in future PRs. It also allows all traitors to buy the Contractor kit, previously limited to midround traitors which lacked secondary objectives, because now all traitors lack secondary objectives. This essentially limits all traitors to a maximum of 20 TC (16 if they spawn with an uplink implant). Currently I don't foresee that they strictly need any additional way of gaining TC during a round as 20 is quite sufficient, but it may take some time to adjust and get used to it after such a long time of having access to more. If we need to adjust the starting value or add a slow drip of more points over time or something, that can be done in followup PRs. This also removes the ability to recreate your uplink added by my beautiful wife in #74315 This was part of the progression traitor design document, but ultimately probably a bad idea as it essentially made traitors impossible to properly disarm. You will once more just need to carefully protect your uplink. **This does not remove the threat/progression system**. Like midround traitors, all Reputation requirements on gear are now simple timelocks, most of which will have elapsed by the time 30 minutes have passed. **Finally** this PR also adds Romerol to the traitor uplink for 25 TC and 30 minutes of reputation, as a treat (and because I removed the final objective that previously granted it). ## Why It's Good For The Game We've tried this system for a long time (3 years last month!) and while I think it had a lot of promise, enabled some cool moments, and also solved several of the problems it set out to solve, overall I think some of the behaviours it has encouraged in players have been overall negative for the game. While the _game systems_ are fine, even quite fun and cool (especially final objectives) I am of the opinion that having them in the game creates a net negative purely in the way that they react with players' _brains_, creating incentives towards behaviour we don't actually want people to pursue. While it's hard-to-impossible to prove any of this with hard data, there has been a prevailing feeling for some time among many (though certainly not all) people that the simple fact of _having_ a constant drip-feed of objective available to players leads directly to less interesting antagonist play. While certainly nobody is _forced_ to do secondary objectives you are directly and quite strongly rewarded for doing so, doing so efficiently, and doing so in a way which makes sure that nobody (alive) sees you do it. This leads to a tendency to play defensively and try to maximise the number of tasks you can complete in one round, which also has a knock-on effect of generally minimising the number of people you attempt to interact with in a round (unless you are killing them). Even people who _intend_ on doing some more interesting gimmick can fall into this trap, as "having more tools" is always useful for anyone who is intending on any kind of plan at all, but then executing on the secondary objectives again incentivises you to lay low, not interact with anyone, be efficient, and then reduces the time you are spending doing the thing that's your actual plan for the round. Removing the ever-present temptation to fish for extra TC leaves "doing whatever your actual plan is" as the sole thing to optimise. Final Objectives too have created unfortunate psychological effects between crewsided players and other antagonists. Because of the _threat_ (no matter how remote, Final Objectives have always been tuned to be appropriately rare) that leaving any antagonist alone will cause them to snowball by acquiring more power, it starts to feel foolish to respond to any threat with less than the maximum possible level of force even if they seem relatively innocuous in the moment. This even has an effect on other non-progression antagonists, as traitors are the most common antagonist type and how people treat them is going to be their default level of reaction to most other station threats. While there has always been the promise of expanding the system with novel and exciting objectives that leverage appearing mid-round to do something unique, we've taken very little advantage of that over time. Most objectives we have added that didn't boil down to "kill someone, with a twist" have been somewhat unsuccessful, serving either as ways to get yourself arrested and killed for no reason or ways to get free telecrystals by doing something the crew don't really care about stopping you from doing. The option still exists to add more roundstart objectives to traitors, if someone suddenly has a great idea that would fit in this space. The ideal outcome of making this change is a slight relaxation of crew attitude towards feeling like their only option after catching an antagonist that isn't sandbagging is to permanently remove them from the round (although it's fine to do this still in many scenarios), and a broadening of traitorous activity which is not purely focused on collecting as many checkboxes as possible and might give people more time to roleplay with other players, not worrying that this time could have been more efficiently spent pursuing a different secondary goal. I don't anticipate or desire that this will prevent traitors from killing anyone (or even stop them from killing people they don't have a specific objective to kill), I just want to remove the FOMO from people's minds. Also this gives us something to talk about at the coder townhall meeting on the 22nd. ## Changelog 🆑 del: Misplaced or stolen traitor uplinks can no longer be recreated using a radio code and special device, guard yours carefully or buy a backup implant. del: Roundstart traitors can no longer take on additional objectives in order to earn additional Telecrystals and fast-forward any unlock timers on items. They also cannot earn the ability to complete a Final Objective. balance: Roundstart traitors can now buy the Contractor Kit from their traitor uplink, rather than only midround traitors. add: Traitors can buy Romerol for 25 TC, after 30 minutes of time has passed in a round. /🆑 |
||
|
|
8190d10f88 |
Fixes tgui alert in reload config never returning (#89397)
## About The Pull Request I was just clicking random buttons and noticed this would always pass even when I said no or closed the alert. ## Why It's Good For The Game Let me back out of doing things to the server ## Changelog 🆑 admin: Reload Configuration can be cancelled via the alert it gives you. /🆑 |
||
|
|
06afb0ce67 |
Makes some admin panels use browser (#89398)
## About The Pull Request del() log, radio log, check antagonists, law/dna/fingerprint logs all use browser instead, which means darkmode, wahoo    The only difference now is that they are in darkmode, really. Also removed browse calls to pipe dispensers (the machine) and windoor assembly, as they both use TGUI now so these don't do anything. Lastly, adds an early return to the tram admin tool if you don't select a tram, cause I found it annoying. ## Why It's Good For The Game Try to use old admin tools, get flashbanged ## Changelog 🆑 admin: Check antagonists & del/law/dna/fingerprint/radio log panels use browsers which means they have darkmode. Also the tram panel will cancel out if you click cancel. /🆑 |
||
|
|
dfa7f2bb62 |
some more 516 compat fixes (#89766)
Ports the helpers from https://github.com/BeeStation/BeeStation-Hornet/pull/12240 This should fix some more of the 516 issues that I've seen while giving a quick check through the code The remaining browse should work now. Also fixing another sass warning while being on it. ## About The Pull Request ## Why It's Good For The Game ## Changelog 🆑 fix: tgui say 516 will no longer change channels when the button is used to drag it fix: tgui say 516 will no longer leak radio messages into the wrong channel fix: runechat flickering when faded up messages fade out /🆑 |
||
|
|
cc335e7e9e |
IconForge: rust-g Spritesheet Generation (#89478)
## About The Pull Request Replaces the asset subsystem's spritesheet generator with a rust-based implementation (https://github.com/tgstation/rust-g/pull/160). This is a rough port of https://github.com/BeeStation/BeeStation-Hornet/pull/10404, but it includes fixes for some cases I didn't catch that apply on TG. (FWIW we've been using this system on prod for over a year and encountered no major issues.) ### TG MAINTAINER NOTE  ### Batched Spritesheets `/datum/asset/spritesheet_batched`: A version of the spritesheet system that collects a list of `/datum/universal_icon`s and sends them off to rustg asynchronously, and the generation also runs on another thread, so the game doesn't block during realize_spritesheet. The rust generation is about 10x faster when it comes to actual icon generation, but the biggest perk of the batched spritesheets is the caching system. This PR notably does not convert a few things to the new spritesheet generator. - Species and antagonist icons in the preferences view because they use getFlatIcon ~~which can't be converted to universal icons~~. - Yes, this is still a *massive* cost to init, unfortunately. On Bee, I actually enabled the 'legacy' cache on prod and development, which you can see in my PR. That's why I added the 'clear cache' verb and the `unregister()` procs, because it can force a regeneration at runtime. I decided not to port this, since I think it would be detrimental to the large amount of contributors here. - It is *technically* possible to port parts of this to the uni_icon system by making a uni_icon version of getFlatIcon. However, some overlays use runtime-generated icons which are ~~completely unparseable to IconForge, since they're stored in the RSC and don't exist as files anywhere~~. This is most noticeable with things like hair (which blend additively with the hair mask on the server, thus making them invisible to `get_flat_uni_icon`). It also doesn't help that species and antag icons will still need to generate a bunch of dummies and delete them to even verify cache validity. - It is actually possible to write the RSC icons to the filesystem (using fcopy) and reference them in IconForge. However, I'm going to wait on doing this until I port my GAGS implementation because it requires GAGS to exist on the filesystem as well. #### Caching IconForge generates a cache based on the set of icons used, all transform operations applied, and the source DMIs of each icon used within the spritesheet. It can compare the hashes and invalidate the cache automatically if any of these change. This means we can enable caching on development, and have absolutely no downsides, because if anything changes, the cache invalidates itself. The caching has a mean cost of ~5ms and saves a lot of time compared to generating the spritesheet, even with rust's faster generation. The main downside is that the cache still requires building the list of icons and their transforms, then json encoding it to send to rustg. Here's an abbreviated example of a cache JSON. All of these need to match for the cache to be valid. `input_hash` contains the transform definitions for all the sprites in the spritesheet, so if the input to iconforge changes, that hash catches it. The `sizes` and `sprites` are loaded into DM. ```json { "input_hash": "99f1bc67d590e000", "dmi_hashes": { "icons/ui/achievements/achievements.dmi": "771200c75da11c62" }, "sizes": [ "76x76" ], "sprites": { "achievement-rustascend": { "size_id": "76x76", "position": 1 } }, "rustg_version": "3.6.0", "dm_version": 1 } ``` ### Universal Icons Universal icons are just a collection of DMI, Icon State, and any icon transformation procs you apply (blends, crops, scales). They can be convered to DM icons via `to_icon()`. I've included an implementation of GAGS that produces universal icons, allowing GAGS items to be converted into them. IconForge can read universal icons and add them to spritesheets. It's basically just a wrapper that reimplements BYOND icon procs. ### Other Stuff Converts some uses of md5asfile within legacy spritesheets to use rustg_hash_file instead, improving the performance of their generation. Fixes lizard body markings not showing in previews, and re-adds eyes to the ethereal color preview. This is a side effect of IconForge having *much* better error handling than DM icon procs. Invalid stuff that gets passed around will error instead of silently doing nothing. Changes the CSS used in legacy spritesheet generation to split `background: url(...) no-repeat` into separate props. This is necessary for WebView2, as IE treats these properties differently - adding `background-color` to an icon object (as seen in the R&D console) won't work if you don't split these out. Deletes unused spritesheets and their associated icons (condiments spritesheet, old PDA spritesheet) ## Why It's Good For The Game If you press "Character Setup", the 10-13sec of lag is now approximately 0.5-2 seconds. Tracy profile showing the time spent on get_asset_datum. I pressed the preferences button during init on both branches. Do note that this was ran with a smart cache HIT, so no generation occurred.  Much lower worst-case for /datum/asset/New (which includes `create_spritesheets()` and `register()`)  Here's a look at the internal costs from rustg - as you can see `generate_spritesheet()` is very fast:  ### Comparison for a single spritesheet - chat spritesheet: **Before**  **After**  ## Changelog 🆑 fix: Fixed lizard body markings and ethereal feature previews in the preference menu missing some overlays. refactor: Optimized spritesheet asset generation greatly using rustg IconForge, greatly reducing post-initialization lag as well as reducing init times and saving server computation. config: Added 'smart' asset caching, for batched rustg IconForge spritesheets. It is persistent and suitable for use on local, with automatic invalidation. add: Added admin verbs - Debug -> Clear Smart/Legacy Asset Cache for spritesheets. fix: Fixed R&D console icons breaking on WebView2/516 /🆑 |
||
|
|
a0e862d575 |
Base implementation of /datum/persistent_client (#89449)
## About The Pull Request Converts `/datum/player_details` into `/datum/persistent_client`. Persistent Clients persist across connections. The only time a mob's persistent client will change is if the ckey it's bound to logs into a different mob, or the mob is deleted (duh). Also adds PossessByPlayer() so that transfering mob control is cleaner and makes more immediate sense if you don't know byond-fu. ## Why It's Good For The Game Clients are an abstract representation of a connection that can be dropped at almost any moment so putting things that should be stable to access at any time onto an undying object is ideal. This allows for future expansions like abstracting away client.screen and managing everything cleanly. |
||
|
|
b4e4db72d1 |
Adds a very simple admin verb to view everything in the policy json (#89541)
## About The Pull Request Adds `Policy Panel` admin verb. It opens up a very plain, very simple tgui that shows you a dropdown of all `policy.json` entries, allowing you to refer to them if necessary. There's also a search bar.  ## Why It's Good For The Game Half request, half something I thought would be useful. While admins could VV into config and find the `policy.json`, they generally appreciate something more user-facing. ## Changelog 🆑 Melbert admin: Adds the Policy Panel verb, which shows you all the policy the server has set. /🆑 |
||
|
|
b6b8306fda | Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-25-02a | ||
|
|
9a14e4dcb9 |
Fix map vote revert, add admin verb (#89505)
## About The Pull Request Fixes revert_next_map() not actually reverting the map vote. Also added an admin verb for it for ease of access. ## Why It's Good For The Game Fix bug, revert map vote without having to poke around in the subsystem. ## Changelog 🆑 LT3 fix: Revert next map command actually reverts the map vote admin: Admins now have a verb to revert the map vote /🆑 |
||
|
|
d656f0f4ec |
Refactor GLOB.admin/debug/fun_state into cached /datum/ui_state/admin_state instances (#89417)
## About The Pull Request So, some admin verbs/tools that used tguis, i.e edit/debug planes, were available to admins with +DEBUG... but the ui_state used `GLOB.admin_state`, which checks for +ADMIN - meaning that if they _only_ had +DEBUG, they would have the verb... but it would do nothing when they used it. I've refactored `GLOB.admin_state`, `GLOB.debug_state`, and `GLOB.fun_state` into a merged `/datum/ui_state/admin_state`, with a var for which specific permissions are being checked for. You now use the `ADMIN_STATE(perms)` macro to get the UI state for those specific perms, i.e `admin_state(R_ADMIN)` or `admin_state(R_DEBUG)`, and the resulting UI state will check for _those specific perms_. These are initialized and cached in `GLOB.admin_states` (which should never be directly accessed). So, I've went thru every single usage of `GLOB.admin_state`, `GLOB.fun_state`, and `GLOB.debug_state`, and made them all use `ADMIN_STATE()` with the actual permission flags needed to use said UI in the first place. ## Why It's Good For The Game Kinda dumb for specific admin permissions to be granted verbs that don't let them use it anyways. ## Changelog 🆑 admin: Certain UI-based tools (plane debugger, filter editor, etc) that were given to admins with only +VAREDIT or +DEBUG, but refused to open without +ADMIN, now actually work for admins that have the needed permission. /🆑 |
||
|
|
44d991b526 |
Sound Mixer Part 2 (#89251)
## About The Pull Request Part 1 by grungussuss: https://github.com/tgstation/tgstation/pull/87529  ## Why It's Good For The Game gives players more control over how loud they want certain sounds to be ## Changelog 🆑 Rengan sound: the volume that vox, admin sound, insturments play at can now be tweaked in preferences, check your preferences! sound: Elevator now uses ambience volume preference, jukeboxes uses instrument volume preference and end of round musics uses admin music volume preference. /🆑 |
||
|
|
a6e2b96ca7 |
Creates a "Secrets" panel button for debugging cargo orders (#89469)
## About The Pull Request -Creates a new button in the "Secrets" menu that can override the cooldown for ordering items from department consoles. It can be used to make the cooldown longer, shorter or non-existent. -Creates a new global var to manage this override on every console in dept_order.dm ## Why It's Good For The Game This tool assists in finding and fixing bugs related to cargo orders and cargo crates. The wait time for these cooldowns can be ten minutes or longer, and this speeds up the process significantly. It could also be used by admins during play to make the cooldown lower, or cause absolute mayhem on cargo by setting the cooldown duration to 0. ## Changelog 🆑 add: Added a button in the "Secrets" menu to alter the department console order delay. qol: Button makes it easier to find cargo related bugs. code: Changed code in department_order.dm to allow for overriding the order cooldown duration. admin: Created an admin button in the "Secrets" panel. /🆑 --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> |
||
|
|
23ac16411d |
Removes Secondary & Final Objectives from Traitors (#89466)
## About The Pull Request  Pre-discussed with @Watermelon914, this PR removes Secondary & Final Objectives from all Traitors, rather than just midround ones. It also removes all of the surrounding supporting code. Randomly assigned Primary Objectives still exist, I just used the ability to rewrite mine to take the screenshot. In terms of final objectives, the surrounding items that were available still exist but don't necessarily have sources. If anyone has good ideas for readding these in some other form it can be done in future PRs. It also allows all traitors to buy the Contractor kit, previously limited to midround traitors which lacked secondary objectives, because now all traitors lack secondary objectives. This essentially limits all traitors to a maximum of 20 TC (16 if they spawn with an uplink implant). Currently I don't foresee that they strictly need any additional way of gaining TC during a round as 20 is quite sufficient, but it may take some time to adjust and get used to it after such a long time of having access to more. If we need to adjust the starting value or add a slow drip of more points over time or something, that can be done in followup PRs. This also removes the ability to recreate your uplink added by my beautiful wife in #74315 This was part of the progression traitor design document, but ultimately probably a bad idea as it essentially made traitors impossible to properly disarm. You will once more just need to carefully protect your uplink. **This does not remove the threat/progression system**. Like midround traitors, all Reputation requirements on gear are now simple timelocks, most of which will have elapsed by the time 30 minutes have passed. **Finally** this PR also adds Romerol to the traitor uplink for 25 TC and 30 minutes of reputation, as a treat (and because I removed the final objective that previously granted it). ## Why It's Good For The Game We've tried this system for a long time (3 years last month!) and while I think it had a lot of promise, enabled some cool moments, and also solved several of the problems it set out to solve, overall I think some of the behaviours it has encouraged in players have been overall negative for the game. While the _game systems_ are fine, even quite fun and cool (especially final objectives) I am of the opinion that having them in the game creates a net negative purely in the way that they react with players' _brains_, creating incentives towards behaviour we don't actually want people to pursue. While it's hard-to-impossible to prove any of this with hard data, there has been a prevailing feeling for some time among many (though certainly not all) people that the simple fact of _having_ a constant drip-feed of objective available to players leads directly to less interesting antagonist play. While certainly nobody is _forced_ to do secondary objectives you are directly and quite strongly rewarded for doing so, doing so efficiently, and doing so in a way which makes sure that nobody (alive) sees you do it. This leads to a tendency to play defensively and try to maximise the number of tasks you can complete in one round, which also has a knock-on effect of generally minimising the number of people you attempt to interact with in a round (unless you are killing them). Even people who _intend_ on doing some more interesting gimmick can fall into this trap, as "having more tools" is always useful for anyone who is intending on any kind of plan at all, but then executing on the secondary objectives again incentivises you to lay low, not interact with anyone, be efficient, and then reduces the time you are spending doing the thing that's your actual plan for the round. Removing the ever-present temptation to fish for extra TC leaves "doing whatever your actual plan is" as the sole thing to optimise. Final Objectives too have created unfortunate psychological effects between crewsided players and other antagonists. Because of the _threat_ (no matter how remote, Final Objectives have always been tuned to be appropriately rare) that leaving any antagonist alone will cause them to snowball by acquiring more power, it starts to feel foolish to respond to any threat with less than the maximum possible level of force even if they seem relatively innocuous in the moment. This even has an effect on other non-progression antagonists, as traitors are the most common antagonist type and how people treat them is going to be their default level of reaction to most other station threats. While there has always been the promise of expanding the system with novel and exciting objectives that leverage appearing mid-round to do something unique, we've taken very little advantage of that over time. Most objectives we have added that didn't boil down to "kill someone, with a twist" have been somewhat unsuccessful, serving either as ways to get yourself arrested and killed for no reason or ways to get free telecrystals by doing something the crew don't really care about stopping you from doing. The option still exists to add more roundstart objectives to traitors, if someone suddenly has a great idea that would fit in this space. The ideal outcome of making this change is a slight relaxation of crew attitude towards feeling like their only option after catching an antagonist that isn't sandbagging is to permanently remove them from the round (although it's fine to do this still in many scenarios), and a broadening of traitorous activity which is not purely focused on collecting as many checkboxes as possible and might give people more time to roleplay with other players, not worrying that this time could have been more efficiently spent pursuing a different secondary goal. I don't anticipate or desire that this will prevent traitors from killing anyone (or even stop them from killing people they don't have a specific objective to kill), I just want to remove the FOMO from people's minds. Also this gives us something to talk about at the coder townhall meeting on the 22nd. ## Changelog 🆑 del: Misplaced or stolen traitor uplinks can no longer be recreated using a radio code and special device, guard yours carefully or buy a backup implant. del: Roundstart traitors can no longer take on additional objectives in order to earn additional Telecrystals and fast-forward any unlock timers on items. They also cannot earn the ability to complete a Final Objective. balance: Roundstart traitors can now buy the Contractor Kit from their traitor uplink, rather than only midround traitors. add: Traitors can buy Romerol for 25 TC, after 30 minutes of time has passed in a round. /🆑 |
||
|
|
4196da874f |
Fixes tgui alert in reload config never returning (#89397)
## About The Pull Request I was just clicking random buttons and noticed this would always pass even when I said no or closed the alert. ## Why It's Good For The Game Let me back out of doing things to the server ## Changelog 🆑 admin: Reload Configuration can be cancelled via the alert it gives you. /🆑 |
||
|
|
390c925352 |
Makes some admin panels use browser (#89398)
## About The Pull Request del() log, radio log, check antagonists, law/dna/fingerprint logs all use browser instead, which means darkmode, wahoo    The only difference now is that they are in darkmode, really. Also removed browse calls to pipe dispensers (the machine) and windoor assembly, as they both use TGUI now so these don't do anything. Lastly, adds an early return to the tram admin tool if you don't select a tram, cause I found it annoying. ## Why It's Good For The Game Try to use old admin tools, get flashbanged ## Changelog 🆑 admin: Check antagonists & del/law/dna/fingerprint/radio log panels use browsers which means they have darkmode. Also the tram panel will cancel out if you click cancel. /🆑 |
||
|
|
348413a8a6 |
Add a DISABLE_DREAMLUAU define, for disabling dreamluau at compile-time (#89359)
## About The Pull Request this adds a new define, `DISABLE_DREAMLUAU` (commented out by default), which does... exactly what it says on the tin. it fully disables any dreamluau-related code (the "Open Lua Editor" admin verb is left in, albeit just giving the user a warning saying Lua is disabled, just so there's no confusion about the verb itself being missing) when compiling with OpenDream outside of CI (so dreamluau code will still be linted), `DISABLE_DREAMLUAU` will be defined by default, tho. ## Why It's Good For The Game makes OpenDream testing easier ## Changelog no user-facing changes. or even code changes for most cases. |
||
|
|
344d3b6266 |
Optimizes /proc/icon_exists() (#89357)
## About The Pull Request This PR reimplements https://github.com/tgstation/tgstation/pull/71538 atop `master`. Quoting the original PR: > Every `icon_exists()` call will cache the entire file. Past me didn't realise _why_ file opts were so expensive, but I do now. This is immeasurably slower on a single call, and _significantly_ faster on subsequent calls to the same file. I attempted to handle some of the review comments that were posted there, by splitting screaming functionality into its own proc. * `if(icon_state in icon_states(file))` and `if(!(icon_state in icon_states(file)))` were refactored to use `icon_exists(file, icon_state)`. * Where screaming was seemingly wanted (and where there wasn't a more descriptive error inside the `if` block), I refactored them to use `icon_exists_or_scream(file, icon_state)` * The exception to the above was under `/datum/unit_test/turf_icons/Run()` and `/datum/unit_test/worn_icons/Run()`, where `icon_states()` was being passed a mode flag. Given that this is only used in unit tests (where performance isn't a priority), I opted to leave these be. Additionally, I revised the documentation comment for `/proc/icon_exists()`, as I felt it was a bit vague currently. ## Why It's Good For The Game https://youtu.be/Z9G1Mf6TZRs ## Changelog No player-facing changes (hopefully). --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> |
||
|
|
498665f0f4 |
Fixes broken shadows on 516 (#89280)
## About The Pull Request Bandaid fix of broken shadows on 516. Renamed refresh button to rebuild for consistency in plane debugger (Edit/Dubug-Planes). Rebuild now also reapplies parallax, so it will not be turned off after rebuild. Closes #89230 ## Why It's Good For The Game faster 516 adoption ## Changelog 🆑 fix: fixed shadows on 516 /🆑 |
||
|
|
4c2a76ede3 |
Fix a large number of typos (#89254)
Fixes a very large number of typos. A few of these fixes also extend to variable names, but only the really egregious ones like "concious". |
||
|
|
876088b9a9 |
Expands (further) on Rift Fishing by adding two new fish & more (#88860)
## About The Pull Request I swear it's the last one  ### Added two new fishes to the rift pool:  #### The __mossglob__ is the Fisherman's Bane. The apex of evil. The be-all-end-all in fisher destruction. It is haunted. It deals toxic damage. It throws itself around. It's coated in a deadly and hallucinogenic compound. Its mossy coating is slippery. It revives itself. It throws itself out of aquariums. Best of all, it is extremely easy to catch. How do you deal with it? Well, probably by not fishing in a portal to hell. Otherwise... good luck? Suiciding into it empowers it by 15% and seals you inside. JOIN THE MOSS!  #### The __babbelfish__ is a strange sort of predator, a psychic fish. It casts a psychic aura near itself, ~~disturbing people~~ (nvm lol the demoralizer datum is bad), killing fish nearby and then eating their corpses. When it dies, it emits an awesome psychic wail, which will instantly kill all fish in audible range and severely incapacitate psy-sensitive humans: I can't play the ogg here but credits to grungus for it   There is also a secret, secondary function of the babbelfish: Splitting one in half (a terrible idea) and shoving it inside your ears will unlock your full psychic potential, granting you psychic resistance and grant you the ability to either understand or speak every single language, at a terrible cost. #### ARMS Failing the fishing minigame while fishing in a heretical rift will now cause the rift to tear your arm (and its fishing rod) off your joints and greedily slurp it up. The Mansus does not care for losers. (Getting bored and walking away while the minigame is up also counts as failure.) However, these missing items can, in fact, be fished back up, which also includes arms -and- heads lost normally to the rift! Not only that, but you're able to fish up random arms of any type, presumably from other fools across time and space. #### This PR probably shouldn't be merged until the bug that causes finite fish counts to not be finite is fixed. Infinite fire sharks are bad enough... Added ABSTRACT flag to profound_fisher fake rod. objectify() now works with instances of objects. Apparently snuck in a random-ass refactor to smoker lungs. Psychic resistance now prevents the instadeath from trying to telekinetically grasp at a opened rift. Hallucinogenic fish with a stinger now inject their hallucinogenic toxins. I woudl like to preemptively apologize to ghommie ## Why It's Good For The Game __Mossglob__ I think the game's missing a fish that's just extremely dangerous to be around, the piscine equivalent to radioactive waste. You can't bin or tank it, because it flies off. You can't kill it, because it's atmos-proof and revives itself anyway. Trying to keep it on a table to turn into disgusting mold 'slices' is a challenge in and of itself. This fish will (not) make people think twice about fishing in hell, and give another reason for security and command to give PSAs to not interact with the rifts across space and time around the station, which I think is wonderful. __Babbelfish__ This fish punishes sloppy fishermen who hold up their catch and then store it inside their bag for the poor fish to slowly asphixiate to death in. The fish griefing that will happen from it will be _wonderful_. The organ thing is a clear reference to HHG, but it has its own twist. You can speak all languages, or understand all languages... but rarely both. It'll make for some silly situations where people just 'make strange noises' at you or try to act as translator for, say, ashwalkers or xenomorphs while being completely clueless as to what anyone is actually saying. __ARMS__ Arms. Arms arms. Someone asked me if rifts let you fish up arms and i said ___IT DOES NOW___. ## Changelog 🆑 Ghommie, carlarc, grungus add: Added two new fish to heretic rift fishing. add: You can now fish up arms, heads, and other items lost to heretic rifts! admin: objectify() now works with instances of objects. Mark a player, then an object, and use those marks to call that global proc and you can turn people into pre-existing items. add: Psychic resistance now prevents the instadeath from trying to telekinetically grasp at a opened rift. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
4b512f1239 |
makes mimics into basicmobs (#88910)
## About The Pull Request mimics are basicmobs now the only change not carried over worth mentioning is that all mimics are a consistent speed because i cant imagine a gun or object with aimbot going at you mach 2 would be very fun mimic crates had some stuff changed compared to their simple animal variant they open and close their lid when attacking (unless locked) to be like menacing or something like animals flash colors to ward off people attempting to open a nonsentient hostile crate mimic will make it lock itself (if it contains anything) and attack you mimics are a really stupid naming for these because like mimic crates pretend to be crates anything else inheriting from mimics are just used to make objects alive https://github.com/user-attachments/assets/34a733a4-45a3-409e-8a6a-b2a8c7540898 ranged mimics now use viscontents (they also keep trying to pointblank people for some reason i think thats ok though unless its a wand of fireball) ranged mimic (any ranged weapon animated by a bolt of animation) https://github.com/user-attachments/assets/c3f1d2f5-cfb8-46a9-a58c-255c53a034db ## Why It's Good For The Game fixes #85668 ## Changelog 🆑 refactor: mimics (bolt of animation, malf ai Machine Override, etc) are basicmobs fix: crate mimics may now be opened /🆑 --------- Co-authored-by: Jacquerel <hnevard@gmail.com> |
||
|
|
2252ec2eaf |
show admins classified reports (#89035)
## About The Pull Request Lets other admins see what you sent in a classified command report.  ## Why It's Good For The Game Admins can see this anyway and I've previously wanted to look this up to see what another admin is doing. ## Changelog 🆑 admin: All admins will now see what is in a classified command report 🆑 Co-authored-by: Josh Powell <josh.powell@softwire.com> |
||
|
|
6df77ad80d |
[MIRROR] Death of mutant bodyparts AND external organs (#85137) (#4335)
* Death of mutant bodyparts AND external organs (#85137) Removes mutant bodyparts and external organs from the game completely Digitgrade behaviour was mutant bodypart for no reason Cat ears now work with the bodyparts overlay system, same as all the other external organs (since all their behaviour is now just on /organ It doesn't remove all the /external types, but moves all behaviour to /organ. I'll follow up with a PR wiping all the /external organ types, but it's just conflict heaven so not this PR I've also streamlined a lot of duplicate/weird species regeneration code Melbert did the same PR as well but due to a lack of time (?) I have absorbed his PR to double nuke mutant bodyparts Frees us from the chain of unmodular code, and kills my greatest nemesis (after the shuttle meteor murder bug) 🆑 Time-Green and MrMelbert Refactor: External organ behaviour has been moved to /organ, ears now use the same system as the other organs Refactor: Mutant bodyparts are dead! This likely does not mean much to the average person but it's very dear to me code: Improves digitgrade handling in preference code /🆑 I have absorbed #85126, using Melberts code to improve and add some missing changes. Mainly improving the functioning of preferences and digitgrade legs. I didn't take over the hairstyle improvements. --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> * Fixes missing felinid ear preference (#86553) Closes #86452 🆑 fix: Fixed missing felinid ear preference /🆑 * Spelling Fixes (#86056) Fixes several errors to spelling, grammar, and punctuation. Improves readability and user experience. 🆑 spellcheck: fixed a few typos /🆑 * Fix plasmamen having all feature preferences (#86682) Fixes #86622 Plasmamen relevant_external_organ is null, and it then checks if relevant_external_organ is in a list containing nulls I cleared the nulls from get_mut_organs to fix it 🆑 fix: Fixes plasmamen having all external organ species preferences /🆑 * Fixes cat ear layering, makes getFlatIcon account for RESET_COLOR on under/overlays (#86757) After the external organ removal pr, cat ears stopped being as weirdly specialcased, and instead just used a `/datum/bodypart_overlay/mutant` subtype. However, this was set up in a way where the inner ears were put on a different layer from the outer ears, leading to wonky layering. In this pr, we revert their layers and instead apply the inner ears as an overlay onto the base ears, fixing this. Thank you Melbert for the idea. o7 Additionally, as this pr tripped the screenshot tests, makes the `getFlatIcon(...)` proc account for `RESET_COLOR` on under/overlays. We do this by making it stop applying the colour after merging all the under/overlays, and instead apply it and the parent color _before_ merging any under/overlays, while proxying the parent color as a new parameter `parentcolor` to any new `getFlatIcon(...)` calls. This coincidentally also fixes usage of `getFlatIcon(...)` on husked bodies, as those also used `RESET_COLOR` for their blood overlay. The screenshot tests had to be updated for this. Fixes #86453. 🆑 fix: Fixed cat ears not layering properly. fix: Husked bodies show their blood with the right colours in photographs. /🆑 * Automatic changelog for PR #86757 [ci skip] * Fish infusion (#87030) I'm adding a new infusion ~~(actually four, but two of them are just holders for specific organs tied to a couple fish traits)~~ to the game. As the title says, it's about fish. The infusion is composed of three primary organs, plus another few that can be gotten from fish with specific traits. The primary organs are: - Gills (lungs): Instead of breathing oxygen, you now need to stay wet or breathe water vapor. - fish-DNA infused stomach: Can safely eat raw fish. - fish tail: On its own, it only speeds you up on water turfs, but it has another effect once past the organ set threshold. It also makes you waddle and flop like a fish while crawling (I still gotta finish sprites on this one) Other organs are: - semi-aquatic lungs: A subtype of gills from fish with the 'amphibious' trait, falls back on oxygen if there's no water. Can also be gotten from frogs, axolotl and crabs. - fish-DNA infused liver: From fish with the 'toxic' trait. Uses tetrodotoxin as a healing chem instead of a toxin. Also better tolerance to alcohol if you want to drink like a fish (ba dum tsh). - inky tongue: From fish with the 'ink production' trait. Gives mobs the ability to spit ink on a cooldown, blinding and confusion foes temporarily. The main gimmick of this infusion revolves around being drenched in water to benefit from it, In the case you get the gills organ, this also becomes a necessity, to not suffocate to death (alternatively, you can breathe water vapor, without any benefit). To enable the bonus of the organs set, three organs need to be infused. They can be gills, stomach, tail and/or liver, while the inky tongue doesn't count towards it. Once the threshold is reached, the following bonus are enabled: - Wetness decays a lot slower and resists fire a bit more. - Ink spit becomes stronger, allowing it to very briefly knock down foes. - Fishing bonuses and experience - Resistance to high pressures - Slightly expanded FOV - drinking water and showers mildly heal you over time. - for felinids: You won't hate getting sprayed by water or taking a shower. - While wet: - - If the fish tail is implanted, crawling speed is boosted. - - You no longer slip on wet tiles. - - You also become slippery when lying on the floor. - - You get a very mild damage resistance and passive stamina regeneration, and cool down faster. - - You resist grabs better. - - get a very weak positive moodlet. - However, being dry will make you quite squisher, especially against fire damage, slower and give you a modest negative moodlet. While working on it, I've also noticed a few things that explained why tetrodotoxin (TTX) did jackshit at low doses, because livers have a set toxin tolerance value, below which, any amount of toxin does nothing. Also I've felt like reagents like multiver & co were a bit too strong against a reagent that's supposed to work at very low doses, with slow metabolization, so I've added a couple variables to buff TTX a bit, making it harder to purge and resistant to liver toxin tolerance (also added a bit of lungs damage). I wanted to take a shot at coding a DNA infusion and see how chock-full I could make it. DNA infusions are like a middle point between "aha, small visual trinket" and organs with generally ok effects. I seek to make something a bit more complex ~~(also tied to fishing ofc because that's more or less the recurrent gag of my recent features)~~ primaly focused around the unique theme of being strong when wet and weaker when dry. EDIT: The PR is now ready, have a set of screenshots of the (fairly mid) fish tails (and gills, barely visible) on randomly generated spessman and one consistent joe:  🆑 add: Added a new infusion to the game: Fish. Its main gimmick revolves around being stronger and slippery when wet while weaker when dry. balance: Buffed tetrodotoxin a little against liver tolerance and purging reagents. /🆑 * Eye wounds, scars and a new ~Pirate~ RP quirk (#87209) Upon getting stabbed in your eyes or having a bullet fly through your head there's a chance (minor for stabbing, extremely low for headshots) you'll receive a new "Eye Puncture" wound which causes profuse bleeding out of your now-empty eye hole. Once healed you'll have to deal with a scar on your eye which cannot be cured and requires surgical replacement. Eye scarring will reduce your eyes' max health by 15, give you a minor screen tint and a fancy visual on your character sprite. Getting scarring on both eyes will turn you completely blind.  This PR also introduces a new quirk which gives you eye scarring on the eye of your choice and an eyepatch to go alongside it, just make sure that it sits on the right eye. Also added medical(white) subtype of eyepatches to loadout for those who want that version instead. Credits to AnturK on discord for the idea. Its a neat lil' feature that makes the game more immersive, and unlocks more roleplay opportunities for players. New quirk gives access to this feature for players who want to make it a part of their character's backstory (or maybe as a part of permanent scar roleplaying). 🆑 add: Getting stabbed or shot in the eyes has a chance of giving you a new wound and a semi-permanent scar, blinding you on one side add: Added new "Scarred Eye" quirk which blinds you on one eye but gives you a fancy eyepatch add: Medical eyepatches have been added to loadout /🆑 --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> * Resprited tails from fish infusion. (#87298) Back when I made #87030 I got a bit lazy when it came to spriting the fish tails and just ported a few ones from furry servers and made them inherit the hair color. Let me tell you, those sprites kinda look bad, and the fact that they've the same colors of hair is kinda... fuzzy, and doesn't sit well with me, like some hairball stuck in a cat's throat. So I took upon myself to actually make them better (and also give gill overlays a couple extra pixels), at the cost of some of my free time and their wagginess, because fuuuuuck wagging animations for anything that isn't a somewhat amorphous fluffy tail. Fish don't wag their tail. They also get one of several blue/grey tints if the owner of the part doesn't have a peculiar skin tone like lizards or ethereals or moffs. Anyway, comparison time: OLD:  NEW:  Both from byond screenshots but I cut and pasted them in paint instead of asesprite because old habits die hard. Better sprites. Perhaps the selection of blues could be improved a bit idk. 🆑 image: resprited fish tails from fish infusion. /🆑 * Makes the game compile, first. * Removes a duplicate loadout entry added by /tg/ (to avoid people's loadouts getting messed up) * Fixed an issue with on_mob_insert() for /datum/bodypart_overlay/mutant * Fixed an issue with the burn datum of the moth wings bodypart_overlay * Fixing digitigrade legs not behaving as they should be * A bunch of Insert->mob_insert and Remove->mob_remove * Okay, now stuff gets colored properly Also ears work properly too! Only thing is that mutant organs on the preferences dummy don't seem to change between character, at least for most of them, which is really annoying. * Properly returns ears to being internal organs * Makes it so preferences can use relevant_mutant_bodyparts again! * Makes organs properly update when changing species * Markings now get removed when they don't need to be there on a limb * Fully renives update_mutant_bodyparts(), as it was basically just update_body_parts() anyway at this point * fix charging implant * Restores the usage of simple bodypart_overlay for the sensory_enhancer and the hackerman_deck, as that was otherwise causing a bunch of runtimes * Returns legs to being a sprite accessory, just for simplicity's sake (I don't want to have to refactor it on our end again) * Fixes xenos not getting their mutant organs because I accidentally nulled the list for no reason 💀 * Makes it so certain organs (in this case, ears) can't be replaced when changing visual preferences, meaning Tesharis/Synths/Slimepeople will get their respective ears, regardless of what visuals they choose for them * Fixes a small mistake with spines in the code * Adds some mutant_bodyparts for the results of the infuser unit test. This might be a hack, but we'll cross that bridge when we get to it in the future. * Adds a "None" option to tail_spines * Allows ears to not constantly runtime because they don't have an accessory_name sometimes, which is a sad consequence of many species not setting their ear sprite sometimes * Should fix CI, hopefully should be the last thing needed for this to work flawlessly from now on (crossing fingers) * This ACTUALLY fixes the changeling transform and transform sting! Hurray! --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: klorpa <30924131+klorpa@users.noreply.github.com> Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com> Co-authored-by: Fluffles <piecopresident@gmail.com> Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com> |
||
|
|
28ed213197 |
[PORT] [TGUI] Color picker (#2670)
## About The Pull Request Port of the color selection TGUI interface from BeeStation/Artea-Station. https://github.com/BeeStation/BeeStation-Hornet/pull/9417 https://github.com/Artea-Station/Artea-Station-Server/pull/525 This implementation includes a port and adaptation to React, as TG has discontinued the use of Inferno. If the Input: Enable TGUI parameter is disabled in the UI Tab, the old color selection mechanism will be used instead. The new interface supports copying the color value in the #343231 format and allows entering a 6-character hexadecimal color code. Additionally, a color palette for selection is available. ## Why It's Good For The Game The TGUI color picker is more adaptable and prettier. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>    </details> ## Changelog 🆑 itsmeow (original), RimiNosha, Phoenix404 (port) add: Added TGUI-based color palette and replaced all usages of BYOND color palettes with it (TGUI input preferences are still respected). /🆑 |
||
|
|
1795c18aea |
Fix a bunch of html UI's for 516 (#88917)
## About The Pull Request Moved broken on 516 UI's to browser datum They now work and have a dark theme Most of them are admin ones (All except 1) I tried to check all the raw HTML UI's by typing `<< browse(` into the VSC search and going through each element, but I might have missed something. What worked as it was, I didn't touch, except for the Dynamic control UI's ## Why It's Good For The Game Admin can do their things on 516 Coders/Mappers can debug some stuff on 516  ## Changelog 🆑 fix: Admin/Debug UI's (Especially the Game Panel) now work properly on Byond 516, instead of showing raw HTML /🆑 |
||
|
|
1a6a3b2e80 |
Makes drop_everything() actually safe (#88753)
|
||
|
|
f07cdf2871 |
Fix custom map loading ignoring JSON values (#88720)
## About The Pull Request The map loading function was ignoring JSON values when a map's config file was custom loaded. (things like - minetype, planetary, etc.) To resolve this I just made the loadConfig return a json and then use that json. ## Why It's Good For The Game Better custom map support! ## Changelog 🆑 fix: Fix custom map loading ignoring JSON values that were ignored previously. (minetype, planetary, etc.) /🆑 |
||
|
|
2e4d70afe5 |
Updates href uses for 516 (#88699)
## About The Pull Request Was just scrolling through the Paradise github since they seem to have more work done for 516 to see if there's anything I can port over, found this and thought why not. Ports parts of https://github.com/ParadiseSS13/Paradise/pull/25105 Specifically, updaing all hrefs to use the internal ``byond://``, and adding it to grep. ## Why It's Good For The Game More work towards 516. ## Changelog Nothing player-facing. |
||
|
|
56e56ceac9 |
Implement Edge DevTools (#88679)
## About The Pull Request Implements Edge DevTools for 516 users (coders) Thanks to [S34N](https://github.com/ParadiseSS13/Paradise/pull/25363) <details><summary>Images</summary>   </details> --------- Co-authored-by: AnturK <4047233+anturk@users.noreply.github.com> |