## About The Pull Request
All closets now are called either closets, lockers, wardrobes etc. (e.g.
the lethal injections locker was previously called "lethal injections")
Head of staff and the cook's locker are no longer proper nouns, it
didn't make much grammatical sense and it keeps consistency with other
lockers (Example: detective's cabinet)
All locker names de-capitalized except the Thunderdome ones since those
made sense.
The empty freezer is now just called a freezer since it being empty or
not depends on what players and mappers do to it.
Tram now has evidence lockers labelled from 1 through 7 instead of 7
evidence lockers labelled as 1.
Changes have been made to all station maps and in code, I've not gone
through all ruins, away missions, etc.
## Why It's Good For The Game
Cleans up a lot of minor name issues.
## Changelog
🆑
spellcheck: All station closet and lockers have had their naming
conventions standardized.
fix: Tram now has evidence lockers labelled 1 through 7 instead of 7
evidence lockers labelled as locker 1.
/🆑
## About The Pull Request
Fixes#72404
The Lazarus Injector doesn't currently work on basic mobs, but should.
Problem:
The EMPed state of the Lazarus Injector is intended to make a revived
mob hostile to everyone except you, including other mobs you have
revived wtih an EMPed Lazarus Injector.
This is trivial to achieve for Simple Mobs which essentially all share
the same AI, but I could not think of a single workable solution for
Basic Mobs which don't, or at least any which didn't come with a tedious
requirement to closely consider this niche item when programming any
additional AI.
Solution:
Change the default behaviour of the Lazarus Injector so this is not a
problem.
If all it does it make the mob loyal to you _and_ friendly to other mobs
which are loyal to you, then it's pretty easy because we can just use
the existing faction flags.
This is unambiguously a buff to using the item for nefarious purposes as
now if you revive four ice drakes and fulton them onto the station they
won't kill each other until only one is left, but is the only workable
solution I could really think of.
A lot of the very dangerous mining fauna can't be dragged so
transporting your army to the station still poses a question.
The alternate solution was just to replace the AI controller of any
emp-revived basic mob with a "zombie" AI controller, but this has the
problem that
A- It would now make things like cows and dogs into hostile creatures
when they previously weren't.
B- It loses any interesting behaviour the mob previously had and for
cases like Bileworms doesn't even make any sense (they'd try to walk and
just get stuck in place).
This ultimately leads to needing to make bespoke versions for various
mobs, which doesn't seem desirable from a maintainability standpoint.
As a side note it's still not a great idea to revive Bileworms _anyway_
as, their ability to move is tied to their ability to attack so once
they don't have a target they will just kind of sit there and if they
_do_ get a target their attempts to help you fight are difficult to
distinguish from attempts to kill you... but at least being able to
revive them makes it easier to make one sapient if you really want to
trap a player's mind inside a body which is incapable of leaving
lavaland.
Additional edit:
At Fikou's suggestion I've also added a sentience comparison proc to
`mob/living` and removed some code duplication which dealt with this
problem in the sentience/mind transfer potions, as well as added it to
the Dominate spell.
## Why It's Good For The Game
This device is meant to revive mobs and it shouldn't be required for
players to memorise an arbitrary list of which mobs it does and doesn't
work on.
Especially as the goal is eventually that all simple mobs should be
basic mobs.
This way of working is more intuitive, even if it is also stronger. I
was surprised when I used EMPed injectors and my "new minions" just
killed each other.
## Changelog
🆑
fix: You can now revive 'basic mobs' with a Lazarus Injector, such as
dogs, cows, axolotls, or carp.
fix: The same category of mobs can also now be effected by the Runic
Golem Dominate spell.
fix: Basic Mobs will switch target if they can no longer attack their
current target; meaning that if you become a Bileworm's friend it will
stop attacking you.
balance: Mobs injected with the Lazarus Injector while it is EMPed will
no longer attack other mobs revived by EMPed Lazarus Injectors.
/🆑
## About The Pull Request
The ORM's input lights have turned invisible, due to item state names
that have not been updated. This PR fixes that. It also autodocs the
various procs and vars.
## Why It's Good For The Game
Fixes#72923 It is good to see which direction you have to place the
ores.
## Changelog
🆑
fix: The ORM's input and output lights are once again visible
/🆑
## About The Pull Request
Adds the pickaxe to basic tools techweb that can be printed the cargo
lathe or autolathe.
## Why It's Good For The Game
This is a basic mining tool and should be available at roundstart.
It wasn't possible to create pickaxes, despite it being a T1 item. It
should be as easy to make as a shovel since these usually are mapped
together. I was tempted to put this into mining technology, but that
already has advanced drills that are T2 versions of the pickaxe.
## Changelog
🆑
qol: Add pickaxe to basic tools techweb
/🆑
## About The Pull Request
Changes minttoxin(a toxin) to mintextract(a food).
## Why It's Good For The Game
Fixes https://github.com/tgstation/tgstation/issues/72969
The chef's mint is intended to gib fat people. Due to
https://github.com/tgstation/tgstation/pull/70764, liver functionality
was reworked so that instead of being purged rapidly, toxin's in a mobs
system with 3 units or less have no effect. Since the chef's mint only
has 2 units of mint toxin, it's intended functionality is impossible
under normal circumstances.
By changing the reagent type from toxin to consumable, it restores the
ability to gib.
## Changelog
🆑
fix: Mint Toxin(a toxin) has been changed to Mint Extract(a food). The
chef's mint can once again gib, fatties beware.
/🆑
## About The Pull Request
This buffs scythes, goats, and plantbgone vs PLANT biotypes:
- Scythes now deal x1.5 damage to venus flytraps (3 hits to kill)
- Scythes now target the flower bud vines
- Goats now target flower bud vines and deal 15 damage to PLANT biotypes
- Goats have a eating sound whenever they bite PLANT biotypes
- Plantbgone now does 2 dmg per unit to PLANT biotypes (10 dmg per
spray)
- Plantbgone now has a 75% chance to remove weeds and deals large damage
to flower buds
- Weed control crates now come with a pair of leather gloves
- Golems are immune to thorn effects
- Any kind of thick glove material will prevent thorn effects when
attacking
- Flower buds will now take x4 damage from fire and sharp weapons
(unless they have fire trait)
- Regular scythes are now a sharp object
Also this fixes a few runtimes with spacevines and nulls. The bane
element now accepts `mob_biotypes` bitflags as an argument.
## Why It's Good For The Game
Before my changes:
- Plant-b-gone was doing 0.4 dmg per unit to PLANT biotypes (2 dmg per
spray)
- Scythes took 5 hits to kill venus flytraps
- Goats only affected podpeople
- Flower bud vines were being ignored by weed killing code
- Plantbgone only had a 50% chance to remove weeds (and this was very
inconsistent due to RNG)
- Botanical gloves and thick gloves didn't protect from thorns
- Golems were getting pierced by thorns despite having pierce immunity
- Flower buds were not taking the x4 damage like they should have been
- Regular scythes were not a sharp object, but other scythes
(chaplain's, megafauna loot) were sharp
This makes the weed killer crate more effective since people were
complaining about it being worthless vs vines and flower buds. These
changes give people more options to respond to threats vs plants.
## Changelog
🆑
add: Add a pair of leather gloves to weed control crate
balance: Mobs with the PLANT biotypes (venus flytraps, pod people,
killer tomatoes) are now much weaker vs scythes, goats, and plantbgone.
balance: Plantbgone is now more effective at destroying weeds.
balance: Regular scythes are now a sharp object
fix: Fixed scythes, goats, and plantbgone not affecting flower bud
vines.
fix: Thick and botanical gloves not protecting from thorns
fix: Golems not having pierce immunity from thorns
fix: Runtime where vines tried to spread into null turf
fix: Runtime where null vines that were destroyed were trying to spread
to nearby turfs
soundadd: Add eat food sound when goats eat plants
code: Improved goat targeting code
code: The bane element now accepts `mob_biotypes` bitflags as an
argument.
/🆑
## About The Pull Request
Mining points are now stored on the ID's bank accounts instead of the
individual IDs, bringing them on-par with credits. This allows miners to
safely replace their ID and keep their mining points just like they can
for their credits.
I also added the cost type on Produce Consoles, so people using them
will know whether they're using mining points or credits.
Because all IDs have a bank account by default, this won't be a problem
to Golems or the like.
## Why It's Good For The Game
1. It's more clear to the player what type of credit is being used in
the order console
2. Mining points being tied to the ID is no longer needed as all IDs
have a bank account
3. Brings mining points up to the same standard as credits.
## Changelog
🆑
qol: Mining points is now tied to bank accounts instead of individual
IDs, so they transfer over in cases of an ID replacement.
/🆑
Bodypart overlays are now drawn by the new /datum/bodypart_overlay
datum.
External organs no longer draw anything and instead add a special
/datum/bodypart_overlay/mutant to the bodypart, which draws everything
Makes it way easier to add custom overlays to limbs, since the whole
system is now modularized and external organs are just one
implementation of it
I haven't moved anything but external organs to this new system, I'll
move eyes, bodymarkings, hair, lipstick etc to this later
New pipeline is as follows:
- External organ added to limb
- External organ adds /datum/bodypart_overlay/mutant to limb to
bodypart_overlays
- Limb updates its icon, looks for all /datum/bodypart_overlay in
bodypart_overlays
- Very cool new overlay on your limb!
closes#71820🆑
refactor: External organs have been near-completely refactored.
admin: Admin-spawned external organs will load with a random icon and
color
fix: fixes angel wings not working for non-humans (it was so fucking
broken)
fix: fixes external organs being invisible if they werent initialized
with a human
/🆑
### Why this is good for the game
External organs are cool but are pretty limited in some ways. Making
stuff like synthetic organs is kinda fucked. I tried and it was dogshit.
Now you can just give an icon state and icon and you're good (using
/datum/bodypart_accessory/simple)
Stuff like eyes, cat ears and hair seem like good choices for extorgans,
but don't quite work for it because their icons work a lot differently.
This solves for it completely since any organ (or object or whatever)
can add it's own icon to a bodypart.
Want to add an iron plate to someones head? Go ahead. Want a heart to
stick out of someones chest? No problem.
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
## About The Pull Request
Re-pr of #66644 with some changes to get it working

