pushies.
This commit is contained in:
+44
-5
@@ -1450,11 +1450,50 @@
|
||||
/atom/MouseEntered(location, control, params)
|
||||
. = ..()
|
||||
// Screentips
|
||||
var/client/client = usr?.client
|
||||
var/datum/hud/active_hud = client?.mob?.hud_used
|
||||
var/mob/user = usr
|
||||
if(isnull(user) && !user.client)
|
||||
return
|
||||
|
||||
var/datum/hud/active_hud = user.hud_used
|
||||
if(active_hud)
|
||||
if(!client.prefs.screentip_pref || (flags_1 & NO_SCREENTIPS_1))
|
||||
var/screentips_enabled = user.client.prefs.screentip_pref
|
||||
if(screentips_enabled == SCREENTIP_PREFERENCE_DISABLED || (flags_1 & NO_SCREENTIPS_1))
|
||||
active_hud.screentip_text.maptext = ""
|
||||
else
|
||||
//We inline a MAPTEXT() here, because there's no good way to statically add to a string like this
|
||||
active_hud.screentip_text.maptext = MAPTEXT("<span style='text-align: center; font-size: 32px; color: [client?.prefs?.screentip_color]'>[name]</span>")
|
||||
var/extra_context = ""
|
||||
|
||||
if (isliving(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))
|
||||
var/list/context = list()
|
||||
|
||||
var/contextual_screentip_returns = \
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, context, held_item, user) \
|
||||
| (held_item && SEND_SIGNAL(held_item, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, context, src, user))
|
||||
|
||||
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]]" : ""
|
||||
|
||||
if (lmb_text)
|
||||
extra_context = lmb_text
|
||||
if (rmb_text)
|
||||
extra_context += " | [rmb_text]"
|
||||
else if (rmb_text)
|
||||
extra_context = rmb_text
|
||||
|
||||
// Ctrl-LMB and (in the future) Alt-LMB on another
|
||||
if (SCREENTIP_CONTEXT_CTRL_LMB in context)
|
||||
if (extra_context != "")
|
||||
extra_context += "<br>"
|
||||
extra_context += "[SCREENTIP_CONTEXT_CTRL_LMB]: [context[SCREENTIP_CONTEXT_CTRL_LMB]]"
|
||||
|
||||
extra_context = "<br><span style='font-size: 7px'>[extra_context]</span>"
|
||||
|
||||
if (screentips_enabled == SCREENTIP_PREFERENCE_CONTEXT_ONLY && extra_context == "")
|
||||
active_hud.screentip_text.maptext = ""
|
||||
else
|
||||
//We inline a MAPTEXT() here, because there's no good way to statically add to a string like this
|
||||
active_hud.screentip_text.maptext = "<span class='maptext' style='text-align: center; font-size: 32px; color: [user.client.prefs.screentip_color]'>[name][extra_context]</span>"
|
||||
|
||||
@@ -697,6 +697,38 @@
|
||||
. += "<span class='notice'>Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it.</span>"
|
||||
. += "<span class='notice'>Ctrl-Shift-click [src] to [ emergency ? "disable" : "enable"] emergency access.</span>"
|
||||
|
||||
/obj/machinery/door/airlock/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
|
||||
. = ..()
|
||||
|
||||
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"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
else if (should_try_removing_electronics())
|
||||
context[SCREENTIP_CONTEXT_LMB] = "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"
|
||||
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
if (TOOL_WELDER)
|
||||
context[SCREENTIP_CONTEXT_RMB] = "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"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Repair"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
return .
|
||||
|
||||
/obj/machinery/door/airlock/attack_ai(mob/user)
|
||||
if(!src.canAIControl(user))
|
||||
if(src.canAIHack())
|
||||
@@ -1024,6 +1056,31 @@
|
||||
return
|
||||
return !operating && density
|
||||
|
||||
/// Returns if a crowbar would remove the airlock electronics
|
||||
/obj/machinery/door/airlock/proc/should_try_removing_electronics()
|
||||
if (security_level != 0)
|
||||
return FALSE
|
||||
|
||||
if (!panel_open)
|
||||
return FALSE
|
||||
|
||||
if (obj_flags & EMAGGED)
|
||||
return TRUE
|
||||
|
||||
if (!density)
|
||||
return FALSE
|
||||
|
||||
if (!welded)
|
||||
return FALSE
|
||||
|
||||
if (hasPower())
|
||||
return FALSE
|
||||
|
||||
if (locked)
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/door/airlock/try_to_crowbar(obj/item/I, mob/living/user)
|
||||
var/beingcrowbarred = null
|
||||
if(I.tool_behaviour == TOOL_CROWBAR)
|
||||
@@ -1042,9 +1099,9 @@
|
||||
charge.forceMove(get_turf(user))
|
||||
charge = null
|
||||
return
|
||||
if(beingcrowbarred && panel_open && ((obj_flags & EMAGGED) || (density && welded && !operating && !hasPower() && !locked)))
|
||||
user.visible_message("[user] removes the electronics from the airlock assembly.", \
|
||||
"<span class='notice'>You start to remove electronics from the airlock assembly...</span>")
|
||||
if(beingcrowbarred && should_try_removing_electronics() && !operating)
|
||||
user.visible_message(span_notice("[user] removes the electronics from the airlock assembly."), \
|
||||
span_notice("You start to remove electronics from the airlock assembly..."))
|
||||
if(I.use_tool(src, user, 40, volume=100))
|
||||
deconstruct(TRUE, user)
|
||||
return
|
||||
|
||||
@@ -55,6 +55,13 @@
|
||||
if(!poddoor)
|
||||
. += "<span class='notice'>Its maintenance panel is <b>screwed</b> in place.</span>"
|
||||
|
||||
/obj/machinery/door/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
|
||||
. = ..()
|
||||
|
||||
if (isnull(held_item))
|
||||
context[SCREENTIP_CONTEXT_LMB] = density ? "Open" : "Close"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
/obj/machinery/door/check_access_list(list/access_list)
|
||||
if(red_alert_access && GLOB.security_level >= SEC_LEVEL_RED)
|
||||
return TRUE
|
||||
@@ -65,6 +72,7 @@
|
||||
set_init_door_layer()
|
||||
update_freelook_sight()
|
||||
air_update_turf(1)
|
||||
register_context()
|
||||
GLOB.airlocks += src
|
||||
spark_system = new /datum/effect_system/spark_spread
|
||||
spark_system.set_up(2, 1, src)
|
||||
|
||||
@@ -46,6 +46,44 @@
|
||||
else
|
||||
. += "<span class='notice'>The bolt locks have been <i>unscrewed</i>, but the bolts themselves are still <b>wrenched</b> to the floor.</span>"
|
||||
|
||||
/obj/machinery/door/firedoor/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
|
||||
. = ..()
|
||||
|
||||
if (isnull(held_item))
|
||||
if (density)
|
||||
// This should be LMB/RMB one day
|
||||
if (user.a_intent == INTENT_HARM)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Knock"
|
||||
else
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Bash"
|
||||
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
else
|
||||
return .
|
||||
|
||||
switch (held_item.tool_behaviour)
|
||||
if (TOOL_CROWBAR)
|
||||
if (density)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Close"
|
||||
else if (!welded)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Hold open"
|
||||
context[SCREENTIP_CONTEXT_RMB] = "Open permanently"
|
||||
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
if (TOOL_WELDER)
|
||||
context[SCREENTIP_CONTEXT_LMB] = welded ? "Unweld shut" : "Weld shut"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
if (TOOL_WRENCH)
|
||||
if (welded && !boltslocked)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Unfasten bolts"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
if (TOOL_SCREWDRIVER)
|
||||
if (welded)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Unlock bolts"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
return .
|
||||
|
||||
/obj/machinery/door/firedoor/proc/CalculateAffectingAreas()
|
||||
remove_from_areas()
|
||||
affecting_areas = get_adjacent_open_areas(src) | get_base_area(src)
|
||||
|
||||
@@ -51,6 +51,12 @@
|
||||
myarea = get_base_area(src)
|
||||
LAZYADD(myarea.firealarms, src)
|
||||
|
||||
AddElement( \
|
||||
/datum/element/contextual_screentip_bare_hands, \
|
||||
lmb_text = "Turn on", \
|
||||
rmb_text = "Turn off", \
|
||||
)
|
||||
|
||||
/obj/machinery/firealarm/Destroy()
|
||||
myarea.firereset(src)
|
||||
LAZYREMOVE(myarea.firealarms, src)
|
||||
|
||||
@@ -91,6 +91,11 @@ GENETICS SCANNER
|
||||
var/scanmode = SCANMODE_HEALTH
|
||||
var/advanced = FALSE
|
||||
|
||||
/obj/item/healthanalyzer/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
register_item_context()
|
||||
|
||||
/obj/item/healthanalyzer/suicide_act(mob/living/carbon/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins to analyze [user.p_them()]self with [src]! The display shows that [user.p_theyre()] dead!</span>")
|
||||
return BRUTELOSS
|
||||
@@ -130,6 +135,24 @@ GENETICS SCANNER
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/healthanalyzer/add_item_context(
|
||||
obj/item/source,
|
||||
list/context,
|
||||
atom/target,
|
||||
)
|
||||
if (!isliving(target))
|
||||
return NONE
|
||||
|
||||
switch (scanmode)
|
||||
if (SCANMODE_HEALTH)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Scan health"
|
||||
if (SCANMODE_CHEMICAL)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Scan chemicals"
|
||||
if (SCANMODE_WOUND)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Scan wounds"
|
||||
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
// Used by the PDA medical scanner too
|
||||
/proc/healthscan(mob/user, mob/living/M, mode = 1, advanced = FALSE)
|
||||
if(isliving(user) && (user.incapacitated() || user.eye_blind))
|
||||
|
||||
@@ -122,6 +122,21 @@
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
|
||||
/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/metal = list(
|
||||
SCREENTIP_CONTEXT_LMB = "Craft bola",
|
||||
),
|
||||
)
|
||||
|
||||
AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You start unwinding the cable restraints back into coil</span>")
|
||||
if(!do_after(user, 25, TRUE, user))
|
||||
|
||||
@@ -30,6 +30,24 @@
|
||||
var/status_duration = 3 SECONDS //how long our status effects last for otherwise
|
||||
COOLDOWN_DECLARE(shove_cooldown)
|
||||
|
||||
/// The context to show when the baton is active and targetting a living thing
|
||||
var/context_living_target_active = "Stun"
|
||||
|
||||
/// The context to show when the baton is active and targetting a living thing in combat mode
|
||||
var/context_living_target_active_combat_mode = "Stun"
|
||||
|
||||
/// The context to show when the baton is inactive and targetting a living thing
|
||||
var/context_living_target_inactive = "Prod"
|
||||
|
||||
/// The context to show when the baton is inactive and targetting a living thing in combat mode
|
||||
var/context_living_target_inactive_combat_mode = "Attack"
|
||||
|
||||
/// The RMB context to show when the baton is active and targetting a living thing
|
||||
var/context_living_rmb_active = "Attack"
|
||||
|
||||
/// The RMB context to show when the baton is inactive and targetting a living thing
|
||||
var/context_living_rmb_inactive = "Attack"
|
||||
|
||||
/obj/item/melee/baton/examine(mob/user)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Right click attack while in combat mode to knockdown, but only once per [cooldown_duration / 10] seconds.</span>"
|
||||
@@ -54,6 +72,8 @@
|
||||
cell = new preload_cell_type(src)
|
||||
update_icon()
|
||||
|
||||
register_item_context()
|
||||
|
||||
/obj/item/melee/baton/DoRevenantThrowEffects(atom/target)
|
||||
switch_status()
|
||||
|
||||
@@ -155,6 +175,30 @@
|
||||
if(!interrupt)
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/baton/add_item_context(datum/source, list/context, atom/target, mob/living/user)
|
||||
if (isturf(target))
|
||||
return NONE
|
||||
|
||||
if (isobj(target))
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Attack"
|
||||
else
|
||||
if (turned_on)
|
||||
context[SCREENTIP_CONTEXT_RMB] = context_living_rmb_active
|
||||
|
||||
if (user.a_intent == INTENT_HARM)
|
||||
context[SCREENTIP_CONTEXT_LMB] = context_living_target_active_combat_mode
|
||||
else
|
||||
context[SCREENTIP_CONTEXT_LMB] = context_living_target_active
|
||||
else
|
||||
context[SCREENTIP_CONTEXT_RMB] = context_living_rmb_inactive
|
||||
|
||||
if (user.a_intent == INTENT_HARM)
|
||||
context[SCREENTIP_CONTEXT_LMB] = context_living_target_inactive_combat_mode
|
||||
else
|
||||
context[SCREENTIP_CONTEXT_LMB] = context_living_target_inactive
|
||||
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
/obj/item/melee/baton/alt_pre_attack(atom/A, mob/living/user, params)
|
||||
if(!user.CheckActionCooldown(CLICK_CD_MELEE))
|
||||
return
|
||||
|
||||
@@ -583,6 +583,21 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
|
||||
wound_bonus = -10
|
||||
|
||||
/obj/item/wirerod/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
var/static/list/hovering_item_typechecks = list(
|
||||
/obj/item/shard = list(
|
||||
SCREENTIP_CONTEXT_LMB = "Craft spear",
|
||||
),
|
||||
|
||||
/obj/item/assembly/igniter = list(
|
||||
SCREENTIP_CONTEXT_LMB = "Craft stunprod",
|
||||
),
|
||||
)
|
||||
|
||||
AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks)
|
||||
|
||||
/obj/item/wirerod/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/shard))
|
||||
var/obj/item/spear/S = new /obj/item/spear
|
||||
|
||||
@@ -490,6 +490,19 @@
|
||||
// the sprites in the editor to see why.
|
||||
icon = smooth_icon
|
||||
|
||||
if (!(flags_1 & NODECONSTRUCT_1))
|
||||
var/static/list/tool_behaviors = list(
|
||||
TOOL_SCREWDRIVER = list(
|
||||
SCREENTIP_CONTEXT_RMB = "Disassemble",
|
||||
),
|
||||
|
||||
TOOL_WRENCH = list(
|
||||
SCREENTIP_CONTEXT_RMB = "Deconstruct",
|
||||
),
|
||||
)
|
||||
|
||||
AddElement(/datum/element/contextual_screentip_tools, tool_behaviors)
|
||||
|
||||
/obj/structure/table/wood/fancy/black
|
||||
icon_state = "fancy_table_black"
|
||||
buildstack = /obj/item/stack/tile/carpet/black
|
||||
@@ -704,7 +717,7 @@
|
||||
. = !density
|
||||
if(istype(caller))
|
||||
. = . || (caller.pass_flags & PASSTABLE)
|
||||
|
||||
|
||||
/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
|
||||
. = ..()
|
||||
if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
|
||||
|
||||
Reference in New Issue
Block a user