diff --git a/code/__DEFINES/screentips.dm b/code/__DEFINES/screentips.dm
index fecbc2a826..a3b1018352 100644
--- a/code/__DEFINES/screentips.dm
+++ b/code/__DEFINES/screentips.dm
@@ -4,9 +4,24 @@
/// Context applied to RMB actions
#define SCREENTIP_CONTEXT_RMB "RMB"
+/// Context applied to Shift-LMB actions
+#define SCREENTIP_CONTEXT_SHIFT_LMB "Shift-LMB"
+
/// Context applied to Ctrl-LMB actions
#define SCREENTIP_CONTEXT_CTRL_LMB "Ctrl-LMB"
+/// Context applied to Ctrl-RMB actions
+#define SCREENTIP_CONTEXT_CTRL_RMB "Ctrl-RMB"
+
+/// Context applied to Alt-LMB actions
+#define SCREENTIP_CONTEXT_ALT_LMB "Alt-LMB"
+
+/// Context applied to Alt-RMB actions
+#define SCREENTIP_CONTEXT_ALT_RMB "Alt-RMB"
+
+/// Context applied to Ctrl-Shift-LMB actions
+#define SCREENTIP_CONTEXT_CTRL_SHIFT_LMB "Ctrl-Shift-LMB"
+
/// Screentips are always disabled
#define SCREENTIP_PREFERENCE_DISABLED "Disabled"
@@ -15,3 +30,6 @@
/// Screentips are only enabled when they have context
#define SCREENTIP_PREFERENCE_CONTEXT_ONLY "Only with tips"
+
+/// Regardless of intent
+#define INTENT_ANY "intent_any"
diff --git a/code/datums/elements/screentips/README.md b/code/datums/elements/screentips/README.md
index 069b5d6f37..95dd54d7f7 100644
--- a/code/datums/elements/screentips/README.md
+++ b/code/datums/elements/screentips/README.md
@@ -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)
```
diff --git a/code/datums/elements/screentips/contextual_screentip_bare_hands.dm b/code/datums/elements/screentips/contextual_screentip_bare_hands.dm
index 136fcf6499..98ef45af3f 100644
--- a/code/datums/elements/screentips/contextual_screentip_bare_hands.dm
+++ b/code/datums/elements/screentips/contextual_screentip_bare_hands.dm
@@ -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
diff --git a/code/datums/elements/screentips/contextual_screentip_sharpness.dm b/code/datums/elements/screentips/contextual_screentip_sharpness.dm
new file mode 100644
index 0000000000..0ee89f2fd7
--- /dev/null
+++ b/code/datums/elements/screentips/contextual_screentip_sharpness.dm
@@ -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
+
diff --git a/code/datums/elements/screentips/atom_context.dm b/code/datums/screentips/atom_context.dm
similarity index 100%
rename from code/datums/elements/screentips/atom_context.dm
rename to code/datums/screentips/atom_context.dm
diff --git a/code/datums/elements/screentips/item_context.dm b/code/datums/screentips/item_context.dm
similarity index 100%
rename from code/datums/elements/screentips/item_context.dm
rename to code/datums/screentips/item_context.dm
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 120dad3419..deed93676e 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1460,12 +1460,34 @@
if(screentips_enabled == SCREENTIP_PREFERENCE_DISABLED || (flags_1 & NO_SCREENTIPS_1))
active_hud.screentip_text.maptext = ""
else
+ active_hud.screentip_text.maptext_y = 0
+ var/lmb_rmb_line = ""
+ var/ctrl_lmb_ctrl_rmb_line = ""
+ var/alt_lmb_alt_rmb_line = ""
+ var/shift_lmb_ctrl_shift_lmb_line = ""
+ var/extra_lines = 0
var/extra_context = ""
- if (isliving(user))
+ // Generate intent icons
+ var/static/image/intent_help
+ if(!intent_help)
+ intent_help = image('icons/emoji.dmi', icon_state = INTENT_HELP)
+ var/static/image/intent_disarm
+ if(!intent_disarm)
+ intent_disarm = image('icons/emoji.dmi', icon_state = INTENT_DISARM)
+ var/static/image/intent_grab
+ if(!intent_grab)
+ intent_grab = image('icons/emoji.dmi', icon_state = INTENT_GRAB)
+ var/static/image/intent_harm
+ if(!intent_harm)
+ intent_harm = image('icons/emoji.dmi', icon_state = INTENT_HARM)
+ //
+
+
+ if (isliving(user) || isovermind(user) || isaicamera(user))
var/obj/item/held_item = user.get_active_held_item()
- if ((flags_1 & HAS_CONTEXTUAL_SCREENTIPS_1) || (held_item?.item_flags & ITEM_HAS_CONTEXTUAL_SCREENTIPS))
+ if (flags_1 & HAS_CONTEXTUAL_SCREENTIPS_1 || held_item?.item_flags & ITEM_HAS_CONTEXTUAL_SCREENTIPS)
var/list/context = list()
var/contextual_screentip_returns = \
@@ -1474,23 +1496,168 @@
if (contextual_screentip_returns & CONTEXTUAL_SCREENTIP_SET)
// LMB and RMB on one line...
- var/lmb_text = (SCREENTIP_CONTEXT_LMB in context) ? "[SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB]]" : ""
- var/rmb_text = (SCREENTIP_CONTEXT_RMB in context) ? "[SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB]]" : ""
+ var/lmb_text = ""
+ if((SCREENTIP_CONTEXT_LMB in context) && (length(context[SCREENTIP_CONTEXT_LMB]) > 0))
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_LMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_LMB]: [context[SCREENTIP_CONTEXT_LMB][intent]]")
+ lmb_text = english_list(to_add, "", " | ", " | ", " | ")
+ var/rmb_text = ""
+ if((SCREENTIP_CONTEXT_RMB in context) && (length(context[SCREENTIP_CONTEXT_RMB]) > 0))
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_RMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_RMB]: [context[SCREENTIP_CONTEXT_RMB][intent]]")
+ rmb_text = english_list(to_add, "", " | ", " | ", " | ")
if (lmb_text)
- extra_context = lmb_text
+ lmb_rmb_line = lmb_text
if (rmb_text)
- extra_context += " | [rmb_text]"
+ lmb_rmb_line += " | [rmb_text]"
else if (rmb_text)
- extra_context = rmb_text
+ lmb_rmb_line = rmb_text
- // Ctrl-LMB and (in the future) Alt-LMB on another
- if (SCREENTIP_CONTEXT_CTRL_LMB in context)
- if (extra_context != "")
- extra_context += "
"
- extra_context += "[SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB]]"
+ // Ctrl-LMB, Ctrl-RMB on one line...
+ if (lmb_rmb_line != "")
+ lmb_rmb_line += "
"
+ extra_lines++
+ if((SCREENTIP_CONTEXT_CTRL_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_LMB]) > 0))
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_CTRL_LMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB][intent]]")
+ ctrl_lmb_ctrl_rmb_line = english_list(to_add, "", " | ", " | ", " | ")
- extra_context = "
[extra_context]"
+ if((SCREENTIP_CONTEXT_CTRL_RMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_RMB]) > 0))
+ if (ctrl_lmb_ctrl_rmb_line != "")
+ ctrl_lmb_ctrl_rmb_line += " | "
+ ctrl_lmb_ctrl_rmb_line += "[SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB]]"
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_CTRL_RMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_CTRL_RMB]: [context[SCREENTIP_CONTEXT_CTRL_RMB][intent]]")
+ ctrl_lmb_ctrl_rmb_line = english_list(to_add, "", " | ", " | ", " | ")
+
+ // Alt-LMB, Alt-RMB on one line...
+ if (ctrl_lmb_ctrl_rmb_line != "")
+ ctrl_lmb_ctrl_rmb_line += "
"
+ extra_lines++
+ if((SCREENTIP_CONTEXT_ALT_LMB in context) && (length(context[SCREENTIP_CONTEXT_ALT_LMB]) > 0))
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_ALT_LMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_ALT_LMB]: [context[SCREENTIP_CONTEXT_ALT_LMB][intent]]")
+ alt_lmb_alt_rmb_line = english_list(to_add, "", " | ", " | ", " | ")
+ if((SCREENTIP_CONTEXT_ALT_RMB in context) && (length(context[SCREENTIP_CONTEXT_ALT_RMB]) > 0))
+ if (alt_lmb_alt_rmb_line != "")
+ alt_lmb_alt_rmb_line += " | "
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_ALT_RMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_ALT_RMB]: [context[SCREENTIP_CONTEXT_ALT_RMB][intent]]")
+ alt_lmb_alt_rmb_line = english_list(to_add, "", " | ", " | ", " | ")
+
+ // Shift-LMB, Ctrl-Shift-LMB on one line...
+ if (alt_lmb_alt_rmb_line != "")
+ alt_lmb_alt_rmb_line += "
"
+ extra_lines++
+ if((SCREENTIP_CONTEXT_SHIFT_LMB in context) && (length(context[SCREENTIP_CONTEXT_SHIFT_LMB]) > 0))
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_SHIFT_LMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_SHIFT_LMB][intent]]")
+ shift_lmb_ctrl_shift_lmb_line = english_list(to_add, "", " | ", " | ", " | ")
+
+ if((SCREENTIP_CONTEXT_CTRL_SHIFT_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]) > 0))
+ if (shift_lmb_ctrl_shift_lmb_line != "")
+ shift_lmb_ctrl_shift_lmb_line += " | "
+ shift_lmb_ctrl_shift_lmb_line += "[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]]"
+ var/list/to_add
+ for(var/intent in context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB])
+ switch(intent)
+ if(INTENT_HELP)
+ LAZYADD(to_add, "\icon[intent_help] [SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB][INTENT_HELP]]")
+ if(INTENT_DISARM)
+ LAZYADD(to_add, "\icon[intent_disarm] [SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB][INTENT_DISARM]]")
+ if(INTENT_GRAB)
+ LAZYADD(to_add, "\icon[intent_grab] [SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB][INTENT_GRAB]]")
+ if(INTENT_HARM)
+ LAZYADD(to_add, "\icon[intent_harm] [SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB][INTENT_HARM]]")
+ else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
+ LAZYADD(to_add, "[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB]: [context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB][intent]]")
+ shift_lmb_ctrl_shift_lmb_line = english_list(to_add, "", " | ", " | ", " | ")
+
+ if (shift_lmb_ctrl_shift_lmb_line != "")
+ extra_lines++
+
+ if(extra_lines)
+ extra_context = "
[lmb_rmb_line][ctrl_lmb_ctrl_rmb_line][alt_lmb_alt_rmb_line][shift_lmb_ctrl_shift_lmb_line]"
+ //first extra line pushes atom name line up 10px, subsequent lines push it up 9px, this offsets that and keeps the first line in the same place
+ active_hud.screentip_text.maptext_y = -10 + (extra_lines - 1) * -9
if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "")
active_hud.screentip_text.maptext = ""
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index d45d0c3260..aa888fe67e 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -701,34 +701,34 @@
. = ..()
if(istype(held_item, /obj/item/stack/sheet/plasteel))
- context[SCREENTIP_CONTEXT_LMB] = "Reinforce"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Reinforce")
return CONTEXTUAL_SCREENTIP_SET
switch (held_item?.tool_behaviour)
if (TOOL_CROWBAR)
if (panel_open)
if (security_level == AIRLOCK_SECURITY_PLASTEEL_O_S || security_level == AIRLOCK_SECURITY_PLASTEEL_I_S)
- context[SCREENTIP_CONTEXT_LMB] = "Remove shielding"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Remove shielding")
return CONTEXTUAL_SCREENTIP_SET
else if (should_try_removing_electronics())
- context[SCREENTIP_CONTEXT_LMB] = "Remove electronics"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Remove electronics")
return CONTEXTUAL_SCREENTIP_SET
// Not always contextually true, but is contextually false in ways that make gameplay interesting.
// For example, trying to pry open an airlock, only for the bolts to be down and the lights off.
- context[SCREENTIP_CONTEXT_LMB] = "Pry open"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Pry open")
return CONTEXTUAL_SCREENTIP_SET
if (TOOL_WELDER)
- context[SCREENTIP_CONTEXT_RMB] = "Weld shut"
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Weld shut")
if (panel_open)
switch (security_level)
if (AIRLOCK_SECURITY_METAL, AIRLOCK_SECURITY_PLASTEEL_I, AIRLOCK_SECURITY_PLASTEEL_O)
- context[SCREENTIP_CONTEXT_LMB] = "Cut shielding"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Cut shielding")
return CONTEXTUAL_SCREENTIP_SET
- context[SCREENTIP_CONTEXT_LMB] = "Repair"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Repair")
return CONTEXTUAL_SCREENTIP_SET
return .
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index b037c8f090..d565984bf0 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -59,7 +59,7 @@
. = ..()
if (isnull(held_item) && !istype(src, /obj/machinery/door/firedoor)) // You cannot open/close with your hands
- context[SCREENTIP_CONTEXT_LMB] = density ? "Open" : "Close"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (density ? "Open" : "Close"))
return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/door/check_access_list(list/access_list)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index b5ca314115..b094f5c28a 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -51,7 +51,7 @@
if (isnull(held_item))
if (density)
- context[SCREENTIP_CONTEXT_LMB] = "Knock"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Knock")
return CONTEXTUAL_SCREENTIP_SET
else
return .
@@ -59,18 +59,18 @@
switch (held_item.tool_behaviour)
if (TOOL_CROWBAR)
if(!welded)
- context[SCREENTIP_CONTEXT_LMB] = density ? "Open" : "Close"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (density ? "Open" : "Close"))
return CONTEXTUAL_SCREENTIP_SET
if (TOOL_WELDER)
- context[SCREENTIP_CONTEXT_LMB] = welded ? "Unweld shut" : "Weld shut"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (welded ? "Unweld shut" : "Weld shut"))
return CONTEXTUAL_SCREENTIP_SET
if (TOOL_WRENCH)
if (welded && !boltslocked)
- context[SCREENTIP_CONTEXT_LMB] = "Unfasten bolts"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Unfasten bolts")
return CONTEXTUAL_SCREENTIP_SET
if (TOOL_SCREWDRIVER)
if (welded)
- context[SCREENTIP_CONTEXT_LMB] = boltslocked ? "Unlock bolts" : "Lock bolts"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (boltslocked ? "Unlock bolts" : "Lock bolts"))
return CONTEXTUAL_SCREENTIP_SET
return .
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index bd741d536e..0a0bed491b 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -51,11 +51,14 @@
myarea = get_base_area(src)
LAZYADD(myarea.firealarms, src)
+ register_context()
+
/obj/machinery/firealarm/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
. = ..()
if(isnull(held_item))
- context[SCREENTIP_CONTEXT_LMB] = triggered ? "Turn off" : "Turn on"
+ var/area/location = get_area(src)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, (location.fire ? "Turn off" : "Turn on"))
return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/firealarm/Destroy()
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index b3eb8ab439..ed6f4e8123 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -116,6 +116,38 @@ GLOBAL_LIST_EMPTY(PDAs)
if(inserted_item && (!isturf(loc)))
. += "Ctrl-click to remove [inserted_item]."
+/obj/item/pda/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
+ . = ..()
+
+ if(held_item)
+ if(istype(held_item, /obj/item/cartridge) && !cartridge)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert Cartridge")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(istype(held_item, /obj/item/card/id) && !id)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert ID")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(istype(held_item, /obj/item/paicard) && !pai)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert pAI")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(is_type_in_list(held_item, contained_item) && !inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Insert [held_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(istype(held_item, /obj/item/photo))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan photo")
+ . = CONTEXTUAL_SCREENTIP_SET
+
+ if(id) // ID gets removed before inserted_item
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Remove ID")
+ . = CONTEXTUAL_SCREENTIP_SET
+ else if(inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Remove [inserted_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+
+ if(inserted_item)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Remove [inserted_item]")
+ . = CONTEXTUAL_SCREENTIP_SET
+ return . || NONE
+
/obj/item/pda/Initialize(mapload)
if(GLOB.pda_reskins)
unique_reskin = GLOB.pda_reskins
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 78d3ae58e4..7d7e39c41f 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -145,11 +145,11 @@ GENETICS SCANNER
switch (scanmode)
if (SCANMODE_HEALTH)
- context[SCREENTIP_CONTEXT_LMB] = "Scan health"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan health")
if (SCANMODE_CHEMICAL)
- context[SCREENTIP_CONTEXT_LMB] = "Scan chemicals"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan chemicals")
if (SCANMODE_WOUND)
- context[SCREENTIP_CONTEXT_LMB] = "Scan wounds"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Scan wounds")
return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 0c69e8ef6c..f0cd0fc1e7 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -127,11 +127,11 @@
var/static/list/hovering_item_typechecks = list(
/obj/item/stack/rods = list(
- SCREENTIP_CONTEXT_LMB = "Craft wired rod",
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft wired rod"),
),
/obj/item/stack/sheet/metal = list(
- SCREENTIP_CONTEXT_LMB = "Craft bola",
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft bola"),
),
)
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index ded7c4d656..7d84d38624 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -162,22 +162,18 @@
return NONE
if (isobj(target))
- context[SCREENTIP_CONTEXT_LMB] = "Attack"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Attack")
else
if (turned_on)
- context[SCREENTIP_CONTEXT_RMB] = "Knockdown"
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Knockdown")
- if (user.a_intent == INTENT_HARM)
- context[SCREENTIP_CONTEXT_LMB] = "Harmful stun"
- else
- context[SCREENTIP_CONTEXT_LMB] = "Stun"
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Stun")
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Harmful stun")
else
- context[SCREENTIP_CONTEXT_RMB] = "Knockdown" // DON'T TELL EM, PRANKED.
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Knockdown") // DON'T TELL EM, PRANKED.
- if (user.a_intent == INTENT_HARM)
- context[SCREENTIP_CONTEXT_LMB] = "Attack" // It's fine i guess...?
- else
- context[SCREENTIP_CONTEXT_LMB] = "Stun" // STILL DO NOT DARE TELLING THEM
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, "Stun") // STILL DO NOT DARE TELLING THEM
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Attack") // It's fine i guess...?
return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index fdcfbd3a47..fa8a0bd239 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -588,11 +588,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
var/static/list/hovering_item_typechecks = list(
/obj/item/shard = list(
- SCREENTIP_CONTEXT_LMB = "Craft spear",
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft spear"),
),
/obj/item/assembly/igniter = list(
- SCREENTIP_CONTEXT_LMB = "Craft stunprod",
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Craft stunprod"),
),
)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index d0344d68fc..38b9737104 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -503,11 +503,11 @@
if (!(flags_1 & NODECONSTRUCT_1))
var/static/list/tool_behaviors = list(
TOOL_SCREWDRIVER = list(
- SCREENTIP_CONTEXT_LMB = "Disassemble",
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Disassemble"),
),
TOOL_WRENCH = list(
- SCREENTIP_CONTEXT_LMB = "Deconstruct",
+ SCREENTIP_CONTEXT_LMB = list(INTENT_ANY = "Deconstruct"),
),
)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 9144f0d708..1e83285139 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -827,7 +827,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "UI Style: [UI_style]
"
dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"]
"
dat += "Outline Color: [outline_color ? "" : "Theme-based (null)"] Change
"
- dat += "Screentip: [screentip_pref ? "Enabled" : "Disabled"]
"
+ dat += "Screentip: [screentip_pref]
"
dat += "Screentip Color: Change
"
dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"]
"
dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
"
diff --git a/code/modules/mob/living/carbon/carbon_context.dm b/code/modules/mob/living/carbon/carbon_context.dm
index ae2a8d26e7..36c7974574 100644
--- a/code/modules/mob/living/carbon/carbon_context.dm
+++ b/code/modules/mob/living/carbon/carbon_context.dm
@@ -9,42 +9,40 @@
var/combat_mode = SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)
- switch(user.a_intent)
- if(INTENT_HELP)
- if(user == src)
- context[SCREENTIP_CONTEXT_LMB] = "Check injuries"
- else if(!lying)
- context[SCREENTIP_CONTEXT_LMB] = "Comfort"
- else if (health >= 0 && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
- context[SCREENTIP_CONTEXT_LMB] = "Shake"
- else
- context[SCREENTIP_CONTEXT_LMB] = "CPR"
- if(INTENT_DISARM)
- context[SCREENTIP_CONTEXT_LMB] = "Disarm"
- if(combat_mode && (src != user))
- context[SCREENTIP_CONTEXT_RMB] = "Shove"
- if(INTENT_GRAB)
- if(src != user)
- if (pulledby == user)
- switch (user.grab_state)
- if (GRAB_PASSIVE)
- context[SCREENTIP_CONTEXT_LMB] = "Grip"
- if (GRAB_AGGRESSIVE)
- context[SCREENTIP_CONTEXT_LMB] = "Choke"
- if (GRAB_NECK)
- context[SCREENTIP_CONTEXT_LMB] = "Strangle"
- else
- return .
+ if(user == src)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "Check injuries")
+ else if(!lying)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "Comfort")
+ else if (health >= 0 && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "Shake")
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HELP, "CPR")
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_DISARM, "Disarm")
+ if(combat_mode && (src != user))
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_DISARM, "Shove")
+
+ if(src != user)
+ if (pulledby == user)
+ switch (user.grab_state)
+ if (GRAB_PASSIVE)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Grip")
+ if (GRAB_AGGRESSIVE)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Choke")
+ if (GRAB_NECK)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Strangle")
else
- context[SCREENTIP_CONTEXT_LMB] = "Pull"
- if(INTENT_HARM)
- context[SCREENTIP_CONTEXT_LMB] = "Attack"
+ return .
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_GRAB, "Pull")
+
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_HARM, "Attack")
// Did you know we cannot upgrade grabs from ctrl-click, that's cool
if((pulledby != user) && (src != user))
- context[SCREENTIP_CONTEXT_CTRL_LMB] = "Pull"
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_LMB], INTENT_ANY, "Pull")
// Happens on any intent i believe
if((user == src) && combat_mode && lying)
- context[SCREENTIP_CONTEXT_RMB] = "Force to get up"
+ LAZYSET(context[SCREENTIP_CONTEXT_RMB], INTENT_ANY, "Force to get up")
return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/modules/mob/living/carbon/human/human_context.dm b/code/modules/mob/living/carbon/human/human_context.dm
index 5ad545985e..fb3087f432 100644
--- a/code/modules/mob/living/carbon/human/human_context.dm
+++ b/code/modules/mob/living/carbon/human/human_context.dm
@@ -1,12 +1,21 @@
-/* // Nothing unique, yet.
/mob/living/carbon/human/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
. = ..()
if (!ishuman(user))
return .
- if (user == src)
- return .
+ var/aim_for_mouth = user.zone_selected == "mouth"
+ var/target_on_help = a_intent == INTENT_HELP
+ var/target_aiming_for_mouth = zone_selected == "mouth"
+ var/target_restrained = restrained()
+ var/same_dir = (dir & user.dir)
+ var/aim_for_groin = user.zone_selected == "groin"
+ var/target_aiming_for_groin = zone_selected == "groin"
+
+ if(aim_for_mouth && (target_on_help || target_restrained || target_aiming_for_mouth))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_DISARM, "Slap face")
+
+ else if(aim_for_groin && (src == user || lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_DISARM, "Slap ass")
return CONTEXTUAL_SCREENTIP_SET
-*/
diff --git a/tgstation.dme b/tgstation.dme
index 13ef5694e7..c958a86148 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -717,11 +717,10 @@
#include "code\datums\elements\ventcrawling.dm"
#include "code\datums\elements\weather_listener.dm"
#include "code\datums\elements\wuv.dm"
-#include "code\datums\elements\screentips\atom_context.dm"
#include "code\datums\elements\screentips\contextual_screentip_bare_hands.dm"
#include "code\datums\elements\screentips\contextual_screentip_item_typechecks.dm"
+#include "code\datums\elements\screentips\contextual_screentip_sharpness.dm"
#include "code\datums\elements\screentips\contextual_screentip_tools.dm"
-#include "code\datums\elements\screentips\item_context.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
@@ -777,6 +776,8 @@
#include "code\datums\ruins\lavaland.dm"
#include "code\datums\ruins\space.dm"
#include "code\datums\ruins\station.dm"
+#include "code\datums\screentips\atom_context.dm"
+#include "code\datums\screentips\item_context.dm"
#include "code\datums\skills\_check_skills.dm"
#include "code\datums\skills\_skill.dm"
#include "code\datums\skills\_skill_holder.dm"