mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 03:02:38 +00:00
## About The Pull Request Changes some logic in underfloor object and atmos component rendering to make them look nicer when visible, but not accessible under floors. Also changes how catwalks get rendered to improve their visuals when opened. Before:  After:  ## Why It's Good For The Game Makes pipes look less shit. The rendering curse reigns eternal. ## Changelog 🆑 fix: Fixed vents and pipes partially poking out from under glass and catwalk floors /🆑
112 lines
3.6 KiB
Plaintext
112 lines
3.6 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
|
|
///Will hiding the object tilt the tile it is beneath?
|
|
var/tilt_tile
|
|
|
|
/datum/element/undertile/Attach(datum/target, invisibility_trait, invisibility_level = INVISIBILITY_MAXIMUM, tile_overlay, use_alpha = TRUE, use_anchor = FALSE, tilt_tile = 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
|
|
src.tilt_tile = tilt_tile
|
|
|
|
///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)
|
|
// We only want to change the layer/plane for things that aren't already on the floor plane,
|
|
// as overriding the settings for those would cause layering issues
|
|
if(PLANE_TO_TRUE(source.plane) != 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)
|
|
SET_PLANE_IMPLICIT(source, FLOOR_PLANE)
|
|
source.layer = BELOW_CATWALK_LAYER
|
|
|
|
ADD_TRAIT(source, TRAIT_UNDERFLOOR, REF(src))
|
|
|
|
if(tile_overlay)
|
|
T.add_overlay(tile_overlay)
|
|
|
|
if(tilt_tile)
|
|
T.transform = T.transform.Turn(2)
|
|
T.layer = (T.layer + 0.1) // prettier
|
|
T.appearance_flags |= PIXEL_SCALE
|
|
|
|
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
|
|
if(!HAS_TRAIT(source.loc, TRAIT_UNCOVERED_TURF))
|
|
SET_PLANE_IMPLICIT(source, initial(source.plane))
|
|
source.layer = initial(source.layer)
|
|
else
|
|
SET_PLANE_IMPLICIT(source, FLOOR_PLANE)
|
|
source.layer = BELOW_CATWALK_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(tilt_tile)
|
|
T.transform = matrix()
|
|
T.layer = initial(T.layer)
|
|
T.appearance_flags &= PIXEL_SCALE
|
|
|
|
if(use_alpha)
|
|
source.alpha = initial(source.alpha)
|
|
|
|
if(use_anchor)
|
|
source.set_anchored(FALSE)
|
|
|
|
SEND_SIGNAL(source, COMSIG_UNDERTILE_UPDATED)
|
|
|
|
/datum/element/undertile/Detach(atom/movable/source, visibility_trait, invisibility_level = INVISIBILITY_MAXIMUM)
|
|
. = ..()
|
|
|
|
hide(source, UNDERFLOOR_INTERACTABLE)
|
|
source.RemoveInvisibility(type)
|
|
|
|
#undef ALPHA_UNDERTILE
|