## About The Pull Request
When bitrunners attempt to leave their domain via the ladder, they will
fail if there is an active, living bitrunning glitch antagonist within
the domain. Other methods of leaving such as death or taking the red
pill are unaffected.
they can also leave if the crate's delivered
sorta a sister PR to #95934
## Why It's Good For The Game
enter domain -> get alert about bitrunning glitch -> leave -> turn off
domain
What a fun gameplay loop, for everyone involved.
You'll fight the glitch and you'll like it. (liking it
[pending](https://github.com/tgstation/tgstation/pull/96138))
You can still leave if you REALLY, REALLY need to at the cost of a
little brain damage, but otherwise the literal only obstacle that will
ever be in your path should be something you have to engage with.
## Changelog
🆑
balance: Bitrunners can't back out of domains via the ladder while
bitrunning glitches remain in them
/🆑
## About The Pull Request
For every living, connected bit avatar remaining in the simulation, the
`do_after()` for leaving the simulation as a bitrunning glitch ghost
role is multiplied by 5. The base timer remains at it was, two seconds.
Additionally, there is an exception in place for the "Island Brawl"
domain, which is the FFA with infinite respawns. It still multiplies by
5 for each active bitrunner, but that multiplier is reduced by 1 for
each death, so you likely only have to kill one wave of bitrunners for
normal escape time.
Additionally, because of necessity for the exception and also basic good
sense, bitrunning points are no longer component-based on specific turfs
in the domain, and are held in the server. It never should have been a
component, it had no reason to be one. This, as a consenquence, also
fixes that you could completely softlock any domain using points by
simply crowbarring the turf that the crate was yet to spawn on.
## Why It's Good For The Game
Yesterday, I saw one of the lamest things I've ever seen in the game. A
bitrunning glitch spawns in, walks literally right by two bitrunners as
they ask who he is, and leaves the simulation to go on a killing spree
unburdened. There was extenuating circumstances in that situation, but
it still was a miserable breakdown of what I think the intended gameplay
of a bitrunning glitch is, and shows how ridiculously easy it is to
simply not engage with the intended hurdle in your path. The
primary(and, really, only) job of a glitch is to kill bit avatars, and
this PR makes it significantly more difficult to just... walk by them to
go on your killing spree on station. Work, then play.
## Changelog
🆑
balance: For every living, connected bitrunner remaining in a domain,
bitrunning glitches will take five times longer to escape.
fix: You can no longer softlock any virtual domain that uses points by
crowbarring the reward turf before the crate spawns.
/🆑
## About The Pull Request
`def_zone` can hold a zone or a bodypart. In the case of a simple
stabbing or shooting, it sends a bodypart. That bodypart is the bodypart
of the domain actor. When we call `apply_damage()` on the real-world
body, we send the bodypart of the domain actor in `def_zone`, which
somehow has no runtimes or checks and ends up successfully dealing
damage... to the actor. Again. This doesn't always shield the original
body, as `def_zone` is not guaranteed to be sent as a bodypart(or at
all), so you could be killed in real life by certain attacks still, but
for the grand majority of attacks this meant that the real body was
invincible and the actor took double.
## Why It's Good For The Game
fixes#93081
## Changelog
🆑
fix: Bitrunners no longer take double damage in-domain, and do take
damage to their real bodies
/🆑
## About The Pull Request
Removes a lot of cargo cult copypasta with
`default_deconstruction_screwdriver`, `default_deconstruction_crowbar`,
and to a lesser extent `default_pry_open` and
`default_change_direction_wrench`
ALL you gotta do now if you want your machine to have an openable panel
or be deconstructible with a crowbar is this
```dm
/obj/machinery/dish_drive/screwdriver_act(mob/living/user, obj/item/tool)
return default_deconstruction_screwdriver(user, tool)
/obj/machinery/dish_drive/crowbar_act(mob/living/user, obj/item/tool)
return default_deconstruction_crowbar(user, tool)
```
`default_deconstruction_screwdriver` no longer directly sets
`icon_state`, requiring the user pass in the open and closed icon
states. Now, it just calls `update_appearance`, and everything that once
passed the icon state now uses `base_icon_state` and
`update_icon_state`.
## Why It's Good For The Game
Many of these procs were terribly overcomplicated and difficult to work
with for what should be a relatively simple action
Streamlining it makes it easier for coders to understand and work with
## Changelog
🆑 Melbert
refactor: A majority of machines had their screwdriver/crowbar/wrench
interactions rewritten, report any oddities like being unable to open a
machine's panel or deconstruct a machine
/🆑
## About The Pull Request
Continues the work of #94761 by adding an analog for virus references
It contains a majority of viruses - including some that are
not-quite-viruses like parrot possession
Some are excluded, some are combined into others
It also contains all advanced virus symptoms
<img width="859" height="509" alt="image"
src="https://github.com/user-attachments/assets/c73f56c0-5a11-4643-9a97-1e2a06ade0c1"
/>
Other changes
- Refactored the SDSM to have use a generic "PaginatedBook" component
for reuse
- Adjusted flavor of all of the diseases
- Flu / Spanish Flu and Cold / Cold 9 now properly act as antibodies for
one another as implied by cure text
## Why It's Good For The Game
Refer to #94761 : De-wikification and larp. This one is a reference to
the IDC-11.
## Changelog
🆑 Melbert
refactor: Refactored the SDSM-35 to allow for new books of similar
styles, report any oddities with it.
fix: Fixes the broken image(s) in the SDSM-35.
add: Adds the IDC-27 in Medbay, the CMO's office, Virology, and possibly
the Library. It's a reference book to all viruses you may experience,
similar to the SDSM-35.
add: Several diseases/viruses received minor flavor adjustments,
primarily to cure text, agent, description, and form.
add: Getting cured of the Flu provides immunity to Spanish Flu (and visa
versa) as implied in cure text.
add: Getting cured of a Cold provides immunity to Cold-9 (and visa
versa) as implied in cure text.
/🆑
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
## About The Pull Request
Previously, when one drank out of a glass of booze that the virtual
bartender graciously offered, one would not get any closer to domain
completion, because said bartender got his glasses new out of a vending
machine. These glasses never were registered on domain creation, due to
not existing on domain creation. This pr registers the vending machines
within the domain with a new signal that allows newly created glasses to
also be registered, and count towards domain completion.
## Why It's Good For The Game
A bitrunner dying of liver failure due to the obtuse distinction between
glasses that were in a vending machine and glasses that were on the
table sounds very annoying. Also, you could very easily make the domain
not completable within seconds by spawning as a ghostrole and breaking
the table glasses. You can still do that, but you have to break an
entire vending machine's worth of glasses too.
## Changelog
🆑
fix: Glasses that were in the vending machine now still count for the
completion of the Beach Bar virtual domain
/🆑
## About The Pull Request
Revamps Echolocation effect
- Echolocation no longer pulses, at least, not as noticeably. The world
around you is consistently black and white, and objects will fade into
view as you approach or fade out of view as you move away.
- Echolocaters are now really blind. But you can still "see", so long as
you're not also deaf.
- Echolocaters can now "hear" mobs through walls, ie, see mobs through
walls like thermal vision.
- While echolocating you have the option of selectively ignoring things
which would make the screen busier - currently, blood, items, and floor
objects like vents or holopads.
https://github.com/user-attachments/assets/d559482c-e6e2-4b97-8387-54bca4074db0https://github.com/user-attachments/assets/aeddd805-230c-4e82-b93f-1e537f4186eb
## Why It's Good For The Game
Echolocation is such a cool effect but it currently is basically
unplayable
This revamp aims to make it more playable, particularly by making it
update constantly so you can react easier.
## Changelog
🆑 Melbert
balance: Revamped echolocation effect entirely. Now updates constantly,
rather than on a cooldown.
balance: Echolocaters can filter out certain objects that they would
really prefer not to see at the moment.
balance: Echolocaters are mechanically (but not visually) blind, which
means they have flash immunity and whatnot. Because of course they are.
balance: Echolocater lose their ability to echolocate if they've gone
deaf. Then you're truly fully blind.
balance: Echolocaters can see (or rather, hear) mobs through walls.
refactor: Refactored Prosopagnosia to make the effect a bit more
generic.
/🆑
---------
Co-authored-by: Jordan Dominion <dominion@tgstation13.org>
## About The Pull Request
When you get absorbed by a changeling, you get made into an imaginary
friend of the changeling that absorbed you
<img width="349" height="185" alt="image"
src="https://github.com/user-attachments/assets/03b00f37-8428-49c9-90c0-c165429e0674"
/>
<img width="290" height="223" alt="image"
src="https://github.com/user-attachments/assets/b40fe663-736b-4184-a50f-18376905a79a"
/>
<img width="682" height="161" alt="image"
src="https://github.com/user-attachments/assets/982102da-7e15-4a9c-93ef-3e12dc72d7d8"
/>
This imaginary friend doesn't show up on health scan (obviously), and
they communicate via hivemind chat, meaning all other changelings are
capable of hearing them
If your body is revived, you get yoinked out of the hivemind as you'd
expect
You also have a button to eject yourself from the hivemind (if you
prefer to observe).
And the ling themselves has a button to eject people from their hivemind
that are being annoying
## Why It's Good For The Game
Makes being absorbed a little less of a bummer, now you can tag along
and maybe even give them some tips about how your character would act if
they choose to disguise as you.
## Changelog
🆑 Melbert
add: When you get absorbed by a changeling, you get made into an
imaginary friend of the changeling that absorbed you.
refactor: Refactored how people are returned to their bodies after
occupying separate bodies, such as bitrunners and ghost roles. Report
any oddities or failure to return correctly.
/🆑
## About The Pull Request
This PR refactors ``effect_system``s to be a bit easier to use by
getting rid of ``set_up``, allowing ``attach()`` to be chained into
``start()`` and refactoring most direct system usages in our code to use
helper procs.
``set_up`` was unnecessary and only existed to allow ``New``'s behavior
to be fully overriden, which is not required if we split
sparks/lightning/steam into a new ``/datum/effect_system/basic`` subtype
which houses the effect spreading behavior. This allows us to roll all
logic from ``set_up`` into ``New`` and cut down on code complexity.
Chaining setup as ``system.attach(src).start()`` also helps a bit in
case no helper method exists
I've added ``do_chem_smoke`` and ``do_foam`` helpers, which respectively
allow chemical smoke or foam to be spawned easily without having to
manually create effect datums and reagent holders.
Also turns out we've had some nonfunctional effect systems which either
never set themselves up, or never started, so I fixed those while I was
at it (mostly by moving them to aforementioned helper procs)
## Why It's Good For The Game
Cleaner code, makes it significantly easier for users to work with. Also
most of our effect system usage was copypasta which was passing booleans
as numbers, while perfectly fine helper procs existed in our code.
## Changelog
🆑
refactor: Refactored sparks, foam, smoke, and other miscellaneous effect
systems.
refactor: Vapes now have consistent rigging with cigs using the new
system.
fix: Fixed some effects never working.
/🆑
## About The Pull Request
Improves some blackbox logging for bitrunner domain creation, by also
logging how much information they had when they chose it.
Also some minor code improvements, by making methods for whether the
name/reward of a domain is visible.
## Why It's Good For The Game
Right now, if we just look at blackbox logs, we cannot easily tell if a
domain is being deliberately avoided when possible, as we cannot tell if
it's run unintentionally or intentionally. Now we will record that
information, so we can act on it, and hopefully perform actions to
improve the domains that people attempt to avoid.
## About The Pull Request
Added support for turning basic mob bosses into virtual megafauna. Moved
blood drunk miner's loot dropping behaviour up to /basic/boss to support
this better in future.
Fixes#94878
## Why It's Good For The Game
It's not very useful if admins have to spawn the cache manually or lose
the time and points spent on the domain.
## Changelog
🆑
fix: The Sanguine Excavation bitrunning domain will drop the cache on
killing the boss again.
/🆑
## About The Pull Request
Heretic rusted tiles do not apply any effects to things which are
jaunting or inside vents.
They also don't apply any _negative_ effects to things that are flying
(but they do apply positive ones, just because flight is a cool thing to
have earned and it would be sad to lose your bonuses because you have
wings).
I also renamed the element so that it isn't named after the rust passive
(in fact, the rust heretics with that passive don't use the element) and
simply describes what it does, and removed a subtype in favour of just
passing in some arguments.
I also added a trait which bypasses the negative effects of standing in
rust, in case an admin creates a non-heretic creature and gives it rust
healing. They shouldn't have _both_ healing _and_ gain disgust and minor
damage from starting in rust (possibly the heretical harvester was being
effected by this?)
Finally I adjusted the `rust_heretic_act` and `rust_turf` procs to
remove a footgun I saw a developer fall into recently where they didn't
realise that the generically named "rust turf" proc actually assumes a
wizard did it, now if we add anything else that wants to non-magically
rust a turf then it will work the way you expect.
As a side effect this changes the two item sources of rust that heretics
get to actually use rust resistance rather than rusting every turf, I
set them to effect all inorganic turfs as a default.
And finally I noticed that rust heretic ascension was passing
"RUST_RESISTANCE_ABSOLUTE" as a value into its proc which reads `Should
not be rustable. EVER.` in its comment, which smelled like a bug. So I
changed it to just "things which should be rustable ever".
## Why It's Good For The Game
It is the logical way you would expect these things to work;
Heretics crawling in vents or (for instance) using space crawl should
not be healed for touching rust that they aren't touching, as they are
not readily accessible to other players. The idea of the rust healing is
that it's a tradeoff for exposing yourself in a visible "territory", so
you shouldn't be able to avoid it by being in that territory but
untouchable and invisible.
Similarly, players who have gained the ability to fly would not expect
to get sick from flying over rusty flooring. They're out of range.
## Changelog
🆑
balance: Eldritch rusted tiles don't apply their effects to anyone who
is jaunted or in vents, and don't apply negative effects to people who
are flying.
balance: Heretic items which apply rust (grenades and eldritch reagent)
check the rust resistance level of the turf rather than always rusting
it.
fix: Rust Heretics ascending don't rust unrustable turfs, like space
tiles.
/🆑
## About The Pull Request
Tin, some global lists being kept in memory for no reason when all they
are used for is initially picking a random reagent from a list.
## Changelog
Nothing player-facing, just code janitoring.
## About The Pull Request
<img width="565" height="201" alt="image"
src="https://github.com/user-attachments/assets/f747992c-82d7-4cd2-9d5c-b94b7de37cdd"
/>
<img width="618" height="108" alt="image"
src="https://github.com/user-attachments/assets/8d5c4e25-87ea-4e53-b9e6-e95e26b3e69f"
/>
- N-spect scanners can no longer print reports
- Clown N-spect scanners have been removed as printing reports was their
primary function
- Security no longer get bounties to loot the brig's equipment. The
contraband bounty is still available.
- Patrol bounties have been reworked.
- A patrol bounty will give you an area and a number of steps that you
must take in an area.
- To complete the bounty, you must walk to the area and take that many
steps. It's that simple.
- Your ID card will update you as you progress the bounty.
- You are rewarded more for larger areas, and less for teeny tiny areas.
- Walking back and forth the same two tiles will not count towards
progress.
- When done, all you need to do is go back to the civ console and press
"send". You don't need to add any items to the pad.
- All security officers can get general patrol bounties (service + maint
+ hallways). Departmental officers can get patrol bounties for their
department.
- And yes, it tracks if your *id card* moves. This means you can strap
your ID card to a drone and it'll count. Get creative if you're lazy.
- ID trims how handle bounty generation. This changes very little,
besides allowing certain trims for certain jobs to add specific
bounties.
- There's now setters for bounties and bank accounts.
- Fix Bountious Bounty trait by having a `get_reward`
## Why It's Good For The Game
Sec bounties to loot a bunch of miscellaneous things from the brig is...
odd. All it does is deprive your team of equipment should you need it.
On the other hand, patrol bounties are really flavorful, but a bit
cumbersome thanks to needing a hand scanner. By integrating the process
of patrolling *into* the officer's ID card, it means you can just grab a
bounty and go about your business.
The idea is that this'll streamline the process of patrolling a bit and
make it more natural and fun (well, as fun as "walking around" can be.
Which is fun to me...)
## Changelog
🆑 Melbert
del: N-spect scanners can no longer print reports. All it does now is
scan for contraband.
del: Clown N-spect scanners have been removed.
del: Security no longer get bounties to loot the brig's equipment.
Though the contraband bounty is still available.
add: Security's patrol bounties have been reworked. Now, they just
require you to walk around an area for a bit. No scanning necessary.
refactor: Adds setters for bounties and bank accounts. Report any
situations where your bank account is not set correctly.
refactor: ID trims now handle bounty generation. Report any situations
where you get a weird pool of bounties.
fix: Bountious Bounties station trait works again
/🆑
## About The Pull Request
Floppy disks received a sprite upgrade, as well as unique wraps:
<img width="364" height="150" alt="image"
src="https://github.com/user-attachments/assets/0ac433e3-7432-4c06-bec2-aeae00b6852f"
/>
<img width="786" height="527" alt="image"
src="https://github.com/user-attachments/assets/0f36bd0d-0362-4431-8131-49060a2fe348"
/>
You can now stack floppy disks! They also scatter around when thrown.
The video also showcases new styling options with a selection of
stickers! You can also write something on the disk instead of selecting
an icon:
https://github.com/user-attachments/assets/ff0a8542-9d79-4108-ae46-672ca5d620a2
MOST disks now inherit the `/item/disk` type to properly stack and do...
stuff. An updatepaths script included.
## Why It's Good For The Game
Old school is cool. Stacking disks makes them feel more authentic, while
styling allows for more crearivity!
## Changelog
🆑
add: New unique wraps for floppy disks
qol: Floppy disks can now be stacked
image: New sprites and stickers for floppy disks
map: Added and ran an updatepaths script
refactor: Most disks are now under the base disk item type
/🆑
---------
Co-authored-by: The-Tyrant <tyrantofgaming@gmail.com>
## About The Pull Request
Last Christmas we had and resolved this bug #88595 where via the
mechanic of buying random trash, Cargo could roll on the roulette to try
and get random Christmas presents and open them for random items.
This was removed because it's not supposed to work that way and was a
way of exploiting Christmas cheer for personal gain, which is grinchsome
behaviour.
That said, being able to order Christmas presents is also kind of
soulful, so this PR brings that mechanic back but on purpose this time.
During the Christmas season _only_, Cargo can spend 3000 credits of
their budget to order a "Surplus Christmas Gifts" crate which contains
4-6 presents _with pre-assigned recipients_.
In a similar system to addressed mail, only the person written on the
gift tag can open the present, so unless you're sufficiently scroogeous
to collect a huge pile of presents on the cargo room floor in hopes of
getting a couple with your name on (in my testing these contained raw
unbaked croissant dough, and a piece of paper from a space ruin) you
should mostly be using this to deliver generalised holiday cheer to the
crew rather than just yourself.
This PR also contains (maybe as more lines than the actual feature) a
refactor changing a bunch of boolean vars on `/datum/supply_pack` into
bitflags, because I needed to add one more and it seemed silly to have
so many booleans.
## Why It's Good For The Game
It allows those with the yuletide spirit to deliver some christmas cheer
to their fellow man, isn't that the season's reason?
## Changelog
🆑
add: When the game considers it to be Christmas, Cargo can order
additional Christmas gifts pre-addressed to random crew members.
/🆑
## About The Pull Request
Empy lists. There are a lot of 'em.
<img width="981" height="512" alt="image"
src="https://github.com/user-attachments/assets/b94b041a-2904-466b-ab89-54bd1de11b4e"
/>
Going through ways to reduce memory I found a few easy ones here. Wires,
the edible component, the seethrough component. None of these are really
a concern when it comes to needing lists in memory for performance
reasons. Wires aren't going to be cut most of the time for each door. A
lot of food does not have any junkiness. Seethrough component lies
dormant most of the round. Etc.
Making lists lazy in these cases should be a no brainer.
Everything I tested still seems to work exactly the same.
## Why It's Good For The Game
Frees memory that is just taking up space a lot of the time.
## Changelog
Not player-facing, this is all under-the-hood stuff.
## About The Pull Request
Passes a standardized define into some of the tgui to parody behavior
with vending machines.
Adds a few defines for money symbols to make it easier to rework types
of money.
If yall are for this I can also go through and find and replace a ton of
strings and other tgui with these, but dont want to sink 2 much time
into it if not.
<img width="966" height="646" alt="image"
src="https://github.com/user-attachments/assets/2d4753be-7e5d-4733-acf8-05f354127a6a"
/>
Proof of concept if Nanotrasen was not an evil conglomerate and the
dollar never went out of style
<img width="1009" height="661" alt="image"
src="https://github.com/user-attachments/assets/e68bfcd3-4053-4641-9b28-f384f2cb049b"
/>
some broken shit here but 99% thats cause minimal runtime station does
not support the supply console
<img width="795" height="767" alt="image"
src="https://github.com/user-attachments/assets/30dbd625-5338-4dc3-80db-922ff045f0f0"
/>
## 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!
/🆑
## About The Pull Request
`create_from_ghost` can be called from stuff like... dynamic executing a
ruleset, so putting a sleep/user input within it causes problems
So I refactored ghost spawns a fair bit, creating a clear delineation
between where you can and can't put user input
## Changelog
🆑 Melbert
fix: Pirates will no longer randomly spawn as human
fix: Servant Golems have numbered names again
refactor: Refactored ghost spawns (like spider eggs or pirate spawners),
report any oddities
/🆑
## About The Pull Request
Alt click a netpod to enable scanning, which scans your dna and makes
newly created bit avatars look more like you. If the netpod already has
an associated bit avatar it doesn't do anything.
Purely visual/audial if you count tts, it doesn't let you switch races.
## Why It's Good For The Game
Bitrunners can recognize their teammates.
## Changelog
🆑
add: Netpods can now scan their occupants to create more accurate bit
avatars
/🆑
---------
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
Fixes https://github.com/tgstation/tgstation/issues/90641
Fixes https://github.com/tgstation/tgstation/issues/88366
Eliminates worries over virtualspace currency being sent to real
accounts.
When I was looking into why there were no flags for bitrunning areas.
Then I saw this mess:
<img width="929" height="889" alt="Code_2we2QjDyFp"
src="https://github.com/user-attachments/assets/8a807bfe-b566-4057-a8ea-2b306325687d"
/>
Not having enough space / being too lazy to refactor this is a silly
reason to not include flags for something like these virtual areas where
it can be quite helpful. Fortunately I am not too lazy ~~in this
moment~~ so here we go:
It was fairly logical to move over some of these to a separate flag,
which I've called `area_flags_mapping` since they pertain to maploading
things and terrain generation mostly. `area_flags` stays reserved for
general properties and now has more room than it did before for you
people to fill it with.
In doing this it's also neatened up the code quit a bit, as UNIQUE_AREA
was kind of everywhere and now that it's implied by default less areas
need to have it defined (or explicitly un-defined).
<details> <summary> Working as intended </summary>
<img width="787" height="448" alt="dreamseeker_p0Qts36tG1"
src="https://github.com/user-attachments/assets/25056f34-8d43-4be2-a293-e53df7a7d1db"
/>
<img width="383" height="59" alt="dreamseeker_Ek7TXCcpbA"
src="https://github.com/user-attachments/assets/89622974-9467-4cdb-8345-d684f7c9004b"
/>
</details>
## Why It's Good For The Game
Fixes an exploit, improves the area flags situation slightly.
## Changelog
🆑
fix: you can no longer send money from virtualspace to a real account
code: adds a flag for virtual areas so they can easily be checked, as
well as an easy helper proc, 'is_area_virtual(your_area)'
/🆑
## About The Pull Request
When take a ghost role from a ghost role sleeper, if you became a ghost
by observing you will be offered the opportunity to spawn in as your
static. Obviously if you joined the round normally or have already
spawned in as a ghost role you won't be prompted. No cloning yourself
allowed.
Not every ghost role allows this, and you won't get the prompt if your
static is a race that breathes plasma (basically just those purple
skeletons) because that opens up a giant can of worms. However, you
_will_ get the prompt if you are playing as any other race. (I'm pretty
sure every ghost role has power for ethereals besides ashwalkers but
that's not one of the ghost roles that lets you spawn as your static for
super obvious reasons)
Some ghost roles, like pirates, will allow you to spawn in as your
static but overwrite your name.
## Why It's Good For The Game
Felinid comms agent felinid comms agent felinid comms agent felinid
comms agent felinid comms agent felinid comms agent felinid comms agent
felinid comms agent felinid comms agent felinid comms agent felinid
comms agent felinid comms agent felinid comms agent felinid comms agent
## Changelog
🆑
add: You may now spawn in as your static when picking a ghost role
/🆑
---------
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
Moves all blood handling into procs and adds ways to easily hook into
basically every basic blood behavior.
This PR is not meant to fix every single case of janky blood logic in
the game. The main point and motivation of this PR is to add hooks for
blood behaviors. This allows for way more flexibility with blood code.
I am not going to fix our 3000 instances of single-letter vars, wacky
blood transfers, etc. This is just the groundwork for future PRs to
build off of, and by itself, should do very little to change blood
behavior.
I also added a rigorous set of unit tests for verifying that all of the
basic blood volume procs work correctly.
## Why It's Good For The Game
Previously, blood was handled via directly reading/writing
[var/blood_volume]. This was INCREDIBLY inconsistent and there was no
way to hook into it. This PR makes blood handling way more consistent,
which is great for all sorts of features.
## About The Pull Request
1. Adds `Heretical Hunt`, an easy difficulty domain that tasks you with
killing and sacrificing simulated crew members. The domain has a few
ways to conquer it, as you don't need to kill all the simulated crew
members and there's some hidden loot to make use of
It's an easy domain because
- You have quite decent armor,
- The mobs are pretty unintelligent,
- You can always fall back and heal passively on the rust tiles
- There are many ways to tackle it
Though it's not a complete pushover, the mobs can still overwhelm you if
you're not careful.
<img width="440" height="347" alt="image"
src="https://github.com/user-attachments/assets/a3f30204-0200-4197-80bb-aee083059164"
/>
2. Virtual beings are given a minor positive moodlet for killing people
instead of a negative one
## Why It's Good For The Game
1. I thought it'd be kinda fun if we had antag-themed domains which
soft-explains the gameplay loops or mechanics of certain antags, in this
case, heretics sacrificing people
2. You don't feel remorse for killing people in video games, right anon?
## Changelog
🆑 Melbert
add: Added a new easy difficulty bitrunning domain, "Heretical Hunt"
add: Digital mobs receive positive moodlets for killing people rather
than negative
fix: Madness Mask no longer affects corpses
fix: Fixed some heretic runtimes
/🆑
## About The Pull Request
Completing a combat bitrunning domain grants 0.8 score bonus per player
that escaped without being hit
## Why It's Good For The Game
I figured it be a fun challenge to try to nohit these things, especially
the megafauna ones. For a bonus.
## Changelog
🆑 Melbert
add: Nohitting a combat bitrunning domain rewards a higher score.
/🆑
## About The Pull Request
Most screen alerts that use the midnight hud style no longer have the
button baked in their icon. Other screen alerts with their own
background or shape (robot and mech alerts, atmos, heretic buffs or
debuffs etc.) are not affected. Also updated a couple sprites but didn't
spend too much time on them. Mostly reusing existing assets.
Montage of how the alerts look on threee different hud styles
(Operative, Trasen-Knox, Detective, ALSO I FIXED THE BUCKLED ALERT
ALREADY):
<img width="293" height="323" alt="image"
src="https://github.com/user-attachments/assets/3a2b972b-aa5a-4c27-a454-c8c39acf6e20"
/>
It looks only a smidge iffy on the syndicate since the top and bottom
borders aren't layered over all the overlays, but it isn't something to
worry about in this PR.
## Why It's Good For The Game
Screen alerts always had the midnight hud button baked in their icon
states (now overlays), which completely disregard the player's hud
setting, much unlike action alerts buttons. Melbert has also said that
it'd be nice if the code for action buttons could also be used in screen
alerts and viceversa, to slim things down. That's obviously not what I'm
doing today, but having most of the screen alerts already without the
baked background will surely help if we ever pursue that objective.
## Changelog
🆑
refactor: Refactored screen alerts a little. Most should now fit the
player's hud style. Report any issue.
imageadd: A few screen alerts have been polished/updated a little.
/🆑
## About The Pull Request
a spooky special possession pr for october appears~~
(This is just some code cleanup)
Before, some procs had the `mob_possessor` arg, and some didn't. Which
made it a nightmare to add more positional args to it down the line.
This PR just ensures that all positional args are present in all the
instances of the proc.
## Why It's Good For The Game
Makes this proc chain slightly less of a mess to deal with.
## Changelog
N/A
## About The Pull Request
- Added full support for RETA system
- Categorized all configs for search purposes
- Added channel check for most usages of get_announcement_system() calls
## Why It's Good For The Game
## Changelog
🆑
code: Little AAS code cleanup. Added full RETA support. Grouped configs
for search purposes.
/🆑