Skip to content

Commit

Permalink
[MIRROR] Refactor renaming UNIQUE_RENAME items from the pen to an ele…
Browse files Browse the repository at this point in the history
…ment (#2849)

* Refactor renaming UNIQUE_RENAME items from the pen to an element (#82491)

## About The Pull Request

So a bit ago someone in code_general wanted to make plushies renamable,
but learnt that just adding the `UNIQUE_RENAME` flag wouldn't work as
pens would murder the plushie and only THEN let you rename it. I noted
refactoring both pens and plushies to use the new
`item_interaction(...)` procs would Just Solve This, but, well, they
didn't really have any coding experience.

But, hey, renaming being hardcoded to the pens has annoyed me ever since
I laid my eyes upon the hot mess that is paperwork code.
So here we are!

### We're making it an element.

There's not really much to this, this is mostly the same code but moved
to an element and with some minor cleanups.

First, we move it all from `/obj/item/pen` to a new element we called
`/datum/element/tool_renaming`. With this, instead of having it proc on
`/obj/item/pen/afterattack(...)`, we register it to proc on the
`COMSIG_ITEM_INTERACTING_WITH_ATOM` signal.

https://github.com/tgstation/tgstation/blob/6e36ed984070d53e16bed4fa43eb0cbe6460deed/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm#L59-L62
Secondly, we realize the code is just going through each if statement
regardless of whether the previous was correct.

https://github.com/tgstation/tgstation/blob/6e36ed984070d53e16bed4fa43eb0cbe6460deed/code/modules/paperwork/pen.dm#L225-L258
And, as we're dealing with text, just make it a switch statement
instead.
```dm
switch(pen_choice)
		if("Rename")
			(...)

		if("Description")
			(...)

		if("Reset")
			(...)
```
Then, we replace all single letter variables with descriptive ones,
replace the if-elses with early returns, and make it actually return
item interaction flags.

Finally, we slap this onto the pen, and we're done.
Now we can slap it onto other fitting renaming tools, and it uses the
proper item interaction system.
## Why It's Good For The Game

I feel it's generally better to not hardcode this to just pens, we have
plenty other writing utensils and possible renaming tools.
It's also a bit cleaner than before.
Apart from that, moves it from using `afterattack(...)` to the proper
item interaction chain by using `COMSIG_ITEM_INTERACTING_WITH_ATOM`,
which should reduce janky interactions.
## Changelog
:cl:
refactor: Instead of being hardcoded to the pen, renaming items is now
an element. Currently only pens have this, and functionality should be
the same, but please report it if you find any items that were renamable
but now aren't.
/:cl:

* Refactor renaming UNIQUE_RENAME items from the pen to an element

---------

Co-authored-by: NovaBot <[email protected]>
Co-authored-by: _0Steven <[email protected]>
  • Loading branch information
3 people authored Apr 12, 2024
1 parent 8b143db commit 053a381
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 52 deletions.
1 change: 1 addition & 0 deletions code/__DEFINES/say.dm
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
#define MAX_CHARTER_LEN 80
#define MAX_PLAQUE_LEN 144
#define MAX_LABEL_LEN 64
#define MAX_DESC_LEN 280

// Audio/Visual Flags. Used to determine what sense are required to notice a message.
#define MSG_VISUAL (1<<0)
Expand Down
4 changes: 2 additions & 2 deletions code/__DEFINES/traits/sources.dm
Original file line number Diff line number Diff line change
Expand Up @@ -286,8 +286,8 @@

/// Trait from an organ being inside a bodypart
#define ORGAN_INSIDE_BODY_TRAIT "organ_inside_body"
/// Trait when something was labelled by a pen.
#define PEN_LABEL_TRAIT "pen_label"
/// Trait when something was labelled by the /datum/element/tool_renaming element.
#define RENAMING_TOOL_LABEL_TRAIT "renaming_tool_label"

/// Trait when a drink was renamed by a shaker
#define SHAKER_LABEL_TRAIT "shaker_trait"
78 changes: 78 additions & 0 deletions code/datums/elements/tool_renaming.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#define OPTION_RENAME "Rename"
#define OPTION_DESCRIPTION "Description"
#define OPTION_RESET "Reset"

/**
* Renaming tool element
*
* When using this tool on an object with UNIQUE_RENAME,
* lets the user rename/redesc it.
*/
/datum/element/tool_renaming

/datum/element/tool_renaming/Attach(datum/target)
. = ..()
if(!isitem(target))
return ELEMENT_INCOMPATIBLE

RegisterSignal(target, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(attempt_rename))

/datum/element/tool_renaming/Detach(datum/source)
. = ..()
UnregisterSignal(source, COMSIG_ITEM_INTERACTING_WITH_ATOM)

/datum/element/tool_renaming/proc/attempt_rename(datum/source, mob/living/user, atom/interacting_with, list/modifiers)
SIGNAL_HANDLER

if(!isobj(interacting_with))
return NONE

var/obj/renamed_obj = interacting_with

if(!(renamed_obj.obj_flags & UNIQUE_RENAME))
return NONE

INVOKE_ASYNC(src, PROC_REF(async_rename), user, renamed_obj)
return ITEM_INTERACT_SUCCESS

/datum/element/tool_renaming/proc/async_rename(mob/living/user, obj/renamed_obj)
var/custom_choice = tgui_input_list(user, "What would you like to edit?", "Customization", list(OPTION_RENAME, OPTION_DESCRIPTION, OPTION_RESET))
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj) || isnull(custom_choice))
return