- [x] ~~Huds get cut off~~ Resolved
- [x] ~~Very tall helmets get cut off~~ Resolved
- [x] Hair gets cut off
- [x] ~~Needs optimization before releasing to the world as a pref~~ jk
lol
## Why It's Good For The Game
Look at that fella so cute
## Changelog
🆑 Melbert, That REALLY Good Soda Flavor, FatFat, AndreyGusev
add: Spacemen can now have varying height. (Admin only for now)
add: Dwarfs are now slightly shorter, but look way better.
/🆑
Co-authored-by: Jack LeCroy <3073035+jacklecroy@users.noreply.github.com>
## About The Pull Request
The coins spawned by the TGC holodeck arena had monetary value and could
be used as an infinite source of income, they've been replaced with a
worthless subtype.
Also a small QoL change since I've seen people looking for it ICly but
I've added a rulebook to the holodeck so people can access the wiki page
directly.
## Why It's Good For The Game
Infinite money exploit bad and I've watched multiple people go hunting
for a non-existent rulebook.
## Changelog
🆑
qol: Rulebook for TGC has been added to the TGC arena.
fix: Holographic TGC coins are no longer legal tender and cannot be
inserted into your ID.
/🆑
## About The Pull Request
Did you know that for every Autolathe, Limbgrower, Biogenerator, ORM,
and Smelter that was built, an entire new techweb was made? The average
round has 2 ORMs (smelters count) if not more from ORM deconstruction
objective, 2 biogenerators, several autolathes and generally 0-1
limbgrower, I think there's more techwebs being created than we need.
Creating a whole techweb was a pretty terrible way to optimize this, so
I made a global list that stores these techwebs. Created on demand,
these autounlocking techwebs now share between the machines that use
them. It also generate all hacked nodes which will be visible if the
machine is hacked, instead of 'researching' them for each hacked
individual machine.
The 'specialized' techweb subtype was removed because its sole purpose
was to allow autounlocking to be a subtype of it. Now autounlocking is
just the direct subtype. I also removed mechfab autounlocking type
because it wasn't used, mechfabs use techwebs directly.
Autolathes and Limbgrowers now locally store 'imported designs' which
are things uploaded from technology disks. Outside of this, the
autounlocking techweb subtype now stores 'hacked designs' which unlocks
when the machine is emagged.
While doing this, I saw ORMs and Biogenerators had disks you can insert
into them, but I did not find anything that can actually be uploaded to
them (I saw Alien Alloys as a possibility, but there's no such disk to
allow uploading this alloy to the machine, and I didn't think an entire
system for 1 single alloy was worth keeping around), so I removed this
unused feature from both machines.
I merged 'Hacked' and 'Emagged' categories because they served the same
purpose, 'hacked' being on hacked autolathes and 'emagged' being on
hacked (emagged) limbgrowers.
Tech disk techwebs (which is created every time a disk is made, however
I hope to change this in the future) into it's own subtype, so admins
understand where its from when looking in VV panel (because I was
confused when I saw them at first).
``autolathe_crafted`` proc was removed because it was entirely unused
too.
Now it looks like this, which I consider an improvement:

