Commit Graph

874 Commits

Author SHA1 Message Date
MrMelbert
f4bf6f8ce2 Revert "Fixes observers spamming admin logs when observing themselves" (#80470)
Reverts tgstation/tgstation#80407

Fixes #80460

Fixes #80485

I don't think this was a good fix, we should be preventing people from
observing themselves outright. Not "they can observe themselves but skip
the actual observe-part of observing".

Also it breaks observing.
2023-12-23 18:39:22 -08:00
Diamond_
75e4c46a5b Fixes observers spamming admin logs when observing themselves (#80407)
## About The Pull Request

Fixes #77034 by adding in a check to do_observe to prevent observers
from observing themselves. It does prevent them from observing their own
bodies and seeing their hud and entire inventory as a ghost, but that's
not a major problem because they probably either remember what they had
if it's so important to constantly see what's on their mob or it doesn't
matter. Additionally they can just use re-enter corpse so whatever.
## Why It's Good For The Game

Observers can no longer intentionally or even completely accidentally
flood admin logs from their observetarget not resetting due to them
observing themselves.
## Changelog
🆑
fix: Observers observing themselves no longer floods admins' logs.
/🆑
2023-12-18 16:44:07 +01:00
Fikou
a3fa541e2e Bridge Assistant Station Trait (#80279)
## About The Pull Request
adds a station trait which adds a new role, the bridge assistant
he is designed to help commandeer the bridge and help out other heads
when needed. he is armed with the mini energy gun (the one heads used to
have on kilostation), a flash, a toolbelt (with an inducer), some cool
shades and a swanky scarf.
as he is a nerd he is weak and unable to twohand weapons, preventing him
from wielding the fire axe.
currently he does not have a mindshield but he cannot roll antag
he currently has access to the bridge, announcement console, eva,
teleporter, gateway, maint, and a weapon permit (somewhat (not really
other than for nerds) interestingly this is the first job that isnt
assistant that doesnt have access to any lathes, so he doesnt have orm
access unlike all the other jobs (except assistant))
the trait also makes a coffee machine spawn on the bridge
here is some useful art of your role

![image](https://github.com/tgstation/tgstation/assets/23585223/905e5527-9069-4226-b160-8dedd1ea7b74)
and ingame screenshots

![image](https://github.com/tgstation/tgstation/assets/23585223/0aa537ac-a791-4249-a702-490584919fd9)

![image](https://github.com/tgstation/tgstation/assets/23585223/eb93e2d1-0291-4ade-9208-b1c0b68648c7)

![image](https://github.com/tgstation/tgstation/assets/23585223/1d3c2f11-8ac0-4ee9-91a5-176f81a08dcb)


## Why It's Good For The Game
Adds upon the station trait job system with a straight forward role that
IS just a human (unlike the cargorilla), and is pretty basic with no
custom assets or whatever other than hud icons
Having the bridge assistant in some rounds seems like a neat way to
protect it since it gets fucked up in like half the time, while also not
having enough mechanical depth or gameplay as to warrant it as a
permanent role

## Changelog
🆑
add: Bridge Assistant job accessible from a station trait.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2023-12-16 20:02:45 -05:00
Jacquerel
90b974071d Sign up for Cargorilla from the lobby (#79776)
## About The Pull Request

If the station rolls the "Cargo Gorilla" trait, a button will now be
visible on the lobby.
Clicking on this button before the round has started will add you to a
list of participants, one of whom will be selected to become a gorilla
when the round begins.
If nobody signs up (because they're really boring I guess) the job will
instead appear on the latejoin menu.
Once someone has become the gorilla the button will disappear.


![dreamseeker_ntP3OayAuV](https://github.com/tgstation/tgstation/assets/7483112/a26087ea-1ee7-4e9f-b37c-195cb1b1744f)

While implementing this I noticed that an inverted check means we were
never populating the "GLOB.cargo_sloth" field which means the station
trait wasn't even working.

BEHIND THE SCENES
This also adds a generic "job station trait" which can be expanded in
the future.
Future developers can extend this to add other "rare jobs" with relative
ease.
By default I have made it so all subtypes of this trait are mutually
exclusive, only one can roll at a time.

This also means that I have converted "cargo gorilla" into a job, which
applies most of the code previously located in the mob's typepath or in
the station trait.
The fact that it is a job means that **admins** can enable any number of
gorillas to be present on the latejoin menu (but not the roundstart one,
as it is not possible to add Cargo Gorilla to your occupation
preferences) if they so desire.
The random beurocratic station trait, event, and traitor item (and the
job console) are not able to add gorilla slots.

Because I changed "Cargo Gorilla" to a job it now no longer exists on
the map until a player gains the role, and there wasn't a non-hacky way
to copy the name of this round's cargo sloth. Instead I just added a
small cargo gorilla name list.

## Why It's Good For The Game

Makes the presence of a fun trait more visible to players.
Means that people who aren't observing get a chance to be a monkey.
This is a framework several other people have wanted to exist for their
own features.

## Changelog

🆑 Jacquerel and Fikou
qol: If the station rolls the "Cargo Gorilla" station trait. you will be
able to sign up for the role from the game lobby.
qol: If nobody signs up to be the Cargo Gorilla then you can select it
from the Late Join menu and arrive on the arrival shuttle.
fix: The Cargo Gorilla will actually spawn.
/🆑
2023-12-12 08:48:49 -08:00
distributivgesetz
f7cb0f8018 Rename notify_ghost_cloning to notify_revival (#80096)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Renames 
- `/mob/proc/notify_ghost_cloning` to `/mob/proc/notify_revival`
- `/mob/dead/observer/proc/notify_cloning` to
`/mob/dead/observer/proc/send_revival_notification`
- `/atom/movable/screen/alert/notify_cloning` to
`/atom/movable/screen/alert/revival`.

I could have found a way to merge both procs together but default
parameters keep me up at night.

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game

Conciseness, code that is named after a removed feature is silly.

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

nothing playerfacing

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2023-12-05 02:24:18 -05:00
Mothblocks
714ff3ec54 Remove /datum/game_mode, we SSdynamic now [again] (#79965)
I don't remember what was hard about this last time it took me like 20
minutes this time so I'm scared.

Removes dynamic simulations, only I have used them and it's a lot more
complicated now with this. I plan on making Dynamic simulations a part
of moth.fans anyway
2023-12-02 10:25:48 +13:00
san7890
de2c9a78d2 Fixes Ghostize Runtime (#79927)
## About The Pull Request


![image](https://github.com/tgstation/tgstation/assets/34697715/32e0ff55-30c3-4a73-b53b-0c2c610d5137)

I had this runtime sitting around for who-knows-how-long so I decided I
would just fix it today. `ghostize()` is expected to work on all
subtypes of `/mob` so it's a bad idea to access a variable that only
exists on `/mob/living` (and there is no real point to move
`timeofdeath` up a level imo, we already have too much clutter there and
`/mob/camera/imaginary_friend` would _never_ need it).
## Why It's Good For The Game

We should only access variables like these when when they exist.
## Changelog
No shot a player would ever notice this
2023-11-26 17:42:02 +01:00
lizardqueenlexi
9df358f79c Hardcore random will not assign incompatible quirks. (#79825)
## About The Pull Request

Fixes #78114.
Fixes #78505.

Grumble grumble, code rot.

#77727 inadvertently broke hardcore random quirk selection, making it
not actually check the compatibility of quirks before adding them. This
means that quirks that were never meant to go together could be randomly
assigned, which broke all kinds of things. I've simply made it properly
check for the typepath rather than checking typepaths against names,
making it actually function as intended.
## Why It's Good For The Game

Certain quirks are incompatible for a reason. Prevents unintended combos
that break in unexpected ways.
## Changelog
🆑
fix: Hardcore Random will no longer assign incompatible quirks.
/🆑
2023-11-19 10:50:52 +01:00
Jeremiah
bbe440b3d6 More standardization for ghost notifications (READY) (#79596)
## About The Pull Request
I'm still not satisfied with how ghost notifications work. This gives
every notification with a source (99% of all notifications, in other
words) a link to jump/orbit. Currently, notifications with "play"
interactions would only get the interact link, so jumping to the source
was pretty annoying.

It removes posting the entire message in the alert tooltip, as some got
pretty lengthy and it didn't seem to fit. To replace this, they will
always use headers

After:


![image](https://github.com/tgstation/tgstation/assets/42397676/debfce52-3627-4a43-8663-33d61d893161)


![image](https://github.com/tgstation/tgstation/assets/42397676/01f299ae-dc6a-45f8-a97a-cb2c815088b2)


![image](https://github.com/tgstation/tgstation/assets/42397676/99567376-063e-458e-af2a-2dd4306747cc)

NOTIFY_JUMP and NOTIFY_ORBIT have been merged, since the only difference
seems to be whether it's a turf. The result shaves off some redundant
lines of code, since most-every usage of notify_ghosts uses
NOTIFY_ORBIT.
## Why It's Good For The Game
More standardization for the ghost notification system. Adds a few alert
headers that never had them. All in all, makes it easier for creators to
throw alerts at ghosts
## Changelog
🆑
qol: Nearly every ghost alert should now feature a "VIEW" button, even
those with click interaction.
del: Ghost alerts no longer show the entire message in the tooltip,
instead have been replaced with titles.
/🆑
2023-11-19 05:13:25 +01:00
Jeremiah
153e06dc04 Partially reverts ghost announcements (#79221)
## About The Pull Request
#79139 turned out to be quite annoying, it wasn't taken into account
that these alerts can stack (ie: spiders).

Of course, I poked around the code and found some inconsistencies in the
process. For instance, there were usages of Topic for custom action
behavior which could've been consolidated. There were other instances
where jump (the default action) doesn't give a link at all, which I
think it should anyway, since the screen toast gives you this.

I've standardized it more, meaning you can use "NOTIFY_PLAY" without
writing a custom link and topic handler (for instance, MMIs)
## Why It's Good For The Game
Fixes #79198
Fixes #79195
## Changelog
🆑
fix: Ghost alerts have been tuned down a bit.
/🆑
2023-10-24 12:10:48 -06:00
Emmett Gaines
96d7e9c690 Invisibility refactor (#78908)
This adds a tracker for sources of invisibility and a priority system. I
needed this for another thing so I'm doing this first since it touches a
lot of code. As for the bugs fixed in the changelog, it's only what I
noticed while going through everything and there's likely a few more
things fixed with this. This should be testmerged for a while, I'll
bring this out of draft when it feels safe.

🆑
admin: Invisimin can now be used on mobs that are already invisible,
whether through temporary or permanent effects.
fix: Monkeyize/Humanize mob transformations no longer permanently reveal
invisible mobs if they had effects making them invisible otherwise.
fix: Objects with the undertile element that have been made invisible
through other means are no longer revealed by being uncovered.
/🆑
2023-10-17 13:07:31 -06:00
Cruix
f31532ed89 Added a larger afro hairstyle (#78709)
## About The Pull Request

It's exactly 6 months from April 1st, so this is a date for very serious
PRs only.

We've all seen that one tip at the beginning of the round:

![tipoftheround](https://github.com/tgstation/tgstation/assets/16478175/0d8d93a9-53c0-4983-b698-28d4656973fa)


So the afro must be really big, right? Having one must be a very large
sacrifice in the realm of pixel-based combat, right?

WRONG.

![oldAfro](https://github.com/tgstation/tgstation/assets/16478175/deba5f9d-c93b-49eb-adf3-de8b05233b45)
This is the largest afro currently available. Absolutely pathetic. It's
not even the largest hairstyle in terms of pixel volume.

Here's a bigger one.

![afros_comp](https://github.com/tgstation/tgstation/assets/16478175/d39b755e-8fb1-4a12-8089-80de3a2b7be6)

![Afros](https://github.com/tgstation/tgstation/assets/16478175/beaf307c-79a1-45c6-8d03-19ea856e8340)

The sprite overlaps the tile above by 6 pixels, which is noticeable, but
not enough to interfere significantly with gameplay (apart from having a
sacrificially larger hitbox).

![Afros2](https://github.com/tgstation/tgstation/assets/16478175/4069d3ff-c08f-44c6-8275-4421c8f820ee)

This could already be done by creating a new .dmi file with larger,
non-square pixel bounds, but that's a less than elegant solution.
Instead, added a y offset var to hair sprite accessory datums.

## Why It's Good For The Game

The self-expressive merits of having more hairstyles should be
self-evident, so I will make a mathematical argument here.

Everyone knows that the coolness of an afro is determined by its volume.
As a 2-D sprite, the closet equivalent we have is area. An afro is,
approximately, a circle, so the area can be calculated as πR^2, with R
being the maximum distance from the top of the head to the top of the
sprite bounding box.

The current largest afro has a height of 6 pixels. This new afro has a
height of 12 pixels. As a result, impressiveness increases by a factor
of 4:

```math
coolness_{new\ \ afro} \over coolness_{old\ \ afro}
```
```math
π12^2 \over π6^2
```
```math
12^2 \over 6^2
```
```math
144 \over 36
```
```math
4
```

This means that, for the intrusion of a mere 6 pixels into our northern
neighbor's bounding box, we get **quadruple** the coolness.

## Changelog

🆑
add: Added Afro (Huge) hairstyle
/🆑

---------

Co-authored-by: Cruix <discoveryian2@gmail.com>
2023-10-15 18:48:57 +02:00
MrMelbert
a69ede8114 Adds respawn config option forcing respawn as another character slot (#78459)
## About The Pull Request

Adds an option to the respawn config which forces you to pick another
character (slot) before you respawn.

## Why It's Good For The Game

Just an idea i'm throwing out there, not necessarily pushing for it to
be enabled on any servers.

Respawning as an alternative character can be a good way to make people
less frustrated at dying, particularly if paired with the cooldown
config that already exists:

"Oh shucks, I died and got my head cut off and got absorbed and got
spaced by some changeling. I won't be able to finish my project or
whatever. At least in 15 minutes I may be able to join as my botanist
character to try something else rather than having to wait an hour and a
half for the round to tick over."

Also nice for downstream support. 

(Obviously you can just, *ban* people who respawn as the same character,
use an honor system, but codifying it seems better than not.)

## Changelog

🆑 Melbert
config: Adds a config option for player respawning that enables
respawns, but forces you pick a new character.
config: "NORESPAWN" has been replaced with "ALLOW_RESPAWN 0". Unlimited
respawns is "ALLOW_RESPAWN 1" and character limited respawns is
"ALLOW_RESPAWN 2".
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2023-09-26 19:17:37 -06:00
Time-Green
ae41c46c50 Only double HCR for impressive greentexts (#78383)
There were a few exploits with free antags that would double your score.
This happened to me once by accident, but anyone could essentially
guarantee a point doubling.

I've changed the whole thing to only work for:
- Traitor
- Changeling
- Heretic
- Blood brother
- Headrev
- Wizard (you could get this with die of fate)
- Obsessed
- Magic and gun survivalists
- Holding the greentext book (because a cripple fighting for their life
for the greentext just seems funny and is rare enough)

Notably, revolutionairies, cult converts and brainwashed now no longer
pay out. Cult is pointless since you can't greentext without gibbing
(trust me I tried) and revolutionairy takes no effort other than having
strong teammates and doing nothing. There are a lot of other antags this
excludes, but those are mostly midrounds and non-humans (which are by
default excluded)

🆑
balance: Only traitor, changeling, heretic, blood brother, headrev,
wizard, obsessed, magic/gun survivalists and greentext book holders can
now double their hardcore random score
qol: Redtexting as antag with hardcore random score will pay you default
points, instead of none (normal survival rules)
fix: End report screen will properly report hardcore random survival in
case of station destruction
/🆑
2023-09-18 17:52:04 +02:00
san7890
4b8de7b79f Refactors the notransform variable into a trait. (#78146)
## About The Pull Request

Hey there,

There were more than a few times (like in cinematic code) where we might
need to accurately know the source of what's adding this trait (or have
multiple sources for the whole 'we don't want this mob to do shit while
we transform this mob'), so in order to rectify this potential issue,
let's refactor it into a trait.

## Why It's Good For The Game

Some code already declared that there might be issues with this being a
boolean var (with no way of knowing _why_ we don't want this mob to not
transform (or not do anything idk). Let's remove those comments and any
future doubt in those instances with the trait macros. Also, stuff like
`TRAIT_IMMOBILIZED` which does a similar thing in many contexts was
already a trait that was regularly added in conjunction with flipping
the variable, so we're able to flatten all that stuff into
`add_traits()` and `remove_traits()` now. nice

I also cleaned up quite a bit of code as I saw it, let me know if it
should be split out but I guarantee that if I didn't do it- no one will
for the next two years.

## Changelog

🆑
refactor: If you transform into another mob and notice bugs with
interacting with the game world, please create a bug report as this
framework was recently refactored.
/🆑

Probably fucked up somewhere, lmk

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2023-09-07 16:45:50 +01:00
DrTuxedo
a49b804ab3 Better alert/announcment sounds and Status displays (#78047)
## About The Pull Request
**Simplified version of #72179**

### SOUNDS

Changes next sound files:
- airraid.ogg
- bloblarm.ogg
- alert.ogg

Adds next sound files:
- notice3.ogg
- announce_syndi.ogg

Now `announce.ogg` plays when a Captain joins round, and
`announce_dig.ogg` for Requests Console announcements.
The `announce_syndi.ogg` plays when an announcement is made through an
emagged communications console. It also plays when the evacuation
shuttle is fully hijacked or Cultists fully corrupt the evacuation
shuttle.
You can listen to them all here:


https://github.com/tgstation/tgstation/assets/42353186/10c5e597-6db7-464a-b693-f5a2672dc3d0

_All of the sound files are either made by me from existing sounds in
the game or taken from freesound.org and properly credited._

### STATUS DISPLAYS
Status displays are fully replaced with the addition of a few new ones.
<details>
<summary>Status display monitor</summary>


![monitor](https://github.com/tgstation/tgstation/assets/42353186/3ad61a98-d4c7-47da-9107-b39a2fcedace)

![logo](https://github.com/tgstation/tgstation/assets/42353186/38f48aa9-1451-46c0-bccb-7f61d8aa6731)

</details>
<details>
<summary>Misc displays</summary>


![biohazard_big](https://github.com/tgstation/tgstation/assets/42353186/54204671-308b-4a0d-b6a1-a91ad6014eec)

![lockdown_big](https://github.com/tgstation/tgstation/assets/42353186/5d603daa-75b3-4390-a5df-2f6546d66bbf)

![radiation_big](https://github.com/tgstation/tgstation/assets/42353186/d77c5ff6-4a3b-46de-91ad-b3da7326f8b2)

</details>
<details>
<summary>Alert displays</summary>


![greenalert_big](https://github.com/tgstation/tgstation/assets/42353186/adc96267-c722-46e5-8e55-1998860e1c30)

![bluealert_big](https://github.com/tgstation/tgstation/assets/42353186/9a4d2da7-c29a-4987-8333-b2041b0ccb42)

![redalert_big](https://github.com/tgstation/tgstation/assets/42353186/427d4fed-19a2-49c1-86fe-d04c25f0417d)

![deltaalert_big](https://github.com/tgstation/tgstation/assets/42353186/72717e79-bb04-4961-ab06-baf714924139)

</details>

Now the communications console Status Display menu replaced the "Red
Alert" display option with the "Current Alert" which showcases the
current alert display.
Also, the Status Display menu has an additional "Radiation" display
option.
## Why It's Good For The Game

I believe this Pull Request is a good game for a couple of reasons:

1. It better conveys the gravity of emergency situations, such as Code
Red, by utilizing a more intimidating and recognizable sound. This gives
more weight to these situations, making them feel more urgent and
important in the game. Players always tend to not notice that it's in
action.
2. The replacement of the old and outdated Status Display sprites with
newer, more eye-catching ones is a great improvement. This helps to
emphasize the importance of emergency situations even further by making
them more noticeable. Status Displays was one of the last wall-mounts
using ancient sprites.
3. The Captain's arrival using another sound effect from other
announcements gives more status to the Captain as the ultimate head of
the station.
4. Heads announcement using `announce_dig.ogg` makes the sound itself
more used outside of SM cascade, and also makes Head announcements more
noticeable.
5. Emagged console using `announce_syndi.ogg` making Traitor
announcements more noticeable. Also, it is played after evac shuttle is
fully hijacked or corrupted by Cultists giving a more ominous effect
## Changelog
🆑
sound: Adds/modifies next sound files: airraid.ogg, bloblarm.ogg,
alert.ogg, notice3.ogg, announce_syndi.ogg
sound: Code Red, Delta, and other extreme emergencies now possess more
unique alarm sound effect
sound: Captain's arrival now is announced by Captain's announcement
sound, but not for Acting Captain's
sound: Making Captain announcement through emagged console; hijacking or
fully corrupting evacuation shuttle now plays more ominous sound
sound: Making announcements through Requests Console now plays a more
noticeable sound
image: Status Displays sprites have been fully changed. Now they include
displays for every Security Level
qol: The "Red Alert" button in the Communications console status display
menu has been replaced with a "Current Alert" button showing the current
station Security Level display on Status Displays
qol: Communications console status display menu got a new "Radiation"
button which shows radiation symbol on Status Displays
/🆑
2023-09-03 06:10:41 +02:00
Jacquerel
a6c66a098d Progress bars & cleaning particles will centre on the tile occupied by large icon objects (#77940)
## About The Pull Request

Do_after bars always draw based on the top-left corner of the targetted
atom, for atoms with sprites that are larger than 32x32 this gives them
a weird offset instead of being centred, which bugs me.
I have tried my best to figure out a way to reverse this which does not
interfere with atoms which use pixel_x/pixel_y to visually appear to be
on a different tile.

## Why It's Good For The Game

Before:

![image](https://github.com/tgstation/tgstation/assets/7483112/a1127695-58fa-40fc-aa0a-6bc8a0589e74)
he hates how you missed him completely 😦 

After:

![image](https://github.com/tgstation/tgstation/assets/7483112/deb4fbb8-e286-46b4-84a7-82b65b4f1eee)
now you're cleaning his feet 🙂 

## Changelog

🆑
image: progress bars and cleaning particles are now centered on the tile
occupied by the target, if it is a big sprite
/🆑
2023-08-28 17:18:40 -06:00
Mothblocks
19bfb14796 Fix a compiler mis-optimization in create_character (#77801)
`mind.transfer_to` sets mind to null.

`mind.set_original_character` thus, should not work, but happens to
because BYOND incorrectly caches this.

This is causing problems with OpenDream because they do not have this
same bug.
2023-08-22 10:32:55 -06:00
spookydonut
a7f473d611 Use typepaths for the quirk blacklist (#77727)
## About The Pull Request
The string list is awful for maintainability and is the reason the
filter_invalid_quirks() proc wouldn't work properly.

randomise_quirks() is still broken though.

## Why It's Good For The Game
## Changelog
🆑
fix: Incompatible quirks in existing savefiles shouldn't be possible
anymore.
/🆑
2023-08-19 12:21:32 -06:00
san7890
bae1aef3b4 Refactors Regal Rats into Basic Mobs (more titles edition) (#77681)
## About The Pull Request

I literally can't focus on anything nowadays, so I just did this to
break a never-ending chain of distress. Anyways, regal rats! These
fellas are mostly player controlled, but did have _some_ AI capabilities
(mainly tied to their actions), so that was incorporated too. Everything
should work as-expected (as well as look a shitload cleaner).

Instead of doing weird and awful conditional signals being sent out, I
made the `COMSIG_REGAL_RAT_INTERACT` (not the actual name) have a return
value so we can always rely on that working whenever we have that signal
registered on something we attack. I also cleaned up pretty much every
proc related to regal rats, gave them AIs to reflect their kingly nature
(and action capabilities (as well as move the action to
`mob_cooldown`)).

Since I thought they needed it, Regal Rats now get a special moniker!
This is stuff like "the Big Cheese" and what-not, like actual regents in
history. That's nice.
## Why It's Good For The Game

Two more off the list. Much better code to read. Way smarter rats with
spawning their army as part of a retaliatory assault (war). More sovl
with better regal rat names. The list goes on.
## Changelog
🆑
refactor: Regal Rats have been refactored into basic mobs. They should
be a bit smarter and retain their docility (until attacked, in which
case you should prepare to get rekt by summoned rats), and properly flee
when they can instead of just sit there as you beat them to death. The
framework for them interacting with stuff (i.e. opening doors while
slobbering on food) is a bit more unified too, now. They also have
cooler names too!
/🆑

FYI: Beyond a few code touchups, I haven't touched the actions at all. I
do not believe myself to be enthusiastic about fixing anything involving
the actions code as of this moment so that this PR is more overbloated
unless it's unbelievably stupid or easy to fix.
2023-08-18 23:09:07 +01:00
Bloop
ed8445a312 Adds sanity checking to prefs checks, fixing a bug that can cause emotes to stop displaying intermittently (#76946)
## About The Pull Request

This PR adds a bunch of sanity checking to the `prefs.chat_toggles` var
accesses.

Prefs can be null when client is creating/deleting and this causes a
runtime where you might not be able to use emotes.


![image](https://github.com/tgstation/tgstation/assets/13398309/d89649d4-19c7-439f-b080-332709196505)

EDIT: as per suggestion I stopped masking the issue and added stack
traces instead. And made them into helper procs to avoid code
duplication.

For some of these procs it is important that we are able to continue
running to get to the end. **A ghost having null prefs should not stop
everyone else from hearing/seeing the emote.**

So now they will put the stack trace and keep on trucking if that issue
occurs. This is the main 'point' of the PR, which has seemingly gotten
bogged down in the creation of the two helper procs--apologies.

See https://github.com/tgstation/tgstation/pull/70404 for essentially
the same issue but applied to chat messages. I have gone back and
replaced the duplicated code from that to use the new helper procs
instead.

## Why It's Good For The Game

Anything chat related is a bad place to runtime. Some messages can take
a while to type out and to have it not display is frustrating at worst,
possibly detrimental if you have to communicate something urgently.

## Changelog

🆑
fix: fixes a bug that can cause emotes to stop working if a client is
being created or deleted
/🆑
2023-08-14 22:30:35 +02:00
MrMelbert
d39657bdfa Fix double send of COMSIG_GLOB_CREWMEMBER_JOINED for latejoins (#77474)
## About The Pull Request

I saw this pop up on a port of one of my PRs and realized "damn that is
an issue"

`COMSIG_GLOB_CREWMEMBER_JOINED` was sent twice for latejoins, once in
`transfer_character` and once at the end of `AttemptLateSpawn`

This caused latejoiners to get the signal twice, so in the case of
Summon Guns, they'd get two guns
2023-08-10 10:32:11 +00:00
Sealed101
bece959d9c [NO GBP] Removes new player's status tab readiness; replaces it with a blip on Collapse Button (#77209)
## About The Pull Request
On the tin.
Ready blip will update with the new player's ready state, and upon game
start(or when a player joins an in-progress round) the blip is disabled.

<details><summary>Blip showcase (GACHI BGM WARNING)</summary>


https://github.com/tgstation/tgstation/assets/75863639/c3168e5d-f4de-4bec-bcea-bbdd150879aa

</details> 

## Why It's Good For The Game


![moth](https://github.com/tgstation/tgstation/assets/75863639/e6423c53-ff93-4e74-a152-24a8aaf7d6a0)


![moth2](https://github.com/tgstation/tgstation/assets/75863639/24a3336e-966d-43dd-a490-ba6c0d5dcff4)


## Changelog
🆑
del: removed new player status tab Readiness Status
add: added a Ready Status Blip on the Collapse Menu button
/🆑
2023-08-04 12:30:35 -06:00
John Willard
06ca7a4481 Hud screens now set hud owner in Initialize. (#76772)
## About The Pull Request

Adds an arg in huds' screens to add the hud owner in the Initialize,
instead of manually setting it every time we need to.
This is already done in ``New()`` for lobby screens, which I left intact
as lobby screens are used for new players, and are given out before
atoms are Initialized. Everything else, however, uses Initialize, so it
does not mess with any other args in their own Initializes (like the
Escape menu).
This also allows us to set the screens' HUDs as a private var, to ensure
this won't be messed with in the future.
Lastly I replaced instances of ``client`` with ``cannon_client`` to be
consistent with a lot of other parts of hud code.

## Why It's Good For The Game

Huds are easy to break when they do not have a hud owner, and for
something as important as that I believe it should be something you
opt-out of when you don't want it, rather than something you opt-into by
manually setting hud owner every time.
This cuts down on a lot of copy paste in hud code for humans, aliens,
etc.

## Changelog

🆑
refactor: Huds now have their hud owner set in Initialize
/🆑
2023-07-16 21:00:22 +02:00
Sealed101
d12cab7a49 Collapsible lobby buttons (#76443)
## About The Pull Request
Adds a button to the new player HUD that allows collapsing and expanding
the menu buttons.
Also gives the buttons names so they can show up in the BYOND's prompt
on the bottom left.
Readiness is now also displayed in the status tab.
The menu HUD can be reset with a verb Reset Lobby Menu HUD in the OOC
tab.

### I SAW FOOTAGE


https://github.com/tgstation/tgstation/assets/75863639/2054c09d-48d7-4736-b862-4406667dde67

#### Here be dragons (dev progress footage)

#### GACHI BGM WARNING
<details><summary>Mk. I </summary>


https://github.com/tgstation/tgstation/assets/75863639/3e886254-bebd-4aa3-b7f7-5fdd8b7c9040

</details> 

___

<details><summary>Mk. II</summary>


https://github.com/tgstation/tgstation/assets/75863639/14d84a2d-1732-4700-aad0-df85c9befa86

</details> 

___

<details><summary>Mk. III (featuring: the shutter!) ((NOT featuring:
gachi BGM))</summary>


https://github.com/tgstation/tgstation/assets/75863639/98576c1f-6877-41b9-bec6-e11207501965


</details> 

___

<details><summary>Mk. IV (new collapse button sprite )</summary>

~~& shutter graffiti~~ (in a followup PR)

this video has a bug with the poll button lighting up without an active
poll, this was fixed before it was pushed


https://github.com/tgstation/tgstation/assets/75863639/6c0489e2-c80a-4682-b543-5d7c74071a39

</details> 

___

<details><summary>Mk. IV with updated shutter sprite and animation
speed</summary>

<sub>TIL github sanitizes ♂ and probably other ascii from file
names</sub>


https://github.com/tgstation/tgstation/assets/75863639/61ed85fe-8df6-4f38-91aa-1f70258289e7

</details> 

## TO-DO
- [x] A shutter that comes down and hides the buttons away. 
  - [ ] The shutter will have a chance to have silly graffiti on it.
- [x] Redesign and move the collapse/expand button to be a part of the
menu.

## Why It's Good For The Game
Banishes the curse cast upon lobby art. Ties in with the on-going lobby
art contest.


## Changelog
🆑
qol: Lobby Menu buttons can now be collapsed. Rejoice!
qol: Lobby Menu buttons have names, which can be seen in the prompt on
the bottom left of the viewport.
qol: you may see your readiness status during pre-game in the Status
Bar.
qol: Reset Lobby Menu HUD verb added in case you manage to break the
damn thing.
/🆑
2023-07-12 18:55:33 -06:00
MrMelbert
5123e52589 Fixes some observer shenanigans (#76603)
## About The Pull Request

Fixes #76553

Sleeping inputs my beloved

Observetarget was overridden and thus we couldn't remove the original
target, so got to keep their stuff rather than removing it

## Why It's Good For The Game

Exploity

## Changelog

🆑 Melbert
fix: Fixed an exploit involving observers
/🆑
2023-07-06 11:23:19 -06:00
Yaroslav Nurkov
5e14a8e94d Job age restriction reason (#76540)
Just adds a reason to know why are you cant join on this job.
2023-07-05 13:31:26 -05:00
ChungusGamer666
d85e44c69c SPECIES NUKING 2023: Head flags 3 & Knuckles: Fixes some growing pains with head flags (#76440)
## About The Pull Request

Fixes https://github.com/tgstation/tgstation/issues/76422
This was caused by me somehow not using the wrapper there and not
noticing it

Also fixes hair gradients and facial hair gradients. I am pretty sure
they were uhh, being hidden behind the actual hair/facial hair. Oops.

Also also fixes spawning yourself as a human as admin and getting random
hair colors. That was just a failure to update the icon after updating
everything, I think?

Additionally, to totally babyproof all of this, ensures that head_flags
involved stuff gets applied AFTER species by creating a new preference
priority, and uses two separate wrappers to apply gradient style and
color.

Here's this absolute hellspawn to prove that everything works.

![image](https://github.com/tgstation/tgstation/assets/82850673/7ed29a68-cb60-4b28-996c-3be0e7331be8)

![image](https://github.com/tgstation/tgstation/assets/82850673/e57128be-0d7c-46ad-90dd-ee25981d0fea)

![image](https://github.com/tgstation/tgstation/assets/82850673/5c3619a8-fe6f-42b3-9fdc-12277d568e8d)

![image](https://github.com/tgstation/tgstation/assets/82850673/fdd13000-2220-47ad-8e02-44bc75a4a907)

Sorry for being so damn good at breaking this codebase.

## Why It's Good For The Game

Bugs are bad they make you mad

## Changelog

🆑
fix: Hair and facial hair gradients work again now
fix: Facial hair colors apply properly again
fix: Admin spawned characters will get hair color preferences applied
properly
/🆑
2023-07-01 14:15:25 +02:00
ChungusGamer666
614fab11b2 SPECIES NUKING 2023: Head flags 2: Electric Boogaloo (#76298)
## About The Pull Request

Continues the work I started on
https://github.com/tgstation/tgstation/pull/76074
Fixes https://github.com/tgstation/tgstation/issues/73782

Implements a bunch of wrapper procs for hair style, facial hair style,
etc etc the whole nine yards.
Fixes many issues, especially with gradients because I did sloppy tired
code that didn't work there.
Makes head/get_limb_icon() not a disgusting mess (well, at least makes
it less of a disgusting mess).

## Why It's Good For The Game

Actually makes hair and lips depend entirely on the bodypart.

## Changelog

🆑
refactor: Head rendering code has been updated significantly... Again.
Please report any issues with hair, facial hair, lipstick and such.
/🆑
2023-06-29 13:53:31 +00:00
ChungusGamer666
f030b3b5aa SPECIES NUKING 2023: Refactors a bunch of species traits into flags for the head bodypart (#76074)
## About The Pull Request

Title. 
I saw a comment on psyker code complaining about these species traits
(which admittedly, they suck) and heeded the call to turn all of this
crap into something defined almost entirely by the head bodypart.

## Why It's Good For The Game

Potential to simplify species code further in the future, by delegating
more visuals to bodyparts, which is where most of them should be
handled.

## Changelog

Should not be player facing, unless I fucked up.

---------

Co-authored-by: Time-Green <timkoster1@hotmail.com>
2023-06-22 10:23:19 +02:00
Zephyr
6977a041a9 Do not add external organs if not needed and not rendered. (#75963) 2023-06-20 06:48:45 +00:00
jimmyl
cccdd2cda5 Latejoining crew start with emergency large crowbars if arrivals is not powered (#75827)
If you latejoin, and arrivals environmental power is off (airlocks
depowered), you start with an emergency large crowbar in your hands (or
floor if both hands are full already)

Some arrival shuttles start with a crowbar, but its not enough if
someone already took it before you arrived.
Being stuck in airlock + firelock CBT especially with no air is very
shit (unless youre the CE or an Engineer who start with tools, unlikely)
Having a crowbar resolves movement
2023-06-16 19:56:56 +00:00
larentoun
036cfc84c8 feat: Respawn delay (optional) (#75544)
## About The Pull Request
Adds optional (disabled by default) respawn delay. If the player is
observer and have a body, it will firstly check the body. If the body is
destroyed or if there was none, then it will check observer's login
time.

## Why It's Good For The Game
Optional respawn delay is good, when you want players to comeback not
only as a midround event, but don't want them to not care about their
life. Also, if respawn is enabled, removes "money dupe" and other
problems with 0 respawn delay.

This proc can also be used for ghost-roles or anything else, where we
need to check how much time has elapsed since their death, but is not
implemented here.

## Changelog
🆑
add: Added optional respawn delay (disabled by default), which prevents
returning to lobby while dead.
/🆑
2023-06-08 23:28:45 -06:00
tattle
9f70308931 Restores mob tags to mob tag logging (#75850)
## About The Why It's Good For The Game Pull Request Why It's Good For
The Game

These were accidentally removed from the log

## Changelog
🆑 Tattle
admin: mob tags are now part of the mob tag log again
/🆑

---------

Co-authored-by: tattle <article.disaster@gmail.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
2023-06-05 01:31:18 +00:00
Watermelon914
569d8f5a72 Refactored the TTS subsystem to more properly handle message garbling. Added a volume preference for TTS. (#75559)
TTS subsystem refactor.
---------

Co-authored-by: Watermelon914 <3052169-Watermelon914@users.noreply.gitlab.com>
Co-authored-by: Iamgoofball <iamgoofball@gmail.com>
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
2023-05-22 13:29:20 +00:00
BlueMemesauce
5541fd816c The ghost verb no longer tries to succumb first if you are conscious (#75285)
## About The Pull Request

Makes it so the ghost verb doesn't try to succumb if you are conscious
and therefore can't succumb.
## Why It's Good For The Game

No more mildy annoying "You are unable to succumb to death! This life
continues." message when you press the ghost verb.

Even if you are a zombie and press the ghost verb while conscious you're
probably intending to ghost instead of succumb. So I don't think there's
any need for this message to exist while conscious.
## Changelog
🆑
qol: The ghost verb no longer says you are unable to succumb to death if
you're pressing it while conscious
/🆑
2023-05-10 11:07:00 +01:00
BlueMemesauce
9b80ebe403 Makes it so coroner is only listed in medical department instead of both service and medical (#75284)
Removes coroner from being under service in the crew manifest and
latejoin meny
I believe it would also make it so getting banned from Service jobs
wouldn't ban you from coroner. (Don't know if that ban type would ever
be used)
2023-05-10 03:02:54 +00:00
John Willard
2b844dab93 Mafia notes are no longer automatically written for you & new UI (#74819)
## About The Pull Request

Notes in Mafia are no longer written for you, you instead write it
yourself and save.
Also adds a button to automatically say out your notes for other
players.

Hides the judgment buttons when it's not time to judge
Makes the UI autoupdate and makes use of ui_data / ui_static_data

Video of it in action: https://www.youtube.com/watch?v=NDUSuIUqQv8

## Why It's Good For The Game

A downside to notes currently is that it's very easy to confirm yourself
as a role against players who don't code-dive to know exactly how notes
should be formatted for any role, this makes it easier, as everyone will
type out their own notes, and can send it directly to chat when needed.

## Changelog

🆑
balance: [Mafia] Notes are no longer written out for you.
qol: [Mafia] You can now send your notes to chat whenever.
qol: [Mafia] Roundend has changed. Solos will win over others in a 1v1,
but a HoP can keep a round going in case they can solo lynch.
/🆑
2023-04-25 08:43:36 -07:00
ShizCalev
933da32408 Fixes new players causing gravity related runtimes if they load in before SSMapping finished initialization. (#74671)
🆑 ShizCalev
fix: Fixed an annoying gravity runtime that occurred if a player was
connected before mapping finished initialization.
/🆑

Fixes https://github.com/tgstation/tgstation/issues/74532
2023-04-12 23:28:05 -04:00
NamelessFairy
670136a239 Refactors CTF (#74342)
## About The Pull Request
CTF code is rather infamous for being poor and hard to actually work
with, I wanted to add a feature for a mapping march project but the code
would not allow for it, so here we are refactoring the entire thing.
## Why It's Good For The Game

Replaces some really bad code with slightly less bad code. Should make
it much easier to add features onto CTF in the future.
## Changelog
🆑
refactor: CTF has been entirely refactored.
fix: Respawn times for CTF now work.
qol: CTF players are alerted during control point games when one team is
half way to winning.
admin: CTF instagib mode can now be toggled from the secrets panel.
/🆑
2023-04-09 17:13:06 -06:00
Zephyr
ecbcef778d Refactors Regenerate Organs, and a few organ helpers (#74219)
## About The Pull Request

Refactors regenerate organs to be slightly more intelligent in handling
organ changes and replacements.
Noteably:
- We don't remove organs that were modified by the owner; such as
changing out your heart for a cybernetic
- We early break out of the for loop if they aren't supposed to have an
organ there and remove it
- We check for the organ already being correct, and just healing it and
continuing if it is

Also changes the names of some of the organ helpers into snake_case
### Mapping March
Ckey to receive rewards: N/A

## Why It's Good For The Game
## Changelog

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2023-03-26 17:54:36 +01:00
san7890
a6f49ed542 Refactors Suiciding Variable Into Trait (#74150)
## About The Pull Request

Firstly, this var was on `/mob`, even though only `/mob/living` and
`/mob/dead` could have ever used it, so who knows how much needless
memory it was consuming on stuff such as `oranges_ear` that would never
ever ever use something like this.

Edit: okay instead of memory it just polluted variable edit windows for
all /mob when it didn't need to. I like having a slim VV window

Secondly, it's a technical improvement over the previous system as we
are able to "track" where a suicide originates from, and how we can
track that from mob-to-mob-to-mob. Previously, the boolean `suiciding`
would only inform us if they had ever been connected to a mob that had
ever committed suicide, but now we are able to precisely determine which
mob gave them the trait that they must now apparently bear until the
round restarts.

## Why It's Good For The Game

Less memory usage, more indepth ability to track suicides in case you
really need that dexterity. Currently no implemented code could benefit
from using it, but it would be pretty neat if someone could figure out a
way to have someone be guilt-tripped whenever they look into a mirror
and seeing the reflection of their past life? This PR won't actually
help you code that and it'll probably require a bit more work, but it's
a possibility of some cool interactions you can do when you have this
information available to you.


![image](https://user-images.githubusercontent.com/34697715/226506321-550c37e7-5de8-4f9f-9ceb-4bf9b1052597.png)

## Changelog

🆑
refactor: Some aspects of how we track suicides from your living mob to
your observer have changed- please do let us know if anything has broken
via a GitHub Issue Report.
/🆑

There's probably some technical improvements that can be made in some
parts of the code I reworked to accommodate this change, do let me know
if you spot any easy ones (or fuckups). a lot of excess comes from the
fact that any step in the TRAIT framework trusts that you are passing in
a valid datum (or subtype) so that's a thing
2023-03-21 20:06:45 -04:00
VastKilleroOm
86d098ad80 add new hairstyle - Zieglertail (#73754)
## About The Pull Request

Adds a new hairstyle to the game - Ziegler

 Based on TGMC hairstyle

![image](https://user-images.githubusercontent.com/74047915/222608803-96c8d9e7-d9bd-461a-ba65-d8e28695cc6a.png)

## Why It's Good For The Game

A little more customization for crew members.
And my good friend will be happy)

🆑 Vlada - VastKilleroOm
imageadd: added 1 hairstyle icon

/🆑
2023-03-03 16:12:27 -08:00
LemonInTheDark
ab307032ed Nightvision Rework (In the name of color) (#73094)
## About The Pull Request

Relies on #72886 for some render relay expansion I use for light_mask
stuff.

Hello bestie! Night vision pissed me off, so I've come to burn this
place to the ground.
Two sections to discuss here. First we'll talk about see_in_dark and why
I hate it, second we'll discuss the lighting plane and how we brighten
it, plus introducing color to the party.

### `see_in_dark` and why it kinda sucks

https://www.byond.com/docs/ref/#/mob/var/see_in_dark

See in dark lets us control how far away from us a turf can be before we
hide it/its contents if it's dark (not got luminosity set)
We currently set it semi inconsistently to provide nightvision to mobs.

The trouble is stuff that produces light != stuff that sets luminosity.
The worst case of this can be seen by walking out of escape on icebox,
where you'll see this


![image](https://user-images.githubusercontent.com/58055496/215683654-587fb00f-ebb8-4c83-962d-a1b2bf429c4a.png)

Snow draws above the lighting plane, so the snow will intermittently
draw, depending on see_in_dark and the luminosity from tracking lights.
This would in theory be solvable by modifying the area, but the same
problem applies across many things in the codebase.
As things currently stand, to be emissive you NEED to have a light on
your tile. People are bad at this, and honestly it's a bit much to
expect of them. An emissive overlay on a canister shouldn't need an
element or something and a list on turfs to manage it.
This gets worse when you factor in the patterns I'm using to avoid
drawing lights above nothing, which leads to lights that should show,
but are misoffset because their parent pixel offsets.

It's silly. We do it so we can have things like mesons without just
handing out night vision, but even there the effect of just hiding
objects and mobs looks baddddddd when moving. It's always bothered me.
I'll complain about mesons more later, but really just like, they're too
bright as it is.

I'm proposing here that rather then manually hiding stuff based off
distance from the player, we can instead show/hide using just the
lighting plane. This means things like mesons are gonna get dimmer, but
that's fine because they suck.

It does have some side effects, things like view() on mobs won't hide
stuff in darkness, but that's fine because none actually thinks about
view like that, I think.

Oh and I added a case to prevent examining stuff that's in darkness, and
not right next to you when you don't have enough nightvision, to match
the old behavior `see_in_dark` gave us.

Now I'd like to go on a mild tangent about color, please bare with me

### Color and why `lighting_alpha` REALLY sucks

You ever walk around with mesons on when there's a fire going, or an
ethereal or firelocks down.
You notice how there isn't really much color to our lights? Doesn't that
suck?

It's because the way we go about brighting lighting is by making
everything on the lighting plane transparent.
This is fine for brightening things, but it ends up looking kinda crummy
in the end and leads to really washed out colors that should be bright.
Playing engineer or miner gets fucking depressing.

The central idea of this pr, that everything else falls out of, is
instead of making the plane more transparent, we can use color matrixes
to make things AT LEAST x bright.

https://www.byond.com/docs/ref/#/{notes}/color-matrix

Brief recap for color matrixes, fully expanded they're a set of 20
different values in a list
Units generally scale 0-1 as multipliers, though since it's
multiplication in order to make an rgb(1,1,1) pixel fullbright you would
need to use 255s.

A "unit matrix" for color looks like this:
```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     0, 0, 0, 0
)
```

The first four rows are how much each r, g, b and a impact r, g, b and
well a.
So a first row of `(1, 0, 0, 0)` means 1 unit of r results in 1 unit of
r. and 0 units of green, blue and alpha, and so on.
A first row of `(0, 1, 0, 0)` would make 1 red component into 1 green
component, and leave red, blue and alpha alone, shifting any red of
whatever it's applied to a green.

Using these we can essentially color transform our world. It's a fun
tool. But there's more.

That last row there doesn't take a variable input like the others.
Instead, it ADDS some fraction of 255 to red, green, blue and alpha.

So a fifth row of `(1, 0, 0, 0)` would make every pixel as red as it
could possibly be.

This is what we're going to exploit here. You see all these values
accept negative multipliers, so we can lower colors down instead of
raising them up!
The key idea is using color matrix filters
https://www.byond.com/docs/ref/#/{notes}/filters/color to chain these
operations together.

Pulling alllll the way back, we want to brighten darkness without
affecting brighter colors.
Lower rgb values are darker, higher ones are brighter. This relationship
isn't really linear because of suffering reasons, but it's good enough
for this.
Let's try chaining some matrixes on the lighting plane, which is bright
where fullbright, and dark where dark.

Take a list like this

```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     -0.2, -0.2, -0.2, 0
)
```
That would darken the lighting a bit, but negative values will get
rounded to 0
A subsequent raising by the same amount
```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     0.2, 0.2, 0.2, 0
)
```
Will essentially threshold our brightness at that value.
This ensures we aren't washing out colors when we make things brighter,
while leaving higher values unaffected since they basically just had a
constant subtracted and then readded.

### But wait, there's more

You may have noticed, we gain access to individual color components
here.
This means not only can we darken and lighten by thresholds, we can
COLOR those thresholds.
```
list(1, 0, 0, 0,
     0, 1, 0, 0,
     0, 0, 1, 0,
     0, 0, 0, 1,
     0.1, 0.2, 0.1, 0
)
```
Something like the above, if applied with its inverse, would tint the
darkness green.
The delta between the different scalars will determine how vivid the
color is, and the actual value will impact the brightness.

Something that's always bothered me about nightvision is it's just
greyscale for the most part, there isn't any color to it.
There was an old idea of coloring the game plane to match their lenses,
but if you've ever played with the colorblind quirk you know that gets
headachey really fast.
So instead of that, lets color just the darkness that these glasses
produce.
It provides some reminder that you're wearing them, instead of just
being something you forget about while playing, and provides a reason to
use flashlights and such since they can give you a clearer, less tinted
view of things while retaining the ability to look around things.

I've so far applied this pattern to JUST headwear for humans (also those
mining wisps)
I'm planning on furthering it to mobs that use nightvision, but I wanted
to get this up cause I don't wanna pr it the day before the freeze.

Mesons are green, sec night vision is red, thermals orange, etc.

I think the effect this gives is really really nice. 
I've tuned most things to work for the station, though mesons works for
lavaland for obvious reasons.

I've tuned things significantly darker then we have them set currently,
since I really hate flat lighting and this system suffers when
interacting with it.

My goal with these is to give you a rough idea of what's around you,
without a good eye for detail.
That's the difference between say, mesons, and night vision. One helps
you see outlines, the other gives you detail and prevents missing
someone in the darkness.

It's hard to balance this precisely because of different colored
backgrounds (looking at you icebox)
More can be done on this front in future but I'm quite happy with things
as of now

### **EDIT**

I have since expanded to all uses of nightvision, coloring most all of
them.

Along the way I turned some toggleable nightvision into just one level. 
Fullbright sucks, and I'd rather just have one "good" value.

I've kept it for a few cases, mostly eyes you rip out of mobs.
Impacted mobs are nightmares, aliens, zombies, revenants, states and
sort of stands.

I've done a pass on all mobs and items that impact nightvision and added
what I thought was the right level of color to them. This includes stuff
like blobs and shuttle control consoles
As with glasses much of this was around reducing vision, though I kept
it stronger here, since many of these mobs rely on it for engaging with
the game

<details>
<summary>
Technical Changes
</summary>

#### Adds filter proc (the ones that act like templates) support to
filter transitions.
Found this when testing this pr, seemed silly.

#### Makes our emissive mask mask all light instead
This avoids dumbass overlay lighting lighting up wallmounts.
We switch modes if some turfflags are set, to accomplish the same thing
with more overhead, and support showing things through the darkness.

Also fixes a bug where you'd only get one fullscreen object per mob, so
opening and closing a submap would take it away

Also also fixes the lighting backdrop not actually spanning the screen. 
It doesn't actually do anything anymore because of the fullscreen light
we have, but just in case that's unsued.
Needs cleanup in future.

#### Moves openspace to its own plane that doesn't draw, maxing its
color with a sprite

This is to support the above
We relay this plane to lighting mask so openspace can like, have
lighting

#### Changes our definition of nightvision to the light cutoff of night
vision goggles and such
Side affect of removing see_in_dark. This logic is a bit weak atm, needs
some work.

#### Removes the nightvision spell
It's a dupe of the nightvision action button, and newly redundant since
I've removed all uses of it

#### Cleans up existing plane master critical defines, ensures
trasnparent won't render

These sucked
Also transparent stuff should never render, if it does you'll get white
blobs which suck

</details>

## Why It's Good For The Game

Videos! (Github doesn't like using a summary here I'm sorry)
<details>

Demonstration of ghost lighting, and color


https://user-images.githubusercontent.com/58055496/215693983-99e00f9e-7214-4cf4-a76a-6e669a8a1103.mp4

Engi-glass mesons and walking in maint (Potentially overtuned, yellow is
hard)


https://user-images.githubusercontent.com/58055496/215695978-26e7dc45-28aa-4285-ae95-62ea3d79860f.mp4

Diagnostic nightvision goggles and see_in_dark not hiding emissives


https://user-images.githubusercontent.com/58055496/215692233-115b4094-1099-4393-9e94-db2088d834f3.mp4

Sec nightvision (I just think it looks neat)


https://user-images.githubusercontent.com/58055496/215692269-bc08335e-0223-49c3-9faf-d2d7b22fe2d2.mp4

Medical nightvision goggles and other colors


https://user-images.githubusercontent.com/58055496/215692286-0ba3de6a-b1d5-4aed-a6eb-c32794ea45da.mp4

Miner mesons and mobs hiding in lavaland (This is basically the darkest
possible environment)


https://user-images.githubusercontent.com/58055496/215696327-26958b69-0e1c-4412-9298-4e9e68b3df68.mp4

Thermal goggles and coloring displayed mobs


https://user-images.githubusercontent.com/58055496/215692710-d2b101f3-7922-498c-918c-9b528d181430.mp4

</details>

I think it's pretty, and see_in_dark sucks butt.

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
add: The darkness that glasses and hud goggles that impact your
nightvision (think mesons, nightvision goggles, etc) lighten is now
tinted to match the glasses. S pretty IMO, and hopefully it helps with
forgetting you're wearing X.
balance: Nightvision is darker. I think bright looks bad, and things
like mesons do way too much
balance: Mesons (and mobs in general) no longer have a static distance
you can see stuff in the dark. If a tile is lit, you can now see it.
fix: Nightvision no longer dims colored lights, instead simply
thresholding off bits of darkness that are dimmer then some level.
/🆑
2023-02-17 18:10:39 -07:00
Tim
a1ada2c9ef Refactor, improve, and rename canUseTopic to be can_perform_action (#73434)
This builds on what #69790 did and improved the code even further.
Notable things:
- `Topic()` is a deprecated proc in our codebase (replaced with
Javascript tgui) so it makes sense to rename `canUseTopic` to
`can_perform_action` which is more straightforward in what it does.
- Positional and named arguments have been converted into a easier to
use `action_bitflag`
- The bitflags adds some new checks you can use like: `NEED_GRAVITY |
NEED_LITERACY | NEED_LIGHT` when you want to perform an action.
- Redundant, duplicate, or dead code has been removed.
- Fixes several runtimes where `canUseTopic` was being called without a
proper target (IV drips, gibber, food processor)
- Better documentation for the proc and bitflags with examples
2023-02-16 20:22:14 -05:00
Mothblocks
d67555a0b5 the inevitable Revert "Refactors admin verbs from giant ass lists into datums" in case stuff breaks (#73206)
Reverts tgstation/tgstation#72407
2023-02-05 11:44:38 +13:00
Zephyr
7f25d7f17b Refactors admin verbs from giant ass lists into datums (#72407)
## About The Pull Request

See title.
## Why It's Good For The Game

Makes it easier for people to add new admin buttons, and also removes
the giant ass ugly lists that are an affront to my eyes.

Yes you are still able to call them manually via the verb bar

![image](https://user-images.githubusercontent.com/12817816/210163285-2ecb4b59-67b4-47d2-b324-77048ce852fe.png)

![image](https://user-images.githubusercontent.com/12817816/210163288-5a0ec98c-9589-4cab-8a6b-1ab5151aa040.png)
## Changelog
🆑
refactor: Admin verbs are now datums with a dedicated panel handler
admin: Admin verbs now come with a handy description when you hover over
them!
/🆑

---------

Signed-off-by: GitHub <noreply@github.com>
2023-02-03 16:32:37 -08:00
LemonInTheDark
8ad6f5a2f3 Optimizes changing z level as a ghost by something like 85% (#73005)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

Optimizes hud image addition/removal on z change

We were doing a lot of repeated work here, not to mention all the proc
calls.
So I pushed the "operate on loops" behavior into its own proc, so I
could ensure we only do some of this stuff once

This plus some removal of safeties saves 75% of the cost of z level
transitions as a ghost

Prevents double on_changed_z_level calls from ghosts and shuttles

Reacting to z changes used to be done off doMove or one of those
children, timber moved it to Moved, but did not remove the calls that
assumed things like abstract_move wouldn't trigger it

This means that moving up/down as a ghost was causing a double call of
the whole z move stack. Suprised this never broke anything tbh

Makes csv stat tracking actually encode numbers properly, cleans up an
indev comment from plane group code

## Why It's Good For The Game

Speed, and fixes
2023-01-29 12:38:08 +01:00
Time-Green
37220c18fb Hardcore random gets a sixpack (#72992)
Have you ever really thought about how incredible ripped paraplegics
must be? Moving is much more difficult and they're always using their
arms


![image](https://user-images.githubusercontent.com/7501474/215131388-14075809-fa38-4986-a0b0-9b2e76fbfece.png)

🆑
qol: Hardcore random gets a sixpack
/🆑

### Why is this good for the game?

Everyone currently doing hardcore random gets a sixpack, it's a very
obscure visual distinction that I think is fun to just mess with people
with. "Why is the anemic quadruple amputee with brain cancer ripped to
shreds?"

This is also all just an elaborate scheme to display how the new
bodypart_overlay system can be used with absolutely minimal effort
2023-01-28 14:54:11 -05:00
Mothblocks
9d0cdfe909 Adds an Escape Menu (#72906) 2023-01-26 00:25:16 -08:00