mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-12 18:51:53 +00:00
c080b83c41c5a6fb30eb519449e8365200b51ee4
331 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ca6bd55664 |
Revert #92696: "Refactor split personality to use temporary body component and client switching" (#93258)
## About The Pull Request IDK if temporary body is broken or split personality is broken but it seems like this code simply doesn't work, as split personalities are consistently being ghosted and forced DNR ## Changelog 🆑 Melbert fix: Blackout drunk / Split personality no longer ghosts you /🆑 |
||
|
|
a2c7c8e57b |
Heretic Antagonist Full Overhaul. (#92119)
## About The Pull Request Heretic has received a complete overhaul. This PR touches nearly every aspect of the antagonist. For readability's sake, not every change is going to be listed in this pull request. For the full list of changes please refer to the design doc: https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g. Code by Me, @Xander3359 and @Arturlang TGUI by @Arturlang Sprites by OrcaCora and GregorDM Writing bits by @necromanceranne ### Core changes - Cross-pathing has been removed. Main knowledge spells are now exclusive to their path (for the most part). - For every main knowledge unlocked (save for the robes and the blade upgrade), Heretics can choose one option from a draft of 3 random side knowledges (this is a free point). - Heretics can now purchase side knowledges from a new tab, the "Knowledge Shop". Side-knowledges have been divided by tier (Stealth, Defense, Summons, Combat and Main). Tiers are unlocked as you progress toward your main path. - Heretics now gain the grasp and mark upgrade immediately, but their main knowledge choices cost twice as much (except for the first spell, the robes and the blade upgrade). - Path specific robes have been introduced! They come with their own set of quirks. - Each Path has received a passive ability. This passive is upgraded when you first create your robes, and again when you complete the Ritual of Knowledge. - Paths have been rebalanced as a result of the removal of cross-path progression. Cosmic and Moon paths have received soft reworks. - Upon unlocking the path 2nd level or reaching a total of 8 points worth of knowledge, Heretics will lose the ability to blade break (and the limit on blades all together). - Ascension now automatically calls the shuttle with no possibility of a recall. - Late join Heretic has been removed. ### New UI <img width="750" height="635" alt="moon path ui" src="https://github.com/user-attachments/assets/184ef783-5c9c-48a1-a2f7-4807ca93e990" /> ### Knowledge shop <img width="787" height="669" alt="Knowledge shop" src="https://github.com/user-attachments/assets/3dc89b84-8c70-4d47-b612-54396e3ea6e7" /> ### Quality of life //General balance changes - Heretics will now gain X-ray vision for a few seconds when nearby an eldritch essence (this effect has a cooldown). - Ritual of knowledge now requires 1 uncommon item instead of 2. You may now use a stunprod instead of a baton to complete the ritual. Beartraps have been removed from the list of possible reagents. - The maximum number of possible sacrifices required to ascend has been reduced from 6 to 5 while the minimum has been upped to 4. - Codex Cicatrix no longer requires a special pen to be made. ### Passive abilities - Heretics now start with a passive ability. You can find what it does on the path info tab after a path has been selected, and what they gain when upgraded. - Crafting your first set of Eldritch robes will bump your passive to level 2. - Unlocking the 2nd level will subsequently unlock your "Ritual Of Knowledge" - Completing the ritual of knowledge or ascending will net you the final level. ### Path Specific Robes - Armorer's Ritual is no longer a side knowledge. Each path will have their own unique version of the ritual. This is placed after the 2nd spell in the tree. - Robes can no longer be destroyed by fire and acid, grant t4 flash protection (Moth Heretics stay winning) and protection against basic syringes, to bring them on par with other antagonist's armor sets. - The recipe to craft the robes is now a set of armor/vest, a mask (any mask will do now, not just gas masks), plus the unique reagent required for the blades (Plasma for Cosmic, Trash For Rust, match for Ash and so on) - Wearing the robes as a non-heretic may yield some unfortunate side-effects. ### Moon Path Rework Moon path rework. Moon Heretics gain immunity to brain traumas and slowly regenerate brain health. Equipping the moon amulette channels its effects through the moon blade; making it unblockable and cause sanity damage instead of brute. Ring leader's Rise now summons an army of harmless clones that explode when attacked; the explosion briefly stuns non-heretics and cause sanity and brain damage to them. Moon blade can also now be used when pacified and Moon spells are no longer blocked by regular anti magic, only mind magic protection. **Cosmic Path Rework** Cosmic path has received the biggest batch of changes alongside Moon. The path has been dead last in ascension and pickrate (less than 5%) for almost 2 years. It did gain some popularity over the last few months, reaching the highest ascension rate in the game (12%) while mantaining a relatively low pickrate. Cosmic sits in a weird spot, where pretty much every knowledge surrounding the path is either mediocre or, in the case of the ascension, dysfunctional. Yet it has maintained a smidge of relevancy due to how quickly Cosmic heretics can capture and sacrifice targets thanks to Star Touch. As a result, the best course of action would be to rebalance the entirety of the kit; granting the heretic more tools to manipulate space and dictate the flow of a fight, while lessening their ability to end a confrontation by instantly sleeping their opponents. lastly The Star Gazer is now ghost controlled ; And they shoot lazers! <img width="636" height="451" alt="gazer gag 3" src="https://github.com/user-attachments/assets/601d6881-c042-4e42-8ce6-ac90cd27848b" /> ## Why It's Good For The Game ### Ok...but why do we want this? Again, if you want my full reasoning, please check my doc https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g. To keep it short and concise; Heretic is too complex and unintuitive for its own good. Too impenetrable for new players and too abusable for experienced players. This can be chalked up to a lot of poor design decisions. But ultimately, what I believe being the biggest contributor to the current status of Heretic is the ability to move into different paths, also known as "Cross-Pathing". ### Cross Pathing my beloathed. Cross-pathing, while cool in theory, overcomplicates the antagonist and overloads them with power. Players dealing with the heretic are incapable of working out what a given heretic can do. This also leads to late game heretics having 3 rows Worth of action buttons and virtually no weakness. Over the last year, I've often received the understandable but also kind of unfair accusations of making Heretic too powerful without a clear aim or purpose. My goal with the paths I've reworked over the last year (Rust,Void and Blade) wasn't necessarily to just make them stronger (although that was also part of the goal, as they were paths that were underperforming), but for them to have more interactions with the sandbox and to better live up to the fantasy presented to the player. If an harbringer of frost gets countered by a cup of coffee, we probably messed something up. Unfortunately, the current incarnation of Heretic doesn't really allow for surgical balance changes to specific paths. Every time a knowledge gets buffed, we make every path that can easily tap onto that knowledge stronger by default. It doesn't take a genius to understand why this system is ultimately unsustainable. ### Blade Breaking I feel that after a heretic has reached the near peak of their power, they no longer need the ability to instantly escape any encounter. Check my doc for my full reasoning. ## Less versatile, more specialized paths. By removing cross-pathing, we remove a huge maintainability burden from the antagonist. Paths can now be designed around clearer strengths and weaknesses. They become easier to balance and less of an headache to understand for everyone. It also means we can give paths some needed quality of life quirks without having to worry how such a change might have a knock-on effect for other paths. Ash heretics can finally let loose without dying by their own flames. Cosmic Heretic can go to space without having to carry a modsuit. Moon Heretic can use their abilities without fear of one random trauma ruining their day, and so on. ### What a horrible night to have a curse...., wait how do I curse people again? As of right now the heretic tree has quite a hefty amount of trinkets that pretty much never see use. Partly because the tree itself is a nightmare to navigate. And partly because why would anyone set up an elaborate plan or scheme when they can unleash 2 rows of spell in the span of bunch of seconds. Heretics mostly gravitate towards powers that push them towards greater, more potent combat strength. If it doesn't contribute to killing people quicker, it isn't worth doing for most. And given the opportunity cost associated for taking those powers, they will remain that way so long as there are better choices to be poached. The new draft system encourages Heretics to play more with the tools at their disposal. If you want to go for a specific combo from the side path options, you may now do so by tapping into the knowledge shop. Yes, the shop does include a few knowledges from the other paths. But these are limited to 1 per path, are very expensive and can only be unlocked very late into the shift. ## Drip Of the Mansus The iconic heretic robe is actually sequestered to a side path that is most easily access by only two paths at a time. Since heretic paths are being made to be much more specialized, the most obvious way in which this can be showcased is through an easily identifiable outfit. By using the robes, we can both telegraph WHAT heretic you are looking at, and just how much power they've accumulated and when it is reasonable to take the kid gloves off and treat them as a genuine threat. If a heretic is in their robes, that heretic is now a significantly more prominent danger to the station. It also serves as a useful means for gating some of the more powerful effects of a heretic's path behind the robes, AND enable options for disarming them of that power should they be captured without making it something endemic to their mob. A major problem with heretics is a lack of certainty as to how powerful they have become. A heretics robes is one of the milestones to help players dealing with heretics identify that. ### Will this be 100% fair and balanced? This is a massive overhaul to a pretty complex and bloated antagonist. I've done my best to show the changes to several maintainers and other members of the community for their feedback. But at some point we'll have to see how this behave in the environment to get a feel if something is over or undertuned. (that's my way of saying, yes this is likely gonna require a testmerge or two). What I will say is that I'm not trying to change the core identity of Heretic. Heretics should have the upperhand in single encounters early on, be able to joust a small group of players after they unlock their final spell, and end the round when they ascend. They're a progression antagonist. They should retain their payoff as well as pose a danger as they grow stronger. But if more players feel like they are more reliably able to play the antagonist in more varied and interesting ways, rather than the antagonist largely existing as a measuring stick for 'robustness' due to its elitist design philosophy, then the rework has been a success. There should be something for everyone in the antagonist, as is true for all of our antagonist roles. |
||
|
|
0204ab8fdd |
Canreach refactor (#93165)
## About The Pull Request ports https://github.com/DaedalusDock/daedalusdock/pull/1144 ports https://github.com/DaedalusDock/daedalusdock/pull/1147 full credit to @Kapu1178 for the juice instead of `reacher.CanReach(target)` we now do `target.CanBeReachedBy(reacher)`, this allows us to give special behavior to atoms which we want to reach, which is exactly what I need for a feature I'm working on. ## Why It's Good For The Game allows us to be more flexible with reachability ## Changelog 🆑 refactor: refactored how reaching items works, report any oddities with being unable to reach something you should be able to! /🆑 |
||
|
|
3ea7b03369 |
Accentuate the positive with **Personality**: A (soft) mood rework (#92941)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> |
||
|
|
d87637e6ab |
Adjusts easing in places where EASE_IN/OUT was applied without a curve. (#92976)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> |
||
|
|
4a618934e9 |
Removes message arg from Hear, free performance (#93020)
## About The Pull Request The first argument of `Hear` is `message`, the message heard OR SO YOU'D THINK Actually the first argument doesn't do anything but get overridden by ALL implementations of `Hear` No other uses as far as I and Ephe can tell. Removing it makes it a ton easier to understand and gives us some free performance in radio code by not rendering messages twice ## Changelog 🆑 Melbert code: Removed some redundant code from core hearing code. Report if you hear anything weird. /🆑 |
||
|
|
d2f34e33be |
moves abstract_type up to datum, spawners wont spawn them (#92909)
## About The Pull Request moves all implementations (im aware of) for "Im a parent type dont spawn me please" to the datum layer to standardized behavior adds a standerized proc for filtering out "bad" items that we dont want spawning. applies to it the subtype vendor, gifts, and a new spawner and mystery box for a random gun (neither playerfacing) "port" of https://github.com/shiptest-ss13/Shiptest/pull/4621 https://github.com/user-attachments/assets/22f6f0b2-b44e-411a-b3dc-6b97dc0287aa small warning: I dont have EVERY abstract type defined right now but, ive done a good enough job for now. Im tired of data entry rn ## Why It's Good For The Game standardizing behavior. Might be a micro hit to performance however having this lets us not rely on icon state to determine whether something is a parent type and makes it much easier to tell something is a parent type (could be applied further to things like admin spawning menus and things like that). need feedback on if this is actually good for the game. ## Changelog 🆑 add: Soda cans show up in the silver slime drink table. add: Examine tag for items that are not mean to show up ingame. refactor: Standardizes how gifts rule out abstract types. fix: gifts no longer check if something has an inhand, massively expanding the list of potential items. /🆑 |
||
|
|
6646b55946 | [No GBP] fix for null.ghostize() (#92815) | ||
|
|
f9fcb13752 |
Refactor split personality to use temporary body component and client switching (#92696)
This adds the temporary body component to split personality and its children This should ensure that once split personality ends, the original mind will return again and the ghost will be ghosted fix #80212 and potentially #81256 |
||
|
|
260960d6f4 |
Converts a bunch of time/delay vars to use time defines (#92495)
## About The Pull Request Converts as many time vars expressed in deciseconds as I could find to use time defines. ## Why It's Good For The Game Makes these values neater and more readable. ## Changelog 🆑 code: Converted a lot of time-based variables to be expressed with time defines. /🆑 |
||
|
|
089c6a8f94 |
Refactors say modes and custom say verbs. Extends custom say verbs to more situations, forwards more spans. (#92127)
## About The Pull Request Oh man, so this entire pr started because of two things: 1. A kinda hacky fix to #92123 that got closed a good while ago. 2. A borg I know mentioning you can't do custom say verbs over robotic talk. Which subsequently led me down this rabbit hole of say modes and custom say verbs. So! The most wide-reaching thing this does is merge the custom say verb/radio emote logic that used to be specialcased in `compose_message(...)` into `say_quote(...)`, renaming this to `generate_messagepart(...)` with its new functionality. This means things that don't use the exact same chain as living things talking normally can still generate custom say verbs if given that message modifier. Then, we split up say modes into a "can we do this" and "try to do this" check to reduce conflicts (like #92123), and forward more of our data to the latter. This allows us to then edit the say modes to actually make use of that data, and with the previous addition of `generate_messagepart(...)` allow for custom say verbs to be used. In doing this I realized the logging was kind of awkward and all over the place, so we create the new logging helper `log_sayverb_talk(...)` which handles selecting how we should log things based on the given message modifiers. For better or worse I forgot about this pr for a few weeks, so I don't perfectly remember all the details, but those are the big key parts. ## Why It's Good For The Game Fixes #92123. I think custom say verbs are some of the best flavour we have for talking over radio, and any situation benefits from that being possible. It's great to be able to tap your microphone, and it's hilarious for an AI to be able to emote beaming an image directly into the heads of their borgs over robotic talk. The rest is mostly cleanup. |
||
|
|
05982ba29a |
Recovered Crew are in spawner menu (#91986)
## About The Pull Request  Added recovered crew to the ghost role spawner menu. Clicking spawn will make you orbit the recovered crew body. https://github.com/user-attachments/assets/326856c4-e306-43fd-b7d6-a8d5554a0e81 Orbiting the body will make it twitch a little to indicate to coroners/MD's/roboticists that you're ready to be revived. ## Why It's Good For The Game Getting people to actually play the recovered crew is kinda hard on most rounds :( . First on my list is to make the process more convenient for everyone. By adding it to the ghostrole spawner menu, ghosts can quickly see if bodies are available if they wish to play as one. Making them twitch when orbited makes it so the people reviving them don't have to revive them every few minutes in the case someone wishes to join as them (they still might, it does get more attention). I think the twitching effect is the best natural indicator that someone wishes to join without being too OOC. I can imagine doctors being a little confused at first, but it should click pretty quickly. I am not too concerned about it being used as a ghost communication medium. The spectroscopic sniffers are a more convenient tool for this, and I don't think I've seen someone do it with them. ## Changelog 🆑 add: Recovered Crew have been added to the ghostrole spawner menu add: Orbiting Recovered Crew corpses will make them twitch to indicate a soul is available /🆑 Giving them straight up superpowers or more aggressive antag rolls is still something I'm considering. We'll see if/when I decide to do it --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
aac161bce9 |
Allows blocking language speech and comprehension separately (#91884)
## About The Pull Request There was a PR I wanted to make, but one of the features I wanted the addition to have was for an affected mob to only speak aphasic, but understand whatever languages they'd normally be able to understand. This, in turn, required refactoring language holders to separately block language speech and comprehension. This change, I decided, would be good to split into its own PR. ## Why It's Good For The Game Allows more fine-grained control over what languages an atom is blocked from speaking or understanding. This will be useful for future PRs or admin events. ## Changelog no player-facing changes |
||
|
|
35494b93bb |
Telecomms Update: Ability to change existing radio channels and create new ones (#91647)
## About The Pull Request I have added the ability to create and edit station radio channels through the existing telecommunications system. You can change the name of the radio channel and its color. The channel settings are changed and created through the servers (Frequencies Settings)  Here i created my own channel: 1) Add frequency at Receiver (you will not see channel name):  2) Add frequency at Bus (you will not see channel name):  3) Add frequency at Server 4) Add settings for your frequency  5) See the result:  Important Notes: 1) Headsets, radios, and intercoms will not see a change in telecommunications, but will use standard names (Common, Security etc.). 2) There are still reserved names that cannot be used: CentComm, Syndicate, Uplink, CTFs channels 3) Servers must filter frequency for applying settings on them ## Why It's Good For The Game Now telecommunication channels names and colors depends on the settings of the network servers, which makes it more flexible and logical. It is also useful for foreign language servers, as you can translate channel names. ## Changelog 🆑 add: Added ability to change existing radio channels and create new qol: Added color for some buttons in Telecomms UI /🆑 |
||
|
|
10d15ef948 |
[NO GBP] Fixes narcolepsy's sleep_chance var not resetting (#91801)
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> |
||
|
|
cbeda3651e |
Small blackout qol (#91604)
## About The Pull Request Now when you blackout your drunk-value will be capped at 51 so that your liver does not die while the drunkard personality is controlling the body ## Why It's Good For The Game I saw that liver failure has removed alot of the fun from being blackout drunk both as the drunkard and the original personality as they die from liver failure. There will still be consequences from having tons of alcohol in you but at least you will feel it after the blackout, which i think is very fitting. |
||
|
|
4db41ed99a |
Changes the eldritch painting effects from a brain trauma to a status effect. Large doses of holy water can remove the effect early, and it protects you from inflictions while in your system. (#91496)
## About The Pull Request What it says on the tin. Inflicts status effects instead of brain traumas. Needs a large dosage (somewhere around 50 units, I don't think the code comments are accurate about the dosage) to remove the status effect. Having any amount of holy water in your system prevents the paintings from inflicting its status effect on you. ## Why It's Good For The Game So I had a little event involving these paintings, and I...vastly underestimated just how horrifically disruptive these paintings can be and how few options you have to deal with them adequately if there are a lot of them around. They can do some serious damage. They probably don't exactly see much use, not because of their lack of effectiveness, but because they simply do not push the heretic closer to victory. Most heretics ignore these kinds of 'sabotage' tools because they're slow like that. But if someone is particularly eager to use them, they might make enough of a mess to, say, force a shuttle call early as the station rusts mysteriously all around them and everyone starts to crater in sanity. (moon heretics would love that if they weren't speedrunning ascension) So, traumas suck and also resolving the trauma does not necessarily give you the means to stop getting more traumas or deal with future traumas while dealing with the paintings, Holy water is already a tool for dealing with magical stuff, but in of itself it is not necessarily immediately sourcable unless there is a chaplain, or botany or cargo has been on ball. So it still reliant on someone else to help combat it than just some random joe shmoe with a wirecutter. I think this is mostly net neutral balance wise enough to be considered 'quality of life' if only that it makes engagement better while still being largely as impactful as it ever was due to the fact people will likely still suffer/inflict damage on the station from coming into contact with the painting, as well as the removal still taking an amount of time and a large dosage of holy water, all the while the effect still takes place. ## Changelog 🆑 qol: Eldritch paintings no longer inflict brain traumas on you that need surgery to remove. Instead, they inflict a status effect that can be protected from and removed using large doses of holy water. /🆑 --------- Co-authored-by: Jacquerel <hnevard@gmail.com> |
||
|
|
2490b303e3 |
Reduces ghost poll time for blackout drunk (#91497)
## About The Pull Request Reduces the time spent selecting ghosts for the "blackout drunk" effect from 20 seconds to 10 ## Why It's Good For The Game Your average person who triggers the "Blackout Drunk" effect (where another player is put in control of their character) is roughly 45 seconds away from dying of liver failure (number I pulled out of my ass) or at least getting knocked out for a long time due to the amount of alcohol in their blood 20 of those seconds are spent polling for ghosts, meaning that the length of time between someone else assuming direct control and the character becoming permanently unconscious is frequently not really long enough for them to do anything funny You know when clicking this role that you're signing up for a good time not a long time, but I think that also means people probably don't need to think too long about whether they want to play it or not, so halving the selection time gives you a full 10 seconds more time to tell everyone in the bar that they're your best friends Regular Split Personality traumas aren't so time critical and can continue to enjoy a lengthier selection process to possibly gather more candidates ## Changelog 🆑 qol: ghost candidates for blackout drunk are selected more quickly /🆑 |
||
|
|
53f84b5e51 |
minor deathmatch fixes (#91192)
## About The Pull Request split personality may not roll if the target is in a deathmatch area bolt of possession deals 25 brain damage if the target is in a deathmatch area (8 hits for brain death) removed a camera from the meta brig map Disciple of Pete has 9 tile range signalers instead (that nobody uses anyway lmao because you cant use them for minibombs or the other grenades) ## Why It's Good For The Game fixes #91171 fixes #90912 fixes #89212 ## Changelog 🆑 fix: removed a camera from the deathmatch meta brig map, disciple of pete has low-range signalers, deathmatch bolt of possession deals brain damage instead, split personality may not roll in deathmatch /🆑 |
||
|
|
429a70ce4f |
Narcolepsy quirk (#91184)
## About The Pull Request This is a PR I made a while ago for downstreams, and it has become my favorite negative quirk to play with. It grants your character a slightly more forgiving version of the narcolepsy trauma, as it has lower odds of making you snooze plus a bonus list of reagents that will suppress symptoms (`modafinil` and `synaptizine` for now), and cares about if you are caffeinated, (have `trait_simulated`). The rate at which you fall asleep/get drowsy is appropriate in my opinion, though I could understand if players would want it to be more common.  ## Why It's Good For The Game Really fun quirk to play with, adds more risk to your gameplay. Use your over-the-counter stimulants to try and win from a stun baton. ## Changelog 🆑 add: Adds Narcolepsy as a -8 negative quirk! refactor: Slightly adjusts the logic of the narcolepsy trauma balance: The narcolepsy trauma its symptoms can now be softened by being caffeinated, and modafinil or synaptizine suppress it entirely /🆑 |
||
|
|
37ec7f8054 |
Changes all uses of notify_ghosts to use the real names of mobs (#90919)
## About The Pull Request Quite simple - this changes every direct mention of a mob in a `notify_ghosts` message to use `[mob.real_name]` instead of just `[mob]` ## Why It's Good For The Game makes things less confusing - ghosts can see easily their actual identity anyways, so it's not like there's much of a reason _not_ to do this. ## Changelog 🆑 qol: Ghost notifications will now use the real names of mobs when something happens (i.e no more "Unknown has completed an ascension ritual!") /🆑 |
||
|
|
7eca9a710e |
Custom emotes actually use +|_ emphasis formatting, your own emotes don't trip highlights (#90858)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. --> <!-- You can view Contributing.MD for a detailed description of the pull request process. --> ## About The Pull Request So I was running into the bit where custom emotes actually don't get the `+|_` emphasis formatting applied to them, _except_ for the runechat portion which *does*. This felt annoying, especially given I've seen a lot of people try it and have it not work. Add to that that your own emotes would keep getting highlighted, blotting out other people mentioning your highlighted messages, and here's this pr. In this pr we add a few flags to audible/visible messages, `WITH_EMPHASIS_MESSAGE` and `BLOCK_SELF_HIGHLIGHT_MESSAGE`, which respectively apply emphasis formatting and block highlighting the message to oneself. We're doing this with flags because I felt always applying this would be unnecessary. Most audible/visible messages won't need to check for formatting, and quite a lot we *do* want to be highlighted. As such, we apply these flags as need be. For emotes we do this by having `get_message_flags(intentional)`, which applies `BLOCK_SELF_HIGHLIGHT_MESSAGE` based on whether the message is intentional, and on the custom emote subtype applies `WITH_EMPHASIS_MESSAGE`. Because it's not just for _say_ anymore, and already was also used for emote runechats, we rename `say_emphasis(input)` into `apply_message_emphasis(input)`. We additionally move it down to `/atom` from `/atom/movable`, such that visible/audible messages can in fact call it. That resolves our issues. We also apply `BLOCK_SELF_HIGHLIGHT_MESSAGE` to sign language tone messages, as they're essentially a part of speech. <!-- Describe The Pull Request. Please be sure every change is documented or this can delay review and even discourage maintainers from merging your PR! --> ## Why It's Good For The Game Being able to do `+|_` emphasis formatting on your emotes is nice, I've seen a lot of people try it and have it not work. Especially weird given it DOES apply to the runechat message, just not the text chat message. It's annoying when your own emotes trip your own highlights! Like if you have a name highlight, your own emotes getting constantly highlighted would blot out other people talking to you. So having your own emotes not trip it just like your own talking makes that less of a pain. But sometimes emotes are forced, and in that case I think it's better to keep the highlight because it's just like other people's messages information the player might want to be notified of. Generally, I think if it's the player's input it probably shouldn't be highlighted, while if it isn't the player's input it probably should. There's no need for us to ever highlight our own sign language tone messages, because they're essentially a part of our talking. <!-- Argue for the merits of your changes and how they benefit the game, especially if they are controversial and/or far reaching. If you can't actually explain WHY what you are doing will improve the game, then it probably isn't good for the game in the first place. --> ## Changelog <!-- If your PR modifies aspects of the game that can be concretely observed by players or admins you should add a changelog. If your change does NOT meet this description, remove this section. Be sure to properly mark your PRs to prevent unnecessary GBP loss. You can read up on GBP and its effects on PRs in the tgstation guides for contributors. Please note that maintainers freely reserve the right to remove and add tags should they deem it appropriate. You can attempt to finagle the system all you want, but it's best to shoot for clear communication right off the bat. --> 🆑 add: When performing a custom emote, `+|_` emphasis formatting applies to the text chat message instead of just the runechat message. qol: Intentional emotes don't trip your own highlights. qol: Sign language tone messages don't trip your own highlights. /🆑 <!-- Both 🆑's are required for the changelog to work! You can put your name to the right of the first 🆑 if you want to overwrite your GitHub username as author ingame. --> <!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. --> |
||
|
|
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. /🆑 |
||
|
|
7f808bcec6 |
Fix flaky hard delete related to wound-induced brain traumas (#90751)
## About The Pull Request Brain traumas caused by head wounds are stored as a reference on the wound, but certain brain traumas (like split personality) `qdel` themselves in `on_gain()` if conditions aren't valid for them to exist, `/obj/item/organ/brain/proc/brain_gain_trauma` returns a reference even if this happens, leading to the ref being stored on the wound and preventing the trauma from being fully deleted. ## Why It's Good For The Game Fixes #87752 ## Changelog No player facing changes --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> |
||
|
|
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) /🆑 |
||
|
|
107188c51e |
Terror Unification: Converts all "fear" quirks and traumas (except item phobias) to use a unified handler (#90217)
## About The Pull Request This PR adds the fearful component which acts as a unified handler for terror effects. This currently includes nyctophobia and claustrophobia quirks, terrified status effect from nightmare's spell, and the monophobia brain trauma. The component processes terror handler datums which act both as terror sources and effects - jittering, stuttering, vomiting, panic attacks, etc. This means that nyctophobia and claustrophobia now act more like terrified status/monophobia - causing jitters, stuttering, periodic panic attacks, etc, and their effects stack (i.e. being in a closet in the dark will increase your fear much quicker). Closes #37492 Closes #57121 Closes #69684 ## Why It's Good For The Game Terrified status is very immersive and its effects perfectly fit nycto/claustrophobia quirks, enough to be impactful to owner's gameplay, but not roleplaying for them, which is what we want quirks to be. It also makes them share their stress, which is how you'd expect them to act. (I would also love to see monophobia moved from a brain trauma to a quirk, as it perfectly fits latter instead of former, and acts as a great incentive to interact with other people instead of doing autism projects by yourself.) I haven't moved phobias to this system yet, but it could be done in the future without too many issues - should make phobias less painful to deal with, and maybe make people actually interested in playing around them instead of rushing a lobotomy because of how debilitating they are (currently only interaction is getting hugged by someone you're afraid of, which will increase your terror) ## Changelog 🆑 add: Nyctophobia and Claustrophobia quirks now have proper terror effects instead of making you walk/suffocate. Immersion! refactor: All sources of "terror"/"fear" now use a common component, meaning they share their counters. /🆑 |
||
|
|
eb0e842320 |
Hallucination revamps and additions (#89865)
## About The Pull Request 1. Hallucination effects are now tiered Hallucinations now all have tiers, ranging from common to special. If you are just hallucinating a teeny bit, you will not experience the more extreme hallucinations, like bubblegum or your mom. But if you're hallucinating off your butt, you will be a bit more likely to experience them. 2. Hallucination rate has been tweaked Default hallucination cooldown is now 20-80 seconds, up from 10-60 seconds. However the cooldown will *also* vary depending on just how much you're hallucinating, going down to 10-40 seconds. 3. RDS is now capped a bit lower (meaning you don't see the higher tiers like bubblegum). But I added a preference to uncap it. For the people who actually like bubblegum visits. 4. If a hallucination fails to trigger, the cooldown will partially reset. (by 75%) 5. "Fake chat" hallucination will pick more viable subjects. Fake chat will try to find someone who can actually speak your language, rather than make a monkey speak mothic or something. (I may revisit this so if you're super-hallucinating it reverts to old behavior though.) 6. Adds a hallucination: Fake blood You hallucinate that you start bleeding, very simple. 7. Adds a hallucination: Fake telepathy You hallucinate a random telepathic message, similar to fake chat. 8. Adds a hallucination: Eyes in the Dark A nearby dark turf will have a set of glowing red eyes shine through the dark. A classic. 9. Adds some new sub-hallucination: PDA ringtone (fake sound), summon guns/magic (fake item) Funny prank. 10. Makes mindbreaker a bit more effective at combating RDS. Pretty much does nothing right now unless you gulp like 50u. ## Why It's Good For The Game Hallucinations are pretty one note if you experience them for longer than 10 minutes. This is due to two fold: - Many hallucinations are goofy, and not subtle - Hallucinations trigger very rapidly You will never fall for a hallucination because in between "You see John Greytide put the blueprints away", you get your mom yelling at you, everyone looking like syndies (again), and bubblegum This pr addresses it by - Limiting the wacky hallucinations for when you're really off your gourd - Reducing the period between triggers - Adding a few hallucinations If the wackier hallucinations are reserved for when you're really off your rocker, this lets the more subtle ones sink in over time, leaves more room for second guessing ## Changelog 🆑 Melbert add: Adds 4-5 new hallucinations. Collect them all. balance: If you are only hallucinating a little bit, the game will prefer to pick more subtle hallucinations. If you are hallucinating a ton, it will prefer the more wacky hallucinations. balance: If you are only hallucinating a little bit, the cooldown between hallucinations is longer. If you are hallucinating a ton, it will be shorter. balance: If a hallucination fails to trigger (such as a deaf person getting a sound hallucination) the next one will be a lot sooner. balance: RDS hallucination amount is capped at mid tier hallucinations. This means bubblegum and co. will be a lot rarer, or will even never show. HOWEVER, there is now a preference allowing you to uncap your RDS hallucinations. balance: Mindbreaker toxin is more effective at suppressing RDS. balance: Some hallucinations effects have been tweaked up or down according to the new thresholds. Madness mask as an example. fix: "Fake Fire" Hallucination works again, and now has a unique message for if you stop-drop-roll that other people see. /🆑 |
||
|
|
845ed7459e |
Bravo Six, Going Dark: Refactors client colors to fix dupe issues and support filters (#89843)
## About The Pull Request Completely refactored how client colors are handled. Now they're similar to traits, having a source associated with them. Instead of adding and removing by strict type (which makes client colors prone to getting duplicated and not cleaned up) you remove a filter associated with a specific source. Adding another client color with the same source as an already existing one will replace the existing one if its of a different type, or do nothing if they're the same (unless force is set to TRUE). Client colors can also force filter splitting, putting all colors that come before them, themselves, and all colors after them into separate filters - this is useful to prevent mixing in filters which are supposed to remove a certain color. <details> <summary>Example of how Perceptomatrix and nightmare vision goggles combined before this PR:</summary>  And this is after, as you can see nightmare vision effect's red is only slightly tinted by perceptomatix instead of being literally halved.  </details> Additionally, added support for custom filters (and not just colors) to client color code to allow us to work with more colorspaces. Also fixed weird blindness behavior, so this also Closes #89787 ## Why It's Good For The Game Makes code less ass to work with, fixes weird color mixing, etc. ## Changelog 🆑 fix: Fixed perceptomatix helmet allowing you to see even when unconscious refactor: Refactored how client colors are handled, ensuring that certain effects like nightmare goggles don't disappear when another vision-affecting piece of clothing is worn. /🆑 |
||
|
|
52678d41b5 |
Everyone is kung fu fighting: Refactors martial arts / You can have multiple martial arts and swap between them (#89840)
## About The Pull Request Refactors martial arts off the mind. Don't worry the martial arts you learn still transfer with mindswap Instead, they are just tracked on a list on the mob, and they also independently track the datum that created them This fixes a lot of jank with martial arts, like say, having your krav maga gloves transfer across slime clones or something... But it also opens an opportunity: As we track all martial arts available, I added a verb (ic tab) that lets you swap between the ones you know  (Some don't let you swap like that one brain trauma) ## Why It's Good For The Game Aforementioned fixes a lot of jank Recently martial arts have just been up and disappearing and this was entirely spurred on by that bug Probably fixes #84710 (haven't checked) Probably fixes #89247 Probably fixes #89948 Probably fixes #90067 ## Changelog 🆑 Melbert refactor: Refactored martial arts, if you notice any oddities like managing to know two martial arts at once or having your powers disappear, report it! add: If you know multiple martial arts, such as krav maga from gloves and cqc from a book, you can now swap between them at will via a button in the IC tab! /🆑 --------- Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> |
||
|
|
a0e862d575 |
Base implementation of /datum/persistent_client (#89449)
## About The Pull Request Converts `/datum/player_details` into `/datum/persistent_client`. Persistent Clients persist across connections. The only time a mob's persistent client will change is if the ckey it's bound to logs into a different mob, or the mob is deleted (duh). Also adds PossessByPlayer() so that transfering mob control is cleaner and makes more immediate sense if you don't know byond-fu. ## Why It's Good For The Game Clients are an abstract representation of a connection that can be dropped at almost any moment so putting things that should be stable to access at any time onto an undying object is ideal. This allows for future expansions like abstracting away client.screen and managing everything cleanly. |
||
|
|
bc19447758 |
Fix blades equipped to a void cloak having visible sprites (#89343)
## About The Pull Request Fixes https://github.com/tgstation/tgstation/issues/87345 This adds a new item trait, `TRAIT_NO_WORN_ICON`, which is exactly what it says on the tin - the worn overlay for said item will not be added when the trait is present, so we give it to items hidden by the hood. I also refactored the `EXAMINE_SKIP` item flag into `TRAIT_EXAMINE_SKIP`.  ## Why It's Good For The Game stealth thing having an obvious sprite tell is bad. bugfix good. ## Changelog 🆑 fix: Void Cloaks now properly hide blades and such in the suit storage from the wearer's sprite. /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> |
||
|
|
5d13bd894e |
Phobia rework (#89098)
## About The Pull Request Like #88945 but I am meaner than Goofball. This PR adjusts Phobias to be a little bit less restricting, rather than being basically the worst thing in the game. The way phobias work now is: ***Hearing*** something related to your phobia will make you scream and give you a minor, minute-long mood penalty, once every 12 seconds. ***Saying*** something related to your phobia has a high chance to make you either stutter or speak quietly, or both at once. ***Seeing*** something related to your phobia applies a moderate, four-minute long mood penalty and then gives you stacks of a debuff, once every 12 seconds, up to 6 stacks. Each stack of the phobia debuff makes any effects applied by being scared last longer. Then it applies one of four random effects. - You scream, which does nothing else... unless you have at least 5 stacks in which case you will also drop whatever you were holding in your active hand. - You jump, which immobilises you for a very short period of time (basically just interrupting your movement). - You lose your balance, making you briefly move slower and become staggered (which makes it easier to push you around). - You feel faint, which makes you dizzy (move occasionally in unwanted directions) and briefly blurs your vision. These stacks decay every 30 seconds as long as you're not actively being scared. If you have _multiple_ phobias then your general level of fear is applied globally between them, so even if you just escaped from some clowns you might still be worked up when you see a spider. Phobias mostly don't make you jitter any more largely because to be honest it just looks sort of shit and generally makes your sprite and animations seem like they are broken not like you are shivering in fright. It still happens if you hear something scary. _Also_ I changed carp phobia to a general "fish" phobia, because we have so much fish-related content now to take advantage of. _Also_ I fully deleted the Heretic phobia because it's not applied by Heretics any more and without that context it is also needlessly specific, with heavy overlap with the Supernatural phobia. _Also_ I fucked around with the phobia speech dictionaries a little bit to remove some words I don't think are that funny or appropriate and also add some more. Your mileage may vary. _Also_ I made sure people who are scared of aliens are scared of basic mob xenomorphs, people who are scared of birds are scared of raptors, and people who are scared of bugs are scared of butterflies and........... mothroaches. ## Why It's Good For The Game Phobias are internally classed as a "mild" brain traums, which makes them relatively easy to acquire and are applied by effects that are supposed to be bad but not completely debilitating. Examples of other mild traumas are: - Stuttering - Speech impediments - Your health preview doesn't update - You occasionally move in a random direction - Colour blindness - You don't like dropping objects Phobias on the other hand are generally considered by most players who have had one to be _significantly_ disabling. The penalties they apply tend to be significantly worse to play with than the things listed above, and can make playing around with a roleplay quirk excessively miserable. Unlike Goofball I don't want to make these totally toothless, but I do want them to be more _mlld_ than they were before. ## Changelog 🆑 balance: Phobias are now somewhat less debilitating, although their effects get worse the longer you are near a fear trigger. balance: Carphobes are now afraid of all fish. del: Remove the Heretic phobia, as it is now basically unused. /🆑 |
||
|
|
c3f3e9e9b9 | Fix flaky Ethereal test (#89123) | ||
|
|
28e4c83d54 | Deprioritise phobias in two sources of random trauma (#88958) | ||
|
|
32e7990910 |
Fixes a qdel loop in hypnosis brain trauma (#88349)
## About The Pull Request Code bad lack of runtimes good ## Changelog 🆑 fix: Fixed a qdel loop in hypnosis brain trauma /🆑 |
||
|
|
9007190a74 |
Audits a bunch of calls to receive_damage, replacing them with apply_damage (#88205)
## About The Pull Request Looks through calls to `receive_damage` and replaces them with calls to `apply_damage` `receive_damage` is a gross to use internal proc that doesn't take into account physiology (damage modifiers) or even update the mob's sprite when taking damage It should be avoided many uses - `apply_damage`, in fact, can take a bodypart as a target, and is overall a lot easier and more ergonomic to use. "So what are valid uses of it?" - Apply damage itself, and similar direct-damage procs - Ensuring you deal an exact amount of damage to a bodypart - Damaging a limb with no owner ## Changelog 🆑 Melbert refactor: A ton of things now use the more correct method of applying damage to you. Which means they will correctly factor in damage modifiers and are less likely to break your sprite. Some examples include embedded objects jostling around, chiropractice, and tackling a wall. Report any oddities, such as extreme damage or bodyparts being wrongly affected. fix: Having acid splashed on your face may now disfigure you and make you bald, as it once did three years ago. fix: Itchy heretic trauma now better checks if the bodypart is covered or not before determining if you should itch. fix: "Repair Puncture" logs no longer mistakenly report you are "Incising burned flesh" /🆑 |
||
|
|
800f7c1537 | Fixes "is blacking out" message (#88200) | ||
|
|
d5daa9c9b8 |
[NO GBP] Renames mob/camera to mob/eye and makes everything follow suit (#87684)
## Why It's Good For The Game Clarity and consistency regarding DM's systems. Internally, `eye` is used for anything that controls the client's view.  How `eye` is used in DM is consistent with how we use the term, so I figured this would add clarity. Being named mob/camera also makes it unclear exactly what it's doing. The name implies that it would function similar to how mob/camera/ai_eye does, but most of the time it's only used as... an eye. My ulterior reason for this PR is that I want to clean up mob/camera/ai_eye and it's subtypes after this. ## Changelog 🆑 server: mob/camera has been renamed to mob/eye, which may break downstreams /🆑 --------- 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. /🆑 |
||
|
|
ab18546dcd |
Gives the Bridge Assistant Axe Delusions (#87513)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> |
||
|
|
3f0b4abb8d |
Replaces world.icon_size (and some magic numbers) with defines (#86819)
## About The Pull Request All usages of world.icon_size in code have been replaced with new `ICONSIZE_X`, `ICONSIZE_Y` and `ICONSIZE_ALL` defines depending on context Replaces some "32" magic numbers with the defines A few bits of code have been modified to split up x/y math as well ## Why It's Good For The Game Magic number bad, code more readable, code more flexible and I'm told there's an access cost to doing world.icon_size so minor performance gains ## Changelog 🆑 tonty code: made some code relating to the world's icon size more readable /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
199a5eff21 | Fix imaginary friends not being able to hear their host, some minor adjustments (#86863) | ||
|
|
9e3cf3fe59 |
Fix the greeting message you get upon becoming an imaginary friend including nulls (#86866)
## About The Pull Request Previously the imaginary friend greeting message would be called on `Login()`, but this meant that it could run before it actually linked the `owner` value, thus putting nulls in the message where the owner's name should've been. This just changes it so `greet()` is only called on `Login()` if there's already an owner linked, otherwise calling it when being attached to an owner. ## Why It's Good For The Game Better if the greeting message actually says whose imaginary friend you are. ## Changelog 🆑 fix: The greeting message imaginary friends get upon becoming one actually includes the owner's name, instead of displaying nothing where it should've been. /🆑 |
||
|
|
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 /🆑 |
||
|
|
74a5ac1a6f |
Allows admins to see previously obsessed players, minor obsession code cleanup (#86609)
## About The Pull Request Closes #86603 by adding a dummy antag datum that will be added to everyone who lost the trauma before losing the antag datum (i.e. from being "cured" from trauma in one way or another) Also added defines for obsession objectives ## Changelog 🆑 code: Minor obsession code cleanup admin: Admins can now see players who were previously obsessed but had been "cured" from the trauma /🆑 |
||
|
|
6808a082eb |
Assorted changes to job assignment code and logging. Runtime free, guaranteed or your money back. Price: $£0. (#85947)
## About The Previous Pull Request
#85308 reverted by #85929

~~Causes the round to not start when a player isn't eligible for any
jobs at a specific priority level due to runtimes trying to `pick()`
from an empty list aborting the entire job assignment stack.~~
(Fixed???? by
|
||
|
|
91baa94ac5 |
event based incapicated and able_to_run (#86031)
## About The Pull Request this is a revival of #82635 . i got permission from potato to reopen this, he did almost all the work. i only just solved the conflicts and fixed all the bugs that were preventing the original from being merged (but it should be TMed first) ## Why It's Good For The Game slightly improves the performance of basic mob AI ## Changelog 🆑 LemonInTheDark refactor: able_to_run and incapacitated have been refactored to be event based /🆑 --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: ZephyrTFA <matthew@tfaluc.com> |
||
|
|
9a9b428b61 |
Wallening Revert [MDB Ignore][IDB Ignore] (#86161)
This PR is reverting the wallening by reverting everything up to
|
||
|
|
4d1639b04c |
Revert "Assorted changes to job assignment code and logging." (#85929)
Reverts tgstation/tgstation#85308  |
||
|
|
1eef540054 |
Assorted changes to job assignment code and logging. (#85308)
## About The Pull Request
This PR does a couple of minor things:
Makes the job debug logging a bit easier to follow.
Minorly brings some SSjob code up to code standards, converting proc
names to snake_case and doing some otherm is cleanup.
Refactored some stuff into different procs, updated some comments.
And some major things:
Changes the job assignment logic.
Old behaviour
> Assign dynamic priority roles
> Force one Head of Staff (if possible)
> Assign all AIs
> Assign overflow roles (bugged in 2 ways)
> Shuffle the available jobs list once, at the start of the random job
assignment loop
> Pick and assign random jobs for random players from High prefs down,
with a priority on Head of Staff roles
> Handle everyone that couldn't be assigned a random job
New behaviour
> Assign dynamic priority roles
> Assign all Head of Staff roles to players with High prefs
> If no Head of Staff was made in the above way, force one Head of Staff
(if possible)
> Assign all AIs
> Assign overflow roles (fixed)
> Prioritise and fill unfilled head roles at each job priority pref
level, from High prefs down.
> Build a list of all jobs that each unassigned player could be eligible
for at the above pref level.
> Pick a job from that list at random and assign it to the player.
> Handle everyone that couldn't be assigned a random job.
In reality there should be little impact on overall job assignment, the
code changes read more as semantics. For example, the priority check for
filling Head slots will have the same candidate pool in both old and new
versions, but in the new version we're more clearly saying that Heads
are important and we want to prioritise filling them for the sake of
round progression even though the outcome in new and old is the same.
A key change will lead to an increase in assistants - Overflow fixes.
Currently the code block to do early assignments to the Overflow role
doesn't work - or works but not as you'd expect. The idea was is that
because enabling the Overflow role in the prefs menu is an On/Off toggle
that sets the job to High priority when enabled and prevents any other
High priority pref, players that have the Overflow role enabled will
**always** get it. It's their highest priority job with infinite slots.
So we do a pass right at the start to give everyone with the Overflow
role enabled that role and save us wasting time later on in random job
code giving them that same role but with more work.
The problem is the code for this only assigns the Overflow role to
people with it set to Low priority in their prefs, resulting in log
readouts like:
```
[2024-07-27 09:49:43.469] DEBUG-JOB: DO, Running Overflow Check 1
[2024-07-27 09:49:43.469] DEBUG-JOB: Running FOC, Job: /datum/job/assistant, Level: Low Priority
[2024-07-27 09:49:43.472] DEBUG-JOB: FOC player job enabled at wrong level, Player: Radioprague, TheirLevel: Medium Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.472] DEBUG-JOB: FOC player job enabled at wrong level, Player: Caluan, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.473] DEBUG-JOB: FOC player job enabled at wrong level, Player: Caractaser, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.473] DEBUG-JOB: FOC player job enabled at wrong level, Player: Apsua, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.475] DEBUG-JOB: FOC player job enabled at wrong level, Player: Bebrus2, TheirLevel: Medium Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.475] DEBUG-JOB: AC1, Candidates: 0
```
Where nobody gets pre-assigned the overflow role because their prefs are
all set to the High priority from being toggled... Except wait a second,
some people have it at Medium priority when it should just be a No
Role/High Priority Role toggle?
And herein we meet a problem. My hypothesis is that traits and stuff
that change the overflow have allowed players to set the "ordinary"
overflow role of Assistant to Medium and/or Low priority.
This still shows as enabled in the prefs menu, but leads to an outcome
where a player with assistant enabled is assigned Cook instead.
```
[2024-07-27 09:49:47.775] DEBUG-JOB: DO, Running Overflow Check 1
[2024-07-27 09:49:47.775] DEBUG-JOB: Running FOC, Job: /datum/job/assistant, Level: Low Priority
...
[2024-07-27 09:49:43.475] DEBUG-JOB: FOC player job enabled at wrong level, Player: Bebrus2, TheirLevel: Medium Priority, ReqLevel: Low Priority
...
[2024-07-27 09:49:47.987] DEBUG-JOB: Running AR, Player: Bebrus2, Job: /datum/job/cook, LateJoin: 0
```
So players with the Overflow job pref set to Low (an unexpected state,
should be disabled or High) would be guaranteed to get that role if none
of the higher priority Head of Staff/AI/Dynamic roles took over via the
bugged "force overflow for people with the pref enabled" proc.
Players with the Overflow job pref set to High would be guaranteed to
get that role if none of the higher priority Head of Staff/AI/Dynamic
roles took over via the random job assignment code giving them their
Highest priority role thanks to the infinite job slots of the Overflow.
And players with the Overflow job pref set to Medium (an unexpected
state, should be disabled or High) would get Assistant if the shuffle
step of the available jobs list put Assisstant before any of the other
jobs they had prefs enabled for at Medium that weren't already filled,
otherwise they'd get another random job.
This code is now changed to ignore the priority the player has set when
looking for people to fill the overflow role. As long as it **is**
enabled, the player will get it unless they're forced into a dynamic
ruleset role (AI when malf rolls) or a Head of Staff role due to their
other prefs (they have RD set to med or low, and no other player has a
Head of Staff at high so they get randomly picked and miss the overflow
role).
This will increase the number of assistants in shifts where their pref
state has Assisstant in the bugged Medium priority, but doesn't change
it for bugged Low and not-bugged High/On priority.
On the other side of the coin, we have how the random jobs are picked.
They're kinda not random, and I noticed this reading the logs then
reading the code.
The list of available jobs to pick from is randomly shuffled - but only
**once**. All players pull from a list of jobs in the same order. So you
end up with a log block like this:
```
[2024-07-27 09:49:47.985] DEBUG-JOB: DO pass, Player: Pierow, Level:3, Job:Botanist
[2024-07-27 09:49:47.985] DEBUG-JOB: Running AR, Player: Pierow, Job: /datum/job/botanist, LateJoin: 0
[2024-07-27 09:49:47.985] DEBUG-JOB: Player: Pierow is now Rank: Botanist, JCP:0, JPL:2
[2024-07-27 09:49:47.986] DEBUG-JOB: DO pass, Player: Daddos, Level:3, Job:Botanist
[2024-07-27 09:49:47.986] DEBUG-JOB: Running AR, Player: Daddos, Job: /datum/job/botanist, LateJoin: 0
[2024-07-27 09:49:47.986] DEBUG-JOB: Player: Daddos is now Rank: Botanist, JCP:1, JPL:2
[2024-07-27 09:49:47.986] DEBUG-JOB: FOC job filled and not overflow, Player: Bebrus2, Job: /datum/job/botanist, Current: 2, Limit: 2
[2024-07-27 09:49:47.987] DEBUG-JOB: FOC player job not enabled, Player: Bebrus2
[2024-07-27 09:49:47.987] DEBUG-JOB: DO pass, Player: Bebrus2, Level:3, Job:Cook
[2024-07-27 09:49:47.987] DEBUG-JOB: Running AR, Player: Bebrus2, Job: /datum/job/cook, LateJoin: 0
[2024-07-27 09:49:47.988] DEBUG-JOB: Player: Bebrus2 is now Rank: Cook, JCP:0, JPL:1
[2024-07-27 09:49:47.988] DEBUG-JOB: FOC player job not enabled, Player: Redwizz
[2024-07-27 09:49:47.988] DEBUG-JOB: FOC job filled and not overflow, Player: Redwizz, Job: /datum/job/cook, Current: 1, Limit: 1
```
The list is shuffled into an order of something like `list("Scientist",
"Botanist", "Cook", "Sec Officer", ...)` then iterated over for each
player. So every random job selection goes:
> "Does Player1 have Scientist enabled and at the right priority? No?
Okay, Botanist? Yes? You get botanist."
> "Does Player2 have Scientist enabled and at the right priority? No?
Okay, Botanist? Yes? You get botanist."
> "Does Player3 have Scientist enabled and at the right priority? No?
Okay, Botanist has no slots left so we'll remove it from the list. Okay,
Cook? Yes? You get cook."
> "Does Player4 have Scientist enabled and at the right priority? No?
Okay, Cook has no slots left so we'll remove it from the list. Okay, Sec
Officer? ..."
This can lead to stacked individual departments if it gets randomly
rolled to the start of the list in the shuffle, and completely empty
departments if they end up at the end.
On high pop shifts this is probably less of an issue. Player prefs add
noise to this and as departments at the front fill up, those at the back
pick up some of the lower pref players.
But have you ever had a shift where there's just like... No fucking sec
even though there's tons of players? The logging (before I made changes
in this PR) was a bit ass, but my hypothesis there is that sec officer
was shuffled right at the end of the random job list, so every other
department was filled up before sec officers were picked.
To mitigate this, I made the list shuffle every single time the game
picks a random available job for the player. This should lead to a more
balanced selection of available jobs by avoiding situations where the
code is biased towards packing some departments by accident.
## Why It's Good For The Game
Overflow fixes mean people who go to their prefs and see the Overflow
Role is On will all have the same experience - They will be the Overflow
role.
More random random job selection should prevent individual departments
having a jobs be stacked when it would have otherwise been possible for
a more balanced selection but the code unintentially biased random
departments to be overstaffed and understaffed each shift.
## Changelog
🆑
fix: Having the Overflow Role set to On will properly ensure you get
that role at a High priority as intended by the game code.
fix: Job selection is now a little bit more random. Fixes an
unintentional bias in random job assignment that could lead to
feast-or-famine for roles where everyone is assigned one job and nobody
is assigned another job.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
|