## About The Pull Request
Makes the `AB_CHECK_CONSCIOUS` check in `is_available()` specify you're
dead if you're dead, rather than unconcious. Also moves it up to the top
of the checks, so that it'll say the much more glaring issue of death
before something like "incapacitated' or "hands blocked" or "laying
down"
## Why It's Good For The Game
closes#94173
## 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
The horrific necktie can now be used in-hand to give it sentience, if
someone chooses to become it they will inhabit the tie, being able to
only speak with the person that gave them sentience and other people
inhabiting the tie, and can't use radios.
It can also be forcefully entered into from the ghost spawners menu as
long as someone's wearing the tie (or if there's already a tie in it,
that it's being worn by the same person that created the original host).
The tie can theoretically have infinite ghosts inhabiting it, you can
'ghost' verb out of it at any time to leave.
<img width="695" height="171" alt="image"
src="https://github.com/user-attachments/assets/512645aa-610e-488a-b0a2-dca74a91d7e6"
/>
Much of the player-facing texts are taken from
https://github.com/TheSwain/Fulpstation/pull/306 - The parts that were
left out in the port, https://github.com/tgstation/tgstation/pull/62113
Can rename itself at will, but the name of the item itself will never
change, so it is limited to being in the head of the person wearing it.
<img width="295" height="60" alt="image"
src="https://github.com/user-attachments/assets/c67445d4-daa2-4edc-a065-04be11617548"
/>
## Why It's Good For The Game
A harmless reference and improves Detective gameplay by allowing a
backseater able to commentate on the person's gameplay, guide, or
encourage different behaviors. Hearing people bicker in your head is
also really funny which I have seen to some limited degree with split
personalities.
## Changelog
🆑
add: The horrific necktie can now become sentient.
/🆑
## About The Pull Request
Tin, some more hard dels that were found. Additionally there was a
balloon alert meant to display phrases like "Kapow!" "Bam!" etc but it
is runtiming before it can do so because the mob gets deleted before the
balloon alert gets displayed. (solution for these sorts of issues is to
display the balloon alert on the `loc` instead.
## Why It's Good For The Game
Less chug, and a bugfix.
## Changelog
Probably nothing worth mentioning
## About The Pull Request
Converts as many time vars expressed in deciseconds as I could find to
use time defines.
## Why It's Good For The Game
Makes these values neater and more readable.
## Changelog
🆑
code: Converted a lot of time-based variables to be expressed with time
defines.
/🆑
# Conflicts:
# code/modules/clothing/head/hat.dm
# code/modules/clothing/shoes/boots.dm
# code/modules/clothing/suits/utility.dm
## About The Pull Request
Tin, some more hard dels that were found. Additionally there was a
balloon alert meant to display phrases like "Kapow!" "Bam!" etc but it
is runtiming before it can do so because the mob gets deleted before the
balloon alert gets displayed. (solution for these sorts of issues is to
display the balloon alert on the `loc` instead.
## Why It's Good For The Game
Less chug, and a bugfix.
## Changelog
Probably nothing worth mentioning
## About The Pull Request
Converts as many time vars expressed in deciseconds as I could find to
use time defines.
## Why It's Good For The Game
Makes these values neater and more readable.
## Changelog
🆑
code: Converted a lot of time-based variables to be expressed with time
defines.
/🆑
## 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
Ghosts can see the antag UI button in the button list when observing a
heretic, and click on it to view it.
## Why It's Good For The Game
It'd be nice to be conveniently look at the heretic info without
actually being a heretic, and see what powers the heretic has and has
bought
## Changelog
🆑
add: you can now a ghost observe heretics heretics and click on their
antag panel button to view their heretic UI
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Ghosts can see the antag UI button in the button list when observing a
heretic, and click on it to view it.
## Why It's Good For The Game
It'd be nice to be conveniently look at the heretic info without
actually being a heretic, and see what powers the heretic has and has
bought
## Changelog
🆑
add: you can now a ghost observe heretics heretics and click on their
antag panel button to view their heretic UI
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
1. Fix action buttons not getting their set tooltip style
2. Radials can now specify what tooltip theme to use on a per-slice
basis
3. The "Info" button now has a tooltip showing you the info text
<img width="370" height="496" alt="image"
src="https://github.com/user-attachments/assets/caff9d97-4ccd-4611-9135-1f39b72f9237"
/>
## Why It's Good For The Game
1. Wow this has been broken for some time
2. Allows for theming of radials according to context, like cult
radials. Next step would be to allow changing the background but that's
for later.
3. You don't need to click it -> look at chat -> look back at the
radial, you can just hover over it. A lot more convenient
## Changelog
🆑 Melbert
fix: Cult spell action buttons have their unique tooltip style again
qol: Radial tooltips can now have unique styles
qol: Radial "info" buttons now have tooltips with the info text, meaning
you don't have to click on the button and read chat
/🆑
## About The Pull Request
1. Fix action buttons not getting their set tooltip style
2. Radials can now specify what tooltip theme to use on a per-slice
basis
3. The "Info" button now has a tooltip showing you the info text
<img width="370" height="496" alt="image"
src="https://github.com/user-attachments/assets/caff9d97-4ccd-4611-9135-1f39b72f9237"
/>
## Why It's Good For The Game
1. Wow this has been broken for some time
2. Allows for theming of radials according to context, like cult
radials. Next step would be to allow changing the background but that's
for later.
3. You don't need to click it -> look at chat -> look back at the
radial, you can just hover over it. A lot more convenient
## Changelog
🆑 Melbert
fix: Cult spell action buttons have their unique tooltip style again
qol: Radial tooltips can now have unique styles
qol: Radial "info" buttons now have tooltips with the info text, meaning
you don't have to click on the button and read chat
/🆑
## About The Pull Request
The title
## Why It's Good For The Game
I really dont like the fact that spider or simple lobster just with one
dash can turn big scary mech to big scary wreckage.
## Changelog
🆑
fix: Mechs now take a fixed amount of damage if the simplemob "charge"
ability was used on them.
/🆑
## About The Pull Request
The title
## Why It's Good For The Game
I really dont like the fact that spider or simple lobster just with one
dash can turn big scary mech to big scary wreckage.
## Changelog
🆑
fix: Mechs now take a fixed amount of damage if the simplemob "charge"
ability was used on them.
/🆑
It was removed in https://github.com/tgstation/tgstation/pull/27799
because the spear was broken and the Flans' AI sucked with not-great
sprites and was all just one big reference. Original addition:
https://github.com/tgstation/tgstation/pull/22270
This re-adds it, updates the map (now using airless turfs) with extra
ambiance, using ash whelps (lavaland variation of ice whelps) instead of
Flans, re-adds the spear, and adds armor as well this time around.
The spear gives you a jump ability to crash down upon a player below
you, rather than teleporting to wherever you throw the spear at. You
can't attack while mid-air, you can go through tables but not
walls/doors, and you also can't un-dualwield or drop the spear mid-jump.
Landing on a mob deals double damage to them (36 to unarmored people),
while landing on objects deals 150 damage to them (taken from savannah's
jump ability, which was in turn taken from hulk's punching)
It's also got some extra throw force (24 compared to default spear's 20)
The armor has basic security-level armor but covers your whole body.
Does not include space protection, and can be worn by Ian.
Video demonstration
https://github.com/user-attachments/assets/a77c3a0d-17d2-4e8d-88b6-cdbca8b1f2c3
New sprites demonstration
https://github.com/user-attachments/assets/0e465351-5484-406f-8adc-ffa1ac180daf
Armor demonstration
https://github.com/user-attachments/assets/abdfcac6-65bf-443c-bde2-27d157ee3a80
Map

With the changes in https://github.com/tgstation/tgstation/pull/90771 I
had to mess with ash whelp abilities a bit, I decided to make them use
cold fire instead of hardcoding blue color on top of the fire sprites,
and it now acts accordingly too
https://github.com/user-attachments/assets/cfca0d70-d13d-4c73-996d-2d4a7519866d
The jump was taken from Savannah Ivanov, and Goof's bunny jumping.
This Re-implements a old spear that got removed for its buggyness/bad
mapping and on the authors request as well not wanting to deal with it.
Re-introduces the SkyBulge as a space ruin, referencing Dragoons from
Final Fantasy. this just like any normal spear, but using the savannah
jump mechanic, this allows you to close distances with the spear
avoiding ranged projectiles in the jump, and if you directly land on
your target you will do double the damage.
🆑 Ezel/Improvedname, Toriate, JohnFulpWillard
add: Re-added the Dragoon Tomb lair, now has a Skybulge spear and
Drachen armor.
balance: Ice whelps now spit out cold fire.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
It was removed in https://github.com/tgstation/tgstation/pull/27799
because the spear was broken and the Flans' AI sucked with not-great
sprites and was all just one big reference. Original addition:
https://github.com/tgstation/tgstation/pull/22270
This re-adds it, updates the map (now using airless turfs) with extra
ambiance, using ash whelps (lavaland variation of ice whelps) instead of
Flans, re-adds the spear, and adds armor as well this time around.
The spear gives you a jump ability to crash down upon a player below
you, rather than teleporting to wherever you throw the spear at. You
can't attack while mid-air, you can go through tables but not
walls/doors, and you also can't un-dualwield or drop the spear mid-jump.
Landing on a mob deals double damage to them (36 to unarmored people),
while landing on objects deals 150 damage to them (taken from savannah's
jump ability, which was in turn taken from hulk's punching)
It's also got some extra throw force (24 compared to default spear's 20)
The armor has basic security-level armor but covers your whole body.
Does not include space protection, and can be worn by Ian.
Video demonstration
https://github.com/user-attachments/assets/a77c3a0d-17d2-4e8d-88b6-cdbca8b1f2c3
New sprites demonstration
https://github.com/user-attachments/assets/0e465351-5484-406f-8adc-ffa1ac180daf
Armor demonstration
https://github.com/user-attachments/assets/abdfcac6-65bf-443c-bde2-27d157ee3a80
Map

With the changes in https://github.com/tgstation/tgstation/pull/90771 I
had to mess with ash whelp abilities a bit, I decided to make them use
cold fire instead of hardcoding blue color on top of the fire sprites,
and it now acts accordingly too
https://github.com/user-attachments/assets/cfca0d70-d13d-4c73-996d-2d4a7519866d
The jump was taken from Savannah Ivanov, and Goof's bunny jumping.
##### Code bounty by Ezel/Improvedname
## Why It's Good For The Game
This Re-implements a old spear that got removed for its buggyness/bad
mapping and on the authors request as well not wanting to deal with it.
Re-introduces the SkyBulge as a space ruin, referencing Dragoons from
Final Fantasy. this just like any normal spear, but using the savannah
jump mechanic, this allows you to close distances with the spear
avoiding ranged projectiles in the jump, and if you directly land on
your target you will do double the damage.
##### -Ezel/Improvedname
## Changelog
🆑 Ezel/Improvedname, Toriate, JohnFulpWillard
add: Re-added the Dragoon Tomb lair, now has a Skybulge spear and
Drachen armor.
balance: Ice whelps now spit out cold fire.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
If you have a human skin suit equipped, with its hood up, the health
analyzer will report you are a `"Human"`

It's the perfect disguise for alien species
🆑 Melbert
add: Human skin suit may trick the health analyzer... sort of
fix: Human skin suit no longer gives a useless action
/🆑
in the colossus fight, adds 1 second of delay between the telegraph
"Perish." and the actual attack, because it's currently nearly
impossible to react in time if you're within melee range, specially in
high ping
## About The Pull Request
If you have a human skin suit equipped, with its hood up, the health
analyzer will report you are a `"Human"`

## Why It's Good For The Game
It's the perfect disguise for alien species
## Changelog
🆑 Melbert
add: Human skin suit may trick the health analyzer... sort of
fix: Human skin suit no longer gives a useless action
/🆑
in the colossus fight, adds 1 second of delay between the telegraph
"Perish." and the actual attack, because it's currently nearly
impossible to react in time if you're within melee range, specially in
high ping
## About The Pull Request
This PR tackles our piss-poor item action handling. Currently in order
to make an item only have actions when its equipped to a certain slot
you need to override a proc, which I've changed by introducing an
action_slots variable. I've also cleaned up a ton of action code, and
most importantly moved a lot of Trigger effects on items to do_effect,
which allows actions to not call ui_action_click or attack_self on an
item without bypassing IsAvailible and comsigs that parent Trigger has.
This resolves issues like jump boots being usable from your hands, HUDs
being toggleable out of your pockets, etc. Also moved a few actions from
relying on attack_self to individual handling on their side.
This also stops welding masks/hardhats from showing their action while
you hold them, this part of the change is just something I thought
didn't make much sense - you can use their action by using them in-hand,
and flickering on your action bar can be annoying when reshuffling your
backpack.
Closes#89653
## Why It's Good For The Game
Makes action handling significantly less ass, allows us to avoid code
like this
```js
/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/halt))
halt()
else
adjust_visor(user)
```
## About The Pull Request
Hitscan projectiles that run out of dedicated tick time before they hit
anything abort their movement, ensuring that firing an emitter beam into
space won't cause horrible lag. However, most hitscans also have icons
and have visible (albeit unanimated) movement in such a case, making it
look like projectile code is exploding as tracers appear only after a
rather visible and tangible projectile hits its target.
This PR resolves the issue by making hitscans "chunk" their trails in
such cases, ensuring that they always look like actual hitscans. Video
below has an artificial speed cap on hitscans, to showcase how it'd look
during extreme lag.
https://github.com/user-attachments/assets/eeac034d-d08e-45b0-b7d2-8589376f1c7d
Also some minor hitscan code improvements because I can.
## Changelog
🆑
fix: Hitscan projectiles like emitter beams should look less weird
during extreme lag spikes
/🆑
## About The Pull Request
This PR tackles our piss-poor item action handling. Currently in order
to make an item only have actions when its equipped to a certain slot
you need to override a proc, which I've changed by introducing an
action_slots variable. I've also cleaned up a ton of action code, and
most importantly moved a lot of Trigger effects on items to do_effect,
which allows actions to not call ui_action_click or attack_self on an
item without bypassing IsAvailible and comsigs that parent Trigger has.
This resolves issues like jump boots being usable from your hands, HUDs
being toggleable out of your pockets, etc. Also moved a few actions from
relying on attack_self to individual handling on their side.
This also stops welding masks/hardhats from showing their action while
you hold them, this part of the change is just something I thought
didn't make much sense - you can use their action by using them in-hand,
and flickering on your action bar can be annoying when reshuffling your
backpack.
Closes#89653
## Why It's Good For The Game
Makes action handling significantly less ass, allows us to avoid code
like this
```js
/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/halt))
halt()
else
adjust_visor(user)
```
## About The Pull Request
Hitscan projectiles that run out of dedicated tick time before they hit
anything abort their movement, ensuring that firing an emitter beam into
space won't cause horrible lag. However, most hitscans also have icons
and have visible (albeit unanimated) movement in such a case, making it
look like projectile code is exploding as tracers appear only after a
rather visible and tangible projectile hits its target.
This PR resolves the issue by making hitscans "chunk" their trails in
such cases, ensuring that they always look like actual hitscans. Video
below has an artificial speed cap on hitscans, to showcase how it'd look
during extreme lag.
https://github.com/user-attachments/assets/eeac034d-d08e-45b0-b7d2-8589376f1c7d
Also some minor hitscan code improvements because I can.
## Changelog
🆑
fix: Hitscan projectiles like emitter beams should look less weird
during extreme lag spikes
/🆑
## About The Pull Request
Commit messages should be descriptive of all changes.
The "incorrect `\The` macro capitalization" was intentional when it was
added, but as far as I know TG says "the supermatter" rather than "The
Supermatter," so it's incorrect now.
This is completely untested. I don't even know how you'd go about
testing this, it's just a fuckton of strings.
Someday I want to extract them and run NLP on it to catch grammar
problems...
## Why It's Good For The Game
Basic grammar pass for name strings. Should make `\the` work better and
avoid cases like `the John Smith`.
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
Fixes#89060 and a few other inconsistencies that I think aren't
reported yet. In particular, these are:
- Ordering the Stargazer to attack a window, machinery, and essentially
anything that isn't a wall or person will result in refusal. This
behavior was different.
- The spell to remotely command the Stargazer doesn't work.
- The shift-hover radial menu is weirdly offset.
I'm still trying to figure out what makes the mob not attack windows
unlike before, so I'll set it as a draft until I fix it.
## Why It's Good For The Game
Summoning an elder god bound to your will would be even better if it was
actually bound to your will.
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑
fix: The Stargazer, a cosmic heretic's ascension, can be properly
commanded once more.
code: Basic mob pets can now target objects, or objects and walls by
using two new targeting strategies.
/🆑
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
## About The Pull Request
Adds a new area flag, LOCAL_TELEPORT.
This flag allows teleports ONLY in the same area that the teleport is
used. This allows for short range hijinks without enabling long range
exploits, and thus it's given to DMs and domains.
Changed almost all area_flags & NO_TELEPORT checks to use
check_teleport() (as now areas may use local_teleport instead, and this
lets them check for multiple things instead)
Thus I re-added Void Phase to the heretic scribe in DM and shuffled some
stuff around
(realizing now i neglected to doublecheck if blade breaking tps you to
station. need to check just in case)
## Why It's Good For The Game
It sucks you can't use teleporting abilities in temporary areas, so this
is a good way to allow this to still happen without opening the way for
gamebreaking exploits.
## Changelog
🆑
code: Adds a new area flag, LOCAL_TELEPORT, given to virtual domains and
deathmatch arenas.
code: Re-added Void Phase to Heretic Scribes in Deathmatch's Ragnarok
map.
/🆑
## About The Pull Request
SPEEDMERGE FROM UPSTREAM TG
This PR reduces the cooldown on selecting which spell to cast using
hotkeys. This is because hotkeys have a different cooldown than using
your mouse to click the icons. I do not think there should be a reason
for using hotkeys to do the same thing as clicking to be clunky to the
point shown in videos below.
## Why It's Good For the game
Previous
https://github.com/user-attachments/assets/91814a17-c753-4c4b-b5cc-68e1be5528ac
Introduced here
https://github.com/user-attachments/assets/d9db3834-fc56-4a77-b4ef-4948c72b3334
Less clunky, easier to chain abilities. **It works on every single ui
button, not just spells btw. So modsuit modules that require targetting,
pretty much everything.**
(Huge thanks to ArturLang for the help with this)
## Changelog
🆑
qol: Selecting which spells to cast with hotkeys, and using them in
general is faster.
/🆑
Renames all uses of caller, as they (currently) shadow the new byond var
and will in future error
Ups our "wan if compiled after" experiement compile version to 516
Adds an alternate 516 unit test
## About The Pull Request
This is very ugly but we're trading in-loop angle setting/refreshing and
animates in favor of out-loop ones, doing so should cut down on the
amount of animates we're calling which are all sent to clients which
ramps up their ping into thousands and lags them clientside to all hell.
I've also significantly (x3) increased the delay between shots, since
they move so slow the distance between them won't get large enough for
you to squeeze through in a tiny arena, which should also help with lag
massively.
Ideally we should get rid of projectiles here and make it use some other
way, maybe dust clouds?
https://github.com/user-attachments/assets/0480cd3a-4e82-4d80-833c-a2ca4eefed53
Downside of this approach: the attack now looks significantly jankier
The upside of this approach: You can somewhat clearly see which tile the
projectile is on
## Why It's Good For The Game
It lags everyone who sees it
Closes#88395
## Changelog
🆑
fix: Made wendigo's bullet hell lag less, at cost of its visuals.
/🆑
## About The Pull Request
~~Kept you waitin huh!~~
The projectile refactor is finally here, 4 years later. This PR (almost)
completely rewrites projectile logic to be more maintainable and
performant.
### Key changes:
* Instead of moving by a fixed amount of pixels, potentially skipping
tile corners and being performance-heavy, projectiles now use
raymarching in order to teleport through tiles and only visually animate
themselves. This allows us to do custom per-projectile animations and
makes the code much more reliable, sane and maintainable. You (did not)
serve us well, pixel_move.
* Speed variable now measures how many tiles (if SSprojectiles has
default values) a projectile passes in a tick instead of being a magical
Kevinz Unit™️ coefficient. pixel_speed_multiplier has been retired
because it never had a right to exist in the first place. __This means
that downstreams will need to set all of their custom projectiles' speed
values to ``pixel_speed_multiplier / speed``__ in order to prevent
projectiles from inverting their speed.
* Hitscans no longer operate with spartial vectors and instead only
store key points in which the projectile impacted something or changed
its angle. This should similarly make the code much easier to work with,
as well as fixing some visual jank due to incorrect calculations.
* Projectiles only delete themselves the ***next*** tick after impacting
something or reaching their maximum range. Doing so allows them to
finish their impact animation and hide themselves between ticks via
animation chains. This means that projectiles no longer disappear ~a
tile before hitting their target, and that we can finally make impact
markers be consistent with where the projectile actually landed instead
of being entirely random.
<details>
<summary>Here is an example of how this affects our slowest-moving
projectile: Magic Missiles.</summary>
Before:
https://github.com/user-attachments/assets/06b3a980-4701-4aeb-aa3e-e21cd056020e
After:
https://github.com/user-attachments/assets/abe8ed5c-4b81-4120-8d2f-cf16ff5be915
</details>
<details>
<summary>And here is a much faster, and currently jankier, disabler
SMG.</summary>
Before:
https://github.com/user-attachments/assets/2d84aef1-0c83-44ef-a698-8ec716587348
After:
https://github.com/user-attachments/assets/2e7c1336-f611-404f-b3ff-87433398d238
</details>
### But how will this affect the ~~trout population~~ gameplay?
Beyond improved visuals, smoother movement and a few minor bugfixes,
this should not have a major gameplay impact. If something changed its
behavior in an unexpected way or started looking odd, please make an
issue report.
Projectile impacts should now be consistent with their visual position,
so hitting and dodging shots should be slightly easier and more
intuitive.
This PR should be testmerged extensively due to the amount of changes it
brings and considerable difficulty in reviewing them. Please contact me
to ensure its good to merge.
Closes#71822Closes#78547Closes#78871Closes#83901Closes#87802Closes#88073
## Why It's Good For The Game
Our core projectile code is an ungodly abomination that nobody except
me, Kapu and Potato dared to poke in the past months (potentially
longer). It is laggy, overcomplicated and absolutely unmaintaineable -
while a lot of decisions made sense 4 years ago when we were attempting
to introduce pixel movement, nowadays they are only acting as major
roadblocks for any contributor who is attempting to make projectile
behavior that differs from normal in any way.
Huge thanks to Kapu and Potato (Lemon) on the discord for providing
insights, ideas and advice throughout the past months regarding
potential improvements to projectile code, almost all of which made it
in.
## Changelog
🆑
qol: Projectiles now visually impact their targets instead of
disappearing about a tile short of it.
fix: Fixed multiple minor issues with projectile behavior
refactor: Completely rewrote almost all of our projectile code - if
anything broke or started looking/behaving oddly, make an issue report!
/🆑
## About The Pull Request
this was changed a few weeks back but wasnt actually intentional.
## Why It's Good For The Game
fixes ashdrake arena attack not clearing out lavaland walls
## Changelog
🆑
fix: fixes ashdrake arena attack not clearing out lavaland walls
/🆑
## About The Pull Request
Does as the title says, cleans up the code a bit and modernizes it, as
well as making it call its parent.
## Why It's Good For The Game
It's more readable this way, plus it properly calls its parent proc now.
## About The Pull Request
Does as the title says, cleans up the code a bit and modernizes it, as
well as making it call its parent.
## Why It's Good For The Game
It's more readable this way, plus it properly calls its parent proc now.