diff --git a/code/__DEFINES/screentips.dm b/code/__DEFINES/screentips.dm
index a3b1018352..4918db85ce 100644
--- a/code/__DEFINES/screentips.dm
+++ b/code/__DEFINES/screentips.dm
@@ -32,4 +32,4 @@
#define SCREENTIP_PREFERENCE_CONTEXT_ONLY "Only with tips"
/// Regardless of intent
-#define INTENT_ANY "intent_any"
+#define INTENT_ANY "any"
diff --git a/code/__HELPERS/screentips.dm b/code/__HELPERS/screentips.dm
index 967e1c3bb6..fc6673a006 100644
--- a/code/__HELPERS/screentips.dm
+++ b/code/__HELPERS/screentips.dm
@@ -1,31 +1,30 @@
+#define HINT_ICON_FILE 'icons/UI_Icons/screentips/cursor_hints.dmi'
+
// Generate intent icons
-/// Help intent icon for screentip context
-GLOBAL_DATUM_INIT(icon_intent_help, /image, image('icons/emoji.dmi', icon_state = INTENT_HELP))
-/// Disarm intent icon for screentip context
-GLOBAL_DATUM_INIT(icon_intent_disarm, /image, image('icons/emoji.dmi', icon_state = INTENT_DISARM))
-/// Grab intent icon for screentip context
-GLOBAL_DATUM_INIT(icon_intent_grab, /image, image('icons/emoji.dmi', icon_state = INTENT_GRAB))
-/// Harm intent icon for screentip context
-GLOBAL_DATUM_INIT(icon_intent_harm, /image, image('icons/emoji.dmi', icon_state = INTENT_HARM))
+GLOBAL_LIST_INIT_TYPED(screentip_context_icons, /image, prepare_screentip_context_icons())
+
+/proc/prepare_screentip_context_icons()
+ . = list()
+ for(var/state in icon_states(HINT_ICON_FILE))
+ .[state] = image(HINT_ICON_FILE, icon_state = state)
/*
* # Builds context with each intent for this key
* Args:
* - context = list (REQUIRED)
* - key = string (REQUIRED)
+ * - allow_image = boolean (not required)
*/
-/proc/build_context(list/context, key)
+/proc/build_context(list/context, key, allow_image)
var/list/to_add
for(var/intent in context[key])
- switch(intent)
- if(INTENT_HELP)
- LAZYADD(to_add, "\icon[GLOB.icon_intent_help] [key]: [context[key][INTENT_HELP]]")
- if(INTENT_DISARM)
- LAZYADD(to_add, "\icon[GLOB.icon_intent_disarm] [key]: [context[key][INTENT_DISARM]]")
- if(INTENT_GRAB)
- LAZYADD(to_add, "\icon[GLOB.icon_intent_grab] [key]: [context[key][INTENT_GRAB]]")
- if(INTENT_HARM)
- LAZYADD(to_add, "\icon[GLOB.icon_intent_harm] [key]: [context[key][INTENT_HARM]]")
- else // If you're adding intent-less YOU BETTER ADD IT FIRST IN THE LIST
- LAZYADD(to_add, "[key]: [context[key][intent]]")
- return english_list(to_add, "", " ", " ")
+ var/key_help = "[length(key) > 3 ? copytext(key, 1, -3) : ""]"
+ var/icon = "[copytext(key, -3)]-[intent]"
+ if(allow_image)
+ icon = "\icon[GLOB.screentip_context_icons[icon]]"
+ LAZYADD(to_add, "[key_help][icon]: [context[key][intent]]")
+
+ var/separator = "[allow_image ? " " : " | "]"
+ return english_list(to_add, "", separator, separator)
+
+#undef HINT_ICON_FILE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 911a91bea3..ba2d6ad56c 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1470,6 +1470,7 @@
if (isliving(user) || isovermind(user) || isaicamera(user))
var/obj/item/held_item = user.get_active_held_item()
+ var/allow_images = user.client.prefs.screentip_allow_images
if (flags_1 & HAS_CONTEXTUAL_SCREENTIPS_1 || held_item?.item_flags & ITEM_HAS_CONTEXTUAL_SCREENTIPS)
var/list/context = list()
@@ -1482,10 +1483,10 @@
// LMB and RMB on one line...
var/lmb_text = ""
if((SCREENTIP_CONTEXT_LMB in context) && (length(context[SCREENTIP_CONTEXT_LMB]) > 0))
- lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB)
+ lmb_text = build_context(context, SCREENTIP_CONTEXT_LMB, allow_images)
var/rmb_text = ""
if((SCREENTIP_CONTEXT_RMB in context) && (length(context[SCREENTIP_CONTEXT_RMB]) > 0))
- rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB)
+ rmb_text = build_context(context, SCREENTIP_CONTEXT_RMB, allow_images)
if (lmb_text)
lmb_rmb_line = lmb_text
@@ -1499,37 +1500,37 @@
lmb_rmb_line += "
"
extra_lines++
if((SCREENTIP_CONTEXT_CTRL_LMB in context) && (length(context[SCREENTIP_CONTEXT_CTRL_LMB]) > 0))
- ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_LMB)
+ ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_LMB, allow_images)
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]]"
- ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_RMB)
+ ctrl_lmb_ctrl_rmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_RMB, allow_images)
// 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))
- alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_LMB)
+ alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_LMB, allow_images)
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 += " | "
- alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_RMB)
+ alt_lmb_alt_rmb_line = build_context(context, SCREENTIP_CONTEXT_ALT_RMB, allow_images)
// 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))
- shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB)
+ shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_SHIFT_LMB, allow_images)
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]]"
- shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB)
+ shift_lmb_ctrl_shift_lmb_line = build_context(context, SCREENTIP_CONTEXT_CTRL_SHIFT_LMB, allow_images)
if (shift_lmb_ctrl_shift_lmb_line != "")
extra_lines++
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1e83285139..744ab254ae 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -64,6 +64,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/outline_color = COLOR_THEME_MIDNIGHT
var/screentip_pref = SCREENTIP_PREFERENCE_ENABLED
var/screentip_color = "#ffd391"
+ var/screentip_allow_images = FALSE
var/buttons_locked = FALSE
var/hotkeys = FALSE
@@ -829,6 +830,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Outline Color: [outline_color ? "" : "Theme-based (null)"] Change
"
dat += "Screentip: [screentip_pref]
"
dat += "Screentip Color: Change
"
+ dat += "\
+ Screentip context with images: [screentip_allow_images ? "Allowed" : "Disallowed"]
"
dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"]
"
dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
"
dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"]
"
@@ -2925,6 +2929,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/pickedScreentipColor = input(user, "Choose your screentip color.", "General Preference", screentip_color) as color|null
if(pickedScreentipColor)
screentip_color = pickedScreentipColor
+ if("screentip_allow_images")
+ screentip_allow_images = !screentip_allow_images
if("tgui_lock")
tgui_lock = !tgui_lock
if("winflash")
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index c0386e8f45..cbd35a290c 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -423,6 +423,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["outline_enabled"] >> outline_enabled
S["screentip_pref"] >> screentip_pref
S["screentip_color"] >> screentip_color
+ S["screentip_allow_images"] >> screentip_allow_images
S["hotkeys"] >> hotkeys
S["chat_on_map"] >> chat_on_map
S["max_chat_length"] >> max_chat_length
@@ -611,6 +612,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["outline_color"], outline_color)
WRITE_FILE(S["screentip_pref"], screentip_pref)
WRITE_FILE(S["screentip_color"], screentip_color)
+ WRITE_FILE(S["screentip_allow_images"], screentip_allow_images)
WRITE_FILE(S["hotkeys"], hotkeys)
WRITE_FILE(S["chat_on_map"], chat_on_map)
WRITE_FILE(S["max_chat_length"], max_chat_length)
diff --git a/icons/UI_Icons/screentips/cursor_hints.dmi b/icons/UI_Icons/screentips/cursor_hints.dmi
new file mode 100644
index 0000000000..01c1dfe33e
Binary files /dev/null and b/icons/UI_Icons/screentips/cursor_hints.dmi differ
diff --git a/icons/UI_Icons/screentips/cursor_hints_outline.dmi b/icons/UI_Icons/screentips/cursor_hints_outline.dmi
new file mode 100644
index 0000000000..32e0b8f67c
Binary files /dev/null and b/icons/UI_Icons/screentips/cursor_hints_outline.dmi differ