## Why It's Good For The Game
We no longer initialize a brand new techweb for no reason whatsoever.
Each techweb made is making entire lists of experiments and research
papers, all of which is never to be seen in-game and is completely
useless to the player. Cutting down on these techwebs is a good first
step to this needless initializing.
## Changelog
🆑
qol: Removed the tech disk part of the ORM's UI as it was entirely
unused, now it's a little more compact with less scrolling needed.
refactor: Autolathes, Limb growers, Biogenerators, ORMs and Smelters now
share techwebs with other machines of their types, rather than all make
new techwebs each time. This means they only build their nodes once,
including hacked ones. Instead of researching nodes on hacking the
machine, they now show hacked ones depending on if it's hacked.
/🆑
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Necessary for #72292 to work effectively, and probably not very useful
out of that context. Split out of its own PR because this is long and
boring.
I want to make sure that we're catching actual mistakes there, and not
just experiencing side effects of how shitty the attack chain is.
Removes Mining LTSRBTs
Adds a new cargo_cheaper variable to order consoles to make the tooltips
actually imply that express costs 1x
Mining Vendor cargo delivery now costs 0.65x (and rounded)
Express delivery costs 1x, no cooldown.
Costs displayed in the vendor are now multiplied by 0.65 to make them
show the cheaper price of buying by cargo
Encourage people to not fuck over ghost roles for their gamer mining
vendors
Encourage miners to cooperate with cargo techs (best case) to get their
gear cheaper
Encourage miners to talk to their own stationside department for their
gamer gear cheaper, while making miners
who dont do that, have costlier (normal price) gear
## About The Pull Request
With the new crafting menu some reagents now have default container
assigned.
I applied these to visualize reagents in biogen UI too.
<img alt="060ybChTkI"
src="https://user-images.githubusercontent.com/3625094/209483256-e4159a05-46ae-47b8-bc42-9d003cf6c303.png">
## Why It's Good For The Game
Better representation of a reagent.
## Changelog
🆑
qol: Biogenerator shows default reagent containers instead of beakers
/🆑
## About The Pull Request
closes#72348
Title
## Why It's Good For The Game
My bad
## Changelog
Heres the script I used this time if you want to
```cs
var baseDir = Environment.CurrentDirectory;
var allFiles = Directory.EnumerateFiles($@"{baseDir}\code", "*.dm", SearchOption.AllDirectories).ToList();
var known = new Dictionary<string, List<KeyValuePair<string, int>>>();
foreach (var file in allFiles)
{
var fileLines = File.ReadAllLines(file);
for (var i = 0; i < fileLines.Length; i++)
{
var line = fileLines[i];
if (line.StartsWith("/datum/armor/"))
{
var armorName = line.Replace("/datum/armor/", "").Trim();
if (!known.ContainsKey(armorName))
known[armorName] = new List<KeyValuePair<string, int>>();
var knownList = known[armorName];
knownList.Add(new KeyValuePair<string, int>(file, i));
}
}
}
Console.WriteLine($"There are {known.Sum(d => d.Value.Count)} duplicate armor datums.");
var duplicates = new Dictionary<string, List<int>>();
foreach (var (_, entries) in known)
{
var actuals = entries.Skip(1).ToList();
foreach (var actual in actuals)
{
if (!duplicates.ContainsKey(actual.Key))
duplicates[actual.Key] = new List<int>();
duplicates[actual.Key].Add(actual.Value);
}
}
Console.WriteLine($"There are {duplicates.Count} files to update.");
foreach (var (file, idxes) in duplicates)
{
var fileContents = File.ReadAllLines(file).ToList();
foreach (var idx in idxes.OrderByDescending(i => i))
{
string line;
do
{
line = fileContents[idx];
fileContents.RemoveAt(idx);
}
while (!String.IsNullOrWhiteSpace(line));
}
File.WriteAllLines(file, fileContents);
}
```
Adds lints for `balloon_alert(span_xxx(...))` (which is always wrong),
and balloon alert where the first letter is a capital (which is usually
wrong). Fixes everything that failed them. As a reminder, abbreviations
like "AI" and "GPS" shouldn't be capitalized in a balloon alert.
In cases where this is intentional for flavor (there was one case), you
can `UNLINT` like so:
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
## About The Pull Request
adds an admin outfit intended for easy spawn ins as a shaft miner, to
test megafauna and whatnot
included are:
bone bracers, bone talisman
both suit and hood are fully goliath plated
webbing with 2 lux pens, 2 standard pens and 2 legion cores
gps, advanced scanner
kinetic accelerator with bayonet and seclite, compact kinetic crusher
(normal sized), upgraded resonator
night vision medhud mesons
mini extinguisher
all the trophies and 10 copies of every modkit
## Why It's Good For The Game
makes localhost megafauna fights require less preptime
## Changelog
🆑
admin: adds an admin combat-ready miner outfit
/🆑
## About The Pull Request
Well my last PR passed the CI but everything else is still failing and I
want a little tick next to my pull requests.
So I guess I'm whacking moles until everything that 515 doesn't know how
to dispose of is disposed of?
I'll be honest I don't know what change makes this a requirement when it
wasn't before but it seems like a logical thing to be doing.
Unfortunately running this test locally doesn't produce a failure for me
so my only solution is to keep getting the CI to do it and hope that it
doesn't report a false positive again.
## Why It's Good For The Game

