2193 Commits
Author SHA1 Message Date
RoxyandThe Sharkening cbde7d6206 [BOUNTY] Character Preferences Reorganization (#5389)
This bounty was requested by @ArrisFairburne

Cleans up the character customization; various customization features
have been moved into three new tabs, "Character Basics" "OOC
Preferences" and "Silicon Preferences".

A ton of the character customization options (maybe 40%?) are stuff that
almost nobody would use on a regular basis. Options like mushroom caps,
frills, fluff, taur bodies, xenodorsal heads, etc. could be ignored by a
most players because they're irrelevant to their characters. Ideally the
most necessary stuff (basic furry parts, our required FTs, and
soundbytes for speaking) are the stuff the players see first, with more
stuff continuing to be available upon checking different tabs.

Silicon prefs are moved into their own tab because most characters are
carbons so they just won't ever need to bother with them.

<details>
<summary>Screenshots/Videos</summary>
<img width="1100" height="790" alt="basics"
src="https://github.com/user-attachments/assets/f84ce557-09fd-414d-a076-58569392a84b"
/>
<img width="1100" height="790" alt="visuals"
src="https://github.com/user-attachments/assets/0e184209-f6d0-43f7-8452-0ec409f13dba"
/>
<img width="1100" height="790" alt="lore"
src="https://github.com/user-attachments/assets/b0f8f74c-5b21-49f3-823a-8684015c7b61"
/>
<img width="1100" height="790" alt="lore2"
src="https://github.com/user-attachments/assets/114088bc-6f3f-4a83-b528-d0d14055426e"
/>
<img width="1100" height="790" alt="ooc"
src="https://github.com/user-attachments/assets/14333121-dc87-4396-a64d-fd2d07e86780"
/>
<img width="1100" height="790" alt="silicon"
src="https://github.com/user-attachments/assets/5992d37e-17ca-4854-a88a-f6cc87f27128"
/>

</details>

🆑 ArrisFairburne
qol: Cleaned up the character preference window.
/🆑
^ Conflicts:
^	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
2026-04-11 08:57:55 -06:00
RoxyandThe Sharkening 2d426b3f46 Fix mismatched parts toggle doing nothing (#5388)
## About The Pull Request

It was me I broke it

## Why It's Good For The Game

Unchecking this should actually hide mismatched parts

## Proof Of Testing

Yes

## Changelog
🆑
fix: fixed mismatched parts toggle doing nothing
/🆑
2026-04-11 08:53:28 -06:00
nevimer 29ef34cf8d Merge remote-tracking branch 'origin/master' into upstream-feb12-2026
# Conflicts:
#	tgstation.dme
2026-03-18 13:48:42 -04:00
f853e7a77c Nova Port - Roundstart bag variations (#5341)
## About The Pull Request
Ports some bags for roundstart selection from Nova Sector. Same amount
of space as any other bag ever.
## Why It's Good For The Game
Cool bags. Different aesthetics, if desired.
## Proof Of Testing
works on my machine or something. Screenshot below.
<details>
<summary>Screenshots/Videos</summary>
<img width="1287" height="735" alt="image"
src="https://github.com/user-attachments/assets/d7ecf201-1442-4f80-99cd-a116ea04de51"
/>

</details>

## Changelog
🆑
add: Front pack, waist pack and belt pack for selection in character
preferences, found under the regular bag selection. Despite the names,
still equipped on your back.
image: Supporting sprites for the new roundstart bags
/🆑

---------

Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com>
2026-03-16 21:56:12 +01:00
nevimer 00ccf0c6b5 Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026
# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
2026-02-12 23:50:09 -05:00
5e67938190 Removes the "plural" bodytype (#95111)
This is not politics. Having it be set as not `MALE` or `FEMALE` causes
unsolvable inconsistencies in the code because everything assumes "if
not MALE, then FEMALE" or vice versa.

- Migrated "Use gender" enby body types to female (alert user when this
happens).
- Disabled "Use gender" in prefs menu when enby.

🆑
fix: Fixed some inconsistencies with bodytypes when non-binary genders
had it set to "Use gender". This is no longer possible. If you use have
previously used this setting, your bodytype will be explicitly set to
female.
/🆑

---------

Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
2026-02-12 14:11:58 -05:00
MrMelbertandGitHub e4f533111f Deafness is now solely tracked by trait (#95029)
## About The Pull Request

Deletes `can_hear`, replaces it with trait-checking deafness.

The only two non-trait sources of deafness (hardcrit and lacking ears)
were refactored into using the trait.

## Why It's Good For The Game

Many places inconsistently check for the deaf trait rather than use
can_hear which meant behavior was not consistent.
Some code would treat "do we lack ears?" as being deaf, some would not. 

This unifies all the behavior so being deaf means you're deaf
everywhere.

It also means we can now easily react to gaining and losing deafness via
signal, where before we could not react to it without hooking the trait,
organ remove, AND stat change. Which no one did, of course, because who
would ever think to do that?

## Changelog

🆑 Melbert
refactor: Refactored how deafness is tracked. Please report any weird
interactions with sounds, like messages or sfx being missing.
fix: Lacking ears and being in hard crit now consistently treats you as
"being deaf". This affects a few minor interactions like empath, the
jukebox, and sleeping.
/🆑
2026-02-05 20:19:56 -05:00
6218d1bf22 Turns the widescreen toggle into a dropdown featuring 15x15, 19x15, and (the new) 21x15. (#5166)
## About The Pull Request
Makes you able to see one extra tile to the left/right, making it feel
as if you have a wider screen. But you can also keep the original 19x15
if you want.
## Why It's Good For The Game
I feel like it looks better? Less square? Mode modern and widescreen?
idk. I feel like people will generally like this.

If you think it doesn't look better? stick with 19x15, the choice is
yours.

<details>
<summary>Before</summary>
<img width="1258" height="989" alt="afbeelding"
src="https://github.com/user-attachments/assets/3a7b259c-bd22-4fbd-94f5-6257d2c13772"
/>
</details>
<details>
<summary>After</summary>
<img width="1384" height="989" alt="afbeelding"
src="https://github.com/user-attachments/assets/bdebd573-4920-4cc1-b7be-9d99ef961062"
/>
</details>

## Proof Of Testing
With chatbar because someone told me they were worried the chatbox would
be too small with the change
<details>
<summary>After with chatbar</summary>
<img width="1920" height="1080" alt="afbeelding"
src="https://github.com/user-attachments/assets/55ca42ae-391d-4d38-9069-730669f53c9a"
/>
</details>
<details>
<summary>Before with chatbar</summary>
<img width="1919" height="1030" alt="afbeelding"
src="https://github.com/user-attachments/assets/34b443ea-ffaa-49b7-97d4-baef56f67f01"
/>
</details>

## Changelog
🆑
add: There's a new widescreen dropdown within game preferences, letting
you pick between 15x15 (4x3), 19x15 (widescreen), and 21x15 (ultrawide)
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2026-01-23 18:31:11 -08:00
IvyandGitHub dabd2cb0d8 Add 1676 to unrecommended builds (#94959)
same thing as #94933, there seems to be no evidence of the crash bug
being fixed by reading the logs BUT there seems to be no evidence yet
that the crash bug still exists
2026-01-22 12:04:23 -06:00
IvyandGitHub 6227224ed5 Add 1675 to unrecommended builds (#94933)
## About The Pull Request

title
afaik this version is bugged and will crash on people frequently, so its
best to tell unaware ppl how to deal with it

## Why It's Good For The Game

hopefully tells ppl how to deal with crashes
2026-01-21 18:47:29 -05:00
BloopandGitHub c52619a4d6 Adds a priority before species but after the default (#94750) 2026-01-17 11:17:16 +01:00
GhomandGitHub 8c534a521e Maintenance PDA themes are added to roundstart PDAs on future rounds as well once installed (#92983)
## 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.
/🆑
2026-01-16 17:18:03 -05:00
AnturKandGitHub f60e992b10 Fixes few admin notices sanitization (#94788)
## About The Pull Request

Just some missing admin message sanitization.
2026-01-08 17:18:20 -08:00
BloopandGitHub 58e73d1e19 Stops prefs menu from doing an extra update_body() call every time you swap chars (#94740)
## About The Pull Request

Tin, noticed an extra set of calls when doing some profiling. This is
already called from `switch_to_slot()` so it makes no sense to do it a
second time in `on_new_character()`.

Also adds a sanity check to the prefs menu for when you switch to the
same exact slot.

## Why It's Good For The Game

Snappier prefs menus.

## Changelog

🆑
fix: switching characters in the prefs menu should be less laggy now
/🆑
2026-01-05 17:14:24 -05:00
SmArtKarandGitHub a221260c04 Adds a preference to adjust emissive bloom size (#94722)
## About The Pull Request

Adds a slider to the gameplay tab which allows users to control the size
of the emissive bloom.

## Why It's Good For The Game

This is mostly visual and doesn't have a noticeable performance impact,
but some people might find it distracting or might want a stronger bloom
for prettier lights.

## Changelog
🆑
qol: Added a preference to adjust emissive bloom size
/🆑
2026-01-06 09:00:44 +13:00
BloopandGitHub 82af527b61 Fixes the quirk menu not updating (#94673) 2026-01-01 16:50:09 +01:00
John WillardandGitHub 41f34c2a86 Adds tgui color picker (#94313)
## About The Pull Request

Ports https://github.com/Monkestation/Monkestation2.0/pull/1231 which is
a port of https://github.com/BeeStation/BeeStation-Hornet/pull/9417
which is a port of https://github.com/omgovich/react-colorful/
Also a port of
https://github.com/effigy-se/effigy/blob/main/tgui/packages/tgui/interfaces/effigy/ColorPickerModal.tsx
for hex color presets

Admin stuff got excluded (pref-like picker, filterrific, get-variables)



https://github.com/user-attachments/assets/7069bef9-81cd-4636-bf68-cbad227ef09e


## Why It's Good For The Game

It's one of the only input areas that still doesn't use TGUI, leaving
darkmode players flashbanged every single time a color selection UI is
opened. This is also just visually great and I think a big upgrade from
byond's.

## Changelog

🆑 omgovich, itsmeow, Absolucy, JohnFulpWillard, jlsnow301, TealSeer,
lessthnthree
add: Color selection panels now use TGUI (If you have TGUI enabled in
settings).
/🆑
2025-12-21 16:18:34 -08:00
MrMelbertandGitHub bfdb237612 Spooky Scary Supreme Surgery (Rework) (#93697) 2025-12-19 18:42:58 +01:00
nevimer 6e9f2ccfc0 Merge remote-tracking branch 'tgstation/master' into upstream-12-15
# Conflicts:
#	.github/workflows/compile_all_maps.yml
#	.github/workflows/run_integration_tests.yml
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/_onclick/hud/credits.dm
#	code/controllers/subsystem/networks/id_access.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/game/machinery/doors/door.dm
#	code/game/objects/structures/crates_lockers/closets/secure/medical.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/modules/antagonists/malf_ai/malf_ai_modules.dm
#	code/modules/jobs/job_types/_job.dm
#	code/modules/loadout/categories/accessories.dm
#	code/modules/loadout/loadout_helpers.dm
#	code/modules/loadout/loadout_items.dm
#	code/modules/loadout/loadout_preference.dm
#	code/modules/mob/living/silicon/robot/robot_defense.dm
#	code/modules/mod/mod_theme.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/reagents/reagent_containers/cups/drinks.dm
#	code/modules/shuttle/mobile_port/variants/supply.dm
#	code/modules/surgery/organs/internal/eyes/_eyes.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png
#	icons/hud/screen_full.dmi
2025-12-15 18:12:29 -05:00
shayoki 739a897e5f merging with current 2025-12-14 03:25:39 -06:00
ZergspowerandGitHub 27551e1caf Tweaks blindness to be more player friendly (#94323)
## About The Pull Request

So something i missed from when i played Goonstation a long while ago
was my blind characters, i tried recreating them in TGCode but found
that the blind quirk here is far more harsh to play visually. So i got
some help from Melbert and got a plan goin and here's the results.


![blinds](https://github.com/user-attachments/assets/d12bd5c1-e0cb-4997-835f-279076c6a665)

Players can see colors! But muted, this change is strictly for visual
enjoyment as the constant monochrome is just - i cant really describe
how much i hate seeing it for more than 15 minutes.

Secondly the flicker is gone from the quirk but remains for all the
temporary blindness, this is 100% Melberts code as they're a helluva lot
smarter than I am and I just nod and smile before pasting it. This did
entail creating a new fulscreen in the dmi, but i just copy/pasted the
existing one and took out the animated frames and named it as 'static'
so it wouldnt interfere with anything else using it.

## Why It's Good For The Game

Playing a blind character is great, however it causes some serious
eyestrain after prolonged playstyle

## Changelog
🆑 MrMelbert, Zergspower
qol: The world is now heavily desaturated while blind, rather than pure
monochrome, to give players some visual stimulus
qol: When blind, the brief flicker of the entire screen now only appears
for mobs temporarily blinded - ie, mobs blinded from quirk / trauma /
genetic mutation no longer experience it
/🆑
2025-12-10 20:42:56 +00:00
JeremiahandGitHub c771360e00 Removes tgui fancy mode as a preference, we're only fancy now (#94389)
## About The Pull Request
This defaults every tgui to fancy mode and removes the preference
entirely.
## Why It's Good For The Game
If you look through the code you'll find comments like these 
> //some browsers (IE8) have trouble with unsupported css3 elements that
break the panel's functionality, so we won't load those if a user is in
no frills tgui mode since that's for similar compatability support

We're far and away from IE8, therefore our need for compatibility
support, so I think it's valid to remove this so called 'no frills tgui
mode'. It's tied into the event message system with every backend
update, so there's a tad less overhead.
## Changelog
🆑
del: TGUI now defaults to fancy mode, there is only fancy mode. Welcome
to the future.
/🆑
2025-12-09 13:54:13 -07:00
san7890andGitHub 29c32994d6 Retinkers Multikey Message (#94357)
## About The Pull Request

The slight imperfections of this were getting to me whenever I was
testing stuff that required me have two different clients intializied so
let's just retinker it a bit to look nicer without losing any
functionality of the messaging service (as well as some explicit UX
stuff to make it look less syntactically incorrect)

Before:
<img width="781" height="65" alt="image"
src="https://github.com/user-attachments/assets/bcd0c44b-8f88-40f6-8d14-ea280f00e084"
/>

After (colon missing at time of screenshot, fixed later):
<img width="821" height="42" alt="image"
src="https://github.com/user-attachments/assets/a0627414-3896-424d-8eb1-250dcfaacf70"
/>

Logged Version:
```
[2025-12-06 06:29:26.969] ADMINPRIVATE: MULTIKEY: Connecting player San7890 has the same !BOTH! IP 127.0.0.1 and Computer ID *********** as thesan7890 (no longer logged in) in the current round
```
## Why It's Good For The Game

Cleaner message that is still eyecatching for admins, uses string
concats so it's less painful to modify in the future as well as reduce
duplicated code while overall maintaining a pretty nice flow of message
generation rather than be scattered all over the place.

## Changelog
🆑
admin: Multikeying Notice Messages have taken on a new form factor but
should still furnish the same information.
/🆑
2025-12-07 19:05:33 -08:00
FalloutFalconandGitHub e7615580ac Better recoil visuals (#93904)
## About The Pull Request
Port of https://github.com/shiptest-ss13/Shiptest/pull/3330
Partial port of https://github.com/shiptest-ss13/Shiptest/pull/1601

Makes two changes to how guns handle recoil.
- Changes recoil from an erratic shaking to a kicking of your screen
relative to your firing angle
- Adds a small cosmetic recoil to all ballistics (with an accompanying
pref option to tweak or disable it)

Primary recoil still is only used as a balance lever for a very small
handful of guns (and sawoff)

## Why It's Good For The Game

Cosmetic recoil makes guns feel a lot more punchier. People who think
its a competitive disadvantage (nerds/loosers) or people with a
legitimate sickness to screen shake or similar can just turn it off.

Old recoil was just reused explosion, while new recoil feels like its
actually recoil
2025-12-07 16:51:37 -06:00
5d8afbabb3 Add the ability to duplicate characters (#4743)
## About The Pull Request

Lets you copy characters in the character customizer. This'll be useful
if you ever want to create variants of your character or Need to move
characters to different slots.

This needs large scale testing, I couldn't break anything on local but
given this involves tinkering with saves better safe than sorry.

## Why It's Good For The Game

I saw a complaint on discord about having to delete characters to
reorganize the list, this resolves that.
This also lets you create a "base" character to use as a template or to
generate variants of an existing character without making them from
scratch or editing them.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
Soon....
</details>

## Changelog
🆑
qol: You can now copy your characters into other slots.
/🆑

---------

Co-authored-by: xPokee <catmc8565@gmail.com>
2025-12-03 13:25:44 -05:00
FalloutFalconandGitHub 2d8c0a777b Eye icon folder is less hardcoded (#94242)
## About The Pull Request
Moves eyes to there own folder and makes it so they state there icon
folder rather then it being hard coded
## Why It's Good For The Game
It felt weird that these are lumped into a file that's mostly hair and
that its hard-coded like this. This makes it easier to sort out icons.
(Thinly veiled downstream support)
## Changelog
N/A
2025-12-01 18:26:58 -05:00
MrMelbertandGitHub 6d20c4f20d Stairs update (#94146)
## About The Pull Request

1. Stairs are now on the floor plane, meaning they don't have AO and
blend in with turfs

2. Stairs now blend with adjacent stairs, forming a contiguous sprite

3. There is now a visual indicator that stairs will take you up in the
form of an arrow - The arrow appears when within three tiles and only
appears if the stairs can actually take you up.


https://github.com/user-attachments/assets/d941a312-9470-4d2a-95f0-a1834adf0212

## Why It's Good For The Game

1. The common method of making stairs (stair objects on stair turfs)
looks ugly due to AO
2. Stair turfs have these sprites but not the objects themselves
3. Given stairs now blend in better, I figured there should be a proper
indicator that stairs exist. Helps with fake stair confusion

## Changelog

🆑 Melbert
qol: Stairs now have an indicator that stepping beyond them will take
you upwards. You can disable it in accessibility settings if desired.
image: Stairs blend in and together better.
/🆑
2025-11-30 17:33:08 -07:00
nevimer baf3837ae8 Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
2025-11-29 22:49:21 -05:00
Joshua KidderandGitHub 7a3ad79506 All camelCase (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case. UNDERSCORES RULE! (#94111)
## 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!
/🆑
2025-11-27 15:50:23 -05:00
MrMelbertandGitHub 5765f259ef Fixes human skeleton pirates, Refactors ghost spawns (#94138)
## About The Pull Request

`create_from_ghost` can be called from stuff like... dynamic executing a
ruleset, so putting a sleep/user input within it causes problems

So I refactored ghost spawns a fair bit, creating a clear delineation
between where you can and can't put user input

## Changelog

🆑 Melbert
fix: Pirates will no longer randomly spawn as human
fix: Servant Golems have numbered names again
refactor: Refactored ghost spawns (like spider eggs or pirate spawners),
report any oddities
/🆑
2025-11-25 19:52:19 -07:00
SmArtKarandGitHub 78ea4187fc Implements color matrix and transform modification support for Filterrific (#93867)
## About The Pull Request

Allows users to edit color matrix filters and layered filters'
transforms through Filterrific, which were the two last unsupported
filter fields. The menus are pretty minimal, but you shouldn't be
touching them if you don't know what you're doing anyways.


https://github.com/user-attachments/assets/e87447f3-e5d6-4f6c-a8e4-bf50a1d5fa79

## Why It's Good For The Game

Makes our tooling actually work

## Changelog
🆑
admin: Implemented color matrix and transform modification support for
Filterrific
/🆑
2025-11-13 08:55:15 +01:00
Roxy 71faa643bf Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-12 2025-11-12 16:44:13 -05:00
f8e6d91d3c moves clientside storage to an iframe instead of byondstorage (#93044)
## About The Pull Request

this converts the dependency on byondstorage, which is laggy (due to
being a large json file written to disk every 10 seconds), to using
indexeddb, like we did prior to 516. this is achieved by using an iframe
to give us a persistent origin, as the web is evil and has invented
same-origin policy
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy.

this also hosts the iframe page on the github pages site for a secondary
repository (see tgstation/byond-client-storage) so it works OOTB without
requiring server operators to setup the webroot cdn (which i don't
believe is configured on the tg servers at the moment)

however, if a server is using the webroot cdn, it will use that instead
of github pages

you could also host the iframe.html page on a separate host from your
cdn or github pages if you wanted to

if we can't access the configured cdn at all, it failovers to use
byondstorage anyway, if the internet stops working and you still want
your chat history to save, i guess

## Why It's Good For The Game

saving this enormous json file is laggy, and this solution would fix
https://github.com/tgstation/tgstation/issues/89988 and fix
https://github.com/tgstation/tgstation/issues/92035

i am open to other solutions, but this does seem to require the least
amount of external dependencies of posed solutions

## Changelog

🆑
fix: you should experience less stutters every 10 seconds
server: server operators can now configure an alternative storage domain
for clientside data storage, read the example configuration for more
/🆑

---------

Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
2025-11-06 10:07:33 +00:00
Roxy d0ca474789 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-05 2025-11-05 19:43:07 -05:00
MrMelbertandGitHub 396bce4237 Adds a popup for logging in with an unrecommended byond version (#93742)
## About The Pull Request

Adds `GLOB.unrecommended_builds`, for byond build which are broken for
the end user in some way, but not in a way that warrants outright
blacklisting players from connecting with them

Looks like this (Ignore the number I changed it for testing purposes) 

<img width="493" height="267" alt="image"
src="https://github.com/user-attachments/assets/d31636e8-a106-4d13-a8fa-aee6a50c6d27"
/>

Uses this system for the new byond build, 1670+, which breaks text
rendering

Also adds 1670+ to the list of builds to warn on compile

## Why It's Good For The Game

1670 broke the compilation step, probably permanently

Whether we will fix this or flip a pragma or w/e remains to be seen, but
until then we can tell people to compile an earlier version

1670 also broke the user experience, causing map text to show up as
really big. This will be fixed in an upcoming version
<https://www.byond.com/forum/post/2983385>

## Changelog

🆑 Melbert
qol: If you are on Byond 516.1670+, you will get an alert on login that
your build is less than functional
/🆑
2025-11-02 20:31:56 -05:00
RoxyandGitHub 71e8119d05 Rename feature_human_ears and feature_human_tail (#93696)
## About The Pull Request

Despite what the code comments said we can rename them and we should
because they make no sense

## Why It's Good For The Game

The save file keys for cat features should have cat in the name and not
human

## Changelog
🆑
server: renamed feature_human_ears and feature_human_tail to
feature_cat_ears and feature_cat_tail respectively
/🆑
2025-10-31 15:59:11 -06:00
585b02c325 Reduces species feature boilerplate (#93570)
## About The Pull Request

Rather than having 100 separate list variables on `SSaccessories`, have
1 list for all feature keys that are associated with sprite accessories

This way you can get a feature by doing
`SSaccessories.feature_list[key]`, instead of necessitating
`SSaccessories.ears_list`, `SSaccessories.tail_list`, etc.

This lets us cut back on a lot of boilerplate in prefs, dna, and organs

## Why It's Good For The Game

We can see the benefit in this example: This is all the code for horn
DNA, bodypart overlay, and preference
```dm
/datum/dna_block/feature/accessory/horn
	feature_key = FEATURE_HORNS
```
```dm
/datum/bodypart_overlay/mutant/horns
	layers = EXTERNAL_ADJACENT
	feature_key = FEATURE_HORNS
	dyable = TRUE

/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner)
	return !(bodypart_owner.owner?.obscured_slots & HIDEHAIR)
```
```dm
/datum/preference/choiced/species_feature/lizard_horns
	savefile_key = "feature_lizard_horns"
	savefile_identifier = PREFERENCE_CHARACTER
	category = PREFERENCE_CATEGORY_FEATURES
	main_feature_name = "Horns"
	should_generate_icons = TRUE
	relevant_organ = /obj/item/organ/horns

/datum/preference/choiced/species_feature/lizard_horns/icon_for(value)
	return generate_lizard_side_shot(get_accessory_for_value(value), "horns")
```

## Changelog

🆑 Melbert
refactor: Refactored species unique organs slightly, particularly how
they are set up at game start. Report any oddities, like invisible tails
or wings
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-30 03:46:32 +01:00
FalloutFalconandGitHub 060d4a65ba valid_subtypes proc (#93541)
## About The Pull Request
discussed in #93439, a generic proc for getting a list of all types
minus abstract types.
applies this to most instances of a for loop that currently filters out
abstract types

it SHOULD be a nothing burger for performance, however I have not bench
marked the difference. (also testing, there is a total of 7 calls in
init to it)
2025-10-28 12:49:18 -05:00
nevimer f3b748d33b Merge branch 'upstream-23-10-2025' 2025-10-26 14:48:46 -04:00
49e28a0eeb Reworks AI Status Display and AI Core Display UX (#93196)
## About The Pull Request

Ready for merge post review

No gameplay balance changes, just better AI expression options and
polished interfaces for doing so.

- Adds 32 AI Core animation sprites to the AI status screens as a player
choice
- Gives two new menus to change status displays or core display with
TGUI
- Fixes Friend Computer emote incorrectly affecting evacuation displays
- Special mention to MrMelbert who gave a few very useful points as I
embraced TGUI suffering :)

<img width="1500" height="750" alt="image"
src="https://github.com/user-attachments/assets/fbae0ea9-5220-4cf9-9fa0-c5f0385f9e52"
/>
<img width="1746" height="821" alt="image"
src="https://github.com/user-attachments/assets/f1c08fdf-8dc8-44eb-b7cd-cd86f9b8f903"
/>


There is also a new verb under "AI Commands"
<img width="433" height="127" alt="image"
src="https://github.com/user-attachments/assets/2cd69b71-7a0c-4199-959e-acd4de9d5dad"
/>

<img width="364" height="528" alt="image"
src="https://github.com/user-attachments/assets/e083784e-8251-4a55-a9e2-e27e53dfa780"
/>


## Why It's Good For The Game

- Allows AI players to express themselves more in round / stand out more
- Now it is a TGUI menu, Much easier to see what is available and change
mid round as needed.
- We had talented Spriters make these and now more players can see them

## Changelog
🆑
qol: New verb in "AI commands" to update AI display status
fix: Stopped "Friend Computer" emotion affecting evac displays instead
of just AI displays
code: Replaced radial wheel for AI status or AI core display with TGUI
menus
image: AIs can now update their status displays with way more graphics
to match core display options onto the TVs.
/🆑

---------

Co-authored-by: loganuk <falseemail@aol.com>
2025-10-26 17:45:08 +01:00
sunnyandGitHub 3e4b00bee8 Abductors have typing indicators (#4846)
## About The Pull Request
Abductors, while "talking" and emoting, have typing indicators.
<img width="114" height="138" alt="image"
src="https://github.com/user-attachments/assets/b48c8647-a96f-4a81-b117-9c13c58863fd"
/>
## Why It's Good For The Game
Removes the inherent type-baiting abductor players face by other people
literally being unable to know they're typing. They still can't talk to
other people, this just shows the little bubble. _Technically_ an
abductor-antag nerf, but it's so minor and adds QoL, I think it's very
worth it.
## Proof Of Testing
Compiles.
<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog
🆑 sunnyaries
add:onlookers may know when an abductor is emoting. millions must gleep
/🆑
2025-10-25 00:27:48 +03:00
Roxy e28e9fbdba Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-23-10-2025 2025-10-23 17:38:23 -04:00
MrMelbertandGitHub 8b8bcfd674 Adds two heavy midround rulesets, mass traitors and mass changelings (#93447)
## About The Pull Request

- [ ] I tested this pr

Adds "Midround Mass Traitors" and "Midround Mass Changelings" heavy
rulesets

Midround Mass Traitors will turn a number of the crew into sleeper
agents

Midround Mass Lings will spawn a number of changeling meteors 

BY DEFAULT:
- Traitors will spawn 2-4 sleeper agents
- Lings will spawn 2-3 changeling meteors
- They won't run without >=2 candidates
- They have no config blacklist (so the HoP can roll mass midround
traitor, despite not being able to roll normal midround traitor. However
default blacklisted roles like security officers are still blocked)
- They're weighted impossible on tier 0, same weight as most midrounds
on tier 1, and fairly high on tiers 2 and 3
- They're repeatable but very unlikely to repeat
- Significantly higher min pop brackets than their solo counter part

## Why It's Good For The Game

Adds more options for lategame antags than big midrounds

## Changelog

🆑 Melbert
add: Two new heavy dynamic rulesets: "Midround Mass Traitors" and
"Midround Mass Changelings"
/🆑
2025-10-18 19:06:29 +02:00
Roxy d14e538393 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-15-10-2025 2025-10-15 19:34:41 -04:00
EnterTheJakeandGitHub a2c7c8e57b Heretic Antagonist Full Overhaul. (#92119)
## About The Pull Request

Heretic has received a complete overhaul. This PR touches nearly every
aspect of the antagonist. For readability's sake, not every change is
going to be listed in this pull request.

For the full list of changes please refer to the design doc:
https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g.

Code by Me, @Xander3359 and @Arturlang 

TGUI by @Arturlang 

Sprites by OrcaCora and GregorDM

Writing bits by @necromanceranne 

### Core changes

- Cross-pathing has been removed. Main knowledge spells are now
exclusive to their path (for the most part).

- For every main knowledge unlocked (save for the robes and the blade
upgrade), Heretics can choose one option from a draft of 3 random side
knowledges (this is a free point).

- Heretics can now purchase side knowledges from a new tab, the
"Knowledge Shop". Side-knowledges have been divided by tier (Stealth,
Defense, Summons, Combat and Main). Tiers are unlocked as you progress
toward your main path.

- Heretics now gain the grasp and mark upgrade immediately, but their
main knowledge choices cost twice as much (except for the first spell,
the robes and the blade upgrade).

- Path specific robes have been introduced! They come with their own set
of quirks.

- Each Path has received a passive ability. This passive is upgraded
when you first create your robes, and again when you complete the Ritual
of Knowledge.

- Paths have been rebalanced as a result of the removal of cross-path
progression. Cosmic and Moon paths have received soft reworks.

- Upon unlocking the path 2nd level or reaching a total of 8 points
worth of knowledge, Heretics will lose the ability to blade break (and
the limit on blades all together).

- Ascension now automatically calls the shuttle with no possibility of a
recall.

- Late join Heretic has been removed.

### New UI 
<img width="750" height="635" alt="moon path ui"
src="https://github.com/user-attachments/assets/184ef783-5c9c-48a1-a2f7-4807ca93e990"
/>


### Knowledge shop

<img width="787" height="669" alt="Knowledge shop"
src="https://github.com/user-attachments/assets/3dc89b84-8c70-4d47-b612-54396e3ea6e7"
/>




### Quality of life //General balance changes

- Heretics will now gain X-ray vision for a few seconds when nearby an
eldritch essence (this effect has a cooldown).

- Ritual of knowledge now requires 1 uncommon item instead of 2. You may
now use a stunprod instead of a baton to complete the ritual. Beartraps
have been removed from the list of possible reagents.

- The maximum number of possible sacrifices required to ascend has been
reduced from 6 to 5 while the minimum has been upped to 4.

- Codex Cicatrix no longer requires a special pen to be made.

### Passive abilities

- Heretics now start with a passive ability. You can find what it does
on the path info tab after a path has been selected, and what they gain
when upgraded.

- Crafting your first set of Eldritch robes will bump your passive to
level 2.

- Unlocking the 2nd level will subsequently unlock your "Ritual Of
Knowledge"

- Completing the ritual of knowledge or ascending will net you the final
level.

### Path Specific Robes

- Armorer's Ritual is no longer a side knowledge. Each path will have
their own unique version of the ritual. This is placed after the 2nd
spell in the tree.

- Robes can no longer be destroyed by fire and acid, grant t4 flash
protection (Moth Heretics stay winning) and protection against basic
syringes, to bring them on par with other antagonist's armor sets.

- The recipe to craft the robes is now a set of armor/vest, a mask (any
mask will do now, not just gas masks), plus the unique reagent required
for the blades (Plasma for Cosmic, Trash For Rust, match for Ash and so
on)

- Wearing the robes as a non-heretic may yield some unfortunate
side-effects.

### Moon Path Rework

Moon path  rework.

Moon Heretics gain immunity to brain traumas and slowly regenerate brain
health. Equipping the moon amulette channels its effects through the
moon blade; making it unblockable and cause sanity damage instead of
brute. Ring leader's Rise now summons an army of harmless clones that
explode when attacked; the explosion briefly stuns non-heretics and
cause sanity and brain damage to them. Moon blade can also now be used
when pacified and Moon spells are no longer blocked by regular anti
magic, only mind magic protection.


**Cosmic Path Rework**

Cosmic path has received the biggest batch of changes alongside Moon.
The path has been dead last in ascension and pickrate (less than 5%) for
almost 2 years. It did gain some popularity over the last few months,
reaching the highest ascension rate in the game (12%) while mantaining a
relatively low pickrate.

Cosmic sits in a weird spot, where pretty much every knowledge
surrounding the path is either mediocre or, in the case of the
ascension, dysfunctional. Yet it has maintained a smidge of relevancy
due to how quickly Cosmic heretics can capture and sacrifice targets
thanks to Star Touch.

As a result, the best course of action would be to rebalance the
entirety of the kit; granting the heretic more tools to manipulate space
and dictate the flow of a fight, while lessening their ability to end a
confrontation by instantly sleeping their opponents.

lastly The Star Gazer is now ghost controlled ; And they shoot lazers!

<img width="636" height="451" alt="gazer gag 3"
src="https://github.com/user-attachments/assets/601d6881-c042-4e42-8ce6-ac90cd27848b"
/>


## Why It's Good For The Game


### Ok...but why do we want this?

Again, if you want my full reasoning, please check my doc
https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g.

To keep it short and concise; Heretic is too complex and unintuitive for
its own good. Too impenetrable for new players and too abusable for
experienced players. This can be chalked up to a lot of poor design
decisions. But ultimately, what I believe being the biggest contributor
to the current status of Heretic is the ability to move into different
paths, also known as "Cross-Pathing".

### Cross Pathing my beloathed.

Cross-pathing, while cool in theory, overcomplicates the antagonist and
overloads them with power. Players dealing with the heretic are
incapable of working out what a given heretic can do. This also leads to
late game heretics having 3 rows Worth of action buttons and virtually
no weakness.

Over the last year, I've often received the understandable but also kind
of unfair accusations of making Heretic too powerful without a clear aim
or purpose.

My goal with the paths I've reworked over the last year (Rust,Void and
Blade) wasn't necessarily to just make them stronger (although that was
also part of the goal, as they were paths that were underperforming),
but for them to have more interactions with the sandbox and to better
live up to the fantasy presented to the player.

If an harbringer of frost gets countered by a cup of coffee, we probably
messed something up.


Unfortunately, the current incarnation of Heretic doesn't really allow
for surgical balance changes to specific paths. Every time a knowledge
gets buffed, we make every path that can easily tap onto that knowledge
stronger by default. It doesn't take a genius to understand why this
system is ultimately unsustainable.

### Blade Breaking

I feel that after a heretic has reached the near peak of their power,
they no longer need the ability to instantly escape any encounter. Check
my doc for my full reasoning.

## Less versatile, more specialized paths.

By removing cross-pathing, we remove a huge maintainability burden from
the antagonist. Paths can now be designed around clearer strengths and
weaknesses. They become easier to balance and less of an headache to
understand for everyone.

It also means we can give paths some needed quality of life quirks
without having to worry how such a change might have a knock-on effect
for other paths.

Ash heretics can finally let loose without dying by their own flames.
Cosmic Heretic can go to space without having to carry a modsuit. Moon
Heretic can use their abilities without fear of one random trauma
ruining their day, and so on.

### What a horrible night to have a curse...., wait how do I curse
people again?

As of right now the heretic tree has quite a hefty amount of trinkets
that pretty much never see use.

Partly because the tree itself is a nightmare to navigate. And partly
because why would anyone set up an elaborate plan or scheme when they
can unleash 2 rows of spell in the span of bunch of seconds.

Heretics mostly gravitate towards powers that push them towards greater,
more potent combat strength. If it doesn't contribute to killing people
quicker, it isn't worth doing for most. And given the opportunity cost
associated for taking those powers, they will remain that way so long as
there are better choices to be poached.

The new draft system encourages Heretics to play more with the tools at
their disposal. If you want to go for a specific combo from the side
path options, you may now do so by tapping into the knowledge shop.

Yes, the shop does include a few knowledges from the other paths. But
these are limited to 1 per path, are very expensive and can only be
unlocked very late into the shift.

## Drip Of the Mansus

The iconic heretic robe is actually sequestered to a side path that is
most easily access by only two paths at a time. Since heretic paths are
being made to be much more specialized, the most obvious way in which
this can be showcased is through an easily
identifiable outfit.

By using the robes, we can both telegraph WHAT heretic you are looking
at, and just how much power they've accumulated and when it is
reasonable to take the kid gloves off and treat them as a genuine
threat. If a heretic is in their
robes, that heretic is now a significantly more prominent danger to the
station.

It also serves as a useful means for gating some of the more powerful
effects of a heretic's path behind the robes, AND enable options for
disarming them of that power should they be captured without making it
something endemic to their mob.

A major problem with heretics is a lack of certainty as to how powerful
they have become. A heretics robes is one of the milestones to help
players dealing with heretics identify that.

### Will this be 100% fair and balanced?

This is a massive overhaul to a pretty complex and bloated antagonist.
I've done my best to show the changes to several maintainers and other
members of the community for their feedback. But at some point we'll
have to see how this behave in the environment to get a feel if
something is over or undertuned. (that's my way of saying, yes this is
likely gonna require a testmerge or two).

What I will say is that I'm not trying to change the core identity of
Heretic.

Heretics should have the upperhand in single encounters early on, be
able to joust a small group of players after they unlock their final
spell, and end the round when they ascend. They're a progression
antagonist. They should retain their payoff as well as pose a danger as
they grow stronger.

But if more players feel like they are more reliably able to play the
antagonist in more varied and interesting ways, rather than the
antagonist largely existing as a measuring stick for 'robustness' due to
its elitist design philosophy, then the rework has been a success. There
should be something for
everyone in the antagonist, as is true for all of our antagonist roles.
2025-10-15 22:34:51 +00:00
BloopandGitHub b7402b77c2 Changes cat tail define from FEATURE_TAIL to FEATURE_TAIL_CAT so it matches the rest (#93426)
## About The Pull Request

Just a simple find + replace PR. All the other tail defines match their
text strings, but for some reason cat tails are just `FEATURE_TAIL`
which is inconsistent.

## Why It's Good For The Game

Consistency, + a lot of downstreams have a generic "tail" feature key
which is distinct from cat tails, so not taking up that define is
better.

## Changelog

Nothing any players would notice
2025-10-12 23:51:54 +02:00
MrMelbertandGitHub 6ba755cb44 Felinid ears are randomized properly (#93297)
## About The Pull Request

When more Felinid ear styles were added, no one updated the jank old
randomization code

When Felinid ears were refactored, no one updated the jank old
randomization code

Sooo let's do that shall we? 

1. Species `get_mut_organs` -> `get_organs`, it gets gets all organs the
mob has anyways

2. Prefs `relevant_external_organ` -> `relevant_organ`, it applies to
any organ type

3. Del organ `preference`, the preference itself handles it via
`relevant_organ`

## Changelog

🆑 Melbert
fix: Felinids will randomize their ear type properly
/🆑
2025-10-05 16:21:42 -06:00
xPokee 5e629dff04 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync 2025-10-03 07:05:54 -04:00
3ea7b03369 Accentuate the positive with **Personality**: A (soft) mood rework (#92941)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-10-02 19:00:13 +00:00
RengaN02andGitHub 2815f1e5cc Fixes a possible runtime in future (#93097)
## About The Pull Request

If someones delete a keybind this runtime will appear.
<img width="689" height="172" alt="image"
src="https://github.com/user-attachments/assets/1fd9c6c3-00a7-4890-89ba-002943a06a32"
/>

This pr preverents it
## Why It's Good For The Game

Fixes are good, bugs are bad (except hk)
## Changelog
Not player faced
2025-09-25 01:41:36 +02:00