updates to most recent version and puts intent hints!
This commit is contained in:
@@ -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)
|
||||
```
|
||||
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
/// Create a "Type-B" contextual screentip interaction, registering to `add_context()`.
|
||||
/// This will run `add_context()` when the atom is hovered over by an item for context.
|
||||
/// `add_context()` will *not* be called unless this is run.
|
||||
/// This is not necessary for Type-B interactions, as you can just apply the flag and register to the signal yourself.
|
||||
/atom/proc/register_context()
|
||||
flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1
|
||||
RegisterSignal(src, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, .proc/add_context)
|
||||
|
||||
/// Creates a "Type-B" contextual screentip interaction.
|
||||
/// When a user hovers over this, this proc will be called in order
|
||||
/// to provide context for contextual screentips.
|
||||
/// You must call `register_context()` in order for this to be registered.
|
||||
/// A screentip context list is a list that has context keys (SCREENTIP_CONTEXT_*, from __DEFINES/screentips.dm)
|
||||
/// that map to the action as text.
|
||||
/// If you mutate the list in this signal, you must return CONTEXTUAL_SCREENTIP_SET.
|
||||
/// `source` can, in all cases, be replaced with `src`, and only exists because this proc directly connects to a signal.
|
||||
/atom/proc/add_context(
|
||||
atom/source,
|
||||
list/context,
|
||||
obj/item/held_item,
|
||||
mob/living/user,
|
||||
)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
return NONE
|
||||
@@ -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
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
/// Create a "Type-A" contextual screentip interaction, registering to `add_item_context()`.
|
||||
/// This will run `add_item_context()` when the item hovers over another object for context.
|
||||
/// `add_item_context()` will *not* be called unless this is run.
|
||||
/// This is not necessary for Type-A interactions, as you can just apply the flag and register to the signal yourself.
|
||||
/obj/item/proc/register_item_context()
|
||||
item_flags |= ITEM_HAS_CONTEXTUAL_SCREENTIPS
|
||||
RegisterSignal(
|
||||
src,
|
||||
COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET,
|
||||
.proc/add_item_context,
|
||||
)
|
||||
|
||||
/// Creates a "Type-A" contextual screentip interaction.
|
||||
/// When a user hovers over something with this item in hand, this proc will be called in order
|
||||
/// to provide context for contextual screentips.
|
||||
/// You must call `register_item_context()` in order for this to be registered.
|
||||
/// A screentip context list is a list that has context keys (SCREENTIP_CONTEXT_*, from __DEFINES/screentips.dm)
|
||||
/// that map to the action as text.
|
||||
/// If you mutate the list in this signal, you must return CONTEXTUAL_SCREENTIP_SET.
|
||||
/// `source` can, in all cases, be replaced with `src`, and only exists because this proc directly connects to a signal.
|
||||
/obj/item/proc/add_item_context(
|
||||
obj/item/source,
|
||||
list/context,
|
||||
atom/target,
|
||||
mob/living/user,
|
||||
)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
return NONE
|
||||
Reference in New Issue
Block a user