mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-06-06 06:40:42 +01:00
4d1e34322f
## About The Pull Request [Removes the pretense of relative multiz levels](https://github.com/tgstation/tgstation/pull/76248/commits/0293fdc2bd8c8af7a0d18da33265e060789c71f7) Our multiz system does not support having a z level that is only connected one way, or which goes down backwards or anything like that. That's a fiction of the trait system, the actual backend has never really supported this. This pr removes the assumptions we were making backend around this, and uses that to save cpu time. I am also converting multiz_levels from an assoc list to a pure one, which saves significantly on access times and cleans up the code somewhat. Also I'm making the get_below/get_above procs into macros, for the sake of cpu time. [Converts the starlight disease to use BYOND's directional defines instead of our own](https://github.com/tgstation/tgstation/commit/7d698f02d991eb4e1bde56314c657cf6e48ceb5d) To some extent spurred on by https://github.com/DaedalusDock/daedalusdock/pull/298, tho it was known before ## Why It's Good For The Game Faster multiz code, faster init, etc etc etc
94 lines
3.5 KiB
Plaintext
94 lines
3.5 KiB
Plaintext
/obj/effect/decal
|
|
name = "decal"
|
|
plane = FLOOR_PLANE
|
|
anchored = TRUE
|
|
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
///Boolean on whether this decal can be placed inside of groundless turfs/walls. If FALSE, will runtime and delete if it happens.
|
|
var/turf_loc_check = TRUE
|
|
|
|
/obj/effect/decal/Initialize(mapload)
|
|
. = ..()
|
|
if(NeverShouldHaveComeHere(loc))
|
|
if(mapload)
|
|
stack_trace("[name] spawned in a bad turf ([loc]) at [AREACOORD(src)] in \the [get_area(src)]. \
|
|
Please remove it or allow it to pass NeverShouldHaveComeHere if it's intended.")
|
|
return INITIALIZE_HINT_QDEL
|
|
var/static/list/loc_connections = list(
|
|
COMSIG_TURF_CHANGE = PROC_REF(on_decal_move),
|
|
)
|
|
AddElement(/datum/element/connect_loc, loc_connections)
|
|
|
|
/obj/effect/decal/blob_act(obj/structure/blob/B)
|
|
if(B && B.loc == loc)
|
|
qdel(src)
|
|
|
|
///Checks if we are allowed to be in `here_turf`, and returns that result. Subtypes should override this when necessary.
|
|
/obj/effect/decal/proc/NeverShouldHaveComeHere(turf/here_turf)
|
|
return isclosedturf(here_turf) || (isgroundlessturf(here_turf) && !GET_TURF_BELOW(here_turf))
|
|
|
|
/obj/effect/decal/ex_act(severity, target)
|
|
qdel(src)
|
|
return TRUE
|
|
|
|
/obj/effect/decal/fire_act(exposed_temperature, exposed_volume)
|
|
if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava
|
|
qdel(src)
|
|
|
|
/obj/effect/decal/proc/on_decal_move(turf/changed, path, list/new_baseturfs, flags, list/post_change_callbacks)
|
|
SIGNAL_HANDLER
|
|
post_change_callbacks += CALLBACK(src, PROC_REF(sanity_check_self))
|
|
|
|
/obj/effect/decal/proc/sanity_check_self(turf/changed)
|
|
if(changed == loc && NeverShouldHaveComeHere(changed))
|
|
qdel(src)
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/obj/effect/turf_decal
|
|
icon = 'icons/turf/decals.dmi'
|
|
icon_state = "warningline"
|
|
plane = FLOOR_PLANE
|
|
layer = TURF_DECAL_LAYER
|
|
anchored = TRUE
|
|
/// Does this decal change colors on holidays
|
|
var/use_holiday_colors = FALSE
|
|
/// The pattern used when recoloring the decal
|
|
var/pattern = PATTERN_DEFAULT
|
|
|
|
// This is with the intent of optimizing mapload
|
|
// See spawners for more details since we use the same pattern
|
|
// Basically rather then creating and deleting ourselves, why not just do the bare minimum?
|
|
/obj/effect/turf_decal/Initialize(mapload)
|
|
SHOULD_CALL_PARENT(FALSE)
|
|
if(flags_1 & INITIALIZED_1)
|
|
stack_trace("Warning: [src]([type]) initialized multiple times!")
|
|
flags_1 |= INITIALIZED_1
|
|
|
|
// If the tile uses holiday colors, apply them here
|
|
if(use_holiday_colors)
|
|
var/current_holiday_color = request_holiday_colors(src, pattern)
|
|
if(current_holiday_color)
|
|
color = current_holiday_color
|
|
alpha = DECAL_ALPHA
|
|
|
|
var/turf/T = loc
|
|
if(!istype(T)) //you know this will happen somehow
|
|
CRASH("Turf decal initialized in an object/nullspace")
|
|
T.AddElement(/datum/element/decal, icon, icon_state, dir, null, layer, alpha, color, null, FALSE, null)
|
|
return INITIALIZE_HINT_QDEL
|
|
|
|
/obj/effect/turf_decal/Destroy(force)
|
|
SHOULD_CALL_PARENT(FALSE)
|
|
#ifdef UNIT_TESTS
|
|
// If we don't do this, turf decals will end up stacking up on a tile, and break the overlay limit
|
|
// I hate it too bestie
|
|
if(GLOB.running_create_and_destroy)
|
|
var/turf/T = loc
|
|
T.RemoveElement(/datum/element/decal, icon, icon_state, dir, null, layer, alpha, color, null, FALSE, null)
|
|
#endif
|
|
// Intentionally used over moveToNullspace(), which calls doMove(), which fires
|
|
// off an enormous amount of procs, signals, etc, that this temporary effect object
|
|
// never needs or affects.
|
|
loc = null
|
|
return QDEL_HINT_QUEUE
|