mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-06-23 07:05:13 +01:00
9fb7c20daaa76bd3a511aed96dc85ba75ff47ed2
320 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e0827de4b5 |
[MDB Ignore] Unrestricted Airlocks - Door Delays (#94040)
## About The Pull Request This PR adds a change to a pretty prevalent feature that's been around since #66588 (April 28th, 2022). Although it has been controversial to some extent, I believe that it was a good change in principle for reasons I will later get into. For now, this is what the PR does: * All _station_ unrestricted door helpers (e.g. those in maintenance) have been replaced with a subtype that adds a random 2-3 second delay to opening the door, using a new "unrestricted latch" feature. **This does not occur if the user has regular access to that door.** * The unrestricted side will initiate a do_after and plays a distinct small hissing sound (because I presume you're disengaging some hydraulic lever on that side), after which the door will open as players have come to expect. * While you're engaging the lever, you will be resistant to pressure movements as you are presumably holding onto the lever or something. All other movements (e.g. voluntary, being shoved, etc.) will continue to function as expected. * We will statistically tabulate each time someone attempts to use the unrestricted "lever", and every time one successfully occurs. This is just for analysis to see player trends as we have lacked this over the last 3.5 years. Here's a link to the sound I added: https://freesound.org/people/Usernameis1337/sounds/632755, the version in this PR was converted using OGG Vorbis. https://github.com/user-attachments/assets/4167bda4-63b5-4dc0-a7b2-694a9e3d3201 ## Why It's Good For The Game Back in 2022, I was one of the major proponents for adding such a change to the game. This is for a few reasons: * It doesn't really make human sense for a station to have hallways/spaces that you can enter and then just get completely trapped in. The station is a deathtrap because of _who_ is on it, not because it _is_ a death trap. I have always maintained that we should assume that the station is competently made to give the hijinx a much more jarring background. To me, maintenance isn't old sections of a station (although it can have those elements), but vital side pathways in the event of emergencies, like having extra fire stairs in a building. The doors to those fire stairs are always unlocked because they need to ensure that people are able to efflux to save themselves from danger rather than die. * It was easily subvertable anyways. You can easily ask the HoP for maintenance access or AI to let you out of maintenance (although the latter was a bit harder to articulate). I don't find myself agreeing with this as much nowadays but I remember the frustration I felt waiting for minutes for someone to open the door had something occurred for me to have found myself in maintenance. It's simply not fun and doesn't make sense for a station to have this. * I thought that it added a unique element to antagonism. You can't drag someone in maintenance and then have the whole entire subsection of the station be your den. It's important for you to secure your base should you be dragging people in there instead of just always being able to win via dragging. * People tend to forget this point, but it actually did cause a lot _more_ deaths in situations where threats originate outside the station/in maintenance. It was much easier for the killy-stabby mass murderers to ingress into main hallways and get to killing faster. This is why the change felt "equal" in a way. ### Why not remove it outright? I believe that a lot of balance changes over the last 3.5 years (30000 issues ago!) have been weighting for these interactions, and I think removing it all cold-turkey like will cause a huge upturn in deadliness and just not be what players are looking for in the new game loop. To me, this was a vital step in getting more towards 90-minute rounds, and I think we would see a drop in that. I also have those above three reasons that I am still a firm believer in, but I am still interested in seeing what a different system might entail and how that could play out. I added stat gathering so after we get 4-6 weeks of data, we can determine to keep or shelve this feature. I will probably always be on the "blocking" side of removing it outright unless there's some severe data that can convince me (which will probably need it's own test-merged PR, while this is meant to be added into the game right now). ### Why are we changing it? I think not enough people are dying. I played a few rounds yesterday and while a decent chunk of people were dying, I saw a few follies in my original line of thought. Maintenance should be a bit creepier and not auxiliary hallways (in normal circumstances), I already thought we did a really good job of that but I noticed that it wasn't as good as memory served me. I think maintenance should have a little bit more difficulty to navigate (i.e. if you're being chased down by someone and it's taking 2.5 seconds to open, that would be an excellent heart-pounding tension moment) and would overall be more interesting than the status quo. It is a bit sillier to me but some IRL buildings do have to have you hold down the push bar for a few seconds until it disengages, so this is agreeable. I also don't think the unidirectional exit design flow standards are where they were due to drift in application, so this is also a better way to uniformly apply it. ## Changelog 🆑 balance: After noticing it was too easy for animals to crawl through maintenance by abusing the Easy-Exit sensors, Nanotrasen has replaced all unrestricted door sensors (like in maintenance) with a pull-down lever that should take around 2-3 seconds to engage. It has been designed to allow the employee to actuate it despite any pressure differentials within an area. balance: The above change does not apply to select doors in the medical section of the station, which will continue to use the "older" Ready-Exit system. sound: In order to ensure that staff in high-traffic areas don't go bonkers due to this new change, sound dampeners have been installed to prevent the hydraulics from being heard for super long distances. However, they skimped out on the quality for the ones in maintenance... /🆑 FYI Mappers/Tweakers: This PR replaces all station map unres mapping helpers with the new subtype. You are welcome to replace certain doors with the old helper (the base type) to get the old behavior as you see fit, just explain why that behavior is desired in that location. Otherwise, it would be appreciated if we have this new behavior >95% of the time. |
||
|
|
54cfdcf624 |
Log coordinates of ruin upon successful placement (#94237)
## About The Pull Request A lot of unit tests give coordinates in their failure messages, if the cause of the failure is something in a ruin, not only will the failure be flaky but because placement is random you have no way of matching the coordinates to a given ruin. This adds logging for the bottom left and top right coordinates of a ruin upon placement ## Why It's Good For The Game Lets you know what ruin was placed at a given set of coordinates for debugging purposes ## Changelog 🆑 code: ruin loading now logs placement coordinates /🆑 |
||
|
|
26d9706694 | Adds missing "require all" type of access for Bitrunning Den (#94205) | ||
|
|
4a6daa0785 |
New CENT_OFFICER access and mapping helpers (#94019)
## About The Pull Request Have you ever wondered, why CentCom officers' IDs have the same access as those of ERT commanders? Tired of ERT members trying on stylish officer's apparel? Well, it's time to change that. This PR adds centcom officer's access (cent_officer), as well as mapping helpers for cent_officer and cent_specops access. Death Commando officers and ERT Commanders don't have this access. It also changes access of administrative office doors to cent_officer. <details> <summary>screenshots</summary> <img width="630" height="838" alt="PR - Admiral" src="https://github.com/user-attachments/assets/a7dd48fc-4fb5-4a98-878b-a28abfadfb24" /> <img width="628" height="838" alt="PR - CentCom Commander" src="https://github.com/user-attachments/assets/6ef9dd9f-49e1-409c-8d90-75201aa21ebd" /> <img width="627" height="835" alt="PR - Special Ops officer" src="https://github.com/user-attachments/assets/055fcdb5-4f6a-4c51-b52a-7848666c7c59" /> <img width="626" height="841" alt="PR - Death Commando" src="https://github.com/user-attachments/assets/9786331f-b3c4-4c0f-bed2-831eada3a05c" /> <img width="627" height="847" alt="PR- ERT Commander" src="https://github.com/user-attachments/assets/92ff59f4-a1ea-4b43-8749-1a4bd3ac6c46" /> <img width="430" height="445" alt="PR - Mapping helpers" src="https://github.com/user-attachments/assets/ead91df7-a872-4ecc-9088-58c0a719deed" /> </details> ## Why It's Good For The Game ERT commanders will have a hard time getting CentCom apparel from the vending machine in the office. It could also be useful for custom maps and shuttles (or even new CentCom map). ## Changelog 🆑 add: Added centcom officer's access (cent_officer) add: Added mapping helpers for cent_officer and cent_specops access map: Changed access on the administrative office doors (cent_officer) /🆑 --------- Co-authored-by: AlexTheEng1neer <128976622+AlexTheEng1neer@users.noreply.github.com> |
||
|
|
ee388c204f |
More love to paramedic: revamping/adding paramedic offices, new access and more! (#93457)
## About The Pull Request most of info in changelog, here i'll pin some screenshots. (also didnt touch catwalk on purpose since its medbay in process of rework) <details><summary>Screenshots</summary> ### Example of paramedic dispatch area, before it was used only on 2 maps: <img width="479" height="490" alt="image" src="https://github.com/user-attachments/assets/ca6f0ba6-93ed-4386-a94d-63b90985ef27" /> ### Example of how I changed pallete to match paramedic outfit: dark color mixed with blue <img width="479" height="490" alt="image" src="https://github.com/user-attachments/assets/e7acef94-2fd3-4fb4-9abf-5b83fd5cd738" /> ### Icebox <img width="463" height="320" alt="image" src="https://github.com/user-attachments/assets/3e12aa10-caac-4b6e-89e8-81690d979150" /> (moved chem storage south) <img width="534" height="476" alt="image" src="https://github.com/user-attachments/assets/863a0644-520b-40a7-9deb-f1174b252757" /> ### Tramstation <img width="518" height="504" alt="image" src="https://github.com/user-attachments/assets/f410f6c8-e2ee-423e-838c-03643ea1499f" /> (removed elevator and replaced with some public atmos equipment) <img width="353" height="727" alt="image" src="https://github.com/user-attachments/assets/df635bb5-5692-4367-b2b6-7c8df3c6c9a4" /> (theres new hall to replace the elevator path) <img width="857" height="725" alt="image" src="https://github.com/user-attachments/assets/15d12685-c9a0-44b5-a916-41766b12677c" /> ### New locker that has all kind of stuff for emergencies! <img width="186" height="155" alt="image" src="https://github.com/user-attachments/assets/c1e40fd6-44f7-48e0-a5e4-ecb9fc562627" /> </details> ## Why It's Good For The Game Since paramedic got more attention now, I feel it would be wise to separate paramedic content (jaws and medical suit) from general medbay and doctors. <img width="382" height="135" alt="image" src="https://github.com/user-attachments/assets/750e0d4c-7011-41e5-8ec4-d5f05f6c3515" /> For locker part: I think paramedic should have own locker with all kind of emergency items/drip items instead of bloating items on the tables. ## Changelog 🆑 add: Added new medical access for paramedics. map: Added paramedic dispatch on: TramStation and IceBox, removed elevator from Tram and moved chemstorage on IceBox. map: Paramedic dispatch area is used on every paramedic office now. map: Medical MODsuit and Jaws of Recovery moved to paramedic office. map: Redesigned northern medbay on MetaStation. sprite: Paramedic locker was added. /🆑 --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
348789fa8d |
The Renamening- upgrades UNIQUE_RENAME and moves a lot of renaming implementations under it (#93115)
## About The Pull Request Moves a lot of the unique renaming implementations described in #82664 to the functions given by the `obj_flag` `UNIQUE_RENAME`. `UNIQUE_RENAME` has been given new properties to account for non-standard renaming, these being the `RENAME_NO_DESC` flag that prevents changing the description, the `nameformat()` and `descformat()` procs that, when modified, allow for applying naming formats(i.e. "Body Bag - [input]"), as well as other post-renaming handling such as changing the name of the output plant of a renamed seed, the `rename_checks()` proc that allows for unique naming prevention(such as a locked personal closet), and the `rename_reset()` proc to clean up other possible renamed variables potentially changed in `nameformat()` and `descformat()`. This also adds `/datum/element/tool_renaming` to crayons, which will let them rename anything that has `UNIQUE_RENAME`. I looked through everything with that flag, and I didn't see anything that I don't think should be renameable by a crayon(except things that shouldn't be renamable with pens), so it shouldn't fuck anything up. ## Why It's Good For The Game moves all of the non-honorable mentions in #82664 to the same renaming system, and also moves all of the honorable mentions save for: - plaques, as they only get renamed once and wouldn't benefit from `UNIQUE_RENAME` imo - books, because they're far more than just renaming, and are persistent - paintings, because they're persistent - photos, because they're not normal renaming and they're persistent - endoskeletons, because they're done with a multitool in UI - cardboard IDs, because they're far more than just renaming Additionally, this fixes: - Implanter renaming didn't work because a ! was missing - Clown borg picket sign renaming didn't work because they didn't use the correct arguments This'll make it easier to make renameable objects in the future, as well. ## Changelog 🆑 fix: fixes implanter renaming not working fix: fixes clownborg picket sign renaming not working code: brought most unique renaming implementations under UNIQUE_RENAME /🆑 |
||
|
|
2faa874b3b |
Speed up Mapper testing with a prefix "maptest_" in VSCode (#93238)
## About The Pull Request One of the development hell cycles with mapping is how long it takes to fix quality or run issues with maps. By adding a prefix called "maptest_" to some of the unit tests it allows mappers to only target some tests instead of the usual 350+ tests to run each time or trying to trigger them individually and faffing. This does not rename the unit test files themselves to preserve history but just the "/datum/unit_test/" in each file. This does not break the current CI or obstruct other tests - A few other map files that call these tests specifically have been edited to point at the new datum name. This assumes you are using the TG testing extension to do this. | All Tests | maptest_ | |--------|--------| | <img width="426" height="106" alt="image" src="https://github.com/user-attachments/assets/d1d6f81e-16bd-473a-88da-e8b56f8bd3d0" /> | <img width="434" height="96" alt="image" src="https://github.com/user-attachments/assets/ea1c47fe-a6ce-40c6-b2cb-65b9c8e94a29" /> | | <img width="360" height="886" alt="image" src="https://github.com/user-attachments/assets/65bcd774-79ad-432e-8211-c67fb9d3e443" /> | <img width="370" height="833" alt="Screenshot 2025-10-01 204609" src="https://github.com/user-attachments/assets/ad360796-5698-42fd-bd2e-51de1a02ab87" /> | ## Why It's Good For The Game - Should make it easier for mappers to test locally, saving CI/Github resource for TG - Mappers can now test their work 56% faster ## Changelog 🆑 code: Mappers can now run just mapping unit tests - Should be 56% faster - Should have no player impact /🆑 Co-authored-by: loganuk <falseemail@aol.com> |
||
|
|
fd752f043d |
Easy multi-z support for alarm console (+spawn changes) (#93198)
## About The Pull Request Station alarm consoles now register to all Station Z levels+Areas if they were created on a station Z level (this doesn't include mining, but station ones will see mining areas), otherwise will be a "local" console to that Z level only. Mostly the same applies for Cyborg/AI, but if they were built on a non-station Z level then they have their Z level added on top of Station Z levels, so example Nukie saboteur borgs will see alarms they might need, while a Golem/Oldstation AI will also be able to see their own alarms. Because of how alarms and spawning in worked, Cyborgs/AIs had CentCom's Z level as something it would detect, so we simply create the mob at the spawn location rather than on the title screen during Initialization, fixing that issue as well. ## Why It's Good For The Game Adds easy multi-z support for station alarms and removes the previous bandaid of having to deconstruct your board and multitool it or map in every single station alarm console to allow station alerts (which is quite silly) which was done in https://github.com/tgstation/tgstation/pull/88343. Closes https://github.com/tgstation/tgstation/issues/61592 Closes https://github.com/tgstation/tgstation/issues/83042 Closes https://github.com/tgstation/tgstation/issues/69314 I find this solution better since it catches pretty much all use cases without the need for special subtypes and needing players to actually know the difference between these things. ## Changelog 🆑 fix: Cyborgs and AIs will now see alerts of the whole station rather than solely the Z level they were spawned on. fix: Cyborgs and AIs will no longer get alerts about Thunderdome. /🆑 |
||
|
|
c53286a625 |
Changes bolt light wire to feedback wire, which disables both lights and feedback sounds (#92950)
## About The Pull Request Changes the "Bolt Lights" wire to a "Feedback" wire, which as well as disabling the door's lights also disables the deny access sound. Sounds that happen because the door is actually moving or bolting are unchanged. ## Why It's Good For The Game closes #65244 Justification is mostly in mentioned issue, primarily the accessibility issue of denied door feedback being sound-only when the lights are cut. Also, "Bolt Lights" is just inaccurate, as it controls all of the lights on the door. ## Changelog 🆑 balance: The "Bolt Lights" wire is now the "Feedback" wire, and controls both lights and sounds for the airlock. /🆑 |
||
|
|
f241399f0c |
Fix map z-level generation starting position (#92836)
## About The Pull Request The `(x, y, size)` arguments for `CHORDS_TO_1D` were in the wrong position when a map grid layout is procedurally generated. This results in z-levels that will likely be clustered together near the edge instead of spreading out evenly from the center. ## Why It's Good For The Game Code works as intended now. ## Changelog 🆑 fix: Fix map z-level generation starting position. Z-levels used to cluster together near the edges and will now instead be spread out evenly from the center. /🆑 |
||
|
|
8684f10524 |
[NO GBP] Support non ascii char list read in /datum/parsed_map/readlist() (#92896)
## About The Pull Request I haven't seen an use case for this but upon reviewing my code i saw it didn't match up with how the char pointer is incremented everywhere else. It should increment fully over to the next char instead of the default increment of 1 which might not always be the case based on the char type in the list ## Changelog 🆑 code: non ascii chars inside lists in map files can be read without error /🆑 |
||
|
|
04b667b7ba |
Fixes 4 bugs with /datum/parsed_map/readlist() (#92652)
## About The Pull Request - Fixes the proc skipping `0` & `null` values. Text like `"0"` & `"null"` when sent to `parse_constant()` will yield `0` & `null` respectively but when checked against `!` operator https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1019 It gets mistaken as an empty value/new line so its skipped So if you had a list such as `list("Hello", 0, "null")` When parsed it would yield `list("Hello")`. That's fixed now. We check the text before parsing it - Fixes `=` symbol getting mistaken for a key/value pair if it is embedded inside a string expression. Consider this list `list("A", "B = C")`. This list should just be linear because the equals symbol is meant to escaped as it is within a string literal. However `findtext()` proc doesn't account for that https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1014 So we end up creating a key/value pair and a linear element, creating a broken list like that runtimes(because of the missing `"` symbol in breaking up the string at the middle) The solution is simple, we already have the proc `find_next_delimiter_position()` that will escape everything between `"` so we now use that to find the position of `=` - Fixes the proc being unable to parse alists who's values themselves are lists. Consider the example `list("A" = list(1, 2))` When we look for `,` symbol to check for the next list element here https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1015 You get a broken left literal like this `"A" = list(1` because the comma within the list is getting mistaken for a new element. Now we check for such edge cases and remember to parse the full list before checking for the next comma & now your alists can contain lists as elements themselves - Map reader can read nested lists to any degree e.g. `list(list(3, 4), list(5, 6))` parses correctly ## Changelog 🆑 fix: the map reader now reads null & 0 values into lists fix: the map reader now parses associative lists(maps/alists) correctly in cases where = sign is embedded within a string fix: the map reader now parses associative lists(maps/alists) who's values themselves can be lists fix: the map reader can now parse nested lists to any degree /🆑 |
||
|
|
a47835a04f |
1X3 ICEBOX | Wilderness Expansion (Now not extremely slow!) (#91920)
## About The Pull Request Turns the surface z-level of icebox into a 1x3 area, effectively adding 2 wilderness new z-levels surrounding the station Because it's not always clear to other people what I'm talking about, this is what I mean with making the surface level a 3x3 z-level The wilderness z-levels are gridlinked, instead of crosslinked, which just means the connections are consistent and not randomized. If you keep going right, you will always end up where you started again, eventually. This also removes the black border around the surface icebox z-level (cause you can just go there now) **Wilderness levels** I've added some Z-level templates that can be generated. They're incredibly basic, but all can spawn runes on them as well. - Snow planes (5x) - Ice planes (1x) - Forest planes (1x) - Mountain planes (1x) I've also tweaked surface generation quite a bit. It being completely covered in bones always felt weird, and the intersparsed rocks and chasms never sat right with me. The default overworldgen is now more like the Forested trait, but with more sparse trees. All of this is modular btw. You can increase the amount of z-levels, make any space z-level be unrandomized gridlinked or add your own wilderness z-levels (either to your own map or icebox) ## Why It's Good For The Game Icebox exploration is kind of depressing. We have this unique setting, but we can't really go anywhere? You can go down and find that one pool, which is about the peak of exploration of icebox. Now you can literally explore the entire round and get incredibly lost! It's also a great opportunity for mappers! (Especially since the templates I made were made rather quickly as I wasn't sure if this had merit). 2 extra z-levels isn't a lot, but it'll let us further develop planetary wilderness z-levels further without impacting load times that much. Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will have to do |
||
|
|
b71153d30e |
Fixes 'note_path' var of 'airlock_note_placer' mapping helper (#92037)
## About The Pull Request This old mapping helper had a problem with loading notes supplied via its 'note_path' variable. ## Why It's Good For The Game The morgue memo note upon the morgue office door on Wawastation now appears. Here's me testing it on runtime with a different note...  ## Changelog 🆑 fix: fixed the 'note_path' var of the 'airlock_note_placer' mapping helper /🆑 |
||
|
|
ac20c39834 | Adds a wall dent mapping helper (#91484) | ||
|
|
9db2f6916b |
Sets prettier to run on the repo (#91379)
## About The Pull Request Prettier (an auto formatter) is set to only run within the tgui folder currently. This removes that limitation, allowing it to automatically format all supported files in the repo (.js, .html, .yml [etc](https://prettier.io/docs/)) I made a few exceptions for bundled and generated files ## Why It's Good For The Game I'm of the opinion that code should look uniform and am lazy enough to want CTRL-S to format files without having to think beyond that ## Changelog |
||
|
|
df58053f71 |
[MDB Ignore] Air alarms of surgical rooms (robotics, medical) start with scrubbers set to filter nitrous oxide (#90558)
## About The Pull Request - Primary Surgical Theaters - Secondary Surgical Theaters - Robotics Surgical Theaters Now all start the game with their scrubbers set to scrub nitrous oxide from the air, and expanded range active ## Why It's Good For The Game Using anesthetic is annoying because it griefs all of medbay. By having scrubbers start to filter nitrous, people should feel less worried about griefing all of medbay without needing to call over engineering first. An alternative to this could be adding a full ventilator machine to medical which they use to hook people up to anesthetic. Said ventilator would have an exhaust tank which collects breaths. ## Changelog 🆑 Melbert add: Air alarms of surgical rooms (Robotics, Medical) start with scrubbers set to filter Nitrous Oxide /🆑 |
||
|
|
77d50ab680 |
[MDB Ignore] Adds "Red Alert Access" to EVA Doors and First Aid Supplies on all maps (#89424)
## About The Pull Request Terminology: - Red Alert Access allows airlocks and windoors to become all access if the station has raised to Red Alert (or higher). This temporary all access is reverted after the station returns to Blue Alert (or lower). This mechanic isn't new, just not widely used. Changes: - Adds a mapping helper for assigning doors to "Red Alert Access" - Gives "Red Alert Access" to EVA doors on every map - Gives "Red Alert Access" to the first aid supply windoors in medbay storage on all maps. Icebox already had this, which is why I thought I'd expand it because it's a fun idea. (The doors leading INTO medbay storage do NOT have this, meaning the CMO would likely have to set those to emergency access.) - Removes "Red Alert Access" from the secure storage windoor in Icebox's medbay. Felt odd that it allowed anyone access to the syringe gun ## Why It's Good For The Game Discussed in #89390 . I don't think this will be supremely impactful, but you never know. But if anything, it may lead to people using Red Alert more appropriately more often, which would be cool for roleplay. The only problem is that they aren't telegraphed very well, only in `examine`. Could probably make it more well known ## Changelog 🆑 Melbert add: EVA doors become all access on Red Alert add: First Aid Supplies (the compartments in Medbay Storage which hold medkits) become all access on Red Alert (already present on Icebox). Medbay Storage itself does NOT become all access. /🆑 |
||
|
|
2ee02682f7 |
Converts most other usages of block() to x/y/z format (#89290)
## About The Pull Request The sequel to https://github.com/tgstation/tgstation/pull/89234 > someone should do the rest at some point guess what, I'm that someone :3 ## Why It's Good For The Game Same reasoning as the previous PR: > less cluttered code is nice, and it should in theory be more optimized as we avoid the need to run min, max, and locate. ## Changelog No user-facing changes |
||
|
|
e74e288ae1 |
Adds cooling loops and cold tiles to all kitchen freezers (#89245)
## About The Pull Request Makes all freezers cold roundstart (wasn't the case for Meta, Delta and Birdshot) and adds cooling loops to all freezers (those were missing from all maps bar Meta and Delta) This is a commission for @RaveRadbury <details> <summary>Previews</summary> Birdshot:  NebulaStation:  Tramstation:  Wawastation:  Icebox has a temperature unit-less loop, instead utilizing natural cold of the ice moon:  </details> ## Why It's Good For The Game Map parity, makes sure that all freezers are naturally cold and stay that way throughout the shift. ## Changelog 🆑 map: Added cooling loops and cold tiles to all kitchen freezers that were missing them /🆑 |
||
|
|
86e06b1b29 |
Fixes an armrest related hard del (#89139)
## About The Pull Request Another spurious CI runtime that keeps coming up all the time and is annoying me. I believe it's occurring due to the chair not being initialized before a `mob_buckler` mapping helper tries to buckle mobs to it. So I moved their code to lateload to hopefully ensure that doesn't happen, as well as an additional safety measure in the armchair code itself. edit: confirmed that this does indeed fix it, as I have it merged downstream preemptively due to it being such a blocking nuisance  Caused by ## Why It's Good For The Game Less CI failures ## Changelog N/A |
||
|
|
8196190aa1 |
Removes a a at at be be of of and and have have (#89155)
## About The Pull Request I just had to one-up https://github.com/tgstation/tgstation/pull/89127. ## Why It's Good For The Game Removes a a at at be be of of and and have have ## Changelog N/A |
||
|
|
a95fb42425 |
Fixes a runtime in requests console error logging (#89044)
## About The Pull Request Target is null so we cannot work with its area, etc etc. ## Changelog 🆑 fix: Fixed a runtime in requests console error logging /🆑 |
||
|
|
1795c18aea |
Fix a bunch of html UI's for 516 (#88917)
## About The Pull Request Moved broken on 516 UI's to browser datum They now work and have a dark theme Most of them are admin ones (All except 1) I tried to check all the raw HTML UI's by typing `<< browse(` into the VSC search and going through each element, but I might have missed something. What worked as it was, I didn't touch, except for the Dynamic control UI's ## Why It's Good For The Game Admin can do their things on 516 Coders/Mappers can debug some stuff on 516  ## Changelog 🆑 fix: Admin/Debug UI's (Especially the Game Panel) now work properly on Byond 516, instead of showing raw HTML /🆑 |
||
|
|
189616ae2c |
Add better logging for ruins (#88403)
## About The Pull Request ~~This adds a new test for the CI/CD so that we can load all space ruins instead of it being RNG.~~ Adds more robust logging for ruins so we can see when they fail/succeed and how many are placed on a map. This also removes a deprecated CI config setting. It prevented ALL ruins from spawning during CI tests which is bad. The config setting was made redundant in: - #87910 ## Why It's Good For The Game More robust CI/CD. ## Changelog 🆑 code: Add better logging for ruins /🆑 |
||
|
|
d7f9174050 |
fixes seed ruin logic preventing forced ruins from spawning when budget is zero, fixes map_logging CI test (#87910)
## About The Pull Request The ruins get added to forced_ruins, quite often after all ruin budget is exhausted and thus they don't get spawned. This adjusts the logic to ignore the budget when there's forced_ruins to be had. Also apparently fixes map_logging CI test which was broken by the logic, and makes the stacked_lights test scream at you with the area name for the sake of easier debugging as it can proc on the ruins now ## Why It's Good For The Game Adjusts some logic to allow multi-ruins to spawn correctly, and to make sure our mappers make good space ruins too ## Changelog 🆑 fix: Ruins will now correctly spawn their tied ruins in fix: The map_logging test now runs proper code: The stacked_lights test now screams with area names too. /🆑 |
||
|
|
ee16f1fccc |
Everything uses trim(), trim returns "" if empty, removes the SDQL2 trimtext (#87994)
## About The Pull Request Title. I may have been wrong about how depended on this behaviour was Also, uh, fixes #87986 ## Why It's Good For The Game trim_reduced no longer needs to exist because trimtext() does it faster, and there's no reason to have a special proc if trim just calls that proc anyways. I sincerely doubt the proc overhead is so severe that we need another proc that will ever only be called directly 3 times in the code. Since trimtext() does something we don't expect, it's better to just have SDQL2 queries use trim() so we're all on the same page. ## Changelog NO!!! |
||
|
|
57cc38c789 |
GPSes now show the general direction of crosslinked z-levels (#87437)
## About The Pull Request This makes the GPS UI give the general direction of a GPS on a different linked z-level. https://github.com/user-attachments/assets/98c6dfd8-5ced-4145-b14a-3813821ef30c ## Why It's Good For The Game Makes navigating through space less of a chore, as previously, I believe the only way was to manually write down or memorize what direction was linked to what z-level. ## Changelog 🆑 add: GPSes now show the general direction of cross-linked z-levels. /🆑 |
||
|
|
d170a410d4 |
Recovered Crew | Medical+Cargo Respawns (#87072)
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com> Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> |
||
|
|
728036969d |
Replace /proc/trim_reduced with the native BYOND trimtext (#87317)
## About The Pull Request BYOND added a native `trimtext` proc in 515, which as far as I know, does the same thing as the `trim_reduced` proc - trims whitespace off both ends of a string, but `trimtext` should be faster, as it's a builtin rather than implemented in DM. Also, added a global `_trimtext` proc, for use from SDQL2 or Lua, as it's a builtin and can't be `call()`'d. ## Why It's Good For The Game Micro-optimizations my beloved - especially since I imagine this proc is called quite a lot, even if it doesn't really have a performance impact anyways, but it can't hurt. ## Changelog 🆑 refactor: Refactored some text helper procs to use BYOND's native text trimming proc. admin: Added a _trimtext proc, for use with SDQL2 or Lua scripting. /🆑 |
||
|
|
241514f520 |
Fixes improper static list declarations + adds grep for it (#87207)
## About The Pull Request I randomly came across a `var/list/static` in the code, which does not actually do what was intended, and thought it was silly. A ctrl+f revealed that this was a fairly common mistake, so I went and fixed all the instances of it I could find. ~~Including one in lighting code, which it looked like they were trying to create a global list to cache generated lighting sheet values for speed, but it was just a normal list that got created each time pointlessly. Now those values are actually being cached (using a global var, because a `static` list was not the right thing to use there in the first place).~~ Nevermind, it seems that this was in fact being cached even if it shouldn't have been, because byond. Just rearranged it there seeing as it works either way. ## Why It's Good For The Game Code that does what it's supposed to ## Changelog 🆑 fix: fixes a bunch of improper static list declarations /🆑 |
||
|
|
f7c53dec8e |
Fix air alarms to work correctly while connected to a gas sensor (#86958)
## About The Pull Request This fixes a bug that was hard to troubleshoot. While I was testing my other PR, I noticed that I was getting inconsistent atmos readouts while using a gas sensor hooked to an air alarm. Sometimes I would get the readout from the tile of the air alarm, and other times it would give me the readout of the gas sensor... I tracked it down and the root cause was the `COMSIG_TURF_EXPOSE` signal not being properly reassigned when a gas sensor was connected. My fix is to transfer the signal from the air alarm to the air sensor and vice versa when they are connected/disconnected. I also added some redundancies in place to limit air sensors to be only connected to one air alarm at a time. I threw in a mapping check to make sure one air alarm isn't linked to multiple sensors to catch some accidents. Another small fix is that air alarms now can be relinked to other air sensors if the sensor is reset. This was a problem for round-start linked air alarms that were paired with sensors since you could turn off or break a sensor and then the air alarm would have it's link severed without being able to link to any new sensors. ## Why It's Good For The Game Air alarms are becoming more robust! ## Changelog 🆑 fix: Fix air alarms to work correctly while connected to a gas sensor fix: Fix paired air alarms and sensors to be able to relink to other devices if turned off, reset, or destroyed. /🆑 |
||
|
|
52f7f44215 |
Block atmos processing on ReservedTurfs\™️ (#84873)
## About The Pull Request See title. ## Why It's Good For The Game We get constant runtimes and issues from atmos processing on turfs we are actively loading and/or reserving. I promised I would do something about this months ago --------- Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
e56d4de4ae |
turf reservations may set whether they should override baseturfs, off for deathmatch (#85752)
## About The Pull Request uhh laymans terms; break wall, turf under wall not space now plating turf reservations may set to not override baseturfs with turf_type, created a subtype with that set, and deathmatch templates use this for default essentially for whoever wants to build a deathmatch map: set turf_reservation_type (on the template) to 1. **(default)** /datum/turf_reservation/turf_not_baseturf - preserves baseturfs of what you map in, eg. plating under normal flooring and space under that plating, etc. Turf used to fill in the template is still space 2. /datum/turf_reservation/indestructible_plating - fills in the noop spots before loading with indestructible plating, and also is the baseturf for everything there, so break any turf = indestructible plating (you may still map in space) ## Why It's Good For The Game makes sense for normal walls in deathmatch to not break into space immediately and that allows more destructible deathmatch maps i encourage whoever makes new maps to include non indestructible turfs ## Changelog 🆑 fix: breaking certain terrain in deathmatch doesnt instantly breach to space /🆑 |
||
|
|
5f80128fa9 |
Corrects 200+ instances of "it's" where it should've been "its" instead (#85169)
## About The Pull Request it's - conjunction of "it" and "is" its - possessive form of "it" grammar is hard, and there were a lot of places where "it's" was used where it shouldn't have been. i went and painstakingly searched the entire repository for these instances, spending a few hours on it. i completely ignored the changelog archive, and i may have missed some outliers. most player-facing ones should be corrected, though ## Why It's Good For The Game proper grammar is good ## Changelog 🆑 spellcheck: Numerous instances of "it's" have been properly replaced with "its" /🆑 |
||
|
|
b7fb9124b6 |
Adds in airlock helpers for inaccessible doors (#84792)
## About The Pull Request ACCESS_INACCESSIBLE was added by #81828, and originally used for the bitrunning lockboxes that were not meant to be unlockable by any access. This PR adds in an airlock helper (`/obj/effect/mapping_helpers/airlock/inaccessible`) that applies the ACCESS_INACCESSIBLE to make an airlock unable to be opened by any ID.  > An example of the helper, and what it looks like used on an airlock. ## Why It's Good For The Game This can be used in mapping for ruins or away missions where the mapper does not want an airlock to be passed through with an ID and does not want to worry about cases where the player may have access to ID cards from other ruins that may grant access to set doors. ## Changelog No player facing changes. |
||
|
|
78fc87315c |
Removes stupid listlike var access code (#84648)
## About The Pull Request [Removes all other listlike var accesses](https://github.com/tgstation/tgstation/pull/84648/commits/4c5996b5c8b1da63740e8b4bf998b6cb6eadac33) Also fucking dumpsters an unused proc that allowed for arbitrary variable modifcation. Bad juju This is undefined behavior and errors in later 515 versions. also it's stupid as hell |
||
|
|
1aade91a18 |
Unit tests for stuff accidentally placed in space by mappers (#84453)
This unit test detects all turfs & other movables that aren't in a lit area (ie area/space/nearspace) on station zlevels The grep detects movables placed on shuttles that do not have the correct area assigned, which caused those atoms to break off of the shuttle & literally get launched into random parts of space (usually on station z-levels; the only reason I found this issue was cause the unit test was detecting random shit ending up on station maps lol) Minor fix for the mapload_space_verification unit test - it was falsely detecting turfs that shuttle grids (that were template_noop) were parked ontop of, which aren't effected by the shuttle in any way. This allowed the following fix Fixed a number of shuttles having atoms in /area/template_noop areas. Atoms in these areas are treated as not actually part of the shuttle itself & were launched off into random space tiles across all z-levels via dump_in_space(). Corrected those grids to have the correct area, and as such, shuttles now stay together properly. 🆑 ShizCalev fix: Fixed a number of shuttles having parts (such as lattices) completely disappearing. fix: Fixed the ceilings above shuttles on station maps being full-bright. fix: Fixed lattices sometimes appearing at random locations in space on station maps. fix: Cleaned up a number of accidentally placed objects in space across all station maps. fix: Fixed a false positive with the mapload_space_verification unit test failing on turfs that weren't actually part of shuttles. code: Added a unit test that automatically finds all base space turfs with objects on them, as well as non-space turfs that are set to space areas (meaning that these squares weren't lit properly.) /🆑 Shuttle Ceiling Fix: Before  Fixed  Shuttle Fix: Before  Fixed (look at the lattices in the middle. the stuff in the shuttle are randomized / not part of this)  |
||
|
|
7098937063 |
Fixes lightswitch-turning-off mapping helper (#84399)
Fixes #84290 |
||
|
|
c57afc4689 |
Wawastation (#82298)
- [x] #82282 - [x] map in aux base how the hell did i forget it - [x] fill out maints - [x] properly test the goddamn thing - [x] fix major cameranets - [ ] fix any issues - [x] write a proper pr body ## About The Pull Request adds this map to the map rotation bottom level (24.5.2024)  upper level (24.5.2024)  ## general map details and department stuff - the station is more focused on the bottom level, so falling in doesnt roundremove you - this is an asteroid station, so assistants can larp as dorfs and mine towards the sweet loot - there is plenty multiz usage - service is the center of the station **Service** - Is the center of the station. Arrivals docks directly in the middle of the station next to Upper Service, so bar might get more traffic. Not much different than normal Service, but janitors closet is also present here, he sleeps on the floor. We do not talk about the janitor. Above Bar is Library and Hydroponics with an overlook to look at bar. The Theater has a big curtain and a podium directly in the bar. 29.3.2024  **Civilian** - Also in the center of the station, next to bar. There isnt much to talk about dorms, its pretty normal. **Cargo** - Absence of chutes that go to departments, reminder that mail sorting is a thing. Cargo bay is a big open area with a boutique/shop facing primary hall that starts closed, and Cargo has its own crate elevator. Theres upper Cargo where mining, bitrunning and a secure warehouse is located (There may be a murder scene). The quartermasters office spans two z-levels and is relatively compact. Not much else different from regular cargo. ~~Oh also the QM starts with an empty PML-9 and a mostly functional rocket~~ 29.3.2024  **Medical** - Large centralized medbay, also two z-levels. There is a public waiting room with triage and a reception. There is also an inner elevator for the crippled. There are two medbay-access patient rooms that are unrestricted from the inside, and two operating rooms. Medbay has its own rad shelter. The virologist does not get their own satellite, but is still relatively secure. 29.3.2024 https://i.ibb.co/hs9kKbV/ezgif-1-f7b697b067.gif (large gif) **Command** - AI Sat transit tube access is here. HoP has an open stall facing primary hall, ~~and maybe a piano trapdoor~~ pretty classic bridge, Captain does not get his own office but gets a really comfortable quarters with his own emergency mass ejection for abandoning ship. The council meeting room is present above bridge, with ERT Ferry dock docking inside adjacent to the council room. **Security** - Mostly bottom z level security. Very compact brig cells, and a meeting room that everyone that is related to security may spawn in if youre lucky. Warden has a weapon handout point facing the inner security hall and the equipment room. Reeducation chamber has a shocked grille treadmill. HoS and Warden Room and armory are on the upper z-level, and warden has a VERY good overlook over permabrig. Armory is seperated into nonlethal to mostly nonlethal and lethal. 29.3.2024  **Science** - Also pretty centralized, breakroom with a smoking corner, two z levels and a big overlook. RD office overlooks toxins and bomb site. Genetics and RD Office is on the upper floor, with a science exclusive monkey exhibit. Xenobio is thick due to proximity to bomb site, otherwise normal. 29.3.2024  **AI Sat** - Okay at this point assume any department is multiz. The antechamber is an elevator and the turrets are on said elevator. The elevator may be sent to the top level by engineers, where the AI core is. Telecomms is on the bottom level, and AI core is above it. Contains a borg entertainment room, and also the upload. The elevator being raised is necessary to properly enter AI Room. **Engineering** - Contains a less stale but still average and less than optimal SM setup. Prone to catastrophic disaster. The SM Room is two levels and very open, and CE has a trapdoor directly into the shard. Turbine is above atmospherics, so is the crystallizer. The HFR and main atmos and distribution room are on the bottom level. Piped by **Kendra Hunter**. Contains a built in electrolyzer corner so atmos mains stop gutting the aesthetics to place down some dumb machine. ## Why It's Good For The Game another interesting map into the roster, different from the other multiz maps in the form that you dont get stuck in hell by falling down a hole todo write better section ## Changelog 🆑 add: wawastation, the station map /🆑 --------- Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com> |
||
|
|
54f9ea034c |
Iceblock flora generation fixes (#83450)
Fixes #83438 🆑 ShizCalev fix: Trees will no longer be growing through railings on forest planets fix: Trees/plants will no longer grow through wood pathways on Icebox fix: Railings will no longer appear ontop of rock walls on icebox /🆑 Old:  Fixed:  |
||
|
|
0cc5cfb178 |
Random Name Generation refactor, generate random names based on languages (for species without name lists, like Felinids and Podpeople) (#83021)
## About The Pull Request This PR moves random name generation for species onto their languages. What does this mean? - For species with a predefined name list, such as Lizards and Moths, nothing. - For species without predefined name lists, such as Felinids, their names will now be randomly generated from their language's syllables.   (In the prefs menu:)  Why? - Well, we actually had some dead code that did this. All I did was fix it up and re-enable it. - Generates some pretty believable in-universe names for various languages that are lacking name lists. Obviously defined lists would be preferred, but until they are added, at least. - Moves some stuff off of species, which is always nice. - Also hopefully makes it a tad easier to work with name generation. There's now a standard framework for getting a random name for a mob, and for getting a random name based on a species. Misc: - Adds a generic `species_prototype` global, uses it in a lot of places in prefs code. - Makes `GLOB.species_list` init via the global defines - Deletes Language SS - Alphabetizes some instances of admin tooling using the list of all species IDs - Docs language stuff - Deletes random_skin_tone, it does pretty much nothin ## Changelog 🆑 Melbert refactor: Random Name Generation has been refactored. Report any instances of people having weird (or "Unknown") names. qol: Felinids, Slimepeople, Podpeople, and some other species without defined namelists now automatically generate names based on their primary language(s). qol: More non-human names can be generated in codewords (and other misc. areas) than just lizard names. /🆑 |
||
|
|
fa31403353 |
LateInitialize is not allowed to call parent anymore (#82540)
## About The Pull Request I've seen a few cases in the past where LateInitialize is done cause of the init return value being set to do so for no real reason, I thought I should try to avoid that by ensuring LateInitialize isn't ever called without overriding. This fixes a ton of machine's LateInitialize not calling parent (mechpad, door buttons, message monitor, a lot of tram machines, abductor console, holodeck computer & disposal bin), avoiding having to set itself up to be connected to power. If they were intended to not connect to power, they should be using ``NO_POWER_USE`` instead. Also removes a ton of returns to LateInit when it's already getting it from parent regardless (many cases of that in machine code). ## Why It's Good For The Game I think this is better for coding standard reasons as well as just making sure we're not calling this proc on things that does absolutely nothing with them. A machine not using power can be seen evidently not using power with ``NO_POWER_USE``, not so much if it's LateInitialize not calling parent. ## Changelog 🆑 fix: Mech pads, door buttons, message monitors, tram machines, abductor consoles & holodeck computers now use power. /🆑 |
||
|
|
2163f60527 |
Simple animal xenos are now basic animal xenos (#82187)
## About The Pull Request We currently have 2 types of xenos in the codebase, simple animal and carbon. I'd like to unite them both under basic, and I thought I should go for simple animal first since it's more of a conversion than a remake. This helps set a base for a future basic-only xeno, which would require the following: - Basic mobs (or just anything than Carbon) to have Organs, which we can then use for things like referring to their plasma sac for egg-laying, etc. - All xeno types having a basic mob variant, preferably with an AI so they would work without a player. - Something be done about larva, either we'd split basic xenos into "larva" and "adult" (like carbon) or have it be a separate path that can also have organs so they can still have hivemind. Everything else seems to have been done overtime as simple animals have been converted to basic (HUDs and holding things now seem possible, etc.) Even if this doesn't work out, at least this cuts off a good chunk of the remaining simple animals to convert to basic. Sprites used (for mapping helpers): Fire medkit Toxin medkit Oingo Boingo punch face (i tried to shrink it down) ## Why It's Good For The Game This helps advance us move away from simple animals, and helps move carbon xenos to basic mob later too if that's what we want to go for. ## Changelog 🆑 refactor: Xenomorphs (Lavaland & Oldstation ones) are now basic mobs. /🆑 |
||
|
|
fbe6e2ebba |
museum away mission (#81208)
## About The Pull Request adds a new gateway map, the Nanotrasen Museum it is filled with """"Mannequins"""" and Common Core lore im not putting the preview here because you really should explore it yourself but if youre that curious i think the Checks tab in mapdiffbot would have it this gateway map contains no combat unless you count falling into chasms because you did not carry a light or going into the boarded room with no loot or any incentive with obvious signs that there is the sole enemy on the map in there the loot is the lore ok thanks also makes mines detonate if theyre detonated by a non-mob im pretty sure this couldnt have been intentional trams stop chasms and also the relevant items <details> <summary>on second thought if you want spoilers check this</summary>  </details> ## Why It's Good For The Game more gateway maps = good ## Changelog 🆑 add: nanotrasen museum gateway map /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> |
||
|
|
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. /🆑 |
||
|
|
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> |
||
|
|
5d9488cd2a |
Macro Optimizes Map Saving (100x) DO NOT CHURN STRINGS Edition (#80845)
## About The Pull Request Yello! This one is reasonably quick, tho I did some fixes too This is the big one, fixes the buildmode tool sometimes locking disabled for the whole round. We do this by replacing the static var on buildmode with global var and a global proc This keeps a harddel on the buildmode datum from permalocking is_running to TRUE Also makes flipping the var BACK if something breaks significantly easier for admins, so that's nice Alright, smaller things now Fixes lists of numbers failing to encoded improperly This was fixed on shiptest, we failed to actually port their most recent revision Fixes the shuttle flag not actually working because it used istype instead of ispath Changes obj_blacklist to a typecache for optimization's sake Renames/moves some vars around to prevent weird double typing things Removes a checktick in key gen, it's just costing more time then it would save in overtime Properly handles lists. We were only doing var encoding one layer deep, need to do it alll the way down Alright, now the optimizations This proc is fucking HOT, and it's for really dumb reasons This is a text gen proc, and it makes the mistake of generating text and concatinating it with MORE text. This is HORRIFICALLY EXPENSIVE because byond caches strings (can only be one of each) and string churn fucks up that caching system something fierce Moving from strings to lists of strings we join at the end takes us from like idk 100 seconds to save bare metastation to like 1.5 This is applied basically everywhere for obvious reasons While I'm here, storing keys in a flat list and then using find to find them, then using that index to lookup into another flat list is a bit silly. Let's just make it an assoc list. Faster lookup, cleaner. Oh also rather then iterating over all the vars on an object, let's iterate over just the ones we care about yeah? Let's see... no sense genning a key we'll never use, and having suffixes be often non existent is silly just embrace the slight mess. That's it I think, this takes us from 100 seconds to save metastation to 2.5 seconds to save ALL of metastation (I removed the vars limiter so I could make sure var saving didn't fuck me up) ## Why It's Good For The Game Cleans up some issues that we failed to port the fixes for, MASSIVELY optimizes this (so it can finish in like 5/10 seconds and not 300!) and ensures admins can always use the thing and don't risk dropping their pet buildastation to the void. Worth noting, this tool really should not be used for station mapping outside an event context. It produces sorta buggy var edits, and WILL fail to pull over context for shit. Please don't use it as such Profiles (csv files I promise) [Before](https://github.com/tgstation/tgstation/files/13853313/profiler.json) [After](https://github.com/tgstation/tgstation/files/13853271/profiler.json) I'd include my line by lines but I don't know how much you'd get out of them. Here's an image tho  ## Changelog 🆑 fix: The map saving tool will no longer lock up and prevent all further action at random fix: Map saving now takes on the order of seconds, not minutes fix: Fixes an issue with lists that caused strongdmm to report saved maps as broken /🆑 |
||
|
|
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. |
||
|
|
279904e079 |
Saves some free lag by removing some in area (in world) loops (#80644)
## About The Pull Request Goes through and changes some `in area` / `in a` loops to use `get_contained_turfs` to cut down on `in_world` loops. Saves some free lag. ## Changelog 🆑 Melbert fix: Some things which affect everything in an area are less laggy, the "all lights are broken" station trait especially /🆑 |