Commit Graph

16 Commits

Author SHA1 Message Date
SmArtKar 5ee4ab33c6 Fixes immerse element runtimes (#93229)
## About The Pull Request

The runtimes themselves don't actually cause any issues in-game, as they
occur when an object without an overlay (due to flying, being thrown,
etc) does something that should modify the overlay. The easiest way to
handle this is to just check if its immersed in the signal receiver
itself, otherwise it'll get pretty messy with trying to keep track of
what is in what state of immersion.

## Changelog
🆑
fix: Fixed harmless runtimes when a flying object tried to cross lava
/🆑
2025-10-02 16:10:55 +02:00
SmArtKar 7601d66a96 Refactors immerse element to use alpha filters instead of static overlays (#93038)
## About The Pull Request
Immerse element now uses an alpha filter rather than a vis_contents
object, which allows them to be much more smooth and seamless. There's
no longer a visible contour on fully opaque liquids, nor a janky effect
when you move in a liquid. This also fixes the broken fluid animation,
so now it actually has a bit of a wave to it.

<img width="179" height="183" alt="dreamseeker_PDjP1zyMRl"
src="https://github.com/user-attachments/assets/7c1bbefe-0e97-456e-a303-c34e6a1a238a"
/>
<img width="177" height="180" alt="dreamseeker_hGjKOyBL8f"
src="https://github.com/user-attachments/assets/6c3bc33f-a22c-452a-beb0-9dd44b080a7c"
/>

<img width="152" height="162" alt="dreamseeker_Et3eRd3NF6"
src="https://github.com/user-attachments/assets/1478aaba-d345-44de-8baa-9d0da0bc9d1c"
/>
<img width="185" height="182" alt="dreamseeker_5Iok1lUni2"
src="https://github.com/user-attachments/assets/4ac5fea4-24a7-46c2-b475-4445a43493b4"
/>

The code is immensely cursed in some places, ideally this should not
have to use vis_contents whatsoever but BYOND seems to be intent on
causing memory leaks whenever you try to set mutable's render_target to
an interpolated string, so I'm using a VIS_HIDE object as a relay for
the filter for the time being.
I've ended up changing some mob pixel_y offsets to pixel_z (as they
should've been from the start) to account for this (the logic is being
that pixel_y is "physical" position on the turf, while pixel_z is how
high above the turf something is)

## Why It's Good For The Game

The effect is less jank and looks cool.

## Changelog
🆑
refactor: Refactors immerse element to use alpha filters instead of
static overlays. It should look much prettier now.
/🆑
2025-09-21 15:01:40 +02:00
Jacquerel 5c08ae27ed Adds "deep water" that you can drown in (#90587) 2025-04-21 08:06:06 -07:00
Waterpig d3d3a12540 The big fix for pixel_x and pixel_y use cases. (#90124)
## About The Pull Request

516 requires float layered overlays to be using pixel_w and pixel_z
instead of pixel_x and pixel_y respectively, unless we want
visual/layering errors. This makes sense, as w,z are for visual effects
only. Sadly seems we were not entirely consistent in this, and many
things seem to have been using x,y incorrectly.

This hopefully fixes that, and thus also fixes layering issues. Complete
1:1 compatibility not guaranteed.

I did the lazy way suggested to me by SmArtKar to speed it up (Runtiming
inside apply_overlays), and this is still included in the PR to flash
out possible issues in a TM (Plus I will need someone to grep the
runtimes for me after the TM period to make sure nothing was missed).
After this is done I'll remove all these extra checks.

Lints will probably be failing for a bit, got to wait for [this
update](https://github.com/SpaceManiac/SpacemanDMM/commit/4b77cd487d0a7b6a069df20356b701af5b20489d)
to them to make it into release. Or just unlint the lines, though that's
probably gonna produce code debt

## Why It's Good For The Game

Fixes this massive 516 mess, hopefully.

closes #90281

## Changelog
🆑
refactor: Changed many of our use cases for pixel_x and pixel_y
correctly into pixel_w and pixel_z, fixing layering issues in the
process.
/🆑

---------

Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: SmArtKar <master.of.bagets@gmail.com>
2025-03-28 14:18:45 +00:00
MrMelbert ffd97819c1 Pixel adjustments to mobs are now sourced / Refactors riding (#89320)
## About The Pull Request

Fixes #85980

- Pixel adjustments are now sourced

When tweaking a mob's pixel w, x, y, z, is is now done via `add_offsets`
and must have a source string associated

- Refactors riding

Refactors how riding component selects the offsets to use. It's now all
done via the getter rather than a weird mix of a var, a cache, and a
getter.

- Moves a bunch of animations to use `pixel_w` / `pixel_z`

Largely to prevent conflicts with adjustments to a mob's pixel position,
but also as many animations are not actual movements, but visual
movements. Floating is one such example.

## Why It's Good For The Game

It just works

## Changelog

🆑 Melbert
fix: Fixed grab offsets not showing for anything but passive grab
fix: Fix jank with mob offsets when riding things
refactor: Refactored riding component, particularly how it selects layer
and offsets. Report any oddities
refactor: Refactored pixel offsets of mobs. Report any oddities
/🆑
2025-02-12 17:16:13 -07:00
Ghom ad74da5cd2 Fixing a couple issues with pipes rendering and the immerse element. (#87635)
## About The Pull Request
Atomizing changes from an upcoming PR. Basically the immerse element
didn't work for things on the floor plane ever since the TOPDOWN_LAYER
was introduced to the code (eg disposal pipes don't appear underwater),
and the type checks for atmos pipe caps are deprecated by the
underfloor_accessibility var.

## Why It's Good For The Game
Fixing a couple visual nits.

## Changelog

🆑
fix: Fixed a couple nits with the water visuals not appearing on objects
with a very low layer (rendered just above the floor), as well as atmos
pipes looking a bit funky on untiled turfs beside catwalks and platings
when beside connected, under-floored pipes.
/🆑
2024-11-20 00:09:51 -08:00
Ghom 2473fca3dc The immerse element is now lazyloaded (#87977)
## About The Pull Request
SmarKar _kindly_ asked me to reduce time spent loading fishing-related
stuff during init, however we cannot further (lazy-load the already
(somewhat) lazy fishing spots without resorting to some serious hacky
solution worthy of an altogether serious wiggling eyebrow, because of
the signals for explosions and examining the turf, however he also asked
the same for the immerse element, which can be done, and so it was.

## Why It's Good For The Game
Saving a few hundred milliseconds of when loading turfs on world
initialization.

## Changelog
N/A
2024-11-20 02:26:37 -05:00
tonty 3f0b4abb8d Replaces world.icon_size (and some magic numbers) with defines (#86819)
## About The Pull Request

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

Replaces some "32" magic numbers with the defines

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

## Why It's Good For The Game

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

## Changelog

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

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-09-29 13:28:32 +00:00
Bloop 684405925f Fixes immerse holding refs to qdeleted things (#85061)
## About The Pull Request

Tin, should fix the following hard del and prevent similar instances:


![image](https://github.com/user-attachments/assets/816a9d1f-8590-46cb-a518-5bb2a4f7e2c9)

There was nothing stopping something that was qdeleted from potentially
being 'immersed' which is definitely not something that we ever want to
be happening.

## Why It's Good For The Game

Spurious CI failures are annoying

## Changelog

Nothing player facing
2024-07-19 00:52:56 +02:00
Ghom 0e3c83ff3a Revert "Makes immerse use weakrefs", prioritizing some ref removal lines instead. (#80707)
## About The Pull Request
For a moment, I had forgot about saying I'd take a look into it, but it
seems the new fix to hard dels is causing some runtimes with empty
weakrefs. Beside, WEAKREF() doesn't work well with qdeleting atoms (so
you'd have to access the weak_reference var directly).
How immersion works is quite confusing even for me who coded it, trying
to work around some of the hefty limitations of the engine truly blows.
I could even ask MrMelbert to make a proc-chain chart for it.

But yeah, long story short, I only have a bare idea where the uncleared
refs would be. I suspect it could be `immersed_movables`. It's totally
possible since the proc can early return in a few cases, thus skipping
the ref removal, hence the title.

## Why It's Good For The Game
I didn't like the PR that implemented weakref usage into the element,
but I let it pass because "hard dels = bad". However, the runtimes
aren't that much more pleasant either.

## Changelog
N/A
2024-01-17 04:38:13 -05:00
Arturlang 8e8d930720 Makes immerse use weakrefs (#80594)
## About The Pull Request
Immerse was causing harddels due to it having references to mobs. Makes
it use weakrefs for mobs instead.

## Why It's Good For The Game
Immerse would cause harddels if a mob was deleted while it was in it's
list. It could probably also happen if a turf was deleted too, but doing
that here would be much harder.

no CL since nothing playerfacing
2023-12-28 02:32:20 +01:00
LemonInTheDark f03084c1ca FOV is Dead (Long Live FOV) (#80062)
## About The Pull Request

FOV as it is currently implemented is incompatible* with wallening.
I'm doin wallening, so we gotta redo things here.

The issue is the masking of mobs. Wallening relies on sidemap (layering
based off physical position), which only works on things on the same
plane (because planes are basically sheets we render down onto)
So rather then masking mobs, let's reuse the masking idea from old fov,
and use it to cut out a bit of the game render plane, and
blur/over-saturate the bit that's masked out.

My hope is this makes things visible in light, but not as much in
darkness, alongside making more vivid shit more easily seen (just like
real life)

Here's some videos, what follows after is the commits I care about
(since I had to rip a bunch of planes to nothing, so the files changed
tab might be a bit of a mess)

Oh also I had to remove the darkness pref since the darkness is doing a
lot of the heavy lifting now. I'm sorry.

Edit:
NEW FOV SPRITES! Thanks dongle your aviator glasses will guide us to a
better future.


https://github.com/tgstation/tgstation/assets/58055496/afa9eeb8-8b7b-4364-b0c0-7ac8070b5609


https://github.com/tgstation/tgstation/assets/58055496/0eff040c-8bf1-47e4-a4f3-dac56fb2ccc8

## Commits I Care About

[Implements something like fov, but without the planes as layers
hell](https://github.com/tgstation/tgstation/commit/a604c7b1c8d74cd27af4d806d85892c1f7e35ba8)

Rather then masking out mobs standing behind us, we use a combo color
matrix and blur filter to make the stuff covered by fov harder to see.

We achive this by splitting the game plane into two, masking both by fov
(one normally and one inversely), and then applying effects to one of
the two.

I want to make the fov fullscreens more gradient, but as an effect this
is a good start

[Removes WALL_PLANE_UPPER by adding a WALL_PLANE overlay to material
walls (init cost comes
here)](https://github.com/tgstation/tgstation/commit/25489337392f708cb337fbf05a2329eacdfc5346)

@Mothblocks see this. comment in commit explains further but uh, we need
to draw material walls to the light mask plane so things actually can be
seen on them, but we can't do that and also have them be big, so they
get an overlay. Sorry, slight init time bump, about 0.5 seconds. I can
kill it with wallening.

[Moves SEETHROUGH_PLANE above
ABOVE_GAME_PLANE](https://github.com/tgstation/tgstation/commit/beec4c00e01d34a04fba7c2bb98a9b70d27ead82)

I don't think it actually wants to draw here
@Time-Green I think this was you so pinging for opinion

[Resprites FOV masks to be clean (and more
consistent)](https://github.com/tgstation/tgstation/pull/80062/commits/f02ad13696b3b17658af612c62848b48609d785d)

[f02ad13](https://github.com/tgstation/tgstation/pull/80062/commits/f02ad13696b3b17658af612c62848b48609d785d)

This is 100% donglesplonge's work, he's spent a week or so going back
and forth with me sharpening these to a mirror shine, real chill

## Why It's Good For The Game

Walls are closing in

## Changelog
🆑 LemonInTheDark, Donglesplonge
image: Redoes fov "mask" sprites. They're clean, have a very pleasant
dithering effect, and look real fuckin good!
del: Changed FOV, it no longer hides mobs, instead it blurs the hidden
area, and makes it a bit darker/oversaturated
/🆑

###### * It's technically possible if we start using render targets to
create 2 sets of sources but that's insane and we aren't doing it
2023-12-13 15:52:24 +01:00
MrMelbert c1ed62915b Adds UPSIDE_DOWN movetype for negative gravity / makes Atrocinator affected by less things (#79785)
## About The Pull Request

Fixes #79764

I was going to tackle this issue by slamming `TRAIT_NO_SLIP_ALL` on
Atrocinator users and calling it a day, but like, that didn't feel
proper.

So I thought hey, we could just give them the flying movetype, even
though they technically aren't flying it means they're unaffected by
things that flying would make you unaffected by.

Nope, this means the mob technically "negates gravity", so no falling
and no feetsteps.

Let's try floating - this give us feetsteps but no falling upwards. 

So instead of going back to square one, with `TRAIT_NO_SLIP_ALL`, I
decided to go for the more complex route of just adding a movetype.

Hence, move type `UPSIDE_DOWN`. This covers situations where a mob would
be "floating" above the ground, but still walking. ...Negative gravity.

This means overall the Atrociator acts more as you'd expect - you don't
slip on ice, you don't trigger bear traps or mouse traps, you can walk
over railings, unaffected by conveyor belts, etc.

## Why It's Good For The Game

Makes the Atrocinator a lot more consistent with how you'd expect for it
to work.

Admittedly it is a bit niche use of movetypes, but it can possibly be
expanded to more things in the future, who knows? I applied it to mobs
on meat spikes (even though they don't move), just for proof of concept.

## Changelog

🆑 Melbert
fix: Atrocinating mobs will now behave more as you'd expect. Meaning
they don't slip on wet patches, can't trigger bear traps / landmines /
mouse traps, ignore conveyors, and can walk over tables and railings.
fix: Floating mobs are unaffected by conveyor belts, acid (on the
ground), glass tables
fix: Floating mobs won't squish stuff like roaches anymore 
fix: Fixes bear traps triggering on floating / flying mobs 
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2023-11-20 21:19:13 +00: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
Bloop 415e1e7035 Fixes a bug with the immerse element (#77585)
## About The Pull Request

What it says on the tin. This runtime was caught downstream in an away
mission unit test where a mob is placed in a water turf.


![image](https://github.com/tgstation/tgstation/assets/13398309/8123321d-8bf4-4186-a63d-944080ad9f8a)

Basically the immerse overlay wasn't being added the very first time it
was created, because it wasn't being returned by
`generate_vis_overlay()`. Derp.

It went unnoticed because the overlays are cached and so every
subsequent `add_immerse_overlay()` works fine. And I guess upstream
doesn't have any mobs that spawn in water during tests so it was never
caught.

Also stops `on_init_or_entered()` from needlessly being called twice in
the case of a movable atom in water being initialized before the water
turf. The signal `COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON` already
sees to that.

## Why It's Good For The Game

Fixes a bug

## Changelog

🆑
fix: fixes immerse overlays not being added the first time a mob enters
a water turf
/🆑
2023-08-14 16:07:27 +08:00
Ghom c1122a0ae9 Adds an element to water turfs that makes things... look like they're actually immersed in water. (#76208)
## About The Pull Request
This PR adds an element, for now added to water turfs, that gives
passing movables an overlay to make them look immersed in that turf.

You can definitely see in the code what sort of stupid stuff I've had to
do to work around some of the flaws with the inbuilt features. Why?
Because I needed a (vis_contents) overlay that:
- can cover the entire width of the movable it's added to, whether it
has a 32 px icon, 64, 96 etc, plus some to be safe.
- doesn't look misplaced around movables with an icon larger than 32 px.
- can be animated, so it doesn't rotate or scale (or rather, do so but
in the opposite direction) with living mobs when resized, spinning or
lying down or standing up, despite the KEEP_TOGETHER appearance flag,
which ignores whether the overlay has the RESET_TRANSFORM flag.
- looks inset in the movable and doesn't spill into other movables of
the same plane (that's what happened with normal inset overlays without
the KEEP_TOGETHER flag)
- doesn't render above other movables covering the owner of the overlay.

If someone comes with a better and tested solution, go and tell I guess.
How visuals are handled by this engine still eludes me at times, but I
doubt planes would be a better solution to this.

The rest of the PR includes checks to make sure the overlay isn't added
to movables with planes lower/higher than
FLOOR_PLANE/ABOVE_ALL_MOB_PLANE, that are flying or being thrown, as
well as certain types such as effects.

## Why It's Good For The Game
Adding some literal immersion to the game, since movables and mobs look
like they're treading on water like Jesus right now. You can see a
couple screenshots by scrolling down a little.

## Changelog

🆑
image: walking on water will now immerse you in it... visually, at
least.
/🆑
2023-07-21 22:00:09 +02:00