## Changelog
Not player facing
## About The Pull Request
You know the deal by now.
- Drowsiness is now tracked via status effect.
- Eye blue is now tracked via status effect.
In converting these over, cleaned up a bit of code relating to some
other effects. Attempts to unify behavior between some of them, namely
certain biotypes or mob types shouldn't be experiencing certain effects.
## Why It's Good For The Game
More stuff moved to status effects, slightly more cleaner and better to
work with code. Allows for all mobs that can sleep to be able to get
drowsy, too.
## Changelog
🆑 Melbert
refactor: Drowsiness and Blurred Eyes are now tracked via status effect.
/🆑
holoparasite types have improved code
admins can now give someone a holoparasite through a new menu in vv
dropdown
alt click holopara abilities were moved to right click (support's beacon
wasn't, but support's heal mode was)
holoparas have less hardcoded stuff so admins can edit them easier
holoparasites now get their light color from their guardian color
holoparasites no longer have the hostile faction, things will attack
them
holoparasites now have a damage overlay, so you can see how much your
summoner is damaged
holoparasite health updating is now event based rather than running on
life, so you'll see health changes everytime they happen, rather than
every 2 seconds
holoparasites fly properly again (they cant spacewalk, but count as
flying for stuff like chasms)
holoparasite creation now uses a radial menu with tooltips for each
subtype. it also shows ghosts which type you picked
holoparasites can no longer be fugu'd
adds support for ownerless holoparasites
fixes mildly related bugs along the way
## About The Pull Request
Updated crafting menu, adding a lot of new functions and recipes that
were not in the crafting menu before.
<img alt="cult"
src="https://user-images.githubusercontent.com/3625094/206009533-aec3a1dd-cbe5-45eb-8515-1b75fabb65c5.PNG">
<img alt="nH77dLyyGx"
src="https://user-images.githubusercontent.com/3625094/206009786-b6706f70-0599-40bf-b051-8f499de43abd.png">

