Commit Graph

359 Commits

Author SHA1 Message Date
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
san7890
66d070a586 Wraps all instances of invoking Fail() into the TEST_FAIL Macro (#73407)
We shouldn't really be invoking the proc itself because then we don't
pass along the failing line/file to our consumers, let's use the macro
in all instances that really need it.

I noticed people were invoking the `Fail()` proc directly rather than
using `TEST_FAIL` instead, so they weren't getting those neat
annotations on their failing code because we never passed along the
failing line/file to actually apply those annotations. That's silly. We
don't even return on `TEST_FAIL` either, so there's no reason to not do
this (only upsides wahoo).
2023-02-16 21:54:04 +00:00
Jacquerel
7c30d9d746 Basic Wumborian Fugu & Fugu Gland (#73415)
## About The Pull Request

Fixes #72677 and also converted the "Wumborian Fugu" mob to a basic mob
rather than a simple one.
I will be totally honest: I didn't need to do that in order to fix the
bug. I just didn't like looking at the rest of the code in that file.
Also I have some kind of sickness which makes me do this.

This ended up being one of those "see something related and fix it as
well" ones so there's a couple of only tangentially related changes in
here. If you want me to split it up I will but I think this one is
_probably_ fine because the wide-ranging changes are pretty simple ones?

So what this PR does is:
- Refactors simple mob into basic mob.
- Cleans up its really ugly ability to work in a hopefully nicer way.
- A one line fix to the linked issue above.
- Modifies the default cooldown on `basic_melee_attack` and
`attack_obstructions` to be a widely used cooldown rather than a random
value used by no mob that we have.
- Renamed behaviour "try_mob_ability" to "targeted_mob_ability" and
added a new AI behaviour called "use_mob_ability", the difference
between the two being that the former requires a target and the latter
does not. I... don't actually use this because I realised after adding
it that I still want a target for this mob, but someone will need it
eventually.
- Change everywhere that is passing references to abilities to actions
to pass weak references instead.
- Adds an element to handle "spawn this stuff when a related mob dies".
- Found a few places where people were setting `environment_smash ` as
if it did anything (including me) and replaced them with the proper
ai_controller implementation instead, updated the comment to make it
clearer although that won't prevent copy/paste errors.
- Registered to the "movement speed updated" signal to ensure that basic
mobs actually notice that you have applied a movement speed modifier.

## Why It's Good For The Game

Fixes a linked issue.
Refactors some code which made me sad whenever I saw it.
Restores some mob behaviour which nobody noticed was missing, but was.
Fixes some apparently unreliable code I added in a recent PR reliant on
basic mobs using movespeed modifiers.
Adds element we will definitely need again in the future.

## Changelog

🆑

fix: The Fugu Gland can once more be used on Ian, Carp, Giant Spiders,
or other basic mobs.
fix: Syndicate mobs will once again attack windows to try to reach you,
and space ruin spiders won't.
fix: Netherworld-themed mobs will correctly adjust their speed as they
take damage.
refactor: Made the Wumborian Fugu into a basic mob, which should act
largely the same way but may have slightly different speed and reaction
times.
/🆑
2023-02-15 18:34:41 -07:00
MrMelbert
27e1a3c37b Refactors species mutanthands into human component (#73286)
## About The Pull Request

Mutanthands is now a component, which handles ensuring the mob always
has their mutant hands equipped to their right slots at all times.

Alternative to #73282 
Fixes #73034 

## Why It's Good For The Game

Cleaner and more consistent code, Ensures mutant hand mobs always have
their correct hands.

## Changelog

🆑 Melbert
fix: It should be way harder to lose your special hands as a zombie or
shattered risen ghoul.
refactor: Refactored mutanthands for zombies and shattered risen.
/🆑
2023-02-14 17:24:50 -07:00
MrMelbert
809a0b5eba Fixes changing species causing you to drop held items, Fixes loss of right arm not applying typical "lost arm" effects (#73356)
## About The Pull Request

`drop_limb(special = TRUE)` will now no longer drop held items. This can
cause issues if people are misusing `special`, but if people are not
then it's fine, as it's supposed to be replaced just after.

Also cut out some copy-pasta from arm and leg `drop_limb`. Since they're
one unified type, they no longer needed to carry across both. This fixed
another bug

Also also, I was able to move the held index check out of core bodypart
code, and down to arm level. This MAY have side effects, which I'm
observing for.

## Why It's Good For The Game

Changing species let you drop no-drop items, super lame

## Changelog

🆑 Melbert
fix: Changing species no longer drops all held items
fix: Losing your right hand not un-cuffing you or dropping your gloves
/🆑
2023-02-13 11:11:54 -08:00
Jacquerel
cbbf7b3613 Basic Mob Spiders III: Sgt. Araneus is no longer a bat (#73350)
## About The Pull Request

This PR converts giant spiders into basic mobs and resultingly fixes
#37793
They _should_ have the same behaviour as their simple mob versions
although I can't verify that their movement speeds are _exactly_ the
same. It should at least be pretty close.
A quirk of spiders is that they had a pretty large `move_to_delay` which
made them slow in the hands of AI (because it would just pause for ages
between taking steps) and faster in the hands of players, and they often
appear in both forms so I had to implement this as a speed modifier
based on player control.

Additionally this is the first basic mob which can be set on fire.
This is currently implemented as a var on `mob/living/basic` but I know
there was some annoyance at adding the environment tolerances as vars on
there so if desired I can try and extract it out, I'm just not sure how
easy it will be.

Something else I noticed is that spiders seem to take stamina damage
from bug spray... but stamina damage does nothing to either simple _or_
basic mobs. I have left it in for now in case I am missing something,
and rebalancing it to do something else would be more like a balance
change.

Oh also I killed the `mob/basic/retaliate` folder because that isn't a
classification that needs to exist or makes sense.

## Why It's Good For The Game

We don't want to use simple mobs any more.
Sergeant Araneus can finally actually be a spider, instead of being a
bat.

## Changelog

🆑
refactor: Spider code has been refactored and AI-controlled spiders may
have slightly different movement or reaction times.
fix: Basic mobs can now be slowed when they take stamina damage, however
currently only spiders actually _can_ take stamina damage.
fix: Spiders should now more reliably disable their AI when controlled
by a player.
fix: Araneus is no longer considered to be a bat and so cannot fly.
fix: Araneus is no longer considered to be a bat and so is no longer
frightening to people who are scared of the supernatural.
/🆑
2023-02-13 05:22:26 +00:00
Zephyr
5b9c41098f Fix underlying armor logic and fix bug with constructed ripleys having zero armor (#73319)
## About The Pull Request

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

Messed up one of the armor procs; it changed the given values but never
carried over existing values.
So you would end up with an armor of that one specific value and nothing
else.

This wasn't actually used anywhere other than mecha, lava burning, and
sentient viruses, so the issue isn't that bad.
It's still an issue however.
## Changelog
🆑
fix: Mechs no longer have zero armor when built.
/🆑
2023-02-13 02:20:52 +00:00
Jacquerel
fe896a2e55 Fixes new regal rat sprite & removes duplicate file (#73306)
Removes a duplicate file which was preventing the new regal rat sprite from being used.
2023-02-10 15:24:57 -03:00
Jacquerel
fb5fb86baa Updates space verification unit test to use new proc (#73322)
## About The Pull Request

At San's request, updates the space verification unit test to use the
new "are we a planetary map" proc instead of having its own
implementation of the same thing.

## Why It's Good For The Game

If it gets broken in one place it will break in all of them, most
importantly the unit test, which is what we want because that's what the
test is for.

## Changelog

Not player facing.
2023-02-09 16:05:13 -07:00
MrMelbert
27c35bfa0b Fixes all antag datum moodlets being removed when any single antag datum is removed (#73305)
## About The Pull Request

All antag datums operated under the `antag_moodlet` mood category, which
is clearly an issue when you can (and commonly) have multiple antag
datums of different types on your mob.

New antag datums of different type will now no longer override older
antag datum moodlets, now they will stack. This means traitor
revolutionaries are the most zealous folk on the station.

This has a few potential oversights down the line: 
- Someone adds an antag datum players can have duplicates of, and also
has a moodlet associated
- Re-used moodlets in antag datums that can easily be stacked will be
noticed
- Most solo antags used `focused` right now, but none can stack outside
of admemes

But I don't think it's an issue for now.

## Why It's Good For The Game

Prevents a quick revolution from stripping you of your joy. 

Fixes #67313

## Changelog

🆑 Melbert
fix: Revolutionary Heretics and Cultists Traitors no longer lose all of
their joy in life after being de-converted from their respective causes.
/🆑
2023-02-08 16:07:01 -07:00
Comxy
7e41cd3c0b Netherworld Mobs Refractor (#73086)
## About The Pull Request

This PR refactors netherworld mobs into basic mobs as best as possible.
Also makes some of them run faster when they are getting damaged or deal
more damage. Now the mobs might be able to keep up a little with the
players.
## Why It's Good For The Game

Makes the mobs have better movement and more dynamic movement. Makes the
quality of these mobs better.
## Changelog
🆑
add: Added new damage buffs for netherworld mobs
refactor: Refactors netherworld mobs into basic mobs
/🆑
2023-02-05 12:42:07 -07: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
Rhials
ef335f7d1f It Came From Outer Spess: Adds midround changelings, delivered by an absolutely disgusting changeling meteor (#73018)
## About The Pull Request

Adds a new dynamic midround opportunity and random event - Space
Changeling.


https://user-images.githubusercontent.com/28870487/215284465-f5c5c1b1-b83d-471a-89be-1b65a4d2f2d4.mp4

If you are fortunate enough to recieve this role, you will be stuffed
into a changeling meteor and hurled at the side of the station. With no
crew identities, no access, and no equipment, you'll have to rely on
your **free** organic space suit and armblade to infiltrate the station
and get settled.

With no disguises to fall back on, the midround changeling experience
may lead to some very unfavorable situations. It's not unlikely that
you'll be spotted making your way inside, or that someone will see the
impact site and cause a panic. This role is not easy, but keep in mind
that you also have nothing to lose in the event that you use Lesser
Form/Headslug.

Aside from the starting circumstances, you have the same objectives and
capabilities as a roundstart changeling. Getting inside of the station
will be the hard part, but from there you can do what changelings do
best and blend in.

<details>
<summary>A brief note on the free stuff you get:</summary>
<br>
You get the organic space suit and armblade for free. The space suit is
absolutely vital, but I decided that the armblade should be given for
free as well. It's necessary for breaking open windows or airlocks and
getting access to the station, since otherwise your options are limited
to arrivals/departures. Having to pay a 2 point tax to avoid walking
naked into the main hallways of the station and getting gibbed is lame,
and with the added difficulty of the role I think it's fair.
</details>

Also, this is my 100th PR here! :)

## Why It's Good For The Game

Adds midround changelings in a WAY COOLER way than just making a random
crew/new arrival a changeling.

Lets people experience Hardmode Changeling, and test the adaptability
and flexibility of the most versatile antagonist even harder than
before. Losing the option to bypass the whole shape-shifter thing by
disguising as your crew identity presents a welcome change to the
formula.

Adds a teensy bit more midround variety, so we stop getting Nightmare At
The Thirty Minute Mark every round.
## Changelog
🆑 Rhials
add: Midround changeling spawn event.
add: Changeling meteor. It has a present for you.
/🆑
2023-02-04 03:17:15 -08: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
Tim
4151cf13d3 Barsign UI/UX Improvements - Emissive effects, balloon alerts, and refactored code (#73106)
The barsign code is over a decade old so this is a big refactor with
some notable improvements:

- Emissive effects (neon lights now glow in the dark)
- Balloon alerts instead of `to_chat` messages
- Mapping helpers based on direction and all_access
- Barsigns are considered machinery now and use power
2023-02-02 16:00:18 -05:00
SyncIt21
5704127347 Merge skew Compile Error fixes (#73098)
## About The Pull Request

Fixes a bunch of merge skews

## Changelog

🆑
fix: merge skew helll
/🆑

---------

Co-authored-by: Time-Green <timkoster1@hotmail.com>
2023-01-31 11:02:36 +00:00
Dani Glore
5cf5037a97 Fix: DNA Infuser & Unit Tests, Organs Bugfixes (#73003)
## About The Pull Request

>_"I don't remember buying tickets to Mutants on Ice."_
>-Duke Nukem

This PR is (hopefully the final) part of a series of my continuing
refactors of the DNA Infuser. This PR represents a "quality pass" which
should also iron-out the rest of the most impactful bugs.

Granular list of changes:
- This PR adds unit tests for the DNA Infuser organs and
`/datum/status_effect/organ_set_bonus` as recommended by @AnturK
- I noticed that the base `/datum/infuser_entry` was being used in the
machine for the Fly and "rejected" infusions, whereas usually we would
expect it to be a base type used only as a development template. I
corrected this issue and created `/datum/infuser_entry/fly` to be used
for that use-case instead.
- Added `/mob/proc/can_mutate()` and `/mob/living/carbon/can_mutate()`
to replace a few copied lines across several files. The proc is normally
used in the context of mutating a Human via their DNA.
- I fixed a ton of typos in organ-related code, specifically where
"receiver" was typo'd as "reciever". There are far more of those typos,
but I limited the scope of my changes to organs.
- I noticed a bug in `/datum/species/proc/regenerate_organs` wherein a
race condition caused an organ to remove itself before it's done
inserting itself. This happens because the Fly organ set bonus runs
`regenerate_organs` which calls `Remove` on the organ while `Insert` is
still in the call-stack. I added `INVOKE_ASYNC` as a workaround, and
also changed the order the signals are emitted to prevent future bugs.
This bug primarily only impacted the flyperson species transformation,
which was part of the DNA Infuser's flyperson infusion organ set bonus.
- In my last refactor PR #72745 I also introduced a bug in
`/obj/machinery/dna_infuser/proc/infuse_organ` wherein I forgot to add
the usage of `new` when attempting to implant new organs, and this PR
fixes the erroneous code.
- Fxed a bug which causes the organ set bonus to activate when mixing
organs from different sources, which is caused by a developer oversight
wherein all `/datum/status_effect/organ_set_bonus` had identical IDs.
- Added a cleaner `replacetext`-based way of handling pronouns in
`/datum/element/noticable_organ/proc/on_receiver_examine`, using custom
macros `%PRONOUN_S` and `%PRONOUN_ES` as advised by @MrMelbert
- This PR also fixes #72767

## Why It's Good For The Game

With the changes in this PR the machine will finally work as we expect
it to. By adding unit tests we will also be able to ensure that it works
as expected from now on. I feel confident saying that the completeness,
algorithmic correctness, and code health of the DNA Infuser is much
better than it was before.

## Changelog

🆑 A.C.M.O.
fix: Fully fixed the DNA Infuser, which will now infuse organs as
expected.
fix: Fixed flyperson species transformation and organ set bonus, which
was throwing a runtime.
fix: Fixed many typos in organ-related source code.
/🆑

---------

Co-authored-by: Time-Green <timkoster1@hotmail.com>
2023-01-31 09:30:25 +00:00
Zephyr
5dbaa25f91 [NO GBP] Lazy Template Cordoning | Double Runtime Fix (#72709)
## About The Pull Request

Adds automatic cordoning to block reservations.
Also fixes an issue where ChangeTurf would cause SSicon_smoothing to
throw runtimes by calling QUEUE_SMOOTH regardless of initialization
completion

## Why It's Good For The Game

## Changelog

---------

Signed-off-by: GitHub <noreply@github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2023-01-29 18:48:38 -08:00
ATH1909
5c44b03bfc eswords now have a demoliton_mod of 1.5x (#73004)
## About The Pull Request

most energy sword-like weapons have had their demolition_mod increased
to 1.5x (from 1x). energy scalpels did not receive this buff, as they're
easily crew-accessible and I don't want to deal with a balance flamewar.

this affects damage vs. robots, objects, structures, etc.

the melee part of the mecha damage unit test now accounts for
demolition_mod.

## Why It's Good For The Game


![image](https://user-images.githubusercontent.com/42606352/215234868-f2a61911-99ca-4326-8f43-632e6236b0dc.png)


## Changelog

🆑 ATHATH
balance: Most energy sword-like weapons have had their demolition_mod
increased to 1.5x (from 1x). This affects damage vs. robots, objects,
structures, etc. Energy scalpels did not receive this buff.
/🆑
2023-01-29 16:26:17 -08:00
Shadyyy66
214174874c [NEW GHOST ANTAG] The Paradox Clone (#71141)
## About The Pull Request


![image](https://user-images.githubusercontent.com/114319683/200192566-e596ab83-8180-4f4c-a799-6e68e435fd43.png)

[DESIGN DOC]
https://hackmd.io/@tGKknGe5Q7qtddEspif79g/BJ3w9QLri/edit

Bluespace technology has destabilized the very fabric of reality, even
time itself!

Sometimes during a shift, it's possible for a PARADOX CLONE to spawn
somewhere on the station (usually maintenance). This paradox clone has
the exact appearance and DNA as a random crew member on the station,
wearing the same clothes they were at the start of the shift, including
their ID.

To maintain timeline coherency, the paradox clone must now hunt down and
kill the original and take their place or die trying, if the original
survives they have failed.

The only thing the paradox clone spawns with is a mechanical toolbox
that helps them from being stuck in maints if their ID doesn't have
maints access.
## Why It's Good For The Game

The inclusion of this antag encourages good crew coordination and adds a
less destructive, more personalized antag to the roster.

This antag rewards good detective work, as both the clone and the
original are identical in every way, and will therefore require a
detective to break out their detective skills to figure out who the
clone is.

Also a possible tie-in with the Chrono Legionnaires in the future.
## Changelog
🆑
add: Time and space has destabilized even further due to Nanotrasen
bluespace research, now, on occasion, clones from different timelines
can appear on the station and hunt you down to maintain timeline
stability! Beware the Paradox Clone!
/🆑

---------

Co-authored-by: 1bw0kopy <xz2rbf23@protonmail.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
2023-01-29 19:17:06 +00:00
san7890
66d74418bf Updates Mob_Spawn Unit Test To Use NAMEOF (#73035)
## About The Pull Request

One of the key functions of this test is to iterate vars to see if it is
null or not, and then error if something is defined where it should not
be. Just to futureproof this test in case someone changes the name of a
variable on the mob spawner (e.g. haircolor to hair_color), we still
want this unit test to work!

So, let's switch it all over to NAMEOF to ensure that all of our stuff
still works the way we want it: safe-guarded against trivial changes
(it'll throw a compile error if one of these vars are changed, which is
good because it compels the coder to fix it).

I also re-arranged the unit test since we didn't need to have those
bulky lists in the middle of the actual checking code, and it should
work a-okay.
## Why It's Good For The Game

Someone in the future will sob a few tears if this unit test breaks and
remains broken throwing runtimes and bricking tgui or whatever because
it's very easy to just have this unit test not be useful in a very
"simple code improvement"
## Changelog
Nothing that concerns players.
2023-01-29 19:55:45 +08:00
Timberpoes
882e7db58f Stack traces when a cliented or ckeyed mob is Destroy()ed. (#72797)
## About The Pull Request

One thing that repeatedly pops up in admin channels is investigating
causes of death when a player just vanishes from the game. These are
almost universally qdeletion issues.

9 years ago `/mob/Destroy()` was commented with:
`//This makes sure that mobs with clients/keys are not just deleted from
the game.`

Whatever code may have existed back then has long since been replaced.

**I consider that Destroy()ing a cliented or ckeyed mob is a runtime
error case.**

Code which may result in deleting a mob should handle removing and/or
reassigning any client or ckey - or call generic procs that do so -
prior to destruction. This should ideally result in a clear log trail
that allows admins to see what happened. Where this isn't the case, a
stack trace will now be available to help narrow down the cause of
qdeletion so an issue report can be made, and so admins have SOME info
to investigate on.

An example of where this would help catch bugs is #72782 - It was
clearly unintended behaviour to qdel the mob in the first place and this
stack trace would have immediately highlighted exactly where the death
came from.
```
[2023-01-18 12:44:40.415] runtime error: Mob with client has been deleted. (code/modules/mob/mob.dm:29)
 - proc name:  stack trace (/proc/_stack_trace)
 -   source file: stack_trace.dm,4
 -   usr: Julia Watson (/mob/living/carbon/human)
 -   src: null
 -   usr.loc: the floor (111,143,2) (/turf/open/floor/iron)
 -   call stack:
 -  stack trace("Mob with client has been delet...", "code/modules/mob/mob.dm", 29)
 - Julia Watson (/mob/living/carbon/human): Destroy(0)
 - Julia Watson (/mob/living/carbon/human): Destroy(0)
 - Julia Watson (/mob/living/carbon/human): Destroy(0)
 - Julia Watson (/mob/living/carbon/human): Destroy(0)
 - qdel(Julia Watson (/mob/living/carbon/human), 0)
 - the mouse (/mob/living/basic/mouse): try consume cheese(Julia Watson (/mob/living/carbon/human))
 - the mouse (/mob/living/basic/mouse): tamed(the mouse (/mob/living/basic/mouse), Julia Watson (/mob/living/carbon/human))
 - /datum/callback (/datum/callback): Invoke(the mouse (/mob/living/basic/mouse), Julia Watson (/mob/living/carbon/human))
 - /datum/component/tameable (/datum/component/tameable): on tame(the mouse (/mob/living/basic/mouse), Julia Watson (/mob/living/carbon/human))
 - the mouse (/mob/living/basic/mouse):  SendSignal("simplemob_sentiencepotion", /list (/list))
 - the intelligence potion (/obj/item/slimepotion/slime/sentience): attack(the mouse (/mob/living/basic/mouse), Julia Watson (/mob/living/carbon/human), "icon-x=16;icon-y=7;left=1;butt...")
 - the mouse (/mob/living/basic/mouse): attackby(the intelligence potion (/obj/item/slimepotion/slime/sentience), Julia Watson (/mob/living/carbon/human), "icon-x=16;icon-y=7;left=1;butt...")
 - the intelligence potion (/obj/item/slimepotion/slime/sentience): melee attack chain(Julia Watson (/mob/living/carbon/human), the mouse (/mob/living/basic/mouse), "icon-x=16;icon-y=7;left=1;butt...")
 - Julia Watson (/mob/living/carbon/human): ClickOn(the mouse (/mob/living/basic/mouse), "icon-x=16;icon-y=7;left=1;butt...")
 - the mouse (/mob/living/basic/mouse): Click(the floor (112,143,2) (/turf/open/floor/iron), "mapwindow.map", "icon-x=16;icon-y=7;left=1;butt...")
 - 
```
See also #67300.

An example of where this would help identify causes of death where
previously there were none - Scenarios that were fixed by #62949 and
#66104 caused administrative headaches figuring out causes of death when
players in exploding crates just got literally fucking qdeleted. Which
was pretty trivial for players to do to other players.

Issue reports can be made and bugs can be fixed as we go along.

There are examples of quote "false positives" unquote.

Right click -> Delete, which can be used on any atom.
```
[2023-01-18 11:40:54.597] runtime error: Mob without client but with associated ckey has been deleted. (code/modules/mob/mob.dm:32)
 - proc name:  stack trace (/proc/_stack_trace)
 -   source file: stack_trace.dm,4
 -   usr: Norah Rader (/mob/dead/observer)
 -   src: null
 -   usr.loc: the floor (109,143,2) (/turf/open/floor/iron)
 -   call stack:
 -  stack trace("Mob without client but with as...", "code/modules/mob/mob.dm", 32)
 - Fulton Enderly (/mob/dead/observer): Destroy(0)
 - Fulton Enderly (/mob/dead/observer): Destroy(0)
 - qdel(Fulton Enderly (/mob/dead/observer), 0)
 - Timberpoes (/client): admin delete(Fulton Enderly (/mob/dead/observer))
 - Timberpoes (/client): Delete(Fulton Enderly (/mob/dead/observer))
```
 
Admin gibself
```
[2023-01-18 11:41:17.635] runtime error: Mob with client has been deleted. (code/modules/mob/mob.dm:29)
 - proc name:  stack trace (/proc/_stack_trace)
 -   source file: stack_trace.dm,4
 -   usr: Norah Rader (/mob/living/carbon/human)
 -   src: null
 -   usr.loc: the floor (109,145,2) (/turf/open/floor/iron)
 -   call stack:
 -  stack trace("Mob with client has been delet...", "code/modules/mob/mob.dm", 29)
 - Norah Rader (/mob/living/carbon/human): Destroy(0)
 - Norah Rader (/mob/living/carbon/human): Destroy(0)
 - Norah Rader (/mob/living/carbon/human): Destroy(0)
 - Norah Rader (/mob/living/carbon/human): Destroy(0)
 - qdel(Norah Rader (/mob/living/carbon/human), 0)
 - Norah Rader (/mob/living/carbon/human): gib(1, 1, 1, 0)
 - Norah Rader (/mob/living/carbon/human): gib(1, 1, 1, 0)
 - Timberpoes (/client): Gibself()
```

Over time these stack traces can be checked for how well the true cause
of death is logged, and whether there is a better procedure for deleting
cliented/ckeyed mobs than just qdel(target).
## Why It's Good For The Game

qdeletion of cliented or ckeyed mobs is death and often lacks any
specific logging.

This obfuscates bugs and hinders admin investigation.

stack_tracing highlights where this happens, revealing the previously
obfuscated bugs more clearly. It also provides relevant information on a
cause of death that can allow admin investigation to take place despite
the absence of logging.
## Changelog
🆑
admin: When a player-owned mob is deleted from the game world, a stack
trace is now dropped in the runtime logs. This allows admins and coders
to investigate these issues easier.
/🆑
2023-01-29 19:53:40 +08:00
Halcyon
604d3080f3 Fixes headsets not using their proper worn sprites (#72953)
## About The Pull Request

You're probably wondering "They had worn icons?"
Yes, yes they do. No one fucking noticed.


![headsets-export](https://user-images.githubusercontent.com/81479835/214505362-3e8cd173-ff09-4163-a820-69f1b86c6423.png)
## Why It's Good For The Game

Missing sprites fixed.
## Changelog
🆑
fix: Headsets now have their old worn sprites back, did you ever notice
it?
/🆑

---------

Co-authored-by: ShizCalev <ShizCalev@users.noreply.github.com>
2023-01-29 19:43:05 +08:00
Mothblocks
9d0cdfe909 Adds an Escape Menu (#72906) 2023-01-26 00:25:16 -08:00
Time-Green
10a344bde0 External Organ Rework: new bodypart_overlay system (#72734)
Bodypart overlays are now drawn by the new /datum/bodypart_overlay
datum.

External organs no longer draw anything and instead add a special
/datum/bodypart_overlay/mutant to the bodypart, which draws everything

Makes it way easier to add custom overlays to limbs, since the whole
system is now modularized and external organs are just one
implementation of it

I haven't moved anything but external organs to this new system, I'll
move eyes, bodymarkings, hair, lipstick etc to this later

New pipeline is as follows:
- External organ added to limb
- External organ adds /datum/bodypart_overlay/mutant to limb to
bodypart_overlays
- Limb updates its icon, looks for all /datum/bodypart_overlay in
bodypart_overlays
- Very cool new overlay on your limb!

closes #71820

🆑
refactor: External organs have been near-completely refactored. 
admin: Admin-spawned external organs will load with a random icon and
color
fix: fixes angel wings not working for non-humans (it was so fucking
broken)
fix: fixes external organs being invisible if they werent initialized
with a human
/🆑

### Why this is good for the game
External organs are cool but are pretty limited in some ways. Making
stuff like synthetic organs is kinda fucked. I tried and it was dogshit.
Now you can just give an icon state and icon and you're good (using
/datum/bodypart_accessory/simple)

Stuff like eyes, cat ears and hair seem like good choices for extorgans,
but don't quite work for it because their icons work a lot differently.
This solves for it completely since any organ (or object or whatever)
can add it's own icon to a bodypart.

Want to add an iron plate to someones head? Go ahead. Want a heart to
stick out of someones chest? No problem.

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-01-25 08:56:12 -08:00
LemonInTheDark
47f6583719 Ensures the unit test zone is fully lit (#72879)
## About The Pull Request

This is required for view() checks to work as we expect, and is the
typical state of the game

The only reason things like the strippable test functioned is because we
had tests that were improperly New()ing turfs instead of using
changeturf

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-01-24 10:04:24 +00:00
GoldenAlpharex
bd923518f4 Water will now make you wet (#72844)
Water, when exposed to a mob either via `TOUCH` or `VAPOR` application,
will now apply wet stacks to said mob according to the amount of water
used. For touch application, the ratio is 0.5 wet stack per unit of
water, whereas for vapor application (so for foam and sprays), that
ratio is lowered to 0.1 wet stack per unit of water. Yes, that would
mean that you could now put someone out by spraying enough water at them
with a spray bottle (usually around 50-150u), and I think that is quite
simply hilarious.

I also updated the unit test of water's `expose_mob()` proc, to check
that wet stacks were being applied properly, hopefully making sure that
there's no regression on that part in the future.
2023-01-22 21:31:10 +00:00
Mothblocks
54eae1e713 Fix signal override merge skew (#72882)
Caused by https://github.com/tgstation/tgstation/pull/72517, with
https://github.com/tgstation/tgstation/pull/72561 raising an error that
was being hidden before

This changes equip logic somewhat so that set_wearer was being called
twice.

I don't think this should be being run in visualsOnly at all, as it does
a ton of stuff like registering signals, updating UI, etc etc etc. Don't
have time to investigate further.
2023-01-22 10:34:56 +00:00
Time-Green
605ae9623f Fixes strange geyser and geyser regen (#72221)
Called the random reagent code after it was initialized
Registered the reagent del/remove signal on the geyser, not the reagent
datum of the geyser

Closes #72037 

🆑
fix: Strange geysers have random reagents again
fix: Geysers regen reagents again
/🆑
2023-01-18 12:13:04 -08:00
Fikou
519bf69869 Dynamic Human Icon Generation For Simple/Basic Mobs (& Cardboard Cutouts) (#72517)
## About The Pull Request
revive of #68760
this time a proc, not an element
this time supports cardboard cutouts
this time supports mob corpses

![image](https://user-images.githubusercontent.com/23585223/211064291-81070650-189f-4afa-8116-81b687e3ea35.png)

## Why It's Good For The Game
prevents these icons ever being outdated, they'll always look what they
are supposed to, saves spriting work

## Changelog
🆑 Fikou, a hood by Viro
refactor: humanoid mobs and cardboard cutouts automatically generate
their sprites, they no longer will be outdated
/🆑

Co-authored-by: Time-Green <timkoster1@hotmail.com>
2023-01-18 20:04:10 +00:00
Jeremiah
872e64fb05 Adds spaces around logical operators (#72603)
## About The Pull Request
Part of a prior PR that was closed (#72562). This version does not add
the check in CI.
## Why It's Good For The Game
The work is already done, so I figured why not.
## Changelog
N/A Nothing player facing

Co-authored-by: Jeremiah Snow <jlsnow301@pm.me>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2023-01-16 16:56:35 -08:00
MrMelbert
c3a1f21c1a Converts blindness and nearsightedness to status effects, scratches some VERY dumb blindness handling that resulted in mobs becoming "incurably" blind (#72267)
## About The Pull Request

- Nearsighted is now a grouped status effect.
- Blindness is now a grouped status effect.
   - Eye handling of blindness has improved. 
- When eyes are removed, they now cause you to become blind, rather than
handling it in `update_tint`.
- Being ahealed no longer blinds you for one tick, meaning that black
overlay on aheal is gone.
- Temporary Blindness is now a status effect.
- Both Nearsightedness and Blindness have been exorcised from mob vars
and life chains. This means that we've finally cut 2 procs from life,
`handle_status_effect` and `handle_traits`, and moved both to event
based processing. Wooo optimizations.
- Swapped pacifism status effect to use apply and set helpers. 
- Removed an unused admin toggle that disabled welding helmet tint but
also tint from every clothing item and also blindness from losing your
eyes.
- Clothes now generally all blind their mob more consistently.
- Oculine, eye surgery, and sensory restoration are now no longer the
only way to fix blindness from eye damage. If your eyes are healed
through any other means, it will also heal your blindness.
- Some things that made you blind, such as ling blind sting, no longer
just flat made you blind from eye damage forever. They now cause eye
damage directly, which in turn makes you blind from eye damage, as
expected.
- Pacifists can't eyestab anymore. Eyestabs now have a limit on the
amount of blur applied.
- Refactored some `is_x_covered` procs to accept flags rather than have
a lot of arguments for some silly reason.
- Unit tests for blindness. 

## Why It's Good For The Game

Blindness was exceptionally poorly handled prior, primarily due to the
fact that it was tied to the mob instead of separated out

On top of that the system put a LOT of faith in proper handling of
blindness on the coder's end which was misplaced evidently. Many places
didn't update or handle blindness correctly, or just let people
perma-blind.

Deferring it to a status effect improves this a lot

## Changelog

🆑 Melbert
refactor: Refactored blindness and nearsightedness. Important to note is
that all mobs are naturally blind until their eyes are actually created.
refactor: Refactored "is covered" procs
fix: Less sources of blindness now cause permanent blindness. Includes
the "Blind" Spell and "Blind Sting" from changelings.
admin: Ahealing someone no longer flashes the blind overlay for 1 tick.
admin: I removed an unused (sort of) inaccessible admin verb that
allowed you to toggle the tint from all welding helmets (and clothing)
(and lack of eyes) in existence, let me know if you want similar back
balance: Changeling "Blind Sting" now causes eye damage (enough to
blind) rather than arbitrarily forcing blindness.
balance: Visionloss virus symptom now causes eye damage (enough to
blind) rather than arbitrarily forcing blindness.
balance: Oculine has been reworked slightly. Prior, Oculine arbitrarily
healed blindness and nearsightedness from eye damage reagrdless of how
damaged the eyes were, and applied blur on success. Now, Oculine just
heals eye damage, and blindness / nearsightedness is restored in the
process. There is now a probability every tick that eye blur is applied
based on how pure the oculine is while healing very damaged eyes.
balance: Pacifists can no longer eyestab.
balance: Any clothing item that covers your eyes contributes to getting
the bonus while sleeping, and to removing temporary blindness faster
/🆑
2023-01-15 23:01:40 -08:00
dawsonkeyes
25559a8c42 Fixes and buffs Metal Hydrogen golems (#72482)
## About The Pull Request

Metal Hydrogen golems as of now are quite literally not even immune to
_space_ and _the cold_, despite their description insinuating the exact
opposite and their manner of creation being more time-intensive than any
other golem. This PR fixes that, putting them on-par with all other
golems in regards to temperature and space immunity, whilst also
_hugely_ buffing them so they're not simply an antimagic version of
adamantine golems - instead, they're now most metal golems rolled into
one power-wise, with the armor of diamond golems as is befitting.

Also, I fixed their colors and wording (metal hydrogen isn't a
_mineral_, it doesn't naturally occur)

## Why It's Good For The Game

Creating metal hydrogen golems is not wholly difficult if you understand
atmospherics and practice safety in doing so, but compared to all other
golems they are _woefully_ underpowered and nigh-useless in most
practical applications. Adamantine golems are better in effectively
every way, and they're the standard for easily-created golems. Properly
fixing them and buffing them to ensure they're worth making is an
effective way to make metal hydrogen a more worthy endeavor for
atmospherics, and also metal hydrogen is simply cool.

## Changelog

🆑
fix: metal hydrogen golems no longer die to low pressures and cold
temperatures
fix: metal hydrogen golems are no longer solid white, and are now the
actual color of metal hydrogen
balance: metal hydrogen golems are also now immune to most environmental
threats, and get more armor
/🆑

Co-authored-by: ATH1909 <42606352+ATH1909@users.noreply.github.com>
2023-01-12 09:58:13 -08:00
GoldenAlpharex
20e6771808 Makes the worn_icons unit test test against worn GAGS configs, instead of regular GAGS configs (#72598)
## About The Pull Request
It wasn't testing against the right thing, and whilst it doesn't really
matter currently, if in the future there's items with worn GAGS configs
but no regular GAGS config, they'll be grateful that this doesn't fail.

## Why It's Good For The Game
Stronger unit test good.

## Changelog

🆑 GoldenAlpharex
code: Made the worn_icons unit test check the worn GAGS config rather
than the normal one.
/🆑
2023-01-10 20:46:33 -05:00
Comxy
40a3363525 Basic Faithless Mob (#72479)
## About The Pull Request
Turns the faithless mob into a basic mob with unique behaviors, it will
now break lights and drag around victims bodies. Can also punch open
airlocks if they can be opened.
## Why It's Good For The Game
Now the faithless mob has its own unique behavior and it is cool to see
more AI variety.
## Changelog
🆑
add: Faithless will now also break lights and drag victims around
refactor: Faithless into basic mob
/🆑
2023-01-09 18:08:29 +00:00
Mothblocks
9740f104d0 Contextual tutorials for swapping hands and dropping items (#72292)
# Requires https://github.com/tgstation/tgstation/pull/72320

## About The Pull Request


https://user-images.githubusercontent.com/35135081/209700892-e54be6cf-d18c-4d12-acd1-e5eb46e9d82d.mp4


https://user-images.githubusercontent.com/35135081/209700911-751b8a0e-d770-49fa-a6eb-ce50aa0fa670.mp4

---

Adds a system for tutorials that:

- Are contextually given
- Are not given again after completion
- Can optionally not trigger for anyone who first played before a
certain date

Uses this system for a tutorial for switching hands/dropping items. This
tutorial is triggered when you try to click on an item with another
item, and `afterattack` return FALSE. In order for this to work as
smoothly as possible, I'm going to open a separate PR that cleans up the
`afterattack` on everything to either return TRUE/FALSE.

## Why It's Good For The Game

SS13 is an extremely confusing game, being able to do tutorials in a
non-intrusive way (like a separate tutorial mode) is nice.

The system in place is going to be perfectly usable for introducing
mechanics to both fresh players and experienced players alike (such as
for future content).

## Changelog
🆑
qol: New players will now get a contextual tutorial for how to switch
hands and drop items.
/🆑

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
2023-01-09 01:29:18 +01:00
san7890
be149d219c Unit Tests Door/Airlock Access Working (#72461)
I screwed up with my access changes (on my local, I made sure I could
still open doors rather than be kept out of places), and #72458 fixes
that. However, let's also add a unit test to prevent that regression
again. We just do five different access "checks", and see if all five
different scenarios should work as intended.

As you can see, this PR will not pass unit tests. This is supposed to
happen, because at the time of this PR is opened, we will be in a
regression state that the aforementioned PR fixes. When the
aforementioned PR is merged, it should clear CI without any difficulties
(I know this because I ran the unit test myself)
2023-01-07 11:12:28 +00:00
Rhials
2b141d34d7 Converts ghosts mobs to a basic mob, slightly changes how ghosts are given their identities (#72196)
## About The Pull Request

Performs a very simple conversion of ghosts to basic mobs. They're
relatively lacking in unique behavior in their current state, but they
didn't really have any when they were simple animals either. They
retaliate, they float, they do everything they did before, but now as a
basic mob.

Kilostation and Derelict Station 6 have had their mapped-in ghosts
converted to the new type as well. I'm unsure if there are any other
mapped instances of ghosts that will need changing, but please let me
know if there are.

Also in this PR is a slight rework of how ghost's get their hair/name.
As an ADDED BONUS, ghosts now get random hair to gow ith their randomly
generated names, rather than hair only being only possible through
varediting. (Thank you tattle for helping me figure this out).
## Why It's Good For The Game

Strikes another simple_animal from existence. Gives ghost mobs a bit
more _visual flair_.
## Changelog
🆑
code: Ghosts are now basic mobs! You might not notice any difference,
but...
code: Ghost mobs now spawn with hair and sometimes facial hair.
/🆑

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
2023-01-06 13:02:35 -08:00
Rhials
f5bd6027c2 Small changes to some card-related debug verbs (#72361)
## About The Pull Request

Test Card Distribution debug verb has been altered slightly to prevent
runtimes. Backing out of any one of the menus would send null as an
argument, and cause a runtime.

The Validate Cards verb now returns a message if no errors are found. I
kept mistakenly clicking this verb thinking it was the Cardpack
Distribution one, and would get confused whenever nothing happened. Now
it returns a message!

Also converts some of the stuff I touch into snake case because pretty
code is nice.

## Why It's Good For The Game

Closes #66987. Feedback for the random debug buttons I accidentally
click is good.
## Changelog
🆑 Rhials
fix: backing out of the Test Card Packs debug menu will no longer cause
a runtime
fix: Validate Cards debug verb now gives feedback if no errors are
detected.
/🆑
2023-01-05 20:07:05 -08:00
Andrew
fd1ea8d5b5 Biogen shows default reagent container icons instead of beakers (#72247)
## About The Pull Request

With the new crafting menu some reagents now have default container
assigned.
I applied these to visualize reagents in biogen UI too.

<img alt="060ybChTkI"
src="https://user-images.githubusercontent.com/3625094/209483256-e4159a05-46ae-47b8-bc42-9d003cf6c303.png">

## Why It's Good For The Game

Better representation of a reagent.

## Changelog

🆑
qol: Biogenerator shows default reagent containers instead of beakers
/🆑
2023-01-03 21:20:30 -08:00
tralezab
27f09dd015 Cutting the Burdened Cheese Part 1: Removes free burden points from removing unnecessary or cosmetic organs. (#71938)
## About The Pull Request

Burdened organs now only count for the main organs only. Cyberimplants
don't count, alien organs don't count, etc. This is because someone
could get a bunch of extra organs, and then take the burdened sect and
remove them for free burden points.

Useless organs for species also do not count (stomachs given to species
that do not hunger, for instance)

Removes the error on burden points clamping on negative values. This can
happen when someone previously disabled takes burden sect.

## Why It's Good For The Game

Cheese is being used to bypass the unique gameplay goals burdened sect
provides. Will throw another pr when fikou finishes bat mutants ;)

## Changelog

🆑
fix: Removed some cheese strategies from burdened sect.
/🆑

Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
2023-01-03 22:36:48 +01:00
ShizCalev
747dfd49d9 [ready] unit tests all worn icons (#72370)
Fixes #71692

🆑 ShizCalev
code: Added a unit test for ALL worn icons.
fix: Fixed a bunch of broken worn icons!
/🆑
2023-01-03 12:57:56 -08:00
Jolly
cb3f60ec35 (Hopefully) makes the plantgrowth_test not actually garbage (#72402)
## About The Pull Request
Title.

## Why It's Good For The Game
Makes the Unit Test less garbage and annoying (Hi, hello, I was adding
Lima Beans to my downstream and this Unit Test was throwing a bitch fit)

Talked with Mothblocks on Coderbus with this. 

## Changelog

N/A
2023-01-02 15:44:48 -08:00
Fikou
f286b60606 nitpick 2022-12-31 16:10:27 +01:00
Fikou
e99b935f55 Adds the Venom Antagonist (#72346)
<!-- 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! -->
adds the venom antagonist

dont review this its not worth it

## Why It's Good For The Game

<!-- 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. -->
venom they wont know what hit em
![image](https://media.tenor.com/dmz548-c-WgAAAAC/venom-venom-antag.gif)

## 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: Venom antag
/🆑

<!-- 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. -->
2022-12-31 16:09:38 +01:00
Fikou
0151eb46b9 some modsuits now have some modules pinned by default (#72258)
## About The Pull Request
cleans up some modsuit code i dont like about their modules
removes mod theme blacklists, they are unused and weve not needed them
at all so far
adds support for premade suits to have modules they pin by default
the default pins currently are:

advanced suit: jetpack
loader suit: clamp, magnet, hydraulic arms
mining suit: sphere transformation
safeguard suit: jetpack
magnate suit: advanced jetpack
traitor suit: armor booster, jetpack
elite traitor suit: armor booster, advanced jetpack
nukie suit: armor booster, advanced jetpack
elite nukie suit: armor booster, advanced jetpack
spetsnaz pyro suit: armor booster, advanced jetpack, flamethrower
prototype suit: tether, kinesis
apocryphal suit: jetpack
chrono suit: timestopper, rewinder, timeline jumper, kinesis plus,
timeline eradication
ninja suit: advanced stealth, star dispenser, emp pulse, weapon recall,
adrenaline boost, energy net

## Why It's Good For The Game
quickens some stuff up

## Changelog
🆑
qol: some modsuits now have some modules pinned by default
/🆑
2022-12-28 04:37:36 -08:00
Comxy
e7d788348f Frog Basic Mob Refactor (#72044)
## About The Pull Request
Refactors the frog into a basic mob. The frog now does the same as the
old frog and can now properly be commanded by the regal rats.
## Why It's Good For The Game
## Changelog
🆑
refactor: Refractors the frog into a basic mob
/🆑
2022-12-27 21:06:57 -08:00
Fikou
16d2ffa446 tweaks the ninja modsuit helmet (#72259)
## About The Pull Request
the ninja modsuit helmet was weirdly inconsistent across the different
directions, all of them had different elements that werent seen in other
directions
this pr makes it consistent across all, and slightly tweaks the design

## Why It's Good For The Game
i like it :)

## Changelog
🆑
imageadd: tweaks the ninja modsuit helmet
/🆑
2022-12-28 00:04:40 +01:00
Mothblocks
45dcc6e72b Abstract away stuff that acts on baseturfs directly into their own procs, and kills some dead code related to baseturfs + tests (#72117)
Adds some new procs relating to baseturfs that replaces some code that
reads and sets them directly. Moves them to their own file. **To
reviewers: Any proc in baseturfs.dm that is snake_case is mine, anything
else is just moved**.

Adds tests for the existing procs of baseturfs.

I'm going to be doing some optimizations to baseturfs that change the
actual representation of baseturfs, and so I'm prepping these to be
implementation agnostic.

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2022-12-27 06:29:49 +00:00
Mothblocks
f960967cea Avoid creating string list of turf platings, rename some of the APIs, and improve focused test support - 160ms+ (more on prod) of init savings (#72056)
Looking at some stuff that uses `Join` right now as targets, this one's
pretty straight forward.

`/turf/open/floor/Initialize`, called 20,000 times without ruins,
creates a string list of the broken and burnt states. This carries the
fixed cost of `Join`, which is very expensive, as well as some (not
crazy, but not negligible) proc overhead.

These vars were used for effectively nothing, and have been replaced
with just using the list when necessary, which only adds an extra
millisecond of cost to update_overlays.

This was also used to automatically set `broken` and `burnt` at runtime.
However, this looks like it has gone completely unused. Adds a unit test
which adds it as a static field to the only type that cared about it,
which was abductor tiles, which is wrong anyway, but Whatever. I want to
support people making a subtype of floor tiles that are pre-broken
without it messing up stuff silently, so the test is there.

While I'm at it, renames `setup_broken_states` and `setup_burnt_states`
to remove `setup_`, since they don't really do that anymore (and never
did).

Also also, adds support for `PERFORM_ALL_TESTS` to work with multiple
focuses.

For reviewing, basically all of the changes are in floor.dm, aside from
test stuff, which is unit_test.dm.
2022-12-26 22:03:31 -08:00