## About The Pull Request
This PR converts the native text/list input that pops up when the Spawn
verb is used into a TGUI panel with a dynamic search function. It now
displays atom names, as well if they are abstract (and probably
shouldn't be spawned).
You can still input a typepath after the spawn verb in the tab bar which
will open the menu with said path already in the input box. If only one
typepath matches the input, it will be spawned immediately without
opening the panel.
<img width="400" height="500" alt="Qs0t8xkGj7"
src="https://github.com/user-attachments/assets/d54a57d5-fc22-4f59-af18-45b4fab0b256"
/>
It features RegEx support which activates when the input starts with
``re:``, as well as toggles for searching in atom names and fancy
typepath display. They can be toggled via buttons, or Alt+R/N/F for
regex/names/fancy paths respectively. Invalid regex-es will highlight
the search bar red.
The list itself can be navigated using arrow keys, enter/double click
will spawn the atom, and escape will close the menu.
<img width="400" height="500" alt="xgK2vCd1ck"
src="https://github.com/user-attachments/assets/e621c6ba-ad6b-4a30-922f-eb863797c65a"
/>
<img width="400" height="500" alt="2DeOPBRqoC"
src="https://github.com/user-attachments/assets/18fbba32-17d7-4351-bbc2-bc8e66eb24ae"
/>
Old functionality of spawning multiple objects by leaving a colon +
number after the typepath has been preserved. Using ``*`` and``!`` to
signify final path/end of a path respectively also still works when
regex mode isn't active.
## Why It's Good For The Game
Spawn isn't a critical tool, and using TGUI allows it to have dynamic
search and shifts searching from serverside to clientside, making it
significantly more responsive. Because we don't need to build a fancy
list of atom types, using it the first time won't cause a lag spike on
weaker machines anymore, which should make debugging locally a bit less
annoying.
## Changelog
🆑
admin: Converted the Spawn verb into a TGUI input, featuring for dynamic
search and RegEx support
/🆑
## 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
Adds a playerpanel button that just plays roleplay.ogg to the player
(with a chat message to accompany it)
## Why It's Good For The Game
Gives admins a button which literally just tells the player to roleplay
appropriately. So they can take the hint
## Changelog
🆑 Melbert
admin: Adds "roleplay reminder" button to player panel
/🆑
## About The Pull Request
The primary feature of this pr is two admin verbs:
Both locked behind `R_SERVER` at present. Also both can be removed from
this pr if we arent interested in giving admins easy control over this.
Changes will not take effect untill the next round unless someone has
yet to touch/spawn a jukebox.
please ignore the "#. " in the titles, thats just how my spotify scraper
formats the titles and I am lazy.
### Jukebox Upload Music
Allows for the upload of any music to the jukebox (currently restricted
to `.ogg` file types for being the better format but I can release that
restriction). Adding Beats is optional but not required as it does not
do a ton tbh.
https://github.com/user-attachments/assets/859cdba8-c1dd-4ce4-bfce-40727a0a30b8
### Jukebox Browse Music
Allows you to delete any of them, this noticeably catches ANY sound
format stored within the list.
Also play and download
https://github.com/user-attachments/assets/cffca3dc-d7f2-4926-bda9-2bf3fef80adb
### Refactors
In order to add both of these verbs seemisly i made a bunch of
improvments,
Sound length for music is now gotten via the rust_g call instead of
being baked into the title, this means you only need two args for
jukebox titles. (This will mess up the bpm of old music tracks
unfortunately.)
Standerized the behavoir for validating the file type of a file, this is
not full proof from what im aware and there is no checks for if the file
ACCTALLY exists.
## Why It's Good For The Game
Atleast on a downstream, R_SERVER is alot more commonly handed out then
direct access to the tgs configs. And TGS kinda blows bubbles for doing
large scale file managment.
## Changelog
🆑
code: generic helpers and defines for validating file extenstion
refactor: the jukebox has had some improvements in how it validates the
sound file. hopefully none of your funny songs disappear.
admin: command_report_menu will let you set ANY sound file type for the
sound it plays.
admin: Admins can now manage jukebox songs in game
server: Jukebox songs length are now set automatically, update your
jukebox configs!
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
renames Debug2 and kills Debug as its last use (atleast the one
described in its comment) was removed
added it to the check to print to print stack traces to chat in the
instance your debugging without a debugger attached for some reason (if
this var is enabled on live it already causes random to_world messages,
kinda fuck it we ball at that point)
## Why It's Good For The Game
The first one was ENTIRELY unused now
this name makes more sense
## Changelog
N/A
## About The Pull Request
why
<img width="325" height="329" alt="image"
src="https://github.com/user-attachments/assets/8a9aa05a-b85b-415e-977c-9d43d35297e3"
/>
Now they're only sorted within their own categories instead of being
sorted twice
## Changelog
🆑
fix: Spawn Ruin verb no longer "sorts" its ruins alphabetically, instead
sorting them within their categories
/🆑
## About The Pull Request
When a camera update is triggered, it is instead added to a queue on a
background subsystem
An AI entering a camera chunk which is queued to update will force the
update immediately (bypassing the queue)
While the root problem of this is, ultimately, not addressed...
<img width="554" height="58"
alt="467828777-eff3f0e5-49d6-4997-b4d7-05eff6432155"
src="https://github.com/user-attachments/assets/c2d6a5f5-d958-463e-959f-116bd0dab475"
/>
...the change will ultimately prevent update spam from consuming all of
the server's resources - instead allocating updates to the backburner in
times of high server stress (or on multi-z maps)
## Changelog
🆑 Melbert
refactor: Refactored the way camera updates are handled to hopefully
reduce some lag. Report any oddities
/🆑
## About The Pull Request
Adds a verb, Mass Modify Traits, which allows an admin to apply or
remove a specific trait from all living mobs.
This lets you do things like give all mobs the `TRAIT_NOBREATHING`, or
making all mobs able to fly.
<img width="345" height="138" alt="JvkEnGMkQI"
src="https://github.com/user-attachments/assets/fad89db3-a1a5-42d7-ae54-67ca7ba92301"
/>
You can specify only cliented mobs, as well as the trait source for
removals.
<details><summary>results</summary>

</details>
## Why It's Good For The Game
More tools for admins to get creative with is always a good thing, I
think! The trait system uses macros so it's difficult to use SQL to
mass-apply, so here's an easy verb for it instead.
## Changelog
🆑
admin: added new admin verb, 'Mass Modify Traits', which can be used to
add or remove a trait to/from every living mob.
/🆑
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
## About The Pull Request
Hi I'm on a downstream server and this is driving me actually insane
## Why It's Good For The Game
I can't speak for tgstation admins but I like it when the buttons in a
panel are not lies
## Changelog
🆑
admin: Made the buttons asking you for anonymity when you select/approve
a Play Internet Sound request actually do what they say, instead of the
opposite.
/🆑
## About The Pull Request
`/proc/flatten_list()` -> `/proc/assoc_to_values()`, also changes the
code doc to mirror the language of `assoc_to_keys()`'s code doc
## Why It's Good For The Game
Having a proc called `assoc_to_keys` that takes an associative list and
returns a list of the keys, and also having a proc that takes an
associative list and returns a list of the values, and the latter not
being called `assoc_to_values` is very funny
## Changelog
🆑
code: renamed flatten_list proc to assoc_to_values
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Makes Beaker Panel a TGUI so it actually works
<img width="787" height="295" alt="image"
src="https://github.com/user-attachments/assets/343056d2-f059-473d-a1eb-5604d2c3a38e"
/>
There's a lot more I want to do to this UI, namely UX and more features
(like changing grenade types) but I figured I should PR it now that it's
bare minimum functional so I don't get eaten by scope creep
Fixes#89954
## Changelog
🆑 Melbert
admin: Spawn-reagent-container works again, and it's a TGUI
/🆑
## About The Pull Request
Just a simple find + replace PR. All the other tail defines match their
text strings, but for some reason cat tails are just `FEATURE_TAIL`
which is inconsistent.
## Why It's Good For The Game
Consistency, + a lot of downstreams have a generic "tail" feature key
which is distinct from cat tails, so not taking up that define is
better.
## Changelog
Nothing any players would notice
## About The Pull Request
``icon2base64`` does not like animated icons and will display an atlas
in TGUI when one is passed into it
<img width="239" height="220" alt="JKneqDL9NH"
src="https://github.com/user-attachments/assets/47e0ffdf-c155-4c84-94ce-c23203281012"
/>
Additionally added some padding between the icon and the slot name in
the outfit editor because it annoyed me
## Changelog
🆑
fix: Fixed certain broken icons in the outfit editor, stripping menu and
multiple others
/🆑
## About The Pull Request
- Fixes filteriffic erroring out when trying to edit a filter
- Implements plugs for color/transform matrix editing rather than just
displaying an error
- Fixes bloom threshold displaying as a float rather than a color due to
an overlap with rays filter
- Displace filter flags can now be controlled
- Color matrix filter now allows the user to change the colorspace (not
really that useful considering you still can't edit the matrix)
- Layering filter now allows the user to control its blending mode
(actually useful this time)
## Changelog
🆑
fix: Fixed filteriffic runtiming when editing filters, and claiming that
bloom threshold is a number
admin: Filteriffic got a few new options (you should still avoid using
it)
/🆑
## About The Pull Request
Ports https://github.com/NovaSector/NovaSector/pull/5923 which was a
port of https://github.com/SPLURT-Station/S.P.L.U.R.T-tg/pull/9 the new
menu can be accessed via a toggle in the admin preferences in game
options. To see what it looks like, see the attached video in Proof of
Testing
It also adds a new verb, `Toggle-Admin-TGUI` which can be found in the
debug tab and will toggle ***EVERYONE'S*** UI preference to old TGUI it
also reverts the player panel to the old one in case you have the
preference enabled and are unable to access the preferences menu.
## Why It's Good For The Game
It makes things easier on the staff members to find buttons, plus it is
100% optional.
## Proof Of Testing
See the video below.
<details>
<summary>Screenshots/Videos</summary>
https://github.com/user-attachments/assets/4098bc35-95e1-4ae5-91dd-27cb2564c350
</details>
## Changelog
🆑
admin: Ported a new, toggleable, player panel from NovaSector/SPLURT
admin: Adds a new verb in the debug panel: Toggle Admin TGUI
/🆑
---------
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
A verb is now available on localhost called `"Export Save as Dev
Preferences"`
This exports your current savefile to `/config/dev_preferences.json`
If you then connect to your localhost as a guest, it will load
`dev_preferences.json` as your preference datum
This allows for devs testing the game locally to load preferences for
guests.
(Guests connecting to live servers are completely unaffected.)
## Why It's Good For The Game
Initially I only did this because the recent keybinding changes have
destroyed my muscle memory when testing w/o logging in.
But as I worked on it I thought of a few other usecases, like when
implementing preference version migration - the dev preference is never
saved which means you can re-compile as much as you want without needing
to revert your save manually.
## About The Pull Request
Fixes#92714
Admin Cure all in secrets.dm explicitly did not add immunity from curing
all diseases, which meant re-infection happened, it passed a value of 0
which prevented immunity.
It is permanent immunity to that disease with no time limit so added a
prompt to clarify the button.
## Why It's Good For The Game
- Makes the anti disease button for admins better
## About The Pull Request
So in a recent round I noticed the newscaster UI was acting kind of
funky, where two channels seemed to overlap and weirdly pick between the
two in unpredictable ways. Looking into it, it seemed that somehow the
channels had managed to get their unique IDs to overlap-
Oh.
https://github.com/tgstation/tgstation/blob/5d3353e7af2b88ab9379d5fb567b24afd8776acd/code/game/machinery/newscaster/newscaster_data.dm#L109-L131
I see.
...I think that code speaks for itself, in how this could've gone wrong.
Anyhow, in this pr we entirely ditch this system, and instead make it
use an incremental and thus guaranteed to be unique ID.
This fixes our issues.
While we're here, we also remove the unused `channel_IDs` list, and
replace it with the associative lists `network_channels_by_id` and
`network_channels_by_name`. This allows us to also stop iterating over
every network channel until we find the one with the right name or ID.
We also rename some confusing, wrong, or non-standard vars while we're
here.
## About The Pull Request
<img width="491" height="301" alt="image"
src="https://github.com/user-attachments/assets/a3b5b19f-edf5-4de9-9201-9cbfab9e8827"
/>
Mod computers with the access changing software installed have a
secondary ID slot once again. This ID slot doesn't contribute to access.
You can insert IDs into the slot with right click and remove them with
alt-right click.
Also removes the "New IDs and you" memo paper.
Also tweaks PDA on_deconstruct so contents are dropped on when they're
deconstructed with assembly.
Fixes#92151
## Why It's Good For The Game
Changing IDs is very unnecessarily clunky with the one slot. Insert hop
id, log in, remove hop id, insert crew id, change access, remove crew
id, log out.
We had it right back when we had two slots. Insert hop ID, insert crew
id, log in. It just works.
This also allows for mobile HoPs to change access without necessitating
removing their ID from their PDA.
Other changes:
The "New IDs and you" memo is very old. They haven't been new for 4
years now. I don't think anyone reads it and they served their purpose.
I found it odd that, if your PDA was melted or blown up, it would delete
your ID. If this is a hold-over from old PDA behavior feel free to let
me know but otherwise it seems sensible that it'd spit out the contents
as you would expect.
## Changelog
🆑 Melbert
qol: The access changing software (the HoP console) now has ID two slots
again (one for the HoP's id and one for the ID being changed). You can
insert IDs in the secondary slot via the UI or right click, and remove
them via the UI or alt-right click.
qol: If your PDA is destroyed via acid or bombs, your ID (and similar
contents such as disks) are spit out instead of being deleted
del: Deletes the "New IDs and you" memo in the HoP's office. They
haven't been new for 4 years.
fix: Engineering sub-tab in the access changing software no longer looks
messed up
fix: Fix reversed alt-click logic for mod pcs
/🆑
# Conflicts:
# code/modules/modular_computers/computers/item/computer.dm
## About The Pull Request
So in a recent round I noticed the newscaster UI was acting kind of
funky, where two channels seemed to overlap and weirdly pick between the
two in unpredictable ways. Looking into it, it seemed that somehow the
channels had managed to get their unique IDs to overlap-
Oh.
https://github.com/tgstation/tgstation/blob/5d3353e7af2b88ab9379d5fb567b24afd8776acd/code/game/machinery/newscaster/newscaster_data.dm#L109-L131
I see.
...I think that code speaks for itself, in how this could've gone wrong.
Anyhow, in this pr we entirely ditch this system, and instead make it
use an incremental and thus guaranteed to be unique ID.
This fixes our issues.
While we're here, we also remove the unused `channel_IDs` list, and
replace it with the associative lists `network_channels_by_id` and
`network_channels_by_name`. This allows us to also stop iterating over
every network channel until we find the one with the right name or ID.
We also rename some confusing, wrong, or non-standard vars while we're
here.
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)
Both features and identities have been tested through and through, and
seem to be working fine.
Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however
I've been told the maintainers will love me for doing this
🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
## About The Pull Request
<img width="491" height="301" alt="image"
src="https://github.com/user-attachments/assets/a3b5b19f-edf5-4de9-9201-9cbfab9e8827"
/>
Mod computers with the access changing software installed have a
secondary ID slot once again. This ID slot doesn't contribute to access.
You can insert IDs into the slot with right click and remove them with
alt-right click.
Also removes the "New IDs and you" memo paper.
Also tweaks PDA on_deconstruct so contents are dropped on when they're
deconstructed with assembly.
Fixes#92151
## Why It's Good For The Game
Changing IDs is very unnecessarily clunky with the one slot. Insert hop
id, log in, remove hop id, insert crew id, change access, remove crew
id, log out.
We had it right back when we had two slots. Insert hop ID, insert crew
id, log in. It just works.
This also allows for mobile HoPs to change access without necessitating
removing their ID from their PDA.
Other changes:
The "New IDs and you" memo is very old. They haven't been new for 4
years now. I don't think anyone reads it and they served their purpose.
I found it odd that, if your PDA was melted or blown up, it would delete
your ID. If this is a hold-over from old PDA behavior feel free to let
me know but otherwise it seems sensible that it'd spit out the contents
as you would expect.
## Changelog
🆑 Melbert
qol: The access changing software (the HoP console) now has ID two slots
again (one for the HoP's id and one for the ID being changed). You can
insert IDs in the secondary slot via the UI or right click, and remove
them via the UI or alt-right click.
qol: If your PDA is destroyed via acid or bombs, your ID (and similar
contents such as disks) are spit out instead of being deleted
del: Deletes the "New IDs and you" memo in the HoP's office. They
haven't been new for 4 years.
fix: Engineering sub-tab in the access changing software no longer looks
messed up
fix: Fix reversed alt-click logic for mod pcs
/🆑
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
(cherry picked from commit 0bc42d6940)
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
## About The Pull Request
When I was administering one downstream there were often situations when
instead of the standard announcement sound it was necessary to play
something of my own. So I got my hands on it. Together with standard
announcement sounds there is a possibility to play a custom sound.
https://github.com/user-attachments/assets/ba17f4d1-56f6-4022-b049-6ad6dab8481f
## Why It's Good For The Game
Admins will ~~get a soundpad~~ have the ability to play their own
announcement sounds to match the tone of the situation.
## Changelog
🆑
admin: Added the ability to play your own announce sounds.
/🆑
## About The Pull Request
When I was administering one downstream there were often situations when
instead of the standard announcement sound it was necessary to play
something of my own. So I got my hands on it. Together with standard
announcement sounds there is a possibility to play a custom sound.
https://github.com/user-attachments/assets/ba17f4d1-56f6-4022-b049-6ad6dab8481f
## Why It's Good For The Game
Admins will ~~get a soundpad~~ have the ability to play their own
announcement sounds to match the tone of the situation.
## Changelog
🆑
admin: Added the ability to play your own announce sounds.
/🆑
When using `map-export`:
- Exports the welded state of an airlock to the welded airlock mapping
helper
- Exports the paper inside of a noticeboard to pop out and be saved on
the same turf
Both `airlocks` and `noticeboards` handle the outside objects already in
their `Initialization()` procs so I didn't have to change anything. Also
I cleaned up the paper code and added some better code documentation to
`on_object_saved()`.
We convert this:

To this:

## Why It's Good For The Game
There weren't any good examples of using `on_object_saved()` and the
documentation was lacking so I wanted to include some proof of concept
for a few objects. Also airlocks already save their welded state, but I
think it looks better to have it as a mapping helper since it shows up
in StrongDMM instead of being a VV edit.
When using `map-export`:
- Exports the welded state of an airlock to the welded airlock mapping
helper
- Exports the paper inside of a noticeboard to pop out and be saved on
the same turf
Both `airlocks` and `noticeboards` handle the outside objects already in
their `Initialization()` procs so I didn't have to change anything. Also
I cleaned up the paper code and added some better code documentation to
`on_object_saved()`.
We convert this:

To this:

## Why It's Good For The Game
There weren't any good examples of using `on_object_saved()` and the
documentation was lacking so I wanted to include some proof of concept
for a few objects. Also airlocks already save their welded state, but I
think it looks better to have it as a mapping helper since it shows up
in StrongDMM instead of being a VV edit.
## About The Pull Request
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)
Both features and identities have been tested through and through, and
seem to be working fine.
Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however
## Why It's Good For The Game
I've been told the maintainers will love me for doing this
## Changelog
🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
## About The Pull Request
Make `VV` verb Context Menu only.
As it's very annoing when clicked on, because it's forming the list of
all atoms in world which causes nasty client freeze.
## Why It's Good For The Game
No more accidentally clicking VV when trying to click View Runtimes 😠
## Changelog
🆑
admin: VV verb is removed from Debug tab. Who is even using it?
/🆑
## About The Pull Request
The map export verb was including fired projectiles from
guns/lasers/magic/etc. if a map was saved at the exact time the
projectile was on the screen. This is bad because when the map is
loaded, the projectile is just stationary and doesn't disappear.
## Why It's Good For The Game
Mapping consistency.
## Changelog
🆑
fix: Fix map export including projectiles in saved maps
/🆑
## About The Pull Request
Make `VV` verb Context Menu only.
As it's very annoing when clicked on, because it's forming the list of
all atoms in world which causes nasty client freeze.
## Why It's Good For The Game
No more accidentally clicking VV when trying to click View Runtimes 😠
## Changelog
🆑
admin: VV verb is removed from Debug tab. Who is even using it?
/🆑
## About The Pull Request
The map export verb was including fired projectiles from
guns/lasers/magic/etc. if a map was saved at the exact time the
projectile was on the screen. This is bad because when the map is
loaded, the projectile is just stationary and doesn't disappear.
## Why It's Good For The Game
Mapping consistency.
## Changelog
🆑
fix: Fix map export including projectiles in saved maps
/🆑