https://user-images.githubusercontent.com/3625094/206009841-738e4a03-0660-45b7-8d83-15eeb6501967.mp4
## Why It's Good For The Game
It is easier to use, and it has a lot of recipes that were spread
throughout the game, some of which weren't even on the wiki.
Crafting and cooking now count about 1200 recipes in total, including
conditionally available ones.
## Changelog
🆑
qol: Rewrote the crafting/cooking menu UI
qol: Split crafting and cooking menus in two different menus
qol: Crafting is no longer blocking the entire UI, only the "Make"
buttons are disabled
qol: Added stack crafting recipes to the crafting menu
qol: Added cooking recipes that were absent in the crafting menu before
(tool recipes, machine recipes, reactions)
qol: Added option to search recipes by title
qol: Added option to filter recipes by required materials/ingredients
qol: Added food types to the cooking menu, highlighting diet of your
species (liked, disliked foods)
qol: Added total nutrition value of the result to the cooking menu
qol: Added option to filter cooking recipes by the food type of the
resulting food
qol: Added "Can make" category that lists all currently craftable
recipes throughout all categories
refactor: changed categories and reshuffled some items in them
code: Reagents now have default container to get an icon from the
reagent datum
code: Objects now have `desc_controls` var for OOC information about
mouse controls that are visible on examine, but not in the description
fix: Fixed alignment on many food icons
fix: Fixed missing icon for beef stroganoff
/🆑
Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
## About The Pull Request
That's right I'm still atomising #71421, some day I might even post
something related to carp.
This PR adds various behaviours to basic mobs allowing them to run away,
in a couple of variations.
Mice will flee from anyone who doesn't share their factions, at all
times (so they will scatter from most humans, but not regal rats).
Rabbits and Sheep will flee from anyone who has attacked them.
Pigs will run away from people who have attacked them, but only if
they're below half health.
https://user-images.githubusercontent.com/7483112/207127135-d1737f91-d3f7-468a-ac60-7c7ae5d6623d.mp4
Mice are still plenty catchable because they don't run _very far_ (or
very fast) but I think the chase will be good enrichment.
To achieve this I had to change the signal COMSIG_CARBON_HEALTH_UPDATE
into COMSIG_LIVING_HEALTH_UPDATE but frankly the latter seems more
sensible anyway.
## Why It's Good For The Game
More behaviours to use later when designing mobs, gradually gives mobs
more things to do rather than just sort of moving aimlessly around the
area you left them in.
It'll give people hunting rats in maintenance some exercise.
## Changelog
🆑
add: Mice will now run away from you, you have to catch them if you want
to eat them. Use those traps!
add: Rabbits, Sheep, and Pigs likewise won't just sit there and let you
pulverise them if they can see an escape route.
/🆑
This one is fun.
On every /turf/Initialize and /atom/Initialize, we try to set
`smoothing_groups` and `canSmoothWith` to a cached list of bitfields. At
the type level, these are specified as lists of IDs, which are then
`Join`ed in Initialize, and retrieved from the cache (or built from
there).
The problem is that the cache only misses about 60 times, but the cache
hits more than a hundred thousand times. This means we eat the cost of
`Join` (which is very very slow, because strings + BYOND), as well as
the preliminary `length` checks, for every single atom.
Furthermore, as you might remember, if you have any list variable set on
a type, it'll create a hidden `(init)` proc to create the list. On
turfs, that costs us about 60ms.
This PR does a cool trick where we can completely eliminate the `Join`
*and* the lists at the cost of a little more work when building the
cache.
The trick is that we replace the current type definitions with this:
```patch
- smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH)
- canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH, SMOOTH_GROUP_CLOSED_TURFS)
+ smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH
+ canSmoothWith = SMOOTH_GROUP_FLOOR_ASH + SMOOTH_GROUP_CLOSED_TURFS
```
These defines, instead of being numbers, are now segments of a string,
delimited by commas.
For instance, if ASH used to be 13, and CLOSED_TURFS used to be 37, this
used to equal `list(13, 37)`. Now, it equals `"13,37,"`.
Then, when the cache misses, we take that string, and treat it as part
of a JSON list, and decode it from there. Meaning:
```java
// Starting value
"13,37,"
// We have a trailing comma, so add a dummy value
"13,37,0"
// Make it an array
"[13,37,0]"
// Decode
list(13, 37, 0)
// Chop off the dummy value
list(13, 37) // Done!
```
This on its own eliminates 265ms *without space ruins*, with the
combined savings of turf/Initialize, atom/Initialize, and the hidden
(init) procs that no longer exist.
Furthermore, there's some other fun stuff we gain from this approach
emergently.
We previously had a difference between `S_TURF` and `S_OBJ`. The idea is
that if you have any smoothing groups with `S_OBJ`, then you will gain
the `SMOOTH_OBJ` bitflag (though note to self, I need to check that the
cost of adding this is actually worth it). This is achieved by the fact
that `S_OBJ` simply takes the last turf, and adds onto that, meaning
that if the biggest value in the sorting groups is greater than that,
then we know we're going to be smoothing to objects.
This new method provides a limitation here. BYOND has no way of
converting a number to a string at compile time, meaning that we can't
evaluate `MAX_S_TURF + offset` into a string. Instead, in order to
preserve the nice UX, `S_OBJ` now instead opts to make the numbers
negative. This means that what used to be something like:
```dm
smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS)
```
...which may have been represented as
```dm
smoothing_groups = list(15, MAX_S_TURF + 3)
```
...will now become, at compile time:
```dm
smoothing_groups = "15,-3,"
```
Except! Because we guarantee smoothing groups are sorted through unit
testing, this is actually going to look like:
```dm
smoothing_groups = "-3,15,"
```
Meaning that we can now check if we're smoothing with objects just by
checking if `smoothing_groups[1] == "-"`, as that's the only way that is
possible. Neat!
Furthermore, though much simpler, what used to be `if
(length(smoothing_groups))` (and canSmoothWith) on every single
atom/Initialize and turf/Initialize can now be `if (smoothing_groups)`,
since empty strings are falsy. `length` is about 15% slower than doing
nothing, so in procs as hot as this, this gives some nice gains just on
its own.
For developers, very little changes. Instead of using `list`, you now
use `+`. The order might change, as `S_OBJ` now needs to come first, but
unit tests will catch you if you mess up. Also, you will notice that all
`S_OBJ` have been increased by one. This is because we used to have
`S_TURF(0)` and `S_OBJ(0)`, but with this new trick, -0 == 0, and so
they conflicted and needed to be changed.
## About The Pull Request
they used fulltile survival pods so it just spawned 4 full windows in
one place
## Why It's Good For The Game
i use them on my map and it upsets me
## Changelog
🆑
fix: fixes hollow survival pod window spawners
/🆑
All stacking machines spawn var edited. You could build one, but you
couldn't select the directions.
Now you can rebuild a stacking machine and rotate input/output as it was
before destruction.
## About The Pull Request
In [70546](https://github.com/tgstation/tgstation/pull/70546) I added
some new implantable organs to mining creatures which didn't drop
anything on death.
I didn't really want these to make miners way better at station PvP so I
gave them some pretty hefty downsides.
I went too far and this meant nobody would ever implant one of them
ever, which sort of negates the point of adding it.
The implanted Brimdust Sac has now been redesigned.
It no longer sets you on fire if activated on the station, nor does it
explode if you catch fire.
Instead, if you're in an unpressurised environment (like space or
Lavaland) it will add one stack of the buff every 30 seconds
automatically.
The buff still does reduced damage on the station _and_ hurts you as
much as it hurts anyone else. In addition, instead of catching fire, you
will be slowed for four seconds.
Additionally I cut the cooldown for both organs in half because there
wasn't really any reason for it to be that long.
## Why It's Good For The Game

