mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-10 15:45:05 +01:00
observer_fix_tm
112 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
d1962eec26 |
The Inversenning : Chiral Inversing Buffer (#93376)
## About The Pull Request This PR adds a new buffer (and accompanying Lavaland geyser) to the game: Chiral Inversing Buffer! This unique buffer allows you to instantly transmute a hidden impure or inverse reagent into its original form, no hassle with the HPLC. It can be acquired in three ways, two of which involve Cargo. You can purchase a crate containing one 30u bottle of the buffer for 600 credits, or for free through Medbay's cargo console. You can also scour Lavaland and uncover a geyser that offers unlimited buffer. The buffer itself checks if any eligible inverses or impurities are present within the holder. If there is none, the buffer will fizzle out and be effectively wasted. If there is an eligible reagent, it converts the reagent into the Inverse at a 10-to-1 ratio with the buffer. This means that buying a bottle from cargo will net you at max, 300 units of instant inversing. Do note that this buffer has the best results when added after a reaction, not during or before. https://github.com/user-attachments/assets/5f04097d-6baa-4cfd-bf0d-77f175d37acb ## Why It's Good For The Game This was made from the suggestions of my previous PR at #93316. The main issue that this PR targets is the lack of speedy access to "true" inverse reagents. The current system hides the name of most inverses on creation and only has the HPLC to reliably convert hidden inverses into their true counterpart. This can cause issues with some inverses due to them still retaining some properties of their base reagent. While that system cannot be removed as of now, this PR serves to add another alternative for Chemists to pursue if they need to purify their inverse outputs. <img width="135" height="136" alt="chiralgeyser" src="https://github.com/user-attachments/assets/1cb336ac-966e-4c4b-8cb2-68616c410f26" /> ## Changelog 🆑 add: Chiral Inversing Buffer : A new way to convert your hidden impurities and inverses into their true form! Requires a purchase from Cargo or a trip to Lavaland to acquire. balance: A new geyser has been added to Lavaland that outputs Chiral Inversing Buffer. Geyser weights have been adjusted to accommodate this addition. /🆑 |
||
|
|
f74b725961 | Ore vent sizes are now divided up based on their distance to the mining base (#92943) | ||
|
|
d78d3a5f4a |
Ore vents spawn a ring of platforms around themselves for the duration of wave defense. (#92978)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> |
||
|
|
beb50296b6 |
Ensures uniform distribution of minerals across ore vents & non zero material boulders (#92996)
## About The Pull Request - Fixes #92972 There were multiple problems with code that I can't be asked to explain but here is the intended output(`ore_vent_minerals` contains the copy of the list `ore_vent_minerals_lavaland` which we actually modify & not the global list itself) <img width="481" height="241" alt="Screenshot (512)" src="https://github.com/user-attachments/assets/ed4d2659-b78c-4b99-ae68-e6fad4f116e4" /> All ore vents will now have at most 4 minerals but because we use an associative list it is possible for a mineral to get picked more than once in the same iteration resulting in old values getting replaced which isn't a problem but just a point to be known so you don't always get vents with 4 minerals Another problem i ran into debugging is that some vents churn out 0 material boulders. That had to do with rounding down of the logarithmic function which returned 0. We now ensure that never happens ## Changelog 🆑 fix: ore vents have unique distribution of at most 4 minerals without rare ones being repeated fix: ore vents should no longer be produce 0 material boulders /🆑 |
||
|
|
985fac79eb | Boulders can now be used on lava turfs in order to create temporary, walkable platforms (#92877) | ||
|
|
7be3eb8fdb |
Fixes winning ore vent wave defence by moving drone (#92220)
## About The Pull Request - Fixes #92079 The `force` parameter in `handle_wave_conclusion()` was being interpreted the wrong way in these 2 scenarios - When `COMSIG_QDELETING` is sent `force` actually means are we deleting the object forcefully & not if we want to win the wave defence - When `COMSIG_MOVABLE_MOVED` is sent `force` gets the old location of the drone(which gets misunderstood as TRUE because it's a non null value) & not if we want to win the wave defence So let's just remove this parameter so that it doesn't get misinterpreted again. We don't lose any functionality with this because when analysing all the places `handle_wave_conclusion()` is called, no where is `force = TRUE` passed so the default is always assumed to be FALSE so we can just throw it away ## Changelog 🆑 fix: You cannot win an ore vent wave defence by throwing a blue space crystal on the drone or by moving it in any other way /🆑 |
||
|
|
2bae025bfe |
Audits wash/cleaning signals + refactors wash() to ensure no needless mob updates occur (#91259)
## About The Pull Request This has the potential to create a lot of needless mob updates which is not great. Now should only update a mob's clothing if it was actually washed. This PR 1) ensures that all wash() procs return a bitflag. 2) ensures that `wash()` proccalls which result in expensive operations like icon updates only do so when it is necessary ## Why It's Good For The Game Updating mob sprites is expensive, and doing it when nothing has been changed is bad. ## Changelog Nothing really player facing |
||
|
|
c51ee7efa5 |
Cyborgs now use storage datum (#90927)
## About The Pull Request This moves Cyborgs onto using storage datums, removing the remenants of the shitcode that was Cyborg inventory. It's now done mostly by equipping/unequipping/storage items, much like how other mobs do. This allows borgs to take advantage of more hand support stuff and things like ``dropped()``, so borgs no longer have to copy paste drop code to ``cyborg_unequip`` It also: - Removes ``CYBORG_ITEM_TRAIT`` - Removes all borg items being ``NODROP`` https://github.com/user-attachments/assets/11442a10-3443-41f2-8c72-b38fb0126cdb ## Why It's Good For The Game Currently borgs are able to have their entire inventory open and a bag below it, which I thought was a little weird. I always assumed they WERE storage items, so I guess I'm doing it myself. Cyborgs using storage code makes it easier for contributors to actually do stuff with, without risking breaking everything. It also hopefully will make borg items more resilient against breaking in the future, now that we're not relying on nodrop. Also just brings them more in line with other mobs, all of which make use of storages. ## Changelog 🆑 refactor: Cyborg's modules now use storage (so opening a bag will close modules instead of overlap one over the other). qol: Observers can now see Cyborg's inventories (like they can for humans). /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
5261efb67f |
Re-refactors batons / Refactors attack chain force modifiers (#90809)
## About The Pull Request Melee attack chain now has a list passed along with it, `attack_modifiers`, which you can stick force modifiers to change the resulting attack This is basically a soft implementation of damage packets until a more definitive pr, but one that only applies to item attack chain, and not unarmed attacks. This change was done to facilitate a baton refactor - batons no longer hack together their own attack chain, and are now integrated straight into the real attack chain. This refactor itself was done because batons don't send any attack signals, which has been annoying in the past (for swing combat). ## Changelog 🆑 Melbert refactor: Batons have been refactored again. Baton stuns now properly count as an attack, when before it was a nothing. Report any oddities, particularly in regards to harmbatonning vs normal batonning. refactor: The method of adjusting item damage mid-attack has been refactored - some affected items include the Nullblade and knives. Report any strange happenings with damage numbers. refactor: A few objects have been moved to the new interaction chain - records consoles, mawed crucible, alien weeds and space vines, hedges, restaurant portals, and some mobs - to name a few. fix: Spears only deal bonus damage against secure lockers, not all closet types (including crates) /🆑 |
||
|
|
339616ae78 |
You can now interact with held mobs beside wearing them (feat: "minor" melee attack chain cleanup) (#90080)
## About The Pull Request People can now pet held mothroaches and pugs if they want to, or use items on them, hopefully without causing many issues. After all, it only took about a couple dozen lines of code to make... ...Oh, did the 527 files changed or the 850~ lines added/removed perhaps catch your eye? Made you wonder if I accidentally pushed the wrong branch? or skewed something up big time? Well, nuh uh. I just happen to be fed up with the melee attack chain still using stringized params instead of an array/list. It was frankly revolting to see how I'd have had to otherwise call `list2params` for what I'm trying to accomplish here, and make this PR another tessera to the immense stupidity of our attack chain procs calling `params2list` over and over and over instead of just using that one call instance from `ClickOn` as an argument. It's 2025, honey, wake up! I also tried to replace some of those single letter vars/args but there are just way too many of them. ## Why It's Good For The Game Improving old code. And I want to be able to pet mobroaches while holding them too. ## Changelog 🆑 qol: You can now interact with held mobs in more ways beside wearing them. /🆑 |
||
|
|
67dd51be79 |
Reworks language translations. Add partial language understanding. Bilingual update. (#90252)
## About The Pull Request Fixes #89445 (well, technically. It fixes the bug associated but these `say`s should really be emotes.) Three things: 1. Reworks how language translation works. Rather than scrambling a sentence into a language entirely, sentences are now scrambled on a per-word basis. Additionally, the 1000 most common words of a language are *never* re-scrambled across the duration of a round. Once it's set it's set in stone. Example: (Sample / Old / New)  This allows for a number of things: - More consistent translations, making it (more) viable to actually "teach" someone words for something - Maintaining emphasis such as caps (but not `||`, `++`, or `__` - at least not yet) - The following: 2. Adds partial language understanding Some languages can understand portions of other languages.  This pr adds the following: - Those who understand Beachtongue can understand 50% of Common and 33% of Uncommon words. - Those who understand Common can understand 33% of Beachtongue and 20% of Uncommon words. - Those who understand Uncommon can understand 20% of Common and 20% of Beachtongue words. 3. Bilingual quirk has been expanded to accomodate these changes. There are now two more preferences: - Language Speakable - You can toggle this, so you only understand the language, rather than understand AND speak. - Language Skill - If you choose to be unable to speak the language, you can set how much of the language you can understand, down to 10%. ## Why It's Good For The Game Playing around languages is fun, but due to the way our translation works, ALL context is immediately lost for what the other person may be saying. If the other person is shouting in all caps? Output language is normal chatting. This is lame! Even if someone is unable to understand you, there's a LOT you can convey just by how you speak, and getting that across in game is quite difficult when all translations get mauled so badly. So this changes that. - Emphasis like caps lock is maintained, so you see someone shouting in caps in a foreign language you can probably intuit something is wrong (but not what is wrong!) - Some languages can gleam bits of other languages, so you MIGHT be able to pick out context if you pay close attention - "Brother" languages will now feel more like "brothers" and not completely divergent - You can even "teach" someone words in your language - at least the most common words! (Until next round) ## Changelog 🆑 Melbert add: Languages can now have partial understanding of other languages. More common English words are more likely to be mutually understood. add: Those who understand Beachtongue can understand 50% of Common and 33% of Uncommon words. add: Those who understand Common can understand 33% of Beachtongue and 20% of Uncommon words. add: Those who understand Uncommon can understand 20% of Common and 20% of Beachtongue words. add: Bilingual quirk: You can now choose between being able to speak or not speak the language add: Bilingual quirk: You can now choose to have partial understanding of your language, rather than full. qol: If you speak in ALL CAPS in a foreign language, the translated words will also be ALL CAPS. qol: Many more forms of punctuation are now conveyed across translations. qol: The 1000 most common English words will now never be scrambled when translating into other languages for the duration of the round. This means you can actually "learn" some words if you are especially attentive! (Until the next round at least) refactor: Refactored language translations. Report if you see any super odd looking translations. fix: Force-says forcing you to speak common (such as cult invocations) will now correctly force you to speak common (even if you don't know common) /🆑 |
||
|
|
acd8a1693f |
Moves manual boulder breaking to LMB, corrects tooltips (#90474)
## About The Pull Request Per #90473, for some reason boulder breaking is right click exclusive for items. Basicmobs also break boulders on left click, but the tooltip claims they should use right click for it. Also cleaned up some related code. ## Why It's Good For The Game Doesn't really make sense to use exclusively right click for boulder breaking, this can confuse newer players. ## Changelog 🆑 qol: Moved manual boulder breaking with tools to LMB, corrected boulder tooltips suggesting incorrect mouse buttons for basicmobs. /🆑 |
||
|
|
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. |
||
|
|
8df0c5851d |
Partially reverts #89619, where I partially reverted #87936; Puts back the mining and damage AOE damage on Mech PKA, but improves the standard modkits as well (#89993)
## About The Pull Request In #89619, I removed the mech PKA's mining AOE and reduced the damaging AOE to a fraction of the damage. I have restored both of these aspects, but I have also applied this change to the standard PKA's mining and damage AOE. I have also included the mob biotype limitations as well. AOE modkits take 10% capacity, now allowing miners to use them in more setups. However, they conflict with one another. You can only have one AOE mod until you can get the dual AOE mod from tendrils. The AOE damage/mining effect is now a 2 tile effect rather than 1 tile effect. ## Why It's Good For The Game My intent in the previous PR was to bring mech PKA's down to standard mining limitations. So, why not improve those standards for everyone instead? The new state of mining expects you to be dealing with a lot of mobs at once. Even small vents can, on occasion, decide to spit out several goliaths back to back. That's a lot of mobs with a lot of health. Miners need AOE options more than ever. They have very little that are actually meaningful, sadly. So my intent here is that this should be an expectation for our miners to be seeking out and can fit into their current, standard gameplay. Certainly I've only felt like shit having to sacrifice a damage or cooldown mod for an AOE mod, only to get a very minor amount of damage splash for my efforts. That, and the radius doesn't usually impact most mobs as they spawn and attack from awkward angles or distances from one another where they are JUST out of reach of one another. Trying to use the splash to hit multiple enemies is often not worth it compared to just hitting one enemy at a time with a lot of damage. So, let's just go with the standard of 'Good AOE is fundamentally needed now' and worth from that premise. ## Changelog 🆑 balance: Mech PKA now once again mines turfs and does full damage on its AOE explosion (still only hitting mining mobs). balance: The standard PKA AOE mods are now by default 10% capacity. But they cannot be used with one another. balance: The standard PKA offensive AOE mod now does the PKA's full damage in its AOE. balance: Mining AOEs will affect everything within a 2 tile radius around the point of impact, up from a 1 tile radius. /🆑 --------- Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> |
||
|
|
0495a19beb |
Refactor for reagent signals (#88909)
## About The Pull Request Refactors the way we listen for reagent changes. The changes made can be listed as points **1. Removes `COMSIG_REAGENTS_PRE_ADD_REAGENT`** Used to stop new reagents from being added to the holder, its only application is with the BRPED to stop inserting reagents into beakers/cells stored inside it. Rather than using this signal a cleaner solution is to simply remove the component part's reagent holders' flags which allow us to insert reagents into it(i.e. `REFILABLE`, `INJECTIBLE`, `DRAINABLE`) and restore them back when that part is removed thus achieving the same results. Thus `add_reagent()` is now slightly faster because it no longer uses this signal **2. Removes every other signal used by the reagent holder** Removes pretty much every other signal used by `holder.dm` which are `COMSIG_REAGENTS_[NEW_REAGENT, ADD_REAGENT, DEL_REAGENT, REM_REAGENT, CLEAR_REAGENTS]` While yes, it is true that all these signals are unique & serve a specific purpose the problem is no object in code respects their uniqueness & instead clumps them up all together & hooks them onto one proc to listen for "reagent changes". You see this code pattern repeated in so many places https://github.com/tgstation/tgstation/blob/9277364ef6449262e2c693ff6817925e074c47ce/code/modules/power/power_store.dm#L105 Not only does this look ugly but it also has a memory overhead (4 to 5 signal slots all performing the same action which is a lot compared to the solution i implemented below). Bonus is that "none" of the parameters passed to this proc are used so they go to waste as well. So after removing a ton of code we need something that can still make the code function which brings us to point 3 **3. Adds a new signal `COMSIG_REAGENTS_HOLDER_UPDATED` to rule them all** So if all objects in game are listening for "reagent changes"[adding/removing, reagents] then we need to look at the proc that is always called during these changes & that is none other than `update_total()` so we let that send out a signal and cause all objects to hook onto this 1 signal instead of 4 to 5 signals as explained in point 2 ## Why It's Good For The Game This section isn't necessary but i want us to better appreciate both the code & performance benifits of this PR. 1. First of all its waaaay less code and signals to worry about. Just look at the number of lines of code removed compared to added. Nothing more to say 2. Overhead of `RegisterSignal` compared to `RegisterSignals` is less for obvious reasons 3. `remove_all` is significantly faster as it no longer calls `remove_reagent()`[which in turn calls `update_total()` & `handle_reactions()` per call & uses a for loop so its a nested for loop of doom] for every reagent it removes, instead it does the work by itself & calls the above 2 procs just once 4. Usually when a reagent is deleted it calls `COMSIG_REAGENTS_REM_REAGENT` & `COMSIG_REAGENTS_DEL_REAGENT`. So if you have a holder with like 3 reagents upon transferring/deleting them you get a total of 6 signal calls!!. Now it's just 3(when using `trans_to`) and just 1 when using `remove_all/clear_reagents`. Need i say more no ## Changelog 🆑 fix: hydrophonics circuit component actually sets output level when reagents are changed in the tray refactor: refactors how code listens for reagent changes. Report bugs on github /🆑 |
||
|
|
4f14df11b6 |
Redo of the Geyser Code: Second Attempt (#89111)
## About The Pull Request Makes it so strange geysers now say their name when scanned. ## Why It's Good For The Game Should help make geysers actually worthwhile now that it's easier to tell what they produce. ## Changelog 🆑 qol: Strange geysers now say in their name what they produce. /🆑 |
||
|
|
7ddc30783a |
Adds better attack animations and alternate attack modes (#88418)
## About The Pull Request This is the first PR in a series attempting to modernize our damage and armor, both from a code and a gameplay perspective. This part implements unique attack animations, adds alternate attack modes for items and fixes some minor oversights. Items now have unique attack animation based on their sharpness - sharp items are now swung in an arc, while pointy items are thrust forward. This change is ***purely visual***, this is not swing combat. (However, this does assign icon rotation data to many items, which should help swing combat later down the line). Certain items like knives and swords now have secondary attacks - right clicks will perform stabbing attacks instead of slashing for a chance to leave piercing wounds, albeit with slightly lower damage - trying to stick a katana through someone won't get you very far! https://github.com/user-attachments/assets/1f92bbcd-9aa1-482f-bc26-5e84fe2a07e1 Turns out that spears acted as oversized knives this entire time, being SHARP_EDGED instead of SHARP_POINTY - in order for their animations to make sense, they're now once again pointy (according to comment, originally they were made sharp because piercing wounds weren't very threatening, which is no longer the case) Another major change is that structure damage is now influenced by armor penetration - I am not sure if this is intentional or not, but attacking item's AP never applied to non-mob damage. Additionally, also fixes an issue where attack verbs for you and everyone else may differ. |
||
|
|
75696ab873 |
Fixes random stuff spilling into ooc tab (#88221)
## About The Pull Request `boldannounce` is NOT for use ICly it's only for OOC stuff. `bolddanger` is identical it just doesn't carry the same baggage ## Changelog 🆑 Melbert fix: Stuff like the SM exploding will no longer output to your OOC tab /🆑 |
||
|
|
742729fa0a |
Converts most common particle sources to use our new pooling system (#88048)
## About The Pull Request Closes #83370 Converted most cases where we could benefit from using shared particles (aka when there's probably more than 3 uses of that particle in a round) to use the new shared particle system. Should provide significant clientside performance in particle-heavy areas like botany (or sometimes kitchen) ## Changelog 🆑 refactor: Converted most common particle sources to use our new pooling system. /🆑 |
||
|
|
15247f28f1 |
Arcmines The Clarke Exosuit + Tech node changes. (#87936)
## About The Pull Request The Clarke Exosuit has received several adjustments to make it worth using in the Arcmining era. - Clarke no longer requires gold bars to be built. - HP bumped from 200 to 250, melee armor bumped from 20 to 40. - Clarke Ore storage module can now collect boulders and smelt them internally. - Exo mining scanners can now be used in proximity to a vent to start the wave defense event. - Mech Pkas now do more damage and have the AOE upgrade preinstalled. - Mech drills are now a utility module rather than a weapon. - New Internal module unique to the Clarke, It's a rusty sleeper that can be used to recover dead miners, but lacks the ability to inject chems - Fixed Mech sleepers not granting life support. - Plasma cutters and Bluespace satchels tech nodes are no longer locked behind experiments, but they are now discounted by them. ## Why It's Good For The Game Ever since the inception of Arcmining, the Clarke Exosuit has fallen from being niche to straight up irrelevant. The Clarke sits in this weird spot, where, while not being roundstart available, it is an effectively worse fit than your regular Shaft Miner in all aspects of the job. This PR aims to address this by making The Clarke able to be built even if the miners are absent or haven't secured a haul, while making it actually capable of interacting with the new elements introduced by Arcmining. **Arcmining Clarke and Improved Combat functionality** The Mech mining scanner can now be used to trigger the vent wave defense, The internal storage module can now collect boulders and internally smelt them within the Clarke. Video Demonstration: https://www.youtube.com/watch?v=gtsNK5JbI3o The Clarke is now a more capable fighter on Lavaland, being a bit beefier overall. The mech Pka was also in dire need of some love. It being unable to be upgraded made it frankly underwhelming at dealing with Vent defences. I was considering just having PkA upgrades applicable to the mech itself but ultimately decided against it in fear of having it become a problem on the station. Instead, I just went for a flat damage increase and have the AOE upgrade come preinstalled to better deal with legion swarms. Lastly The drill modules have been reworked to be utility modules instead of weapons. Frankly these shouldn't be weapons, they are nowhere near as valuable as the cutter or the PKA and can't be used at all on moving targets due to the long cost time. **New Clarke Exclusive Internal Module: Mining Sleeper**  Just a bit of extra functionality to aid miners that have tragically fallen, this sleeper is effectively a worse version of the Odysseus, it can stabilize patients but cannot inject chems, I also fixed an issue where Mech sleepers were not putting patients on life support like regular sleepers do. **Tech Node Changes** This is not something super related to the Clarke in and on itself, but I figured I might push my luck and try these anyway. There is just no good reason as to why satchels and cutters should be hard locked behind gas shells. These experiments are fairly trivial, but have a huge impact on lowpop as they usually force people to break into ordinance or the teleporter room just so miners could get their basic tools. The shells still exist but now grant a discount instead of hardlocking tech, so there's still an incentive to do them. ROCK AND STONE! ## Changelog 🆑 add: New internal sleeper module for the Clarke. balance: Clarke Integrity has been bumped from 200 to 250 HP, melee armor bumped from 20 to 40. balance: Exo mining module can now be used to scan vents and begin the wave defense event. balance: The Clarke Ore Storage Module can now collect boulders and internally smelt them. balance: Mech Pka is now bundled within the Clarke tech node, it now does more damage and comes with the AOE upgrade preinstalled. balance: Exo mining drills are now a utility module rather than a weapon. balance: Applied Bluespace Research and Controlled Plasma tech nodes are no longer hardlocked behind surveys, they instead favor from a discount if they are completed. fix: Fixes Exo Mech modules not granting life support to housed patients. /🆑 --------- Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
778ed9f1ab |
The death or internal/external organ pathing (ft. fixed fox ears and recoloring bodypart overlays with dye sprays) (#87434)
## About The Pull Request This PR kills the abstract internal and external typepaths for organs, now replaced by an EXTERNAL_ORGAN flag to distinguish the two kinds. This PR also fixes fox ears (from #87162, no tail is added) and mushpeople's caps (they should be red, the screenshot is a tad outdated). And yes, you can now use a hair dye spray to recolor body parts like most tails, podpeople hair, mushpeople caps and cat ears. The process can be reversed by using the spray again. ## Why It's Good For The Game Time-Green put some effort during the last few months to untie functions and mechanics from external/internal organ pathing. Now, all that this pathing is good for are a few typechecks, easily replaceable with bitflags. Also podpeople and mushpeople need a way to recolor their "hair". This kind of applies to fish tails from the fish infusion, which colors can't be selected right now. The rest is just there if you ever want to recolor your lizard tail for some reason. Proof of testing btw (screenshot taken before mushpeople cap fix, right side has dyed body parts, moth can't be dyed, they're already fabolous):  ## Changelog 🆑 code: Removed internal/external pathing from organs in favor of a bit flag. Hopefully this shouldn't break anything about organs. fix: Fixed invisible fox ears. fix: Fixed mushpeople caps not being colored red by default. add: You can now dye most tails, podpeople hair, mushpeople caps etc. with a hair dye spray. /🆑 |
||
|
|
00d40c2a8f |
fixes ore vents being tapped despite their drones dying (#87359)
## About The Pull Request the vent defense minigames had a 100% win rate because of a small mistake in the order of args passed to the proc ## Why It's Good For The Game closes #87284 ## Changelog 🆑 fix: fixes ore vents being tapped despite their drones dying /🆑 |
||
|
|
083defab20 |
Industrial scanning sound (#87189)
## About The Pull Request For: - gas analyzer - scanner gate - plant analyzer - t-ray scanner - slime scanner - scanning mining geysers https://github.com/user-attachments/assets/24fde731-e567-483b-b88e-6f7fcbacf52a ## Why It's Good For The Game it sounds nice ## Changelog 🆑 grungussuss sound: added new scanning sound /🆑 |
||
|
|
47430a4c04 |
A smattering of boulder-related QOL and fixes. (#86834)
## About The Pull Request This pull request does a little bit of cleanup that I came across awhile ago while looking at #85081, then forgot about, then came back up when I was looking at some additional cleanup that needed to be done. Reorganizes the handle_wave_conclusion function such that it can take a force arg, to force a ore vent to be completed for debug purposes. This also fixes a minor bug where vents, when successfully completed, will still show a warning alert that the waves were failed, and that the vent has closed up. Grammar fix to the examine of boulder processing machines. Moves the can-move behavior of boulders on conveyor belts and during regular stacking to an early return over a late return (Thank you Goofball for pointing that out). Artifact boulders will now default to their artifact icon_state whenever possible. Finally, adds an additional sanity check to boulder processing to check for custom material length, to attempt to avoid zero-content boulders existing and running into the afforementioned #85081 ## Why It's Good For The Game Largely applies cleanup to several aspects of the boulder processing system, and a handful of (hopefully) performance related rearrangements to the existing layout of boulder processing code. I can't for sure say that it'll fix the linked issue, due to the fact that I could not for some reason re-create the issue in local testing, but I'm hopeful that it's some kind of nebulous sanity-related issue. Cleans up grammar in some spots, and provides a useful debug tool for admin purposes when you just want a vent to flip. Might be a good justification for a ore-manager admin panel later? 🤷 ## Changelog 🆑 fix: Artifact boulders should keep their alien icon even after a first round of processing. fix: Boulders are less likely to exist with zero materials after processing. fix: Boulders should be slightly less laggy on conveyor belts. fix: Grammar of refinery/smeltery examine is corrected. /🆑 |
||
|
|
58501dce77 |
Reorganizes the sound folder (#86726)
## About The Pull Request <details> - renamed ai folder to announcer -- announcer -- - moved vox_fem to announcer - moved approachingTG to announcer - separated the ambience folder into ambience and instrumental -- ambience -- - created holy folder moved all related sounds there - created engineering folder and moved all related sounds there - created security folder and moved ambidet there - created general folder and moved ambigen there - created icemoon folder and moved all icebox-related ambience there - created medical folder and moved all medbay-related ambi there - created ruin folder and moves all ruins ambi there - created beach folder and moved seag and shore there - created lavaland folder and moved related ambi there - created aurora_caelus folder and placed its ambi there - created misc folder and moved the rest of the files that don't have a specific category into it -- instrumental -- - moved traitor folder here - created lobby_music folder and placed our songs there (title0 not used anywhere? - server-side modification?) -- items -- - moved secdeath to hailer - moved surgery to handling -- effects -- - moved chemistry into effects - moved hallucinations into effects - moved health into effects - moved magic into effects -- vehicles -- - moved mecha into vehicles created mobs folder -- mobs -- - moved creatures folder into mobs - moved voice into mobs renamed creatures to non-humanoids renamed voice to humanoids -- non-humanoids-- created cyborg folder created hiss folder moved harmalarm.ogg to cyborg -- humanoids -- -- misc -- moved ghostwhisper to misc moved insane_low_laugh to misc I give up trying to document this. </details> - [X] ambience - [x] announcer - [x] effects - [X] instrumental - [x] items - [x] machines - [x] misc - [X] mobs - [X] runtime - [X] vehicles - [ ] attributions ## Why It's Good For The Game This folder is so disorganized that it's vomit inducing, will make it easier to find and add new sounds, providng a minor structure to the sound folder. ## Changelog 🆑 grungussuss refactor: the sound folder in the source code has been reorganized, please report any oddities with sounds playing or not playing server: lobby music has been repathed to sound/music/lobby_music /🆑 |
||
|
|
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. |
||
|
|
83dde48caa |
Add a janitorial 'borg plunger (#85475)
## About The Pull Request I got annoyed at not being able to plung vents when there's a clog. This PR corrects that. I copied all of the cyborg mop attributes to make this. This is my first PR on this server, but I did test it on a local server, and it indeed, plungs. ## Why It's Good For The Game More content for janitorial cyborg. They really should have a plunger, to be honest. It just makes sense to me. ## Changelog 🆑 add: Added a cyborg plunger for janitorial modules /🆑 |
||
|
|
d4a2246e70 |
NODE drones now show their wave progress on the sprite (#85405)
## About The Pull Request Node drones now show a small green progress light as they reach 25%, 50%, and 75% landmarks within the wave defense minigame. This allows for a bit of consistency when it comes to doing wave defense, so you can get a feel for how much longer you have until wave defense is complete at any given vent. This also clears the registered signal on QDEL, so that when wave defense is completed successfully, it doesn't trigger the "*creaks and groans as the mining attempt fails, and the vent closes back up*" message.   ## Why It's Good For The Game This was presented as an idea to me as a quick QOL improvement for arcmining, which I agree would make for an easy improvement to how the wave defense minigame is presented. Been meaning to do more balance, system, and QOL changes to arcmining, but I've been swamped with real life as of late. This however was a fairly simple change I did over the weekend. ## Changelog 🆑 qol: NODE drones summoned to tap a vent within ore vents now display a green status light to show how much longer they need the vent defended for. /🆑 |
||
|
|
5f80128fa9 |
Corrects 200+ instances of "it's" where it should've been "its" instead (#85169)
## About The Pull Request it's - conjunction of "it" and "is" its - possessive form of "it" grammar is hard, and there were a lot of places where "it's" was used where it shouldn't have been. i went and painstakingly searched the entire repository for these instances, spending a few hours on it. i completely ignored the changelog archive, and i may have missed some outliers. most player-facing ones should be corrected, though ## Why It's Good For The Game proper grammar is good ## Changelog 🆑 spellcheck: Numerous instances of "it's" have been properly replaced with "its" /🆑 |
||
|
|
eaa4d71c3c |
Adds the Herculean Gravitronic Spinal Implant; An Athletics focused implant. (#84532)
## About The Pull Request Adds the Herculean Gravitronic Spinal Implant. A personal gravity dampener that affords the user improved physical performance without all the effort of actually working out. This implant improves the user's ability in a variety of minor but useful ways Including; 1) Faster climbing speeds with climbing hooks and ladders. (Athletics now also influences this time) 2) Slightly less damage from falling from a height. 3) Faster fireman lifting and placing onto tables. 4) An easier time working out and stronger in boxing. 5) Standing up just a bit faster. 6) Throwing things just a little further. 7) Tackle performance, including offense, defense and safety if you miss. You can improve the implant by using a gravity anomaly core on it, transforming it into an Atlas implant. This implant has considerably better bonuses compared to the baselines fairly minor even if numerous benefits. It also forces personal gravity to normal values. As a result, the total number of gravity anomaly cores is now 6.  Has some little floating rocks around your head while active. ## Why It's Good For The Game I attempted to add something fairly similar in the past, but didn't quite like simply making an entirely combat related implant. Instead, I've changed the concept towards generally improving some minor physical world interactions. Things that you may not really think about or notice. I really enjoy getting just slight tweaks to the small little gameplay activities that come up every so often, and even if this won't appeal to most players, I know someone will see this and think to find a way to make the most of the implant in some way that I didn't even think about. ## Changelog 🆑 add: Adds the Herculean Gravitronic Spinal Implant; an implant that makes you better at athletics. You can upgrade it into an Atlas implant using a gravity anomaly core. balance: Gravity anomaly cores have had their max number of cores reduces from 8 to 6. balance: Your athletic ability allows you to climb faster. /🆑 |
||
|
|
26f6235a53 |
Fixes ore vents floating after a tendril collapses nearby. (#84730)
## About The Pull Request Ore vents now provide a trait to the turf they spawn on, TRAIT_NO_TERRAFORM, which does exactly what it says on the tin, preventing the turf from being able to change into something else, like a chasm. Ore vents already have `move_resist = MOVE_FORCE_EXTREMELY_STRONG`, so they shouldn't be movable by any other means anyway, resulting in them being stuck in the turf that they spawned without admin tomfoolery.  ## Why It's Good For The Game Fixes #84463. Reasonably, too, we'll one day have other uses for something that needs to avoid the turf changing on it as well such as this. I also sorted the turf traits because they were starting to get non-alphabetical and I know that'll drive someone crazy if I don't fix that while it's still early. ## Changelog 🆑 fix: Ore vents that are caught in the cross-fire of a lavaland tendril collapsing will now spare the ore vent and it's associated turf. /🆑 |
||
|
|
97b135a6c7 |
Vent-spawned wendigos no longer create one-way portals (#84230)
## About The Pull Request Creates a vent-specific wendigo subtype that will not spawn a portal upon death ## Why It's Good For The Game Fixes #84119 ## Changelog 🆑 fix: Vent-born wendigos no longer create one-way portals /🆑 |
||
|
|
43bf03f2b4 |
Ashwalkers now start out in their proper faction; Lavaland mobs also have this if ashwalkers don't attack them (#84127)
## About The Pull Request Ashwalkers and the various denizens of lavaland are meant to be offshoots of whatever horrible gestalt consciousness encourages the growth of necropolis tendrils. As such, I made some changes to their factions and faction logic; ashwalkers are now in their own faction instead of FACTION_NEUTRAL (this seems like a fix); as well, lavaland mobs besides raptors now also have FACTION_ASHWALKER alongside FACTION_MINING; they will be on the same side as ashwalkers as long as ashwalkers don't attack them. As a result, ashwalkers are a more serious threat to miners if they manage to flee into a crowd of legion, goliath, watchers, or what-have you. But by the same token, if ashwalkers take to attacking the mobs in order to feed their nest, it'll be the current behavior, where the mobs attack the ashwalkers on sight. This has no effect on the megafauna of the area. They still have their own set of factions, and they are NOT allied with ashwalkers. As a result of this, ashwalkers who tame pets can order these pets to attack people/things in the neutral faction, which will probably primarily be miners, unless a method for them to attack the station is introduced down the line. ## Why It's Good For The Game Ashwalkers and lavaland fauna are meant to be part of the same loose entity that's creating the tendrils and all the other messed up shit going on down there. Ashwalkers are still sentient, however, and can choose to break away from this connection to feed their own nest. This change brings their mechanics in line with the lore, and also makes them a slightly more serious threat to miners; miners are still likely to dogwalk them after that tipping point of points where they have 12 lux pens and a PKA with a full set of mods. ## Changelog 🆑 Bisar add: Ashwalkers now start out allied to lavaland fauna (except for raptors). Attacking the fauna will break this alliance with the attacked beast and any who witness it. fix: Ashwalkers are now actually in the ashwalker faction, instead of the neutral one. /🆑 |
||
|
|
a37a888ff8 |
Adds logging for ore vent mobs spawned and killed (#83942)
## About The Pull Request Basically what the title says. Adds logging for every mob spawned by an ore vent by type (bosses included). Adds similar logging for spawned mobs being killed, that way people can tell if vents are being cheesed. ## Why It's Good For The Game Logging is good. Also this:  ## Changelog No player facing changes. |
||
|
|
a05321db2f |
Increases move resistance on NODE Drones, adds handling for when the drone is seperated from the node (#83309)
## About The Pull Request NODE Drones now have higher move resistance (MOVE_FORCE_EXTREMELY_STRONG), preventing them from being bumped off the node, pulled away, or lifted away by a fulton extraction kit. As an extra layer of assurance, the NODE Drone will depart from the site if it is moved off of its vent. ## Why It's Good For The Game Closes #83164. I'm pretty sure these things shouldn't really be ever moving off of their vents. ## Changelog 🆑 Rhials fix: You can no longer force NODE Drones off of ore vents. That includes using fulton packs! fix: When a NODE Drone is forcibly separated from its vent, it will fly away. /🆑 |
||
|
|
659c925495 |
Ore vents now have countermeasures against walling them off from all sides. (#83295)
## About The Pull Request This PR fixes some balance and practicality issues with the spawner component that has affected vent mining and the associated wave defense. * The turf_peel() proc now checks to see if it's pulling no turf from the inside or outside of it's peel, in which case it now has a default case where it returns it's center turf instead. * As a consequence of this, the center turf is where mobs will spawn if an ore vent is unable to find any space where it can spawn any new hostile mobs. Upon testing this, it worked fairly well, but ultimately node drones were capable of tanking enough hits for long enough that typically they could still survive a small vent's onslaught. As a precaution, I've made two additional changes. * Node drones have had their maximum health dropped slightly, from 500 health to 300 health. * As a secondary precaution, if a spawner using the turf peel method cannot spawn correctly, it will send a signal, which ore vents are now registered to. When called on an ore vent, it has new behavior to clear the offending nearby turfs and create a pathway to allow nearby mobs to get access to the vent. * (**This is an explosion**.) ## Why It's Good For The Game Fixes an unreported on the repo but repeatedly pinged issue regarding ore vent waves where players could often wall off or blockoff an ore vent in such a way that it allows vents to be functionally immortal by quickly walling off the vent using sandstone doors. This should help to prevent players cheesing the intended gameplay mechanic, as well as keep up the challenge to arcmining wave defense without some additional nuance. I may have gone a little overboard with the health tweaks as well, but considering that even with the explosions, I was able to survive the repeated explosions on the vent, I think this should work quite well all things considered. Still, open to feedback there. ## Changelog 🆑 balance: Ore vents, if blocked off from all four sides while being defended, now cause a mild gas explosion, resulting in a mild dissuasive explosion. fix: NODE drones spawned from ore vent defense have lower maximum health. /🆑 |
||
|
|
a8d5a8dcc4 |
node drones hard deletes (#82927)
i noticed node drones were being hard deleted 60% of the time. its because the ore vent wasnt cleaning up after them. also fixes some runtimes if ur id card didnt have a registered account fix hard deletes |
||
|
|
ca2ff33292 |
Rocky DLXIII: Fitness to Athletics, Athletics skill influences Boxing against Boxers, Boxing overhaul, Evil Boxing (#82611)
## About The Pull Request ### Changes Fitness skill to Athletics skill; Removes the sprite growth as the only meaningful reward Basically just a rebranding so that it is more broad in its concept. It isn't just about peak physique. It's about how you can apply it too. Reaching Legendary rewards you with the Golden Gloves. ### Boxing Overhaul I started it in this pr here https://github.com/tgstation/tgstation/pull/80635 But this is a more significant overhaul of boxing from the ground up. Namely, it now is majorly influenced by the Athletics skill, and also more thoroughly aligns with conventional punching in its current state. However, a major component of this is that boxing's breadth of mechanics is only relevant when used against another boxer. Non-boxer targets are only ever going to get smacked by a stamina punch, as it is currently (and more or less the same values too). Additionally, boxers cannot punch someone who is either unconscious or in stamina crit, so it can't be used to maintain stamcrit. - Boxing now has a One-Two Punch mechanic. Swapping between the left and right mouse buttons to punch and maintaining this causes every second punch to do more damage (to boxers). Breaking this chain by punching with the same button twice will cause you to lose damage (against boxers). - Boxing now can have crits occur below 50 stamina damage (against boxers). However, to knock someone out clean, the target must be staggered from a previous crit first. (Or I guess be staggered at all, maybe their shoelaces were tied or something). Crit probabilities are determined by adding your Athletics probability skill bonuses to your unarmed effectiveness, and then reduced by the targets own Athletics skill bonuses. It is hard for two athletes to knock each other out in one blow. It is trivial for a legendary boxer to knock out a novice in a single punch. Cybernetically enhanced boxers are dangerously effective at boxing. - Boxers can block other boxers by using throw mode, but the chances of doing so is based on Athletics skill bonuses. A successful block causes the attacker to take stamina damage (as does the blocker, but less so). - Participating in boxing increases the Athletics skill. Your gains are probably slower than normal training, but you at least get some reward for doing so. Only relevant if your opponent is a boxer. Get a sparring partner! ### Evil Boxing (Admin Only) So this is all well and good, but what if you're a scoundrel with no care for the other person in this equation? Well, that's where Evil Boxing comes in. Evil Boxing has absolutely no restrictions at all, and can freely use its boxing abilities against anyone. Even non-boxers. You can even grab people! Wow, what a scumbag. I bet you even king hit people. Thankfully, only an admin can make you into an Evil Boxer. ### Strength and Stimmed Mutations now benefit Exercising and Boxing (against boxers) Both mutations have a flimsy increase to instability of 5 because of how incredibly particular the bonus is. Strength now reduces the amount of stamina damage inflicted via exercising by half. Strength also adds a +2 damage bonus on boxing punches while boxing against boxers (this doesn't influence normal unarmed attacks whatsoever, or boxing against nonboxers). Obviously, evil boxers just get this benefit against everyone because they're knaves. Stimmed increases the duration of the exercised status effect by one factor. (That is, if you have no other modifiers, it will double the duration on its own) ## Why It's Good For The Game @Jacquerel was racking their brain trying to come up with an alternative to the skill rewards of Fitness. At the moment, sprite growth is not only a really bad bonus (it does literally nothing but make you big, and thus is actually a detriment due to how intrusive sprite size is with interaction, and plays weird with other sprite changing effects), but isn't really all that interesting for all the effort put in. Problem is, how do you make Fitness meaningful without making it a powergame mechanic? Simple! You make it applicable to a really niche, self-contained but still utilized game mechanic that is engaging to participate in and makes you meaningfully very good in it. AND scratches that power scaling itch that many players have. Boxing is reasonably self-contained as is, but pretty bland due to how old it is. While maintaining that self-contained nature, I hoped to expand the interactivity of boxing a little bit by giving it a small mini-game in of itself. And also introduce ways to simulate the idea of boxing a bit better. The idea of being an Evil Boxer is funny. For every Rocky, there is a [Insert Rocky Villain Here that isn't Creed]. But in this case, it's probably some Syndicate douchebag looking to punch clowns into a coma and inspire the mime to take up shadowboxing in revenge. ## Changelog 🆑 add: Replaces Fitness with Athletics; same skill, but now more specifically applicable to boxing. add: Athletics does not increase sprite size. balance: Overhauls Boxing to add a lot more depth to the interactions. Only applicable to other boxers, however. You can still punch the snot out of non-boxers though. But only up to stamcrit or unconsciousness. No hitting someone who can't fight back! balance: Adds Evil Boxing, which is the evil and fucked up version of boxing that you kill people with and are allowed to flout the sacred rules of boxing as you please. Everyone is a victim! /🆑 |
||
|
|
d3662137f8 |
Arcmining QoL: GPS component to scanned vents and vent(pin)pointer (#82724)
## About The Pull Request Scanning ore vents will now tag them on GPS so you can find them easily when you are prepared (and remove them when they are tapped). Also adds special pinpointer to help with finding unscanned vents in a first place. And adds missing uranium overlays for scanned vents. Because why not. <details>   </details> ## Why It's Good For The Game While looking at mineral density to find vents is somewhat fun and entertaining, having some sort of upgrade to make finding them easier adds a bit of a progression. Also re-finding already scanned vents can be a bit annoying. You need to fill your backpacks with GPSs and tag them manually. It is also inconsistent with geysers that are added to positioning after you scan them. And with tendrils, which are always visible. ## Changelog 🆑 add: added ventpointer that points toward nearby ore vents and can be bought with mining points balance: scanned ore vents can now be found with GPS fix: fixed ore vents missing overlay icon for uranium /🆑 |
||
|
|
6596d75edc |
Gulag Adjustments Two (#82561)
## About The Pull Request I have received feedback that after the prior changes in #81971, the gulag is still a little bit too subject to RNG. The main culprit (as in my previous PR) is Iron being kind of cheap and the fact that unlike the old Gulag you no longer have any way of headhunting more valuable materials (everything appears as boulders on your ore scanner). My solution to this is wider than the last one of tweaking point values, but also much simpler: Just make every boulder you mine be worth the same amount of points regardless of what is inside of it. On the average test I made I could comfortably mine about 40-45 boulders in ten minutes. We'll make some adjustments to that rather than leaving 40 as the target number; Most players upon being teleported to the gulag are going to spend a few minutes whining and bemoaning their fate instead of getting straight to work. I had the benefit of being able to make sure my run started as soon as a storm ended so I wouldn't need any kind of midpoint break. I was also always the only person playing on my local instance, there hadn't been any other pesky prisoners before me who had already mined out all the nearest available deposits. And of course, let us not forget, I am an MLG master league ss13 player who was surely performing well above average. So we'll round that down to: Each boulder is worth 33 points, meaning you need to collect 31 boulders to complete a 1000 point (roughly ten minute) sentence. How do I ensure that every boulder is worth the same amount of points? Well it's pretty easy. One boulder = one material sheet. One material sheet = 33 points. Simple. "Now Jacquerel", I hear you not saying because you don't want me to know about this thing you would prefer to do instead of hitting rocks outside; "if I simply smash all of the tables and microwaves and botany trays and bed in the gulag I can easily get like 65 sheets of Iron, which is almost enough to buy the freedom for two entire people!" Unfortunately I knew you were going to try and do that and the prisoner point machine will only give you points for material sheets which have been printed from the material smelter (well, any material smelter actually but you should probably use the one in the gulag). You'll be able to tell because if you examine a valid material sheet it will mention a little maker's mark on it, which is absent in the beat-up iron that you get from smashing furniture to bits. Also glass is worth 0 points. Don't waste time digging up that shit. As glass has had all of its point value removed, I have added a "work pit" to the gulag to compensate. You can pull boulders out of this indefinitely via effort, however it also stamcrits you every time. It's not very fun to do this, but that's because I would prefer you to go find the rocks out in the field instead. This is a last resort. You can do this if there's no boulders left to mine or if you really really really hate mining and would rather very slowly click on one tile repeatedly to get your boulders instead. As a tiny bonus doing this gives workout experience. This isn't a totally ideal solution but I think it'll do for now. ## Why It's Good For The Game What we want out of the gulag is: - Something where officers can vaguely approximate an expected sentence duration. - A task that requires players to actually be spending that time doing something to get out of here. - Produces at least some amount of useful materials. In I think roughly that order. I hope this change accomplishes all three of these in a way that is somewhat predictable rather than throwing darts at a board. ## Changelog 🆑 balance: Gulag mining has been rebalanced so that every boulder is worth the same amount of points to mine for a prisoner regardless of what it contains, and should be more consistent. add: A vent which boulders can be hauled out of by hand has been added to the gulag which you can use if there's nothing left to mine. It is very slow, but at least it gives you a workout... /🆑 |
||
|
|
8e3f635b98 |
Alt click refactor (#82656)
## About The Pull Request Rewrites how alt click works. Based heavily on #82625. What a cool concept, it flows nicely with #82533. Fixes #81242 (tm bugs fixed) Fixes #82668 <details><summary>More info for devs</summary> Handy regex used for alt click s&r: `AltClick\((.*).*\)(\n\t.*\.\.\(\))?` `click_alt($1)` (yes I am aware this only copies the first arg. there are no other args!) ### Obj reskins No reason for obj reskin to check on every single alt click for every object. It applies to only a few items. - Moved to obj/item - Made into signal - Added screentips ### Ventcrawling Every single atmospherics machine checked for ventcrawling capability on alt click despite only 3 objects needing that functionality. This has been moved down to those individual items. </details> ## Why It's Good For The Game For players: - Alt clicking should work more logically, not causing double actions like eject disk and open item window - Added context menus for reskinnable items - Removed adjacency restriction on loot panel For devs: - Makes alt click interactions easier to work with, no more click chain nonsense and redundant guard clauses. - OOP hell reduced - Pascal Case reduced - Glorious snake case ## Changelog 🆑 add: The lootpanel now works at range. add: Screentips for reskinnable items. fix: Alt click interactions have been refactored, which may lead to unintentional changes to gameplay. Report any issues, please. /🆑 |
||
|
|
995d8e2ee1 |
Fixes a variety of input stalling exploits (#82577)
## About The Pull Request Fixes the following input stalling exploits (maybe missed some): - Changing GPS tag - Setting teleporter destination - Request Console Reply - Various AI law board interactions - Note, I used `is_holding` but technically this means these fail with telekinesis. I can swap them to `can_perform_action(...)`, which allows TK, but I noticed some places explicitly deny TK interactions with Ai law boards. Not sure which is preferred. - Borg Rename Board - Plumbing Machines and Ducts - APCs and SMES terminal placements - Stargazers Telepathy - Go Go Gadget Hat ## Changelog 🆑 Melbert fix: You can't change the GPS tag of something unless you can actually use the GPS fix: You can't set the teleporter to a location unless you can actually use the teleporter fix: You can't reply to request console requests unless you can actually use the console fix: You can't update AI lawboards unless you're actually holding them fix: You can't update a borg rename board unless you're actually holding it fix: You can't mess with plumbing machines unless you can actually use them fix: You can't recolor / relayer ducts unless you're actually holding them fix: You can't magically wire APCs and SMESs unless you're right by them fix: You can't use Stargazer Telepathy on people who you can't see fix: You can't configure the Inspector Hat unless you can actually use it /🆑 |
||
|
|
9723b4b317 |
Replaces even more deciseconds with SECONDS (#82438)
## About The Pull Request
Using these search regexes:
Ending in 0:
`addtimer\((.*),\s?(\d{1,3})0\b\)`
replacement:
`addtimer($1, $2 SECONDS)`
Two digit ending in odd:
`addtimer\((.*), (\d)([1-9])\)$`
replacement:
`addtimer($1, $2.$3 SECONDS)`
Single digit ending odd:
`addtimer\((.*), ([1-9])\)$`
replacement:
`addtimer($1, 0.$2 SECONDS)`
## Why It's Good For The Game
Code readability
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
|
||
|
|
6dc40ca522 |
Standardizes object deconstruction throughout the codebase. (#82280)
## About The Pull Request When it comes to deconstructing an object we have `proc/deconstruct()` & `NO_DECONSTRUCT` Lets talk about the flag first. **Problems with `NO_DECONSTRUCTION`** I know what the comment says on what it should do https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/__DEFINES/obj_flags.dm#L18 But everywhere people have decided to give their own meaning/definition to this flag. Here are some examples on how this flag is used **1. Make the object just disappear(not drop anything) when deconstructed** This is by far the largest use case everywhere. If an object is deconstructed(either via tools or smashed apart) then if it has this flag it should not drop any of its contents but just disappear. You have seen this code pattern used everywhere https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/game/machinery/constructable_frame.dm#L26-L31 This behaviour is then leveraged by 2 important components. When an object is frozen, if it is deconstructed it should just disappear without leaving any traces behind https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/datums/elements/frozen.dm#L66-L67 By hologram objects. Obviously if you destroy an hologram nothing real should drop out https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/modules/holodeck/computer.dm#L301-L304 And there are other use cases as well but we won't go into them as they aren't as significant as these. **2. To stop an object from being wrenched ??** Yeah this one is weird. Like why? I understand in some instances (chair, table, rack etc) a wrench can be used to deconstruct a object so using the flag there to stop it from happening makes sense but why can't we even anchor an object just because of this flag? https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/game/objects/objs.dm#L368-L369 This is one of those instances where somebody just decided this behaviour for their own convenience just like the above example with no explanation as to why **3. To stop using tools to deconstruct the object** This was the original intent of the flag but it is enforced in few places far & between. One example is when deconstructing the a machine via crowbar. https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/game/machinery/_machinery.dm#L811 But machines are a special dual use case for this flag. Because if you look at its deconstruct proc the flag also prevents the machine from spawning a frame. https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/game/machinery/_machinery.dm#L820-L822 How can 1 flag serve 2 purposes within the same type? **4. Simply forget to check for this flag altogether** Yup if you find this flag not doing its job for some objects don't be surprised. People & sometimes even maintainers just forget that it even exists https://github.com/tgstation/tgstation/blob/b5593bc6930cb60803214869a7b94c84e7baa02c/code/game/objects/items/piggy_bank.dm#L66-L67 **Solution** These are the main examples i found. As you can see the same flag can perform 2 different functions within the same type and do something else in a different object & in some instances don't even work cause people just forget, etc. In order to bring consistency to this flag we need to move it to the atom level where it means the same thing everywhere. Where in the atom you may ask? .Well, I'll just post what MrMelbert said in https://github.com/tgstation/tgstation/pull/81656#discussion_r1503086862 > ...Ideally the .deconstruct call would handle NO_DECONSTRUCTION handling as it wants, Yup that's the ideal case now. This flag is checked directly in `deconstruct()`. Now like i said we want to give a universal definition to this flag and as you have seen from my examples it is used in 3 cases 1) Make an object disappear(doesn't dropping anything) when deconstructed 2) Stop it from being wrenched 3) Stop it from being deconstructed via tools We can't enforce points 2 & 3 inside `deconstruct()` which leaves us with only case 1) i.e. make the object disappear. And that's what i have done. Therefore after more than a decade or since this flag got introduced `NO_DECONSTRUCT` now has a new definition as of 2024 _"Make an object disappear(don't dropping anything) when deconstructed either via tools or forcefully smashed apart"_ Now i very well understand this will open up bugs in places where cases 2 & 3 are required but its worth it. In fact they could even be qol changes for all we know so who knows it might even benefit us but for now we need to give a universal definition to this flag to bring some consistency & that's what this PR does. **Problem with deconstruct()** This proc actually sends out a signal which is currently used by the material container but could be used by other objects later on. https://github.com/tgstation/tgstation/blob/3e84c3e6dad33c831ac259f52f2f023680e4899b/code/game/objects/obj_defense.dm#L160 So objects that override this proc should call its parent. Sadly that isn't the case in many instances like such https://github.com/tgstation/tgstation/blob/3e84c3e6dad33c831ac259f52f2f023680e4899b/code/game/machinery/deployable.dm#L20-L23 Instead of `return ..()` which would delete the object & send the signal it deletes the object directly thus the signal never gets sent. **Solution** Make this proc non overridable. For objects to add their own custom deconstruction behaviour a new proc has been introduced `atom_deconstruct()` Subtypes should now override this proc to handle object deconstruction. If objects have certain important stuff inside them (like mobs in machines for example) they want to drop by handling `NO_DECONSTRUCT` flag in a more carefully customized way they can do this by overriding `handle_deconstruct()` which by default delegates to `atom_deconstruct()` if the `NO_DECONSTRUCT` flag is absent. This proc will allow you to handle the flag in a more customized way if you ever need to. ## Why It's Good For The Game 1) I'm goanna post the full comment from MrMelbert https://github.com/tgstation/tgstation/pull/81656#discussion_r1503086862 > ...Ideally the .deconstruct call would handle NO_DECONSTRUCTION handling as it wants, but there's a shocking lack of consistency around NO_DECONSTRUCTION, where some objects treat it as "allow deconstruction, but make it drop no parts" and others simply "disallow deconstruction at all" This PR now makes `NO_DECONSTRUCTION` handled by `deconstruct()` & gives this flag the consistency it deserves. Not to mention as shown in case 4 there are objects that simply forgot to check for this flag. Now it applies for those missing instances as well. 2) No more copying pasting the most overused code pattern in this code base history `if(obj_flags & NO_DECONSTRUCTION)`. Just makes code cleaner everywhere 3) All objects now send the `COMSIG_OBJ_DECONSTRUCT` signal on object deconstruction which is now available for use should you need it ## Changelog 🆑 refactor: refactors how objects are deconstructed in relation to the `NO_DECONSTRUCTION` flag. Certain objects & machinery may display different tool interactions & behaviours when destroyed/deconstructed. Report these changes if you feel like they are bugs /🆑 --------- Co-authored-by: san7890 <the@san7890.com> |
||
|
|
9802508ab9 |
Adds logging to SSore_generation on subsystem initialize (#81488)
This PR adds a new logging category and a logging message specific to
SSore_generation's initialize, logging the number of vents of each size,
as well as the number of random and proximity based ore spawns due to
cave generation and map generation.
Currently drafted as I could use some feedback as to why I'm not seeing
the logger.log() messages not appearing on any of the current in-game
log files 👍
Useful for data logging to determine how many of each type of ore is
spawned on the map, for the purposes of determining how much ore is
being spawned manually over the automatic amounts based on the vents,
with the quantity of ores spawning being a product of the ore vent sizes
being logged as well.
|
||
|
|
b8667c320f |
Ore vent fixes to spawning multiple megafauna. (#81935)
## About The Pull Request Ore vents can now no longer be scanned multiple times to spawn multiple nodes, nor can they be used to duplicate lavaland bosses. Vents now call for a `can_interact` check, as well as against the cooldown timer, which has been moved a bit in the order of operations in order to check things correctly when there's possibly multiple prompts open for starting the defense waves. Additionally, boss waves actually do what they're supposed to do, and don't spawn in a node drone on boss summoning, but instead summon the drone afterwards, which sets up the vent, then takes off visually. This is reflected in the tgui alert before starting waves. ## Why It's Good For The Game Fixes #81817. Improves visual clarity when doing boss vents so that players don't get the wrong idea that they need to protect the drone as well when fighting bosses. ## Changelog 🆑 fix: Ore vents have to be scanned while standing next to them. fix: Menacing ore vents now correctly only spawn in a node drone after the boss is defeated, instead of before. /🆑 |
||
|
|
6b6bd5ce95 |
fix ore vents spawning the wrong wolves and remove simple wolves (#81864)
## About The Pull Request wolves got refactored but the ore vents were still spawning the old versions, this fixes it and removes the old wolves from the code ## Why It's Good For The Game fixes ore vents spawning old wolves ## Changelog 🆑 fix: fixes ore vent spawned wolves being untammable /🆑 |
||
|
|
df2ce692ee |
General maintenance for all things boulder related. (#81358)
## About The Pull Request **1. Qol** - Adds screen tips & examines for screwdriver & crowbar acts on BRM, Refinery & Smelter - Adds examines to display number of boulders stored inside a refinery & maximum number of boulders it can hold. Right click screentip to remove boulders - Adds examines to display maximum number of boulders than can be teleported by a BRM & screentips for interacting with wires - More audio & visual feedback for refinery processing. If a boulder requires multiple steps you will get a balloon alert saying "crushing" for refineries & "smelting" for smelters along with a sound per process tick(which is every 2 seconds so no need for cooldown) giving you a better idea of what's happening in the pipeline - BRM now will display all lights when the "Automatic boulder retrieval" is on & turn off the lights when disabled along with examines giving you a visual indicator of its state **2. Code Improvements** - Splits types of boulders into its own file `boulder_types.dm` for easy maintainability - Moves beacon for refinery machines into its own file `boulder_processing/beacon.dm` for easy maintainability - Moves the cooldown for processing a boulder `processing_cooldown` into the refinery machine itself. Since 100's of boulders can be created per round this var can take up memory quickly so by moving them into the refinery machine it gives us some savings - Compressed & merged procs such as `create_mineral_contents()` , `flavour_boulder()` etc with the vent code. These procs were only used by the vent 1 time & by merging the code we removed if conditions to check if a parent vent was passed or not(since now that's always the case). Helped in removing boilder plate code **3. Fixes** - **Fixes vents always spawning "Small size boulders" & not medium, nor large boulders.** Once a vent generates a boulder it calls `flavour_boulder()` https://github.com/tgstation/tgstation/blob/084f56938c0169aeeee0b5f41453f31d072f3f67/code/game/objects/structures/lavaland/ore_vent.dm#L385 however this proc also accepts 2 more params `size` which would always default to `BOULDER_SIZE_SMALL` and `is_artifact` which is simply unused in the proc https://github.com/tgstation/tgstation/blob/fb83617ff94d6294b0d48c8c6c57488237508d11/code/modules/mining/boulder_processing/boulder.dm#L219 Therefore vents would always generate small boulders giving us no varity. Now the boulder size is set depending on the vent size & durability for each boulder is set to a random value between 2 & the boulder max size giving us the flavour we actually wanted - **Fixes "Expanded Gulag boulders" using "normal gulag material list" when setting its custom materials.** If you look at the `add_gulag_minerals()` proc it always picks from the `gulag_minerals` list & accepts no params https://github.com/tgstation/tgstation/blob/fb83617ff94d6294b0d48c8c6c57488237508d11/code/modules/mining/boulder_processing/boulder.dm#L235-L236 So when we try to pass params to this proc which in reality doesn't accept any we were wasting our time doing this https://github.com/tgstation/tgstation/blob/fb83617ff94d6294b0d48c8c6c57488237508d11/code/modules/mining/boulder_processing/boulder.dm#L274 And for our case `expanded_gulag_minerals` list was simply unused because our proc doesn't care about it and it went back to just using `gulag_minerals` list thus ignoring our list https://github.com/tgstation/tgstation/blob/fb83617ff94d6294b0d48c8c6c57488237508d11/code/modules/mining/boulder_processing/boulder.dm#L282 As i said in the "Code Improvement` section when i moved boulder types into it's own unique file this was fixed & now expanded gulag boulders actually has a chance to spawn with bluespace crystals inside them - **Fixes manual tapping of ore vents by hand not using a cooldown** `produce_boulder()` accepts a cooldown var for when you need to manually tap the vent by hand. https://github.com/tgstation/tgstation/blob/e8b5b52d54a60b651d72e610cfb35a237aef6efe/code/game/objects/structures/lavaland/ore_vent.dm#L374 This var was always set to FALSE because we never passed `TRUE` into it. Not once here https://github.com/tgstation/tgstation/blob/e8b5b52d54a60b651d72e610cfb35a237aef6efe/code/game/objects/structures/lavaland/ore_vent.dm#L124 Nor here https://github.com/tgstation/tgstation/blob/e8b5b52d54a60b651d72e610cfb35a237aef6efe/code/game/objects/structures/lavaland/ore_vent.dm#L131 Now we just pass `TRUE` so tapping these vents by hand have a cooldown - **Fixes BRM off icon state never being used** When the room ran out of power it would still look on. Now we use that state correctly - **Fixes Automatic Boulder Retrieval by the BRM not actually being automatic** You must have noticed that once you do "Right click" and wait for all the boulders it can teleport (determined by `boulder_processing_max`) to be teleported it stops permanently after that. Even if more boulders get generated it won't do anything, You have to again "Right click" & retoggle automatic boulder retrieval on again, thus forcing someone to stand there & monitor the BRM Now once you set Automatic Boulder Retrieval on you can leave & forget. It will teleport boulders as & when available thus enabling automation properly. - **Fixes boulders ejected from refineries via right click from getting teleported back into the machines loc** Fixes https://github.com/tgstation/tgstation/pull/78524#issuecomment-1911666995. The problem is refinery machines & the BRM keep track of all the boulders that entered into it via the `boulders_contained` list. Now we directly check `contents` for boulders so we don't have to maintain 2 seperate lists to keep track of boulders. It also now uses `processed_by` var of boulders to ensure refinerries don't retake in the same boulder it just processed. Not sure where exactly the problem got fixed but implementing these 2 measures fixed it regardless. - **Fixes boulders with 0 durability[a.k.a steps] from getting ejected out** Fixes https://github.com/tgstation/tgstation/pull/78524#issuecomment-1914551952. So inside `process()` we constantly decrease the durability of the boulder till it becomes 0. https://github.com/tgstation/tgstation/blob/0a496f180c627b9de26d3982d775cbf323fbc459/code/modules/mining/boulder_processing/_boulder_processing.dm#L159 When it reaches 0 it calls `breakdown_boulder()` https://github.com/tgstation/tgstation/blob/0a496f180c627b9de26d3982d775cbf323fbc459/code/modules/mining/boulder_processing/_boulder_processing.dm#L164-L165 This proc has a chance to reject the boulder if it could not process any materials https://github.com/tgstation/tgstation/blob/0a496f180c627b9de26d3982d775cbf323fbc459/code/modules/mining/boulder_processing/_boulder_processing.dm#L219-L222 **"Without resetting its durability"** over here https://github.com/tgstation/tgstation/blob/0a496f180c627b9de26d3982d775cbf323fbc459/code/modules/mining/boulder_processing/_boulder_processing.dm#L241 So it ends up rejecting a "0" or worse -1 durability boulder. Now we set the durability in `remove_boulder()` so regardless of what circumstances the boulder is ejected it always gets a positive durability - **Fixes BRM & Refinery from rapidly spitting out boulders in their loc which causes lag in the long terms** Fixes #81404. Basically even if there is 1 boulder sitting at a BRM's loc or an refineries loc. Operations are haulted i.e. the BRM will not teleport any more boulders & the refinery will keep their already processed boulders inside till their locs are cleared from boulders. This prevents large number of boulders from pilling up in long rounds - **[Priority : High] Fixes refineries incorrectly removing materials from processed boulders** Fixes #81109. This bug is quite serious because it can't literarily affect any random item with custom materials in game. This one line of code over here can break the entire material economy as we know it https://github.com/tgstation/tgstation/blob/0a496f180c627b9de26d3982d775cbf323fbc459/code/modules/mining/boulder_processing/_boulder_processing.dm#L217 **"DONT DO THIS"**. The `custom_materials` list is a **"read only"** list & if you ever want to change it call the `set_custom_materials()` proc with your new values but do not edit this list manually as it is done here. All lists related to materials are cached by the `SSmaterials` subsystem. List values are cached & shared across multiple objects so when you edit those values like here, you might end up effecting an item/multiple items in some random corner of the map that shares this list. This also causes boulders with empty list of materials to get spawned at random so yeah again plzz don't do this **4. Refactors** - Repathes `obj/machinery/boulder_processing/brm` -> just `obj/machinery/brm`. Even though semantically it looks nice that the brm is a subtype of `obj/machinery/boulder_processing` from a code & operation perspective they have 0 similarities. 1) The BRM does not accept boulders feed into it from a conveyer belt unlike a refinery but instead picks boulders from `SSore` subsystem & put it on the conveyer belt. This means procs for accepting boulders such `CanAllowThrough()`, `breakdown_boulder()`, `accept_boulder()` etc have no use in the BRM. Their just code clutter at this point 2) The BRM overrides `process()` & does not call its parent proc making that code wasted 3) It has no use for silo materials & mining points making those vars go to waste With so much wasted code its better to just let go off all of it & just make it a basic instance of `obj/machinery` making maintainence easy - BRM now teleports boulders in a batch (batch size determined by `boulders_processing_max` max value from upgraded parts is 7) with a boulder appearing every 1.5 seconds rather than spawning all at once. After a batch is processed it has a cooldown of 3 seconds before repeating the process if automatic boulder retrieval is on. This stops the conveyer belt from getting crowded with boulders and makes the refining process more efficient. With this BRM wires are removed because only it had only 1 wire responsible for toggling boulder retrieval but now since this process is automatic, we have true control over the timing of boulders spawned & don't want to leave it in the hands of players ## Changelog 🆑 qol: adds examines & screentips for crowbar, screwdriver acts to BRM & refinery machines qol: adds examines about the number of boulders stored & processed to BRM & refinery machines qol: BRM now has its lights turn on/off depending on wether automatic boulder retrieval is on/off for visual clarity along with examines qol: refinery machines now display ballon alerts & plays sounds more frequently when processing boulders for better feedback fix: vents now spawn boulders of all sizes & not just small ones fix: expanded gulag boulders now have correct materials in them. fix: manual tapping of vents now has a cooldown applied as intended. fix: BRM has its light turned off when area power goes off fix: boulders ejected from refineries by hand no longer teleport all over the place occasionally. fix: refineries no longer eject boulders with 0 durability fix: Boulders & refineries no longer pile up on top of BRM's & refineries in long rounds. Their locs have to be clear of boulders before they spit out more boulders to prevent a large pile of boulders from causing lag fix: sheets ejected from lathes no longer get rejected when inserted back which could happen at random, no more boulders with empty materials code: splits boulder types into its own file along with other items code: merges & autodocs procs, vars related to boulders refactor: repaths BRM to a simpler subtype refactor: BRM now spawns boulders in batches(batch size can be increased with upgraded parts) with a boulder appearing every second. After a batch is processed a 3 second cooldown is applied to stop the conveyer belt from clogging up, With this BRM wires are removed as there is no need for timers to be attached to wires which intefers without our batch processing timings. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |