From cae94afdb7217b0ec0061be02fe26767cf3b10db Mon Sep 17 00:00:00 2001 From: SandPoot Date: Sun, 26 Jan 2025 18:06:36 -0300 Subject: [PATCH] push --- code/__DEFINES/color/colors.dm | 1 + code/__DEFINES/hud.dm | 14 +-- code/_onclick/hud/action_button.dm | 5 +- code/_onclick/hud/ai.dm | 1 + code/_onclick/hud/alert.dm | 75 +++++++++++-- code/_onclick/hud/blob_overmind.dm | 1 + code/_onclick/hud/ghost.dm | 1 + code/_onclick/hud/guardian.dm | 1 + code/_onclick/hud/hud.dm | 5 +- code/_onclick/hud/human.dm | 7 +- code/_onclick/hud/monkey.dm | 4 - code/_onclick/hud/new_player.dm | 8 +- code/_onclick/hud/robot.dm | 1 + code/_onclick/hud/screen_objects.dm | 101 +++++------------- code/_onclick/hud/screen_objects/sprint.dm | 3 +- code/_onclick/hud/screen_objects/stamina.dm | 11 +- code/_onclick/hud/screen_objects/vore.dm | 1 + code/datums/action.dm | 8 ++ code/datums/components/combat_mode.dm | 1 + code/datums/status_effects/debuffs.dm | 1 + code/datums/status_effects/wound_effects.dm | 1 + code/game/atoms_movable.dm | 5 + code/game/gamemodes/clock_cult/clock_cult.dm | 1 - code/game/gamemodes/sandbox/h_sandbox.dm | 1 - code/game/machinery/buttons.dm | 1 + .../embedded_controller/access_controller.dm | 1 + code/game/machinery/firealarm.dm | 1 + code/game/machinery/lightswitch.dm | 1 + code/game/objects/items/tanks/tanks.dm | 2 - .../objects/structures/ghost_role_spawners.dm | 1 - code/modules/buildmode/buttons.dm | 1 + code/modules/mob/living/carbon/carbon.dm | 4 - .../living/carbon/human/human_stripping.dm | 3 - .../mob/living/carbon/human/inventory.dm | 1 - .../carbon/human/species_types/plasmamen.dm | 1 - code/modules/mob/living/carbon/life.dm | 3 - icons/mob/actions.dmi | Bin 9992 -> 9419 bytes 37 files changed, 152 insertions(+), 126 deletions(-) diff --git a/code/__DEFINES/color/colors.dm b/code/__DEFINES/color/colors.dm index d88320d094..ca2d0fe496 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 14a3b7dc49..f5676b626c 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 060e44e007..815e46f9eb 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) @@ -247,6 +255,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() @@ -271,6 +280,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) @@ -299,6 +309,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 @@ -310,8 +321,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 @@ -341,6 +373,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 @@ -354,6 +396,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!" @@ -404,6 +451,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" @@ -666,7 +716,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() @@ -693,7 +744,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) @@ -705,7 +757,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 @@ -729,6 +782,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." @@ -765,6 +821,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 @@ -814,9 +871,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, "
[jointext(examine(usr), "\n")]
") return FALSE if(master && click_master) return usr.client.Click(master, location, control, params) @@ -829,3 +886,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 c10e781833..52397c3036 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -87,7 +87,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 @@ -148,7 +147,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healths = null healthdoll = null wanted_lvl = null - internals = null lingchemdisplay = null devilsouldisplay = null lingstingdisplay = null @@ -365,6 +363,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 27989f3bb1..c8b7b3327d 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() @@ -26,6 +27,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 @@ -68,6 +70,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)) @@ -412,10 +415,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/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..967bdb4f1f 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, "
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 51661d5472..6fd2b2e4a7 100644 --- a/code/datums/components/combat_mode.dm +++ b/code/datums/components/combat_mode.dm @@ -182,6 +182,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 bf570ca885..5bd653556c 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 91999acac5..b672d79024 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -647,6 +647,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 8c9caaf8c8..e2c276b207 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 7959982ed0..9a096bf923 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 0b8a7c5a30..1752009506 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -878,7 +878,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 86dc221654..47c9c61e34 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -793,10 +793,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 08db3fe552..db248959b9 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -285,12 +285,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 ace5cbaa6f..29866459d8 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -253,7 +253,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 0235be3268..a6670b186a 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -69,7 +69,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 e6e0abe111b393d33dde8362ecaed237fc8589dd..53648fbba6d5c7b466a87a21fd16a509bd7c2a76 100644 GIT binary patch literal 9419 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