mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-02 04:52:10 +00:00
c5d154e10b61cf76b69e71033c44ead3225f9667
4343 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
12d995aeea |
Squashed commit of the following:
commit cb550ab79badae3ffd493dcee24d96f7ad146ed6 Merge: 732416f01d8 |
||
|
|
753d8e5ba4 | Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-25-04a | ||
|
|
9950e761c4 |
Re-adds nanites (#2995)
## About The Pull Request Re-adds nanites, balance changes pending. No plans to do mapping/role changes Based on https://github.com/tgstation/tgstation/pull/60473 with a lot of work on modularizing ## Why It's Good For The Game Nanites are a rather interesting system, my hope is to port it in a more balanced format. ## Proof Of Testing Works, thoroughly tested ## Changelog 🆑 add: Re-adds nanites /🆑 TODO: - [x] Add techweb linking for nanites - [x] Prevent stacking of armor mods (fortitude + dna vault + nanite armor) - [x] Rebalance damage regeneration programs - [x] Remove force speak program by @StrangeWeirdKitten request - [x] Convert UI's to TSX - [x] Fix Nanite program uhb and programmer overlays not working --------- Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com> |
||
|
|
c9d4d83412 |
Fish no longer dies when flopping on safe water. (#90024)
## About The Pull Request I've been feeling for some time that fishes dying if placed on fishable water (or lava/plasma for a couple ones) to be kinda lakluster and counterintuitive. YakumoChen opening an issue about it proved I wasn't the only one thinking that, and I'm not feeling like starting with adding fishing stuff just yet. Not without improving the existing content first. The source_types file was also getting big and a bit bad to navigate through, so I've decided to split it into half a dozen distinct files: fishing portals, rifts, turfs, structures, mining/ruins and surgery. ## Why It's Good For The Game This fixes #89872. The files should also be bit more organized now. ## Changelog 🆑 fix: Fish will no longer drown if left half-submerged in a fishable turf on which it can normally be found. Instead it will disperse after a while or if starving. Note that this only happens if the fish is native to such turfs (eg. lavaloop on beach water will still die). /🆑 |
||
|
|
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. |
||
|
|
79a26d26e5 |
Fix some instances of trying to directly qdel lists (#90227)
## About The Pull Request this fixes a bunch of code incorrectly calling qdel directly on a list, and adds a stack trace to qdel if someone does pass a list to it ## Why It's Good For The Game because I'm pretty sure qdel ends up calling fucking `del()` as `/list` is not a `/datum` ## Changelog No user-facing changes. |
||
|
|
92bf2aa63e |
Fixes singleletter vars in mobs.dm and blood.dm (#90284)
## About The Pull Request Just found this whilst working on something else downstream, why not fix it ## Why It's Good For The Game Something something readable bleeding. ## Changelog 🆑 code: The mobs subsystem and blood.dm file for living mobs no longer use single letter vars /🆑 |
||
|
|
b7383bc503 |
Refactors MODsuit slowdown calculations (#90116)
## About The Pull Request MODsuits now calculate their slowdown by querying modules by sending a signal on themselves instead of having modules try and keep up with control unit's speed updates (which broke in a fabulous fashion after MODsuits were allowed to deploy by piece) Also added a separate trait to prevent objects from being speed potion-ed to combat stabilized red crossbreed issues, and removed a duplicate list helper (40 lines down in the same file lol) Closes #89979 Closes #90036 ## Changelog 🆑 fix: MODsuits should now be affected by stabilized red crossbreeds fix: MODsuit slowdowns should no longer behave weirdly with ash accretion/magboots/armor booster modules. refactor: Refactored MODsuit slowdown calculations to be query-based instead of modules directly modifying part speed values. /🆑 |
||
|
|
b1c61e6cd8 |
Removes 516 warning from the statpanel (#90215)
## About The Pull Request Removed the 516 warning from the statpanel, and updated incorrect compiler warning note about 517 experiments. ## Why It's Good For The Game Our servers now nag you to update to 516, makes no sense to have a warning saying that you should downgrade. ## Changelog 🆑 code: Removed the 516 beta warning entirely /🆑 |
||
|
|
e8f068519d |
Fix ship ambience volume slider acting like an on/off switch (#90153)
## About The Pull Request The code that uses the ship ambience volume slider uses the value in the wrong SEND_SOUND call (one of the ones to stop the current playing ambience) meaning the slider actually does nothing but toggle between ship ambience being off and it being full volume. This fixes that ## Why It's Good For The Game Volume make sound louder or quieter ## Changelog 🆑 fix: fixed the ship ambience volume slider not working properly /🆑 |
||
|
|
cd7da5b684 |
Heretic is now considered an equal threat level to changeling (#90146)
## About The Pull Request This adjusts the threat level for Heretic for the dynamic game mode to have them cost as much as a changeling to be chosen. As well, it adjusts the weighting for heretic latejoin from 8 to 4. ## Why It's Good For The Game Heretic threat, as it is, is stupendously under-valued in relation to our other antagonist threats. Heretic is regularly a round-ending threat and their current threat level is totally inaccurate. ## Changelog N/A |
||
|
|
7ee372163a |
Fix discord round announcements being broken (#3332)
## About The Pull Request I toppled a house of cards when I merged in the new changes to game announcements ## Why It's Good For The Game Being notified when a new round starts is good ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> |
||
|
|
368543b6fd | GallowsCalibrator and Waterpig's fixes, but squash | ||
|
|
5a85095111 |
Introduces 6 New Heretic sideknowledges, 1 new spell to Blade Path. + changes to the Research Tree. (#89169)
Introduces 6 new Heretic Sideknowledges. **Warren King's Welcome:** Starting side-knowledge, Grants to the Heretic's id Maints and External Airlock access. **Phylactery Of Damnation:** T1 Knowledge, located between Imperfect Ritual and Keykeeper's Burden, creates a bottle that can Siphon a small quantity of blood from your victim, (they'll still feel a tiny prick).  **Ether Of The Newborn:** T2 knowledge, replaces Curse Of Paralysis slot in the tree (Inbetween Mark of Madness and Moonlight Amulette).  1 use potion, fully restores the inbiber to full health, removes any sort of affliction,trauma,disease or implant at the cost of knocking the user out for 1 minute. **Codex Morbus:** T3 knowledge, located between Caretaker's Refuge and Ringleader's RIse.   Upgrade of the Codex Cicatrix, draws and siphons runes and essences a bit faster, can be used on a rune to curse a crewmember, provided their blood is on the rune or on the Heretic. **Greaves Of The Prophet:** T3 knowledge, located between Entropic Plume and Wolves Among Sheep.  They work as magical magboots minus the slowdown; they confer full immunity to slips (yes, even space lube). **Rust Sower Grenade:** T2 knowledge, replaces curse of corrosion in the tree (between Aggressive Spread and Star Blast).  Eldritch grenade, Releases a smoke that rusts all affected turfs, blinds whoever doesn't have mask protection and utterly annihilates silicons, mechs, augs and bots. Video Showcase: https://www.youtube.com/watch?v=H1GeO7MYFek **New Blade Path Spell: Wolves Among Sheep** Video Showcase: https://www.youtube.com/watch?v=2LsmUiQzpzA - Briefly transforms the surrounding the heretic into an arena. - Both The Heretic and Crew members caught inside the spell cannot leave or change z level until the spell expires. - The arena is impassable to outsiders. - Everyone caught inside the spell receives a special buff that makes them immune to most enviromental hazards and all forms of Crowd Control while blocking teleportation. - Non Heretics are granted a temporary Heretic Blade and an antag datum. - Scoring a critical hit grants the winner the ability to leave the arena, Critting the heretic fully dissolves the spell. - Critting yourself doesn't remove the debuff. - The Heretic receives a heal upon critting someone. - Breaking a blade while inside the arena will rip off your arm regardless if you are crew or a Heretic. - 2 minutes cooldown. - Replaces Furious Steel as the last spell unlocked pre-ascension. Lastly as you may have guessed, curses have been completely refactored, they are now bound to the new item (Codex Morbus), are no longer empowered by blood but require it as a reagent. Curse of Corrosion and Paralysis have been rebalanced to be slightly stronger than they were at their base value now that they can no longer be empowered. 2 new curses have be introduced. **Curse Of Indulgence:** tanks the target hunger, makes them a carnivore and drastically increases their hunger decay rate, lasts 8 minutes. **Curse Of Transmogrification:** Allows the Heretic to change the target's Race(minus plasmamen for obvious reasons), lasts until the Codex Morbus is destroyed. Lastly the Blade Heretic tree has been shuffled a bit to introduce the new spell. Stance Of the Torn Champion has been **TEMPORARILY** Removed, it will come back in a later PR. Code by me and Xander Sprites by INFRARED_BARON and OrcaCora. Lore tibids by NecromancerAnne. The following is an atomisation of The Heretic Knowledge Rework I'm currently working on alongside Edge (Heretic's Grandaddy). Given the whole PR was probably going to be impossibly big to review; I asked Melbert If could introduce the new knowledges first, so here we are. Do not stress the locations of these knowledges in the tree; While they do fill what few empty slots we still have, it doesn't change the fact that the Heretic tree is an incomprehensible mess and will soon be reworked. **Warren King's Welcome:** Not having mantainence access as an antag sucks. Arguably it sucks even more for Heretics as they are required to find some place discrete in order to be able to cast their rituals. It's not unusual for the station to be so crowded, that setting up a base in space is the only option, the external access helps with that a little bit. **Phylactery Of Damnation and Codex Morbus** Explaining them in the same paragraph as they are intended to be used together. Curses might as well not exist in their current state. The process of cursing a crewmember is way too machineous, annoying, and nowhere near as affective as simply running to your victim and smacking it with your blade. All Curses have now been bundled to the new Codex, they no longer require X reagents, only a drip of the victim's blood. That's when the phylactery comes into play. Victims still feel "a tiny prick" upon being juiced, so beware. **Ether Of The Newborn:** The point of this knowledge is to serve as a backup plan to "random bullshittery". It's not really fun rolling one bad trauma or disease and have it completely invalidate your Heretic round. We already have potions that either heal or provide remedies against wounds/limb loss, the Ether is supposed to be an extreme solution, hence why it causes a 1 minute sleep upon consumption. **Greaves Of The Prophet:** Heretic to this day is fairly lacking when it comes to passive immunities or tools we grant to most of our core antagonists. Specifically, for a melee-focused antagonist, a total lack of antislip is kinda lame, being one of the most common defense tools employed by the crew against newbie antagonist players. Given these cannot be concealed unlike the traitor counterpart and how far down the tree they are, i felt like making them lube resistant was a unique twist and sensible for what's essentialy our core progression antagonist. **Rust Sower Grenade:** directly inspired by the 40k Blight Grenades. The Rust Sower nades serve a double purpose. 1) They introduce a new form of area Denial available to all heretic paths. 2) They confer to non Rust Heretics a way to deal with the so hated Silicon Menace. I'm of the not-so-unpopular school of thought of "Mechs and Silicons have had it too good for too long". A massive chunk of our threat roster gets to this day completely shut down by mechs. I feel like it was about time to make everything Inorganic feel afraid again. To make it a bit more fair, these grenades have a fairly long detonation timer and have been given a couple of unique SFX. **Wolves Among Sheep** Even after the last batch of Changes, Blade Heretic still felt a bit uninspired to me. The path is still essentialy just about running at people and stabbing them in the face. While that's part of the appreal, I'd reckon it's still lacking a bit on the eldritch side of things. Trapping opponents into an arena when they are forced to either engage you or betray their friends to escape can create some potentially interesting story-telling. It also warps the ,oh, so beloathed stun meta we live in by forcing participants to resort to lethal weaponry. Ultimately, this is supposed to be a high risk/high reward spell, if you trap 5 people arm them with heretic blades, and make them all fully stun immune, you are likely gonna get lynched. To free up a slot in the tree I **TEMPORARILY** Removed Stance of the Torn champion, it will come back in my nextish pr, so don't worry about it too much. 🆑 add: New Heretic starting Side-Knowdge Warren King's Welcome add: New Heretic T1 Side knowledge, Phylactery Of Damnation. add: New Heretic T2 Side knowledge, Ether Of The Newborn. add: New Heretic T3 Side knowledge, Codex Morbus. add: New Heretic T2 Side knowledge, Rust Sower grenade. add: New Heretic T3 Side knowledge, Greaves Of The Prophet. add: New Blade Path Spell, Wolves Among Sheep. balance: Heretic curses have been removed from the tree and bundled in the new Knowledge, Codex Morbus. balance: Blade Path tree has been shuffled a bit, all spells have been moved up by one tier to make space for the new spell. removal: Stance Of The Torn Champion has been removed. /🆑 --------- Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
93a2b723da |
IconForge: rust-g GAGS (250x faster edition) (#89590)
## About The Pull Request Offloads GAGS generation to rust-g IconForge. **Key Notes** - The builtin GAGS editor still uses the 'legacy' generation to allow for debugging. - Does not support `color_matrix` layer type, which is currently not used by any GAGS configs. Will do nothing if used. - Does not support `or` blending mode, which is currently not used by any GAGS configs. Will error if used. - Has some 'quirks' compared to BYOND when it comes to mixing icon states with different dir/frame amounts. BYOND will just silently handle these and it's basically undefined behavior because what should you expect BYOND to do? IconForge will spit errors out instead. So this PR also fixes a few of those cases. Functions by writing output to `tmp/gags/gags-[...].dmi`, copying that output into the RSC and assigning the file object to `icon`. Saves ~1.7s init by reducing worst-case GAGS icon generation from 250ms to 1ms. Also optimizes `icon_exists` by using `rustg_dmi_icon_states` for file icons, saving ~60ms. Would have more savings if not for json_decode as well as DMI parsing in rust being somewhat slow. Perhaps having `rustg_dmi_icon_states` share a cache with IconForge could reduce this cost, however I'd still recommend limiting these tests to unit tests (https://github.com/tgstation/dev-cycles-initiative/issues/34), especially for GAGS configs. I'm not sure they're worth 700ms. Saves another ~400ms by replacing `md5asfile` with `rustg_hash_file` in `/datum/greyscale_config/proc/Refresh` Savings are likely even higher when combined with #89478, due to spritesheets sharing a parsed DMI cache with GAGS. This means GAGS will spend less time parsing icons synchronously and can generate output faster. Tracy tests with this combo seem to yield ~2sec savings instead of ~1.7sec Total savings: ~2.16sec to ~2.46sec - Ports https://github.com/BeeStation/BeeStation-Hornet/pull/10455 - Resolves https://github.com/tgstation/dev-cycles-initiative/issues/9 ## Why It's Good For The Game GAGS go zoooom <details> <summary>GAGS Working Ingame</summary>   </details> <details> <summary>GetColoredIconByType</summary>  </details> <details> <summary>icon_exists</summary>  </details> <details> <summary>Refresh</summary>  </details> ## Changelog 🆑 tweak: Optimized GAGS using rust-g IconForge, reducing worst-case generation time to 1ms /🆑 |
||
|
|
d578965582 |
Wallout Loadout equips itself / Lipstick Loadout comes applies itself (and is customizable) (#89808)
## About The Pull Request - Selecting Wallet in the loadout, will equip the wallet when you load into the game. It will auto-fill the wallet with small items from your roundstart kit like quirk items or other loadout items. - Selecting Lipstick in the loadout will automatically apply it to your character. You still get the lipstick item at game start. - Deletes all the preset lipstick colors, now you can just pick what color you want. You can also pick what layer the lipstick starts at (high, middle, low). ## Why It's Good For The Game - Makes it work like the station trait (except the money part) - Convenience - Extra customization ## Changelog 🆑 Melbert qol: Wallet loadout item comes pre-equipped qol: Lipstick loadout item comes pre-applied qol: You can choose your lipstick color from any color now. You can also choose what layer it defaults to. /🆑 |
||
|
|
44acd59b48 |
Fixes broken drone UI on 516 (#89938)
Ironically enough, not a 516 issue but rather a fuckup on our part revealed by a 516 plane switch. Also adjusted the warning, as 516 is outside of beta and we're (supposed to) have almost complete support at this point. Closes #89877 🆑 fix: Fixes black vision for dextrous mobs using 516 version of BYOND /🆑 --------- Co-authored-by: Lucy <lucy@absolucy.moe> |
||
|
|
96ee875b3f |
It's now possible to take trophy fish from previous rounds off the mount (based on RNG). (#89439)
## About The Pull Request Instead of immediately dusting, there's now a chance, depending on size and weight (lower is better) as well as the fishing skill of who tries to remove it (higher is better). At no skill (or if the fish is removed indirectly), the odds of it not dusting can be as low as about 3~4% (BIG FISH) and as high as 50% (tiny feesh), while each level in the skill provides an additional 4% to the roll, up to a bonus 28% (legendary level). As always, regardless of RNG, the fish won't be removed from the persistence system if removed from the trophy mount, and only if replaced. This PR also allows trophy fish to retain traits between rounds, but keep in mind the fish starts dead and may have to be revived first. Also trying to sell it will yield a pitiful 1/20 of its theorical export value, much like for fish from fish cases. ## Why It's Good For The Game The persistent trophy fish mount at the bar seems to fare fairly well without outstanding issues so far, so maybe I should let people get their hands on rare and valuable fish from previous rounds, and give players some more practical reasons to place a fish on the mount for future rounds. As long as people don't start beelining the trophy mount by the bar on regular basis. ## Changelog 🆑 balance: It's now possible to take trophy fish from previous shifts off their mounts without turning them into dust based on a probability revolving around the size and weight of the fish against your fishing skill. /🆑 |
||
|
|
0cd30f127f |
Nukes now delete themselves, rather than having SSticker do it through a callback (#89752)
## About The Pull Request The title pretty much says it all. I'm told that this was done because, previously, the station would be exploded by the nuclear device - but when that was removed, all that remained was `qdel(bomb)`. That said, there's some bizarre stuff behind what pushed me to make this PR. See below if you want to know. <details><summary>Bizarre stuff</summary> For some reason, while trying to port <https://github.com/tgstation/tgstation/pull/77868> over to Monkestation, I started getting hard-deletes for the nuclear bomb used in the `nuke_cinematic` unit test. ``` ## REF SEARCH Beginning search for references to a /obj/machinery/nuclearbomb/syndicate. ## REF SEARCH Refcount for /obj/machinery/nuclearbomb/syndicate: 7 ## REF SEARCH Finished searching globals ## REF SEARCH Finished searching native globals ## REF SEARCH Finished searching atoms ## REF SEARCH Found /obj/machinery/nuclearbomb/syndicate [0x201f850] in list Datums -> /datum/controller/subsystem/garbage [0x2100001c] -> queues (list) -> /list (list) -> /list (list). ## REF SEARCH Found /obj/machinery/nuclearbomb/syndicate [0x201f850] in list Datums -> /datum/callback [0x21057da8] (obj: Ticker proc: station_explosion_detonation args: ["the nuclear fission explosive"] user: null) -> arguments (list). ## REF SEARCH Finished searching datums ## REF SEARCH Finished searching clients ## REF SEARCH Completed search for references to a /obj/machinery/nuclearbomb/syndicate. ## TESTING: GC: -- [0x201f850] | /obj/machinery/nuclearbomb/syndicate was unable to be GC'd -- (ref count of 3) Error: /obj/machinery/nuclearbomb/syndicate hard deleted 1 times out of a total del count of 3 FAILURE #1: /obj/machinery/nuclearbomb/syndicate hard deleted 1 times out of a total del count of 3 at code/modules/unit_tests/create_and_destroy.dm:99 Error: FAIL /datum/unit_test/create_and_destroy 308.1s ``` This hard-del would happen on every integration test, no matter the map and no matter the byond version. I was even able to have it happen locally. Thing is, Monkestation only seems to have two differences in our code for actually exploding a nuke: 1. We mark some z-levels as safe from the nuclear bomb (so you can go to the lowest reaches of icebox and be safe from the bomb). This only modifies the list of z-levels to call the "gib everyone on z" code for. 2. We don't have tgstation/tgstation#75967 ported over - but making a new branch and cherry-picking both 77868 and 75967 didn't seem to fix the issue either. So something with how the callback is handled by the `play_cutscene` global proc is preventing this from being qdel'd properly - resulting in a hard-delete over five minutes after the nuke cinematic plays. I tried several things to understand why the callback was causing a hard-del, but only one gave me any tangible info - changing the reference to the bomb, into a weakref reference, which stopped the hard-del. However, I eventually realized the callback was entirely pointless - right now, all it does is qdel the bomb. So I just moved it from a callback to part of the `really_actually_explode()` proc. </details> ## Why It's Good For The Game I'd say it fixes a hard-delete, but that hard-delete was only happening on Monkestation. So I guess it removes a bit of unnecessary indirection? ## Changelog :cl:MichiRecRoom fix: Nukes will now always be deleted upon exploding, no matter if they have a valid cutscene to play. /🆑 |
||
|
|
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 /🆑 |
||
|
|
1907104d6f |
Fix April Fools and Roundend title music (#89741)
## About The Pull Request 1. April Fools set the lobby music, but order of operations says holidays might be initialized before ticker. So we need to ensure it won't get overridden. 2. Lobby music pref was changed from a toggle to a number, but the proc already passed the number as an argument, so the arg did nothing. Now it'll (properly) play at half volume during end-of-round. 3. When using default repo lobby music, it will not play the same music after two rounds (as it does with configured lobby music) ## Changelog 🆑 Melbert fix: Roundend title music will play at half volume again fix: April Fools lobby music will correctly always be clown music fix: Lobby Music will repeat across sequential rounds less often /🆑 |
||
|
|
e366ace9ec |
You can transplant xenomorph tails onto people (#89618)
This PR allows you to extract tail organs from xenomorphs and surgically attach xenomorph tails to people. (Despite being a carbon the xenomorph sprite is not built out of component overlays so this technically does not remove the tail from its corpse sorry). Having a xenomorph tail makes you better at tackling, changes your tackle verb to "pounce" like if you are a felinid, and also gives you the parkour benefits of the Freerunning quirk.  You can also surgically attach a xenomorph _queen_'s tail to someone. This arguably is a bad idea because it makes you slower (it's much too heavy) but it does give you access to the queen's tail spin attack (after which you will fall over if you aren't inhumanly strong). Also more importantly, it is comically large. Look I'm racking my brain but this one really mostly comes down to "it's funny to do this". But let's pretend that it also increases the depth and complexity of the sandbox and promotes interesting interactions between crewmembers or something like that. Ideally sometimes in the future we will either decide that xenomorphs are not carbons (is it purely because they have organs?) or decide that they _are_ carbons and build them accordingly. In the latter case this will have been a useful addition. 🆑 add: You can transplant xenomorph tails onto people. /🆑 |
||
|
|
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. |
||
|
|
d5c9c93500 |
Adds another option for ghost polling sound. (#88858)
## About The Pull Request - This is a commissioned work. - added a new ghost poll sound - added volume sliders for ghost poll sounds - added ghost poll sound pref - renamed previous sound to calm - calm is enabled by default - normalised volume of the "calm" prompt   https://github.com/user-attachments/assets/8178c108-a632-4f06-879a-00203f2afd3a ## Why It's Good For The Game - it's more ***alerty*** ## Changelog 🆑 grungussuss qol: ghost poll sound can now be disabled qol: ghost poll sound volume can now be tweaked sound: added new ghost poll sound. sound: normalised volume of ghost poll sounds /🆑 |
||
|
|
5e311990c3 |
[NO GBP] Fixing trophy fishes not loading mats (#89623)
## About The Pull Request For some reason, that either wasn't an issue before, or it always was and I did not fix it. Either way, `List()` is a proc and `material_path` variable is being read as an arg called "material_path" which is what the key is being set to, instead of the stored value of the variable, I think. ## Why It's Good For The Game Fixing stuff. ## Changelog 🆑 fix: Fixing loaded trophy fishes possibly not having materials. /🆑 |
||
|
|
f3ac412f69 |
Custom Shuttles Redux: Allows for the construction of custom shuttles. (#88493)
## About The Pull Request This incredibly detailed PR adds the ability to construct custom shuttles, which function similarly to whiteships. To construct a custom shuttle, you need the following items: - Shuttle frame rods These rods can be hand-crafted by using 5 rods on 1 sheet of titanium, or printed at a sci/engi/cargo lathe after researching the Shuttle Engineering techweb node. Lattices built with these rods, and catwalks/floors built on top of these lattices, are valid for shuttle construction. - Shuttle engines Did you know shuttle engines have boards that weren't normally obtainable? Well the board for one specific engine type is now available from the sci/engi/cargo lathe after researching Shuttle Engineering. Of course, the old options remain. You can steal engines from other shuttles, including escape pods (it's not like engines are strictly necessary for *those* shuttles anyways). Alternatively, the shuttle engine supply pack is no longer locked behind the purchase of the BYOS. - Flight Control & Navigation Console boards These boards are printed at the sci/engi/cargo lathe after researching the Shuttle Engineering techweb node. If built on a custom shuttle, it will automatically link to it, unless the shuttle already has such a console. If built on a turf that is valid for custom shuttle construction, it will automatically link to any shuttle constructed from or expanded with that turf. - Shuttle blueprints Standard shuttle blueprints can be printed at the sci/engi/cargo lathe after researching the Shuttle Engineering techweb node. A cyborg upgrade granting access to a shuttle blueprint database can be printed at the exofab after researching the aforementioned node. Crude shuttle blueprints can be crafted by hand with a sheet of paper and either a rainbow crayon or 10 uses of a blue crayon or spraycan. If Science won't research the tech, you can also buy a goody pack containing a flight control board, a docker board, two engine boards, and a set of shuttle blueprints for 1200 credits, if you have aux base access. A shuttle can be constructed atop any continuous region of turfs containing a shuttle rod lattice or a catwalk/tile built upon such. Currently, this region cannot intersect any area other than space, lavaland, the icemoon, or the station asteroid. Preexisting custom areas can be included in the construction of the shuttle, but only if every turf in the custom area is valid for shuttle construction. In the shuttle blueprint UI, you can toggle a visualizer to display which turfs fulfill all of the aforementioned conditions. The following video goes through the basic process of shuttle construction. https://github.com/user-attachments/assets/3283422e-a201-4978-972d-67527b5df4ee The blueprint used to construct the shuttle will be its master blueprint. The master blueprint can be copied to other blank shuttle blueprints (or to engiborgs with the shuttle database upgrade), and allows the holder to perform a christening ritual on the shuttle to rename it. If a shuttle's master blueprint ceases to exist, a blank blueprint can be linked to the shuttle to become the new master blueprint, or an existing blueprint associated with that shuttle can be promoted to the master blueprint. Once constructed, the following options are available from the blueprint UI to modify it: - Create Area Convert a continuous open area of the shuttle into a new area with the name written in the above text input. This operates very similarly to regular area construction. - Rename Area Change the name of the area you're currently in to the name written in the above text input. - Expand Area Add a continuous open area of the shuttle to the neighboring area selected from the dropdown to the left. This operates like regular area expansion. - Expand Shuttle Expand a shuttle with valid frame turfs as defined above. These turfs must be physically connected to the shuttle. - Remove Area Remove an area, giving its tiles to the default shuttle area. - Cleanup Empty Space (implemented after the above video was recorded) Removes all completely empty turfs from the shuttle. If all the turfs in one of the shuttle's areas were removed, that area is deleted. If absolutely no turfs of the shuttle remain, the shuttle itself is deleted. Due to the ability for this action to delete the shuttle, only the master blueprint can do it. As mentioned above, the shuttle's master blueprint can be used to christen its associated shuttle. To do this, fill a glass drink bottle with some amount of reagents, then hit it against one of the shuttle's walls from outside while holding the master blueprint. You will be prompted to enter a new name for the shuttle. The variety of things that can happen while inputting a new name can cause the christening rite to fail in one of several humorous ways. ### Optional (Unless specifically requested by a maintainer) Todo's - [x] A way for shuttle circuits to be obtainable without techweb nodes - [x] A more convenient way to carry around shuttle engines or the means to deploy them - [ ] A shuttle construction guide available as a reference book - [ ] Allow boards to be linked to shuttles before construction so they can be used outside the shuttle ## Why It's Good For The Game Shuttles have been part of the sandbox for an incredibly long time, but their limited accessibility has rendered them the exclusive territory of lucky space explorers or the few antagonists who get one off the bat (nukies and pirates). Giving players the means to construct shuttles to their liking opens up a variety of possibilities for gimmicks for antags and non-antags alike. Besides the applications for antaggery and crew-sided gimmicks, this provides side content for several departments to engage with during the relatively-frequent periods of time where they have little else to do as part of their intended roles. With respect to engineering, if the station isn't actively being damaged, the supermatter is in perfect working order, and nobody is clamoring for machine upgrades, engineers have little else to resort to other than construction projects. While the BSA station goal provides an incentive for engineers to construct dedicated rooms for the cannon, it will not necessarily be available every round. Custom shuttles not only provide such a construction project to pursue, but provide the rare opportunity, as well as a very good reason, to set up an independent power network, complete with its own power source. While atmos techs have a lot to do with gas mixing and the crystallizer, they rarely get the opportunity to set up working life support systems outside of repairing the ones that get blown up. Custom shuttles will frequently start with no air, and unless the design settled upon is an open floor plan, it will have several independent chambers that cannot so easily be profused with a proper airmix by just opening a canister. Furthermore, if the air in a custom shuttle gets messed up, a proper scrubber and distro network is a significantly less tedious method of rectifying the problem than cleaning the air manually with portable scrubbers and pumps. Scientists, it can be argued, with their access to RPDs through ordnance, have similar opportunities to atmos techs, even though the act in and of itself is not exactly part of their duties. But compared to the other job content they could be working with after they've completed most of their gameplay loop, custom shuttle construction is a substantially more active endeavor. And I know how much people complain about late-game science content just being sitting around at a console and making gamer gear. Roboticists can have a part to play in this too. They can put their mech RCDs to a use other than 2D topdown Fortnite, and with the shuttle database upgrade, they can help interested cyborgs get in on the action. Cargo is yet another department known for having significant amounts of downtime during a considerable number of rounds. If every other department has gone through their initial rounds of departmental orders, and there isn't an active need for cargo to order lots of one thing or another, cargo techs have little to do besides mail (at least on the days where there **is** mail to deliver). Usually, if cargo techs do, in fact, do something as a department when not presented with more pressing duties, they order guns and other contraband. As funny as this is, there's not a lot of variety in how this behavior manifests. With custom shuttles, cargo can use their free time to plan, and execute, a unique collective expression of design sensibilities, not limited by the size and shape constraints of the cargo bay itself. ## Changelog 🆑 Y0SH1_M4S73R (with special thanks to Vect0r, whose original PR inspired the implementation of these changes) add: Shuttle blueprints, the tool used to construct and modify custom shuttles. Print a set at a science, engineering, or cargo techfab after researching Shuttle Engineering, or craft a crude set from the crafting menu. add: Shuttle blueprint database upgrade for engineering cyborgs, printable from the Exosuit Fabricator after researching Shuttle Engineering. A version of shuttle blueprints designed for use by cyborgs. add: Shuttle frame rods, usable to construct custom shuttles. Hand-craft by using 5 rods on 1 titanium sheet, or by printing them at a science, engineering, or cargo techfab after researching Shuttle Engineering. add: Custom shuttle flight control and navigation boards, printable from a science, engineering, or cargo techfab after researching Shuttle Engineering. add: Shuttle engine boards can be printed from a science, engineering, or cargo techfab after researching shuttle engineering. add: The shuttle engine supply pack is no longer locked behind the purchase of the Build Your Own Shuttle kit. add: Shuttle Construction Starter Kit goodie pack, containing a set of shuttle blueprints, flight control and navigation console boards, and two engine boards, can be purchased from cargo for 1200 credits. Requires aux base access to purchase. refactor: Shuttles now keep track of what areas are underneath each of their individual turfs, so that the areas left behind on movement are consistent with what they were beforehand. refactor: Shuttle ceilings now place themselves down as baseturfs, instead of only appearing if the turf above is open space. /🆑 --------- Co-authored-by: vect0r <71346830+Vect0r2@users.noreply.github.com> Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com> |
||
|
|
53248581a3 |
Traitor Reputation does not scale with population & reintroduces population locked items (#89617)
## About The Pull Request Closes #89617 Prior to progression traitor some items were only available with a minimum number of (normally 25) players in the round. These items were: - The dual esword - Noslip shoes - The ebow - Holoparasite - Sleeping Carp - Contractor Kit - Maybe a couple of others that I forgot to write down When we moved to a progression system this concept was merged with reputation; under 20 players your reputation would advance more slowly thus making these "dangerous" items less obtainable and also serving as a sort of scaling factor on rewards (with fewer players the secondary objectives are easier to complete, so the reward is commesurately lower). Now that we have removed secondary objectives this doesn't really make sense any more, so now reputation simply advances at a rate of one second per second all the time, but that leaves the old population locks in question. So... I just recoded items that are only available when there are enough players   (This iconography simply vanishes once the pop level is reached). Note that this is based on "players who have joined" (roundstart + latejoin), not "players who are online" or "players who are alive". Once an item becomes available it will never stop being available, but it only becomes available based on people who are playing and not watching. Currently the only items I applied this to (with a value of 20 players) are: - Dual esword - Sleeping Carp - Spider Extract (the spider antagonist usually requires like 27 players) - Romerol It isn't applied to anything else. ## Why It's Good For The Game Reputation isn't really a tool used to designate how dangerous an item is any more (if it ever was) and resultingly it doesn't make any sense to slow its gain based on population. Some items though we maybe still don't want to show up in a "low pop" round because they'll create an overall unsatisfying experience, so we should be able to remove those items from play. ## Changelog 🆑 balance: Traitor reputation now advances at a fixed rate, not dependent on current server population. balance: The dual esword, sleeping carp scroll, spider extract, and romerol vial cannot be purchased if fewer than 20 players have joined the game. /🆑 |
||
|
|
95081b7acd |
Adds a Config for Auto-Deadminning on Ready Up and Latejoining (#89522)
## About The Pull Request Fixes #89458 Adds a config for auto-deadminning admins who ready up before the round starts, or click join game after. The deadminning happens as soon as the button is pressed, not when a job is selected or the round starts. I figure it's better to do it straight away since both have opportunities for metainfo to be posted in admin chat. Before there's admins messing with dynamic config / plotting events etc. and during the round there's basically everything that gets posted to admin logs. I've had to add a typecheck to the auto_deadmin proc, since the lobby menu technically happens on the centcom Z-level, and there's a pref for ignoring deadminning on centcom Z, so it checks to see if the admin is a new player mob. Changed the old config from auto_deadmin_player to auto_deadmin_always to make it less deceptive. Was suggested a pref could be added to do this. I can do that if people want it maybe, but it's not in this PR at the time of posting it. Is now a pref <img src="https://i.ibb.co/211sBMYd/Deadmin-Prefs1.png"> <img src="https://i.ibb.co/r20Srbw4/Deadmin-Prefs2.png"> I dunno if the latejoin proccall is in the right spot in the click sequence thing I can move it if people want. ## Why It's Good For The Game Admins spawning themselves on station is very important for both shenanigans and troubleshooting. It's annoying to have to click readmin every time and I'm too lazy to figure out how to perms escalate my way into disabling that config every round (Though I have tried). This PR is marginally more likely to convince Timber to turn that off than cussing him out in adminbus. ## Changelog 🆑 admin: Added a new config to force admins to deadmin when readying up or latejoining the round. /🆑 |
||
|
|
948da7e2ed |
[NO GBP] Fixes mapvotes spontaneously failing (#89514)
## About The Pull Request I messed up caching ## Changelog 🆑 fix: Fixed mapvotes spontaneously failing /🆑 |
||
|
|
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 /🆑 |
||
|
|
871dae7d19 |
Automated Announcement System refactor (#89276)
I standardized stuff in AASs code, and all current reference to it. Also added interactions for bounty cubes, weather reports and request consoles, all of it can be changed from AASs UI. Also it's easier now to add new config entries for AAS to proceed, and it's now downstream friendly. Well, because kind of order in code and because it's funny to make custom messages for... Almost everything? BTW any entry can be blocked from ingame changes, by default you can't change Broken Arrival shuttle and Security Officer arrival announcements, how it was before. But may be we should allow it - it's an open question. 🆑 add: Many things now handles via AAS: Bounty Cubes, Request Consoles, Brig Cells, Vending Machines and Orion Trails alerts, Weather Reports, Cargo Order Console code: Now anyone can make their own entry for AAS refactor: AAS internals, also cleanup /🆑 |
||
|
|
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. /🆑 |
||
|
|
629ec38e4e |
Fixes map votes not refreshing the amount of possible choices (#89404)
## About The Pull Request Closes #89235 ## Changelog 🆑 fix: Fixed map votes not refreshing the amount of possible choices /🆑 --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> |
||
|
|
0379638cb6 |
Support sending channel announcements to multiple channel tags (#89462)
previous system was weird, you had to add a comma separated list in the channel tag in TGS itself. this is much more intuitive. also it should not break older configs 🆑 config: Added support for multiple chat channel configs for channel announcements. /🆑 |
||
|
|
b6a11fd070 |
reduces the volume of the ghost polling sound (#89480)
## Why It's Good For The Game it's still too loud. grungus' pr is closed for now so here's this. ## Changelog 🆑 sound: The ghost poll sound is quieter. /🆑 |
||
|
|
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. /🆑 |
||
|
|
040e691c9e |
Fix annoying runtime in station trait (#89425)
## About The Pull Request For some reason I was getting this station trait a lot while testing and it would runtime on my usual setup where I spawn myself in from observer, because there were no bank accounts in existence. This won't have any particular impact on a real round because you are probably not getting a real round with no bank accounts. ## Changelog Not player facing |
||
|
|
85ce60b0eb |
Fixes flipped detectives id's assignment (#89388)
## About The Pull Request Fixes this  And fixes a runtime  ## Why It's Good For The Game People can recognize the detective beacuse of this, so i wanted to fix it Fixes are goooood!! ## Changelog 🆑 Rengan fix: When you cast examine to the disguised detective, its assignment will now display correctly. /🆑 |
||
|
|
9dbfbbd0cc |
Fixes broken drone UI on 516 (#89938)
## About The Pull Request Ironically enough, not a 516 issue but rather a fuckup on our part revealed by a 516 plane switch. Also adjusted the warning, as 516 is outside of beta and we're (supposed to) have almost complete support at this point. Closes #89877 ## Changelog 🆑 fix: Fixes black vision for dextrous mobs using 516 version of BYOND /🆑 --------- Co-authored-by: Lucy <lucy@absolucy.moe> |
||
|
|
ef3188942e |
Version 515 warning message (#3269)
## About The Pull Request Changes the warning message to inform that 515 isn't supported. |
||
|
|
a69b931781 |
Disease outbreak incident display (#3148)
## About The Pull Request Adds a disease outbreak counter for medbay.  ## Why It's Good For The Game More amusing counters the better. More useful in medbay than the delam counter. ## Changelog 🆑 LT3 add: Added disease outbreak incident display /🆑 |
||
|
|
32d7e9f129 |
Remove 516 beta message (#3264)
## About The Pull Request Removes the 516 beta warning, since we now require 516. ## Proof Of Testing <details> <summary>Screenshots/Videos</summary>  </details> |
||
|
|
f6ccd9fa5d |
It's now possible to take trophy fish from previous rounds off the mount (based on RNG). (#89439)
## About The Pull Request Instead of immediately dusting, there's now a chance, depending on size and weight (lower is better) as well as the fishing skill of who tries to remove it (higher is better). At no skill (or if the fish is removed indirectly), the odds of it not dusting can be as low as about 3~4% (BIG FISH) and as high as 50% (tiny feesh), while each level in the skill provides an additional 4% to the roll, up to a bonus 28% (legendary level). As always, regardless of RNG, the fish won't be removed from the persistence system if removed from the trophy mount, and only if replaced. This PR also allows trophy fish to retain traits between rounds, but keep in mind the fish starts dead and may have to be revived first. Also trying to sell it will yield a pitiful 1/20 of its theorical export value, much like for fish from fish cases. ## Why It's Good For The Game The persistent trophy fish mount at the bar seems to fare fairly well without outstanding issues so far, so maybe I should let people get their hands on rare and valuable fish from previous rounds, and give players some more practical reasons to place a fish on the mount for future rounds. As long as people don't start beelining the trophy mount by the bar on regular basis. ## Changelog 🆑 balance: It's now possible to take trophy fish from previous shifts off their mounts without turning them into dust based on a probability revolving around the size and weight of the fish against your fishing skill. /🆑 |
||
|
|
547a154288 |
Nukes now delete themselves, rather than having SSticker do it through a callback (#89752)
## About The Pull Request The title pretty much says it all. I'm told that this was done because, previously, the station would be exploded by the nuclear device - but when that was removed, all that remained was `qdel(bomb)`. That said, there's some bizarre stuff behind what pushed me to make this PR. See below if you want to know. <details><summary>Bizarre stuff</summary> For some reason, while trying to port <https://github.com/tgstation/tgstation/pull/77868> over to Monkestation, I started getting hard-deletes for the nuclear bomb used in the `nuke_cinematic` unit test. ``` ## REF SEARCH Beginning search for references to a /obj/machinery/nuclearbomb/syndicate. ## REF SEARCH Refcount for /obj/machinery/nuclearbomb/syndicate: 7 ## REF SEARCH Finished searching globals ## REF SEARCH Finished searching native globals ## REF SEARCH Finished searching atoms ## REF SEARCH Found /obj/machinery/nuclearbomb/syndicate [0x201f850] in list Datums -> /datum/controller/subsystem/garbage [0x2100001c] -> queues (list) -> /list (list) -> /list (list). ## REF SEARCH Found /obj/machinery/nuclearbomb/syndicate [0x201f850] in list Datums -> /datum/callback [0x21057da8] (obj: Ticker proc: station_explosion_detonation args: ["the nuclear fission explosive"] user: null) -> arguments (list). ## REF SEARCH Finished searching datums ## REF SEARCH Finished searching clients ## REF SEARCH Completed search for references to a /obj/machinery/nuclearbomb/syndicate. ## TESTING: GC: -- [0x201f850] | /obj/machinery/nuclearbomb/syndicate was unable to be GC'd -- (ref count of 3) Error: /obj/machinery/nuclearbomb/syndicate hard deleted 1 times out of a total del count of 3 FAILURE #1: /obj/machinery/nuclearbomb/syndicate hard deleted 1 times out of a total del count of 3 at code/modules/unit_tests/create_and_destroy.dm:99 Error: FAIL /datum/unit_test/create_and_destroy 308.1s ``` This hard-del would happen on every integration test, no matter the map and no matter the byond version. I was even able to have it happen locally. Thing is, Monkestation only seems to have two differences in our code for actually exploding a nuke: 1. We mark some z-levels as safe from the nuclear bomb (so you can go to the lowest reaches of icebox and be safe from the bomb). This only modifies the list of z-levels to call the "gib everyone on z" code for. 2. We don't have tgstation/tgstation#75967 ported over - but making a new branch and cherry-picking both 77868 and 75967 didn't seem to fix the issue either. So something with how the callback is handled by the `play_cutscene` global proc is preventing this from being qdel'd properly - resulting in a hard-delete over five minutes after the nuke cinematic plays. I tried several things to understand why the callback was causing a hard-del, but only one gave me any tangible info - changing the reference to the bomb, into a weakref reference, which stopped the hard-del. However, I eventually realized the callback was entirely pointless - right now, all it does is qdel the bomb. So I just moved it from a callback to part of the `really_actually_explode()` proc. </details> ## Why It's Good For The Game I'd say it fixes a hard-delete, but that hard-delete was only happening on Monkestation. So I guess it removes a bit of unnecessary indirection? ## Changelog :cl:MichiRecRoom fix: Nukes will now always be deleted upon exploding, no matter if they have a valid cutscene to play. /🆑 |
||
|
|
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 /🆑 |
||
|
|
7a5aecf825 |
Fix April Fools and Roundend title music (#89741)
## About The Pull Request 1. April Fools set the lobby music, but order of operations says holidays might be initialized before ticker. So we need to ensure it won't get overridden. 2. Lobby music pref was changed from a toggle to a number, but the proc already passed the number as an argument, so the arg did nothing. Now it'll (properly) play at half volume during end-of-round. 3. When using default repo lobby music, it will not play the same music after two rounds (as it does with configured lobby music) ## Changelog 🆑 Melbert fix: Roundend title music will play at half volume again fix: April Fools lobby music will correctly always be clown music fix: Lobby Music will repeat across sequential rounds less often /🆑 |
||
|
|
99869cef92 |
You can transplant xenomorph tails onto people (#89618)
## About The Pull Request This PR allows you to extract tail organs from xenomorphs and surgically attach xenomorph tails to people. (Despite being a carbon the xenomorph sprite is not built out of component overlays so this technically does not remove the tail from its corpse sorry). Having a xenomorph tail makes you better at tackling, changes your tackle verb to "pounce" like if you are a felinid, and also gives you the parkour benefits of the Freerunning quirk.  You can also surgically attach a xenomorph _queen_'s tail to someone. This arguably is a bad idea because it makes you slower (it's much too heavy) but it does give you access to the queen's tail spin attack (after which you will fall over if you aren't inhumanly strong). Also more importantly, it is comically large. ## Why It's Good For The Game Look I'm racking my brain but this one really mostly comes down to "it's funny to do this". But let's pretend that it also increases the depth and complexity of the sandbox and promotes interesting interactions between crewmembers or something like that. Ideally sometimes in the future we will either decide that xenomorphs are not carbons (is it purely because they have organs?) or decide that they _are_ carbons and build them accordingly. In the latter case this will have been a useful addition. ## Changelog 🆑 add: You can transplant xenomorph tails onto people. /🆑 |