Commit Graph

1522 Commits

Author SHA1 Message Date
Nick
1196287662 Adds the ability to link forum accounts (#90441) 2025-04-13 23:57:16 -06:00
MrMelbert
67dd51be79 Reworks language translations. Add partial language understanding. Bilingual update. (#90252)
## About The Pull Request

Fixes #89445 (well, technically. It fixes the bug associated but these
`say`s should really be emotes.)

Three things:

1. Reworks how language translation works.

Rather than scrambling a sentence into a language entirely, sentences
are now scrambled on a per-word basis.

Additionally, the 1000 most common words of a language are *never*
re-scrambled across the duration of a round. Once it's set it's set in
stone.

Example: (Sample / Old / New)


![image](https://github.com/user-attachments/assets/69be41fa-bc40-45f0-bd80-e24e799c9f38)

This allows for a number of things:

- More consistent translations, making it (more) viable to actually
"teach" someone words for something
- Maintaining emphasis such as caps (but not `||`, `++`, or `__` - at
least not yet)
- The following:

2. Adds partial language understanding

Some languages can understand portions of other languages.


![image](https://github.com/user-attachments/assets/b6eee2c7-f564-437b-8c7a-bd1d88a9b680)

This pr adds the following:
- Those who understand Beachtongue can understand 50% of Common and 33%
of Uncommon words.
- Those who understand Common can understand 33% of Beachtongue and 20%
of Uncommon words.
- Those who understand Uncommon can understand 20% of Common and 20% of
Beachtongue words.

3. Bilingual quirk has been expanded to accomodate these changes.

There are now two more preferences:
- Language Speakable
- You can toggle this, so you only understand the language, rather than
understand AND speak.
- Language Skill
- If you choose to be unable to speak the language, you can set how much
of the language you can understand, down to 10%.

## Why It's Good For The Game

Playing around languages is fun, but due to the way our translation
works, ALL context is immediately lost for what the other person may be
saying.

If the other person is shouting in all caps? Output language is normal
chatting. This is lame!

Even if someone is unable to understand you, there's a LOT you can
convey just by how you speak, and getting that across in game is quite
difficult when all translations get mauled so badly.

So this changes that. 

- Emphasis like caps lock is maintained, so you see someone shouting in
caps in a foreign language you can probably intuit something is wrong
(but not what is wrong!)
- Some languages can gleam bits of other languages, so you MIGHT be able
to pick out context if you pay close attention
- "Brother" languages will now feel more like "brothers" and not
completely divergent
- You can even "teach" someone words in your language - at least the
most common words! (Until next round)

## Changelog

🆑 Melbert
add: Languages can now have partial understanding of other languages.
More common English words are more likely to be mutually understood.
add: Those who understand Beachtongue can understand 50% of Common and
33% of Uncommon words.
add: Those who understand Common can understand 33% of Beachtongue and
20% of Uncommon words.
add: Those who understand Uncommon can understand 20% of Common and 20%
of Beachtongue words.
add: Bilingual quirk: You can now choose between being able to speak or
not speak the language
add: Bilingual quirk: You can now choose to have partial understanding
of your language, rather than full.
qol: If you speak in ALL CAPS in a foreign language, the translated
words will also be ALL CAPS.
qol: Many more forms of punctuation are now conveyed across
translations.
qol: The 1000 most common English words will now never be scrambled when
translating into other languages for the duration of the round. This
means you can actually "learn" some words if you are especially
attentive! (Until the next round at least)
refactor: Refactored language translations. Report if you see any super
odd looking translations.
fix: Force-says forcing you to speak common (such as cult invocations)
will now correctly force you to speak common (even if you don't know
common)
/🆑
2025-04-13 22:01:33 +01:00
harry
1b68eba3d8 [NO GBP] removes scalies from the codebase (#90472)
## About The Pull Request
left over debug line that someone ...? forgot about

## Why It's Good For The Game
scalies:

## Changelog
🆑
fix: removes an excess debug line
/🆑
2025-04-07 17:07:27 +02:00
harry
2691b9a721 makes various uis more compatible with high dpi monitors, adds a preference for smaller windows (#90418)
## About The Pull Request
various uis (tgui-say, vv, player panel, anything using
`/datum/browser`) would not correct for dpi. they now do

we also have a preference to allow you to have smaller windows that are
zoomed out, instead of larger windows that are not zoomed

#### of note, this does require a small change to the usage of css
viewport units, like `vh` and `vw`. they need to be fed through the
`vp(100vw)` function first. there was only one such unit in the codebase

on 4k monitor with 200% scaling:

fixed (pref on default)

![BiygmRan0QqxOMqL@2x](https://github.com/user-attachments/assets/1bdbc93c-1cd4-4a17-bf18-6cca7a5df032)

pref disabled

![DUWSVJNXt3xuQJEy@2x](https://github.com/user-attachments/assets/1b87ed9e-0498-44c4-ab1b-2c0321e70ce0)


## Why It's Good For The Game
516 fucked with uis again and this unfucks them a bit

## Changelog
🆑
qol: there's a new UI preference called UI scale which allows people
that use windows scaling to have their UIs original size with the
contents zoomed out, instead of the default, which is the UIs being
larger with the contents "normal" size
fix: various UIs did not respect windows scaling, they now do
/🆑

---------

Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
2025-04-06 21:54:57 +02:00
harry
fde849bf5f makes the skin more compatible with 516 for high dpi monitors (#90416)
## About The Pull Request

changes a whole load of crap in the skin to make it a bit more reactive
to sizing changes, and thus to high dpi monitors

this required adding a bunch of splitters - these have a sane preset for
most monitors but if you ever need to edit it, it's hidden under the
chat settings

1920x1080, 100% scaling

![image](https://github.com/user-attachments/assets/d2b54186-2163-4a77-8580-59008bb7ccc6)

4k, 200% scaling
before:

![vraQH3PvmD8nAGcZ@2x](https://github.com/user-attachments/assets/7f66cfe4-a656-447e-a9b3-d8305638f13d)

after:

![1sc22SAu7x8AOU7D@2x](https://github.com/user-attachments/assets/c2c6e90f-e884-41b3-b80a-191d2aee1f8f)

the sliders:


[user-attachments/assets/776730a7-a325-4b3b-8e27-15636828c6d4](https://github.com/user-attachments/assets/776730a7-a325-4b3b-8e27-15636828c6d4)

## Why It's Good For The Game

it makes the game a bit more playable on my laptop

## Changelog

🆑
qol: under the chat settings, you can now press "Adjust UI Sizes" to
drag around some of the panel sizes
fix: the input at the bottom right is no longer so teeny tiny on 516 if
you use a window scaling that is greater than 100%
/🆑

---------

Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
2025-04-06 17:20:55 +02:00
LT3
b1ee40b157 Jukebox volume fixes (#90417)
## About The Pull Request

- Fixes jukebox volume reverting to 100% instead of preference setting
when adjusted at the jukebox.
- Fixes jukebox volume preference not applying to active jukebox music
track
- Splits jukebox and instrument into two different preferences.

## Why It's Good For The Game

The jukebox volume correctly updates and remains at what the player
sets.

## Changelog

🆑 LT3
fix: Jukebox volume preference applies to currently playing music
fix: Jukebox volume no longer resets to 100% when adjusted from the
object
/🆑
2025-04-05 22:27:05 +02:00
FlufflesTheDog
5bc18586a7 System for restricting quirks based on species, no more blood deficiency on bloodless species (#90326)
## About The Pull Request
Quirks can now define if they're "species appropriate," where the base
proc's behavior is simply "does this species already have the quirk's
main trait"
I am unsure if that on its own imposes any new restrictions, currently.

Additionally, blood deficiency cannot be picked on any species without
blood or that doesn't breathe.
I'm sure there's more that might make sense, I'm open to suggestions

Alternative to #90238
## Why It's Good For The Game
Currently, reduces the possibility of taking something like blood
deficiency on a race which suffers no downside from it in order to get
free positive quirks.
Future-ly, potentially allows quirks exclusive to only a select few
species as offered by #90238
## Changelog
🆑
fix: Species without blood can no longer be blood deficient
/🆑
2025-04-05 19:42:52 +02:00
Aylong
2df73da53e Fix ByondUI small map preview (#90277)
## About The Pull Request
This PR should fix the problem of small previews in TGUI once and for
all (I hope).

What was causing it? Because TGUI takes a long time to open, that's why
previews were generated broken (small).

On Byond 515 this problem was not so noticeable as the interfaces opened
faster, but with the release of 516 it became much worse.
Previews were generated inside a window that was not yet open, so the
scale was broken, sometimes the window would open before the preview was
done and sent, usually with small interfaces, or when reopening.

I'm not very good at working with signals, and to tell the truth this is
my second experience with them, so I hope I did it right.

## Why It's Good For The Game
No more small map previews

<details> <summary> Video </summary>


https://github.com/user-attachments/assets/834f3820-cc6a-4f65-90e5-d6bb2a118bcf

</details>

## Changelog

🆑
fix: Fixed small character preview, color matrix preview, mech preview,
and other previews with uses ByondUI map
/🆑

---------

Co-authored-by: Gaxeer <44334376+Gaxeer@users.noreply.github.com>
2025-03-28 05:26:48 +01:00
John Willard
663bc08d96 Smartfridge/Vending machine layouts auto-update rather than be a setting (#90159)
## About The Pull Request

Sorry for my incompetence with TGUI.

This comes from a comment I made here
https://github.com/tgstation/tgstation/pull/89137#issuecomment-2601185587
&
https://github.com/tgstation/tgstation/pull/89160#pullrequestreview-2566047191

Instead of having to go to your game settings, find the option of layout
style you want your vending/fridge machines to be, and change it without
having a UI to show you the difference, now the preference is tied to
the in-game UI; Clicking to swap to the other layout mode will
automatically update your prefs and stay until you change it again.

I also separated smartfridges and vending machines as 2 separate prefs
so players can have grid on one and list on the other.

I couldn't figure out a way to implement this without adding a new var
on base ``/datum``, if you got other possible solutions I'd be happy to
try. I thought of making 'layouts' limited to smartfridge/vending
machines, taking it out of backend for all UIs, but thought I should
avoid that if possible in case future UIs want to make use of it. If
it's better than a var on datum I'm fine taking that path instead.


https://github.com/user-attachments/assets/921586fa-1ec1-49c0-87ca-ec4bbb6aaa98

## Why It's Good For The Game

The settings list having these small options that you can't even see the
effects of until you find the machine in-game is a little lame, now
players don't even have to think about it, they simply set it to the
mode they want as they use the machine and it'll update itself for the
player.

Currently using the button to swap to list/grid mode instantly reverts
itself as soon as you close the UI, which is a little lame.

## Changelog

🆑
qol: Smartfridges and Vending machines no longer have a setting to
change the list/grid mode, it instead updates automatically as you swap
the mode in-game.
/🆑
2025-03-23 23:43:11 +01:00
MrMelbert
eb0e842320 Hallucination revamps and additions (#89865)
## About The Pull Request

1. Hallucination effects are now tiered

Hallucinations now all have tiers, ranging from common to special. 
If you are just hallucinating a teeny bit, you will not experience the
more extreme hallucinations, like bubblegum or your mom.
But if you're hallucinating off your butt, you will be a bit more likely
to experience them.

2. Hallucination rate has been tweaked

Default hallucination cooldown is now 20-80 seconds, up from 10-60
seconds.
However the cooldown will *also* vary depending on just how much you're
hallucinating, going down to 10-40 seconds.

3. RDS is now capped a bit lower (meaning you don't see the higher tiers
like bubblegum).

But I added a preference to uncap it. For the people who actually like
bubblegum visits.

4. If a hallucination fails to trigger, the cooldown will partially
reset. (by 75%)

5. "Fake chat" hallucination will pick more viable subjects.

Fake chat will try to find someone who can actually speak your language,
rather than make a monkey speak mothic or something.
(I may revisit this so if you're super-hallucinating it reverts to old
behavior though.)

6. Adds a hallucination: Fake blood

You hallucinate that you start bleeding, very simple.

7. Adds a hallucination: Fake telepathy

You hallucinate a random telepathic message, similar to fake chat.

8. Adds a hallucination: Eyes in the Dark

A nearby dark turf will have a set of glowing red eyes shine through the
dark. A classic.

9. Adds some new sub-hallucination: PDA ringtone (fake sound), summon
guns/magic (fake item)

Funny prank.

10. Makes mindbreaker a bit more effective at combating RDS.

Pretty much does nothing right now unless you gulp like 50u.

## Why It's Good For The Game

Hallucinations are pretty one note if you experience them for longer
than 10 minutes.

This is due to two fold:
- Many hallucinations are goofy, and not subtle
- Hallucinations trigger very rapidly

You will never fall for a hallucination because in between "You see John
Greytide put the blueprints away", you get your mom yelling at you,
everyone looking like syndies (again), and bubblegum

This pr addresses it by
- Limiting the wacky hallucinations for when you're really off your
gourd
- Reducing the period between triggers
- Adding a few hallucinations

If the wackier hallucinations are reserved for when you're really off
your rocker, this lets the more subtle ones sink in over time, leaves
more room for second guessing

## Changelog

🆑 Melbert
add: Adds 4-5 new hallucinations. Collect them all.
balance: If you are only hallucinating a little bit, the game will
prefer to pick more subtle hallucinations. If you are hallucinating a
ton, it will prefer the more wacky hallucinations.
balance: If you are only hallucinating a little bit, the cooldown
between hallucinations is longer. If you are hallucinating a ton, it
will be shorter.
balance: If a hallucination fails to trigger (such as a deaf person
getting a sound hallucination) the next one will be a lot sooner.
balance: RDS hallucination amount is capped at mid tier hallucinations.
This means bubblegum and co. will be a lot rarer, or will even never
show. HOWEVER, there is now a preference allowing you to uncap your RDS
hallucinations.
balance: Mindbreaker toxin is more effective at suppressing RDS.
balance: Some hallucinations effects have been tweaked up or down
according to the new thresholds. Madness mask as an example.
fix: "Fake Fire" Hallucination works again, and now has a unique message
for if you stop-drop-roll that other people see.
/🆑
2025-03-20 21:36:56 +00:00
SmArtKar
845ed7459e Bravo Six, Going Dark: Refactors client colors to fix dupe issues and support filters (#89843)
## About The Pull Request

Completely refactored how client colors are handled. Now they're similar
to traits, having a source associated with them. Instead of adding and
removing by strict type (which makes client colors prone to getting
duplicated and not cleaned up) you remove a filter associated with a
specific source. Adding another client color with the same source as an
already existing one will replace the existing one if its of a different
type, or do nothing if they're the same (unless force is set to TRUE).
Client colors can also force filter splitting, putting all colors that
come before them, themselves, and all colors after them into separate
filters - this is useful to prevent mixing in filters which are supposed
to remove a certain color.

<details>

<summary>Example of how Perceptomatrix and nightmare vision goggles
combined before this PR:</summary>


![dreamseeker_fBOse2i0jq](https://github.com/user-attachments/assets/fb164e1f-ce8b-4a8c-8820-5db25e710056)

And this is after, as you can see nightmare vision effect's red is only
slightly tinted by perceptomatix instead of being literally halved.


![dreamseeker_U6A24fetK8](https://github.com/user-attachments/assets/8d8b3eb5-9f53-4646-bc56-0f5897013c6f)

</details>

Additionally, added support for custom filters (and not just colors) to
client color code to allow us to work with more colorspaces.

Also fixed weird blindness behavior, so this also 
Closes #89787

## Why It's Good For The Game

Makes code less ass to work with, fixes weird color mixing, etc.

## Changelog
🆑
fix: Fixed perceptomatix helmet allowing you to see even when
unconscious
refactor: Refactored how client colors are handled, ensuring that
certain effects like nightmare goggles don't disappear when another
vision-affecting piece of clothing is worn.
/🆑
2025-03-17 11:35:11 +00:00
MrMelbert
6d2bab909c Fixes the prefs dummy not updating for species features / Bald quirk prefs QoL (#89833)
## About The Pull Request


![image](https://github.com/user-attachments/assets/b03901a2-1c2d-4793-9591-abe824a90fd5)

Fixes #89768
Fixes #89769

- Fixes the prefs menu not updating mobs

Organs are imprinted on insert, and SSwardrobe didn't reset this
imprinting status when taking out items.

Weirdly in the past (testing old commits) items withdrawn DID reset
imprinting status - or maybe they never set it in the first place?

- Lots of prefs now respect features

`is_accessible` is used when checking many features rather than the
prefs menu checking itself in the UI

- Bald quirk QOL

Just handy stuff like showing the wig in the prefs preview, pre-starting
with your hat attached

## Changelog

🆑 Melbert
fix: Preference dummy now properly updates when changing some species
features
qol: If you have the bald quirk selected, the wig shows up on the
preference dummy
qol: If you have the bald quirk selected, and your role starts with a
hat, the hat will start attached to your wig
/🆑
2025-03-11 19:32:59 +01:00
The Sharkening
4e131fd24e HACK: Fixes 516 small character creator bug by shaking screen_loc. (#89933)
## About The Pull Request

So basically there's some byond bug that has made character previews
small and things like cameras offset for the longest time when you open
them.

Basically when ``/atom/movable/screen/proc/set_position`` is called and
it has an ``assigned_map``, sleep, add three to the x and y offset,
sleep, then reset it. Sorry @Mothblocks but your original code to update
the character after a second doesn't seem to work anymore.


![dreamseeker_a1EDRWfgDA](https://github.com/user-attachments/assets/b7940fa9-ef92-40cd-a700-b22aefdfa286)



## Why It's Good For The Game

This is not good for the game

## Changelog


🆑
fix: Character creator preview being miniature
/🆑
2025-03-10 21:00:40 -07:00
SmArtKar
7c536cd4f0 Fixes runtimes in fit_viewport when user has the game minimized (#89802)
## About The Pull Request

Winget returns 0x0 size when the window is minimized, and it can be set
to 0x0 via external tools as well. In this case we should just abort
fit_viewport to prevent runtimes.

## Changelog

Not player facing
2025-03-06 10:31:35 -05: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
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
grungussuss
4d6482bc7d Adds another option for ghost polling sound. (#88858)
## About The Pull Request
- This is a commissioned work.
- added a new ghost poll sound
- added volume sliders for ghost poll sounds
- added ghost poll sound pref
- renamed previous sound to calm
- calm is enabled by default
- normalised volume of the "calm" prompt


![image](https://github.com/user-attachments/assets/4f5caeac-f2c1-4c19-adc0-a5ff2a742596)


![image](https://github.com/user-attachments/assets/3f5e476d-ce52-46a8-8790-5c2cd3321d84)


https://github.com/user-attachments/assets/8178c108-a632-4f06-879a-00203f2afd3a
## Why It's Good For The Game
- it's more ***alerty***
## Changelog
🆑 grungussuss
qol: ghost poll sound can now be disabled
qol: ghost poll sound volume can now be tweaked
sound: added new ghost poll sound.
sound: normalised volume of ghost poll sounds
/🆑
2025-02-23 19:35:00 +01: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
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
Aylong
5516a906b6 Adds TGUI layout preference (For SmartFridge & Vending machines for now) (#89160)
## About The Pull Request
Added preference for layout selection in some interfaces such as
SmartFridge and Vending, where there is an option to switch between grid
view and list view

This should cut out the default layout selection dilemma in UI's, since
the selection will now be available to the user forever, not just until
the interface closes and resetting the selection

Also, Vending UI now use Grid layout by default

### How do i implement that to my UI?
Simple, just import all required stuff into your UI:
`import { getLayoutState, LAYOUT, LayoutToggle } from
'./common/LayoutToggle';`

Next, create state: `const [toggleLayout, setToggleLayout] =
useState(getLayoutState());`
`getLayoutState()` can accept value, Make sure you fill it, if have no
plans to handle layouts through DM, like in SmartFridge
`getLayoutState(LAYOUT.Grid)`. Returns LAYOUT.Default... by default

And finally, put a layout switch somewhere, for example in Section
buttons: `<LayoutToggle state={toggleLayout} setState={setToggleLayout}
/>`
Where `state` is the actual value of useState, and `setState` is the
function to set the state

After all theese little manipulations, you can finally dEsIgN your
beautifull UI with 2 layouts. Don't forget to use enum for this:
`<Button fluid={LAYOUT.List) />` for example.
Seems pretty simple

## Why It's Good For The Game
No more arguing what is better and what is more convenient, everyone is
free to choose for themselves

## Demo
<details><summary> Video </summary>


https://github.com/user-attachments/assets/5752e354-81b4-4bdb-acb2-7e228be0f90c

</details>

## Changelog

🆑
qol: You can choose in preferences what layout use into the Smartfridge
or Vending machines: Grid or List. Default TGUI Layout preference. In
the future there may be more interfaces where there will be 2 layout
options. Also Vending UI now use Grid layout by default.
/🆑
2025-01-31 16:21:43 -08:00
Lucy
dfe9f50ad7 Bump minimum compile version to 515.1642 (#89164)
## About The Pull Request

This bumps the minimum compile version to 515.1642, due to [this BYOND
bug](https://www.byond.com/forum/post/2936624) where byondapi can
corrupt vars, and dreamluau is called regardless of whether a Lua script
is actually being ran (mostly via `DREAMLUAU_CLEAR_REF_USERDATA`), so
it's best to get rid of any potential of this bug triggering.

## Why It's Good For The Game

mrrrp mrrrp mrrrowww

## Changelog

No user-facing changes
2025-01-30 02:46:30 +00:00
MrMelbert
5782437eea Types "Who" and "Adminwho" as "INFO" and not "OOC" (#89229)
## About The Pull Request

#89099 added Who and Adminwho to OOC, which I think is incorrect (as OOC
is for OOC chat specifically)

So I have moved them to INFO (which is, quote, "Non-urgent messages from
the game and items")

In a similar vein I typed "Tip of the Round" and "Show Server Revision"
as info rather than OOC and untyped respectively

## Why It's Good For The Game

I don't like pressing "who" and having to change to my ooc tab

## Changelog

🆑 Melbert
qol: "Who" and "Adminwho" are typed as "Info" and not "OOC" (so they no
longer go to "OOC" tabs)
qol: "Tip of the Round" and "Show Server Revision" are also typed as
"Info", rather than "OOC" and untyped respectively
/🆑
2025-01-27 20:52:42 -07:00
TiviPlus
0a48f3057a Fixes some stuff with toggle_fullscreen (#89110)
## About The Pull Request
toggle_fullscreen:
collapsed 11 winsets into 3
is-maximised now is true for both sets, to ensure that the screen doesnt
sometimes go tiny when this is being toggled (was reported on tgmc) (and
yes this doesnt impact resizing)
now uses src instead of fickle usr
added a comment for a better implementation once its possible

toggle_status_bar
now uses src instead of fickle usr

p.s when will someone add prefs for this lmao
## Changelog
🆑
fix: fixed a case that could make untoggling fullscreen make your window
small
code: Cleaned up some fullscreen and status bar toggle code to function
better
/🆑

---------

Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com>
2025-01-27 09:15:29 -08:00
Lucy
9649c6dd6a Add the fancy block formatting to the Who, Adminwho, and Show Server Revision verbs (#89099)
## About The Pull Request


![image](https://github.com/user-attachments/assets/44018d96-c88a-479b-9db0-d87b0b68b92c)

## Why It's Good For The Game

eyecandy is nice :3

## Changelog
🆑
qol: Restyled the Who, Adminwho, and Show Server Revision verbs to be
prettier.
/🆑
2025-01-22 20:58:20 -07:00
Lucy
d4551fa3c7 [NO GBP] *Properly* rebuild plane masters after client login if switching between 515 and 516 (#88829)
## About The Pull Request

so i discovered this downstream, but forgot to pr upstream til now, the
proper way to rebuild planemasters is `rebuild_hud`, not directly
calling `rebuild_plane_masters`

## Why It's Good For The Game

whoopsie breaking graphics is bad

## Changelog
🆑
fix: Fixed graphics getting screwed up when reconnecting with BYOND 515
after playing on BYOND 516.
/🆑
2025-01-06 18:15:02 -08: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
Lucy
42d14f8e58 Implement byondStorage backend for tgui (#88624)
## About The Pull Request

This implements a byondstorage backend for TGUI, via porting the
relevant portion of these PRs from Paradise:
- https://github.com/ParadiseSS13/Paradise/pull/25363
- https://github.com/ParadiseSS13/Paradise/pull/26423
- https://github.com/ParadiseSS13/Paradise/pull/26617

Also rewrote `storage.js` to TypeScript

## Proof that it works
<details>
<summary>Screenshots</summary>

![2024-12-20 (1734741983) ~
dreamseeker](https://github.com/user-attachments/assets/8affd7a7-f0bb-4f4f-9017-b279efbdbdfc)

![2024-12-20 (1734742600) ~
dreamseeker](https://github.com/user-attachments/assets/20bf5063-6bf4-4e44-a6a2-0a04d543c164)

</details>

## Why It's Good For The Game

saving chat settings is good

## Changelog
🆑 Absolucy, S34NW
fix: Chat settings properly save on BYOND 516 now. Settings still won't
carry over from 515 tho, 515 and 516 settings will be separate.
/🆑
2024-12-31 14:09:16 -08: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
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
grungussuss
6014464c8d Removes an extra proc override in digitigrade pref logic (#88525)
## About The Pull Request
they're doing the same thing and this one does a bitfield check when the
value it's checking is a number, technically it works as intended right
now but if we ever added more - it would break.
## Changelog
🆑 grungussuss
code: removed an extra proc override in digitigrade legs preference
logic code
/🆑
2024-12-22 05:42:33 +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
Lucy
6046120e5f Updating player last seen info and connection log no longer blocks (#87906)
## About The Pull Request

Was investigating some stuff downstream related to undeleted SQL
queries, and these two queries were related.

thought it'd be best to make them not block
`/client/proc/set_client_age_from_db`, as the results are never checked
anyways, not even for errors.

I've added a new proc to SSdbcore, `FireAndForget` - takes the same
parameters as NewQuery, but instead of returning the query, it just
asynchronously executes and then deletes it.

## Why It's Good For The Game

less undeleted sql queries, less blocking. yay?

## Changelog

does this count as user-facing? unsure how i'd changelog this tbh
2024-11-15 23:49:13 +01:00
carlarctg
6c30a0179b Adds the Perceptomatrix Helm, a hallucination anomaly core item. (#87701)
## About The Pull Request

Changes the color of hallucination cores from red (?) to hot pink.

Adds the Perceptomatrix Helm, a hallucination anomaly core item.


![image](https://github.com/user-attachments/assets/d1b37313-f141-4638-b950-7d58556dbf8d)

This helmet shields the user's brain from all external stimuli while
creating a 1:1 replica of it, beamed straight into their mind. What this
means in practice is that the user's perception is hypercharged and
their brain shielded from psychic phenomena.

The sprite is a resprited marine helmet. It's mid and I don't like it
but I'm not a spriter.

List of effects:
Perception:
- Flash/Weld Immunity
- True Night Vision
- Blindness and blurriness immunity
- Expanded FOV

Brain Shielding:
- Perceptual Trauma Immunity
- Hallucination Immunity

Psyshield:
- Conversion and Mindswap Immunity
- Magical Mind Resistance (Much more limited than normal resistance)
- Technically counts as casting clothes

Additionally, you can an ability to invoke hallucinations on others on a
25-second cooldown.

![image](https://github.com/user-attachments/assets/7dd4eaba-90ba-4e67-a302-2aae844009a7)
## Why It's Good For The Game

I'm kinda tired of half the anomaly cores in the game having jack and
shit going for them. I also think there's a moderate lack of psychic
content in the game, so here we go.

### Yeah this is cool but like isn't it kinda fucking nuts? Holy shit
dude

Let's dissect this.

> Perception:
> - Flash/Weld Immunity
> - True Night Vision
> - Blindness and blurriness immunity
> - Expanded FOV

This part effectively amounts to nothing but night vision sunglasses.

> Brain Shielding:
> - Perceptual Trauma Immunity
> - Hallucination Immunity

This isn't all that impactful, either. Hallucination immunity is
immensely irrelevant. Perceptual trauma immunity, which means you ignore
effects like blindness or imaginary friends, is very, very niche.

> Psyshield:
> - Conversion and Mindswap Immunity
> - Magical Mind Resistance (Much more limited than normal resistance)
> - Technically counts as casting clothes

Basically just having a mindshield, and that only if you don't get it
taken off anyways. Mindswap immunity could be nice, that's really not
something you can even get otherwise.
Magical mind resistance isn't very good. It blocks mind reading,
nullblade sneak attacks, eye of god, many forms of telepathy, psyker
magic, the curse of madness, the curse of babel, and that's about it.
It's nice, but it won't stop a fireball.

A lot of this can in the end be duplicated with sunglasses &
oculine/mesons and welding protection, and a tinfoil hat, which is
partly why I added the ability. It staggers for a small duration and
causes hallucinations, and it's pretty fun to use, despite its effects
being rather understated.
2024-11-15 18:25:25 +00:00
Lucy
b8013f5e76 Rebuild plane masters after client login if switching between 515 and 516 (#87889)
## About The Pull Request

This makes `/datum/player_details` properly track BYOND version and
build separately, as opposed to just the full version string.

Whenever a client logs in, and their BYOND version is 516, while their
previous version was 515, or vice versa, it'll set a newly added client
var, `rebuild_plane_masters`, to TRUE.

During the `COMSIG_MOB_LOGIN` signal handler of a mob's HUD
(`/datum/hud/proc/client_refresh`), it will check to see if
`rebuild_plane_masters` is TRUE - if so, it will set the appropriate
`relay_loc` of (based on client BYOND version) of its plane master
groups, and rebuild their plane masters.

## Why It's Good For The Game

Makes testing stuff across 515 and 516 easier, as your screen won't
break when switching between the two.

## Changelog

516 is _still_ in private alpha, so no user-facing changes.
2024-11-14 19:50:35 +01:00
grungussuss
61ca36dc71 More accessibility options and pref menu (#87549)
## About The Pull Request
- added accessibility tab in prefs menu
- put darkened flashes option into this menu
- added `darken screen shake` pref, for motion sick people, darkens your
screen when experiencing screen shake.

<details>
OUTDATED 


![image_2024-10-29_023038297](https://github.com/user-attachments/assets/db9cfe23-74f7-413a-8d84-496384b3d3bf)

</details>


https://github.com/user-attachments/assets/e3fd43ad-a65c-47dc-add2-6c93048e8b61

## Why It's Good For The Game

makes it easier for people with disabilities to play the game.
## Changelog
🆑 grungussuss
qol: you can now mitigate motion sickness from screen shake by enabling
"darken screen shake" in preferences
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2024-11-12 09:08:51 +13:00
SmArtKar
ab1440ad90 Adds eye color overrides, converts cult/weed/silverscale eye effects to use them (#87782)
## About The Pull Request

Eye color effects are now controlled via a new overrides system, which
should prevent conflicts between different sources - such as smoking
weed, becoming a cultist, stopping your weed and getting normal eyes
(and subsequently getting your red eyes back when you get deconverted)

## Why It's Good For The Game

Should ensure that different eye color effects don't collide between
each other. Also need this for a future feature I wanna add.

## Changelog
🆑
refactor: Eye color effects are now controlled via a new overrides
system, which should prevent conflicts between different sources.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-11-10 11:54:46 +00:00
grungussuss
d09316667a Sound mixer attempt 2 (#87529)
## About The Pull Request

![image](https://github.com/user-attachments/assets/131caab0-5495-4f28-b9e0-46ce4ebc7b40)
## Why It's Good For The Game
gives players more control over how loud they want certain sounds to be
## Changelog
🆑 grungussuss
sound: the volume that ship ambience, ambience, radio noise and
announcements play at can now be tweaked in preferences, check your
preferences!
/🆑
2024-11-05 09:13:38 +13:00
Ghom
778ed9f1ab The death or internal/external organ pathing (ft. fixed fox ears and recoloring bodypart overlays with dye sprays) (#87434)
## About The Pull Request
This PR kills the abstract internal and external typepaths for organs,
now replaced by an EXTERNAL_ORGAN flag to distinguish the two kinds.

This PR also fixes fox ears (from #87162, no tail is added) and
mushpeople's caps (they should be red, the screenshot is a tad
outdated).

And yes, you can now use a hair dye spray to recolor body parts like
most tails, podpeople hair, mushpeople caps and cat ears. The process
can be reversed by using the spray again.

## Why It's Good For The Game
Time-Green put some effort during the last few months to untie functions
and mechanics from external/internal organ pathing. Now, all that this
pathing is good for are a few typechecks, easily replaceable with
bitflags.

Also podpeople and mushpeople need a way to recolor their "hair". This
kind of applies to fish tails from the fish infusion, which colors can't
be selected right now. The rest is just there if you ever want to
recolor your lizard tail for some reason.

Proof of testing btw (screenshot taken before mushpeople cap fix, right
side has dyed body parts, moth can't be dyed, they're already fabolous):

![immagine](https://github.com/user-attachments/assets/2bb625c9-9233-42eb-b9b8-e0bd6909ce89)

## Changelog

🆑
code: Removed internal/external pathing from organs in favor of a bit
flag. Hopefully this shouldn't break anything about organs.
fix: Fixed invisible fox ears.
fix: Fixed mushpeople caps not being colored red by default.
add: You can now dye most tails, podpeople hair, mushpeople caps etc.
with a hair dye spray.
/🆑
2024-10-30 08:03:02 +01:00
Time-Green
d170a410d4 Recovered Crew | Medical+Cargo Respawns (#87072)
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2024-10-26 09:36:57 +02:00
Profakos
9f7d6dea62 Outfits that put items in your hand now respect if the outfit is visual only (#87355)
## About The Pull Request

On a downstream, we have an antagonist, that is a less competent
wizards. This antagonist's preview outfit has a beer bottle in their
hand, which has caused runtimes, as the bottle did not have any reagents
instantiated, and it tried check its length for sloshing. After putting
in a check for the `initial` argument of `on_equip`, I have noticed that
the problem goes deeper: the various procs that handle putting something
in your hand do not pass along if the items is put in your hand as a
preview or not. This PR adds a new optional var to these procs, ensuring
that unwanted behaviour during previews won't trigger.

I also swapped `visualsOnly` to snake case, as it looked inconsistent
with the rest of the code style.
 
## Why It's Good For The Game

Making the argument that ensures avoiding side effects during previews
work with all kinds of items is good.

## Changelog

🆑
fix: if an outfit puts a reagent container in the preview dummy's hand,
it will not try to slosh
code: outfits putting items in your hand will respect the visual_only
argument
/🆑
2024-10-24 15:09:50 +02:00
Lucy
e16828f166 Add a separate preference for hearing AI VOX announcements (#87097)
## About The Pull Request

This adds a new preference, "Enable AI VOX announcements", which allows
you to toggle hearing the vocal AI VOX announcements.

Previously this was handled by the "Enable announcement sounds" setting,
but tbh having it lumped in with that sucks because it's very reasonable
to be okay with announcement dings, while not wanting to hear voxtest or
some shit.

## Why It's Good For The Game

I DO want to hear the normal announcement dings, but I ***never*** want
to hear the vocal AI announcements, and spamming "Stop Sounds" for every
single word to skip past it is annoying as hell.

## Changelog
🆑
add: Added a separate preference for hearing vocal AI announcements
(also known as VOX), as opposed to lumping it into the "Enable
announcement sounds" preference.
/🆑
2024-10-24 04:14:12 +02:00
SmArtKar
df00d85356 Eye wounds, scars and a new ~Pirate~ RP quirk (#87209)
## About The Pull Request

Upon getting stabbed in your eyes or having a bullet fly through your
head there's a chance (minor for stabbing, extremely low for headshots)
you'll receive a new "Eye Puncture" wound which causes profuse bleeding
out of your now-empty eye hole. Once healed you'll have to deal with a
scar on your eye which cannot be cured and requires surgical
replacement. Eye scarring will reduce your eyes' max health by 15, give
you a minor screen tint and a fancy visual on your character sprite.
Getting scarring on both eyes will turn you completely blind.


![image](https://github.com/user-attachments/assets/c1ae4ff3-6844-405d-819b-9c390511e321)

This PR also introduces a new quirk which gives you eye scarring on the
eye of your choice and an eyepatch to go alongside it, just make sure
that it sits on the right eye.

Also added medical(white) subtype of eyepatches to loadout for those who
want that version instead. Credits to AnturK on discord for the idea.

## Why It's Good For The Game

Its a neat lil' feature that makes the game more immersive, and unlocks
more roleplay opportunities for players. New quirk gives access to this
feature for players who want to make it a part of their character's
backstory (or maybe as a part of permanent scar roleplaying).

## Changelog
🆑
add: Getting stabbed or shot in the eyes has a chance of giving you a
new wound and a semi-permanent scar, blinding you on one side
add: Added new "Scarred Eye" quirk which blinds you on one eye but gives
you a fancy eyepatch
add: Medical eyepatches have been added to loadout
/🆑

---------

Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
2024-10-19 13:39:19 +02:00
Emmett Gaines
f89494a84b Adds a warning and single retry to byond membership lookup (#86765)
## About The Pull Request

A few people are having issues getting byond membership features
disabled even though they're a byond member. This is *likely* due to
byond server troubles, and according to lummox the lookup proc should
return null when a connection issue happens. So I've put some handling
in there for that case as well as a single retry.

🆑
fix: Byond membership lookup should now warn you when it fails due to a
connection failure.
/🆑
2024-10-15 22:02:34 +02:00
carlarctg
2b0485d0c8 Adds a flipping skillchip, the Chipped quirk, a chip connector implant, and a quirk to spawn with it. (#87082)
## About The Pull Request

Added the FOSBURY skillchip, found in hacked toy vendors.
This skillchip allows you to bypass the emote cooldown when flipping or
spinning. However, if used too often, it will lower the chip's
integrity. At first, this is harmless, emitting sparks only, but at a
certain point, your head starts smoking, your brain begins
short-circuiting, and once the chip has lost all integrity your head
will explode in a shower of gore, giving you a cranial fissure!

Added the Chipped quirk. It allows you to spawn with one skillchip. Of
note here is that the only chips you can spawn with are the 'default'
skillchips found in the toy vendor, you can NOT spawn in with the
fosbury chip or with the musical one.

Added the Chip Connector quirk. It contains a new implant, the chip
connector, which allows you to install and take out skillchips at any
time. Being EMPed will cause it to drop one random skillchip, and if you
try using it while it's malfunctioning you'll take out a bit of your
brain instead. It can also be made at the exosuit fabricator after basic
research.

Renamed the organ slots for brain implants and made the connector
implant take the CNS slot.
## Why It's Good For The Game

> Added the FOSBURY skillchip, found in hacked toy vendors.
This skillchip allows you to bypass the emote cooldown when flipping or
spinning. However, if used too often, it will lower the chip's
integrity. At first, this is harmless, emitting sparks only, but at a
certain point, your head starts smoking, your brain begins
short-circuiting, and once the chip has lost all integrity your head
will explode in a shower of gore, giving you a cranial fissure!

During the time flipping was bugged to have no cooldown or delay, it was
really funny seeing people flip at increasingly higher speeds. Many
people miss it, and to be honest, so do I. But everything needs limits
or it stops being funny and ends up being overdone. To this end this
skillchip lets people relive those days of glory, until they go out in a
beautiful explosion. The chip will last a very long while if well taken
care of, and there are plenty of warning signs before it gets too risky
to use, but we know what players are actually gonna do, and I am looking
forward to it.

> Added the Chipped quirk. It allows you to spawn with one skillchip. Of
note here is that the only chips you can spawn with are the 'default'
skillchips found in the toy vendor, you can NOT spawn in with the
fosbury chip or with the musical one.

Chips can be kind of neat sometimes, and I think always having one as
part of your character can make for some fun things as the consistency
of it makes it more likely to stick in your mind to do stuff with.
> 'but can't you just go to the vendor at the start of every shift?'
Sure. But we have loadouts. We have tagger, musician, and many other
things that are 'roundstart bloat', and while that by itself is not an
excuse, it's part of the design of character setup: Minimizing the time
spent running around the station for things your character is supposed
to have for their personality/roleplay/gimmick. They're paying the cost
of quirk points for it, anyways.

> Added the Chip Connector quirk. It contains a new implant, the chip
connector, which allows you to install and take out skillchips at any
time. Being EMPed will cause it to drop one random skillchip, and if you
try using it while it's malfunctioning you'll take out a bit of your
brain instead. It can also be made at the exosuit fabricator after basic
research.

I like the idea of having a gross usb drive on the back of your brain
that you shove chips into and out of, especially if it drops pieces of
your brain when malfunctioning. It also adds a little bit of extra
relevance to skillchips now that you don't need to spend 15 (!!!)
seconds inside a skillstation to add one. The cost is, as stated, quite
literally losing your brain on EMP's and the moderately expensive sum of
4 points.

> Renamed the organ slots for brain implants and made the connector
implant take the CNS slot.

It annoys me that there were organ slots for 'anti drop implant'. Now
they're just slots for anything meant to connect to the
cerebellum/central nervous system, making it less brute forcey and also
adding the start of some fun exclusivity between brain implants.
## Changelog
🆑
add: Added the FOSBURY skillchip, found in hacked toy vendors. This
skillchip allows you to bypass the emote cooldown when flipping or
spinning. However, if used too often, it will lower the chip's integrity
and cause malfunctions.
add: Added the Chipped quirk. It allows you to spawn with one base
skillchip. (not the one above)
add: Added the Chip Connector quirk. It contains a new implant, the chip
connector, which allows you to install and take out skillchips at any
time.
code: Renamed the organ slots for brain implants and made the connector
implant take the CNS slot.

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-10-14 10:47:43 +02:00
Ghom
96c0c0b12c Fish infusion (#87030)
## About The Pull Request
I'm adding a new infusion ~~(actually four, but two of them are just
holders for specific organs tied to a couple fish traits)~~ to the game.
As the title says, it's about fish.

The infusion is composed of three primary organs, plus another few that
can be gotten from fish with specific traits.

The primary organs are:
- Gills (lungs): Instead of breathing oxygen, you now need to stay wet
or breathe water vapor.
- fish-DNA infused stomach: Can safely eat raw fish.
- fish tail: On its own, it only speeds you up on water turfs, but it
has another effect once past the organ set threshold. It also makes you
waddle and flop like a fish while crawling (I still gotta finish sprites
on this one)

Other organs are:
- semi-aquatic lungs: A subtype of gills from fish with the 'amphibious'
trait, falls back on oxygen if there's no water. Can also be gotten from
frogs, axolotl and crabs.
- fish-DNA infused liver: From fish with the 'toxic' trait. Uses
tetrodotoxin as a healing chem instead of a toxin. Also better tolerance
to alcohol if you want to drink like a fish (ba dum tsh).
- inky tongue: From fish with the 'ink production' trait. Gives mobs the
ability to spit ink on a cooldown, blinding and confusion foes
temporarily.

The main gimmick of this infusion revolves around being drenched in
water to benefit from it, In the case you get the gills organ, this also
becomes a necessity, to not suffocate to death (alternatively, you can
breathe water vapor, without any benefit). To enable the bonus of the
organs set, three organs need to be infused. They can be gills, stomach,
tail and/or liver, while the inky tongue doesn't count towards it.

Once the threshold is reached, the following bonus are enabled:
- Wetness decays a lot slower and resists fire a bit more.
- Ink spit becomes stronger, allowing it to very briefly knock down
foes.
- Fishing bonuses and experience
- Resistance to high pressures
- Slightly expanded FOV
- drinking water and showers mildly heal you over time.
- for felinids: You won't hate getting sprayed by water or taking a
shower.
- While wet:
- - If the fish tail is implanted, crawling speed is boosted.
- - You no longer slip on wet tiles.
- - You also become slippery when lying on the floor.
- - You get a very mild damage resistance and passive stamina
regeneration, and cool down faster.
- - You resist grabs better.
- - get a very weak positive moodlet.
- However, being dry will make you quite squisher, especially against
fire damage, slower and give you a modest negative moodlet.

While working on it, I've also noticed a few things that explained why
tetrodotoxin (TTX) did jackshit at low doses, because livers have a set
toxin tolerance value, below which, any amount of toxin does nothing.
Also I've felt like reagents like multiver & co were a bit too strong
against a reagent that's supposed to work at very low doses, with slow
metabolization, so I've added a couple variables to buff TTX a bit,
making it harder to purge and resistant to liver toxin tolerance (also
added a bit of lungs damage).



## Why It's Good For The Game
I wanted to take a shot at coding a DNA infusion and see how chock-full
I could make it. DNA infusions are like a middle point between "aha,
small visual trinket" and organs with generally ok effects. I seek to
make something a bit more complex ~~(also tied to fishing ofc because
that's more or less the recurrent gag of my recent features)~~ primaly
focused around the unique theme of being strong when wet and weaker when
dry.

EDIT: The PR is now ready, have a set of screenshots of the (fairly mid)
fish tails (and gills, barely visible) on randomly generated spessman
and one consistent joe:

![immagine](https://github.com/user-attachments/assets/a4965508-22e2-4d3a-8523-29fec6bce91e)


## Changelog

🆑
add: Added a new infusion to the game: Fish. Its main gimmick revolves
around being stronger and slippery when wet while weaker when dry.
balance: Buffed tetrodotoxin a little against liver tolerance and
purging reagents.
/🆑
2024-10-09 02:03:50 +02:00
Zephyr
0ef5c3d049 Persistent Map Vote Tallies (#86788)
## About The Pull Request

Changes map votes to be based on a persistent tally count.
Tallies for maps are cached between rounds and are added to by map
votes.
When a map is chosen, and it wasn't the only valid one, the tallies for
said chosen map will be reset.

Refactors map vote handling and moves it from SSmapping to SSmap_vote.
Rock the Vote has been removed as a result of this refactor.

## Why It's Good For The Game

Makes it more likely that all maps will be played over the course of a
server instead of always being truly random.
Removes some clutter off of SSmapping.

🆑
refactor: Map Votes are now carried over between rounds. When a map vote
is actually a contest, the winning map will have its votes reset.
/🆑
2024-09-30 13:09:08 +13:00
tonty
3f0b4abb8d Replaces world.icon_size (and some magic numbers) with defines (#86819)
## About The Pull Request

All usages of world.icon_size in code have been replaced with new
`ICONSIZE_X`, `ICONSIZE_Y` and `ICONSIZE_ALL` defines depending on
context

Replaces some "32" magic numbers with the defines

A few bits of code have been modified to split up x/y math as well

## Why It's Good For The Game

Magic number bad, code more readable, code more flexible and I'm told
there's an access cost to doing world.icon_size so minor performance
gains

## Changelog

🆑 tonty
code: made some code relating to the world's icon size more readable
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-09-29 13:28:32 +00:00
SmArtKar
d4ac95a0e1 Nobody expects the span inquisition: replaces most <span>s with macros (#86798)
## About The Pull Request
123 changed files and multiple crashes after writing broken regex, I
replaced most remains of direct spans with macros. This cleans up the
code and makes it easier to work with in general, see justification for
the original PR. I also fixed a bunch of broken and/or unclosed spans
here too.
I intentionally avoided replacing spans with multiple classes (in most
cases) and spans in the middle of strings as it would impact readability
(in my opinion at least) and could be done later if required.

## Why It's Good For The Game

Cleaner code, actually using our macros, fixes borked HTML in some
places. See original PR.

## Changelog
Nothing player-facing
2024-09-26 19:36:13 +00:00