mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-12 16:44:43 +01:00
mayfools
12 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7a3ad79506 |
All camelCase (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case. UNDERSCORES RULE! (#94111)
## About The Pull Request It's just a partial cleanup of anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md) code from /tg/'s ancient history. I compiled & tested with my helpful assistant and damage is still working. <img width="1920" height="1040" alt="image" src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3" /> I'll upload the .cs script I used to do it shortly. ## Why It's Good For The Game Just minor code cleanup. Script used is located at https://metek.tech/camelTo-Snake.7z EDIT 11/23/25: Updated the script to use multithreading and sequential scan so it works a hell of a lot faster ``` /* // Copyright 2025 Joshua 'Joan Metekillot' Kidder This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. // */ using System.Text.RegularExpressions; class Program { static async Task Main(string[] args) { var readFile = new FileStreamOptions { Access = FileAccess.Read, Share = FileShare.ReadWrite, Options = FileOptions.Asynchronous | FileOptions.SequentialScan }; FileStreamOptions writeFile = new FileStreamOptions { Share = FileShare.ReadWrite, Access = FileAccess.ReadWrite, Mode = FileMode.Truncate, Options = FileOptions.Asynchronous }; RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled; Dictionary<string, int> changedProcs = new(); string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*"; Regex camelCaseProcRegex = new(regexPattern, regexOptions); string snakeify(Match matchingRegex) { var vals = matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray(); var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower(); string logString = $"{vals[0]} => {newVal}"; if (changedProcs.TryGetValue(logString, out int value)) { changedProcs[logString] = value + 1; } else { changedProcs.Add(logString, 1); } return newVal; } var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>(); // uses default ParallelOptions // https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) => { var reader = new StreamReader(filePath, readFile); string oldContent = await reader.ReadToEndAsync(); string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify)); if (oldContent != newContent) { var writer = new StreamWriter(filePath, writeFile); await writer.WriteAsync(newContent); await writer.DisposeAsync(); } reader.Dispose(); }); var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList(); foreach (var pair in logToList) { Console.WriteLine($"{pair.Key}: {pair.Value} locations"); } } } ``` ## Changelog 🆑 Bisar code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case, in-line with the STYLE guide. Underscores rule! /🆑 |
||
|
|
1c6c506936 | Raptor Rework - Ranching and Companionship (#93564) | ||
|
|
761b14ef7c |
lavaland raptors (#82537)
## About The Pull Request adds raptors to lavaland. these are creatures that have been created through countless xenobiological experiments by nanotrasen to breed an animal that can withstand the harsh conditions of lavaland and aid miners. theres now a new ranch miners can access bottom right to the mining base  this ranch starts somewhat empty as most raptors have escaped containment and are now scattered all across lavaland, u can find them and return them to ur ranch. in order to tame a raptor, u first need to prove to it that ur a capable master. when u try to ride it, a little minigame prompt will pop up  in this game, the bird's icon rapidly changes direction and u have to quickly click the arrow thats OPPOSITE to the direction its facing several times before the direction changes. if you fail 3 times itll knock you off and run away, however if u win it will deem u a suitable master and listen to your orders. There's many different breeds of raptors you can find across lavaland, all with different capabilities: red raptors: these excel at combat and can be very useful for dealing with lavaland mobs or defending the node drone yellow raptors: are very speedy mounts, theyll get u from point A to point B in record time green raptors: they are the tankiest type of raptor and are very good miners. while mounted, they will clear any rock walls in their path purple raptors: can store items in them. they have a decent storage size allowing players to carry more items across trips white raptors: are able to heal other injured raptors. having one in ur party would be very useful as they can nurse the combat raptors back to full health when they need it blue raptors: produce very nutritious milk with healing capabilities. having 1 or 2 of these back at ur ranch would be very useful black raptors: by far the rarest breed, its very unlikely that ull be able to get one of these, but in the case u do, they have the combat capabilities of the red raptor, speed of the yellow raptor, and tankiness of the green raptor. Breeding different colored raptors together can net u an entirely new colored raptor. each breed has atleast 1 guaranteed combination of parents that it will result out of. you will also need to maintain a good friendship bond with ur raptors, this is done by feeding them, grooming them, and petting them. u can see the strength of ur bond by SHIFT clicking them. more hearts indicate a stronger bond  having higher friendship bonds means ur raptors will perform better in combat, and in the case of blue raptors, they will produce more milk. Maintaining friendship bonds with baby raptors and keeping them happy will also encourage them to grow faster U can also analyze raptors using the new raptor-dex device available at ur ranch  the inherit modifiers indicate how strong this raptor's offspring will be. raptors inherit attack and health stats from both their parents, breeding raptors with higher inherit modifiers means the offspring will be stronger. raptors will also inherit some traits from their parents that will change how they will act around u and around other raptors, some of them being: Playful: raptors will play with their masters and tease them motherly: raptors will care for baby raptors, this will encourage baby raptors to grow quicker depressed: means its hard to keep this raptor happy and friendship bonds will deteriorate faster if not given enough care. coward: makes them flee combat if severly injured, ditching u to the wolves trouble maker: makes them attack other raptors at the ranch. however, trouble maker raptors will not attack other trouble maker raptors, instead they will form posses and bully raptors together. it might be a good idea to isolate them from the other raptors raptors primarily consume ores. to feed raptors, you need to place ore into the food troughs at the ranch. they are too civilized to eat ores off the ground or directly from ur hand, they will only eat it if its in their trough  beautiful raptor sprites by spessmenart! (rest are codersprites) ## Why It's Good For The Game adds a new layer to lavaland mobs, and gives miners new interesting tools and ways to tackle the challenges of lavaland. ## Changelog 🆑 sheets, spacemenart, ben10omintrix, goofball, infrared baron, aofie add: adds lavaland raptors and the raptor ranch /🆑 --------- Co-authored-by: Iamgoofball <iamgoofball@gmail.com> |
||
|
|
c1d68698fb |
Micro-optimize qdel by only permitting one parameter (#80628)
Productionizes #80615. The core optimization is this: ```patch - var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up. ``` We avoid a heap allocation in the form of copying the args over to a new list. A/B testing shows this results in 33% better overtime, and in a real round shaving off a full second of self time and 0.4 seconds of overtime--both of these would be doubled in the event this is merged as the new proc was only being run 50% of the time. |
||
|
|
a1e46c5d31 |
Basic Guardians/Holoparasites (#79473)
## About The Pull Request Fixes #79485 Fixes #77552 Converts Guardians (aka Holoparasites) into Basic Mobs. Changes a bunch of their behaviours into actions or components which we can reuse. Replaces some verbs it would give to you and hide in the status panel with action buttons that you may be able to find more quickly. They _**should**_ work basically like they did before but a bit smoother. It is not unlikely that I made some changes by accident or just by changing framework though. My one creative touch was adding random name suggestions. The Wizard federation have a convention of naming their arcane spirit guardians by combining a colour and a major arcana of the tarot. The Syndicate of course won't truck with any of that mystical claptrap and for their codenames use the much more sensible construction of a colour and a gamepiece. This lets you be randomly assigned such creative names as "Sparkling Hermit", "Bloody Queen", "Blue World", or "Purple Diamond". You can of course still ignore this entirely and type "The Brapmaster" into the box if so desired. I made _one_ other intentional change, which is to swap to Mothblocks' nice leash component instead of instantly teleporting guardians back to you when they are pulled out of the edge of their range. They should now be "dragged" along behind you until they can't path, at which point they will teleport. This should make the experience a bit less disorienting, you have the recall button if you _want_ to instantly catch up. This is unfortunately a bumper-sized PR because it did not seem plausible to not do all of it at once, but I can make a project branch for atomisation if people think this is too much of a pain in the ass to review. Other changes: - Some refactoring to how the charge action works so I could individually override "what you can hit" and "what happens when you hit" instead of those being the same proc - Lightning Guardian damage chain is now a component - Explosive Guardian explosive trap is now a component - Added even more arguments to the Healing Touch component to allow it to heal tox/oxy damage and require a specific click modifier - Life Link component which implements the Guardian behaviour of using another mob as your health bar - Moved some stuff about deciding what guardians look and are described like into a theming datum - Added a generic proc which can return whether your mob is meant to apply some kind of damage multiplier to a certain damage type. It's not perfect because I couldn't figure out how ot cram limb modifiers in there, which is where most of it is on carbons. Oh well. - Riders of vehicles now inherit all movement traits of those vehicles, so riding a charging holoparasite will let you cross chasms. Also works if you piggyback someone with wings, probably. ## Changelog 🆑 refactor: Guardians/Powerminers/Holoparasites now use the basic mob framework. Please report any unexpected changes or behaviour. qol: The verbs used to communicate with, recall, or banish your Guardian are now action buttons. balance: If (as a Guardian) your host moves slightly out of range you will now be dragged back into range if possible, rather than being instantly teleported to them. balance: Protectors now have a shorter leash range rather than a longer one, in order to more easily take advantage of their ability to drag their charge out of danger. balance: Ranged Guardians can now hold down the mouse button to fire automatically. balance: People riding vehicles or other mobs now inherit all of their movement traits, so riding a flying mob (or vehicle, if we have any of those) will allow you to cross chasms and lava safely. /🆑 --------- Co-authored-by: san7890 <the@san7890.com> |
||
|
|
9696dd1a1d |
Targeting Datums Renamed (and global) (#79513)
## About The Pull Request [Implements the backend required to make targeting datums global](https://github.com/tgstation/tgstation/commit/6901ead12e419530b7f646ea21094d4432d7385e) It's inconsistent with the rest of basic ai for these to have a high degree of state, plus like, such a waste yaknow? [Implements GET_TARGETING_STRATEGY](https://github.com/tgstation/tgstation/commit/d79c29134d03424a9f8bacd64c08cb41775fe8c0) Regexes used: new.*(/datum/targetting_datum[^,(]*)\(*\)* -> GET_TARGETING_STRATEGY($1) Renamed all instances of targetting to targeting (also targetting datum -> targeting strategy) I've used GET_TARGETING_STRATEGY at the source where the keys are actually used, rather then in the listing. This works out just fine. ## Why It's Good For The Game Not a misspelled name through the whole codebase, very slightly less memory load for basically no downside (slight cpu cost maybe but not a significant one. --------- Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> |
||
|
|
0c17553a96 |
Basic Constructs: Artificer (#79015)
## About The Pull Request Really getting into the meat of the constructs now. Artificers have become basic mobs. On the whole, this was a pretty rote conversion, with no significant gameplay changes other than the switch to using healing hands rather than a unique heal ability. The player experience as an artificer is more or less identical. The _interesting_ part comes with the AI for the seldom-used "hostile" variant. Hostile artificers, being squishy and laughably weak, are now a dedicated "medic" role for constructs. They will perform triage, always seeking the most wounded construct (or shade!) to give healing to. They will not attack at all, but they _will_ flee with great speed if attacked and not busy healing. If they are healing another construct, they will remain even if they are beaten to death. I've added some more AI functionality that may come in handy in the future, and done some refactoring to keep things from getting out of hand: - A planning subtree for finding targets that will always select the most heavily wounded living target that the mob can see (or rather, the one with the least health). Useful again for medical triage, or for making a particularly cruel mob that always attacks whoever is easiest to kill. I plan to use this for NPC wraith constructs when I convert them. - Targeting datums can now check a blackboard key to see if they should only target wounded mobs. This is particularly useful for "medic" type mobs such as this one. - I've refactored the "minimum stat" behavior of targeting datums to be stored in a blackboard key. This removes the need to have unique subtypes for each different minimum stat we might want. Which... for the most part, weren't even used, leading to proliferation of several completely identical targeting datums in a bunch of different files. Hopefully this change will make things cleaner. In addition, this PR fixes a pair of bugs from #78807 that I didn't catch: - Healing constructs can now actually heal shades. Turns out I forgot to add the correct biotype. - Healing hands, when set to print the target's remaining health, no longer does so as a visible message. The one thing I didn't do that I kind of wanted to is make NPC artificers heal themselves when wounded and not busy doing something else, but it ended up being kind of annoying to make a mob willingly target itself. NPC artificers never had this behavior before, so I consider it okay, but maybe I'll circle back to it later. ## Why It's Good For The Game Another basic conversion, another 5 items off the checklist. Very little should change in-game, though I think the new NPC AI could make for interesting challenges in ruins or bitrunning or something. ## Changelog 🆑 refactor: Artificer constructs have been converted to the basic mob framework. This should change very little about them, but please report any bugs. NPC artificers are now smarter, and will focus on healing nearby wounded constructs - if you see them, take them out first! /🆑 |
||
|
|
ec4defe598 |
Basic Constructs: parent type + Harvester (#78807)
## About The Pull Request I kind of hate cult as a whole, but I like these little guys. Let's basic-ize them. This PR begins the process with the harbinger of the Red Harvest, the Harvester! Their actual capabilities have been changed very little, except that most of their unique properties have been moved to components and elements. The basic parent type of constructs has also been set up to make the next bunch of conversions easier. - Constructs capable of repair now receive the healing hands component. Healing hands has been extended, to allow the healing particles to come in custom colors, and to allow it to print the target's health if the target is not a carbon. - Repairing constructs also receive a new element: Structure repair is a lighter-weight variant on healing hands that allows repairing clicked-on atoms of specified types. - Constructs capable of damaging walls, meanwhile, receive the wall smasher element. Harvesters in specific have two special elements: - The existing "amputating limbs" element, making them instantly rip a limb off of any carbon they attack. As before, if they attempt this on a carbon with no arms or legs, the harvester will hear Nar'Sie's call to bring the victim to her. - A new "wall walker" element, allowing them to walk through walls of specified type (cult walls for harvesters) and allowing them to drag any atom through as well. Other than laying the groundwork, there's not much else here. I started with Harvesters specifically because they are only ever player-controlled, which makes things easy. I'm not completely happy with the use of healing hands here - it gets the job done, but currently loses a bit of the previous flavor (a healing beam as a visual; printing the target's health in cult span). I may extend it further to allow this behavior. I've included an UpdatePaths script, even if these things shouldn't be mapped, just in case something fucky is going on on a downstream. You never know. ## Why It's Good For The Game Constructs, currently, occupy _19_ spots on the simple animal list. This is something close to 10% of all the remaining ones. Also, like everything to do with cult, construct code is janky, old, and desperately in need of updating. This is the first step. ## Changelog 🆑 refactor: Harvester constructs have been updated to the basic mob framework. This should have very little impact on their behavior, but please report any issues. /🆑 --------- Co-authored-by: san7890 <the@san7890.com> |
||
|
|
ed0999e4ea |
Adds error on qdeling callback, fixes errors this causes (#77850)
## About The Pull Request You shouldn't ever qdel a callback. If you don't want to own it free your ref (remove it from a list/set it to null). When all refs are cleared it'll get cleaned up by byond itself |
||
|
|
a0881f897c |
Lightgeist AI (#77287)
## About The Pull Request The lightgeist AI controller was marked as "these aren't intended to exist outside of player control" but this is actually untrue. Lightgiests can appear under AI control either from a rare vent clog event or in the "patch of eden" lavaland ruin. As they heal things by "attacking" them, I made it so that they will target wounded creatures to "attack" them, though they will only heal them quite slowly, significantly less efficiently or effectively than a medibot (for example). While making this change I also added a couple more parameters to their "healing hands" component, now they can no longer repair beepsky or heal cyborg limbs. It's fleshies only. Lightgeists will attempt to heal _anything_ they can see which is both injured and has healable damage, which is notable because while this makes the "Patch of Eden" ruin a nice place of respite for a wounded miner you should be careful to let them finish up before you leave. If they follow you out, they will attempt to heal any of the fauna that you are attacking. Worse still, most Lavaland mobs are not signatories of the Geneva convention and have no compunctions against killing field medics. The majority of listed file changes in this PR is that I made some attempt at splitting our massive list of blackboard keys across several files, in order to cause myself a headache based on which of my (or other people's) open basic mob AI PRs gets merged first. Also I fixed a bug where the goliath attack forecast would runtime if it killed a mob which qdels itself on death (guess how I found that out). ## Why It's Good For The Game Adds a bit more character to a lavaland area and rare event. ## Changelog 🆑 add: Lightgeists under AI control will selflessly heal any wounded creature that they see. balance: Lightgeists can no longer repair non-organic tissue. /🆑 |
||
|
|
7867d14fd4 |
Lightgeists won't try to heal toxin damage (#73467)
## About The Pull Request Fixes #73439 Lightgeists use `heal_overall_damage` to heal, but despite the name that actually only heals burn, brute, and stamina damage. It will now prompt an error message if you try to heal someone who doesn't have any of those damage types. Simpler mobs can't take toxin or oxyloss damage so this has no effect on spiders (the other user of this component). Also during my conversion I forgot to set the lightgeist healing time to 0, so I did that too. I thought about maybe changing this so that they _can_ heal toxin damage but they've existed without being able to do it for so long that I don't think it would be a "bug fix" at that point, I'll maybe adjust the component behaviour further (to use `heal_ordered_damage` instead probably) after this month. Until then I technically can't do it without affecting Spider balance a little bit. ## Why It's Good For The Game Makes it a _little_ clearer why someone's health doesn't increase when they are clicked on. Restores lost functionality. ## Changelog 🆑 fix: Lightgeists won't try to heal any damage which isn't burn or brute, because they can't. fix: Lightgeists don't need to perform an action bar in order to heal someone, which was added by mistake. /🆑 |
||
|
|
3335b5e59f |
Basic Mob Spiders II: Elements (#73202)
## About The Pull Request This PR elementises two kinds of spider behaviour in preparation for making them into Basic Mobs, which in turn will solve a bug with Araneus. This will probably conflict with my other PR but I'll deal with it. The Nurse Spider and Flesh Spider healing abilities which were similar but not _quite_ the same now share the same component. Also Lightgeists because they also did this. I'll be honest I think Flesh Spider would be better off with the "Regenerator" component instead but that would be a balance change so I can't do that right now. The Tarantula "slower when not on webs" passive is also now an element. This will make my third PR (to be opened when these two are merged) easier. Also I noticed we were using the same colour for spawning a particle in a few places so I moved that hash into the colours define file. ALSO while making this the linter identified that a shitload of procs were passing `required_bodytype` to `heal_overall_damage` as if it was `stamina` which probably caused some bugs. Don't know which though! https://user-images.githubusercontent.com/7483112/217679050-b728ee98-3ba1-4663-bb6b-75295d5f9a6a.mp4 ## Why It's Good For The Game Reduces amount of duplicated code, making it easier to maintain. Elements can be reused for other things later, like the infuser? ## Changelog 🆑 refactor: Spider healing abilities have been refactored to reuse the same code rather than reimplement it across two different mobs, it should work the same as it used to. This is also used by Lightgeists. fix: Mob biotype on `heal_overall_damage` should be applied more consistently. This might mean that some things which were previously healing prosthetic limbs have stopped doing that. /🆑 |