Files
Bubberstation/code/modules/hallucination/body.dm
T
LemonInTheDark a8e16030f8 Optimizes timer insertion by 80% (W QDEL_IN micro) (#76214)
<!-- 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

[Reduces timer insertion cost by
80%](https://github.com/tgstation/tgstation/commit/c9e5b285ed74e60108fddd3f6b45d6d3995c92a8)

Timer name generation involved a LOT of string shit, some in ways where
the string only existed for a moment.
This costs a good bit of time, and can be reduced with only minimal
impacts on the end product, so let's do that. Includes a compile flag to
flip it back if we ever have trouble in future.

This is about 0.1s off init, since we do a lot of timer stuff then too

[Removes STOPPABLE flag from QDEL_IN, moves it to a bespoke
macro](https://github.com/tgstation/tgstation/commit/e7a5d7f2a78fcf0dce4742ced258c9505411b202)

Its a waste most of the time, tho I would LOVE to analyze at compile
time to work out if we care
## Why It's Good For The Game

I like it when we don't spend all of our cpu time just setting the name
var on timers. that's good and not bad.
This saves time fucking everywhere. 15% off explosions, 0.1 seconds off
init, bunch of time off foam. it's just good.

Cherry picked out of #76104 since that was too cluttered (sannnnnn)

<!-- 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. -->

<!-- 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. -->
2023-06-21 23:54:20 -06:00

194 lines
6.2 KiB
Plaintext

/// Makes a random body appear and disappear quickly in view of the hallucinator.
/datum/hallucination/body
abstract_hallucination_parent = /datum/hallucination/body
/// The file to make the body image from.
var/body_image_file
/// The icon state to make the body image form.
var/body_image_state
/// The actual image we made and showed show.
var/image/shown_body
/// Whether we apply the floating anim to the body
var/body_floats = FALSE
/// The layer this body will be drawn on, in case we want to bypass lighting
var/body_layer = TURF_LAYER
/// if TRUE, spawns the body under the hallucinator instead of somewhere in view
var/spawn_under_hallucinator = FALSE
/datum/hallucination/body/start()
// This hallucination is purely visual, so we don't need to bother for clientless mobs
if(!hallucinator.client)
return FALSE
var/list/possible_points = list()
if(spawn_under_hallucinator)
possible_points += get_turf(hallucinator)
else
for(var/turf/open/open_turf in view(hallucinator))
if(open_turf.is_blocked_turf())
continue
possible_points += open_turf
if(!length(possible_points))
return FALSE
var/turf/picked = pick(possible_points)
if(isspaceturf(picked) || !picked.has_gravity())
body_floats = TRUE
shown_body = make_body_image(picked)
hallucinator.client?.images |= shown_body
return queue_cleanup()
/datum/hallucination/body/proc/queue_cleanup()
QDEL_IN(src, rand(3 SECONDS, 5 SECONDS)) //Only seen for a brief moment.
return TRUE
/datum/hallucination/body/Destroy()
hallucinator.client?.images -= shown_body
shown_body = null
return ..()
/// Makes the image of the body to show at the location passed.
/datum/hallucination/body/proc/make_body_image(turf/location)
var/image/created_image = image(body_image_file, location, body_image_state, body_layer)
if(body_floats)
DO_FLOATING_ANIM(created_image)
return created_image
/datum/hallucination/body/husk
random_hallucination_weight = 8
body_image_file = 'icons/mob/species/human/human.dmi'
body_image_state = "husk"
/datum/hallucination/body/husk/sideways
random_hallucination_weight = 4
/datum/hallucination/body/husk/sideways/make_body_image(turf/location)
var/image/body = ..()
var/matrix/turn_matrix = matrix()
turn_matrix.Turn(90)
body.transform = turn_matrix
return body
/datum/hallucination/body/ghost
random_hallucination_weight = 2
body_image_file = 'icons/mob/simple/mob.dmi'
body_image_state = "ghost"
body_floats = TRUE
/datum/hallucination/body/hole
random_hallucination_weight = 1
body_image_file = 'icons/effects/effects.dmi'
body_image_state = "blank"
/datum/hallucination/body/staticguy
random_hallucination_weight = 1
body_image_file = 'icons/effects/effects.dmi'
body_image_state = "static"
/// Our QDEL_IN timer id, so we can cancel it
var/del_timerid
/datum/hallucination/body/staticguy/Destroy()
if(!QDELETED(hallucinator))
UnregisterSignal(hallucinator, COMSIG_MOVABLE_MOVED)
if(del_timerid)
deltimer(del_timerid)
del_timerid = null
return ..()
/datum/hallucination/body/staticguy/queue_cleanup()
RegisterSignal(hallucinator, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
del_timerid = QDEL_IN_STOPPABLE(src, rand(2 MINUTES, 3 MINUTES))
return TRUE
/// Signal proc for [COMSIG_MOVABLE_MOVED] - if we move out of view of the hallucination, it disappears, how spooky
/datum/hallucination/body/staticguy/proc/on_move(datum/source)
SIGNAL_HANDLER
// Entering its turf will cause it to fade out then delete
if(shown_body.loc == hallucinator.loc)
animate(shown_body, alpha = 0, time = 0.5 SECONDS)
deltimer(del_timerid)
del_timerid = QDEL_IN_STOPPABLE(src, 0.6 SECONDS)
return
// Staying in view will do nothing
if(shown_body.loc in view(hallucinator))
return
// Leaving view will delete it immediately
deltimer(del_timerid)
del_timerid = null
qdel(src)
/datum/hallucination/body/weird
random_hallucination_weight = 0.1 // These are very uncommon
abstract_hallucination_parent = /datum/hallucination/body/weird
/datum/hallucination/body/weird/alien
body_image_file = 'icons/mob/nonhuman-player/alien.dmi'
body_image_state = "alienother"
body_floats = TRUE
/datum/hallucination/body/weird/mini_bubblegum
body_image_file = 'icons/mob/simple/mob.dmi'
body_image_state = "horror"
/datum/hallucination/body/weird/chrono
body_image_file = 'icons/mob/simple/mob.dmi'
body_image_state = "chronostuck"
body_floats = TRUE
/datum/hallucination/body/weird/god
body_image_file = 'icons/mob/simple/mob.dmi'
body_image_state = "god"
body_floats = TRUE
/datum/hallucination/body/weird/sling
body_image_file = 'icons/mob/simple/mob.dmi'
body_image_state = "shadowling_ascended"
body_floats = TRUE
/datum/hallucination/body/weird/faceless
body_image_file = 'icons/mob/simple/traders.dmi'
body_image_state = "faceless"
/datum/hallucination/body/weird/bones
body_image_file = 'icons/mob/simple/traders.dmi'
body_image_state = "mrbones"
/datum/hallucination/body/weird/freezer
random_hallucination_weight = 0.3 // Slightly more common since it's cool (heh)
body_image_file = 'icons/effects/effects.dmi'
body_image_state = "the_freezer"
body_layer = ABOVE_ALL_MOB_LAYER
spawn_under_hallucinator = TRUE
/datum/hallucination/body/weird/freezer/make_body_image(turf/location)
var/image/body = ..()
body.pixel_x = pick(rand(-208,-48), rand(48, 208))
body.pixel_y = pick(rand(-208,-48), rand(48, 208))
body.alpha = 245
SET_PLANE_EXPLICIT(body, ABOVE_HUD_PLANE, location)
return body
/datum/hallucination/body/weird/freezer/queue_cleanup()
QDEL_IN(src, 12 SECONDS) //The freezer stays on screen while you're frozen
addtimer(CALLBACK(src, PROC_REF(freeze_player)), 1 SECONDS) // You barely have a moment to react before you're frozen
addtimer(CALLBACK(src, PROC_REF(freeze_intimidate)), 11.8 SECONDS)
hallucinator.cause_hallucination(/datum/hallucination/fake_sound/weird/radio_static, "freezer hallucination")
return TRUE
/datum/hallucination/body/weird/freezer/proc/freeze_player()
if(QDELETED(src))
return
hallucinator.cause_hallucination(/datum/hallucination/ice, "freezer hallucination", duration = 11 SECONDS, play_freeze_sound = FALSE)
/datum/hallucination/body/weird/freezer/proc/freeze_intimidate()
if(QDELETED(src))
return
// Spook 'em before we delete
shown_body.pixel_x = (shown_body.pixel_x / 2)
shown_body.pixel_y = (shown_body.pixel_y / 2)