diff --git a/code/__DEFINES/color/colors.dm b/code/__DEFINES/color/colors.dm
index cc11a1aeaa..91c8d93933 100644
--- a/code/__DEFINES/color/colors.dm
+++ b/code/__DEFINES/color/colors.dm
@@ -30,6 +30,7 @@
#define COLOR_YELLOW "#FFFF00"
#define COLOR_VIVID_YELLOW "#FBFF23"
#define COLOR_VERY_SOFT_YELLOW "#FAE48E"
+#define COLOR_GOLD "#FFD700"
#define COLOR_OLIVE "#808000"
#define COLOR_VIBRANT_LIME "#00FF00"
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 1f6da7526a..215ff77623 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -94,11 +94,12 @@
#define ui_palette_scroll_offset(north_offset) ("WEST+1:8,NORTH-[6+north_offset]:28")
//Middle right (status indicators)
-#define ui_healthdoll "EAST-1:28,CENTER-2:13"
-#define ui_health "EAST-1:28,CENTER-1:15"
-#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter
-#define ui_mood "EAST-1:28,CENTER-3:10"
-// #define ui_spacesuit "EAST-1:28,CENTER-4:10"
+#define ui_healthdoll "EAST-1:28,CENTER-2:17"
+#define ui_health "EAST-1:28,CENTER-1:19"
+#define ui_internal "EAST-1:28,CENTER+1:21" // RIP, although nobody will remember this, unsmart coders have used this for other stuff. DO NOT REMOVE UNLESS RENAMING OR REPLACING.
+#define ui_mood "EAST-1:28,CENTER:21"
+#define ui_stamina "EAST-1:28,CENTER-3:14"
+// #define ui_spacesuit "EAST-1:28,CENTER-4:14"
//Pop-up inventory
#define ui_shoes "WEST+1:8,SOUTH:5"
@@ -208,7 +209,6 @@
#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI
//UI position overrides for 1:1 screen layout. (default is 7:5)
-#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button
#define ui_overridden_resist "EAST-3:24,SOUTH+1:7"
#define ui_clickdelay "CENTER,SOUTH+1:-31"
#define ui_resistdelay "EAST-3:24,SOUTH+1:4"
@@ -231,6 +231,8 @@
#define SCRN_OBJ_IN_LIST "list"
/// In the collapseable palette
#define SCRN_OBJ_IN_PALETTE "palette"
+///Inserted first in the list
+#define SCRN_OBJ_INSERT_FIRST "first"
/// The filter name for the hover outline
#define HOVER_OUTLINE_FILTER "hover_outline"
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index f5826579c8..05c16c12ed 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -5,10 +5,11 @@
var/datum/hud/our_hud
var/actiontooltipstyle = ""
screen_loc = null
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/button_icon_state
var/appearance_cache
-
+ var/mutable_appearance/button_overlay
/// Where we are currently placed on the hud. SCRN_OBJ_DEFAULT asks the linked action what it thinks
var/location = SCRN_OBJ_DEFAULT
/// A unique bitflag, combined with the name of our linked action this lets us persistently remember any user changes to our position
@@ -199,6 +200,7 @@
icon = 'icons/hud/64x16_actions.dmi'
icon_state = "screen_gen_palette"
screen_loc = ui_action_palette
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/datum/hud/our_hud
var/expanded = FALSE
/// Id of any currently running timers that set our color matrix
@@ -324,6 +326,7 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6,
/atom/movable/screen/palette_scroll
icon = 'icons/mob/screen_gen.dmi'
screen_loc = ui_palette_scroll
+ mouse_over_pointer = MOUSE_HAND_POINTER
/// How should we move the palette's actions?
/// Positive scrolls down the list, negative scrolls back
var/scroll_direction = 0
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 419de492ef..d4344b9464 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -1,5 +1,6 @@
/atom/movable/screen/ai
icon = 'icons/mob/screen_ai.dmi'
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/ai/Click()
if(isobserver(usr) || usr.incapacitated())
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 6a1ed142a2..fdfe4b2b4e 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -91,6 +91,8 @@
name = "Alert"
desc = "Something seems to have gone wrong with this alert, so report this bug please"
mouse_opacity = MOUSE_OPACITY_ICON
+ /// do we glow to represent we do stuff when clicked
+ var/clickable_glow = FALSE
var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
var/severity = 0
var/alerttooltipstyle = ""
@@ -100,6 +102,12 @@
/// Boolean. If TRUE, the Click() proc will attempt to Click() on the master first if there is a master.
var/click_master = TRUE
+/atom/movable/screen/alert/Initialize(mapload, datum/hud/hud_owner)
+ . = ..()
+ if(clickable_glow)
+ add_filter("clickglow", 2, outline_filter(color = COLOR_GOLD, size = 1))
+ mouse_over_pointer = MOUSE_HAND_POINTER
+
/atom/movable/screen/alert/MouseEntered(location,control,params)
if(!QDELETED(src))
openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle)
@@ -260,6 +268,7 @@ or something covering your eyes."
name = "Mind Control"
desc = "Your mind has been hijacked! Click to view the mind control command."
icon_state = "mind_control"
+ clickable_glow = TRUE
var/command
/atom/movable/screen/alert/mind_control/Click()
@@ -284,6 +293,7 @@ or something covering your eyes."
desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \
If you're feeling frisky, examine yourself and click the underlined item to pull the object out."
icon_state = "embeddedobject"
+ clickable_glow = TRUE
/atom/movable/screen/alert/embeddedobject/Click()
if(isliving(usr) && usr == owner)
@@ -312,6 +322,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
name = "On Fire"
desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area."
icon_state = "fire"
+ clickable_glow = TRUE
/atom/movable/screen/alert/fire/Click()
var/mob/living/L = usr
@@ -323,8 +334,29 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/atom/movable/screen/alert/give // information set when the give alert is made
icon_state = "default"
+ clickable_glow = TRUE
var/mob/living/carbon/offerer
var/obj/item/receiving
+ /// Additional text displayed in the description of the alert.
+ var/additional_desc_text = "Click this alert to take it, or shift click it to examine it."
+ /// Text to override what appears in screentips for the alert
+ var/screentip_override_text
+ /// Whether the offered item can be examined by shift-clicking the alert
+ var/examinable = TRUE
+
+/atom/movable/screen/alert/give/Initialize(mapload, datum/hud/hud_owner)
+ . = ..()
+ register_context()
+
+/atom/movable/screen/alert/give/Destroy()
+ offerer = null
+ receiving = null
+ return ..()
+
+/atom/movable/screen/alert/give/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ LAZYSET(context[SCREENTIP_CONTEXT_LMB], INTENT_ANY, screentip_override_text || "Take [receiving.name]")
+ LAZYSET(context[SCREENTIP_CONTEXT_SHIFT_LMB], INTENT_ANY, "Examine")
+ return CONTEXTUAL_SCREENTIP_SET
/**
* Handles assigning most of the variables for the alert that pops up when an item is offered
@@ -354,6 +386,16 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
CRASH("User for [src] is of type \[[usr.type]\]. This should never happen.")
handle_transfer()
+/atom/movable/screen/alert/give/examine(mob/user)
+ if(!examinable)
+ return ..()
+
+ return list(
+ span_boldnotice(name),
+ span_info("[offerer] is offering you the following item (click the alert to take it!):"),
+ "
[jointext(receiving.examine(user), "\n")]",
+ )
+
/// An overrideable proc used simply to hand over the item when claimed, this is a proc so that high-fives can override them since nothing is actually transferred
/atom/movable/screen/alert/give/proc/handle_transfer()
var/mob/living/carbon/taker = owner
@@ -367,6 +409,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
to_chat(owner, span_warning("You moved out of range of [offerer]!"))
owner.clear_alert("[offerer]")
+/atom/movable/screen/alert/give/highfive
+ additional_desc_text = "Click this alert to slap it."
+ screentip_override_text = "High Five"
+ examinable = FALSE
+
/atom/movable/screen/alert/give/highfive/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving)
. = ..()
name = "[offerer] is offering a high-five!"
@@ -417,6 +464,9 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
/// Families handshakes
/atom/movable/screen/alert/give/secret_handshake
icon_state = "default"
+ additional_desc_text = "Click this alert to accept."
+ screentip_override_text = "Handshake"
+ examinable = FALSE
/atom/movable/screen/alert/give/secret_handshake/setup(mob/living/carbon/taker, mob/living/carbon/offerer, obj/item/receiving)
name = "[offerer] is offering a Handshake"
@@ -679,7 +729,8 @@ so as to remain in compliance with the most up-to-date laws."
complete, you will have exclusive control of it, and you will gain \
additional processing time to unlock more malfunction abilities."
icon_state = "hackingapc"
- timeout = 600
+ timeout = 60 SECONDS
+ clickable_glow = TRUE
var/atom/target = null
/atom/movable/screen/alert/hackingapc/Click()
@@ -706,7 +757,8 @@ so as to remain in compliance with the most up-to-date laws."
name = "Revival"
desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!"
icon_state = "template"
- timeout = 300
+ timeout = 30 SECONDS
+ clickable_glow = TRUE
/atom/movable/screen/alert/notify_cloning/Click()
if(!usr || !usr.client || usr != owner)
@@ -718,7 +770,8 @@ so as to remain in compliance with the most up-to-date laws."
name = "Body created"
desc = "A body was created. You can enter it."
icon_state = "template"
- timeout = 300
+ timeout = 30 SECONDS
+ clickable_glow = TRUE
var/atom/target = null
var/action = NOTIFY_JUMP
@@ -742,6 +795,9 @@ so as to remain in compliance with the most up-to-date laws."
//OBJECT-BASED
+/atom/movable/screen/alert/restrained
+ clickable_glow = TRUE
+
/atom/movable/screen/alert/restrained/buckled
name = "Buckled"
desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed."
@@ -778,6 +834,7 @@ so as to remain in compliance with the most up-to-date laws."
name = "Knotted Shoes"
desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot."
icon_state = "shoealert"
+ clickable_glow = TRUE
/atom/movable/screen/alert/shoes/Click()
var/mob/living/carbon/C = usr
@@ -827,9 +884,9 @@ so as to remain in compliance with the most up-to-date laws."
return FALSE
if(usr != owner)
return FALSE
- var/paramslist = params2list(params)
- if(paramslist["shift"]) // screen objects don't do the normal Click() stuff so we'll cheat
- to_chat(usr, "[name] - [desc]")
+ var/modifiers = params2list(params)
+ if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat
+ to_chat(usr, examine_block("[jointext(examine(usr), "\n")]"))
return FALSE
if(master && click_master)
return usr.client.Click(master, location, control, params)
@@ -842,3 +899,9 @@ so as to remain in compliance with the most up-to-date laws."
master = null
owner = null
screen_loc = ""
+
+/atom/movable/screen/alert/examine(mob/user)
+ return list(
+ span_boldnotice(name),
+ span_info(desc),
+ )
diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index f4d6ffc919..8a981d5796 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -1,6 +1,7 @@
/atom/movable/screen/blob
icon = 'icons/mob/blob.dmi'
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/blob/MouseEntered(location,control,params)
openToolTip(usr,src,params,title = name,content = desc, theme = "blob")
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index bb637ed445..f4f1f2f7b0 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -1,5 +1,6 @@
/atom/movable/screen/ghost
icon = 'icons/mob/screen_ghost.dmi'
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/ghost/MouseEntered()
flick(icon_state + "_anim", src)
diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm
index 2af02d8437..09ec5d925c 100644
--- a/code/_onclick/hud/guardian.dm
+++ b/code/_onclick/hud/guardian.dm
@@ -93,6 +93,7 @@
/atom/movable/screen/guardian
icon = 'icons/mob/guardian.dmi'
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/guardian/Manifest
icon_state = "manifest"
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index dbc6ffe4c5..07b2e90147 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -88,7 +88,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
var/atom/movable/screen/healths
var/atom/movable/screen/healthdoll
- var/atom/movable/screen/internals
var/atom/movable/screen/wanted/wanted_lvl
// subtypes can override this to force a specific UI style
@@ -152,7 +151,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
healths = null
healthdoll = null
wanted_lvl = null
- internals = null
hunger = null
thirst = null
@@ -386,6 +384,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
listed_actions.insert_action(button)
if(SCRN_OBJ_IN_PALETTE)
palette_actions.insert_action(button)
+ if(SCRN_OBJ_INSERT_FIRST)
+ listed_actions.insert_action(button, index = 1)
+ position = SCRN_OBJ_IN_LIST
else // If we don't have it as a define, this is a screen_loc, and we should be floating
floating_actions += button
button.screen_loc = position
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 5ebde532dc..a71bddcdb9 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -4,6 +4,7 @@
/atom/movable/screen/human/toggle
name = "toggle"
icon_state = "toggle"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/human/toggle/Click()
@@ -60,6 +61,7 @@
/atom/movable/screen/human/equip
name = "equip"
icon_state = "act_equip"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/human/equip/Click()
if(ismecha(usr.loc)) // stops inventory actions in a mech
@@ -102,6 +104,7 @@
/atom/movable/screen/ling/sting
name = "current sting"
screen_loc = ui_lingstingdisplay
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/ling/sting/Click()
if(isobserver(usr))
@@ -507,10 +510,6 @@
thirst.hud = src
infodisplay += thirst
- internals = new /atom/movable/screen/internals()
- internals.hud = src
- infodisplay += internals
-
healths = new /atom/movable/screen/healths()
healths.hud = src
infodisplay += healths
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index b63f8241cb..9ee795a745 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -85,10 +85,6 @@
throw_icon.hud = src
hotkeybuttons += throw_icon
- internals = new /atom/movable/screen/internals()
- internals.hud = src
- infodisplay += internals
-
healths = new /atom/movable/screen/healths()
healths.hud = src
infodisplay += healths
diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm
index 539b842375..c7f40e4dcc 100644
--- a/code/_onclick/hud/new_player.dm
+++ b/code/_onclick/hud/new_player.dm
@@ -62,8 +62,9 @@
screen_loc = "TOP,CENTER:-61"
/atom/movable/screen/lobby/button
+ mouse_over_pointer = MOUSE_HAND_POINTER
///Is the button currently enabled?
- var/enabled = TRUE
+ VAR_PROTECTED/enabled = TRUE
///Is the button currently being hovered over with the mouse?
var/highlighted = FALSE
/// The ref of the mob that owns this button. Only the owner can click on it.
@@ -113,6 +114,7 @@
return FALSE
enabled = status
update_appearance(UPDATE_ICON)
+ mouse_over_pointer = enabled ? MOUSE_HAND_POINTER : MOUSE_INACTIVE_POINTER
return TRUE
///Prefs menu
@@ -184,10 +186,10 @@
icon = 'icons/hud/lobby/join.dmi'
icon_state = "" //Default to not visible
base_icon_state = "join_game"
- enabled = FALSE
/atom/movable/screen/lobby/button/join/Initialize(mapload)
. = ..()
+ set_button_status(FALSE)
switch(SSticker.current_state)
if(GAME_STATE_PREGAME, GAME_STATE_STARTUP)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_SETTING_UP, PROC_REF(show_join_button))
@@ -248,13 +250,13 @@
icon = 'icons/hud/lobby/observe.dmi'
icon_state = "observe_disabled"
base_icon_state = "observe"
- enabled = FALSE
/atom/movable/screen/lobby/button/observe/Initialize(mapload)
. = ..()
if(SSticker.current_state > GAME_STATE_STARTUP)
set_button_status(TRUE)
else
+ set_button_status(FALSE)
RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, PROC_REF(enable_observing))
/atom/movable/screen/lobby/button/observe/Click(location, control, params)
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 35fd31cbdb..58b52dea49 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -1,5 +1,6 @@
/atom/movable/screen/robot
icon = 'icons/mob/screen_cyborg.dmi'
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/robot/module
name = "cyborg module"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index c0d500511f..8e3dd1ccce 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -57,6 +57,7 @@
/atom/movable/screen/swap_hand
plane = HUD_PLANE
name = "swap hand"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/swap_hand/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
@@ -85,12 +86,14 @@
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "craft"
screen_loc = ui_crafting
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/area_creator
name = "create new area"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "area_edit"
screen_loc = ui_building
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/area_creator/Click()
if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr)))
@@ -106,11 +109,11 @@
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "talk_wheel"
screen_loc = ui_language_menu
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/language_menu/Click()
- var/mob/M = usr
- var/datum/language_holder/H = M.get_language_holder()
- H.open_language_menu(usr)
+
+ usr.get_language_holder().open_language_menu(usr)
/atom/movable/screen/inventory
/// The identifier for the slot. It has nothing to do with ID cards.
@@ -172,7 +175,7 @@
var/image/item_overlay = image(holding)
item_overlay.alpha = 92
- if(!user.can_equip(holding, slot_id, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
+ if(!holding.mob_can_equip(user, slot_id, disable_warning = TRUE, bypass_equip_delay_self = TRUE))
item_overlay.color = "#FF0000"
else
item_overlay.color = "#00ff00"
@@ -247,6 +250,7 @@
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "act_drop"
plane = HUD_PLANE
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/drop/Click()
if(usr.stat == CONSCIOUS)
@@ -256,6 +260,7 @@
name = "intent"
icon_state = "help"
screen_loc = ui_acti
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/act_intent/Click(location, control, params)
usr.a_intent_change(INTENT_HOTKEY_RIGHT)
@@ -287,76 +292,11 @@
icon = 'icons/mob/screen_cyborg.dmi'
screen_loc = ui_borg_intents
-/atom/movable/screen/internals
- name = "toggle internals"
- icon_state = "internal0"
- screen_loc = ui_internal
-
-/atom/movable/screen/internals/Click()
- if(!iscarbon(usr))
- return
- var/mob/living/carbon/C = usr
- if(C.incapacitated())
- return
-
- if(C.internal)
- C.internal = null
- to_chat(C, span_notice("You are no longer running on internals."))
- icon_state = "internal0"
- else
- if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- if(HAS_TRAIT(C, TRAIT_NO_INTERNALS))
- to_chat(C, span_warning("Due to cumbersome equipment or anatomy, you are currently unable to use internals!"))
- return
- var/obj/item/clothing/check
- var/internals = FALSE
-
- for(check in GET_INTERNAL_SLOTS(C))
- if(istype(check, /obj/item/clothing/mask))
- var/obj/item/clothing/mask/M = check
- if(M.mask_adjusted)
- M.adjustmask(C)
- if((check.clothing_flags & ALLOWINTERNALS))
- internals = TRUE
- if(!internals)
- to_chat(C, span_warning("You are not wearing an internals mask!"))
- return
-
- var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank)
- if(I)
- to_chat(C, span_notice("You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))]."))
- C.internal = I
- else if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(istype(H.s_store, /obj/item/tank))
- to_chat(H, span_notice("You are now running on internals from [H.s_store] on your [H.wear_suit.name]."))
- H.internal = H.s_store
- else if(istype(H.belt, /obj/item/tank))
- to_chat(H, span_notice("You are now running on internals from [H.belt] on your belt."))
- H.internal = H.belt
- else if(istype(H.l_store, /obj/item/tank))
- to_chat(H, span_notice("You are now running on internals from [H.l_store] in your left pocket."))
- H.internal = H.l_store
- else if(istype(H.r_store, /obj/item/tank))
- to_chat(H, span_notice("You are now running on internals from [H.r_store] in your right pocket."))
- H.internal = H.r_store
-
- //Separate so CO2 jetpacks are a little less cumbersome.
- if(!C.internal && istype(C.back, /obj/item/tank))
- to_chat(C, span_notice("You are now running on internals from [C.back] on your back."))
- C.internal = C.back
-
- if(C.internal)
- icon_state = "internal1"
- else
- to_chat(C, span_warning("You don't have an oxygen tank!"))
- return
- C.update_action_buttons_icon()
-
/atom/movable/screen/mov_intent
name = "run/walk toggle"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "running"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/mov_intent/Initialize(mapload)
. = ..()
@@ -366,7 +306,10 @@
toggle(usr)
/atom/movable/screen/mov_intent/update_icon_state()
- switch(hud?.mymob?.m_intent)
+ if(!hud || !hud.mymob || !isliving(hud.mymob))
+ return
+ var/mob/living/living_hud_owner = hud.mymob
+ switch(living_hud_owner.m_intent)
if(MOVE_INTENT_WALK)
icon_state = CONFIG_GET(flag/sprint_enabled)? "walking" : "walking_nosprint"
if(MOVE_INTENT_RUN)
@@ -382,6 +325,8 @@
name = "stop pulling"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "pull"
+ base_icon_state = "pull"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/pull/Click()
if(isobserver(usr))
@@ -389,17 +334,14 @@
usr.stop_pulling()
/atom/movable/screen/pull/update_icon_state()
- if(hud?.mymob?.pulling)
- icon_state = "pull"
- else
- icon_state = "pull0"
+ icon_state = "[base_icon_state][hud?.mymob?.pulling ? null : 0]"
return ..()
/atom/movable/screen/resist
name = "resist"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "act_resist"
- plane = HUD_PLANE
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/resist/Click()
if(isliving(usr))
@@ -411,7 +353,7 @@
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "act_rest"
base_icon_state = "act_rest"
- plane = HUD_PLANE
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/rest/Click()
if(isliving(usr))
@@ -429,6 +371,7 @@
name = "throw/catch"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "act_throw_off"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/throw_catch/Click()
if(iscarbon(usr))
@@ -439,6 +382,7 @@
name = "damage zone"
icon_state = "zone_sel"
screen_loc = ui_zonesel
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/overlay_icon = 'icons/mob/screen_gen.dmi'
var/static/list/hover_overlays_cache = list()
var/hovering
@@ -641,6 +585,7 @@
/atom/movable/screen/healthdoll
name = "health doll"
screen_loc = ui_healthdoll
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/healthdoll/Click()
if (iscarbon(usr))
@@ -656,6 +601,7 @@
name = "mood"
icon_state = "mood5"
screen_loc = ui_mood
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/mood/attack_tk()
return
@@ -708,6 +654,7 @@
/atom/movable/screen/component_button
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/atom/movable/screen/parent
/atom/movable/screen/component_button/Initialize(mapload, atom/movable/screen/parent)
diff --git a/code/_onclick/hud/screen_objects/sprint.dm b/code/_onclick/hud/screen_objects/sprint.dm
index b32973f2dd..1a655a4db6 100644
--- a/code/_onclick/hud/screen_objects/sprint.dm
+++ b/code/_onclick/hud/screen_objects/sprint.dm
@@ -5,7 +5,7 @@
name = "toggle sprint"
icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
icon_state = "act_sprint"
- layer = ABOVE_HUD_LAYER - 0.1
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/mutable_appearance/flashy
/atom/movable/screen/sprintbutton/Click()
@@ -44,6 +44,7 @@
name = "sprint buffer"
icon = 'icons/effects/progessbar.dmi'
icon_state = "prog_bar_100"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/sprint_buffer/Click()
if(isliving(usr))
diff --git a/code/_onclick/hud/screen_objects/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm
index b4c4807ec8..b711e22084 100644
--- a/code/_onclick/hud/screen_objects/stamina.dm
+++ b/code/_onclick/hud/screen_objects/stamina.dm
@@ -1,19 +1,20 @@
-/datum/hud/var/atom/movable/screen/staminas/staminas
-/datum/hud/var/atom/movable/screen/staminabuffer/staminabuffer
+/datum/hud
+ var/atom/movable/screen/staminas/staminas
+ var/atom/movable/screen/staminabuffer/staminabuffer
/atom/movable/screen/staminas
icon = 'modular_citadel/icons/ui/screen_gen.dmi'
name = "stamina"
icon_state = "stamina0"
screen_loc = ui_stamina
- mouse_opacity = 1
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/staminas/Click(location,control,params)
if(isliving(usr))
var/mob/living/L = usr
CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max)
- to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
\
-
Your stamina buffer is [round((L.stamina_buffer / buffer_max) * 100, 0.1)]% full.")
+ to_chat(L, examine_block(span_notice("You have [L.getStaminaLoss()] stamina loss.
\
+
Your stamina buffer is [round((L.stamina_buffer / buffer_max) * 100, 0.1)]% full.")))
/atom/movable/screen/staminas/update_icon_state()
var/mob/living/carbon/user = hud?.mymob
diff --git a/code/_onclick/hud/screen_objects/vore.dm b/code/_onclick/hud/screen_objects/vore.dm
index 91aa8f318c..1eea40f565 100644
--- a/code/_onclick/hud/screen_objects/vore.dm
+++ b/code/_onclick/hud/screen_objects/vore.dm
@@ -2,6 +2,7 @@
name = "toggle vore mode"
icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
icon_state = "nom_off"
+ mouse_over_pointer = MOUSE_HAND_POINTER
/atom/movable/screen/voretoggle/Click()
if(usr != hud.mymob)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index f7093b1ff6..e1e84c8f51 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -39,6 +39,7 @@
var/icon_icon = 'icons/mob/actions.dmi'
/// This is the icon state for the icon that appears on the button
var/button_icon_state = "default"
+ var/button_overlay_state
/datum/action/New(Target)
link_to(Target)
@@ -177,6 +178,11 @@
ApplyIcon(button, force)
+ if(button_overlay_state)
+ button.cut_overlay(button.button_overlay)
+ button.button_overlay = mutable_appearance(icon = 'icons/mob/actions.dmi', icon_state = button_overlay_state)
+ button.add_overlay(button.button_overlay)
+
if(!IsAvailable(TRUE))
button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0)
else
@@ -362,6 +368,8 @@
/datum/action/item_action/set_internals
name = "Set Internals"
+ default_button_position = SCRN_OBJ_INSERT_FIRST
+ button_overlay_state = "ab_goldborder"
/datum/action/item_action/set_internals/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force)
if(!..()) // no button available
diff --git a/code/datums/components/combat_mode.dm b/code/datums/components/combat_mode.dm
index 17c67e9662..722a1e936d 100644
--- a/code/datums/components/combat_mode.dm
+++ b/code/datums/components/combat_mode.dm
@@ -187,6 +187,7 @@
name = "toggle combat mode"
icon = 'modular_citadel/icons/ui/screen_midnight.dmi'
icon_state = "combat_off"
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/mutable_appearance/flashy
var/combat_on = FALSE ///Wheter combat mode is enabled or not, so we don't have to store a reference.
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 3fa6b7d3c4..d236144061 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -971,6 +971,7 @@
desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand."
icon_state = "his_grace"
alerttooltipstyle = "hisgrace"
+ clickable_glow = TRUE
/atom/movable/screen/alert/status_effect/strandling/Click(location, control, params)
. = ..()
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
index f5903bbc28..f8a51d2ad2 100644
--- a/code/datums/status_effects/wound_effects.dm
+++ b/code/datums/status_effects/wound_effects.dm
@@ -102,6 +102,7 @@
/atom/movable/screen/alert/status_effect/wound
name = "Wounded"
desc = "Your body has sustained serious damage, click here to inspect yourself."
+ clickable_glow = TRUE
/atom/movable/screen/alert/status_effect/wound/Click()
var/mob/living/carbon/C = usr
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index c5d341e603..dcee4bd9b2 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -648,6 +648,11 @@
/// Gets or creates the relevant language holder. For mindless atoms, gets the local one. For atom with mind, gets the mind one.
/atom/movable/proc/get_language_holder(get_minds = TRUE)
+ RETURN_TYPE(/datum/language_holder)
+ if(QDELING(src))
+ CRASH("get_language_holder() called on a QDELing atom, \
+ this will try to re-instantiate the language holder that's about to be deleted, which is bad.")
+
if(!language_holder)
language_holder = new initial_language_holder(src)
return language_holder
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index d852ce9850..8b7f265b11 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -291,7 +291,6 @@ Credit where due:
W.update_label()
if(plasmaman && !visualsOnly) //If we need to breathe from the plasma tank, we should probably start doing that
H.internal = H.get_item_for_held_index(2)
- H.update_internals_hud_icon(1)
PDA.owner = H.real_name
PDA.ownjob = "Assistant"
PDA.update_label()
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index f91a8acc60..fdcb47b275 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -176,7 +176,6 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
P.back.plane = ABOVE_HUD_PLANE
P.update_inv_back()
P.internal = P.back
- P.update_internals_hud_icon(1)
if("hsbscrubber") // This is beyond its normal capability but this is sandbox and you spawned one, I assume you need it
var/obj/hsb = new/obj/machinery/portable_atmospherics/scrubber{volume_rate=50*ONE_ATMOSPHERE;on=1}(usr.loc)
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index eabc4e2c26..25c68b02c1 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -14,6 +14,7 @@
use_power = IDLE_POWER_USE
idle_power_usage = 2
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ mouse_over_pointer = MOUSE_HAND_POINTER
/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0)
if(istext(id) && mapload && id[1] == "!")
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index dcfdeca502..e197c64f62 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -10,6 +10,7 @@
idle_power_usage = 2
active_power_usage = 4
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/idSelf
/obj/machinery/doorButtons/attackby(obj/O, mob/user)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index decbb3a53f..118f0e866c 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -21,6 +21,7 @@
max_integrity = 250
integrity_failure = 0.4
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30)
+ mouse_over_pointer = MOUSE_HAND_POINTER
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 6
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 1b7781abb8..9cc4da11b1 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -5,6 +5,7 @@
icon_state = "light1"
base_icon_state = "light"
desc = "Make dark."
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/area/area = null
var/otherarea = null
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index ad18d1049e..0380c2d5ac 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -34,7 +34,6 @@
if(H.internal == src)
to_chat(H, "You close [src] valve.")
H.internal = null
- H.update_internals_hud_icon(0)
else
if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(HAS_TRAIT(H, TRAIT_NO_INTERNALS))
@@ -60,7 +59,6 @@
else
to_chat(H, "You open [src] valve.")
H.internal = src
- H.update_internals_hud_icon(1)
H.update_action_buttons_icon()
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 687d7aec97..ea9fc47d9e 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -888,7 +888,6 @@
/datum/outfit/ghostcafe/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
H.internal = H.get_item_for_held_index(1)
- H.update_internals_hud_icon(1)
/obj/item/storage/box/syndie_kit/chameleon/ghostcafe
name = "ghost cafe costuming kit"
diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm
index e29739f5ad..f3f1105a5c 100644
--- a/code/modules/buildmode/buttons.dm
+++ b/code/modules/buildmode/buttons.dm
@@ -1,5 +1,6 @@
/atom/movable/screen/buildmode
icon = 'icons/misc/buildmode.dmi'
+ mouse_over_pointer = MOUSE_HAND_POINTER
var/datum/buildmode/bd
// If we don't do this, we get occluded by item action buttons
layer = ABOVE_HUD_LAYER
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 42470138d0..38cdb66bfe 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -794,10 +794,6 @@
else
hud_used.healths.icon_state = "health7"
-/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
- if(hud_used && hud_used.internals)
- hud_used.internals.icon_state = "internal[internal_state]"
-
/mob/living/carbon/update_stat()
if(status_flags & GODMODE)
return
diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm
index 489c8f66d9..9c59c48be1 100644
--- a/code/modules/mob/living/carbon/human/human_stripping.dm
+++ b/code/modules/mob/living/carbon/human/human_stripping.dm
@@ -292,12 +292,9 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list(
if(carbon_source.internal)
carbon_source.internal = null
- // This isn't meant to be FALSE, it correlates to the icon's name.
- carbon_source.update_internals_hud_icon(0)
else if (!QDELETED(item))
if(internals || carbon_source.getorganslot(ORGAN_SLOT_BREATHING_TUBE))
carbon_source.internal = item
- carbon_source.update_internals_hud_icon(1)
carbon_source.visible_message(
span_danger("[user] [isnull(carbon_source.internal) ? "closes": "opens"] the valve on [source]'s [item.name]."),
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 667bf59f86..4e2bb29bb3 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -319,7 +319,6 @@
if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR)))
update_hair()
if(toggle_off && internal && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
- update_internals_hud_icon(0)
internal = null
if(C.flags_inv & HIDEEYES)
update_inv_glasses()
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 78bd993f21..5c93370196 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -70,7 +70,6 @@
H.equipOutfit(O, visualsOnly)
H.internal = H.get_item_for_held_index(2)
- H.update_internals_hud_icon(1)
return FALSE
/datum/species/plasmaman/random_name(gender,unique,lastname)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 9b2db8b106..081e19b6c6 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -329,12 +329,9 @@
if(internal)
if(internal.loc != src)
internal = null
- update_internals_hud_icon(0)
else if (!internals && !getorganslot(ORGAN_SLOT_BREATHING_TUBE))
internal = null
- update_internals_hud_icon(0)
else
- update_internals_hud_icon(1)
. = internal.remove_air_volume(volume_needed)
if(!.)
return FALSE //to differentiate between no internals and active, but empty internals
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index e6e0abe111..53648fbba6 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/modular_sand/code/_onclick/hud/screen_objects.dm b/modular_sand/code/_onclick/hud/screen_objects.dm
index 62040916c5..76645f025b 100644
--- a/modular_sand/code/_onclick/hud/screen_objects.dm
+++ b/modular_sand/code/_onclick/hud/screen_objects.dm
@@ -1,4 +1,4 @@
-#define ui_hunger_thirst "EAST-1:28,CENTER+1:51"
+#define ui_hunger_thirst "EAST-1:28,CENTER+1:24"
/atom/movable/screen/hunger
name = "hunger"