Files
Bubberstation/code/datums/components/engraved.dm
SmArtKar ad64d9419e Replaces HAS_TRAIT_FROM with HAS_TRAIT in engraving checks (#86630)
## About The Pull Request

Stumbled upon this by accident. If you add a trait that **should**
prevent engraving from a source other than INNATE_TRAIT you'd probably
want it to actually work. This doesn't actually do anything at the
moment but could save someone a few hours in the future.

## Changelog
🆑
code: Non-innate engraving blockers should work now (none as of now)
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-09-14 20:39:45 +00:00

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, ENGRAVED_TRAIT)
/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, ENGRAVED_TRAIT)
/// 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)