mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-19 05:26:28 +00:00
## About The Pull Request Ok so like, side map right? It makes things higher up in the world render above things lower down in the world. Most of the time this is what we want, but it is NOT what we want for floors. Floors are allowed to be larger then 32x32, and if they are we want them to render based off JUST their layer. If we don't allow this grass turfs and others get cut off on their bottom edge, which looks WEIRD. In order to make this happen, we can add TOPDOWN_LAYER to every layer on the floor plane and disable sidemap. I've added documentation for this to VISUALS.md, and have also implemented unit test errors to prevent mixing TOPDOWN layers with non topdown planes (or vis versa). This new test adds ~1 second to tests, which is I think a perfectly scrumpulent number. EDIT: I nerd sniped myself and implemented sidemap layering and lighting for cameras (also larger then 32x32 icon support for getflat) The lighting isn't perfect, we don't handle things displaying in the void all that well (I am convinced getflat blending is broken but I have no debugger so I can't fix it properly), but it'll do. This came up cause I had to fix another layering issue in cameras and thought I might as well go all in.  ## Why It's Good For The Game Old:  New:  ## Changelog 🆑 fix: Grass turfs will render properly now. Reworked how floors render, please report any bugs! fix: Cameras now properly capture lighting fix: The layering seen in photos should better match the actual game /🆑
87 lines
2.9 KiB
Plaintext
87 lines
2.9 KiB
Plaintext
/// The alpha we give to stuff under tiles, if they want it
|
|
#define ALPHA_UNDERTILE 128
|
|
|
|
///Add to an object if you want to be able to be hidden under tiles
|
|
/datum/element/undertile
|
|
element_flags = ELEMENT_BESPOKE | COMPONENT_DUPE_HIGHLANDER
|
|
argument_hash_start_idx = 2
|
|
|
|
///the invisiblity trait applied, like TRAIT_T_RAY_VISIBLE
|
|
var/invisibility_trait
|
|
///level of invisibility applied when under a tile. Could be INVISIBILITY_OBSERVER if you still want it to be visible to ghosts
|
|
var/invisibility_level
|
|
///an overlay for the tile if we wish to apply that
|
|
var/tile_overlay
|
|
///whether we use alpha or not. TRUE uses ALPHA_UNDERTILE because otherwise we have 200 different instances of this element for different alphas
|
|
var/use_alpha
|
|
///We will switch between anchored and unanchored. for stuff like satchels that shouldn't be pullable under tiles but are otherwise unanchored
|
|
var/use_anchor
|
|
|
|
/datum/element/undertile/Attach(datum/target, invisibility_trait, invisibility_level = INVISIBILITY_MAXIMUM, tile_overlay, use_alpha = TRUE, use_anchor = FALSE)
|
|
. = ..()
|
|
|
|
if(!ismovable(target))
|
|
return ELEMENT_INCOMPATIBLE
|
|
|
|
RegisterSignal(target, COMSIG_OBJ_HIDE, PROC_REF(hide))
|
|
|
|
src.invisibility_trait = invisibility_trait
|
|
src.invisibility_level = invisibility_level
|
|
src.tile_overlay = tile_overlay
|
|
src.use_alpha = use_alpha
|
|
src.use_anchor = use_anchor
|
|
|
|
///called when a tile has been covered or uncovered
|
|
/datum/element/undertile/proc/hide(atom/movable/source, underfloor_accessibility)
|
|
SIGNAL_HANDLER
|
|
|
|
if(underfloor_accessibility < UNDERFLOOR_VISIBLE)
|
|
source.SetInvisibility(invisibility_level, id=type)
|
|
else
|
|
source.RemoveInvisibility(type)
|
|
|
|
var/turf/T = get_turf(source)
|
|
|
|
if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE)
|
|
SET_PLANE_IMPLICIT(source, FLOOR_PLANE) // We do this so that turfs that allow you to see what's underneath them don't have to be on the game plane (which causes ambient occlusion weirdness)
|
|
source.layer = ABOVE_OPEN_TURF_LAYER
|
|
ADD_TRAIT(source, TRAIT_UNDERFLOOR, REF(src))
|
|
|
|
if(tile_overlay)
|
|
T.add_overlay(tile_overlay)
|
|
|
|
if(use_anchor)
|
|
source.set_anchored(TRUE)
|
|
|
|
if(underfloor_accessibility < UNDERFLOOR_VISIBLE)
|
|
if(use_alpha)
|
|
source.alpha = ALPHA_UNDERTILE
|
|
|
|
if(invisibility_trait)
|
|
ADD_TRAIT(source, invisibility_trait, ELEMENT_TRAIT(type))
|
|
|
|
else
|
|
SET_PLANE_IMPLICIT(source, initial(source.plane))
|
|
source.layer = initial(source.layer)
|
|
REMOVE_TRAIT(source, TRAIT_UNDERFLOOR, REF(src))
|
|
|
|
if(invisibility_trait)
|
|
REMOVE_TRAIT(source, invisibility_trait, ELEMENT_TRAIT(type))
|
|
|
|
if(tile_overlay)
|
|
T.overlays -= tile_overlay
|
|
|
|
if(use_alpha)
|
|
source.alpha = initial(source.alpha)
|
|
|
|
if(use_anchor)
|
|
source.set_anchored(FALSE)
|
|
|
|
/datum/element/undertile/Detach(atom/movable/source, visibility_trait, invisibility_level = INVISIBILITY_MAXIMUM)
|
|
. = ..()
|
|
|
|
hide(source, UNDERFLOOR_INTERACTABLE)
|
|
source.RemoveInvisibility(type)
|
|
|
|
#undef ALPHA_UNDERTILE
|