Maintenance Pill Rebalance / Random reagent spawning refactor (XENOMICROBE MAINTPILLS!!) (#95320)

## About The Pull Request
Refactors random reagent spawning to be divided into bitflags. This mean
you can now decide from which random sources a reagent is allowed to
spawn. Rejoice, now maintenance pills can have fun reagents without
having to deal with the balance implications of a botanist producing
1000u of it!

**SO NOW MAINTPILLS CAN HAVE CYBORG NANITES AND XENOMORPH MICROBES!!
REJOICE, MY ABOMINATIONS!!!**

Code stuff:
CAN_SYNTH is now only for copying reagents, which is what it was
originally intended for. A new randomized_spawns var has been added to
reagents that decided where it can spawn.

I've also changed some unsanitary reagent spawners to obey the spawn
flags. This was the beebox kit (which could spawn literally every
reagent in the game, including adminordrazine) and traitor bees, which
now can't spawn the two spider toxins and gatfruit toxin (why do we even
have gatfruit toxin?? shit does nothing).

Balance overview:
- Beeboxes no longer spawn everything
- Traitor bees no longer spawn venom, viper venom and gatfruit toxin
- Maintenance pills now spawn cyborg nanites and xenomorph microbes

When I say maintpills, I mean REAL maintpills. The ones of which only a
few spawn per round in maintenance, and not the fake ones that feature
creepers added to cargo, blackmarket and that got mapped in

## Why It's Good For The Game
We're limited to which reagents we can spawn randomly because sources
like strange seeds, geysers and fake maintpills are infinitely
reproducible, and can be used to get an infinite amount of every random
spawnable reagent in every round (to be fair this is quite labor
intensive, but never underestimate autism).

Only about 3-6 maintenance pills spawn per round and there's about 700
spawnable reagents. There's simply no way to force the odds to get the
reagent you want. I think the crew can have a little maintxenomicrobes
and a little maintpill borgnanites

As to why these two specifically: 
borgnanites are already only randomly obtainable, are cured easily and
the effects of it are just one more cyborg player. It's a fun story, and
not particularly disruptive to the round
Xenomicrobes are admin only, so I would not be lessening any other
features. Otherwise it's pretty much gonna cause an incident in-game
when this happens, but who cares!!!
I can make maintpills secretely reroll if the reagents are extracted
instead of eaten to keep these always contained to the person eating
them, but our playerbase so prefers eating over grinding that I think
it's fine

I have not included inverse reagents, blob spores etc because I respect
them as their own features. I would however like to add some new, wacky
maintpill reagents that can lead to some fun stories.

## Changelog
🆑
fix: Fixes beebox and traitor bees not obeying the reagent blacklist
balance: Maintenance pills (the achievement variety that only spawns in
maint) can now generate with xenomorph microbes and cyborg nanites
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
This commit is contained in:
Time-Green
2026-03-14 07:55:38 +00:00
committed by GitHub
co-authored by MrMelbert
parent c6b9d36a50
commit 1c94ccfe69
18 changed files with 727 additions and 45 deletions
@@ -198,21 +198,8 @@
generate_bee_visuals()
/// Picks a random toxin and assigns it to the bee
/mob/living/basic/bee/proc/assign_random_toxin_reagent(respect_can_synth = TRUE)
var/list/toxin_pool = typesof(/datum/reagent/toxin)
var/datum/reagent/toxin
var/sanity = 0
do
if(sanity > 20 || !length(toxin_pool))
toxin = pick(/datum/reagent/toxin, /datum/reagent/toxin/histamine, /datum/reagent/toxin/venom)
respect_can_synth = FALSE // in case someone removes cansynth from all of the above for some goofy reason
else
toxin = pick_n_take(toxin_pool)
sanity += 1
while(respect_can_synth && !(toxin::chemical_flags & REAGENT_CAN_BE_SYNTHESIZED))
assign_reagent(GLOB.chemical_reagents_list[toxin])
/mob/living/basic/bee/proc/assign_random_toxin_reagent()
assign_reagent(get_random_reagent_id(whitelist = subtypesof(/datum/reagent/toxin)))
/mob/living/basic/bee/mutate()
. = ..()
@@ -235,7 +222,7 @@
/mob/living/basic/bee/toxin/Initialize(mapload)
. = ..()
assign_random_toxin_reagent(respect_can_synth = FALSE)
assign_random_toxin_reagent()
/// A bee which despawns after a short amount of time (beespawns?)
/mob/living/basic/bee/timed