Commit Graph

4108 Commits

Author SHA1 Message Date
SmArtKar
64cf28cc4f Adds bodypart visuals for different implants, improves eye color/blinking handling (#90010)
## About The Pull Request

Added visual overlays for all arm implants, HUD implants (not the
headrev one), internal thrusters, breathing tube, nutriment pumps and
reviver implant.


![dreamseeker_wd79oYLszL](https://github.com/user-attachments/assets/76582c23-8639-4261-8414-622a0419dc5b)

![dreamseeker_MnlpCHD0nQ](https://github.com/user-attachments/assets/c4692105-0435-401b-aa30-66a33a813fc4)

![dreamseeker_nLJrSPGC63](https://github.com/user-attachments/assets/5b43a1a6-45d6-454e-9348-c119db3cfb43)

Additionally, added a wrapper for eye color setting which solves the
issue where non-pref sourced eyecolors got reset after changing them,
and changed how blinking works so now update_body calls don't force you
to blink.

## Why It's Good For The Game

Gives you incredible drip (which makes augments feel more impactful) and
allows others to see if you have certain important augments (reviver)
that could matter.
As for technical changes, both were required for this to HUDs to work
nicely and fix some bugs as a side effect.

## Changelog
🆑
add: Certain implants now have visuals when implanted
fix: You no longer blink when you adjust your clothing
fix: Fixed an issue where some NPC/midround humans would not get their
eye color set correctly
/🆑
2025-03-17 19:09:55 +01:00
MrMelbert
5d3519b9cf Adds Dustself, dust smite, divine smites (#89973)
## About The Pull Request

- Adds `dustself` admin verb

- Adds Dust admin smite 
   - Does what it says on the tin

- Adds Divine smites
- Variations of smites that come with the prayer sound and special
effects - so you can get the message across that this is a punishment
from god.


https://github.com/user-attachments/assets/1cf89ece-3e89-4135-a984-79ca10c278a6

## Why It's Good For The Game

- Request. Parity for `gibself`
- Request. Parity with "Gib"
- Request. Someone wanted to add some more flair to smites so I obliged.

## Changelog

🆑 Melbert
admin: Adds "Dustself"
admin: Adds "Dust" smite. Does what it says on the tin
admin: Adds "Divine" smites. They are variations of normal smites themed
around divine intervention.
/🆑
2025-03-17 14:23:46 +01:00
DATA
e4682c04a4 Adds a new smite: Retcon, also refactors the temporary_atom component into an atom level proc (#90016)
## About The Pull Request

Adds a new Retcon smite, it makes the person fade out into nothingness
with a configurable timer, deletes their records and reopens their job
slot, as if they were never there at all.

I was also annoyed that to play around with temporary_atom I had to
slowy add a component, and it doesn't really have much of a reason to BE
a component, so I refactored it into an atom level proc called
fade_into_nothing

## Why It's Good For The Game

The smite is useful for when you wanna get rid of someone who had to
leave roundstart and whatnot, on top of just being funny. the refactor
is also good because i can now put that proc on build mode and go to
town.

## Changelog

🆑
add: Added new mechanics or gameplay changes
add: Added more things
del: Removed old things
qol: made something easier to use
balance: rebalanced something
fix: fixed a few things
sound: added/modified/removed audio or sound effects
image: added/modified/removed some icons or images
map: added/modified/removed map content
spellcheck: fixed a few typos
code: changed some code
refactor: refactored some code
config: changed some config setting
admin: messed with admin stuff
server: something server ops should know
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2025-03-12 22:26:06 -04:00
Kashargul
dfa7f2bb62 some more 516 compat fixes (#89766)
Ports the helpers from
https://github.com/BeeStation/BeeStation-Hornet/pull/12240

This should fix some more of the 516 issues that I've seen while giving
a quick check through the code

The remaining browse should work now.

Also fixing another sass warning while being on it.

## About The Pull Request
## Why It's Good For The Game
## Changelog
🆑
fix: tgui say 516 will no longer change channels when the button is used
to drag it
fix: tgui say 516 will no longer leak radio messages into the wrong
channel
fix: runechat flickering when faded up messages fade out
/🆑
2025-03-03 15:15:07 +01:00
itsmeow
cc335e7e9e IconForge: rust-g Spritesheet Generation (#89478)
## 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


![image](https://github.com/user-attachments/assets/53bd2b44-9bb5-42d2-b33f-093651edebc0)

### 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.


![image](https://github.com/user-attachments/assets/3efa71ab-972b-4f5a-acab-0892496ef999)

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


![image](https://github.com/user-attachments/assets/9ad8ceee-7bd6-4c48-b5f3-006520f527ef)

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


![image](https://github.com/user-attachments/assets/e6892c28-8c31-4af5-96d4-501e966d0ce9)

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

**Before**


![image](https://github.com/user-attachments/assets/cbd65787-42ba-4278-a45c-bd3d538da986)

**After**


![image](https://github.com/user-attachments/assets/d750899a-bd07-4b57-80fb-420fcc0ae416)

## 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
/🆑
2025-03-03 14:58:27 +01:00
TiviPlus
7467212567 Clean up some cruft in mass var edit (#89548)
## About The Pull Request
just cleaning out the cobwebs

Mixed usr/src, using set on a proc /datum/o
casting atom but taking datums

## Changelog
🆑
code: cleaned up some mass var edit code
/🆑

---------

Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com>
2025-02-28 17:43:39 +01:00
Kapu1178
a0e862d575 Base implementation of /datum/persistent_client (#89449)
## 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.
2025-02-25 13:52:24 -06:00
SmArtKar
cf27074ee5 Fixes runtimes in Spawn Debug Full Crew, makes the warning clearer (#89601)
## About The Pull Request

Mobs without clients or prefs now get default values instead of informed
default values, preventing runtimes in Spawn Debug Full Crew. Also made
the ***second*** warning much clearer and only appear when the user
isn't localhost, similarly to Start Now.

Totally not related to a recent incident on live servers, nope. Surely
not.

## Changelog
🆑
fix: Spawn Debug Full Crew no longer runtimes
admin: Spawn Debug Full Crew now explicitly warns you a second time if
you're attempting to use it as a non-localhost user.
/🆑
2025-02-22 11:19:42 -05:00
MrMelbert
b4e4db72d1 Adds a very simple admin verb to view everything in the policy json (#89541)
## About The Pull Request

Adds `Policy Panel` admin verb. It opens up a very plain, very simple
tgui that shows you a dropdown of all `policy.json` entries, allowing
you to refer to them if necessary.

There's also a search bar.


![image](https://github.com/user-attachments/assets/11e5c4b1-815b-488d-8566-943145c2d64c)

## Why It's Good For The Game

Half request, half something I thought would be useful.

While admins could VV into config and find the `policy.json`, they
generally appreciate something more user-facing.

## Changelog

🆑 Melbert
admin: Adds the Policy Panel verb, which shows you all the policy the
server has set.
/🆑
2025-02-21 17:05:54 -07:00
Jackraxxus
0ec9ab3a17 Adds a Config for Auto-Deadminning on Ready Up and Latejoining (#89522)
## About The Pull Request
Fixes #89458
Adds a config for auto-deadminning admins who ready up before the round
starts, or click join game after.
The deadminning happens as soon as the button is pressed, not when a job
is selected or the round starts. I figure it's better to do it straight
away since both have opportunities for metainfo to be posted in admin
chat. Before there's admins messing with dynamic config / plotting
events etc. and during the round there's basically everything that gets
posted to admin logs.

I've had to add a typecheck to the auto_deadmin proc, since the lobby
menu technically happens on the centcom Z-level, and there's a pref for
ignoring deadminning on centcom Z, so it checks to see if the admin is a
new player mob.

Changed the old config from auto_deadmin_player to auto_deadmin_always
to make it less deceptive.
Was suggested a pref could be added to do this. I can do that if people
want it maybe, but it's not in this PR at the time of posting it.

Is now a pref
<img src="https://i.ibb.co/211sBMYd/Deadmin-Prefs1.png">
<img src="https://i.ibb.co/r20Srbw4/Deadmin-Prefs2.png">

I dunno if the latejoin proccall is in the right spot in the click
sequence thing I can move it if people want.
## Why It's Good For The Game

Admins spawning themselves on station is very important for both
shenanigans and troubleshooting. It's annoying to have to click readmin
every time and I'm too lazy to figure out how to perms escalate my way
into disabling that config every round (Though I have tried).

This PR is marginally more likely to convince Timber to turn that off
than cussing him out in adminbus.
## Changelog
🆑
admin: Added a new config to force admins to deadmin when readying up or
latejoining the round.
/🆑
2025-02-21 18:54:05 +00:00
Jacquerel
d26e197f11 Some Loadout Additions (#89500) 2025-02-21 16:48:06 +01:00
TiviPlus
70f3bac7dc Delete empty file (#89546)
## About The Pull Request

Delete empty file
## Why It's Good For The Game
Delete empty file

## Changelog

Delete empty file

Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com>
2025-02-19 21:32:00 -05:00
LT3
9a14e4dcb9 Fix map vote revert, add admin verb (#89505)
## About The Pull Request

Fixes revert_next_map() not actually reverting the map vote. Also added
an admin verb for it for ease of access.

## Why It's Good For The Game

Fix bug, revert map vote without having to poke around in the subsystem.

## Changelog

🆑 LT3
fix: Revert next map command actually reverts the map vote
admin: Admins now have a verb to revert the map vote
/🆑
2025-02-18 09:15:36 +13:00
Lucy
d656f0f4ec Refactor GLOB.admin/debug/fun_state into cached /datum/ui_state/admin_state instances (#89417)
## About The Pull Request

So, some admin verbs/tools that used tguis, i.e edit/debug planes, were
available to admins with +DEBUG... but the ui_state used
`GLOB.admin_state`, which checks for +ADMIN - meaning that if they
_only_ had +DEBUG, they would have the verb... but it would do nothing
when they used it.

I've refactored `GLOB.admin_state`, `GLOB.debug_state`, and
`GLOB.fun_state` into a merged `/datum/ui_state/admin_state`, with a var
for which specific permissions are being checked for.

You now use the `ADMIN_STATE(perms)` macro to get the UI state for those
specific perms, i.e `admin_state(R_ADMIN)` or `admin_state(R_DEBUG)`,
and the resulting UI state will check for _those specific perms_.

These are initialized and cached in `GLOB.admin_states` (which should
never be directly accessed).

So, I've went thru every single usage of `GLOB.admin_state`,
`GLOB.fun_state`, and `GLOB.debug_state`, and made them all use
`ADMIN_STATE()` with the actual permission flags needed to use said UI
in the first place.

## Why It's Good For The Game

Kinda dumb for specific admin permissions to be granted verbs that don't
let them use it anyways.

## Changelog
🆑
admin: Certain UI-based tools (plane debugger, filter editor, etc) that
were given to admins with only +VAREDIT or +DEBUG, but refused to open
without +ADMIN, now actually work for admins that have the needed
permission.
/🆑
2025-02-17 00:54:00 +01:00
RengaN02
44d991b526 Sound Mixer Part 2 (#89251)
## About The Pull Request
Part 1 by grungussuss: https://github.com/tgstation/tgstation/pull/87529


![image](https://github.com/user-attachments/assets/7711dbe1-4a70-4cd4-9d82-8eb3fb60c9e9)
## Why It's Good For The Game

gives players more control over how loud they want certain sounds to be
## Changelog
🆑 Rengan
sound: the volume that vox, admin sound, insturments play at can now be
tweaked in preferences, check your preferences!
sound: Elevator now uses ambience volume preference, jukeboxes uses
instrument volume preference and end of round musics uses admin music
volume preference.
/🆑
2025-02-17 00:25:56 +01:00
SmArtKar
edebc45e22 Fixes map votes not refreshing the amount of possible choices (#89404)
## About The Pull Request
Closes #89235

## Changelog
🆑
fix: Fixed map votes not refreshing the amount of possible choices
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-02-16 11:29:00 +00:00
GwynCodes
a6e2b96ca7 Creates a "Secrets" panel button for debugging cargo orders (#89469)
## About The Pull Request

-Creates a new button in the "Secrets" menu that can override the
cooldown for ordering items from department consoles. It can be used to
make the cooldown longer, shorter or non-existent.
-Creates a new global var to manage this override on every console in
dept_order.dm

## Why It's Good For The Game
This tool assists in finding and fixing bugs related to cargo orders and
cargo crates. The wait time for these cooldowns can be ten minutes or
longer, and this speeds up the process significantly.

It could also be used by admins during play to make the cooldown lower,
or cause absolute mayhem on cargo by setting the cooldown duration to 0.

## Changelog
🆑
add: Added a button in the "Secrets" menu to alter the department
console order delay.
qol: Button makes it easier to find cargo related bugs.
code: Changed code in department_order.dm to allow for overriding the
order cooldown duration.
admin: Created an admin button in the "Secrets" panel.
/🆑

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
2025-02-14 20:14:04 -05:00
Jacquerel
d7264ce0f3 Admin verb to apply mob random speech behaviour (#89382)
## About The Pull Request

Separate verb and PR from #89375 because this is something you'd apply
on top of a mob with existing behaviour, or one you've used the other
verb on.
This will probably conflict with my other PR but that's my problem.

This adds a shortcut for making mobs say/emote stuff randomly on a timer
from a list of things you have specified.
Doing this via VV is possible but sufficiently complicated that I don't
think anyone would ever bother.
As with the other PR you can optionally do this to mobs who already have
a client if you want them to randomly burp every so often or something.

I briefly flirted with the idea of replacing all
`/datum/ai_planning_subtree/random_speech` subtypes with blackboard ones
but... I think probably actually we save some memory _and_ sanity by not
doing that.
A bunch of mobs on totally different typepaths use the `/insect` subtype
for instance, and I don't think it would be an improvement to paste the
same four vars into all of their blackboards.

## Why It's Good For The Game

This one is frankly more niche than the other PR probably but it is
plausibly useful if you are setting up some kind of VV creature.
2025-02-14 14:06:27 -06:00
Jacquerel
23ac16411d Removes Secondary & Final Objectives from Traitors (#89466)
## About The Pull Request


![image](https://github.com/user-attachments/assets/cb0bffb3-33be-4fb1-baec-a4d0f4a4cd57)
Pre-discussed with @Watermelon914, this PR removes Secondary & Final
Objectives from all Traitors, rather than just midround ones. It also
removes all of the surrounding supporting code.
Randomly assigned Primary Objectives still exist, I just used the
ability to rewrite mine to take the screenshot.

In terms of final objectives, the surrounding items that were available
still exist but don't necessarily have sources.
If anyone has good ideas for readding these in some other form it can be
done in future PRs.

It also allows all traitors to buy the Contractor kit, previously
limited to midround traitors which lacked secondary objectives, because
now all traitors lack secondary objectives.

This essentially limits all traitors to a maximum of 20 TC (16 if they
spawn with an uplink implant). Currently I don't foresee that they
strictly need any additional way of gaining TC during a round as 20 is
quite sufficient, but it may take some time to adjust and get used to it
after such a long time of having access to more. If we need to adjust
the starting value or add a slow drip of more points over time or
something, that can be done in followup PRs.

This also removes the ability to recreate your uplink added by my
beautiful wife in #74315
This was part of the progression traitor design document, but ultimately
probably a bad idea as it essentially made traitors impossible to
properly disarm. You will once more just need to carefully protect your
uplink.

**This does not remove the threat/progression system**. 
Like midround traitors, all Reputation requirements on gear are now
simple timelocks, most of which will have elapsed by the time 30 minutes
have passed.

**Finally** this PR also adds Romerol to the traitor uplink for 25 TC
and 30 minutes of reputation, as a treat (and because I removed the
final objective that previously granted it).

## Why It's Good For The Game

We've tried this system for a long time (3 years last month!) and while
I think it had a lot of promise, enabled some cool moments, and also
solved several of the problems it set out to solve, overall I think some
of the behaviours it has encouraged in players have been overall
negative for the game.
While the _game systems_ are fine, even quite fun and cool (especially
final objectives) I am of the opinion that having them in the game
creates a net negative purely in the way that they react with players'
_brains_, creating incentives towards behaviour we don't actually want
people to pursue.

While it's hard-to-impossible to prove any of this with hard data, there
has been a prevailing feeling for some time among many (though certainly
not all) people that the simple fact of _having_ a constant drip-feed of
objective available to players leads directly to less interesting
antagonist play. While certainly nobody is _forced_ to do secondary
objectives you are directly and quite strongly rewarded for doing so,
doing so efficiently, and doing so in a way which makes sure that nobody
(alive) sees you do it. This leads to a tendency to play defensively and
try to maximise the number of tasks you can complete in one round, which
also has a knock-on effect of generally minimising the number of people
you attempt to interact with in a round (unless you are killing them).

Even people who _intend_ on doing some more interesting gimmick can fall
into this trap, as "having more tools" is always useful for anyone who
is intending on any kind of plan at all, but then executing on the
secondary objectives again incentivises you to lay low, not interact
with anyone, be efficient, and then reduces the time you are spending
doing the thing that's your actual plan for the round. Removing the
ever-present temptation to fish for extra TC leaves "doing whatever your
actual plan is" as the sole thing to optimise.

Final Objectives too have created unfortunate psychological effects
between crewsided players and other antagonists. Because of the _threat_
(no matter how remote, Final Objectives have always been tuned to be
appropriately rare) that leaving any antagonist alone will cause them to
snowball by acquiring more power, it starts to feel foolish to respond
to any threat with less than the maximum possible level of force even if
they seem relatively innocuous in the moment. This even has an effect on
other non-progression antagonists, as traitors are the most common
antagonist type and how people treat them is going to be their default
level of reaction to most other station threats.

While there has always been the promise of expanding the system with
novel and exciting objectives that leverage appearing mid-round to do
something unique, we've taken very little advantage of that over time.
Most objectives we have added that didn't boil down to "kill someone,
with a twist" have been somewhat unsuccessful, serving either as ways to
get yourself arrested and killed for no reason or ways to get free
telecrystals by doing something the crew don't really care about
stopping you from doing. The option still exists to add more roundstart
objectives to traitors, if someone suddenly has a great idea that would
fit in this space.

The ideal outcome of making this change is a slight relaxation of crew
attitude towards feeling like their only option after catching an
antagonist that isn't sandbagging is to permanently remove them from the
round (although it's fine to do this still in many scenarios), and a
broadening of traitorous activity which is not purely focused on
collecting as many checkboxes as possible and might give people more
time to roleplay with other players, not worrying that this time could
have been more efficiently spent pursuing a different secondary goal.
I don't anticipate or desire that this will prevent traitors from
killing anyone (or even stop them from killing people they don't have a
specific objective to kill), I just want to remove the FOMO from
people's minds.

Also this gives us something to talk about at the coder townhall meeting
on the 22nd.

## Changelog

🆑
del: Misplaced or stolen traitor uplinks can no longer be recreated
using a radio code and special device, guard yours carefully or buy a
backup implant.
del: Roundstart traitors can no longer take on additional objectives in
order to earn additional Telecrystals and fast-forward any unlock timers
on items. They also cannot earn the ability to complete a Final
Objective.
balance: Roundstart traitors can now buy the Contractor Kit from their
traitor uplink, rather than only midround traitors.
add: Traitors can buy Romerol for 25 TC, after 30 minutes of time has
passed in a round.
/🆑
2025-02-14 12:46:56 +00:00
John Willard
4196da874f Fixes tgui alert in reload config never returning (#89397)
## About The Pull Request

I was just clicking random buttons and noticed this would always pass
even when I said no or closed the alert.

## Why It's Good For The Game

Let me back out of doing things to the server

## Changelog

🆑
admin: Reload Configuration can be cancelled via the alert it gives you.
/🆑
2025-02-12 17:10:23 -07:00
Jacquerel
f1d3994c95 Apply AI Controller Admin Verb (#89375)
## About The Pull Request

Melbert asked me to make this and I thought it'd be relatively easy and
plausibly useful so I did.

This PR adds a feature to the VV menu for mobs which allows you to apply
and configure an AI controller from a list of templates.
It's not as versatile as coding one would be, but it should be able to
accomodate a lot of generic scenarios.

Some examples of basic stuff you can set it up to do:
- Give Ian a machine gun he will fire at nearby people while staying
within a specified min/max range.
- Have Poly fire brimstone beams on cooldown at whoever is nearby
(although she won't bother trying to line up cardinally).
- Assign a gorilla to be someone's personal bodyguard which will follow
them around and attack anyone who hurts them.

I have also made an executive decision to remove the restriction that
basic ai controllers can only be placed on basic mobs.
We've removed _most_ non-basic simple mobs from the game, and also have
more recently updated most AI behaviours to work agnostically of whether
they are assigned to a basic mob or not... which means that they'll
largely work on carbons.

Coincidentally, this feature makes sure to ask if you want an AI
controller to remain active on a mob which already has a client.
Assigning an active AI controller to a live player which forces their
character to automatically attempt to run away from whoever the last
person to attack them was is ~~not recommended behaviour because it's
largely untested~~ highly recommended behaviour because I think it's
very funny (makes it very hard to play though).

I'm gonna do another PR some time which cleans up `random_speech` so
it's configurable and then let you slap that on whoever as well.

## Why It's Good For The Game

Enables a greater level of admin abuse.

## Changelog

🆑
admin: Added easier tooling for admins to add or change the AI
controllers on mobs
/🆑
2025-02-12 17:09:48 -07:00
John Willard
390c925352 Makes some admin panels use browser (#89398)
## About The Pull Request

del() log, radio log, check antagonists, law/dna/fingerprint logs all
use browser instead, which means darkmode, wahoo


![image](https://github.com/user-attachments/assets/efd968cf-9182-4e65-a4f0-2edb3431827a)

![image](https://github.com/user-attachments/assets/2bfd6ad2-42f0-4e42-8ad7-63821b31f021)

![image](https://github.com/user-attachments/assets/4a8f13e4-8e81-43cc-b00c-aecf033c9947)

The only difference now is that they are in darkmode, really.
Also removed browse calls to pipe dispensers (the machine) and windoor
assembly, as they both use TGUI now so these don't do anything.
Lastly, adds an early return to the tram admin tool if you don't select
a tram, cause I found it annoying.

## Why It's Good For The Game

Try to use old admin tools, get flashbanged

## Changelog

🆑
admin: Check antagonists & del/law/dna/fingerprint/radio log panels use
browsers which means they have darkmode. Also the tram panel will cancel
out if you click cancel.
/🆑
2025-02-12 17:09:33 -07:00
Lucy
348413a8a6 Add a DISABLE_DREAMLUAU define, for disabling dreamluau at compile-time (#89359)
## About The Pull Request

this adds a new define, `DISABLE_DREAMLUAU` (commented out by default),
which does... exactly what it says on the tin. it fully disables any
dreamluau-related code (the "Open Lua Editor" admin verb is left in,
albeit just giving the user a warning saying Lua is disabled, just so
there's no confusion about the verb itself being missing)

when compiling with OpenDream outside of CI (so dreamluau code will
still be linted), `DISABLE_DREAMLUAU` will be defined by default, tho.

## Why It's Good For The Game

makes OpenDream testing easier

## Changelog

no user-facing changes. or even code changes for most cases.
2025-02-06 02:27:55 +01:00
MichiRecRoom
344d3b6266 Optimizes /proc/icon_exists() (#89357)
## About The Pull Request
This PR reimplements https://github.com/tgstation/tgstation/pull/71538
atop `master`. Quoting the original PR:

> Every `icon_exists()` call will cache the entire file. Past me didn't
realise _why_ file opts were so expensive, but I do now. This is
immeasurably slower on a single call, and _significantly_ faster on
subsequent calls to the same file.

I attempted to handle some of the review comments that were posted
there, by splitting screaming functionality into its own proc.

* `if(icon_state in icon_states(file))` and `if(!(icon_state in
icon_states(file)))` were refactored to use `icon_exists(file,
icon_state)`.
* Where screaming was seemingly wanted (and where there wasn't a more
descriptive error inside the `if` block), I refactored them to use
`icon_exists_or_scream(file, icon_state)`
* The exception to the above was under
`/datum/unit_test/turf_icons/Run()` and
`/datum/unit_test/worn_icons/Run()`, where `icon_states()` was being
passed a mode flag. Given that this is only used in unit tests (where
performance isn't a priority), I opted to leave these be.

Additionally, I revised the documentation comment for
`/proc/icon_exists()`, as I felt it was a bit vague currently.

## Why It's Good For The Game
https://youtu.be/Z9G1Mf6TZRs

## Changelog
No player-facing changes (hopefully).

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
2025-02-05 20:00:27 +01:00
Holoo
498665f0f4 Fixes broken shadows on 516 (#89280)
## About The Pull Request
Bandaid fix of broken shadows on 516. 
Renamed refresh button to rebuild for consistency in plane debugger
(Edit/Dubug-Planes).
Rebuild now also reapplies parallax, so it will not be turned off after
rebuild.
Closes #89230 
## Why It's Good For The Game
faster 516 adoption
## Changelog
🆑
fix: fixed shadows on 516
/🆑
2025-01-30 13:22:07 +01:00
Penelope Haze
4c2a76ede3 Fix a large number of typos (#89254)
Fixes a very large number of typos. A few of these fixes also extend to
variable names, but only the really egregious ones like "concious".
2025-01-28 22:16:16 +01:00
carlarctg
876088b9a9 Expands (further) on Rift Fishing by adding two new fish & more (#88860)
## About The Pull Request

I swear it's the last one


![image](https://github.com/user-attachments/assets/4572975f-5621-4b1d-9cbf-a3e923eac516)

### Added two new fishes to the rift pool:

![image](https://github.com/user-attachments/assets/0688d0d3-b9a1-4a98-ad61-8e47964acbc9)
#### The __mossglob__ is the Fisherman's Bane. The apex of evil. The
be-all-end-all in fisher destruction.
It is haunted. It deals toxic damage. It throws itself around. It's
coated in a deadly and hallucinogenic compound. Its mossy coating is
slippery. It revives itself. It throws itself out of aquariums. Best of
all, it is extremely easy to catch.
How do you deal with it? Well, probably by not fishing in a portal to
hell. Otherwise... good luck?
Suiciding into it empowers it by 15% and seals you inside. JOIN THE
MOSS!



![image](https://github.com/user-attachments/assets/50fb0695-08e7-4c2e-b223-ceba27dd7ffd)
#### The __babbelfish__ is a strange sort of predator, a psychic fish.
It casts a psychic aura near itself, ~~disturbing people~~ (nvm lol the
demoralizer datum is bad), killing fish nearby and then eating their
corpses.

When it dies, it emits an awesome psychic wail, which will instantly
kill all fish in audible range and severely incapacitate psy-sensitive
humans:
I can't play the ogg here but credits to grungus for it

![image](https://github.com/user-attachments/assets/657f293a-e43f-4e4a-8366-dd8f32dbb2fa)

![image](https://github.com/user-attachments/assets/adedd978-a0ff-4521-88eb-6a232cbaa177)
There is also a secret, secondary function of the babbelfish: Splitting
one in half (a terrible idea) and shoving it inside your ears will
unlock your full psychic potential, granting you psychic resistance and
grant you the ability to either understand or speak every single
language, at a terrible cost.

#### ARMS

Failing the fishing minigame while fishing in a heretical rift will now
cause the rift to tear your arm (and its fishing rod) off your joints
and greedily slurp it up. The Mansus does not care for losers. (Getting
bored and walking away while the minigame is up also counts as failure.)

However, these missing items can, in fact, be fished back up, which also
includes arms -and- heads lost normally to the rift! Not only that, but
you're able to fish up random arms of any type, presumably from other
fools across time and space.

#### This PR probably shouldn't be merged until the bug that causes
finite fish counts to not be finite is fixed. Infinite fire sharks are
bad enough...

Added ABSTRACT flag to profound_fisher fake rod.

objectify() now works with instances of objects.

Apparently snuck in a random-ass refactor to smoker lungs.

Psychic resistance now prevents the instadeath from trying to
telekinetically grasp at a opened rift.

Hallucinogenic fish with a stinger now inject their hallucinogenic
toxins.

I woudl like to preemptively apologize to ghommie
## Why It's Good For The Game

__Mossglob__
I think the game's missing a fish that's just extremely dangerous to be
around, the piscine equivalent to radioactive waste. You can't bin or
tank it, because it flies off. You can't kill it, because it's
atmos-proof and revives itself anyway. Trying to keep it on a table to
turn into disgusting mold 'slices' is a challenge in and of itself. This
fish will (not) make people think twice about fishing in hell, and give
another reason for security and command to give PSAs to not interact
with the rifts across space and time around the station, which I think
is wonderful.

__Babbelfish__
This fish punishes sloppy fishermen who hold up their catch and then
store it inside their bag for the poor fish to slowly asphixiate to
death in. The fish griefing that will happen from it will be
_wonderful_.

The organ thing is a clear reference to HHG, but it has its own twist.
You can speak all languages, or understand all languages... but rarely
both. It'll make for some silly situations where people just 'make
strange noises' at you or try to act as translator for, say, ashwalkers
or xenomorphs while being completely clueless as to what anyone is
actually saying.

__ARMS__

Arms. Arms arms. Someone asked me if rifts let you fish up arms and i
said ___IT DOES NOW___.
## Changelog
🆑
Ghommie, carlarc, grungus
add: Added two new fish to heretic rift fishing.
add: You can now fish up arms, heads, and other items lost to heretic
rifts!
admin: objectify() now works with instances of objects. Mark a player,
then an object, and use those marks to call that global proc and you can
turn people into pre-existing items.
add: Psychic resistance now prevents the instadeath from trying to
telekinetically grasp at a opened rift.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-01-23 18:22:00 +01:00
Sefa
5840459c00 Add Space Dragon to the banning panel (#89159)
## About The Pull Request

adds Space Dragon, which is missing, to the banning panel as it should
already be there
## Why It's Good For The Game

makes it easier for admins
## Changelog
🆑
admin: added Space Dragon role to the banning panel
/🆑
2025-01-22 20:47:53 -07:00
Penelope Haze
8196190aa1 Removes a a at at be be of of and and have have (#89155)
## About The Pull Request
I just had to one-up https://github.com/tgstation/tgstation/pull/89127.

## Why It's Good For The Game
Removes a a at at be be of of and and have have

## Changelog
N/A
2025-01-22 08:09:57 +11:00
jimmyl
4b512f1239 makes mimics into basicmobs (#88910)
## About The Pull Request

mimics are basicmobs now
the only change not carried over worth mentioning is that all mimics are
a consistent speed because i cant imagine a gun or object with aimbot
going at you mach 2 would be very fun

mimic crates had some stuff changed compared to their simple animal
variant
they open and close their lid when attacking (unless locked) to be like
menacing or something like animals flash colors to ward off people
attempting to open a nonsentient hostile crate mimic will make it lock
itself (if it contains anything) and attack you

mimics are a really stupid naming for these because like
mimic crates pretend to be crates
anything else inheriting from mimics are just used to make objects alive



https://github.com/user-attachments/assets/34a733a4-45a3-409e-8a6a-b2a8c7540898



ranged mimics now use viscontents (they also keep trying to pointblank
people for some reason i think thats ok though unless its a wand of
fireball)
ranged mimic (any ranged weapon animated by a bolt of animation)


https://github.com/user-attachments/assets/c3f1d2f5-cfb8-46a9-a58c-255c53a034db



## Why It's Good For The Game
fixes #85668

## Changelog
🆑
refactor: mimics (bolt of animation, malf ai Machine Override, etc) are
basicmobs
fix: crate mimics may now be opened
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2025-01-19 21:29:49 +00:00
Josh
2252ec2eaf show admins classified reports (#89035)
## About The Pull Request

Lets other admins see what you sent in a classified command report.

![image](https://github.com/user-attachments/assets/0029ed80-5a72-4f79-8374-0f00de3acac0)


## Why It's Good For The Game

Admins can see this anyway and I've previously wanted to look this up to
see what another admin is doing.

## Changelog
🆑
admin: All admins will now see what is in a classified command report
🆑

Co-authored-by: Josh Powell <josh.powell@softwire.com>
2025-01-15 09:35:40 +01:00
The Sharkening
7e20627406 Fixes things being statistically weighted to drop in security (#88788) 2025-01-07 20:09:20 +00:00
Aylong
1795c18aea Fix a bunch of html UI's for 516 (#88917)
## About The Pull Request
Moved broken on 516 UI's to browser datum
They now work and have a dark theme
Most of them are admin ones (All except 1)

I tried to check all the raw HTML UI's by typing `<< browse(` into the
VSC search and going through each element, but I might have missed
something.

What worked as it was, I didn't touch, except for the Dynamic control
UI's

## Why It's Good For The Game
Admin can do their things on 516
Coders/Mappers can debug some stuff on 516


![image](https://github.com/user-attachments/assets/013508d1-18cc-4001-92e4-0bc554960f86)

## Changelog

🆑
fix: Admin/Debug UI's (Especially the Game Panel) now work properly on
Byond 516, instead of showing raw HTML
/🆑
2025-01-06 18:13:48 -08:00
SyncIt21
1a6a3b2e80 Makes drop_everything() actually safe (#88753) 2025-01-01 16:14:44 +01:00
Tim
f07cdf2871 Fix custom map loading ignoring JSON values (#88720)
## About The Pull Request
The map loading function was ignoring JSON values when a map's config
file was custom loaded. (things like - minetype, planetary, etc.)

To resolve this I just made the loadConfig return a json and then use
that json.

## Why It's Good For The Game
Better custom map support!

## Changelog
🆑
fix: Fix custom map loading ignoring JSON values that were ignored
previously. (minetype, planetary, etc.)
/🆑
2024-12-26 08:30:56 +01:00
John Willard
2e4d70afe5 Updates href uses for 516 (#88699)
## About The Pull Request

Was just scrolling through the Paradise github since they seem to have
more work done for 516 to see if there's anything I can port over, found
this and thought why not.

Ports parts of https://github.com/ParadiseSS13/Paradise/pull/25105
Specifically, updaing all hrefs to use the internal ``byond://``, and
adding it to grep.

## Why It's Good For The Game

More work towards 516.

## Changelog

Nothing player-facing.
2024-12-24 11:42:20 -08:00
Aylong
56e56ceac9 Implement Edge DevTools (#88679)
## About The Pull Request
Implements Edge DevTools for 516 users (coders)
Thanks to [S34N](https://github.com/ParadiseSS13/Paradise/pull/25363)

<details><summary>Images</summary>


![image](https://github.com/user-attachments/assets/9025d45a-a1be-4e95-b1ee-4adfb29d687e)

![image](https://github.com/user-attachments/assets/abe1b936-9fb5-4001-8f21-cbeeb62def45)

</details>

---------

Co-authored-by: AnturK <4047233+anturk@users.noreply.github.com>
2024-12-24 19:36:25 +00:00
Aylong
7a817300fd Improve and extend fieldset_block and examine_block (#88678)
## About The Pull Request
Maked `fieldset_block` and `examine_block` more stylish and neat, also
`fieldset_block` no longer has a centred title.
Renamed `examine_block` to `boxed_message` and adds
`custom_boxed_message` which can be colored.

- AdminPMs, admin tickets and vote results has been wrapped into
`fieldset_block` for comfort and visibility
- Health Analyzer results painted to blue
- Vote notice and tips of the round wrapped to purple
`custom_boxed_message`
- Tooltip text border color, now uses text color, not just white

## Why It's Good For The Game
Demonstration in both themes

<details><summary>Dark</summary>


![image](https://github.com/user-attachments/assets/7175379b-b053-4fb7-bd25-65c744a21c56)

![image](https://github.com/user-attachments/assets/1728e72b-0110-4b81-9d61-8779f5fdc3a0)

![image](https://github.com/user-attachments/assets/5e6f9604-35b8-4840-b6b4-35a68f49a997)

</details>

<details><summary>Light</summary>


![image](https://github.com/user-attachments/assets/6a3d693b-e0dc-4a4b-b4d7-2ded54ce0d67)

![image](https://github.com/user-attachments/assets/c4f5e089-180f-4d13-806a-fa64f01740a3)

![image](https://github.com/user-attachments/assets/a46d52c4-ad37-4637-8cae-c4b00139efc1)

</details>

## Changelog

🆑
qol: AdminPMs, admin tickets, vote results and started vote notification
are now much more visible in the chat.
qol: Boxed messages in chat (like examine), has been restyled.
/🆑
2024-12-24 11:32:38 -08:00
SmArtKar
2660e6f412 Admins can now return the shuttle back to the station without ending the round (#88521)
## About The Pull Request
Per DarkenedEarth's request on discord, adds a new Fun menu secret which
makes the shuttle go back to the station after a configurable delay with
an announcement (also configurable). After docking at the station it
behaves like BYOS (still requiring to wait for it's arrival despite it
being docked).

## Why It's Good For The Game

Admins want it to hunt early EORGers or make events or something like
that.

## Changelog
🆑
admin: Admins can now return the shuttle back to the station without
ending the round
/🆑
2024-12-22 21:01:07 -08:00
Roxy
2603a4f3ee Add reboot countdown to stat panel (#88438)
## About The Pull Request

Rewrite ticker `Reboot` proc slightly to use a timer and callback for
the delay before the reboot, tracks this timer in the stat panel for
players to see. Also adds a verb to cancel a pending reboot independent
of the delay round end verb.

## Why It's Good For The Game

It's nice to be able to see exactly how much time is left until the
server restarts, and it's even nicer to see that the round end has been
delayed when the "admin has delayed round end" message gets buried in a
fast moving chat.

## Changelog

🆑
qol: The time until the server reboots is now visible in the status tab.
admin: Added a cancel reboot verb to the server tab.
/🆑
2024-12-22 05:46:09 +01:00
Kocma-san
d69bb900c6 enhancements for fax requests in request manager (#88391)
## About The Pull Request
Addition to [#84910](https://github.com/tgstation/tgstation/pull/84910)

Added a "print" button to the request manager. It simply prints at the
centcom station the paper that was faxed to the admins.
Also added "Auto-print Faxes" button to the request manager, which
allows you to enable automatic printing of requests on the admin fax
<details>
<summary>Screenshots</summary>


![image](https://github.com/user-attachments/assets/35cbda0a-c759-4e9e-8899-8e2d81069b4c)

![image](https://github.com/user-attachments/assets/bbb918da-8b84-4a6b-a42e-c06359ab5651)

![image](https://github.com/user-attachments/assets/b380cc13-a9e2-496e-a296-60fb827c4c55)

</details>

## Why It's Good For The Game

The message in the chat may get lost. In this case, it will no longer be
possible to print the paper sent to the CC
Changing the allow_exotic_faxes variable will allow you to fax something
unusual to the station in (very rare) situations. No need to manually
change this variable
## Changelog
🆑
add: added a "print" button to the request manager
add: admin fax can now send exotic items
add: added "Auto-print Faxes" button to the request manager, which
allows you to enable automatic printing of requests on the admin fax
fix: fixed a bug where pressing the print button would cause the receive
animation to appear on all admin faxes.
/🆑
2024-12-21 21:29:13 +00:00
SyncIt21
ad4108d6f3 Adds better combined colour check for greyscale modify menu (#88598)
## About The Pull Request
- Fixes #87829

Ensures we can't enter invalid values that actually run timed in this
specific case

## Changelog
🆑
fix: greyscale modify menu has better validation for player entered
colours
/🆑
2024-12-21 22:12:32 +01:00
Kyle Spier-Swenson
28e7e68f4f Trainers can now verify admins above their weight class (#88360)
bounty pr


## About The Pull Request

Lets anyone with permissions verify any admin past 2fa, not just ones
lower than them on the ~totem~ permission pole.

## Why It's Good For The Game


![image](https://github.com/user-attachments/assets/22b70b52-ffca-4b10-a8c5-f7a3cae2f452)

(also fixes an exploit where you could action protected admins who were
deadmined because `D` wouldn't be set by that point.)
2024-12-18 00:55:52 +01:00
Kocma-san
2fe6a19efc moves all admin requests in admin stuff section (#88396)
## About The Pull Request
~~i have absolutely no idea what all this is called correctly~~

adds `type = MESSAGE_TYPE_PRAYER` to all messages that are a request to
admins. Because there is no reason why half of these requests should be
of type "info"

<details>
<summary>Screenshots (before)</summary>


![image](https://github.com/user-attachments/assets/96b6b8ea-5027-4e89-8969-fa485741f84b)

![image](https://github.com/user-attachments/assets/4222701d-9312-45f4-9eb2-13fdd4aff74c)

</details>
<details>
<summary>Screenshots (now)</summary>


![image](https://github.com/user-attachments/assets/d4732687-3b1e-4fdc-bde8-07c053adac57)

</details>

## Why It's Good For The Game

All requests can now be moved to a separate tab, without unnecessary
information
## Changelog
🆑
admin: moves all admin requests in admin stuff section. Now they have
type Prayers
/🆑
2024-12-12 09:41:07 +13:00
Time-Green
a0d47d999e Fixes harddels, reduces unneccessary update body calls (#88300)
Closes #88283
Closes https://github.com/tgstation/tgstation/issues/88320

Fixes a harddel caused by the limp status effect not being properly
deleted

Reduces update-body calls in:
- Initialize from 4 to 1
- On z-level change from 2 to 1
- On move with bloody shoes from 1 to 0

Mostly by just passing along the proper argument and removing seemingly
unnecessary update body calls
2024-12-04 01:34:57 +01:00
MrMelbert
f60f5b8334 Fix admin local sound (#88214) 2024-11-29 17:38:35 +01:00
MrMelbert
75696ab873 Fixes random stuff spilling into ooc tab (#88221)
## About The Pull Request

`boldannounce` is NOT for use ICly it's only for OOC stuff. `bolddanger`
is identical it just doesn't carry the same baggage

## Changelog

🆑 Melbert
fix: Stuff like the SM exploding will no longer output to your OOC tab
/🆑
2024-11-27 17:41:52 +01:00
SmArtKar
bbb7a41743 Guncode Agony 4: The Great Projectile Purge (#87740)
## 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 #71822
Closes #78547
Closes #78871
Closes #83901
Closes #87802
Closes #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!
/🆑
2024-11-23 04:02:35 -08:00
Fikou
185f96efb0 changes default prefs to deadmin you as antagonist/head/sec/silicon, stops auto deadmin on localhost (#88028) 2024-11-22 21:56:25 +01:00
MrMelbert
99685993aa Fixes some broken logs (#88040) 2024-11-21 21:26:11 +01:00