switch(custom_choice)
if(OPTION_RENAME)
var/old_name = renamed_obj.name
var/input = tgui_input_text(user, "What do you want to name [renamed_obj]?", "Object Name", "[old_name]", MAX_NAME_LEN)
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj))
return
if(input == old_name || !input)
to_chat(user, span_notice("You changed [renamed_obj] to... well... [renamed_obj]."))
return
renamed_obj.AddComponent(/datum/component/rename, input, renamed_obj.desc)
to_chat(user, span_notice("You have successfully renamed \the [old_name] to [renamed_obj]."))
ADD_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
renamed_obj.update_appearance(UPDATE_NAME)

if(OPTION_DESCRIPTION)
var/old_desc = renamed_obj.desc
var/input = tgui_input_text(user, "Describe [renamed_obj]", "Description", "[old_desc]", MAX_DESC_LEN)
if(QDELETED(renamed_obj) || !user.can_perform_action(renamed_obj))
return
if(input == old_desc || !input)
to_chat(user, span_notice("You decide against changing [renamed_obj]'s description."))
return
renamed_obj.AddComponent(/datum/component/rename, renamed_obj.name, input)
to_chat(user, span_notice("You have successfully changed [renamed_obj]'s description."))
ADD_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
renamed_obj.update_appearance(UPDATE_DESC)

if(OPTION_RESET)
qdel(renamed_obj.GetComponent(/datum/component/rename))
to_chat(user, span_notice("You have successfully reset [renamed_obj]'s name and description."))
REMOVE_TRAIT(renamed_obj, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
renamed_obj.update_appearance(UPDATE_NAME | UPDATE_DESC)

#undef OPTION_RENAME
#undef OPTION_DESCRIPTION
#undef OPTION_RESET
49 changes: 1 addition & 48 deletions code/modules/paperwork/pen.dm
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
dart_insert_projectile_icon_state, \
CALLBACK(src, PROC_REF(get_dart_var_modifiers))\
)
AddElement(/datum/element/tool_renaming)
RegisterSignal(src, COMSIG_DART_INSERT_ADDED, PROC_REF(on_inserted_into_dart))
RegisterSignal(src, COMSIG_DART_INSERT_REMOVED, PROC_REF(on_removed_from_dart))

Expand Down Expand Up @@ -209,54 +210,6 @@
log_combat(user, M, "stabbed", src)
return TRUE

/obj/item/pen/afterattack(obj/O, mob/living/user, proximity)
. = ..()

if (!proximity)
return .

. |= AFTERATTACK_PROCESSED_ITEM

//Changing name/description of items. Only works if they have the UNIQUE_RENAME object flag set
if(isobj(O) && (O.obj_flags & UNIQUE_RENAME))
var/penchoice = tgui_input_list(user, "What would you like to edit?", "Pen Setting", list("Rename", "Description", "Reset"))
if(QDELETED(O) || !user.can_perform_action(O))
return
if(penchoice == "Rename")
var/input = tgui_input_text(user, "What do you want to name [O]?", "Object Name", "[O.name]", MAX_NAME_LEN)
var/oldname = O.name
if(QDELETED(O) || !user.can_perform_action(O))
return
if(input == oldname || !input)
to_chat(user, span_notice("You changed [O] to... well... [O]."))
else
O.AddComponent(/datum/component/rename, input, O.desc)
to_chat(user, span_notice("You have successfully renamed \the [oldname] to [O]."))
ADD_TRAIT(O, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT)
O.update_appearance(UPDATE_ICON)

if(penchoice == "Description")
var/input = tgui_input_text(user, "Describe [O]", "Description", "[O.desc]", 280)
var/olddesc = O.desc
if(QDELETED(O) || !user.can_perform_action(O))
return
if(input == olddesc || !input)
to_chat(user, span_notice("You decide against changing [O]'s description."))
else
O.AddComponent(/datum/component/rename, O.name, input)
to_chat(user, span_notice("You have successfully changed [O]'s description."))
ADD_TRAIT(O, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT)
O.update_appearance(UPDATE_ICON)

if(penchoice == "Reset")
if(QDELETED(O) || !user.can_perform_action(O))
return

qdel(O.GetComponent(/datum/component/rename))
to_chat(user, span_notice("You have successfully reset [O]'s name and description."))
REMOVE_TRAIT(O, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT)
O.update_appearance(UPDATE_ICON)

/obj/item/pen/get_writing_implement_details()
return list(
interaction_mode = MODE_WRITING,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
/obj/item/reagent_containers/cup/glass/drinkingglass/on_reagent_change(datum/reagents/holder, ...)
. = ..()
if(!length(reagents.reagent_list))
REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT) //so new drinks can rename the glass
REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT) //so new drinks can rename the glass

// Having our icon state change removes fill thresholds
/obj/item/reagent_containers/cup/glass/drinkingglass/on_cup_change(datum/glass_style/style)
Expand All @@ -58,7 +58,7 @@
return

REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, SHAKER_LABEL_TRAIT)
REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, PEN_LABEL_TRAIT)
REMOVE_TRAIT(src, TRAIT_WAS_RENAMED, RENAMING_TOOL_LABEL_TRAIT)
name = initial(name)
desc = initial(desc)
update_appearance(UPDATE_NAME | UPDATE_DESC)
Expand Down
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -1594,6 +1594,7 @@
#include "code\datums\elements\tenacious.dm"
#include "code\datums\elements\tiny_mob_hunter.dm"
#include "code\datums\elements\tool_flash.dm"
#include "code\datums\elements\tool_renaming.dm"
#include "code\datums\elements\toy_talk.dm"
#include "code\datums\elements\turf_transparency.dm"
#include "code\datums\elements\undertile.dm"
Expand Down

0 comments on commit 053a381

Please sign in to comment.