Encourages miners to go interact with medbay in between delivering ore,
while they're waiting for their shit to get posted.
Now when someone indignantly posts "When was the last time there was a
mining _buff_" in #coding-general you can link them to this PR.
## Changelog
🆑
balance: Rush Gland and Brimdust Sac can be used more frequently when
implanted.
balance: An implanted Brimdust Sac will stack the buff on you
automatically while on lavaland. Triggering the buff on the station will
make you walk slower for a short duration.
balance: Implanted Bimrdust Sacs no longer set you on fire, nor do they
explode if you catch fire.
/🆑
## About The Pull Request
This stupid var is should have been called "qdel_on_unlock". Now it
actually triggers on open, and qdels AFTER all of the contents in the
crate are gone. This prevents it from deleting its contents before it
can dump them, which I'm assuming it has been doing since the dawn of
time.
## Why It's Good For The Game
Closes#71718
Makes it so admins can set the loot for abandoned crates or peek into
their contents, for whatever reason they may have. Also allows coders to
choose which loot to recieve in the event that a bug like this needs
debugging (again).
## Changelog
🆑 Rhials
fix: Earning the Mimic loot drop from an abandoned crate now properly
spawns the mimic.
/🆑
## About The Pull Request
- Rewrites how action button icons are generated.
- Prior, generated an action button icon was fairly simplistic and
didn't allow for many changes. Someone recently added the option for
overlays to be generated over action buttons, but the framework was very
weak.
- Now, action button icon generation is split across multiple procs,
like atom icon updates.
- The background of action buttons are underlays
- The actual icon of the action button is the icon and icon state of the
action button movable
- The rim / border of the button is an overlay, layered overtop the
button.
- Allows observers to see what action buttons a mob has. They even
update in real time! And no, the observers cannot click on them.
## Why It's Good For The Game
- Runechat text of action buttons are no longer hidden behind the actual
icon. This was very ugly with cooldown actions, as the cooldown text was
hidden behind a lot of spell icons.
- Cuts down on a lot of icon duplication.
- Gives much finer control over action button icons
- Saves a bit of processing from generating full action button icons
when not necessary. Not implemented in many places, but is in some.


## Changelog
🆑 Melbert
add: Observers can now see what action buttons an observed mob has. No,
you can't click them. And no it doesn't show EVERY action.
refactor: Refactored how action button icons are generated. Some actions
will now use a colored border when active instead of just turning green.
Cooldown text will also appear on the top layer of actions too. If you
see any funky lookin' icons (namely their borders), let me know.
refactor: Bluespace Golem's teleport action is now a cooldown action.
fix: Construct actions go to the middle of the screen like expected.
/🆑
## About The Pull Request
### Moves speaking verbs to tongues + subtypes
Moves species say mod onto tongues, creates any tongues that didn't
exist for the say mods they needed to hold.
### moves wing sprites to wing subtypes
Moves the logic of selecting a wing sprite onto subtypes of /functional
on the wing type. Now, angel wings bring the holy trait with them, it
isn't a special check on flight potions, and we can expand it. (EMPs
taking down robowings? Fires burning megamoth wings? Cool stuff)
### bodypart damage examines to limbs
Instead of checking what your species says, it tallies up your limbs and
provides the damage description that matches most of your limbs. So for
example, If you're mostly human with one augmented part, you take
bruises and cuts. If you're mostly robot augmented with one human part,
you get robot damage descriptions. Yay!
### fixes sign language working without a tongue
Having no tongue would garble your speech, and this had no interaction
with sign language, so you'd be speaking in broken gurgling with
perfectly working hands. Now, the sign language component prevents any
kind of garbling, since it brings its own garbling for full/missing arms

## Why It's Good For The Game
Moving things off of species inherent makes the game expose way more
interesting mechanics to play with. It sucks that you can't steal a
jellyperson's chirping, since they can get a normal tongue and they'll
go back to... chirping! LAME! THAT IS LAME!
Ditto goes for wings, and for limbs, well, having someone be entirely
augmented but get descriptions of bleeding because they didn't spawn as
an android is kinda lame.
<details>
<summary>Spoiler warning</summary>

