From 4491abc2d78707ce3d683bbc3c769045ce8d0e04 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Thu, 9 Feb 2023 02:20:02 -0300 Subject: [PATCH] updates to most recent version and puts intent hints! --- code/__DEFINES/screentips.dm | 18 ++ code/datums/elements/screentips/README.md | 10 +- .../contextual_screentip_bare_hands.dm | 28 +-- .../contextual_screentip_sharpness.dm | 57 ++++++ .../{elements => }/screentips/atom_context.dm | 0 .../{elements => }/screentips/item_context.dm | 0 code/game/atoms.dm | 193 ++++++++++++++++-- code/game/machinery/doors/airlock.dm | 14 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 10 +- code/game/machinery/firealarm.dm | 5 +- code/game/objects/items/devices/PDA/PDA.dm | 32 +++ code/game/objects/items/devices/scanners.dm | 6 +- code/game/objects/items/handcuffs.dm | 4 +- code/game/objects/items/stunbaton.dm | 18 +- code/game/objects/items/weaponry.dm | 4 +- code/game/objects/structures/tables_racks.dm | 4 +- code/modules/client/preferences.dm | 2 +- .../mob/living/carbon/carbon_context.dm | 60 +++--- .../mob/living/carbon/human/human_context.dm | 17 +- tgstation.dme | 5 +- 21 files changed, 382 insertions(+), 107 deletions(-) create mode 100644 code/datums/elements/screentips/contextual_screentip_sharpness.dm rename code/datums/{elements => }/screentips/atom_context.dm (100%) rename code/datums/{elements => }/screentips/item_context.dm (100%) 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"