updates to most recent version and puts intent hints!

This commit is contained in:
SandPoot
2023-02-09 02:20:02 -03:00
parent 1b1154260c
commit 4491abc2d7
21 changed files with 382 additions and 107 deletions
+8 -2
View File
@@ -17,6 +17,7 @@ Example:
```dm
/obj/machinery/firealarm/Initialize(mapload)
. = ..()
AddElement( \
/datum/element/contextual_screentip_bare_hands, \
lmb_text = list(INTENT_HELP = "Turn on"), \
@@ -37,12 +38,14 @@ Example:
if (!(flags_1 & NODECONSTRUCT_1))
var/static/list/tool_behaviors = list(
TOOL_SCREWDRIVER = list(
SCREENTIP_CONTEXT_RMB = "Disassemble",
SCREENTIP_CONTEXT_LMB = "Disassemble",
),
TOOL_WRENCH = list(
SCREENTIP_CONTEXT_RMB = "Deconstruct",
SCREENTIP_CONTEXT_LMB = "Deconstruct",
),
)
AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
```
@@ -57,14 +60,17 @@ Example:
```dm
/obj/item/restraints/handcuffs/cable/Initialize(mapload)
. = ..()
var/static/list/hovering_item_typechecks = list(
/obj/item/stack/rods = list(
SCREENTIP_CONTEXT_LMB = "Craft wired rod",
),
/obj/item/stack/sheet/iron = list(
SCREENTIP_CONTEXT_LMB = "Craft bola",
),
)
AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
```
@@ -76,29 +76,17 @@
var/combat_mode = SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)
// Combat lmb
if(combat_mode && length(lmb_text_combat_mode))
if(lmb_text_combat_mode[user.a_intent])
context[SCREENTIP_CONTEXT_LMB] = lmb_text_combat_mode[user.a_intent]
else
var/first_item = lmb_text_combat_mode[1]
context[SCREENTIP_CONTEXT_LMB] = lmb_text_combat_mode[first_item]
context[SCREENTIP_CONTEXT_LMB] = lmb_text_combat_mode
// LMB
else if(length(lmb_text))
if(lmb_text[user.a_intent])
context[SCREENTIP_CONTEXT_LMB] = lmb_text[user.a_intent]
else
var/first_item = lmb_text[1]
context[SCREENTIP_CONTEXT_LMB] = lmb_text[first_item]
context[SCREENTIP_CONTEXT_LMB] = lmb_text
// Combat rmb
if(combat_mode && length(rmb_text_combat_mode))
if(rmb_text_combat_mode[user.a_intent])
context[SCREENTIP_CONTEXT_RMB] = rmb_text_combat_mode[user.a_intent]
else
var/first_item = rmb_text_combat_mode[1]
context[SCREENTIP_CONTEXT_RMB] = rmb_text_combat_mode[first_item]
context[SCREENTIP_CONTEXT_RMB] = rmb_text_combat_mode
// RMB
else if(length(rmb_text))
if(rmb_text[user.a_intent])
context[SCREENTIP_CONTEXT_RMB] = rmb_text[user.a_intent]
else
var/first_item = rmb_text[1]
context[SCREENTIP_CONTEXT_RMB] = rmb_text[first_item]
context[SCREENTIP_CONTEXT_RMB] = rmb_text
return CONTEXTUAL_SCREENTIP_SET
@@ -0,0 +1,57 @@
/// Apply basic contextual screentips when the user hovers over this item with an item of the given tool behavior.
/// A "Type B" interaction.
/// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance.
/datum/element/contextual_screentip_sharpness
element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH
id_arg_index = 2
/// If set, the text to show for LMB
var/list/lmb_text
/// If set, the text to show for RMB
var/list/rmb_text
/datum/element/contextual_screentip_sharpness/Attach(datum/target, lmb_text, rmb_text)
. = ..()
if (!isatom(target))
return ELEMENT_INCOMPATIBLE
src.lmb_text = lmb_text
src.rmb_text = rmb_text
var/atom/atom_target = target
atom_target.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
RegisterSignal(atom_target, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/on_requesting_context_from_item)
/datum/element/contextual_screentip_sharpness/Detach(datum/source, ...)
UnregisterSignal(source, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)
// We don't remove HAS_CONTEXTUAL_SCREENTIPS_1, since there could be other stuff still hooked to it,
// and being set without signals is not dangerous, just less performant.
// A lot of things don't do this, perhaps make a proc that checks if any signals are still set, and if not,
// remove the flag.
return ..()
/datum/element/contextual_screentip_sharpness/proc/on_requesting_context_from_item(
datum/source,
list/context,
obj/item/held_item,
)
SIGNAL_HANDLER
if (isnull(held_item))
return NONE
var/sharpness = held_item.get_sharpness()
if (!sharpness)
return NONE
if (length(lmb_text))
context[SCREENTIP_CONTEXT_LMB] = lmb_text
if (length(rmb_text))
context[SCREENTIP_CONTEXT_RMB] = rmb_text
return CONTEXTUAL_SCREENTIP_SET