mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-17 05:03:28 +00:00
* Micro-optimize qdel by only permitting one parameter (#80628) Productionizes #80615. The core optimization is this: ```patch - var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up. ``` We avoid a heap allocation in the form of copying the args over to a new list. A/B testing shows this results in 33% better overtime, and in a real round shaving off a full second of self time and 0.4 seconds of overtime--both of these would be doubled in the event this is merged as the new proc was only being run 50% of the time. * Micro-optimize qdel by only permitting one parameter --------- Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
96 lines
3.8 KiB
Plaintext
96 lines
3.8 KiB
Plaintext
/**
|
|
* # engraved component!
|
|
*
|
|
* component for walls that applies an engraved overlay and lets you examine it to read a story (+ art element yay)
|
|
* new creations will get a high art value, cross round scrawlings will get a low one.
|
|
* MUST be a component, though it doesn't look like it. SSPersistence demandeth
|
|
*/
|
|
/datum/component/engraved
|
|
///the generated story string
|
|
var/engraved_description
|
|
///whether this is a new engraving, or a persistence loaded one.
|
|
var/persistent_save
|
|
///what random icon state should the engraving have
|
|
var/icon_state_append
|
|
///The story value of this piece.
|
|
var/story_value
|
|
|
|
/datum/component/engraved/Initialize(engraved_description, persistent_save, story_value)
|
|
. = ..()
|
|
if(!isclosedturf(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
var/turf/closed/engraved_wall = parent
|
|
|
|
src.engraved_description = engraved_description
|
|
src.persistent_save = persistent_save
|
|
src.story_value = story_value
|
|
|
|
var/beauty_value
|
|
switch(story_value)
|
|
if(STORY_VALUE_KEY)
|
|
beauty_value = 0 // what is this
|
|
if(STORY_VALUE_SHIT)
|
|
beauty_value = rand(-50, 50) //Ugly or mediocre at best
|
|
if(STORY_VALUE_NONE)
|
|
beauty_value = rand(0, 100) //No inherent value
|
|
if(STORY_VALUE_MEH)
|
|
beauty_value = rand(100, 200) //Its an okay tale
|
|
if(STORY_VALUE_OKAY)
|
|
beauty_value = rand(150, 300) //Average story! most things are like this
|
|
if(STORY_VALUE_AMAZING)
|
|
beauty_value = rand(300, 600)//Really impactful stories, seeing a lost limb, losing a loved pet.
|
|
if(STORY_VALUE_LEGENDARY)
|
|
beauty_value = rand(500, 800) //Almost always a good story! this is for memories you can barely ever get, killing megafauna, doing ultimate feats!
|
|
|
|
engraved_wall.AddElement(/datum/element/art, beauty_value / ENGRAVING_BEAUTY_TO_ART_FACTOR)
|
|
if(persistent_save)
|
|
engraved_wall.AddElement(/datum/element/beauty, beauty_value)
|
|
else
|
|
engraved_wall.AddElement(/datum/element/beauty, beauty_value / ENGRAVING_PERSISTENCE_BEAUTY_LOSS_FACTOR) //Old age does them harm
|
|
icon_state_append = rand(1, 2)
|
|
//must be here to allow overlays to be updated
|
|
RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays))
|
|
engraved_wall.update_appearance()
|
|
|
|
/datum/component/engraved/Destroy(force)
|
|
if(!parent)
|
|
return ..()
|
|
parent.RemoveElement(/datum/element/art)
|
|
//must be here to allow overlays to be updated
|
|
UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS)
|
|
if(!QDELING(parent))
|
|
var/atom/parent_atom = parent
|
|
parent_atom.update_appearance()
|
|
return ..() //call this after since we null out the parent
|
|
|
|
/datum/component/engraved/RegisterWithParent()
|
|
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
|
//supporting component transfer means putting these here instead of initialize
|
|
SSpersistence.wall_engravings += src
|
|
ADD_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)
|
|
|
|
/datum/component/engraved/UnregisterFromParent()
|
|
UnregisterSignal(parent, COMSIG_ATOM_EXAMINE)
|
|
//supporting component transfer means putting these here instead of destroy
|
|
SSpersistence.wall_engravings -= src
|
|
REMOVE_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)
|
|
|
|
/// Used to maintain the acid overlay on the parent [/atom].
|
|
/datum/component/engraved/proc/on_update_overlays(atom/parent_atom, list/overlays)
|
|
SIGNAL_HANDLER
|
|
|
|
overlays += mutable_appearance('icons/turf/wall_overlays.dmi', "engraving[icon_state_append]")
|
|
|
|
///signal called on parent being examined
|
|
/datum/component/engraved/proc/on_examine(datum/source, mob/user, list/examine_list)
|
|
SIGNAL_HANDLER
|
|
examine_list += span_boldnotice(engraved_description)
|
|
|
|
///returns all the information SSpersistence needs in a list to load up this engraving on a future round!
|
|
/datum/component/engraved/proc/save_persistent()
|
|
var/list/saved_data = list()
|
|
saved_data["story"] = engraved_description
|
|
saved_data["story_value"] = story_value
|
|
|
|
return list(saved_data)
|