mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-02 04:52:10 +00:00
bea0930a188b67cc77acfdae3c05b51bb6039c83
3671 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
0bb6a27955 |
Give Error Messages On Subsystem Initialization Failure CI (#82139)
## About The Pull Request Noticed during #82138 Basically, the unit test that makes sure that all of the subsystems that had to initialize properly initialized is good with the Notice annotation, but it had a flaw - it didn't tell you _why_ the subsystem failed to initialize:  Basically this PR just adds a variable, `initialization_failure_message` (i have it on good authority that variables that don't get changed from their compile time variable don't take up extra memory), and we just append the failure message to this notice should it occur so all of the information is available in one spot, rather than have the coder dig through the CI Run Log to figure out what the specific error was should it occur on something that isn't SSlua. also small cute code cleanup :3 |
||
|
|
8628cbc54e |
Refactored admin backup saving. No longer at round end, more data backed up (#81891)
Admin verified connections now cache all verified connections for all admins. (Rather then just the last connection data of the currently connected admins) Sync with the db now happens at admin load time, not at round end. (this was causing annoyances because servers with long rounds could override the admin db with old/stale data overwritting the fresher data that was written by a server with a shorter round) Fix backup verification not working if the db thinks it still connected but its not actually still connected. @Mothblocks @Jordie0608 --------- Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com> |
||
|
|
b20c982404 |
Converts slimes to basic mobs (#82176)
## About The Pull Request After months of preparation, and further months of work, I am finally done. Please bear with me, as this is a massive refactor, but I have already atomized everything I could. This is now ready for review. General - The hilbert hotel slimes are now a subtype instead of a varedit. - The `use_mob_ability` subtree now also accepts non cooldown abilities. If set_behaviours is set up properly, mobs won't keep continously triggering it as if it were a 0 second cooldown action. The alternative would have been turning the slime abilities into cooldown abilities. - Wrestling off a slime now signs up to the `COMSIG_ATOM_ATTACK_HAND` signal, instead of being part of attack_hand. - Adds datum/ai_controller/controller as a fourth, optional argument to `/datum/ai_behavior/find_hunt_target/valid_dinner()` to make it possible to access blackboard keys. - Slimes no longer attack windows if they would accidentally move into them (when the conditions are met), since random walk behaviour ignores tiles they can't go in. It was also not worth to keep. Did you know this was the sole override of `ObjBump()`? - Examine was made less snowflaky/bespoke. Also added a new element: `/datum/element/basic_health_examine`, which is a simple bespoke element that prints out a custom message based on how damaged the basic mob it is attached to is. - Slimes only perform knockdown instead of paralysis, as they can attack more often now, and paralysis is not that fun. - LAssailant has been removed due being archaic code. To befriend a slime, you have to spawn a monkey with the slime console, or feed them a sheet of plasma. Simple grabbing the monkey or stuffing them in disposals do not work anymore. Slime console spawned monkeys will have a visible status effect, with pheromones coming off them to make this clearer. Actions - Feeding, reproduction and evolution is no longer a verb. - Slime feeding is no longer an action button. You have to use right click, or as previously, mousedrop. Slimes can always unbuckle from mobs they are attached to. Hunger - Instead randomly changing the starvation and max nutrition values while growing up, evolution costs 200 nutrion. This makes the code more readable, and behaviour more predictable, while still giving the intended time between evolving and splitting. As a result, I could also turn these into defines. - Added a component that handles doing an effect over time while buckled to a mob, until the mob dies or you get unbuckled. - Slimes gained nutrition is no longer randomly multiplied by the damage config value, but rather gain nutrition equal to twice the damage dealt. You'll have to eat one monkey to evolve, just as before. - Slimes do not heal passively. They only heal from eating. It was a rather miniscule value that did not have much effect. - Slimes generate electricity from hunger threshold, instead of the random amount of hunger threshold + 100. Environment - Slimes take 15 damage from cold every second, instead of using a complex formula (that also decreased the damage up to a point?). - Slimes still heal from burn damage, but this is now set on the damage coefficient list. - Slimes instead of getting stunned by the cold, freeze in an ice cube. BZ instead of setting them unconscious, calls the stasis status effect, allowing you to safely stash your hungry slimes for later. They also no longer slow down from the cold, as they are already slowed down by the damage they get. Conversely they no longer get a speed up from a random amount of temperature. I could be convinced to readd this either as part of the basic sensitive component, or a similar one. AI - Removed the attacked_stacks system. Slimes will just perform regular retaliation if you hit them in a harmful manner. - Slimes now use the pet orders component. They will interrupt their feeding when given a command by their master. - Slimes have their own subtrees. I tried to replicate as much as I could from the old code, dividing ancient code artifacts and intentional stuff, so there might be some weirdness. - Slime speech has been almost fully reduced to basic blorbing, as you can not even understand them anymore, and most of them require the slime to loop through all of their surroundings. - Discipline does not have stacks either. Disciplined baby slimes have a chance to clear their attack and hunt blackboard keys. All slimes will stop feeding on the target otherwise. - Since discipline is not a stack, rabidity instead gets removed at a 10% chance per disciplining. - Slimes faces are a bit more randomly picked now. ## Why It's Good For The Game - We want to convert all simple animals to basic mobs. Old slime code was also very strange, and had some systems that have been replicated by components. - Slimes fully paralyzing you is not fun at all. Knockdown should give you a fighting chance when a slime would like to eat you. - Slimes slow down from the heavy damage they get from the cold, so I don't think they need extra slowdown, nor do they need to speed up from warmth, as they are already fast. - Slimes turning into an icecube instead of becoming paralyzed from the cold is more fun for the slimes, as they can break out for a few moments. It is also funny. - Slimes entering proper stasis from BZ is not just a visual indicator of a slime that is safe to approach, but also keeps the slimes's hunger value in check, allowing it to not starve while stopped. They can also look around and blorble, instead of staring at a black screen, if player controlled. - The attack_stack and discipline_stack behaviours were rather overcomplicated, and the xenobio mains I talked with didn't even know it was a thing, so I argue it needed simplification. - The bespoke friendship system of slimes was also too complicated. Slimes slowly gained levels of trust, and at certain levels commands costed friendship, and other levels, they did not. The binary friend/not friend system that everything else in the game uses is much more sensible. - Using right click for feeding is much more sensible than using an action, and then picking someone from a dropdown. - Slime speech was very soulful but not only did it loop through everything in sight, you couldn't even understand it unless you spoke slime. Maybe it can be readded later in a different form. - Slime's passive healing was miniscule, and having them rely on feeding is more interesting. also fixes #81463 ## Changelog 🆑 refactor: Slimes are now basic mobs. Please report any strange behaviours! balance: Slimes only stun you for two seconds when they shock you, the rest of the duration is a knockdown. balance: Slimes are not stunned from the cold, but rather, get frozen in a freon icecube. BZ also puts them in complete stasis, instead of making them unconscious. Their speed is likewise unchanged by temperatures. balance: Slimes do not passively heal, they instead rely on feeding. fix: Slimes can use the buckling screen alert to unbuckle and stop feeding, along with clicking on the mob they are riding /🆑 |
||
|
|
95b7fa1fb7 |
Add a unit test to check that maploaded simple/basic mobs are in an environment they can survive in. (#82180)
## About The Pull Request I've recently noticed that the maploaded penguins from the snowdin away mission were dying from unsafe atmos/temperature. This sparked the idea of making a (focus only) unit test that would prevent this sort of issues from happening. This PR also implements the usage of the `atmos_requirements` and `body_temp_sensitive` elements for simple animals too, cutting down the copypaste. ## Why It's Good For The Game More unit tests to make sure things are done correctly. ## Changelog 🆑 fix: Made sure that mapped critters (i.e. penguins on the snow cabin away mission) can survive in the environment they're spawned in. /🆑 |
||
|
|
762779f3f2 |
Adds a photobooth (#82105)
## About The Pull Request Adds a photobooth machine to the HoP line which can be used to update your security records photo. It updates the records of the person's name, which means hiding your identity and wearing an ID will let you change other people's photos. If you aren't hiding your identity and are wearing someone else's ID, it won't update at all because it will be unable to find your record. There's 2 variants of this machine, one at the HoP line that's tied behind Law Office access (so Lawyers have an extra thing they can help out with if no one's available, but maybe it would be better behind Library access since Curators are our "photographer" role?), and the Security one that requires Security access. The Security one has a special feature that it adds a height chart behind the player.  This machine is used by either right-clicking on it or by pressing a button, so the HoP can do it remotely from their line (except on Tram where it's in the library), and after a few delays it'll update your records automatically to how you look like. Emagging the machine will remove its access restrictions but every time it updates your photos it will spam camera flashing and blind you. Sprites Open  Closed  Security version on the left, has a red tint on it  Video demonstration (old sprites): https://github.com/tgstation/tgstation/assets/53777086/a2e59f08-2d58-4f5b-b081-e137c7606d35 ## Why It's Good For The Game Current security records has no way to change your photo ID, something that was a feature before it was moved to TGUI. The only alternative is to fully delete your record and make a new one with a photo and the same name, but this shares a major issue with the HTML UI: You're immediately sold out by the fact you have a background. No matter how well you try to cover your tracks, any security officer looking at records will see you are the only photo on the manifest that has a background and even a camera in your hand, which makes it impossible to get away with it unless security essentially takes pity on you. This opens up the ability to fully mask yourself in records, finally. This is also better even for non antagonists because you can now properly update your photos to match what you look like in the event of an appearance change or even just a job change, which makes it a benefit for HoPs who likes to keep records as up-to-date as possible. ## Changelog 🆑 JohnFulpWillard, Twox add: Added a new photobooth machine to the HoP's line. fix: Things checking for access now checks your off hand, too. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
a066fd3be4 |
Adds dynamic blob/obsession to ghost popups, removes third rail popup, tweaks supply pod popup (#82234)
## About The Pull Request Three changes to ghost orbit popups. Let's check them one-by-one. First off -- The obsession awakening and blob host midrounds now have a ghost popup when summoned via Dynamic. They already have them when summoned by a random event roll, so this is mostly just bringing the two different spawn methods in line with each other. None of the other midround dynamic picks (autotraitor, revs, etc) have had this added, because they're less focused on spectacle and require more mystery to function properly. Second -- The electrified railings on the tram no longer notify ghosts every time someone gets shocked. Electrocute_act is called on anything that passes by it, and the popup would be thrown regardless of whether or not they've "fallen in the path of an oncoming tram" or not. Making it check if the electrocute_act actually successfully stunned a player, and that they're about to be hit, would probably require an unwieldy rewrite to the behavior that I'd rather not resort to. I brought this helper call into this world, and now I'm taking it out. Lastly -- The supply pod random event can now be properly jumped to. Originally, it would track the landing indicator, which would delete almost immediately and leave an un-orbitable popup on your screen. Now you jump to the landing zone, regardless of when you click the toast popup. This is really long PR body for such tiny changes please don't think this is anything more than it actually is. ## Why It's Good For The Game Minor improvements to some ghost orbit popups, because Observers are players too! ## Changelog 🆑 qol: Dynamic midrounds "Obsession Awakening" and "Blob Host" now have ghost orbit popups, so you can see them happening in real time. qol: There is no longer a ghost orbit popup for players being shocked by an electrified tram rail. qol: The Stray Cargo orbit popup no longer has a half-second window to orbit before it becomes useless. /🆑 |
||
|
|
c1f11f26ce |
Converts arbitrary energy units to the joule. Fixes conservation of energy issues relating to charging cells. (#81579)
## About The Pull Request Removes all arbitrary energy and power units in the codebase. Everything is replaced with the joule and watt, with 1 = 1 joule, or 1 watt if you are going to multiply by time. This is a visible change, where all arbitrary energy units you see in the game will get proper prefixed units of energy. With power cells being converted to the joule, charging one joule of a power cell will require one joule of energy. The grid will now store energy, instead of power. When an energy usage is described as using the watt, a power to energy conversion based on the relevant subsystem's timing (usually multiplying by seconds_per_tick or applying power_to_energy()) is needed before adding or removing from the grid. Power usages that are described as the watt is really anything you would scale by time before applying the load. If it's described as a joule, no time conversion is needed. Players will still read the grid as power, having no visible change. Machines that dynamically use power with the use_power() proc will directly drain from the grid (and apc cell if there isn't enough) instead of just tallying it up on the dynamic power usages for the area. This should be more robust at conserving energy as the surplus is updated on the go, preventing charging cells from nothing. APCs no longer consume power for the dynamic power usage channels. APCs will consume power for static power usages. Because static power usages are added up without checking surplus, static power consumption will be applied before any machine processes. This will give a more truthful surplus for dynamic power consumers. APCs will display how much power it is using for charging the cell. APC cell charging applies power in its own channel, which gets added up to the total. This will prevent invisible power usage you see when looking at the power monitoring console. After testing in MetaStation, I found roundstart power consumption to be around 406kW after all APCs get fully charged. During the roundstart APC charge rush, the power consumption can get as high as over 2MW (up to 25kW per roundstart APC charging) as long as there's that much available. Because of the absurd potential power consumption of charging APCs near roundstart, I have changed how APCs decide to charge. APCs will now charge only after all other machines have processed in the machines processing subsystem. This will make sure APC charging won't disrupt machines taking from the grid, and should stop APCs getting their power drained due to others demanding too much power while charging. I have removed the delays for APC charging too, so they start charging immediately whenever there's excess power. It also stops them turning red when a small amount of cell gets drained (airlocks opening and shit during APC charge rush), as they immediately become fully charged (unless too much energy got drained somehow) before changing icon. Engineering SMES now start at 100% charge instead of 75%. I noticed cells were draining earlier than usual after these changes, so I am making them start maxed to try and combat that. These changes will fix all conservation of energy issues relating to charging powercells. ## Why It's Good For The Game Closes #73438 Closes #75789 Closes #80634 Closes #82031 Makes it much easier to interface with the power system in the codebase. It's more intuitive. Removes a bunch of conservation of energy issues, making energy and power much more meaningful. It will help the simulation remain immersive as players won't encounter energy duplication so easily. Arbitrary energy units getting replaced with the joule will also tell people more meaningful information when reading it. APC charging will feel more snappy. ## Changelog 🆑 fix: Fixes conservation of energy issues relating to charging powercells. qol: APCs will display how much power they are using to charge their cell. This is accounted for in the power monitoring console. qol: All arbitrary power cell energy units you see are replaced with prefixed joules. balance: As a consequence of the conservation of energy issues getting fixed, the power consumption for charging cells is now very significant. balance: APCs only use surplus power from the grid after every machine processes when charging, preventing APCs from causing others to discharge while charging. balance: Engineering SMES start at max charge to combat the increased energy loss due to conservation of energy fixes. /🆑 --------- Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
4a3942677a |
[NO GBP] Fix curators not getting a cut from patronized paintings in a better way (#82159)
## About The Pull Request I'm giving all the credits of this PR to the creator of #82153. The reason I'm making this PR is because, while the other fix work too, I believe this one is perhaps better so that we won't have to call `SSjob.GetJobType(jobtype)` everytime we want to access or make use of the `bank_accounts_by_job` variable. ## Why It's Good For The Game See title, also the other PR if you want a more indepth explaination of relatively simple stuff. ## Changelog 🆑 00-Steven fix: Fixed patronizing paintings not giving a cut to the curators. /🆑 |
||
|
|
5fb0088983 |
Fixes the LTSRBT
I borked it in the blackmarket refactor. It was constantly on cooldown when idle. Also, some logic mistakes. |
||
|
|
fe3c2edddd |
Moves lua off of the timer subsystem and onto its own internal scheduler. (#82131)
## About The Pull Request Lua uses the timer subsystem, which can end up holding the entire timer subsystem if lua is creating a lot of timers. The solution to this is to use an internal scheduler instead so that the load gets placed onto the lua subsystem. ## Why It's Good For The Game Performance improvement when using lua scripts. ## Changelog 🆑 refactor: Auxlua no longer uses the timer subsystem to get stuff done, lua scripts shouldn't slow down timers anymore. /🆑 --------- Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com> |
||
|
|
9fa40f4f1d |
DeathMatch Rolling Antag Fix (#82030)
## About The Pull Request Gives Deathmatch players the TRAIT_TEMPORARY_BODY which is checked during antag rolls while trimming candidates. ## Why It's Good For The Game Closes https://github.com/tgstation/tgstation/issues/81725 ## Changelog 🆑 fix: Deathmatch players should no longer be able to roll any midround antagonist. /🆑 --------- Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> |
||
|
|
c7b2e2be50 |
Fix polling mutating its target's plane and layer (#82009)
## About The Pull Request This PR fixes polling for an atom causing its plane and layer to mutate ```dm var/mutable_appearance/picture_source = alert_pic poll_image = picture_source ``` ```dm poll_image.layer = FLOAT_LAYER poll_image.plane = poll_alert_button.plane ``` See the issue? Passing an atom as an `alert_pic` would set `poll_image = alert_pic` which would in turn change `poll_image`'s plane and layer This is supposed to be `new(alert_pic)`, to make a mutable appearance *based on* the atom's appearance. I also did a minor bit of cleanup ## Changelog 🆑 Melbert fix: Fixes polling for things causing said things to have their planes and layers screwed up (causing random objects or mobs to appear above runechat and blindness, for example) /🆑 |
||
|
|
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.
|
||
|
|
bd8c1aebff |
Instrument editor now uses TGUI (#81923)
## About The Pull Request Instruments now use TGUI as their editor which is pretty cool. It's mostly a 1:1 remake of the HTML UI except I did make a change to make the playback options a little more compact, leaving some more space for the editor before you have to scroll, and some other minor things that were made to make the UI hopefully nicer to look at and mess with. When there's a song to play - While playing, Repeat section can't be edited  Help section and UI when there's no song put in  ## Why It's Good For The Game It is yet another step in finishing up https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA?view Instruments especially were in a poor spot because they didn't respect things like ``IN_USE`` to not refresh if it's not the "UI" you are on, and such. ## Changelog 🆑 refactor: Instruments now use TGUI. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
18d734ef7e |
Closet Anomaly station trait. (#81393)
## About The Pull Request Well, it's a station trait that makes a small number of (non-secure) closets function as if splashed with eigenstatium (which turns them into teleportation cabins of some sort). However, they're subtler, they lack the transparency and blueish tint, and don't make sparks. This PR also demotes the Eigenstate subsystem to a singleton global datum. It doesn't fire, it doesn't init, it plain doesn't belong amongst the big boys. ## Why It's Good For The Game This should be a mildly interesting station trait. ## Changelog 🆑 add: Added a 'Closet Anomaly' station trait, which links and turns a portion of the roundstart closets into impromptu teleporters. /🆑 |
||
|
|
737822398a |
Blackmarket refactor and balance, fixing spy bounties, plus a new category for people captured by pirates/tots/contractors. (#81818)
## About The Pull Request This PR aims to take care of a few potential hard dels and fix the fenced goods category first and foremost. The PR also adds a new one that enables you to buy mobs captured by antags in advance, before they're sent back to the station. Unlike other categories, it doesn't have "Launch" and "Teleport" as delivery methods, instead it uses a special "Supply Pod" delivery method that ships the chattel directly to your location. This method costs 400 credits, however, if you've built the LTSRBT, shipment will be free. Another thing, I always felt LTSRBT to be pretty fucking dumb as is. Way too overpriced for the benefits it offers: a slighty cheaper delivery method that, while definitely better than the other two, doesn't really pay off or honestly even remotely compensate the 4000 credits you just spent to get it, especially if you're only buying a couple items at most. So I decided to remove it from cargo and add it to the blackmarket as a 500 to 750 creds item, available every round. Human mobs sold by the pirate bounty pad are no longer deleted, instead they're properly ransomed and sent to the holding facility, much like for contractors and tots. This means they're also added to the black market. ## Why It's Good For The Game The blackmarket system has some issues to it that need to be fixed (otherwise the "Fenced Goods" and "Hostages" categories wouldn't work). The Pirate Pad deleting "ransomed" mobs instead of actually ransoming them is lame. The LTSRBT shouldn't suck as much. Also more market stuff. This will fix #81809. ## Changelog 🆑 fix: Fixed the "Fenced Goods" black market category. balance: Removed the LTSRBT from cargo and added it to the blackmarket, reduced the price from 4000 to 625 on average. balance: The time it takes for captured mobs to be automatically sent back to the station from the holding facility has been increased from 3-4 minutes to 6. add: You can buy mobs captured by contractors, traitors and pirates from the black market and have them sent back to the station in advance. For safety, they'll also be handcuffed (not always) upon delivery. add: Human mobs sold by pirates are not deleted anymore. Instead, they're now captured and sent to the holding facility. /🆑 |
||
|
|
b44f7e16fe |
Explosion Block (A hidden stat on things like reinforced walls) is more effective against heavy and light tiers of explosions (#81603)
## About The Pull Request As of right now if a 5/10/20 bomb goes through a reinforced wall it has its ranges subtracted by a flat value of 2 (explosion block is a flat subtraction to each tier) and essentially gets turned into a 3/8/18. This pr just buffs the effect of explosion block against heavy and light. The modifier is 1.5x against heavy and 2.5x against light (I might nerf 2.5x down to 2x) I dont want to nullify shockwaves because they should always be impactful at weakening the station. In the same situation a 5/10/20 bomb goes through a reinforced wall, it has its ranged subtracted and ends up 3/7/15 Here is an image of a max cap (5/10/20, do note that currently tg server config is like 8/16/32 or something crazy) in tram sci, notice there is roughly 2 layers of reinforced walls on the right and it makes it through the first layer and hits the second, it would likely destroy the entire first layer of reinforced walls and remove several tiles from the second making a second explosion able to go into genetics entirely unmitigated.  In practice the 2nd layer of walls remains miraculously unscathed due to light explosions having an rng diceroll on destroying reinforced walls  A second blast still gets through since the 1st layer is no longer there to protect it.  Do note on live servers it would be much bigger due to max cap being 8/16/32 , going through 1 reinforced walls would result in 6/13/27 which is still far larger than the 5/10/20 shown. ## Why It's Good For The Game Its probably not the best approach to fixing the problem and I probably made it too good at mitigating light but.. As of right now reinforced walls are so weak at stopping or mitigating explosions that they are spammed alittle bit more than they should be on a lot of maps and the nukie ship has a laughably silly explosion block of 20!!! Just to be able to make it somewhat safe. Every once in awhile atmos becomes a hot topic for debate because of some new form of spammable explosive that is getting nerfed because of the way they can easily wipe the station but we never took a look at how explosions are done, if this pr is merged it won't kill those types of gimmicks but it will necessitate actually thinking about how you plan to bomb the station since now you will need to repeatedly bomb to get through hardpoints (remember even if a reinforced wall mitigates an explosion it can be dismantled by it and let subsequent explosions through) or simply position those bombs directly inside of areas of interest Another important note is that rooms that map makers intend to be explosive resistant should be able to better contain 1 explosion so less situations of everyone in sci getting cucked by toxins messing up (unless its so bad that they bomb themselves twice) If this pr is merged I would suggest keeping an eye on heavy firelocks, they are more expensive than reinforced walls but allow movement through them which means they are a lot more practical for spamming explosive block. I personally wanted to make foam and other materials good at uniquely blocking different tiers of explosions but I recall being told that was a little bit too complicated, if this pr doesn't go well I might try that. ## Changelog 🆑 balance: Reinforced sections of station hull have gotten better at mitigating explosive shockwaves. /🆑 |
||
|
|
9ac81e1a64 |
New station trait job: Human AI (#81681)
## About The Pull Request This PR does many things, I'll try to explain the basic/background stuff to the main thing first: 1. Adds a new remote that allows a human to function like an AI. It controls a fly that will fly around the station slowly, and when it reaches a machine then the person can interact with it as if they were an AI. This required changing a lot of silicon/AI checks with one that also checks for this remote, and some messing with shared ui state. 2. Moves req_access from the obj and bot to ``/atom/movable`` which lets it be shared between the two, no more copy-paste and one side lacking features/checks/signals the other has. 3. Adds a check for AI config for AI-related station traits, which was lacking prior Now for the good part... Adds a new station trait that replaces the AI with a Human. This person is equipped with an AI headset (including Binary), an advanced camera console, an omni door wand, the machine controller, and their laws. They are immune to the SAT's turrets (even if set to target borgs) and are slow outside of the SAT, mimicing the actions of the AI. They interact with the world through their advanced camera console, which allows them to do most AI stuff needed, and the holopad they can connect to without having to ring first (like Command can). They are given a paper with the laws they must follow, but since they are human they are able to bend it. Cyborgs that run the default lawset are "slaved" to them via an unremovable law 0, so the Human AI can bend the laws if they really need to (for their own survival n such), and make the cyborgs obey their commands above laws, but in general this shouldn't be a frequent occurrence. This does take into account the unique AI trait, so it's not guaranteed Asimov. When this station trait rolls, all Intellicards, AI uploads, and AI core boards are destroyed and are unresearchable. They can be spawned by admins in-game if necessary. Maybe in the future we can also exclude Oldstation from this but I haven't really decided. Extra perks: Human AI spawns with a Robotic voicebox (unless they are a body purist) and teleport blocking implant, so they can't use teleporters to bypass their on-station slowdown. They also have an infinite laser pointer that can be used to blind through their camera console. This is unfortunately nerfed from the recent borg balance PR that removed its stun. This was meant to be the alternative to no longer being able to permanently lock borgs down like AIs can (or more than one, for that matter). They aren't affected by Roburgers, Acid, and Fuel's toxicity. Bots salute them like they do Beepsky (which is now a trait) They spawn with SyndEye to replace the AI's tracking ability They do not have a bank account ### The machine remote The machine remote has a little fly in it that flies to the machines it is pointed to, working as the arms and legs of the Human AI. It scans the machine and punches in the action the AI does, and is how the AI accesses basically anything. This fly slowly moves from one machine to the next, and can be recalled with Alt Click. It works on machines and bots. ### Video (Low quality to fit Github) https://github.com/tgstation/tgstation/assets/53777086/e16509f8-8bed-42b5-9fbf-7e37165a11e8 ## Why It's Good For The Game I've seen a funny screenshot one day of a person replacing the AI by using a bunch of door remotes, camera console, crew monitoring console, and a few other things. I've been thinking about that for a few years and really wanted to make it official if not easier to make possible, because it is an incredibly funny interaction. This makes it a reality, and while they aren't as powerful as regular AIs, I think it makes for better and funnier in-game moments. With the same weight as Cargorilla (1), I hope this wouldn't be rolling too often and ruin rounds, but instead show off the different capabilities that Humans and AIs can do, to do the job of an AI. You win some you lose some. ## Changelog 🆑 JohnFulpWillard, Tattax add: Adds a new station trait job: The Human AI. /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> |
||
|
|
058cb039eb |
Bitrunning 1.5: Secondary Objectives (#81828)
## About The Pull Request Added secondary objective lockboxes to bitrunning. These pull from a list of secondary objective loot on the domain, with a limited quantity of items. Once there are no items left to pull, the secondary objective disappears. If multiple secondary objective markers are placed, they will be placed until all markers have been used, or all the items in the loot pool are already spoken for. To support this functionality, adds SSbitrunning, which stores all domains as instances, instead of checking the hardcoded types as previously. SSbitrunning manages listing domains for the quantum console, and rolling secondary loot. As an example of this functionality, added a side path to Glacier Grind with a polar bear and some loot. ## Why It's Good For The Game Secondary objectives give mappers ways to encourage players to venture into a wider range of domains by offering non-trivial loot beyond the fluff items given in the main caches. The absolute limit on the number of items available ensures these items can't be farmed. As well as supporting secondary objectives, SSbitrunning allows for future support of features relying on mid-round modification of domains, for instance adding custom domains. ## Changelog 🆑 add: Added secondary objectives to bitrunning! add: Pick up encrypted curiosities and return them to the safehouse to claim their contents. add: Glacier Grind has been given a secondary objective, look out for the limited edition hat. add: Bitrunning domains can now be modified during the round by admins. /🆑 |
||
|
|
5f2f9e67ad |
Add compile option for compiling in MAP_TEST mode, which disables common annoyances when testing new maps (#81697)
## About The Pull Request Adds `MAP_TEST` compile flag. This compile flag blocks common things which make it difficult to test a map. Things this applies to: - Rats no longer spawn. - Rat spawning will (obviously) break up the powernet, which is INCREDIBLY annoying when trying to test if all the rooms of the station are wired correctly (or testing which rooms lose power first, etc) - Light tubes no longer break on initialize. - Random light breakages can easily cause mappers to accidentally over light a room. - Roundstart command report is not printed. - Might be a personal preference, but it's kinda annoying to hear the alert over and over again. - Random events do not trigger. - Some events such as gravity generator outage can trigger with 0 population. - Random camera breakage event can cause over-placement of cameras. - Other stuff tends to just get in the way. - Station traits do not trigger. - Probably the biggest annoyance. Many traits modify the map in some way which disrupts testing. - Roundstart landmarks don't self deletes. - Allows mappers to use sdql to find them. - Mapping verbs start enabled. Obviously more things can be added if they come up. |
||
|
|
3a76cb27fe |
Arcargo: Balance Pass v2 on the Stock Market (#81580)
## About The Pull Request Picking up where I left off on #81216. * Stock market stocks have had their market quantity drastically reduced, as on both the more common and more rare material sides of things these materials traditionally have been traded in quantities that it would prevent bicycle like quantities of materials entering the game while still allowing for access to rare materials at rare material rates of credits. * The stock market subsystem now fires once every 60 seconds, as opposed to once every 20 seconds. To compensate for this, the subsystem now makes much wider price changes every update, to disincentivize players from just camping out at the stock market console all game, as this is behavior we typically discourage (genetics/virology/etc). Material tending times are similarly decreased to make up for that, while noting that stock market events will still enable for a material to change directions at any point as well. * Material prices can drop below their minimum trading threshold, resulting in them gaining protected purchasing status, and resulting in them being unavailable for purchase. This means if you're watching a price drop, and it's still trending lower, there's a distinct chance you might want to buy before it drops below the threshold, or risk it, buy later, and avoid the material getting locked out for another minute or more. * Adds 2 new stock market events to help add additional variety to the stock market's variability, while adjusting the probability of a market event occurring per stock market event. This should average to ~4 events every minute, keeping things somewhat interesting if you're watching the prices of items, but without requiring second to second updates to keep things engaging. * These two events include one that blocks off all material quantity from a material for the duration of the event and resets prices when complete, and another one that maximizes the profitability of a material, but leaves it's market quantity up in the air. * Stock blocks have had their freeze timer decreased from 5 minutes, down to 3, with the warning now at 1.5 minutes. This is to encourage players not to sit on their resources for longer periods of time if their goal is just to sell at a specific price point and to keep items going through the shuttle, which _also_ encourages players to receive mail/receive regular orders from the rest of the crew. * The UI has a number of improvements, those being: * The time until the next stock market update is listed on the UI as an active timer. * The materials listed in the UI are now sorted by the value of that resource per unit. * The instructions are now kept within a collapsible component to cut down on wasted space within the UI. * A few elements are moved over to % width as opposed to a hardset x pixels width for screen size compatibility purposes.  ## Why It's Good For The Game Stock market has been known to create bike levels of wealth with near negligible amounts of effort and was going to need a balance pass eventually. This is being accomplished by slowing down the system, but also making it more unpredictable by expanding on the stock market event system a bit further. Naturally, it could use a few more wacky events to keep the system fresh and active, but for now this helps to keep the system from being a screen simulator while also making game-health changes like lowering material quantities that were capable of allowing the player to double, quadruple, octuple, etc. their wealth every few minutes by just buying low and selling high. Makes a few QOL changes to the UI to compensate for a few of these changes, like the new update timer on the UI in the case we change the time per update any further, as well as to give incentive to players to not just camp the console for new updates, just to glance at how their investments are doing. These tweaks also keep cargo moving as opposed to just trying to power game iron and glass for maximum returns, while giving them extra opportunities to send the shuttle to keep packages flowing for other purchases/getting mail. This has a chance to stop #79978, but I'll edit this appropriately after a TM has confirmed if it was effective or not. ## Changelog 🆑 balance: The stock market now fires slower, has stock market events occur more often, and the stock market has fewer minerals that are available to buy in a single purchase before restocking. balance: Materials sold on the stock market may be protected from being bought if their prices drop too low, so make sure you watch your prices before they run the risk of getting shut out! balance: Stock blocks now freeze the price of materials for 3 minutes, down from 5. qol: Tweaks to the Galactic Material Market UI, with materials sorted based on their rarity and a timer to show how long until it updates. add: New Stock market events, one locks a material from being purchased, the other maximizes the value and quantity of a material for sale. /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
3086ed4f8c |
refactor db connection timeouts (#81816)
Give it exponential back off and smerter logic. |
||
|
|
357799c8a5 |
Removes Orbit Polling Component, SSpolling improvement (#81748)
When I made SSpolling, jlsnow gave me his blessing to delete the orbit polling component [where you orbit something for 20 seconds before it chooses a ghost from the orbiters] It's only used in a few places like soulstones replacing jobbanned/inactive players, etc. Also upgraded SSpolling; you can now place a little icon on the sides in the chat message, chat message looks a lot nicer, the alert pic and the jump target don't have to be the same anymore, and I made it be able to pre-pick candidates since 90% of the use cases would just want 1 candidate Also prints to chat who the chosen one was Also made slime intelligence potions ask the user for a reason, which will be displayed in the alert poll |
||
|
|
16f6200b65 |
Alternate job titles such as chef and department security get injected to the manifest normally, and show up as the right department. (#81634)
## About The Pull Request Previously injecting to the manifest would use solely the mind's assigned role, thus injecting player with alternate job titles such as chef and department security as the job they're based off rather than their actual ID trim. Then if the manifest were to be updated later on, they would show up as being departmentless because getting the manifest checks for an assigned job, which these don't have as they're just alternate titles for an existing job. This resolves the first part by checking if it's possible to get a trim from a held ID and using that before attempting to default to the mind's assigned role. As building/updating the manifest is done after equipping, this lets alternate job titles be assigned as their actual job. Then the second part is resolved by adding a list of alternate titles for the job subsystem to register as being that job, so that a job can have multiple titles which refer to it. ## Why It's Good For The Game It's annoying to not be able to find these in the right spot on the manifest, if at all in the first place. |
||
|
|
88bdabe53b |
Adds a small cafeteria behind the right wing shutters of the museum. (#81465)
## About The Pull Request I was thinking to contribute something to the new away mission map to make it better. Mapping and all takes too much time for me, so I could do little. Though it comes with its own unique gimmicks. To reach the cafeteria, one has to complete a couple puzzles. The first set is opened by inputing the correct PIN on the password panel beside it. There're several clues to help you guess this fairly easy puzzle, in the form of several number graffitis, a scrapped piece of paper full of numbers, and a board filled with colored dots also found just beside the panel. The second one is opened by a keycard, and is generally lazier. To find it, you'll need to do a bit of (toilet) searching. As for the unique things this PR adds: - A fire extinguisher... that actually contains welding fuel - A (dirt-cheap) hotdog vending machine* - A completely ornamental maneki-neko (that's the name of the luck-bringing, paw-waving cat figurine) - A piggy bank that carries money between rounds. It has a cap of 10k credits worth of holochips, cash and coins, which is pretty high, but I'm confident people will just destroy it for its contents the moment they find it. His name is Pigston Swinelord VI. - More, totally legit and not actually fake bombable walls :^) *By the by, you can also find it during the national hotdog day. Screenshots of the new location:   ## Why It's Good For The Game You know how most away missions are not that special at all? Yeah, @mc-oofert set an example of a pretty decent one actually, if not a tad small. I thought it could use a touch of another mind actually contributing to it too, because it deserves it. Also, this sets the basis for other persistent piggy banks. I don't think they should all have that 10k cap like this one, perhaps 1k is enough. Beside, the code that mothblocks did for json database datum is pretty good, so there is not a whole lot of shitcode here. ## Changelog 🆑 add: Added a cafeteria to the museum away mission, with a few special things to it. To reach it, you'll have to complete a couple puzzles however. map: The museum away mission now has a couple restrooms. add: Hotdog vending machines may spawn during the National Hot Dog Day. /🆑 |
||
|
|
a88013783a |
Fix shutdown hanging if the db went away. gives shutdowns a time out. improves db shutdown logging (#81813)
terry right now: ``` [20:11:31] Runtime in code/controllers/subsystem/dbcore.dm,353: Attempting to create a new db query during the world shutdown ... [21:25:29] Runtime in code/controllers/subsystem/dbcore.dm,353: Attempting to create a new db query during the world shutdown ``` |
||
|
|
977799a2e7 |
A red spy has entered the base: Adds Spies, a roundstart antagonist inspired by Goonstation's Spy-Thief (#81231)
# Disclaimer: No Goon code was referenced or used in the making of this PR ## About The Pull Request [Design Document (Read this for more information)](https://hackmd.io/@L9JPMsZhRO2wI25rNI6GYg/rkYKM9Yc6) This PR adds Spies as a new roundstart antagonist type, inspired by Spy-Thiefs from Goonstation. Spies are tasked with stealing various objects around the station, from insulated gloves to the black box, from the clown's left leg to the bridge's communications console. For every item stolen, the Spy is rewarded with a random item from the Syndicate Uplink, plus some items uniquely available to the Spy. Stolen items are then shipped off and sold on the Black Market Uplink, allowing the crew - or maybe some other evil-doers - to get their hands on them.  More ideas for theft items and bounties are welcome. ## Why It's Good For The Game See the design document for more information. In short: Adds a solo antagonist which has less impact than your Traitors and Heretics, but more impact than Paradox Clones and Thieves. In other words: On the same tier as old traitors. Seeks to embrace the sandbox aspect of antagonists more by having no precise greentext objective, and instead some suggestions for chaos you can embark in. Have fun with it! ## Changelog 🆑 Melbert add: Spies may now roam the halls of Space Station 13. Watch your belongings closely. /🆑 |
||
|
|
b0fd97dafe |
Allow voting statistics to be hidden (#81686)
## About The Pull Request Allows polls to hide the voting statistics, both while the poll is running and when it completes, so that people vote in isolation of knowing what other people are voting for. It looks like this:   This functionality is also available for custom votes triggered by admins, if they want it. ## Why It's Good For The Game Put simply, if likely to be controversially, sometimes people get upset that an event with a 5% chance of happening occurs 5% of the time. Now they really won't know what the chance was, only that it was picked by a weighted choice. Lack of knowledge about what other people are currently voting for should also curb "meme votes" where people pile onto something they see other people voting for, your vote in a poll with hidden stats can only be influenced by your own opinion because you can't see what the crowd is doing in order to join their bandwagon. ## Changelog 🆑 add: Displaying the voting statistics is now optional on a per-poll basis, and is disabled for map voting. /🆑 |
||
|
|
871cec76aa |
Adds a multi-dimensional bomb payload to the black market. (#81562)
## About The Pull Request This PR adds a !!!FUN!!! bomb payload to the blackmarket, which, upon detonation, transmutates all terrain in a range like the dimensional anomaly would. You can also select the dimensional theme to use by using it in your hand. I believe however, this thing should cost a fuckton to get and only show up occasionally. 8k to 10k was my original idea, but I think that's perhaps not high enough given its flagrant potential. Perhaps I should also make it so the more dangerous themes yield a shorter range than others. Suggestions are welcome. Screenshot of what happens when you don't set the theme:  This PR also turns dimension themes into singletons so we access them more easily. Nothing to write home about. ## Why It's Good For The Game The black market could always use some extra thingy or two anyway, and this thing could either be a source of emergent gameplay, or a recipe for a disaster. Perhaps second to the Big Slappy for how funny it could be. ## Changelog 🆑 add: Added a multi-dimensional bomb payload to the black market. It's very expensive. /🆑 |
||
|
|
717209899b |
Paintings update: Curators get a cut on patronage + zoom in/out buttons on UI (#81500)
## About The Pull Request (Roundstart) Curators now get a 22.5% cut on credits spent on painting patronages (divided by the number of curators). The service department also gets another, 12.5% cut. This PR also adds zoom in/out buttons to the painting canvas UI. So you don't have to stare at a blob of such enormous squares while the UI is open, which is only good when drawing. Screenshot copypaste in paint: ## Why It's Good For The Game The painting feature is mostly an end in itself, which is totally fine. I've put quite a few quality-of-life changes into it through the years, and I still want to kick in some stuff. However, I think the curator should actually benefit from them in a more "mechanical" way. Furthermore, I personally prefer them over the random written crap that players make. Also, as I said above, the canvas UI can feel a tad too big at times. |
||
|
|
2b5486359e |
Valentines Day Rework (Better Late Than Never) (#81499)
## About The Pull Request Big changes: - Participation is Valentines day requires consent, as consent is important. - When the event triggers, all valid players are automatically signed up to get a random date. However if you're uninterested, you can opt out of getting a date. - This uses the same system as ghost role polling, so it's a non-obstrusive screen alert + chat box entry. - AIs are now given a zeroth law to protect their date. - This does not override existing zeroth laws (for malf ais). - This zeroth is law is worded in a way such that they are not effectively malf AIs. Their other laws still apply, but not for situations pertaining to their date. - Cyborgs are desynced from AIs and are given similar zeroth laws to protect their date.  Small changes: - Valentines cards are now paper. Meaning you can write on them, stamp them, or yes, burn them. - Third wheeling is more codified than before. Third wheels get their own antag datum type. - The antag panel listing in roundend takes up significantly less room for each date. Additionally, dates are now paired up with each other. - Adds implementations for getting pronouns from mind datums.  ## Why It's Good For The Game It's 2024 and our Valentines day is sooo 2012. I'm a big fan of Valentines Day, personally - it gives me the opportunity to mess around with another player that I probably would not otherwise mess around with, getting into shenanigans I would not otherwise. But as the years have gone by it's gotten pretty lackluster. Some people like it as much as I do, but others ditch it entirely and ignore the objectives. And if you get paired with someone ignoring it, well, now you're out of luck! This is something I'm aiming to rectify by making it opt-in when it triggers rather than forced. All the people participating will be guaranteed to get someone who cares about the event as much, which makes it more fun. As for the silicon changes, there's been lots of confusion around silicons and their dates, so I thought I'd fix it here as well. Also, better late than never? ## Changelog 🆑 Melbert add: Valentines Day now polls all players for candidates when it triggers rather than forcing all players to be a Valentine. Consent is important. add: Valentine silicons now gain special laws pertaining to their date. qol: Valentines Cards are now paper, so you can write on them, stamp them, or burn them. qol: Valentine's roundend report no longer takes up a massive amount of space and also no longer sound so, so weird. /🆑 |
||
|
|
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()` |
||
|
|
1e420947b1 |
Fixes smoothing breaking if a map is loaded post init (#81526)
## About The Pull Request We'd finish a set of atom creation, then try and smooth those atoms The problem is they might try and smooth with an uninitialized neighbor, which wouldn't have its smoothing vars parsed. This fixes that by pooling "to be smoothed" things into a list based off the source of the init stoppage, which we then release when we're done. Also fixes things staying in mapload, even during a sleep. This can cause massive headaches so it's good to avoid. This has a cost but it's minuscule (on the order of like 0.006s (6ms over all of init), so I'm happy with it. ## Why It's Good For The Game Closes #77040 ## Changelog 🆑 fix: Maps loaded in after roundstart will no longer have broken smoothing /🆑 |
||
|
|
9fb2a54c30 |
Adds Subsystem Profile Focusing (#81461)
## About The Pull Request adds a var to /subsystem that when toggled to true by an admin makes /subsystem/ignite() start the profiler before calling fire() and then stop the profiler after, this allows us to audit any individual subsystems synchronous call chain. ## Why It's Good For The Game  when SSInput is focused  when SSair is focused some subsystems are hard to profile performance issues for because theres a billion procs downstream of them in the profiler and some of them arent even unique to them (if a subsystem is spending half of its time in some procs downstream of /_SendSignal() how could you tell). now we can just do it. starting (and stopping?) the profiler itself is expensive and this messes with the full round profiler but this is worth it. also this doesnt help with sleeping procs / timers created downstream of that subsystem. ## Changelog 🆑 admin: admins/maintainers can now make the profiler focus on specific subsystems by setting the subsystem var profile_focused to TRUE /🆑 |
||
|
|
708b293134 |
Reduces chat/audio spam when multiple ghost polls are being called (#81441)
## About The Pull Request This slightly modifies the polling subsystem. The sound/chat popup for a new role is now only given on the first "stack" of a role signup. Let's say 3 loneops roll at once (ty admins), you'll still get the toast popup for 3x loneop rolls, but you'll only get one text highlight in the chat, and only one audio stinger. Even if the first 2 loneops don't have anyone sign up for it, using the text or toast signup options will still sign you up for the last roll as it completes. This shouldn't make signing up any harder, just quieter. ## Why It's Good For The Game Less spam in chat. Less headset-blasting audio bleeps. Cool! Closes #80998. ## Changelog 🆑 Rhials fix: Ghost role polls should spam you less when multiple of the same roll occur in succession. /🆑 |
||
|
|
9ddfd4a289 | Moves inter-round caches to cache/. Deletes tmp/ between rounds. Keeps tts from killing servers. (#81433) | ||
|
|
a210563de0 |
Adds a Touchy quirk (#81387)
## About The Pull Request Adds a new quirk for -2 points that requires you to be next to something to examine them, like blindness but without the timer or actual blindness itself. ## Why It's Good For The Game For the player using the quirk, it's 2 points for losing the ability to simply examine everything around you, making it harder to tell what someone has in their hands when they are charging at you, for example. You need to get up and close to things to see what they are. For people being examined, it's just another possible excuse to be near them, opening up plausible deniability for actions such as sleepy pens, changeling stings, etc. ## Changelog 🆑 Atlasle, JohnFulpWillard add: Adds the Touchy quirk, you need to be next to something to examine it, for 2 extra quirk points. /🆑 |
||
|
|
33d5987739 |
[NO GBP] Fixes raw ectoplasmic anomaly refining (#81377)
## About The Pull Request This adds a proper cap for raw ectoplasmic cores, so they can actually be refined now. Cool! ## Why It's Good For The Game Broken thing need fix oops argh. Closes #81369. ## Changelog 🆑 Rhials fix: You can now refine ectoplasmic raw cores at the implosion machine thing. /🆑 |
||
|
|
233fdcdea7 |
Makes point_types not be dumb (#81202)
## About The Pull Request We currently have a list of point types that is meant to be list(``DEFINE`` = name) but it's completely useless since the define is just the name anyways. It's not used for anything, it has no purpose to be this way. It seems more like a holdover from when there were multiple types of research points (it was made for that purpose, even before nanite points were a thing) but even for that, it serves no purpose. I reworked it now to be the abbreviated name of the research point type, de-hardcoding techwebs a little bit and removing the need for downstreams to edit the techweb UI. ## Why It's Good For The Game This at least looks better and makes more sense at people just looking over it. ## Changelog No player-facing changes. |
||
|
|
ed31397cc4 |
Fixes ore vents spawning without ores on icebox, sets up map specific ore configurations (#81103)
## About The Pull Request In short, we used a static list previously within the ore_generation subsystem that held the amount of each ore that we expected a single map to uniformly need. We held this number constant, since we were spawning 15 vents per map. **Pros:** This worked flawlessly for Lavaland since 15 vents on a single Z level makes it pretty densely packed map with a good amount of map-based ore spawns, and it worked consistently. **Cons:** 15 vents did not work well on Icebox however, even when split so that the majority of the ores were spawning on the lower levels, players did not feel like icebox spawned nearly enough ores and reported the map spawning empty. **Result:** As a result, we adjusted the ratio, so that we spawned vastly more ores on the lower levels, now up to 4 vents on the upper level, and 21 vents on the lower level. However, as we were still using the ore distribution list based on lavaland, icebox vents were quickly running out of ores to distribute between them, resulting in empty vents -> which produced empty boulders -> which not only don't really let you process them properly, but also just result in a metric ton of runtimes. Icebox now has it's own list of ore distributions. These distributions are now moved to a set of global lists as opposed to being saved on the subsystem as a static list, which will make going and setting up new ore distribution lists very very easy. Additionally, we've moved the setting and getting of those ore_distributions over to the seedRuins proc, so that we're actually setting the list of ores right before we actually place them to make sure that the order that it's set is roughly as it's needed, while still setting the list at the same time the map-appropriate ruin placements are dropped in. **Plus some misc cleanup fixes:** `var/list/ore_vent_sizes` in SSore_generation wasn't being treated as a similar budget list as `ore_vent_minerals`, since it `pick()`s off it's own static size list. Which is honestly fine for this five seconds, I can handle that later while we make sure the rest of the code code is stable. In the meantime, I've just tweak it so that it's easy to see at a glance how many of each random vent has spawned into the map. Tweaked the description to not include anything about chemical processing, as I'm planning on hitting on that in a part 2 PR that I'll be picking back up after the freeze. ## Why It's Good For The Game Cleans up the code a bit, but primarily fixes ores not spawning on icebox as they should. Should fix #81058. Improves description to not mention mechanics that aren't in game. Also, cleans up a piece of code that currently isn't serving much of a purpose. ## Changelog 🆑 fix: Icebox should have it's ore distribution and it's ore vents fixed, so that vents should now produce ore. spellcheck: Boulder processing machines now don't mention things they don't do. /🆑 |
||
|
|
4dba3f75f3 |
Gives paradox clone their own ghost polling icon (#81229)
## About The Pull Request Currently all ghost roles, when polling for players, shows a syndicate poster. This is lame as hell, especially since most of the roles aren't even Syndicate aligned. This adds support to have your own icons for it, and adds one for the Paradox clone since I already had an idea for it. ## Why It's Good For The Game Paradox clones are not syndicate aligned and it does not make sense to portray that to players, this looks much better, and hopefully soon other antags will follow suite.  ## Changelog 🆑 add: Paradox clones now have a bluespace stream instead of a syndicate poster as their ghost poll icon. /🆑 |
||
|
|
c76df7f37a |
Station Goals are now handled by SSstation instead of a global list (#81177)
## About The Pull Request You can now get station goals in a slightly better way over using a `locate() in` call on a global list. The Meteor Satellite goal no longer stores a giant list of ALL OBJECTS in view. And now correctly only counts turfs. ## Changelog 🆑 fix: Meteor Satellites no longer erroneously count every piece of paper as a protected turf. fix: As a result the station goal is slightly more difficult /🆑 --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> |
||
|
|
850ace7a84 |
Fixes Cult voting for a leader (#81169)
## About The Pull Request With the recent changes to polling, it seems like it didn't properly poll cultists, I fixed that and fixed other issues with it (such as it telling players that they are signing up to BE a cult leader, when they arent). Also fixed the button to put yourself forward as cult leader, it properly removes and gives itself when necessary. ## Why It's Good For The Game Cult button works again how cool is that Closes https://github.com/tgstation/tgstation/issues/80620 ## Changelog 🆑 fix: Cultists can now vote for a Cult leader again. /🆑 |
||
|
|
a09cca83fd |
Removes overly optimistic warn on byond version (#81185)
## About The Pull Request I assumed this would be fixed because I assumed it was a bug. My report goes unresponded to. |
||
|
|
f245c447f2 |
Improves upon setting custom materials for printed items (#81015)
## About The Pull Request This is an improvement on #80839 regarding how custom materials are set on items, it's based on the following findings. 1. `set_custom_materials()` proc already comes with an prebuilt `multiplier` var |
||
|
|
87cf3da1fd |
Stock market event refactor and code improvements (#80985)
## About The Pull Request Stock market events are a system coded into the stock market system in an attempt to keep the stocks unpredictable, at least on paper. They... need work, I'm in full agreement on that, but I haven't been able to get the energy to really fix stocks as of recently. I plan on going and kicking events up and making them a lot cooler, but in the meantime, I've refactored stock market events into their own datum type, `/datum/stock_market_event`. This works like most similar event datum style objects, where an event has a proc called when an event starts, a proc called when an event ends, and a proc called between on subsequent stock market subsystem firings. This does some minor tweaks to the newscaster stories automatically generated after an event fires, namely so that they can be produced quickly while emphasizing the important part of the event, what material is being effected, and a summary of what kind of behavior has happened to the material stock. Additionally, this made for a good excuse to do some code cleanup here while I had the opportunity, swapping to `::` as opposed to `initial()` calls where it seemed cleaner and more appropriate. This should make adding new stock market events as well as more unique events that can effect cargo and the round at large simple to do. This PR shouldn't have any mechanical changes to how stock market behaves in a live round. ## Why It's Good For The Game Improves code quality of stock market, increases readability of stock market events that have happened on the newscaster, and performs some minor cleanup to the TGUI for the stock market while I'm at it, all while keeping balance the same while we're still in the feature freeze. Full disclosure, once the freeze is over I have some pretty easy numbers tweaks planned to help significantly improve the stock market system that I had layered on this branch, but we've shuttled them off this PR for now to get this part ready to ship. ## Changelog 🆑 refactor: Stock market events are now their own objects, and are handled by the stock market individually. /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
495fde6a2c |
Add: 2 Quirks Configs (#81033)
## About The Pull Request This PR adds two new config options for quirks: - *Flag* `DISABLE_QUIRK_POINTS` - When enabled, disables quirk points balancing. - When enabled, players can select positive quirks without first selecting negative ones. - When enabled, the quirk points balance visually hides itself on the Quirks page. - *Number* `MAX_POSITIVE_QUIRKS` - Limits the maximum quantity of positive quirks which players can select using the Character Preferences page. - I ported this from the old `MAX_QUIRKS` define. - When set to `0`, players won't be able to select any positive quirks, and they won't appear on the Quirks page. - When set to `-1`, players will be able to select any quantity of positive quirks. - When commented-out or undefined, the default is `6`. - When set to `0` or `-1`, the positive quirk balance visually hides itself on the Quirks page. ## Why It's Good For The Game There is some downstream repositories asking for the quirks system to be configurable. Additionally, I always find myself tweaking these values on my own private servers and I thought it would be nice to share my edits. Usually I was simply commenting-out sections of this code in order to get the same result, so it helps to have an official way to disable quirk points. ## Changelog 🆑 A.C.M.O. config: Added two new config flags for quirks, DISABLE_QUIRK_POINTS and MAX_POSITIVE_QUIRKS. /🆑 |
||
|
|
002051a3d5 |
ArcMining Pr Beta: Version 1.2 (#78524)
This one's not like the last one, so much so that I'm not even going to outsource the PR description to a robot this time! Basically, **You should read the PR body before assuming that everything is the same as last time. It's not.** ## Video Summary Click the link below to see a video summary of the main features of this pull request. https://youtu.be/Aho2omR0mjY?feature=shared ## About The Pull Request This pull request serves as a large rework of minerals produced by mining, and by extension mining itself. I'll try and list each change and it's associated nuance here. ### Ore Vents The biggest addition to the game with ArcMining is **Ore Vents**. Ore vents spawn as a ruin on the map, placing a randomized ore vent onto map generation. Ore vents spawn in 3 different sizes, **Small, Medium, and Large**. These vents will pick from a pool of materials they can generate, and will hang out across the map. A player can use a mining scanner to discover an ore vent, granting a small quantity of **mining points** to begin with. Once scanned, ore vents will show what minerals that ore vent will generate after they're fully tapped. Scanning the vent again will trigger the extraction process. A small drone will fly down, called the NODE drone, and buckle onto the vent. Your job during wave defense is to protect the drone and to defeat waves of randomly spawning mobs (dependent on if you're on lavaland or on icebox). The quantity, duration, and time between waves is scaled to the size of the vent you're protecting. Starting by scanning and protecting lower tier vents earlier in the shift is a safer bet than doing a large vent in the first few minutes. The drone has 500 health, and can take a good few hits, but leaving it alone will cause it to meet an unfortunate end quite quickly. Cooperation can be your best asset, as mining with allies can greatly help with wave defense, and mineral points are granted to anyone who helps with defending the ore vent equally (So 500 * size tier, regardless of how much help you receive). Once complete, the ore vent will have a mining machine constructed on top of it, and will start to dredge up **Boulders** from the earth automatically. More on boulders later. Ore vents can be located based on your mining scanner, and will provide an appropriate audio cue based on if the ore vent has been discovered or not, and once processed will no longer alert you to it's presence. **Each station comes with a free vent that produces exclusively iron and glass, free of charge.** This is to help with shifts where the station may not have shaft miners to produce minerals, and to provide the station with a baseline amount of minerals where none may exist otherwise. ### Mineral Generation Mineral generation has been completely reworked. Previously, Mineral Generation had a flat 13% spawn rate in-game. Once minerals spawned, they would also have a chance to propagate their minerals to nearby tiles, resulting in a rather massive pool of minerals that could spawn throughout lavaland on the whole. This tweaks that, by making minerals in walls spawn based on their proximity to ore vents on maps that use cave generation. Both the probability, and quantity of ores spawning in walls is scaled based on distance, with ore vents looking like large caches of ores found in walls. This makes following ores found in walls and checking their quantity of minerals spawned a good indicator of how close you are to a nearby vent in-round. This means you can collect some points form both discovering ore vents first, as well as collecting their surrounding ores, turn those in for mining points, and then trading them in for gear upgrades to more effectively take on ore vents. As a result of tweaking the balance of this, the total amount of ores spawned in walls overall has been decreased. However, by making more of the process time based, we still result in a mostly balanced finished product. ### Boulder Processing On station, there are now three new machines. These are the BRM, the Refinery, and the Smelter. - The BRM acts as a teleporter. Instead of needing to carry boulders back to the station, you can activate the BRM, and it will automatically pick boulders to teleport back to itself. You can use this to teleport boulders dredged up from lavaland onto the station for processing. **The BRM will only lock on to boulders that are resting on an ore vent.** Moving boulders back by hand will mean you'll have to haul it back by hand. - The refinery processes the non-metallic materials out of boulders. This process sends the materials straight to the ORM, and collects mining points from the ores smelted in the machine. Swiping with an ID card lets you withdraw those points for your own personal account, but remember that these points are for your whole team to share from. The **Mining points obtained from this process is only 75% of the amount an equivalent amount of ores would provide.** - The smelter works nearly identically, however the smelter produces metallic materials out of boulders instead. - Once a boulder has had all of it's materials extracted, it's broken down and deleted from the line. Otherwise, the boulder is spat out for the next machine to process it (either the refinery or smelter). - Once there's no minerals left in a boulder of any type, the refinery or smelter will break the boulder down. - Boulders **do not stack onto tiles with each other**, so they'll block each other when pulled or when moving on a conveyor belt. Boulders can also be processed by hand. Using a mining tool on a boulder with right click will allow you to break down a boulder into it's composite ores, but limits you to a maximum of 10 ore per boulder, where the full amount can be extracted using the proper processing machines. Also, processing by hand does deal small amounts of stamina damage over time, do breaking a full large boulder can be particularly taxing. Additional Boulder Processing Machines can be built, with the BRM board being obtained from the Protolathe, while the Smelter and Refinery boards being obtainable from the Autolathe instead. A _boulder processing beacon_ can also be obtained from the mining points vendor as a reward to assist with boulder processing. Boulder processing beacons can be used to spawn in a new BRM, refinery, and smelter on the tile the user is standing on, however **you'll still need to link them to the ORM**! All three machines can be upgraded with Stock Parts, allowing for **more boulders to be processed at a time**. It does not, however, increase the amount of minerals received from boulders, or points earned. ### Mining Borg Tweaks Mining borgs have been given some minor adjustments to compensate for the changes to mining. Their mineral scanner, which now has an active component to gameplay, is now a module as opposed to built into the mob. This module allows for the same ability to discover and start waves of monsters to fight. Mining modules will find that their PKA now has a total of 90% mod capacity as compared to the 80% they had before, to allow for more robust defense of ore vents. In addition, all borgs and AIs can interact with the BRM for boulder collection. ### Mining Mech Tweaks Mining Mechs have had their utility tweaked as a result of these changes as well. Mineral scanners to be used on mining mechs now have a larger radius by comparison to their handheld cousins. Similarly, it now has an active scanning button, which will actively discovery nearby ore vents. To begin wave defense, you will need to hop out and scan a second time however, so that you can properly accept the risks of drawing a horde of bloodthirsty wildlife towards you and your companions. Mechs can also manually process boulders, similar to mining tools using their drill. ### Golem Tweaks Golems, being more gentle and less aggressive than humans, while being made out of LITERAL ROCKS, have a greater need to secure access to ores and minerals to eat. As such, they have adapted to be able to do two new things: - Golems may now right click ore vents to be able to manually haul a boulder out of the vent. This costs a hefty amount of stamina, but it allows for golems to avoid combat during regular gameplay. - Golems may now left click a boulder with an open hand in order to manually process a boulder like a pickaxe. While not faster, it is consistent and prevents golems from starving if they have access to a vent, but no ores, somehow. ### Gulag Tweaks The labor camp, being a camp for rehabilitation and ~~excessive manual labor~~ has been tweaked. Boulders now replace the random minerals located on their island, and to acquire their prizes inside, much be excavated and then broken out of the rock. Now YOU TOO can excavate minerals and become a true mineral hero by working your way to freedom. ### Mining Point Changes As a result of fewer mining points being available across the map due to the new ore spawning mechanics, and the shift in how and when ores will be coming in, almost every progress based mining point cost has been reduced by around 10-20%. Many numbers are still subject to change at present, but the idea is that core progress unlocks should be made a bit more available earlier in the round before players can start to solo or duo larger or more difficult ore vents, after which they'll be rolling in ores. ### Rarities Every once in awhile, an unusual boulder will get hauled up from the mineral rich depths of lavaland. These **Artifact boulders** can occasionally produce rare items, but for now they've mostly just been pulling up **Strange objects** for science. Nanotrasen Natural Sciences department will reward you extra points to be collected by boulder processing machines for successfully extracting one. In the future, this opens up a passive reward space that mining can reward to the station, like providing cytology DNA samples, ancient seeds, or other artifacts. ### Misc notes - Boulders can be stored in all varieties of ore boxes (ground, mech) should you choose, however as mentioned it's best to leave them where they spawn and teleport them to the station for convenience. - Maps that are not subject to cave generation will find that they are largely untouched in terms of mineral balance. - Future or existing ruins can now be tweaked to have a mineral balance cost, as the ore vent ruin does. This will allow us to spawn in more interesting ruins for pre-made combat challenges. - There are unique ore vents that spawn across the map, that will summon a boss mob relevant to that map. If the boss mob is defeated, that vent will spawn large boulders pulling from every possible ore type that can spawn. Not for the faint of heart! - Similarly, the number of ore vents and mineral budget is now adjustable in the cave generation procs, so maps may spawn with more or less ore vents as desired for balance. - Artifact boulders opens up a LOT of room for possible future content like archaeology, xenoarch, artisci, and other design spaces! - Megafauna STILL SPAWN ON THE MAP. They just happen to spawn in addition to boss ore vents. - **I'll add more to this as I get asked questions and remember things, this is a huge PR and I'm confident I've missed at least something** ## Why It's Good For The Game I outlined a lot of this in #78040, so I'll try and keep this relatively snappy this time, while noting that I've made some concessions to make the whole system a lot more playable while not trying to break out design decisions that are at the end of the day, better for the game and the overall resource balance in round. Minerals are a very poorly balanced system, and have been since their inception many years ago. We heavily rely on mineral balance in round, and yet we've really only balanced it by introducing so much supply that there's no equivalent exchange for materials that doesn't just heavily flood the exchanged material. For example, items printed from materials that are otherwise considered "rare" on master exist in such quantities and they'll never practically run out in our allotted 90 minute time slot design. This PR adjusts how ores spawn to a point where we can minimize the amount of ores that need to exist on the map for mining to be able to progress, while still providing enough resources for the station that it covers the needs of the station adequately. Miners will need to be more strategic about what resources they've collected, and be able to make decisions about which vents are worth the risk of attempting to fight, how to prepare for a wave defense, and when to head back up for upgrades, while finally giving them at least some kind of incentive to work together and use different equipment. Resonators make cleaning up the caves around vent easy, sandbags set up easy defenses for your vent, mechs can serve as a wider range radar while mining, all while still providing a new gameplay loop to mining. By limiting the amount of ores that can enter the round from the massive, massive amounts that were coming into the round beforehand (see #78346 ), we can make ore processing more meaningful by adding more gameplay to the processing of minerals. I have some plans for that, however this PR already got bloated really REALLY badly due to scope creep and the number of intersecting systems that rammed into each other to make this PR possible. So that'll be next. Plus, as I've mentioned, we open up places for ore processing to find fossils, relics, and other things that can implemented down the line. Overall, I don't expect this PR to save or kill ore balance, but we gain a LOT more control over it through the use of our mining defines attached to this PR, and at the end of the day, that's a great place to start off of. ## Changelog 🆑 add: Added ore vents. Scanning them with mining scanners shows what minerals they contain. Scan again to fight off a horde of beasts as your drone assistant excavates the vent, so the ore vent will produce mineral boulders! bal: Ores that spawn in walls now spawn based on their proximity to ore vents, with their chance to spawn and their minerals contained scaling from low to high. add: Added the BRM, Refinery, and Smelter. These pieces of equipment are used to process ore boulders into minerals for the station. Stock Part upgrades allow more boulders to be processed at one time. They collect mining points as well, to be redeemed with an ID card swipe. add: Boulders are teleported to the station via the BRM if left untouched. Boulders can also be cracked open for a reduced amount of ore using pickaxes or golems hands. add: All stations come equipt with a pre-excavated ore vent, which produces a basic supply of iron and glass only. Scan other vents for your critical resources! add: Look there's a shit ton of changes on mining, for more detail check out the Pull Request: https://github.com/tgstation/tgstation/pull/78524. sound: New sounds and noises for your high octane factorio-like gameplay! image: All new boulder sprites for the new minerals and rocks added to the mining gameplay loop, as well as mining machines! image: Overlays appear over vents when scanned to let you know their contents at a glance when actively scanned with any mining scanners. /🆑 --------- Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com> Co-authored-by: Jacquerel <hnevard@gmail.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
3ca3c781ef |
Fixes clown ops getting their codes (#80992)
## About The Pull Request Nukies were using ``get_machines_by_type`` in ``assign_nuke`` to get the nuke and set its code, which doesn't work for clown ops because they use a subtype. This fixes it by replacing it with ``get_machines_by_type_and_subtypes`` instead. while I was messing with clown op code I also made it a little bit less copy paste  ## Why It's Good For The Game Clown ops now get a code to their nuke rather than it staying as 'ADMIN', pretty cool! Closes https://github.com/tgstation/tgstation/issues/78306 ## Changelog 🆑 Momo8289, Pepsilawn, Sinsinins, JohnFulpWillard fix: Clown ops now get a code set for their nuke. /🆑 |
||
|
|
8703eac50d |
split area.contained_turfs up by zlevel, make init 10 seconds faster (#80941)
## About The Pull Request Situation: areas have a list of all turfs in their area. Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs that has to be traversed for every turf we need to remove from it. This can take multiple byond ticks just to preform this action for a single space rune Solution: split the list by zlevel, and only search the right zlevel list when removing turfs from areas. replaces `area.get_contained_turfs()` with a few new procs: * `get_highest_zlevel()` - returns the highest zlevel the area contains turfs in. useful for use with `get_turfs_by_zlevel` * `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in a given zlevel. Useful for code that only cares about a specific zlevel or changes behavior based on zlevel like lighting init. * `get_turfs_from_all_zlevels()` - the replacement for `get_contained_turfs()`, renamed as such so anybody copying/cargo culting code gets a hint that a zlevel specific version might exist. Still used in for loops that type checked so byond would do that all at once * `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists but only for non-empty zlevels. very useful for for loops. The area contents unit test has been rewritten to ensure any improper data triggers failures or runtimes by not having it use the helpers above (some of which ensure a list is always returned) and access the lists directly. |