mirror of
https://github.com/Skyrat-SS13/Skyrat-tg.git
synced 2026-07-20 04:14:32 +01:00
f4e244fb49
* Refactors embedding to use datums instead of storing data in bespoke elements (#84599) ## About The Pull Request This refactors embedding elements to make them use singleton datums (similarly to armor) instead being bespoke and creating a new element every time armor values are supposed to be adjusted. Default values have been removed from defines due to now being declared in base class itself. Additionally fixes vending machines and tackling gloves setting generated shards (which they instantly embed into their victim) embed properties to null after running the embedding code, despite said shards having non-null embedding values by default, making them not be able to embed into anyone else, also potentially breaking the pain/jostling code if they somehow get updated. ## Why It's Good For The Game Current embedding system is an unnecessarily complicated mess as bespoke elements are hard to work with, and creating a new element every time you change values is hacky at best. This change should make it easier to read and work with. ## Changelog 🆑 fix: Fixed glass shards generated from falling vending machines or tackling windows not being able to embed into anyone. refactor: Refactored embedding code to use datums instead of bespoke elements and ugly associated lists. /🆑 * Refactors embedding to use datums instead of storing data in bespoke elements * modular fixes * fix c14 * paint -> pain ugggh --------- Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com>
100 lines
3.4 KiB
Plaintext
100 lines
3.4 KiB
Plaintext
/datum/round_event_control/wizard/embedpocalypse
|
|
name = "Make Everything Embeddable"
|
|
weight = 2
|
|
typepath = /datum/round_event/wizard/embedpocalypse
|
|
max_occurrences = 1
|
|
earliest_start = 0 MINUTES
|
|
description = "Everything becomes pointy enough to embed in people when thrown."
|
|
min_wizard_trigger_potency = 3
|
|
max_wizard_trigger_potency = 7
|
|
|
|
///behold... the only reason sticky is a subtype...
|
|
/datum/round_event_control/wizard/embedpocalypse/can_spawn_event(players_amt, allow_magic = FALSE)
|
|
. = ..()
|
|
if(!.)
|
|
return .
|
|
|
|
if(GLOB.global_funny_embedding)
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/round_event/wizard/embedpocalypse/start()
|
|
GLOB.global_funny_embedding = new /datum/global_funny_embedding/pointy
|
|
|
|
/datum/round_event_control/wizard/embedpocalypse/sticky
|
|
name = "Make Everything Sticky"
|
|
weight = 6
|
|
typepath = /datum/round_event/wizard/embedpocalypse/sticky
|
|
max_occurrences = 1
|
|
earliest_start = 0 MINUTES
|
|
description = "Everything becomes sticky enough to be glued to people when thrown."
|
|
|
|
/datum/round_event/wizard/embedpocalypse/sticky/start()
|
|
GLOB.global_funny_embedding = new /datum/global_funny_embedding/sticky
|
|
|
|
///set this to a new instance of a SUBTYPE of global_funny_embedding. The main type is a prototype and will runtime really hard
|
|
GLOBAL_DATUM(global_funny_embedding, /datum/global_funny_embedding)
|
|
|
|
/**
|
|
* ## global_funny_embedding!
|
|
*
|
|
* Stored in a global datum, and created when it is turned on via event or VV'ing the GLOB.embedpocalypse_controller to be a new /datum/global_funny_embedding.
|
|
* Gives every item in the world a prefix to their name, and...
|
|
* Makes every item in the world embed when thrown, but also hooks into global signals for new items created to also bless them with embed-ability(??).
|
|
*/
|
|
/datum/global_funny_embedding
|
|
var/embed_type = /datum/embed_data/global_funny
|
|
var/prefix = "error"
|
|
|
|
/datum/embed_data/global_funny
|
|
ignore_throwspeed_threshold = TRUE
|
|
|
|
/datum/global_funny_embedding/New()
|
|
. = ..()
|
|
//second operation takes MUCH longer, so lets set up signals first.
|
|
RegisterSignal(SSdcs, COMSIG_GLOB_NEW_ITEM, PROC_REF(on_new_item_in_existence))
|
|
handle_current_items()
|
|
|
|
/datum/global_funny_embedding/Destroy(force)
|
|
. = ..()
|
|
UnregisterSignal(SSdcs, COMSIG_GLOB_NEW_ITEM)
|
|
|
|
///signal sent by a new item being created.
|
|
/datum/global_funny_embedding/proc/on_new_item_in_existence(datum/source, obj/item/created_item)
|
|
SIGNAL_HANDLER
|
|
|
|
// this proc says it's for initializing components, but we're initializing elements too because it's you and me against the world >:)
|
|
if(created_item.get_embed())
|
|
return //already embeds to some degree, so whatever // No rat allowed
|
|
|
|
created_item.name = "[prefix] [created_item.name]"
|
|
created_item.set_embed(embed_type)
|
|
|
|
/**
|
|
* ### handle_current_items
|
|
*
|
|
* Gives every viable item in the world the embed_type, and the prefix prefixed to the name.
|
|
*/
|
|
/datum/global_funny_embedding/proc/handle_current_items()
|
|
for(var/obj/item/embed_item in world)
|
|
CHECK_TICK
|
|
if(!(embed_item.flags_1 & INITIALIZED_1))
|
|
continue
|
|
if(embed_item.get_embed())
|
|
continue
|
|
embed_item.set_embed(embed_type)
|
|
embed_item.name = "[prefix] [embed_item.name]"
|
|
|
|
///everything will be... POINTY!!!!
|
|
/datum/global_funny_embedding/pointy
|
|
prefix = "pointy"
|
|
|
|
///everything will be... sticky? sure, why not
|
|
/datum/global_funny_embedding/sticky
|
|
embed_type = /datum/embed_data/global_funny/sticky
|
|
prefix = "sticky"
|
|
|
|
/datum/embed_data/global_funny/sticky
|
|
pain_mult = 0
|
|
jostle_pain_mult = 0
|