## About The Pull Request
Desensitized is no longer binary yes/no, now scales from 0.1x to 1x (or
beyond, I guess)
Desensitized jobs start as 0.5x desensitized (which is the threshold for
being considered "truly desensitized")
Some antags are now 0.1x to 0.25x desensitized
Witnessing death of a fellow human gives you slight desensitization
(currently -0.025x).
A normal crewmember, after witnessing 20 deaths, is on par with a
roundstart desensitized crewmember.
Likewise a desensitized crewmember has almost no reaction to death after
witnessing 20 deaths.
Your own deaths count towards this value.
There's an achievement for managing to go from 1x to 0.1x across the
course of an entire round.
## Why It's Good For The Game
This is intended to contribute to the "story" people face across the
length of a round.
Rounds with few overall deaths results in crewmembers regularly getting
shocked, but bloodbaths results in crewmembers "dehumanizing and facing
the bloodshed".
## Changelog
🆑 Melbert
add: Desensitization to death is no longer binary - some antagonists are
now more used to it than others.
add: Witnessing the death of a fellow humanoid (or dying yourself) will
slightly desensitize you to future deaths.
add: Adds an achievement for managing to max out desensitization across
a round.
add: Desensitized crewmembers care less when splattered with blood.
add: Holodeck mobs have a reduced death mood impact.
/🆑
## About The Pull Request
I'm making the ordeal of finding a maint disk (or buying blackmarket
bootleg disk) with a theme in it a slightly more rewarding experience,
while sticking to the concept that it's something you've to find, unlike
default PDA themes.
This PR also proves to be an opportunity to put the progress tab that I
coded a year ago for the 'Fishdex' to good use.
TODO:
~~Refactor preferences to allow specific choices to be shown/hidden
depending on whether the player meets a defined criteria, otherwise
you'll have to do it manually every round, which is lame~~
- [x] Make some simple ui icons associated with each unlockable theme to
be shown in the cheevo progress tab
- [x] Code to validate deserialized DB values, in the remote case that
any theme is removed in the future, as well as unit test code for any
non-abstract theme without ID
- [x] Add sound cue and chat feedback when unlocking a theme (or when
fishing a new kind of fish for the first time, like, the code's similar)
- [x] Test all of this
## Why It's Good For The Game
These themes are basically an end in itself, and I understand the reason
behind their existence is to make for some cute, little maint loot, but
relegating it to chance of finding a disk somewhere in maintenance,
**every single round** really rots whatever little substance this purely
cosmetic feature already has.
## Changelog
🆑
add: Once installed, special PDA themes from maintenance disks will be
present on your roundstart PDA on future rounds (Sadly I couldn't figure
out a way to add those to the preferences UI yet). You can check which
PDA themes you've unlocked in the Progress tab of the achievements UI.
/🆑
## About The Pull Request
With legendary athletic ability or a loaded powerfist or a baseball bat
+ expert athletic ability, you can punch a meteor mid-flight to deflect
in in the **_general_** direction you hit it. There's an achievement for
doing it with just your hands.
## Why It's Good For The Game
No longer do we have to live in fear of these limp lumps of dust. Our
strongest boxer miners and ~sleepiest~ buffest assistants no longer need
to feel helpless as they are barraged, but can stand up and fight for
their beloved Nanotrasen even in the darkest of times.
More interaction couldn't hurt meteors.
A way to actually directly benefit from emagging meteor shields
## Changelog
🆑
add: Syndicate Powerfist users and our most athletic employees have
discovered that if you punch a meteor with enough force, it can be
redirected.
/🆑
## About The Pull Request
Changeling chat is now at night, rather than :j saymode, and it is also
separated from normal messages as [CHANGELING CHAT]
Adds a new [DEAD CHAT], all dead players in Mafia are corpselocked and
talking will instead go to Dead chat.
The Chaplain's ability is now being able to hear Dead chat at night, and
being able to in turn speak to the Dead.
The Chaplain's old ability has been given to a new role, the Coroner.
"Pray" is now "Autopsy".
Deaths in the Mafia arena aren't broadcasted anymore, to lessen
annoyance to round observers.
Also updates role icons & some outfits, as well as some bug fixes I
encountered while messing with it on localhost. I also tried (but not
fully) to make Mafia games more modular and independent, so maybe in the
future we can have more than one Mafia game running at a time.
I am limited to 2 player testing for this, so it is very much possible
that there's some issues I haven't found from my local testing, let me
know if you find anything please.
## Why It's Good For The Game
Being dead in Mafia boots you out of the round regardless of how
invested you were, that kidna sucks so hopefully being able to still
contribute something to the game, or at least discuss it with other dead
players in your own chat, makes players feel important to the game
they're playing.
I have a previous attempt of this here -
https://github.com/tgstation/tgstation/pull/75879 - but it staled out.
This differs from that attempt, as only dead players from the Mafia game
can speak in dead chat, while the old attempt allowed anyone that was
observing a mafia sign post (so dead players from the game, but not
observing the post, weren't able to speak to Chaplains, making him very
hard to be useful especially since getting information like that across
is a little hard). Being corpselocked also prevents them from being able
to see who Changelings are by simply looking at who has maptext at
night, and keeps them more focused on the game being played.
## Changelog
🆑
add: Added a new role to Mafia; the Coroner, which takes the Chaplain's
ability to see dead people's roles.
add: Mafia Chaplains now speak with the dead at night instead, and the
dead are corpselocked to prevent cheating.
fix: Mafia's HoS doesn't kill himself when executing non-townies.
qol: You can now update your notes & send them in chat while dead, as
well as look up the descriptions of other roles.
/🆑
## About The Pull Request
Replaces the asset subsystem's spritesheet generator with a rust-based
implementation (https://github.com/tgstation/rust-g/pull/160).
This is a rough port of
https://github.com/BeeStation/BeeStation-Hornet/pull/10404, but it
includes fixes for some cases I didn't catch that apply on TG.
(FWIW we've been using this system on prod for over a year and
encountered no major issues.)
### TG MAINTAINER NOTE

### Batched Spritesheets
`/datum/asset/spritesheet_batched`: A version of the spritesheet system
that collects a list of `/datum/universal_icon`s and sends them off to
rustg asynchronously, and the generation also runs on another thread, so
the game doesn't block during realize_spritesheet. The rust generation
is about 10x faster when it comes to actual icon generation, but the
biggest perk of the batched spritesheets is the caching system.
This PR notably does not convert a few things to the new spritesheet
generator.
- Species and antagonist icons in the preferences view because they use
getFlatIcon ~~which can't be converted to universal icons~~.
- Yes, this is still a *massive* cost to init, unfortunately. On Bee, I
actually enabled the 'legacy' cache on prod and development, which you
can see in my PR. That's why I added the 'clear cache' verb and the
`unregister()` procs, because it can force a regeneration at runtime. I
decided not to port this, since I think it would be detrimental to the
large amount of contributors here.
- It is *technically* possible to port parts of this to the uni_icon
system by making a uni_icon version of getFlatIcon. However, some
overlays use runtime-generated icons which are ~~completely unparseable
to IconForge, since they're stored in the RSC and don't exist as files
anywhere~~. This is most noticeable with things like hair (which blend
additively with the hair mask on the server, thus making them invisible
to `get_flat_uni_icon`). It also doesn't help that species and antag
icons will still need to generate a bunch of dummies and delete them to
even verify cache validity.
- It is actually possible to write the RSC icons to the filesystem
(using fcopy) and reference them in IconForge. However, I'm going to
wait on doing this until I port my GAGS implementation because it
requires GAGS to exist on the filesystem as well.
#### Caching
IconForge generates a cache based on the set of icons used, all
transform operations applied, and the source DMIs of each icon used
within the spritesheet. It can compare the hashes and invalidate the
cache automatically if any of these change. This means we can enable
caching on development, and have absolutely no downsides, because if
anything changes, the cache invalidates itself.
The caching has a mean cost of ~5ms and saves a lot of time compared to
generating the spritesheet, even with rust's faster generation. The main
downside is that the cache still requires building the list of icons and
their transforms, then json encoding it to send to rustg.
Here's an abbreviated example of a cache JSON. All of these need to
match for the cache to be valid. `input_hash` contains the transform
definitions for all the sprites in the spritesheet, so if the input to
iconforge changes, that hash catches it. The `sizes` and `sprites` are
loaded into DM.
```json
{
"input_hash": "99f1bc67d590e000",
"dmi_hashes": {
"icons/ui/achievements/achievements.dmi": "771200c75da11c62"
},
"sizes": [
"76x76"
],
"sprites": {
"achievement-rustascend": {
"size_id": "76x76",
"position": 1
}
},
"rustg_version": "3.6.0",
"dm_version": 1
}
```
### Universal Icons
Universal icons are just a collection of DMI, Icon State, and any icon
transformation procs you apply (blends, crops, scales). They can be
convered to DM icons via `to_icon()`. I've included an implementation of
GAGS that produces universal icons, allowing GAGS items to be converted
into them. IconForge can read universal icons and add them to
spritesheets. It's basically just a wrapper that reimplements BYOND icon
procs.
### Other Stuff
Converts some uses of md5asfile within legacy spritesheets to use
rustg_hash_file instead, improving the performance of their generation.
Fixes lizard body markings not showing in previews, and re-adds eyes to
the ethereal color preview. This is a side effect of IconForge having
*much* better error handling than DM icon procs. Invalid stuff that gets
passed around will error instead of silently doing nothing.
Changes the CSS used in legacy spritesheet generation to split
`background: url(...) no-repeat` into separate props. This is necessary
for WebView2, as IE treats these properties differently - adding
`background-color` to an icon object (as seen in the R&D console) won't
work if you don't split these out.
Deletes unused spritesheets and their associated icons (condiments
spritesheet, old PDA spritesheet)
## Why It's Good For The Game
If you press "Character Setup", the 10-13sec of lag is now approximately
0.5-2 seconds.
Tracy profile showing the time spent on get_asset_datum. I pressed the
preferences button during init on both branches. Do note that this was
ran with a smart cache HIT, so no generation occurred.

Much lower worst-case for /datum/asset/New (which includes
`create_spritesheets()` and `register()`)

Here's a look at the internal costs from rustg - as you can see
`generate_spritesheet()` is very fast:

### Comparison for a single spritesheet - chat spritesheet:
**Before**

**After**

## Changelog
🆑
fix: Fixed lizard body markings and ethereal feature previews in the
preference menu missing some overlays.
refactor: Optimized spritesheet asset generation greatly using rustg
IconForge, greatly reducing post-initialization lag as well as reducing
init times and saving server computation.
config: Added 'smart' asset caching, for batched rustg IconForge
spritesheets. It is persistent and suitable for use on local, with
automatic invalidation.
add: Added admin verbs - Debug -> Clear Smart/Legacy Asset Cache for
spritesheets.
fix: Fixed R&D console icons breaking on WebView2/516
/🆑
## About The Pull Request
The Thing will now aggro if you shoot it from outside its aggro range
The Thing will also return to its spawn location if one of these happens
(and it was spawned by map loading):
1. It has no client, is in a station area and loses enough health to
trigger a new phase
2. It spends 3 minutes with no aggro, if no client and is on its
spawn_loc
also adjusted the stuff in the loot room (thoughts needed, supposed to
be crew benefits)
there is a freezer with one set of tier 2 robotic organs, and there is
one set of advanced medical tools
also has an achievement now
## Why It's Good For The Game
it should try to obliterate you if shot at because cheesing it like this
is stupid
the ruin-spawned boss cannot and shouldnt be beat normally onstation
anyway, (and making it return to spawn loc also prevents it idling near
the aggression gate, pretty much missing out on the cool stuff i made
for that arena, fixes that
also the loot pool was actually pretty meh and im not sure if its any
better now but it should have more decent crew-sided loot (no miner swag
turbo-human-killer 900000 stuff)
i forgot to add an achievement when i made it
## Changelog
🆑
fix: The Thing (Outpost 31) will aggro if shot from outside aggro range,
has achievement
balance: the loot room in outpost 31 now contains a freezer with a set
of T2 robotic organs, and a set of advanced medical tools. Also The
Thing returns to its spawn location if not aggroed
/🆑
## About The Pull Request
Converts `/datum/player_details` into `/datum/persistent_client`.
Persistent Clients persist across connections. The only time a mob's
persistent client will change is if the ckey it's bound to logs into a
different mob, or the mob is deleted (duh).
Also adds PossessByPlayer() so that transfering mob control is cleaner
and makes more immediate sense if you don't know byond-fu.
## Why It's Good For The Game
Clients are an abstract representation of a connection that can be
dropped at almost any moment so putting things that should be stable to
access at any time onto an undying object is ideal. This allows for
future expansions like abstracting away client.screen and managing
everything cleanly.
## About The Pull Request
I'm adding a score that tracks which types of fish you've caught across
multiple rounds. To do so, I had to add a new score subtype that manages
the score value not being a number. Thankfully the achievement code is
fairly flexible so not a whole lot had to be done, although I've to add
a new column to the achievements table in the DB, because the 'value' is
for integers, while we need one for text strings ~~(the contents of the
list are converted to text with a delimiter before being saved cuz I'm
not sure if and how our DM slash SQL integration handles using lists
directly and I don't want to waste time finding it out)~~.
EDIT: It's mostly done beside the reviews that are going to point out
things that need to be changed. The UI changes are done. It's time for
reviews.
Here are screenshots of the UI with all fish still uncatched beside one
(I've since then the typo on its name and removed an extra zero from the
index number, as well as a nit with the spacing between cells):


## Why It's Good For The Game
We have about dozens over dozens of different fish in the game now, many
of which are just fluff anyway. It's getting to the point it's perhaps
doable to add a score or something to be a braggard about.
## Changelog
🆑
add: Added a new score that keeps track of all different fish that
you've caught between shifts.
server: Added a new schema table to store the aforementioned entries and
the ckeys associated to them, with an additional timestamp column.
/🆑
## About The Pull Request
Makes cigarettes edible, and adds an achievement for eating 500 of them.
The examine text also hides all the interesting info about being able to
eat it


This means the edible component has been touched up with a variable to
hide examines.
## Why It's Good For The Game
An interesting challenge for achievement hunters. Also it's kinda funny
and goes in line with the Sisyphus one
## Changelog
🆑
add: Achievement for eating 500 cigarettes
balance: Cigarettes are now edible
code: Adds a variable to hide the food examine on the edible element
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Fixes several errors to spelling, grammar, and punctuation.
## Why It's Good For The Game
## Changelog
🆑
spellcheck: fixed a few typos
/🆑
## About The Pull Request
Credit to Melbert for this idea.
Adds a new achievement awarded for carrying a boulder from Lavaland to
the Centcom Rescue Wing (via the Escape Shuttle).
If the boulder ever leaves your hands you will not gain the achievement.
If the boulder is not outside on Lavaland when you pick it up you will
not gain the achievement.
If you arrive at the Rescue Ship (via pod) you will not gain the
achievement.
If you drop the boulder
If the shuttle is hijacked and you do not arrive at Centcom you will not
gain the achievement (perhaps try hitting the hijacker with the boulder
you are not allowed to drop?).
If you arrive at Centcom via the Escape Shuttle but fail to exit the
shuttle holding the boulder (for instance, because a max cap bomb is
detonated next to you one second after the shuttle arrives) you will not
gain the achievement.
As the achievement is rewarded after the round-end report is generated,
you also will not be represented on the round-end report. This is a
personal struggle.
Also carrying a boulder slows you down. Dragging it already did, so I'm
not sure why carrying one did not. It feels like an oversight, and just
makes sense.
People rarely have any particular need to manually carry them anywhere
so this should be fine, right? 🙂
## Why It's Good For The Game
Making players do pointless and weird bullshit is the reason to have an
achievement system.
It's a social experiment.
I think that it is funny.
## Changelog
🆑 Jacquerel and Melbert
add: A new achievement for moving a boulder from one place to another,
at great effort.
balance: Hauling a boulder around makes you move slower, as it does when
dragging it.
/🆑
## About The Pull Request
I am back to pushing my code improvements upstream, sorry in advance.
As the title says, this adds support for achievement icons to be in
different dmi files than the default, pretty much the exact same way
that Language icons (for chat assets) do.
## Why It's Good For The Game
It is one of the few things in game (the only other thing i can think of
that does this rn is barsigns) that cannot have their icon changed when
trying to make a subtype, this is very limiting and very annoying,
especially since dmi conflicts are one of the worst types to deal with,
this would make my life a lot easier.
## Changelog
No player-facing changes.
## About The Pull Request
Title. The icon state is called "live_sec_reaction". Four to go.
## Why It's Good For The Game

Mainly inspired by The Rock's eyebrow meme.
## Changelog
🆑
image: Added an icon to the "My Watchlist Status is Not Important"
achievement.
/🆑
## About The Pull Request
This pull request adds a new path.
The cross path is between ash and lock.
Credit to Fury McFlurry for the following sprites:
ring_leader_effect
The path goes as follows:
Moonlight Troupe
Grasp of Lunacy
Smile of the moon
> Sidepaths:
Mind Gate
Ashen Eyes
Mark of Moon
Ritual of Knowledge
Lunar Parade
Moonlight Amulette
> Sidepaths:
Curse of Paralasys
Unfathomable Curio
Unsealed Arts
Moonlight blade
Ringleaders Rise
> Sidepaths:
Ashen Ritual
Last Act
Moonlight Troupe:
The first knowledge of path of moon, lets you make Lunar Blades with 2
iron and a knife
Grasp of Lunacy:
The grasp of this path hides your name for 15 seconds after use, but
more importantly it causes the person hit with the grasp
to hallucinate everyone as indistinct human like figures.
Smile of the Moon:
A pointed spell that causes temporary blinding, muting, deafening and
confusing on the person its targeted at, these effects
last longer the less sanity your victim has.
https://github.com/tgstation/tgstation/assets/120136161/db7cfaaa-8fe2-4f20-aa78-c17c17be4d63
Mindgate:
Lock-Moon. This spell causes you and your victim brain damage, the
victim also suffers a short amount of hallucinations
and also 20 oxyloss.
https://github.com/tgstation/tgstation/assets/120136161/11d15acd-11d0-4e7d-a180-6481b18e9fd9
Mark of Moon:
When applied this paths mark pacifies the victim and they remain
pacifist until attacked or until the mark is detonated, when
detonated the victim is left confused.
https://github.com/tgstation/tgstation/assets/120136161/41e601b5-76d4-4765-8b49-ada7de09feb7
Lunar Parade:
A spell that sends out a projectile that causes people hit by it to
follow the projectile whilst being unable to move. The
projectile also bounces around and is really useful to get people off
your back during chases.
https://github.com/tgstation/tgstation/assets/120136161/cddc8390-e8aa-4d68-b1a5-ab181e941a9b
Unfathomable Curio:
Transmute 3 rods, a brain and a belt into an Unfathomable Curio a belt
that can hold blades and items for rituals. Whilst worn
will also veil the heretic, allowing them to take 1 hit without
suffering damage, this veil will recharge quickly outside of
combat. If examined the examiner suffers brain damage and temporary
brain damage, and if a non-heretic uses it once the shield is damaged
the non-heretic user suffers massive brain damage and a permanent
uncurbable brain trauma. Lock-moon
Unsealed Arts:
Allows you to transmute a canvas and an additional item to create a
piece of art, these paintings have different effects depending on the
additional item added. Lock-moon
Possible paintings:
The sister and He Who Wept:
Additional atoms: Eyes.
When a non-heretic looks at the painting they will begin to hallucinate
everyone as heretics.
The First Desire:
Additional atoms: Any bodypart.
Increases the hunger of non-heretics, when examined drops an organ or
body part at the painting.
Great chaparral over rolling hills:
Additional atoms: Any grown food.
Spreads kudzu when placed, when examined grants a flower to the heretic.
Lady out of gates:
Additional atoms: Gloves.
Causes non-heretics to scratch themselves until they remove their
jumpsuit, when examined removes all your mutations.
Climb over the rusted mountain:
Additional atoms: Trash.
Causes non-heretics to rust the floor they walk on and when examined
gives you a cool moodlet
These effects are mitigated for a few minutes when a non-heretic
suffering an effect examines the painting that caused the
effect. Except for great chapparal which spawns kudzu at their feet, and
Lady out of gates which gives them a random negative mutation.
https://github.com/tgstation/tgstation/assets/120136161/1d1bdd2f-cda5-4430-b3af-4742f98a59a8https://github.com/tgstation/tgstation/assets/120136161/4e843ae4-9786-4e9b-8681-582713f4c789
Moonlight Amulette:
Allows the heretic to transmute 2 sheets of glass, a pair of eyes, a
brain and a tie. If the amulette is used on someone with low
sanity they go berserk attacking everyone if their sanity isnt low
enough it decreases their mood. Optionally you can add a
poppy in the ritual to further decrease their mood on hit.
https://github.com/tgstation/tgstation/assets/120136161/ab820b3f-e7e6-407a-9a1a-93d49c0d7387
Moonlight Blade:
Causes the heretics blades to do brain and sanity damage whilst causing
hallucinations. The blades also cause giggling and
laughter on hit.
Ringleaders Rise:
An AoE spell that deals more brain damage the lower the sanity of the
victim, also causes hallucinations that last longer the
lower the sanity of the victim. If the victims sanity is low enoughit
causes them to go insane, the spell then halves their sanity.
This spell is on a longer cooldown and is more meant to be used as a
payoff or an instigator for a fight. The AoE area is 7 tiles
https://github.com/tgstation/tgstation/assets/120136161/4de85ba2-448a-485c-b739-77fcce86c0cb
Last Act:
The ascension lowers the cooldown of all the heretics spells by 33% and
increases the AoE range of Ringleaders Rise. The main
effect of this ascension is a passive sanity drain and hallucination
aura, if you have low sanity in the aura you will start to suffer
brain damage and if you reach the bottom you gain an aura of
hallucinations thus spreading the moon heretics influence
further. Not only that but roughly 1/5th of the crew will rise in
support of you becoming mini-heretics called acolytes that will attempt
to obey your commands!
I had videos showing off everything but they were too big for github
sadly so I will have to think of some other way to showcase all this
stuff.
This pr also adds a new optional atoms system which means that you can
have rituals that can be improved by adding additional atoms, like for
example moonlight amulette.
Feel free to give some suggestions for further ascension effects.
## Why It's Good For The Game
I feel like heretic is really missing a playstyle around insanity and
this slots neatly in to feel that gap. For being an eldritch antag of
horrors there is surprisingly little interaction with the sanity system
and I feel like this makes up for it, heretic is also missing some
distractions which is where the paintings can really shine and the
hallucinations which breed paranoia.
## Changelog
🆑
add: A new heretic path opens up! Gaze up at the great sky for the path
of the moon opens and the lie shall be slain in pursuit of ultimate
truth!
fix: Fixes the syndicate delusion not working
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Instead of `/datum/award/score/achievements_score` counting achievement
datums in-game and trying to keep up with what the database has we now
just query the database for its current count of unlocked achievements
by overriding the procs the achievements panel builds data from. This
avoids cases like #79555.
Count is still loaded to achievement data datum so it can be saved at
round end.
@Time-Green
## About The Pull Request
This PR renames Knock to Lock, and changes most of the knowledge gain
lore.
## Why It's Good For The Game
The Knock Lore, is based on the Knock Principle from Cultist Simulator,
with the path description being copied from the wiki. Many other
keywords and concepts are fully lifted from that game (Locksmith's
Secret, Mother Of Ants, etc). In my vision, if a heretic path has to be
based on a principle from cultist simulator, it should have its own
spin, and also, the knowledge gain texts should tell a story. For
example, Ash tells the story of a watchman burning down their city after
being betrayed, and Cosmic is a love story between a knowledge seeker
and a monster from the beyond.
So I have decided to reflavour Knock. I have changed the name to Lock,
so at least it would feel similar, just like how Blade is akin to Edge.
Many powers also block people or confuse their paths instead of opening
new ways, and thus, I feel a path whose name implies that it *both*
opens and closes would be more self describing.
I have changed most of its lore to be about the Locked Labyrinth, where
knowledge seekers willingly trap themselves and submit themselves to
servitude to find ultimate freedom by progressing through its trials.
These are the Stewards, who are basically workers in an infinite and
malicious hotel in their dreams. Consider them assistants if you will
(this wasn't my intention when I wrote the lore, but thinking about it
in retrospect, it honestly fits). In the implied story, the heretic
joins their ranks, but keeps getting closer to the more corrupt members,
along with parasitic spirits. Ultimately, they manage to open the
Labyrinth's core, letting out the Stewards, allowing them to manifest in
the forms of heretic summon creatures.
The side path spells and the lock knowledge ritual I have not touched,
they were fine. Some items have been renamed and repathed.
I have kept the distinctive sound effect for using the Grasp, as its
unique enough. Though if someone did have a nice sound effect for
turning a lock and added some filters, I would add it.
**DB Issue**
I have renamed the achievement's define to MEDAL_LOCK_ASCENSION but kept
the value as "Knock", as I don't know how trigger a change in the DB. If
this is a blocking change, I'll try to figure out how to make a
migration file.
**Future improvements**
I would also come back later with another PR, that hands out names to
the eldritch beings spawned by the portal, based on the Stewards in the
knowledge gain lore that I added, along with some new ones that fit the
theme, and some jokey ones like Minotaur.
## Changelog
🆑
spellcheck: Renamed Knock to Locks, and changed most of the flavor text
of knowledge gain, and renamed some items and knowledges from the path.
/🆑
## About The Pull Request
other changes: GODMODEd mobs cannot receive embeds or bleed, admins can
now use the traitor panel to give heretics a focus
adds a new heretic path, the path of knock
its a path about opening shit and having access
wound opening included, and stealing
this is its award icon

its knowledge is as follows:
### A Locksmith’s Secret
starting knowledge, unlocks the key blade which also works as a crowbar
https://github.com/tgstation/tgstation/assets/70376633/3690232d-5687-4b0c-a9cc-b6374e7f1850
### Grasp of Knock
it literally just opens stuff (also makes a knocking sound)
unbolts bolted airlocks and opens them, opens locked closets, opens
mechas, logs you into consoles
(comms consoles are with barebones head-level access, no buying shuttle,
but hey you can shitpost over comms)
Sidepaths: Ashen Eyes, Codex Cicatrix
https://github.com/tgstation/tgstation/assets/70376633/8b890d69-ee03-4d12-99dd-dde7b4483cd4
### Key Keepers Burden
transmute a rod,wallet, and some id card to create an eldritch id card
(very original naming), the ID card used is not preserved
this ID card functions essentially as a superior agent card, using other
IDs on it makes it be consumed by the eldritch ID and have its accesses
and forms added into it, you can use it inhand to turn it into any of
the cards that were consumed
in addition you can hit two airlocks with it to link them together to
create portals under the doors, which has a green glow
going through the portal as a Heretic gets you to the other destination
going through as a nonheretic lands you in a random onstation airlock,
SM chamber included if youre unlucky
1 id card can only have 1 set of portals, making another destroys the
former set, one of the airlocks being destroyed also destroys them
https://github.com/tgstation/tgstation/assets/70376633/e96a518e-b35d-44aa-9a7c-8f2103feab6f
### Rite Of Passage
transmute a white crayon, a multitool, and a plank to create consecrated
lintel
heretics can use this cool looking book to create a 8 second shield that
knocks back any nonheretic that tries to pass
also its ranged
https://github.com/tgstation/tgstation/assets/70376633/036e0875-c422-433e-87b3-71328cb2bf8a
### Mark Of Knock
the mansus grasp will now mark its victim for like 10 seconds
marked victims are denied access by all objects, public airlocks
included
https://github.com/tgstation/tgstation/assets/70376633/6187ef36-30f4-4a92-af21-e5b288afb869
### Burglars Finesse
steal a random item from the victims backpack (or other storage item if
they dont have a backpack) and puts it into your hand
the victim will probably hear you and also gets a chat message about
this
https://github.com/tgstation/tgstation/assets/70376633/2529fa78-616d-4a46-ae18-3cb22efb1ab1
### Ritual of knowledge
this is nothing new i put this here to keep it in order
### Apetra Vulnera (sidepath with flesh)
the victim receives bleed wounds on every single bodypart that has more
than 15 brute
if they dont have a bodypart that has >= 15 brute they get a random
wound anyway so
side paths are: blood siphon and void cloak
https://github.com/tgstation/tgstation/assets/70376633/3c2cd21e-edbc-4956-8c2d-cd9a42b87f33
### Wave of Desperation (sidepath with flesh)
cannot be casted uncuffed with no bola, can be casted cuffed with no
bola, with a bola and no cuffs
adjacent mobs are knocked down, mobs are repulsed away, your cuffs and
bola are destroyed, and you gain a status effect that:
after 12 seconds makes you unconscious for 20 seconds
5 min cooldown
https://github.com/tgstation/tgstation/assets/70376633/da480921-d5dd-4b46-b2e8-0cf543640bf9
### Opening Blade
your blade has a 35% chance to cause a weeping avulsion on hit
https://github.com/tgstation/tgstation/assets/70376633/b6fd2837-6b0a-4a5a-bc7b-b9c3f7f715d1
### Caretakers Last Refuge
you can only cast this when not near sentient living beings
while in refuge you are invincible and near transparent, cannot use your
hands or spells
also immune to damage slowdown, being hit with a null rod cancels this
also if you lose your focus you get out of refuge
https://github.com/tgstation/tgstation/assets/70376633/f053cfd8-2a16-4195-8004-17df077983cahttps://github.com/tgstation/tgstation/assets/70376633/72330486-5273-4123-a108-b437b56120c4
### Many secrets behind the Spider Door (Ascension)
ritual needs 3 bodies without organs in their chest
when successfully performed you ascend and;
open a tear in reality (not the BoH one) which;
Polls all ghosts with sentient mob enabled to spawn and siege the
station, ghosts can interact with the portal to spawn as a random
eldritch mob
spawned mobs are loyal to whoever ascended and on examine can identify
their master
also fills the entire room with purple light
also the heretics opening blade is upgraded to a 65% chance, and they
gain Ascended Shapeshift which allows them to shapeshift into eldritch
mobs, and its not 1 choice only
https://github.com/tgstation/tgstation/assets/70376633/8d06286e-789d-442f-b33c-878d26deab07
## Why It's Good For The Game
its cool i think and an option for those wanting to steal and be sneaky
and stuff
## Changelog
🆑
add: heretic knock path and its respective items and award
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Read title, this only affects the UI and not the database as far as I am
aware
## Why It's Good For The Game
The jobs category is painfully empty, only being home to four
achievements total. Meanwhile we have a ton of achievements inside the
miscellaneous category, a lot of which are not miscellaneous
achievements at all. Right now I just wanna focus on moving around
achievements from existing category to existing category though. This
improves achievement category spread overall by a small but necessary
amount.
## Changelog
🆑 distributivgesetz
code: Moved some job-related achievements from the misc category to the
jobs category.
/🆑
## About The Pull Request
Unlocking an achievement now plays a sound. Which sound is played
depends on the associated preference of the player, found in the Sound
category of the game preferences UI.
The current options are a [glockenspiel
ping](https://freesound.org/people/FunWithSound/sounds/456965/), a
[beeps jingle](https://freesound.org/people/Eponn/sounds/619838/) and a
["tada!"
fanfare](https://freesound.org/people/plasterbrain/sounds/397355/), with
the obvious fourth option to not play a sound at all.
All sounds are from Freesound and are public domain. As such,
attributions are not required. The sounds have been also converted to
.OGG mono 44.1 Khz in accordance to the standards.
## Why It's Good For The Game
Enhancing the player feedback for unlocking an achievement with
choosable sounds.
## Changelog
🆑
sound: Unlocking an achievement now plays a sound by default. You can
change it in the Sound category of the game preferences.
/🆑
## About The Pull Request
Adds the "All Within Theoretical Limits" achievement. You get the
achievement for standing inside the engine room at the time where the SM
crystal heals from 0% health (when the crystal says "Crystalline
hyperstructure returning to safe operating parameters. Harmonic
frequency restored within emergency bounds. Anti-resonance filter
initiated"), and waiting until the SM heals to at least 25% health.
## Why It's Good For The Game
This rewards engineers who stay behind and try to save the engine even
in the most dire circumstances.
## Changelog
🆑 distributivgesetz
add: Add an achievement for saving a cascading engine from the final
countdown.
/🆑
## About The Pull Request
Checking the achievements UI now shows a line below the Unlocked/Locked
status for normal achievements, informing the user of how many players
have unlocked said achievement. It also contains a tooltip; within it is
a percentile comparison with the most unlocked achievement.
Beside that, I've added a check in the achievement unit test to
ascertain that all award categories are actually present in the UI, and
as well moved all `ui_data` to `static_ui_date` considering it is not
the sort of interface that has to be constantly updated like an air
alarm or an APC.
Here's a screenshot of the UI, with the tooltip where my cursor would be
(the hot damn! achievement was var-edited of course):

## Why It's Good For The Game
This should provide some fundamental statistics for achievements, from
which contributors and players can deduct the rarity and bragging
rights.
## Changelog
🆑
qol: The Achievements UI now shows how many people have unlocked a given
achievement.
fix: The "Skills" Category for achievements should no longer be hidden.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
Co-authored-by: Jordie0608 <4343468+Jordie0608@users.noreply.github.com>
## About The Pull Request
The roundend report now has a section dedicated to achievements earned.
It will report the ckey/identity of the player, the earned achievement,
and where it was earned.

## Why It's Good For The Game
Adds some more fun stuff to the roundend report, and contributes to the
recent uptick in achievement-related PRs.
## Changelog
🆑 Rhials
add: The roundend report will now read out any achievements ("cheevos"
as you may know them) earned by players over the course of the round.
/🆑
## About The Pull Request
Previously, it was only saved if the player unlocked at least one
achievement during the round, which explains why the high scores table
took several rounds to fill up.
Also, removed an unused proc.
## Why It's Good For The Game
Fixing a peeve.
## Changelog
🆑
fix: The "Unlocked Achievements" score will now be properly saved at the
end of the round the first time it's loaded.
/🆑
## About The Pull Request
Title. Basically, each time you unlock an achievement, the score goes up
by one. This PR is basically just an overglorified reference to a funny
game from a bygone era after all. It even comes with its own icon unlike
other scores. 💪🐘
## Why It's Good For The Game
We've about 80 achievements in the game so far. It would be nice indeed
to see how many achievements players have unlocked and how high the
ladder goes.
## Changelog
🆑
add: Added a score award that counts how many achievements you've
unlocked so far.
/🆑
## About The Pull Request
This Pull Request brings a new negative quirk to the list of negative
quirks: Indebted. As the title suggests, you start the round with a
pretty high debt of roughly 15.000 credits (give or take up to 1.250
credits), and everytime the account balance would increment, 75% of
what's earned will be pushed toward solving it instead.
Unlike other quirks, it is hidding from medical HUDs and the health
analyzers, because I frankly believe it's quite a stretch putting it on
the same plane as other quirks which are of a more "psycho-physical"
nature. However, examining the medical records will return a remark on
how the quirk holder has had some difficulties paying the checkup bill,
hinting it greatly. Examining their ID accurately will also report the
entity of the debt.
Ok, the PR is now ready. It fancies an achievement and a pin too, for
those who actually extinguish the debt.
## Why It's Good For The Game
I think it's cool to have a quirk that affects players from an angle
different than most of the others. It doesn't affect the mob directly,
brings no positive or negative moodlet, gives items, but it does cripple
what they can do with their own bank account. Sure, it can be
circumverted by "borrowing" another player mob's ID card, but frankly it
has a mild negative value on par with "Family Heirloom" so it's not a
big deal.
## Changelog
🆑
add: Added an Indebted negative quirk to the game, which gives the
holder's bank account a debt averaging at 15000 credits (with a
variation of 1250 cr) and forces 75% of all earnings towards solving it.
A little prize awaits those who actually extinguish it.
/🆑
## About The Pull Request
Adds an achievement for completing the Grand Ritual
Also, adds blackbox logging for the Grand Ritual feature so we can see
how much people are actually doing it
Also, while testing I noticed that Summon Guns/Magic were fucked, so I
fixed them.
## Why It's Good For The Game
Nice to have some stats.
Nice to get a juice reward for doing your wizard chores.
Listing the changes, off the top of my head:
- Resprited fishing rods, hooks, and the worm bait!
- Added a new, telescopic fishing rod, that can be bought as a goodie.
The master rod is also telescopic now.
- Added a couple hooks. One that lets you move the bait up and down,
otherwise keeping it in place, and another that stops the fish from
escaping, but slowly kills it. The former from the bepis fishing tech
node, the latter frm the black market.
- Added a fishing skill and relative legendary reward: A fishing hat,
like the one that recites "women fear me, fish fear me"
- You can now stop fishing by activating the fishing rod in your hand,
and stops it from stealing all clicks on other things if it isn't in
your active hand.
- Reworked fishing traits into fish traits, which can apply to fish
after it has been caught.
- Expanded the fish breeding system. Traits may be passed down to
offsprings, and offsprings may evolve (mutate?) into different kind of
fishes if conditions when conditions are met.
- Added half a dozen new fishes, each with its own traits: lubefish,
sludgefish (and its purple variant), slimefish, unmarine bonemass and
unmarine mastodon. Also, holodeck fish, as a joke.
- New traits: lubed skin, parthenogenesis, toxic (new reagent), toxin
immunity, predator, necrophage, no mating, crossbreeder, aggressive and
revival. Converted Emulsijack's ability and Donkfish's yuckiness into
traits as well.
- Added a fish analyzer that you can scan aquariums and fishes with.
- Fish can now be blended if you really want to. The number of reagents
from blending, w_class, and the number of fillets you get from cutting
fish now scale with size and weight.
- fish feed is no longer infinite (but it should still be plenty).
- Implemented temperature requirements for aquarium fish.
- You can now buy (dead) fish from the black market for dirt cheap.
- Last but now least, toilets are now valid fishing spots.
## About The Pull Request
https://github.com/tgstation/tgstation/assets/28870487/2451bc69-db1e-420d-9a18-2f899ca65427
This introduces a new unfavorable situation (non-antagonist random
events that dynamic triggers under certain circumstances), restricted to
planetary maps (Icebox). An earthquake occurs, felt by everyone on the
map, forming a fault that tears the a hole somewhere on the station.
The fault zone is indicated by shaking tiles, which gives a chance
(about 30 seconds) for you to move your machinery/property/crewmembers
out of the way. If you're on those tiles when the fault forms, get ready
to take a nasty fall.
Anything caught in the fault zone as it collapses inward will be
destroyed, violently, _before_ being dropped down into the z-level
below.

These can also happen as a random event, however their rarity is on-par
with that of a meteor storm.
This also adds a helper for finding a midpoint turf between two provided
turfs, thanks to ZephyrTFA.
This idea basically possessed me over the course of a few days, and I
found myself unable to work on anything else until I had it complete.
I'm glad its done.
## Why It's Good For The Game
Gives Icebox its own big "environmental disaster" event. I'm hoping it
isn't received as being too destructive, but mind that this is meant to
be an equal to the dreaded meteor storm.
Also makes it so that unfavorable events aren't a coinflip between a
portal storm/rod on planetary maps.
## Changelog
🆑 Rhials
add: Chasmic Earthquake random event, exclusive to Icebox. Tears a huge
chasm in the hull of the station. Watch out for shaking tiles!
sound: Adds sounds for distant rumbling, metal creaking, and rubble
shaking.
imageadd: Achievement icon for getting sucked up in an earthquake chasm.
/🆑
## About The Pull Request
A re-open of https://github.com/tgstation/tgstation/pull/66326 with
Fikou's permission
Adds the style meter, it can be bought from the mining vendor for 1500
points, it is an attachment to your glasses.
The style meter creates a display on your hud, with your recent actions,
like attacking enemies, killing them, mining ore etc. Actions like
spinning or flipping increase your score multiplier, making you get more
points.
Your style meter affects how much ore you get from mining rocks. By
default with the meter, you get 20% less ore, but at the highest, you
can get 1.2x the ore from mining. In addition, on B-tier or above, you
can "hotswap" items, by attacking an item in your backpack with one in
your hand (should it fit and all that). Also features a leaderboard for
highest style point count!
New streamable: https://streamable.com/eewi6l
The following are sources of points:
- Killing things
- Killing big things
- Killing small things
- Punching things
- Melee'ing things
- Mining rocks and ores
- Having matrix traps detonate
- Hit, defuse, and detonate gibtonite
- Detonate crusher marks
- Scan geysers
- Parry projectiles (others or your own)
Oh, right. While wearing the style meter, you're able to parry any
lavaland-based projectile by clicking on it or the tile it is on, which
reflects it back in a 7 degree arc, making it 20% faster and 15% more
damaging. Usually not very easy.
Maybe-plan in the future for some syndicate variant of this (with bullet
parrying and appropriate style sources, etc.), but not for this PR
Thanks to Arcane, multitooling the style meter will make it play some
sounds on rank-up.

https://streamable.com/nheaky
Parrying in action
## Why It's Good For The Game
Makes miners bring more ore in a fun way.
## Changelog
🆑 Fikou, Zonespace, Arcane for voicing
add: The mining vendor now has a style meter. This meter gauges your
style points and uses them to improve your ore yield.
/🆑
---------
Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
## About The Pull Request
This PR adds a new Cosmic Heretic.





Main Paths:
- Eternal Gate: Opens up the Path of Cosmos to you. Allows you to
transmute a sheet of plasma and a knife into an Cosmic Blade. You can
only create two at a time.
- Grasp of Cosmos: Your Mansus Grasp will give people a star mark
(cosmic ring) and create a cosmic field where you stand.
- Cosmic Runes: Grants you Cosmic Runes, a spell that creates two runes
linked with eachother for easy teleportation. Only the entity activating
the rune will get transported, and it can be used by anyone without a
star mark.
- Mark of Cosmos: Your Mansus Grasp now applies the Mark of Cosmos. The
mark is triggered from an attack with your Cosmic Blade. When triggered,
the victim transport back to the Cosmic Diamond, which is the location
your mark was applied to them. After getting transported they will be
paralyzed for 2 seconds.
- Star Touch: Grants you Star Touch, a spell that will give people a
star mark (cosmic ring) and create a cosmic field where you stand.
People that already have a star mark will be forced to sleep for 4
seconds. When the victim is hit it also creates a beam that deals a bit
of fire damage and damages the cells. The beam lasts a minute, until the
beam is obstructed or until a new target has been found. Can remove
Cosmig Runes and teleport you to your Star Gazer when used in hand.
- Star Blast: Fires a projectile that moves very slowly and create a
cosmic field on impact. Anyone hit by the projectile will recieve burn
damage, a knockdown and a star mark.
- Cosmic Blade: our blade now deals damage to peoples cells through
cosmic radiation.
- Cosmic Expansion: Grants you Cosmic Expansion, a spell that creates a
3x3 area of cosmic fields around you. Nearby beings will also receive a
star mark.
- Creators's Gift: The ascension ritual of the Path of Cosmos. Bring 3
corpses with bluespacedust in their body to a transmutation rune to
complete the ritual. When completed, you become the owner of a Star
Gazer. You will be able to command the Star Gazer with Alt+click. You
can also give it commands through speech. The Star Gazer is a strong mob
that can even break down reinforced walls. Star Touch can now teleport
you to your Star Gazer when Star Touch is used in hand."
Side Paths:
- Ash-Cosmic: Fire Fish: Allows you to transmute a pool of ash, eyes,
and a sheet of plasma into a Fire Shark. Fire Sharks are fast and strong
in groups, but are bad at combat.
- Ash-Cosmic: Curse of The Stars: Allows you to transmute a bluespace
crystal, a pool of ash, and a liver to cast a Curse of The Stars on a
crew member. While cursed, the victim will recieve a star mark that
lasts for at least 3 minutes. This star mark makes it so that the crew
member cannot enter cosmic carpet fields. The victim will also recieve a
cosmic carpet trail for at least 3 minutes.
- Ash-Cosmic: Eldritch Coin: Allows you to transmute a sheet of plasma,
a diamond and eyes to create an Eldritch Coin. The coin will heals when
landing on heads and damages when landing on tails. The coin will heal
for more, but only for heretics.
Extra ability information:
- Star Mark: This is a status effect that prevents people from walking
into cosmic fields.
- Cosmig Fields: Only block entities marked with a star mark,
projectiles or throwing items will still work. Lasts only 30 seconds and
5 seconds for the Cosmig Trail trait.
Some things I wanted to mention:
- Why the Star Gazer is balanced: It has 3000 health and can kill people
pretty fast, but at the same time, anyone can space the Star Gazer and
lead it away from the heretic if they do not pay attention.
- The Cosmic Heretics balancing has been carefully considered. It is
relatively weak in group situations but strong in one to one combat.
- Balance changes can also be made after the PR gets merged need be, or
it can be test merged first.
## Why It's Good For The Game
New heretic path means more choice and a different play style.
## Changelog
🆑
add: Adds new Cosmic Heretic.
soundadd: Adds Cosmic Heretic sounds.
imageadd: Adds Cosmic Heretic sprites.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* So, this moves the "candidate" selection into round_event_control and integrates it into part of canspawnevent. The actual selection is part of a new proc, generate_candidates, which was created so that canspawnevent() and admin_setup() (WHICH OVERRIDES CANSPAWNEVENT AND THEREFORE CANDIDATE GENERATION) don't have to share any code.
The heart attack candidates list is passed down from the event control to the round event. This is used for running a second series of checks via attack_heart(), a new proc on the round event.
The heart attack now fires on every tick, until "attacks_left" reaches zero, which is a value inhereted from the round event control (default 1, modifiable in admin setup).
In attack_heart, the victim pick_weight-ed from the victims (formerly candidates) and is checked to see if they'll be spared from their fate for some special reason. This is so that feedback can be given and smugness can be felt over surviving a heart attack. This check was literally the only thing I wanted to implement in this PR and I ended up rewriting most of the entire thing. Wowee.
This PR adds a new heretic path.
The Path of the Blade, a path focused on becoming a powerful one-on-one combatant with your blades.
Main path:
Cutting Edge: Allows them to transmute up to five knives. Knives are made with two bars of silver.
Grasp of the Blade: The Mansus Grasp will stun and deal additional damage to people lying down or facing away from you.
Dance of the Brand: Being attacked while wielding a blade will cause you to counter-attack whoever hit you.
Mark of the Blade: Marked targets will be unable to exit their current area. Triggering the mark will give you a floating knife which will block the next attack you receive.
Stance of the Scarred Duelist: Blood wounds inflicted upon you are reduced in severity greatly, and you gain immunity to dismemberment. Dropping below 50% health will grant you stun resistance and wound resistance.
Swift Blades: Wielding a heretic blade in both hands will attack with both at once. The second attack has a small damage penalty.
Furious Steel: A spell that grants you three orbiting blades. Each blade will block an attack upon you, and you can fire the blades at people for decent damage and bleeding.
Maelstrom of Silver: Ascension ritual, surrounds you in a whirlwind of eight blades which block attacks. These regenerate over time. Heretic blades deal massively increased damage and offer lifesteal, and you become immune to stuns and wounds.
Side paths:
Void / blade 1: Shattered Risen. A summon like the voiceless dead, shattered risen are tankier and deal immense damage with their fists, especially to structures, but cannot hold items.
Void / blade 3: Maid in the Mirror. A summon that can jaunt infinitely around the station. They can only enter and exit the jaunt around reflective surfaces, such as mirrors, windows, titanium walls, or reflective armor.
Rust / blade 3: Lionhunter's rifle. A three shot rifle. When fired at a non-living or close range target, it fires like a normal weapon, however clicking on distant targets will aim at them. The projectile shot at aimed targets deal massively increased damage and cause stuns / knockdowns. It will also track them and travel through walls.
Rust / blade 3+1: Additional ammo for the lionhunter's rifle.
Other side path changes:
Blood Siphon is now a t2 side path, between Flesh and Void.
Cleave has been moved to between Flesh and Void
Rusted Ritual has been moved to beween ash and rust
Also refactors heretic paths a great deal, making it much easier to add new heretic paths.
The guy that resprited Legion forgot about the achievement, because it's still using the old sprite from the previous decade.
Some of the misc achievements are also still lacking their own icons. I don't have the time right now to work on all of them, but I have sprited one (also as a practice) so to make the task easier. It's a bit smaller than other achievements and more soulless, but that's how I wanted it to be.
* Adds a springlock death achievement
* The man inside the MODsuit
* Update code/datums/achievements/misc_achievements.dm
Co-authored-by: ShizCalev <ShizCalev@users.noreply.github.com>
* Reviewssssss
* Resprites the man inside the modsuit
* Adds your stupid fucking newline
* removes invisidixel
Co-authored-by: ShizCalev <ShizCalev@users.noreply.github.com>
Converts most spans into span procs. Mostly used regex for this and sorted out any compile time errors afterwards so there could be some bugs.
Was initially going to do defines, but ninja said to make it into a proc, and if there's any overhead, they can easily be changed to defines.
Makes it easier to control the formatting and prevents typos when creating spans as it'll runtime if you misspell instead of silently failing.
Reduces the code you need to write when writing spans, as you don't need to close the span as that's automatically handled by the proc.
(Note from Lemon: This should be converted to defines once we update the minimum version to 514. Didn't do it now because byond pain and such)
This PR aims to make the HTML folder a little more organized, as well as remove a few unused files.
Why It's Good For The Game
Doesn't change anything for the player, however makes the files more organized.