</details>
## Changelog
🆑
refactor: Refactored wings, tongues, and some examine messages,
hopefully with minimal effect on actual changes. A few more species have
tongues, angel wings bring the holy trait with them, and wings have new
descriptions. should be the biggest parts of it
/🆑
## About The Pull Request
**Comes with an UpdatePaths!**
Removes the tablet subtype, PDAs now replaces them entirely.
Nukie and Silicon tablets are now subtypes of the PDA instead, while
contractor ones were removed entirely as they didn't do anything and
were unused (though it wouldn't be hard to re-add).
Nukie PDAs are now the only type of PDA that uses modular_tablets.dmi,
which is just larger icons of modular_pda. Each application requires an
icon state in both of these, for 2 different sizes, which makes it
annoying to make new applications, especially if it can also run on
computers/laptops.
### Icons
Because Silicon tablets are now a subtype of PDA, they use PDA icons
instead of tablet ones. Luckily for us, they already exist in code.

AI's don't use a tablet icon though, so they aren't affected.
## Why It's Good For The Game
There's very little difference between tablets and PDAs, PDAs overshadow
them in every single way, so at this point I don't see why we should
have both of these, and if you compare the two in usefulness and actual
in-game use by players, it's a no-brainer than the item all players get
roundstart and comes with a messenger should be the one we go with.
Also as said in the about section, when making an app you would need to
make icon states for the program running for all hardware it can run on,
which is Computer, Laptop, PDA, and Tablet.
Laptop is just a smaller computer icon
PDA is just a smaller tablet icon
However, you can't simply shrink the size of the icon, instead you have
to completely resprite the same app icon FOUR TIMES for it to not
bluescreen on all these different devices.
<details>
<summary>
Here's examples of it
</summary>
Computer (NOTE: *They share the same icon file as regular computers*)
<img
src="https://user-images.githubusercontent.com/53777086/203876801-486a8054-489a-4983-bdad-a2599b4dc379.png"/>
Laptop
<img
src="https://user-images.githubusercontent.com/53777086/203876333-58e5d135-f4c6-4a02-8948-1df771e294a4.png"/>
Tablet
<img
src="https://user-images.githubusercontent.com/53777086/203876352-816c7fb1-c681-40b9-99e0-052f49632c7f.png"/>
PDA
<img
src="https://user-images.githubusercontent.com/53777086/203876358-1cf7253d-3c6a-456a-8133-ebf7f0351637.png"/>
</details>
If we wish to help in simplifying this, we should remove tablet icons
entirely, which means 1 less icon to worry about. To do this, we'd need
to resprite nukie PDAs, however I am very much not a spriter and never
tried GAGS, so I'll leave it to someone else to do.
## Changelog
🆑
del: Tablets are now removed, PDAs are now the base 'tablet'. Silicon
and nukie tablets are now PDAs.
/🆑
## About The Pull Request
Now comes with a Hackmd: https://hackmd.io/ImTe5FLeTgmI7spTWKBaFQ?view
In-game screenshots:



Removes the old Mining vendor console and all its bad code. Instead, the
chef produce console was generalized and a NEW mining vendor is a
subtype of it. If they try to Express this console, it will be 1.5x the
mining points (compared to 2x for the Chef produce console atm), so it
is technically possible, but it is still better to order it through
Cargo.
Different to the Kitchen crate, this one is a private order by the Shaft
Miner, using mining points instead of Credits. Cargo CAN emitter it
open, but I think that's an acceptable risk with all crates. As shown in
the screenshot, Cargo will immediately know who ordered the items so
knows who to call to pick it up when needed.
This also means Shaft Miner's vendor is now categorized somewhat. I
tried my best to make sense out of it but some items really don't make
sense (laser pointer, soap...)
I split the different sections of orderable items into different files
for better management, and de-hardcoded it and its TGUI to make it
easier for anyone who wants to add more to it.
I also made the produce console use paths and added ways 'categories' to
produce consoles, which indicates which sections you should and
shouldn't be allowed to see.
https://github.com/tgstation/tgstation/pull/71007 already did part of
this but it isn't merged yet so :/
Free golems are mostly unaffected by this. Their console only works in
express mode and doesn't increase the prices for it. The only downside
is the cooldown.
I still have some things to finish on this PR so it'll be left as draft
until at least tomorrow.
## Why It's Good For The Game
https://hackmd.io/ImTe5FLeTgmI7spTWKBaFQ?view
1. A large problem currently with Miners is that they don't interact
with the station, this will at least help integrate them more into their
own department, by making the cost of their equipment cheaper if they
bother to actually go through Cargo for their gear.
2. It also means that a non functional Cargo would affect Shaft Miners
too, and as they have access to the shuttle, maybe we can expect some
Miners to pick up the slack if needed.
3. The old mining vendor was the ONLY vendor in the game that had
infinite stock. It doesn't need a refill or anything like any other
vendor, and every other vendor uses credits, mining points is just shaft
miner credits. Why are they an exception? At least being ordered through
the shuttle makes sense.
4. It opens the QM being able to see easier what Miners are doing, and
prevents miners from hiding on Lavaland to do nothing but hunt fauna if
they were meant to be demoted or something by the QM. Basically, gives
the QM more control over the people working in their department.
## Changelog
🆑
add: Shaft Miner's equipment vendor now orders their equipment through
the Cargo shuttle, though you can spend 1.5x the points to express it,
making it a Mining version of the Chef's produce console, with a
weakened express tax.
/🆑
## About The Pull Request
Fixes#71484 - Adds a check to the down verb to make sure a z level
exists below before trying to move.
Changes some step() in relay_move procs to use zMove instead if they
have a direction of up/down, as this was causing you to be able to phase
through floors if you were in a cardboard box/mech/etc
## Why It's Good For The Game

## Changelog
🆑
fix: Fixed being able to move through floors and get to centcomm when
moving up/down while inside mechs and similar movable objects.
/🆑
So i left over some basic `/whatever/proc/format` uses in the original
PR this fixes it.
Notable exceptions to the rule:
- Paths in add_verb/remove_verb, we need full path instead of a name
there to access verb metadata so we can't use proc ref macros there.
- regex.Replace, found out that it does not accept call by name. Instead
i added new REGEX_REPLACE_HANDLER so we can at least try to mark these.
There's still leftover global procs that do not use GLOBAL_PROC_REF but
they functionally equivalent so that's for later.
I don't see any reasonable way to grep for this. But if you got any
ideas please share.
- Makes QDELETED use isnull(x) instead of !x, giving about 0.2 to 0.25s
of speed.
- Make disposal constructs only update icon state rather than go through
expensive overlay code. Unfortunately did not have much effect, but is
something they should've been doing nonetheless.
- Makes RegisterSignal only take signals directly as opposed to
allocating a fresh list of signals. Very few consumers actually used
this and it costs about 0.4s. Also I think this is just a bad API anyway
and that separate procs are important
`\bRegisterSignal\((.*)list\(` replaced with `RegisterSignals($1list(`
Similar vein to #37116
This is supposed to be standard, yet here we are.
SHOULDN'T change anything, but there's likely something out there that's
bound to behave different because of it.
These were done manually, regex to find things that MIGHT need to be
corrected;
`^#define.+\+((?!\)).)*$`
`^#define.+-((?!\)).)*$`
`^#define.+\*((?!\)).)*$`
`^#define.+\/((?!\)).)*$` (yeah that's a lot of stuff.)
`^#define.+%((?!\)).)*$`
`^#define.+SECONDS((?!\)).)*$`
`^#define.+MINUTES((?!\)).)*$`
## About The Pull Request
- Fully heal can be passed a series of flags detailing what all is
healed by the proc. This allows for things to provide
almost-but-not-quite fully heals.
- Uses this in Adminordrazine, so that it stops being a pain to update
every time fully heal is updated.
This includes some small balance changes which i'll go over, nothing
extremely noticable.
## Why It's Good For The Game
Allows for more precise control over full heals.
## Changelog
🆑 Melbert
refactor: Fully heal can be passed a series of flags. As a result, some
things which previously did a full heal might heal slightly less, or
some things which did partial full heals might do slightly more.
fix: Adminordrazine will no longer completely break every facet of a
person
admin: Ahealing a changeling will refill all of their chems.
/🆑
When you load a map template, it does many things before considering
itself finalized.
One of these steps is to iterate over all the loaded items and
initialize/process them.
Unfortunately because a shuttle setups the bounds after
initTemplateBounds is called, the mobile docking port ends up being
initialized before the bounds are actually setup correctly.
The solution to this is to explicitly ignore the mobile docking port,
and have it initialize immediately after calculating the bounds.
## About The Pull Request
During a refactor of the lavaland monster organ PR I split one proc into
two and then called the wrong one on all of the children, oops.
This led to the Rush Gland experiencing no cooldown when triggering
itself at low health, which is unquestionably more useful but not how it
is supposed to work.
## Why It's Good For The Game
Implanting the organ shouldn't grant you unlimited super speed while at
low health, even if you're very likely to run into a wall and crit
yourself as a result.
## Changelog
🆑
fix: Lobstrosity Rush Glands now correctly apply their action cooldown
when they trigger from low health.
/🆑
## About The Pull Request
`/obj/item/soulscythe/relaymove()` was using `get_step()` which doesn't
understand our multi-z system and was happily trying to move Z - 1 which
is Centcom. I'm still not really sure I understand why move() allowed
the scythe to just move right through the floor in this case, I think
moving to turfs with `density = 0` is also behaving strangely and just
skipping some checks that should keep it from moving through the floor,
but to be honest I don't fully understand the move chain and just
changing to `get_step_multiz()` at least keeps the scythe from going to
Z-levels it shouldn't.
## Why It's Good For The Game
Whilst it is fun for the scythe to go on an adventure to forbidden
Z-levels, admins probably don't appreciate these adventures so much.
## Changelog
🆑 VexingRaven
fix: Soul Scythes can no longer phase through the floor into Centcom.
/🆑
Makes the code compatible with 515.1594+
Few simple changes and one very painful one.
Let's start with the easy:
* puts call behind `LIBCALL` define, so call_ext is properly used in 515
* Adds `NAMEOF_STATIC(_,X)` macro for nameof in static definitions since
src is now invalid there.
* Fixes tgui and devserver. From 515 onward the tmp3333{procid} cache
directory is not appened to base path in browser controls so we don't
check for it in base js and put the dev server dummy window file in
actual directory not the byond root.
* Renames the few things that had /final/ in typepath to ultimate since
final is a new keyword
And the very painful change:
`.proc/whatever` format is no longer valid, so we're replacing it with
new nameof() function. All this wrapped in three new macros.
`PROC_REF(X)`,`TYPE_PROC_REF(TYPE,X)`,`GLOBAL_PROC_REF(X)`. Global is
not actually necessary but if we get nameof that does not allow globals
it would be nice validation.
This is pretty unwieldy but there's no real alternative.
If you notice anything weird in the commits let me know because majority
was done with regex replace.
@tgstation/commit-access Since the .proc/stuff is pretty big change.
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
when you mine gibtonite using concussive gauntlets, you now get launched
away from it, so you wont get hit by the explosion
also lets them mine basalt for glass
## About The Pull Request
previously flight potions directly overrode icon state, and also didnt
have a set reagent filling icon so it just resulted in the weird bottle
overlay
now they use them properly. also changes the color of the flight potion
reagent so it looks the same, since it used to be white
## Why It's Good For The Game
shit dont look stupid anymore
## Changelog
🆑
fix: flight potions no longer have white bottle overlays
/🆑
I went into this just planning on fixing some weird behaviour with
spider buttons and ended up touching a lot of files.
Specifically this is because some of the actions used by Giant Spiders
would print feedback messages in IsAvailable, which was bad because this
is called every time the button updates and so would (for example) print
a bunch of messages about eggs existing when you spawned as a
broodmother because the lay eggs button would be checking for that when
it was granted to you.
The feedback _is_ useful though so I've implemented a pattern used in
Spell where we just pass a flag describing whether we want to print it
or not, which is generally set to true in Trigger() or if the player
physically pressed the button.
A side effect of this is that any action with usability flags (such as
"not when handcuffed") will now tell you why it is failing if you click
it while it is unusable, which is nice.
The spider changes are largely to make sure that their buttons are
tinted at the correct time, they were previously tinted red as if
inactive at almost all times due to the icon not being updated when
relevant conditions changed.
This necessitated adding a new signal (two actually) sent when a
do_after begins and when it ends (for any reason, including premature
interruption).
I also fixed a quirk where the Wrap ability had a permanent 'active'
outline after using it once (the icon states were inverted).
I also fixed a bug where you could just lay infinite enriched eggs after
eating one guy, which is not how the game describes it as working.
I looked up the PR adding it
(https://github.com/tgstation/tgstation/pull/54451) and one egg per kill
seems to be how it is supposed to work.
And finally I changed a few nurse spider to_chats into balloon_messages,
on the principle that they're not information which needs to stick
around for more than a few seconds.