mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 19:22:20 +00:00
c080b83c41c5a6fb30eb519449e8365200b51ee4
182 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
750ca9d2ec | Two as anything greps (and some other cleanup) (#92974) | ||
|
|
0bd054538a |
follow up fix for #92508 (#92571)
## About The Pull Request This is a follow up patch for #92508, otherwise than said in coderbus, calling the cleanup too early can lead to bad assets. We'll now keep track of the count of assets in generation and only clean up after they all have passed the generation. <img width="3067" height="455" alt="grafik" src="https://github.com/user-attachments/assets/0b65acf3-464f-436c-8a60-84c9472be6cd" /> ## Why It's Good For The Game ## Changelog There should be nothing player facing here as the asset job fails straight up if the cache was cleared too early. |
||
|
|
8cd44d26c6 |
fix asset loading subsystem (#92508)
## About The Pull Request The entire asset loading had multiple issues. Firstly, we could hit a tick check after an asset was generated and didn't remove the index, leading to the asset being generated twice. Secondly, we had the issue that the icon forge batching uses UNTIL to wait until generation finishes. This led to the situation that the entire subsystem fire proc was paused outside of the internal tick check pause. ## Why It's Good For The Game Especially on larger sprite sheets or when there're many to be generated this led to the situation that we looked up a rust job multiple times: `[2025-08-08T18:42:11] Runtime in code/modules/asset_cache/iconforge/batched_spritesheet.dm,200: Spritesheet design UNKNOWN ERROR: NO SUCH JOB` ## Changelog No player facing changes. |
||
|
|
23816b8ef2 |
Bumps rust_g to 4.0.0 / IconForge Improvements (#92333)
|
||
|
|
7ecbcba03d |
Fix the dozen or so lingering spritesheet errors caused by GAGS map icons (#91469)
## About The Pull Request It turns out this additional code is not only not needed but actually breaks the spritesheet because the whole point is icon and icon_state are set to the generated icon that you use in stuff like spritesheets. Testing this change made all the errors go away and the proper icons appear in the crafting menu ## Why It's Good For The Game Bug fix ## Changelog 🆑 fix: fixed broken GAGS icons in the crafting menu /🆑 |
||
|
|
4250ecb14c |
Removes a couple of duplicate gag map_icons + fixes the gags_recolorable component + most lootpanel gags previews (#91341)
## About The Pull Request Turns out there were a couple of black mask subtypes that I missed as well as a prisoner uniform subtype. Also fixes some bugs that are not related to the map icon pr to further improve the situation with GAGS previews. ## Why It's Good For The Game Smaller .dmis, working previews ## Changelog 🆑 fix: spraycan can now be used to recolor the gi, glow shoes, striped dress, H.E.C.K. suit fix: most GAGS items should now be showing up in the lootpanel again /🆑 |
||
|
|
9db2f6916b |
Sets prettier to run on the repo (#91379)
## About The Pull Request Prettier (an auto formatter) is set to only run within the tgui folder currently. This removes that limitation, allowing it to automatically format all supported files in the repo (.js, .html, .yml [etc](https://prettier.io/docs/)) I made a few exceptions for bundled and generated files ## Why It's Good For The Game I'm of the opinion that code should look uniform and am lazy enough to want CTRL-S to format files without having to think beyond that ## Changelog |
||
|
|
cb51a652a9 |
Adds automatic GAGS icon generation for mapping and the loadout menu (#90940)
## About The Pull Request Revival of https://github.com/tgstation/tgstation/pull/86482, which is even more doable now that we have rustg iconforge generation. What this PR does: - Sets up every single GAGS icon in the game to have their own preview icon autogenerated during compile. This is configurable to not run during live. The icons are created in `icons/map_icons/..` - This also has the side effect of providing accurate GAGS icons for things like the loadout menu. No more having to create your own previews.  <details><summary>Mappers rejoice!</summary>   </details> <details><summary>Uses iconforge so it does not take up much time during init</summary>  </details> --- ### Copied from https://github.com/tgstation/tgstation/pull/86482 as this still applies: Note for Spriters: After you've assigned the correct values to vars, you must run the game through init on your local machine and commit the changes to the map icon dmi files. Unit tests should catch all cases of forgetting to assign the correct vars, or not running through init. Note for Server Operators: In order to not generate these icons on live I've added a new config entry which should be disabled on live called GENERATE_ASSETS_IN_INIT in the config.txt ## Why It's Good For The Game No more error icons in SDMM and loadout. ## Changelog 🆑 refactor: preview icons for greyscale items are now automatically generated, meaning you can see GAGS as they actually appear ingame while mapping or viewing the loadout menu. /🆑 --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> |
||
|
|
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 /🆑 |
||
|
|
8c6062e948 |
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. /🆑 |
||
|
|
0ab9b55a1f |
RTD Icon Improvements (#89491)
## About The Pull Request RTDs try to use tile item icons instead of turf icons for code that was clearly intended to work with turfs themselves (they support combination dirs, but none of the items actually have these!) They also recreate datums with static data *every single time* you select a new tile in *each individual RTD*. They now make much smarter use of this data and quit storing stuff inside temporary datums that get deleted every time you select something else. FYI this thing is still pretty busted but I don't have time to fix every problem with it. I'm mainly doing this to get rid of the Turn() procs and broken, nonexistent dirs being inserted into the spritesheet for #89478. ## Why It's Good For The Game Code improvements, better previews of the turfs you're going to get in the RTD.  ## Changelog 🆑 tweak: RTDs now show the icon of the actual turf being placed rather than its tile item. /🆑 |
||
|
|
0d3c813c67 |
[NO GBP] Fix-up a line I missed during refactoring in my icon_exists optimization PR (#89374)
## About The Pull Request While porting https://github.com/tgstation/tgstation/pull/89357 over to monkestation, I found that I missed refactoring a couple lines in `code\modules\asset_cache\assets\vending.dm`. This PR fixes that. The changed code is all behind `if (PERFORM_ALL_TESTS(focus_only/invalid_vending_machine_icon_states))`. This means the changed code will only be executed if unit tests are enabled *and* `invalid_vending_machine_icon_states` is a test that will be run. Despite that, I feel this code may be marginally faster, as the use of `icon_states()` is now behind `!icon_exists()`. ## Why It's Good For The Game Gotta go ever so slightly faster. |
||
|
|
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> |
||
|
|
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. |
||
|
|
4437bb5ebf |
Check icon state existence in spritesheet insert (#86959)
## About The Pull Request Adds a check for icon state existence in spritesheet insert, run during unit tests. ## Why It's Good For The Game Inserting a nonexistent icon state via `Insert()` will corrupt the spritesheet it's inserted to, resulting in offsets being incorrect—specifically, it results in the entire icon's contents being inserted. This happened downstream on Doppler Shift and broke language icons. I fixed the issue there but figured that there should be a check upstream for it. `if (!I || !length(icon_states(I))) // that direction or state doesn't exist)` This check doesn't catch it, by the way. Since it returns the entire icon file, `length(icon_states(I))` is >0. You could do `length(icon_states) != 1`, but then it still wouldn't catch cases where there's a single-icon-state icon *and* the icon_state is invalid. Boo. A test like this is the best option. I tried using the rust-g variant of icon_states and sort-of got it working, but I figured it'd be too fragile to justify given that it doesn't accept actual icon instances, only paths. |
||
|
|
d4ac95a0e1 |
Nobody expects the span inquisition: replaces most <span>s with macros (#86798)
## About The Pull Request 123 changed files and multiple crashes after writing broken regex, I replaced most remains of direct spans with macros. This cleans up the code and makes it easier to work with in general, see justification for the original PR. I also fixed a bunch of broken and/or unclosed spans here too. I intentionally avoided replacing spans with multiple classes (in most cases) and spans in the middle of strings as it would impact readability (in my opinion at least) and could be done later if required. ## Why It's Good For The Game Cleaner code, actually using our macros, fixes borked HTML in some places. See original PR. ## Changelog Nothing player-facing |
||
|
|
69176298ed |
Spelling Fixes (#86056)
## About The Pull Request Fixes several errors to spelling, grammar, and punctuation. ## Why It's Good For The Game Improves readability and user experience. ## Changelog 🆑 spellcheck: fixed a few typos /🆑 |
||
|
|
9a9b428b61 |
Wallening Revert [MDB Ignore][IDB Ignore] (#86161)
This PR is reverting the wallening by reverting everything up to
|
||
|
|
fec946e9c0 |
/Icon/ Folder cleansing crusade part, I think 4; post-wallening clean-up. (#85823)
Hello everybuddy, your number three rated coder-failure here to clean up some mess. This PR accomplishes some of the more major structural clean up changes I wanted to do with /obj/ folder, but decided to wait on until wallening gets merged, and so, time has come. Several things to still be done, although I know these cleaning PR's are quite a load, so will wait for this one to get done with first. ## Why It's Good For The Game Saner spriters, better sprites, less annoyance. Also deleted a whole load of redundancy this time around, a lot of sprites which existed simultaniously in two places now got exit their quantum superposition. |
||
|
|
4b4e9dff1d |
Wallening [IDB IGNORE] [MDB IGNORE] (#85491)
## What's going on here Kept you waitin huh! This pr resprites most all walls, windows and other "wall adjacent" things to a 3/4th perspective, technical term is "tall" walls (we are very smart). If you're trying to understand the technical details here, much of the "rendering tech" is built off the idea of split-vis. Basically, split a sprite up and render it on adjacent turfs, to prevent seeing "through" walls/doors, and to support seeing "edges" without actually seeing the atom itself. Most of the rest of it is pipelining done to accommodate how icons are cut. ## Path To Merge Almost* all sprites and code is done at this point. There are some things missing both on and off the bounty list, but that will be the case forever unless we force upstream (you guys) to stop adding new shit that doesn't fit the style. I plan on accepting and integrating prs to the current working repo <https://github.com/wall-nerds/wallening> up until a merge, to make contribution simpler and allow things like bounties to close out more easily This pr is quite bulky, even stripping away map changes it's maybe 7000 LOC (We have a few maps that were modified with UpdatePaths, I am also tentatively pring our test map, for future use.) This may inhibit proper review, although that is part of why I am willing to make it despite my perfectionism. Apologies in advance. Due to the perspective shift, a lot of mapping work is going to need to be done at some point. This comes in varying levels of priority. Many wallmounts are offset by hand, some are stuck in the wall/basically cannot be placed on the east/west/north edges of walls (posters), some just don't look great good in their current position. Tests are currently a minor bit yorked, I thought it was more important to get this up then to clean them fully. ## What does it look like?       ## Credits <details> <summary>Historical Mumbojumbo</summary> I am gonna do my best to document how this project came to be. I am operating off third party info and half remembered details, so if I'm wrong please yell at me. This project started sometime in late 2020, as a product of Rohesie trying to integrate and make easier work from Mojave Sun (A recently defunct fallout server) with /tg/. Mojave Sun (Apparently this was LITERALLY JUST infrared baron, that man is insane) was working with tall walls, IE walls that are 48px tall instead of the normal 32. This was I THINK done based off a technical prototype from aao7 proving A it was possible and B it didn't look like dogwater. This alongside oranges begging the art team for 3/4th walls (he meant TGMC style) lead to Rohesie bringing on contributors from general /tg/, including actionninja who would eventually take over as technical lead and Kryson, who would define /tg/'s version of the artstyle. Much of the formative aspects of this project are their work. The project was coming along pretty well for a few months, but ran into serious technical issues with `SIDE_MAP`, a byond map_format that allows for simpler 3/4th rendering. Due to BULLSHIT I will not detail here, the map format caused issues both at random with flickering and heavily with multiz. Concurrent with this, action stepped down after hacking out the rendering tech and starting work on an icon cutter that would allow for simpler icon generation, leaving ninjanomnom to manage the project. Some time passed, and the project stalled out due to the technical issues. Eventually I built a test case for the issues we had with `SIDE_MAP` and convinced lummox jr (byond's developer) to explain how the fuckin thing actually worked. This understanding made the project theoretically possible, but did not resolve the problems with multi-z. Resolving those required a full rework of how rendering like, worked. I (alongside tattle) took over project development from ninjanomnom at this time, and started work on Plane Cube (#69115), which when finished would finally make the project technically feasible. The time between then and now has been slow, progressive work. Many many artists and technical folks have dumped their time into this (as you can see from the credits). I will get into this more below but I would like to explicitly thank (in no particular order) tattle, draco, arcanemusic, actionninja, imaginos, viro and kylerace for keeping the project alive in this time period. I would have curled up into a ball and died if I had to do this all myself, your help has been indispensable. </details> <details> <summary>Detailed Credits</summary> Deep apologies if I have forgotten someone (I am sure I have, if someone is you please contact me). I've done my best to collate from the git log/my memory. Thanks to (In no particular order): Raccoff: Being funny to bully, creating threshold decals for airlocks aa07: (I think) inspiring the project ActionNinja: Laying the technical rock we build off, supporting me despite byond trying to kill him, building the icon cutter that makes this possible ArcaneMusic: Artistic and technical work spanning from the project's start to literally today, being a constant of motivation and positivity. I can't list all the stuff he's done Armhulen: Key rendering work (he's the reason thindows render right), an upbeat personality and a kick in the ass. Love you arm Azlan: Damn cool sprites, consistently Ben10Omintrix: You know ben showed up just to make basic mobs work, he's just fuckin like that man BigBimmer: A large amount of bounty work, alongside just like, throwing shit around. An absolute joy to work with Capsandi: Plaques, blastdoors, artistic work early on CapybaraExtravagante: Rendering work on wall frames Draco: SO MUCH STUFF. Much of the spritework done over the past two years is his, constantly engaged and will take on anything. I would have given up if not for you Floyd: Early rendering work, so early I don't even know the details. Enjoy freedom brother Imaginos16: A guiding hand through the middle years, handled much of the sprite review and contribution for a good bit there Iamgoofball: A dedication to detail and aesthetic goals, spends a lot of effort dissecting feedback with a focus on making things as good as they can be at the jump Infrared: Part of the impetus for the project, made all the xenomorph stuff in the MS style Jacquerel: A bunch of little upkeep/technical things, has done so much sprite gruntwork (WHY ARE THERE SO MANY PAINTING TYPES) Justice12354: Solved a bunch of error sprites (and worked out how to actually make prs to the project) Thanks bro! Kryson: Built the artstyle of the project, carrying on for years even when it was technically dying, only stopping to casually beat cancer. So much of our style and art is Kryson KylerAce: Handled annoying technical stuff for me, built window frame logic and fully got rid of grilles. LemonInTheDark: Rendering dirtywork, project management and just so much fucking time in dreammaker editing sprites Meyhazah: Table buttons, brass windows and alll the old style doors Mothblocks: Has provided constant support, gave me a deadline and motivation, erased worries about "it not being done", gave just SO much money to fill in the critical holes in sprites. Thanks moth MTandi: Contributed art despite his own blackjack and hookers club opening right down the road, I'm sorry I rolled over some of your sprites man I wish we had finished earlier Ninjanomnomnom: Consulted on gags issues, kept things alive through some truly shit times oranges: This is his fault Rohesie: Organized the effort, did much of the initial like, proof of concept stuff. I hope you're doin well whatever you're up to. san7890: Consulting on mapper UX/design problems, being my pet mapper Senefi: Offsetting items with a focus on detail/the more unused canidates SimplyLogan: Detailed map work and mapper feedback, personally very kind even if we end up talking past each other sometimes. Thank you! SpaceSmithers: Just like, random mapping support out of nowhere, and bein a straight up cool dude Tattle: A bunch of misc project management stuff, organizing the discord, managing the test server, dealing with all the mapping bullshit for me, being my backup in case of bus. I know you think you didn't do much but your presence and work have been a great help Thunder12345: Came out of nowhere and just so much of the random bounties, I'm kind of upset about how much we paid him Time-Green: I hooked him in by fucking with stuff he made and now he's just doin shit, thanks for helping out man! Twaticus: Provided artistic feedback and authority for my poor feeble coder brain, believed in the project for YEARS, was a constant source of ❤️ and affirmation unit0016: I have no god damn idea who she is, popped out of nowhere on the github one day and dealt with a bunch of annoying rendering/refactoring. Godspeed random furry thank you for all your effort and issue reports Viro: A bunch of detailed spriting moving towards 3/4ths, both on and off the wallening fork. If anyone believed this project would be done, it was viro Wallem: Artistic review and consultation, was my go-to guy for a long time when the other two spritetainers were inactive Waltermeldon: Cracked out a bunch of rendering work, he's the reason windows look like not dogwater. Alongside floyd and action spent a TON of time speaking to lummox/unearthing how byond rendering worked trying to make this thing happen ZephyrTFA: Added directional airlock helpers, dealt with a big fuckin bugaboo that was living in my brain like it was nothing. Love you brother And finally: The Mojave Sun development team. They provided a testbed for the idea, committed hundreds and hundreds of hours to the artstyle, and were a large reason we caught issues early enough to meaningfully deal with them. Your work is a testament to what longterm effort and deep detailed care produce. I hope you're doing well whatever you're up to. Go out with a bang! </details> ## Changelog 🆑 Raccoff, aa07, ActionNinja, ArcaneMusic, Armhulen, Azlan, Ben10Omintrix, BigBimmer, Capsandi, CapybaraExtravagante, Draco, Floyd, Iamgoofball, Imaginos16, Infrared, Jacquerel, Justice12354, Kryson, KylerAce, LemonInTheDark, Meyhazah, Mothblocks, MTandi, Ninjanomnom, oranges, Rohesie, Runi-c, san7890, Senefi, SimplyLogan, SomeAngryMiner, SpaceSmithers, Tattle, Thunder12345, Time-Green, Twaticus, unit0016, Viro, Waltermeldon, ZephyrTFA with thanks to the Mojave Sun team! add: Resprites or offsets almost all "tall" objects in the game to match a 3/4ths perspective add: Bunch of rendering mumbo jumbo to make said 3/4ths perspective work /🆑 --------- Co-authored-by: Jacquerel <hnevard@gmail.com> Co-authored-by: san7890 <the@san7890.com> Co-authored-by: = <stewartareid@outlook.com> Co-authored-by: Capsandi <dansullycc@gmail.com> Co-authored-by: ArcaneMusic <hero12290@aol.com> Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com> Co-authored-by: SomeAngryMiner <53237389+SomeAngryMiner@users.noreply.github.com> Co-authored-by: KylerAce <kylerlumpkin1@gmail.com> Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com> Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com> Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com> Co-authored-by: Runi-c <5150427+Runi-c@users.noreply.github.com> Co-authored-by: Roryl-c <5150427+Roryl-c@users.noreply.github.com> Co-authored-by: tattle <article.disaster@gmail.com> Co-authored-by: Senefi <20830349+Peliex@users.noreply.github.com> Co-authored-by: Justice <42555530+Justice12354@users.noreply.github.com> Co-authored-by: BluBerry016 <50649185+unit0016@users.noreply.github.com> Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com> Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com> Co-authored-by: Rob Bailey <github@criticalaction.net> Co-authored-by: MMMiracles <lolaccount1@hotmail.com> |
||
|
|
a32c65a263 |
New Uplink UI (#85455)
## About The Pull Request Changes the layout of uplinks, mostly on the Market tab. Made it more compact. Before:  After:  <img width="100%" alt="ARnnJe7Oui" src="https://github.com/user-attachments/assets/fdc846cd-9df8-4009-af3c-4129c161e1cb"> <img width="100%" alt="qKq0kM7YxV" src="https://github.com/user-attachments/assets/e377a36f-4420-44cd-bb8f-34e16cfd804f"> ## Why It's Good For The Game Better UX ## Changelog 🆑 qol: new uplink UI qol: made it possible to buy a custom amount of TC, instead of bundles with fixed amounts /🆑 |
||
|
|
2c0f5d181a |
Datumizes pod types (#85033)
## About The Pull Request Changes supply pods to use datums instead of a massive nested list to store data and index defines as styles. Complete feature parity. ## Why It's Good For The Game this is nightmare fuel to work with  and this is a sin against nature and god   ends up as  which is ??? Using a nested list to store pod data is a very bad idea, it has horrible formatting, is unreadable without having index defines open in a second tab and is not extendable. And as you can see above, if someone added another pod type before 14th everything would break because other pod type lists **__only have 8 elements__** instead of 10 like the seethrough one does. ## Changelog 🆑 refactor: Pod code now uses datums instead of being a huge nested list /🆑 |
||
|
|
cdf238778d | Makes vending use DMIcon where possible, halving the time it takes to make the vending spritesheet (#85085) | ||
|
|
8eb3b51ad9 |
/icons/ folder cleansing crusade part 3 (#83420)
## About The Pull Request In my effort to make the /icons/ folder cleaner and more intuitive instead of having to rely on recalling names of stuff and looking them up in code to find them for poor sods such as myself, plus in spurt of complusion to organize stuff, here goes. I've tracked all changes in commit descriptions. A lot still to be done, but I know these waves go over dozens of files making things slow, so went lighter on it. Destroyed useless impostor files taking up space and cleaned a stray pixel on my way. ## Why It's Good For The Game Cleaner /icons/ file means saner spriters, less time spent. Stray pixels and impostor files (ones which are copies of actually used ones elsewhere) are not good. ## Changelog 🆑 image: Cleaned a single stray pixel in a single frame of a bite telegraphing accidentaly found while re-organizing the files. /🆑 |
||
|
|
e766f921f6 |
Code cleanup: Sorting (#83017)
## About The Pull Request 1. Removes code duplication 2. Fully documents `sortTim()` 3. Makes a define with default sortTim behavior, straight and to the point for 95% of cases 4. Migrates other sorts into the same file 5. Removes some redundancy where they're reassigning a variable using an in place sorter For the record, we only use timSort ## Why It's Good For The Game More documentation, easier to read, uses `length` over `len`, etc Should be no gameplay effect at all |
||
|
|
cf4cc89902 |
Revert of a Revert | ListInputModal (#82854)
This reverts commit
|
||
|
|
d554ab7766 |
RPG Loot: Revisited & READY (#82533)
## About The Pull Request Revival of #72881 A new alt click window with a tarkov-y loading spinner. Replaces the object item window in stat panel. ## Videos <details> <summary>vids</summary> toggleable grouping:  now lists the floor as first obj:  in action:  </details> ## features: - search by name - 515 image generator is much faster than alt click menu - opening a gargantuan amount of items shouldnt freeze your screen - groups similar items together in stacks by default, toggleable - shows tile as first item - <kbd>Shift</kbd> and <kbd>Ctrl</kbd> compatible with LMB 🖱️ - RMB points points at items (sry i could not get MMB working) - key <kbd>Esc</kbd> to exit the window. For devs: - A new image generation tech. - An error refetch mechanic to the Image component - It does not "smart track" the items being added to the pile, just reopen or refresh. This was a design decision. ## Why It's Good For The Game Honestly I just dislike the stat panel Fixes #53824 Fixes  ## Changelog 🆑 add: Added a loot window for alt-clicking tiles. del: Removed the item browser from the stat panel. /🆑 --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> Co-authored-by: AnturK <AnturK@users.noreply.github.com> Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> |
||
|
|
5e9ce5ab99 |
New Battle Arcade (#81810)
## About The Pull Request Remakes Battle Arcade from just about the ground up, with exceptions taken for emagged stuff since I didn't really want to touch its behavior. The Battle Arcade now has stages that players can go through, unlocking a stage by beating 2 enemies and the boss of the previous one, but this must all be done in a row. You can choose to take a break between each battle and there's a good chance you'll sleep just fine but there's also a chance it can go wrong either through an ambush or robbery. The Inn lets you restore everything for 15 gold and you can buy a sword and armor, each level you unlock is a new sword and armor pair you can buy that's better than the last, it's 30 gold each but scales up as you progress through levels. They are really worth getting so it's best to try to not lose your money early in. The battle system is nearly the same as how it was before but I removed the poor combo system that plagued the old arcade as one big knowledge lock, now it's more just turn based. The game is built on permadeath so dying means you restart from the beginning, but if you are going to lose you can try to escape instead which costs you half of your gold. Getting to higher levels increases the difficulty of enemies but also increases the gaming exp rewards which could make this a better way to get exp if you can get good at it. Gaming EXP is used to increase chances of counterattacking but doesn't give any extra health to the player. I also removed the exploit of being able to screwdriver arcade cabinets because people would do that if they thought they were on the verge of losing to bypass the effects of loss. I instead replaced it with a new interaction that the Curator's display case key can be used to reset arcade cabinets (there's several keys on the chain so it made sense to me), which I added solely because I thought Curators would be the type of person to have run an actual arcade. This is some gameplay https://github.com/tgstation/tgstation/assets/53777086/499083f5-75cc-43b5-b457-017a012beede As a misc sidenote, I also split up the arcade file just like how Orion Trail was before, just for neat code organization. The Inn keeper is straight up just a photo of my localhost dude, he's not a player reference or anything it's not my actual character. I also have no idea how well balanced this is cause I suck at it lol. ## Why It's Good For The Game Battle Arcade is one of 3 last machines in my hackmd here to turn into TGUI https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA?view I've always thought the current version of battle arcade is quite lame and lacks any progression, like Orion Trail I thought that since I was moving this to TGUI, it would also be a perfect opportunity to revamp it and try to improve on where it failed before, especially since the alternative (NTOS Arcade) is also lame as hell and is even lamer than HTML battle arcade (spam mana, then spam health, then just spam attack, rinse and repeat). This will hopefully be more entertaining and give players sense that they are getting through a series of tasks rather than doing one same one again and again. ## Changelog 🆑 JohnFulpWillard, Zeek the Rat add: Battle Arcade has been completely overhauled in a new progression system, this time using TGUI. add: The Curator's keys can now reset arcade cabinets. balance: You now need to be literate to play arcade games, except for Mediborg's Amputation Adventure. fix: You can no longer screwdriver emagged arcade consoles. Accept your fate. fix: Silicons can no longer play Mediborg's Amputation Adventure. /🆑 --------- Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> |
||
|
|
0417e090cc |
Removes camera assembly structures (#81656)
## About The Pull Request Removes the camera assembly structure middleman between the camera wallframe and camera machine. All its behavior has been instead moved to the camera, and I've tried to keep as much of the behavior the same as before. This also fixes the issue that camera assemblies had where, upon the construction being finished, it would move itself into the newly finished camera machine, therefore taking itself off a wall, therefore deconstructing itself. This resulted in 2 piece of iron being in each camera machine (except roundstart ones), and because camera machines rely on the assembly inside of them for upgrades and such, upgrading didn't work at all. I've also made camera nets use defines (not in map) so it's easier to find a list of them all, and tried to add autodoc comments to nearly every var in camera code. ## Why It's Good For The Game Removes copy paste and spaghetti code between structure and machine camera, thus making it easier to work around with. Closes https://github.com/tgstation/tgstation/issues/79019 ## Changelog 🆑 fix: Cameras built in-round can be upgraded again. fix: Deconstructing cameras now more consistently return to you the upgrades inside of the camera. fix: RD's telescreen can now properly see Ordnance cameras again. fix: [Deltastation] Library art gallery no longer has an invisible camera. /🆑 --------- Co-authored-by: san7890 <the@san7890.com> |
||
|
|
466b3df048 |
Refactor removing unused defines. (#82115)
## About The Pull Request Refactors a lot of the unused defines. ## Why It's Good For The Game Refactors a lot of the unused defines. ## Changelog Nothing player facing --------- Co-authored-by: san7890 <the@san7890.com> |
||
|
|
a4fc21d275 |
Adds support for different achievement dmis (#81471)
## About The Pull Request I am back to pushing my code improvements upstream, sorry in advance. As the title says, this adds support for achievement icons to be in different dmi files than the default, pretty much the exact same way that Language icons (for chat assets) do. ## Why It's Good For The Game It is one of the few things in game (the only other thing i can think of that does this rn is barsigns) that cannot have their icon changed when trying to make a subtype, this is very limiting and very annoying, especially since dmi conflicts are one of the worst types to deal with, this would make my life a lot easier. ## Changelog No player-facing changes. |
||
|
|
9ddfd4a289 | Moves inter-round caches to cache/. Deletes tmp/ between rounds. Keeps tts from killing servers. (#81433) | ||
|
|
928ee9c770 |
New Telecommunications Monitoring Console UI (#81111)
I've made a new UI for Telecommunications Monitoring Console. New features include: more useful information, search bar, icons and smaller window. This PR also includes a new sprite sheet, be warned! Additionally, I've removed `updateUsrDialog` because it makes no sense here and UI updates are handled by TGUI. |
||
|
|
e73d6f540b | Cache sprite data alongside spritesheets, fixing emotes and a whole lotta other missing images (#80601) | ||
|
|
e4c3c2f7f7 |
General maintenance for chem heater (#80495)
## About The Pull Request
1. Converted UI to typescript
2. Removed all tutorial code(and the icon files it used) Also removes
the reward that came with it. Both were not a big deal to begin with so
you know no one will miss it, In the name of code clean up and reducing
dmi file sizes it serves us better removing them
It did not compile in the new UI

And the text to display is way too clunky to be readable code wise (no
indentation just big raw blobs of unorganized text)
|
||
|
|
723ced5d7b |
Make spritesheets cacheable by default, killing a lot of overtime in the round start spike (#80522)
## About The Pull Request Makes all spritesheets cache by default. This wasn't the case originally because some spritesheets like vending machines relied on in world state, but none of them do anymore because that's whack. Also fixes a bug that would cause half completed caches to break other stuff. This didn't happen in real gameplay, but would've happened if you tried to change cachable on anything while you already had a tmp folder. ## Changelog 🆑 fix: Cut down a significant amount of time that caused the start of rounds to lag. /🆑 |
||
|
|
60ce61b29d |
Track time to queuedInsert in feedback (#80521)
Investigating large lag spikes in round start and noticed a large amount of overtime (3s worth) to queuedInsert. It's vending machines and R&D, but let's keep an eye on this. |
||
|
|
71a1fee2f1 |
Explodes device.dmi (#80025)
## About The Pull Request I woke up today and thought 'what would be easy thing to do today so I can say I've done something?'. Then I remembered I saw several gangtool usages the time I split radio up, and I could remedy those. 7 hours later, device.dmi is split in a folder of its own, and I've also given unique sprites to door remotes and landing desginators. ## Why It's Good For The Game The device.dmi was kind of a mess. ## Changelog 🆑 /🆑 |
||
|
|
96f19b962a |
Removes some done todos (and ones that I think are dumb) (#80017)
## About The Pull Request Most of these are mine that I just forgot about, only one I think anyone cares about is the one in mobs.dm about making delta time match subsystem yielding, but I think it's a bad idea so it's gone Oh also, replaces an old comment of mine with an actual explanation (it's about the icon cache and shit) |
||
|
|
26e3ea1e0d |
Mafia can be played on your PDA (#78576)
## About The Pull Request Mafia is now friggin playable from the PDA, I also changed other stuff too - You can't use abilities on dead people if you're not supposed to (cant kill the same person over and over) - Changelings cant kill other Changelings - Changelings can now only talk to eachother at night, rather than using :j - Everyone starts spawned in the center of the map, since people playing on PDA can't move their characters. This is so everyone can hear PDA users in person, as I don't want the chat log to be mandatory. To do this, all messages you are meant to be able to see, is now logged for you to see in your Mafia panel. This essentially means that people playing through the PDA get a downgraded version of it, but I don't know how much larger I want this UI to be. Playing Mafia through the PDA will not tell you of other players ahead of time when signing up (as it shows ckeys + pdas), but they can see the names in-game. Unfortunately this means we'll have to remove your customization coming with you, to prevent using it to tell who is dead in round. Things I am missing - Program overlays on PDA/Laptop/Computer - Icon for the app's header while a game is active I'm not a spriter and can't make either of these This is the new UI  I also fixed alert calls for PDAs and stuff  and removed the X at the top on computers since they had no battery  Looks a little better now hopefully 👍 ## Why It's Good For The Game - The current Arcade app sucks, and is a solo game. This is much more entertaining and you can talk to others in it, which is swag as fuck. - There's a larger potential playerbase for the Minigame making it more likely to be played. - Sets groundwork for a better version of https://github.com/tgstation/tgstation/pull/75879 - Adds more suspense and teamwork in the minigame. ## Changelog 🆑 JohnFulpWillard, sprites by CoiledLamb add: You can now play Mafia on your PDA. balance: Mafia changelings can now only talk to eachother during the night. fix: Mafia abilities can't be repeatedly used on people. /🆑 |
||
|
|
df508a51b2 |
More Plumbing Fixes & Pill Press UI Changes (#79059)
## About The Pull Request 1. Fixes #79051 It's a consequence of floating-point math. We round it to 2 decimal places to display results like 50 but in fact its actual value is something like 49.999... something. So, we also shift up our expectations and call it a day. 2. Made a lot of variables defines and lists static to save memory for plumbing pill press and moved global lists to it's global list folder 3. Copied over chem master patch & pill designs over too plumbing press and removed the old designs & resized the UI ## Changelog 🆑 fix: plumbing pill press & bottler won't stop when processing 50 unit bottles code: made a lot of variables defines and lists static to save memory for plumbing pill press. Moved global lists to it's rightful place code: copied over chem master pill & patch designs over to plumbing pill press and removed the old designs. resized UI /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
66f726dfe3 |
General code maintenance for rcd devices and their DEFINE file (#78443)
## About The Pull Request The changes made can be best summarized into points **1. Cleans up `code/_DEFINES/construction.dm`** Looking at the top comment of this file |
||
|
|
c2fb08407a |
Microwave upgrades: Microwave PDA charging, power cells (#78717)
## About The Pull Request For the hard-working tradesperson who's in the middle of nowhere and just wants to warm up their pastry-based savoury item purchased from an overpriced vending machine, introduces the engineer themed wireless microwave. No more going hungry in a pinch, this variant uses changeable power cells instead of APC power. Can be built normally or printed with a furnishings-upgraded RCD. The other upgrade now available: PDA charging. Upgrade the capacitors in the microwave to add a Charge mode for your portable device! Also cleans up microwave code a bit and adds much needed context hints for when it's broken, dirty, etc. Swaps a few break room microwaves to upgraded variants on mapload, adds a microwave/donks to Birdshot, donks to Tramstation. ## Why It's Good For The Game Slap together a semi-portable microwave with your components on hand, have an engineering picnic in space or wherever else the day takes you. With increased PDA drain, adding another option to charge your PDA in common areas is useful. Microwaves are already strategically placed around the station. Please ensure the model you're using has the charging feature before operating.   ## Changelog 🆑 LT3 add: Introducing Nanotrasen Wave! A Nanotrasen exclusive, Waveallows your PDA to be charged wirelessly through microwave frequencies. You can Wave-charge your device by placing it inside a compatible microwave and selecting the charge mode. add: Microwaves can be upgraded to add wireless charging add: Cell-swappable microwave for the engineer on-the-go add: Microwave now has a wire to swap charge/cook modes add: Furnishings RCD upgrade now includes wireless microwave add: Tramstation and Birdshot engineering break rooms now have microwave and donk pockets. Some microwaves come pre-equipped with wireless charging and an upgraded cell. fix: The microwave in the snowdin ruin is now real, not a fluff prop /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
da42afcbae |
Reworks the fishing minigame into a game screen object from a TGUI interface (#78052)
Refactors fishing minigame from tgui window to dm screen objects |
||
|
|
635bae421f |
Multi-tile airlock assemblies/pathing [NO GBP] (#77537)
## About The Pull Request Small fixes after https://github.com/tgstation/tgstation/pull/76732 - Creates base large subtype for mapping - Door assembly naming consistent with other airlocks - Base subtype large airlock no longer spawns in a normal sized airlock - Renames station2 subtype to public for consistency ## Changelog 🆑 LT3 fix: Base large airlock subtype no longer spawns a normal sized airlock image: Added mapping icons for large airlocks code: Repathed all public airlocks to consistent naming /🆑 |
||
|
|
2d34c7433a |
New Mech UI and equipment refactor (#77221)
 ## About The Pull Request Made a new UI and refactored some mech code in the process. Fixes #66048 Fixes #77051 Fixes #65958 ??? if it was broken Fixes #73051 - see details below Fixes other undocumented things, see changelog. ## Why It's Good For The Game The UI was too bulky and Mechs were too complex for no reason. Now they follow some general rules shared between other SS13 machinery, and there is less magic happening under the hood. ## Detailed Changes ### New Mech UI, Air Tank and Radio as separate modules Previous UI for comparison: <img alt="9SScrXAOjy" src="https://github.com/tgstation/tgstation/assets/3625094/904e3d07-e7d7-4d3a-a062-93e0e35b4b66"> Previously mechs came with radio pre-installed and air canisters magically pre-filled with air even when you build one in fab. Radio and Air Tanks are now both utility modules that are optional to install. Gas RCS thrusters still require Air Tank module to operate. This made the Mechs more barebones when built, giving you only the basic functionality. <img alt="5SDMlXTJxv" src="https://github.com/tgstation/tgstation/assets/3625094/b9364230-49ac-416b-aa70-e851fbf2050e"> To compensate this change, all mechs got two extra utility module slots. All other modules got new UI. And ore box now shows the list of ores inside. <img alt="SRX5FjvsHA" src="https://github.com/tgstation/tgstation/assets/3625094/cbe2e98d-1cd4-4667-8dae-2f9227b4b265"> ### Mounted Radio Works as a normal radio, but with subspace transmission. Available from the basic mech research node and can be printed in fab. ### Cabin Sealing To compensate for the lack of air tank by default, mechs with enclosed cabin (e.g. all except Ripley) got an ability to toggle cabin exposure to the outside air. Exiting the mech makes cabin air automatically exposed. When you seal the cabin, it traps some of the outside air inside the cabin and you can breathe with this air to perform a short space trips. But the oxygen will run out quickly and CO2 will build up. Sealing the cabin in space will make the cabin filled with vacuum, and it will stay there until you return to air environment and unseal the cabin, letting the breathable air to enter. There are temperature and pressure sensors that turn yellow/red when the corresponding warning thresholds are reached. You could also use personal internals in combination with cabin sealing for long space travels, so Air Tank is completely optional now and mostly needed when you need RCS thruster. ### RCS thrusters They are now available earlier in tech tree and consume reasonable amount of air (5 times more than human jetpacks), and they don't work without Mounted Air Tank, unless it's an Ion thruster variant. ### Mounted Air Tank Available from the basic mech research node and can be printed in fab. Built model comes empty, and syndicate mechs come with one full of oxygen. <img alt="GrFDrH5Hwe" src="https://github.com/tgstation/tgstation/assets/3625094/b677b705-bda0-4c8c-96c7-d32bf7bf9f28"> Can be switched to pressurize or not pressurize the cabin. Releases gas only when the cabin is sealed shut. Starts releasing automatically, but can be toggled to not release if you want to use it just as a portable canister. Cabin pressure can now be configured in the module UI instead of Maintenance UI. Can be attached to a pipe network when the mech is parked above a connection port. Comes with a pump that works similarly to the portable pump. It lets you vent the air tank contents outside, or suck air from the room to fill the air tank. Intended to provide an ability to fill the air tank without the need to bother with pipes. Also has gas sensors that display gas mix data of the tank and the cabin (when sealed). ### Stock part changes All mechs now require a servo motor and they reduce mech movement power consumption instead of scanning module. Scanning modules are optional for mech operation (still required to build) and the lack of one disables the following UI elements: - Display of mech integrity (you can still see the alerts or examine the mech to get rough idea) - Display of mech status on internal damage (and you can't repair what you can't diagnose) The rating of scanning module doesn't have any effect as of now. Cargo mech comes without it roundstart. <img alt="2vDtt99oqb" src="https://github.com/tgstation/tgstation/assets/3625094/147144ca-824e-4501-acf5-6ee104f309e7"> Capacitors now also reduce light power usage and raise the overclocking temperature thresholds (see below). ### Maintenance Maintenance UI removed, and its logic migrated to other places. Access modification now managed inside the mech, and anyone who can control the mech, can adjust the access in the same way as they can set DNA key. To open the maintenance panel you just need a screwdriver. It is instant when the mech is empty and it has a 5 second delay when there is an occupant to avoid in-combat hacking and part removal. It will alert the occupant that someone is trying to tinker with their mech.  Once the panel is open, you can see the part ratings:  With open panel you can hack the mech wires (roboticists can now see them): <img alt="mj205G2qDa" src="https://github.com/tgstation/tgstation/assets/3625094/44cea0d1-44b4-4b50-b1d3-a97c0056bab3"> There are wires for: - Enabling/Disabling ID and DNA locks - Toggling mech lights - Toggling mech circuits malfunction (battery drain, sparks) - Toggling mech equipment malfunction (to repair after EMP or cause EMP-like effect, disarming mech) - 3 dud wires that do nothing The hacker may be shocked if the mech power cell allows. When the panel is open and the user has access to the mech, they can remove parts with a crowbar: <img alt="jR40gyTWtJ" src="https://github.com/tgstation/tgstation/assets/3625094/b573f5b9-b8ea-412e-b3e0-c872e01e0c23"> Hitting the mech with an ID from outside now toggles the ID Lock on/off if the ID has sufficient access. ### Power consumption and overclocking Rebalanced mech power consumption. T4 parts were not working in Syndicate Mechs, as their effect was not calculated until you manipulate parts manually. Constructed mechs with t1 parts even had their energy drain reduced with upgrade to t1. Now all mechs apply their base step power usage correctly don't ignore the stock parts. Servo tier now reduces base power consumption by 0% at t1, 50% at t2, 33% at t3 and 25% at t4 Capacitor tier now reduces base power consumption of mele attacks, phasing and light by the same amounts. Gygax leg actuators overload replaced with mech overclocking. Any mech can be overclocked by hacking wires, but only Gygax has a button for toggling it from the Cabin. Now there is an overclock coefficient. 1.5 for Gygax and other mechs, 2 for Dark Gygax. When overclocked, mechs moves N times faster, but consumes N times more power.  While overclocked, mech heats up every second, regardless of movement, and starts receiving internal and integrity damage after a certain temperature threshold. The chance is 0% at the threshold, and 100% at thresholds * 2. The roll happens every tick. Capacitor upgrades this threshold, letting you overclock safely for longer periods.  When you stop overclock, the temperature goes back down. ### Other changes and fixes Concealed weapon bay now doesn't show up when you examine the mech, so it's actually concealed now. New radio module can properly change its frequency, as it didn't work for previous radio. Launcher type weapons were ignoring cooldowns and power usage, so you could spam explosive banana peals, while they should have a 2 second cooldown: <img alt="q5GjUsHwGr" src="https://github.com/tgstation/tgstation/assets/3625094/d102725d-e9e1-4588-9d6c-b9e38b7a6535"> Now this is fixed and all launcher type weapons properly use power and have their cooldowns working. And now they have the kickback effect working (when it pushes you in the opposite direction in zero gravity on throw). Thermoregulator now heats/cools considering heat capacity instead of adding/reducing flat 10 degrees. So you can heat up cabin air quicker if the pressure is low. There were some other sloppy mistakes in mech code, like some functions returning too early, blocking other functionality unintentionally. Fixed these and made some other minor changes and improvements. ## Changelog 🆑 refactor: Refactored Mech UI refactor: Refactored mech radio into a utility module, adding extra slot to all mechs refactor: Refactored mech air tank into a utility module with an air pump, adding extra slot to all mechs refactor: Refactored mech cabin air - there is now a button to seal or unseal cabin to make it airtight or exchanging gases with the environment refactor: Removed mech maintenance UI Access is set in mech UI, and parts are ejected with a crowbar add: Mech now has wires and can be hacked qol: Roboticists now can see MOD suit and mech wires add: Mechs now require servo motor stock part and it affects movement power usage instead of scanning module add: Scanning module absence doesnt block mech movement and hides some UI data instead. Big Bess starts without one. qol: Hitting mech with ID card now toggles ID lock on/off if the card has required access fix: Fixed concealed weapon bay not being concealed on mech examine fix: Fixed mech radio not changing frequency fix: Fixed mech launcher type weapons ignoring specified cooldown fix: Fixed mech launcher type weapons not using specified power amount fix: Fixed mech temperature regulator ignoring gas heat capacity fix: Fixed mech stopping processing other things while not heating internal air fix: Fixed mech being able to leave transit tube in transit fix: Fixed mech internal damage flags working incorrectly fix: Fixed Gygax leg overloading being useless fix: Fixed mechs ignoring their stock parts on creation. Syndicate mechs now stronger against lasers and consume less energy on move. Upgrading from tier 1 to tier 2 doesn't make mech consume MORE energy than before the upgrade. balance: Rebalanced mech energy drain with part upgrades. Base energy drain reduced by 50%, 33%, 25% with upgrades and applies to movement (Servo rating), phasing, punching, light (Capacitor rating). balance: Hydraulic clamp now can force open airlocks balance: Made mech RCS pack consume reasonable amount of gas code: Fixed some other minor bugs and made some minor changes in the mech code /🆑 --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: Sealed101 <cool.bullseye@yandex.ru> Co-authored-by: Jacquerel <hnevard@gmail.com> |
||
|
|
0783909122 |
Fix broken icons in RCD UI (Again) (#77217)
## About The Pull Request RCD UI has some broken icons  Its fixed now  ## Changelog 🆑 fix: broken icons in RCD UI /🆑 |
||
|
|
41f20bc3ce |
[MDB IGNORE] Angled Lights & Lighting Prototyping Tool (#74365)
## About The Pull Request Hello friends, I've been on a bit of a lighting kick recently, and I decided I clearly do not have enough things to work on as it is. This pr adds angle support to static lights, and a concepting/debug tool for playing with lights on a map. Let's start from first principles yeah? ### Why Angled Lights? Mappers, since they can't actually see a light's effect in editor, tend to go off gut. That gut is based more off what "makes sense" then how things actually work This means they'll overplace light sources, and also they tend to treat lights, particularly light "bars" (the bigger ones) as directional. So you'll have two lights on either sides of a pillar, lights inside a room with lights outside pointing out, etc.  This has annoying side effects. A lot of our map is overlit, to the point that knocking out a light does.... pretty much nothing. I find this sad, and would like to work to prevent it. I think dark and dim, while it does not suit the normal game, is amazing for vibes, and I want it to be easier to see that. Angled lights bring how lights work more in line with how mappers expect lights work, and avoids bleedover into rooms that shouldn't be bled into, working towards that goal of mine. ### How Angled Lights? This is more complex then you'd first think so we'll go step by step  Oh before we start, some catchup from the last time I touched lighting code. Instead of doing a lighting falloff calculation for each lighting corner (a block that represents the resolution of our lights) in view we instead generate cached lightsheets. These precalculate and store all possible falloffs for x and y distances from a source. This is very useful for angle work, since it makes it almost totally free. Atoms get 2 new values. light_angle and light_dir Light angle is the angle the light uses, and light_dir is a cardinal direction it displays in We take these values, and inside sheetbuilding do some optional angle work. getting the center angle, the angle of a pair of coords, and then the delta between them. This is then multiplied against the standard falloff formula, and job done. We do need some extra fenangling to make this all work nicely tho. We currently use a pixel turf var stored on the light source to do distance calculations. This is the turf we pretend the light source is on for visuals, most often used to make wall lights work nice. The trouble is it's not very granular, and doesn't always have the effect you might want. So, instead of generating and storing a pixel turf to do our distance calculations against, we store x and y offset variables. We use them to expand our working range and sheet size to ensure things visually make sense, and then offset any positions by them. I've added a way for sources to have opinions on their offsets too, and am using them for wall lights. This ensures the angle calculations don't make the wall behind a light fulldark, which would be silly. ### Debug Tool? In the interest of helping with that core problem, lights being complex to display, I've added a prototyping tool to the game. It's locked behind mapping verbs, and works about like this. Once the verb is activated, it iterates over all the sources in the world (except turfs because those are kinda silly), outlining and "freezing" them, preventing any future changes. Then, it adds 3 buttons to the owners of a light source.  The first button toggles the light on and off, as desired. The third allows you to move the source around, with a little targeting icon replacing your mouse The second tho, that's more interesting. The second button opens a debug menu for that light  There's a lot here, let's go through it. Bit on the left is a list of templates, which allow you to sample existing light types (No I have no idea why the background is fullwhite, need to work on that pre merge) You can choose one by clicking it, and hitting the upload button. This replaces your existing lighting values with the template's, alongside replacing its icon and icon state so it looks right. There are three types as of now, mostly for categorization. Bar, which are the larger typically stronger lights, Bulb, which are well, bulbs, and Misc which could be expanded, but currently just contains floor lights. Alongside that you can manually edit the power, range, color and angle of the focused light. I also have support for changing the direction of the light source, since anything that uses directional lighting would also tie light dir to it. This isn't *always* done tho, so I should maybe find a way to edit light dir too. My hope is this tool will allow for better concepting of a room's lights, and easier changing of individual object's light values to suit the right visuals. ### Lemon No Why What Ok so I applied angle lights to bars and bulbs, which means I am changing the lighting of pretty much every map in the codebase. I'm gonna uh, go check my work. Alongside this I intend to give lighting some depth. So if there's room to make a space warmer, or highlight light colors from other sources, I will do that. (Images as examples)  I also want to work on that other goal of mine, making breaking lights matter. So I'll be doing what I can to ensure you only need to break one light to make a meaningful change in the scene. This is semi complicated by one light source not ever actually reaching fullbright on its own, but we do what we must because we can.  I'm as I hope you know biased towards darker spaces, I think contrast has vibes. In particular I do not think strong lights really suit maintenance. Most of what is used there are bulbs, so I'm planning on replacing most uses with low power bulbs, to keep light impacts to rooms, alongside reducing the amount of lights placed in the main tunnels  **If you take issue with this methodology please do so NOW**, I don't want to have to do another pass over things. Oh also I'm saving station maps for last since ruins are less likely to get touched in mapping march and all. ### Misc + Finishing Thoughts Light templates support mirroring vars off typepaths using a subtype, which means all the templates added here do not require updating if the source type changes somehow. I'd like to expand the template list at some point, perhaps in future. I've opened this as a draft to make my intentions to make my changes to lights known, and to serve as motivation for all the map changes I need to do. ### Farish Future I'm unhappy with how we currently configure lights. I would like a system that more directly matches the idea of drawing falloff curves, along with allowing for different falloffs for different colors, alongside extending the idea to angle falloff. This would make out of engine lighting easier, allow for nicer looking lights (red to pink, blue to purple, etc), and improve accessibility by artists. This is slightly far off, because I have other obligations and it's kinda complicated, but I'd like to mention it cause it's one of my many pipedreams. ## Changelog 🆑 add: Added angle lighting, applies it to most wall lights! add: Adds a lighting prototyping tool, mappers go try it out (it's locked behind the mapping verb) /🆑 --------- Co-authored-by: MMMiracles <lolaccount1@hotmail.com> |
||
|
|
fb10121022 |
Icons folder cleaning wave two (#76788)
## About The Pull Request Further continous organizing and cleaning the Icons folder. There are still some minior nitpicks left to do, but I reached my daily sanity expenses limit again, and the faster these get in the less issues for both me and others later. Also cleans some mess I caused by my blindness last PR. ## Why It's Good For The Game Saner spriters = better sprites |
||
|
|
a373b4cb08 |
Icon folder cleaning wave one (#76703)
## About The Pull Request Due to a mental breakdown caused by unfathomable abomination that is icons folder, I swore to myself to one day clean it. Today is kind of that day. Been at it for around 6, you gotta understand I need a rest. I tracked most changes in descriptions of commits if you are looking for details. ## Why It's Good For The Game Saner spriters make better sprites. And also, just helps keep track of things. ## Changelog 🆑 image: added sprites for different variants of scrolls. image: modified couple posters with ghost pixels. /🆑 --------- Co-authored-by: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com> |