From a994ec21f286459026bbab0bdc08a889c4c9bdc1 Mon Sep 17 00:00:00 2001 From: iero-srv <> Date: Mon, 17 Apr 2023 17:22:35 -0400 Subject: [PATCH 1/2] Status Indicators A Port from Polaris/Virgo --- .../status_indicator_defines.dm | 11 + .../code/modules/mob/living/living.dm | 3 + .../status_indicators/status_indicator.dm | 222 ++++++++++++++++++ .../status_indicator_pref.dm | 26 ++ .../icons/mob/status_indicators.dmi | Bin 0 -> 6751 bytes tgstation.dme | 4 + .../skyrat/status_indicators.tsx | 8 + 7 files changed, 274 insertions(+) create mode 100644 code/__DEFINES/~~bubber_defines/status_indicator_defines.dm create mode 100644 modular_zubbers/code/modules/mob/living/living.dm create mode 100644 modular_zubbers/code/modules/status_indicators/status_indicator.dm create mode 100644 modular_zubbers/code/modules/status_indicators/status_indicator_pref.dm create mode 100644 modular_zubbers/icons/mob/status_indicators.dmi create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/status_indicators.tsx diff --git a/code/__DEFINES/~~bubber_defines/status_indicator_defines.dm b/code/__DEFINES/~~bubber_defines/status_indicator_defines.dm new file mode 100644 index 00000000000..57abd103b0d --- /dev/null +++ b/code/__DEFINES/~~bubber_defines/status_indicator_defines.dm @@ -0,0 +1,11 @@ +#define STUNNED "stunned" +#define WEAKEN "weakened" +#define PARALYSIS "paralysis" +#define SLEEPING "sleeping" +#define CONFUSED "confused" +#define PLANE_STATUS_INDICATOR -12 //Status Indicators that show over mobs' heads when certain things like stuns affect them. +#define STATUS_LAYER -2.1 +#define STATUS_INDICATOR_Y_OFFSET 2 // Offset from the edge of the icon sprite, so 32 pixels plus whatever number is here. +#define STATUS_INDICATOR_ICON_X_SIZE 0 // Don't need to care about the Y size due to the origin being on the bottom side. +#define STATUS_INDICATOR_ICON_MARGIN 0 // The space between two status indicators. We don't do this with the current icons. +#define DEFAULT_MOB_SCALE 1 diff --git a/modular_zubbers/code/modules/mob/living/living.dm b/modular_zubbers/code/modules/mob/living/living.dm new file mode 100644 index 00000000000..840c112204e --- /dev/null +++ b/modular_zubbers/code/modules/mob/living/living.dm @@ -0,0 +1,3 @@ +/mob/living/Initialize(mapload) + . = ..() + AddComponent(/datum/component/status_indicator) diff --git a/modular_zubbers/code/modules/status_indicators/status_indicator.dm b/modular_zubbers/code/modules/status_indicators/status_indicator.dm new file mode 100644 index 00000000000..e45f7abfd2d --- /dev/null +++ b/modular_zubbers/code/modules/status_indicators/status_indicator.dm @@ -0,0 +1,222 @@ + +GLOBAL_LIST_INIT(potential_indicators, list( + STUNNED = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = STUNNED), + WEAKEN = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = WEAKEN), + PARALYSIS = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = PARALYSIS), + SLEEPING = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = SLEEPING), + CONFUSED = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = CONFUSED), +)) + +/datum/component/status_indicator + var/list/status_indicators = null // Will become a list as needed. Contains our status indicator objects. Note, they are actually added to overlays, this just keeps track of what exists. + var/mob/living/attached_mob + +/// Returns true if the mob is weakened. Also known as floored. +/datum/component/status_indicator/proc/is_weakened() + if(!indicator_fakeouts() && \ + attached_mob.IsKnockdown() || \ + HAS_TRAIT(attached_mob, TRAIT_FLOORED) && \ + !HAS_TRAIT_FROM(attached_mob, TRAIT_FLOORED, BUCKLED_TRAIT) + ) + return TRUE + +/// Returns true if the mob is stunned. +/datum/component/status_indicator/proc/is_stunned() + if(!indicator_fakeouts() && \ + HAS_TRAIT_FROM(attached_mob, TRAIT_INCAPACITATED, TRAIT_STATUS_EFFECT(STAT_TRAIT)) || \ + HAS_TRAIT(attached_mob, TRAIT_CRITICAL_CONDITION) || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(STAT_TRAIT)) || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_INCAPACITATED, TRAIT_STATUS_EFFECT(STAT_TRAIT)) || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(STAT_TRAIT)) + ) + return TRUE + +/// Returns true if the mob is paralyzed - for can't fight back purposes. +/datum/component/status_indicator/proc/is_paralyzed() + if(!indicator_fakeouts() && \ + attached_mob.IsParalyzed() || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_FLOORED, CHOKEHOLD_TRAIT) || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(STAT_TRAIT)) || \ + HAS_TRAIT(attached_mob, TRAIT_CRITICAL_CONDITION) || \ + HAS_TRAIT_FROM(attached_mob, TRAIT_INCAPACITATED, STAMINA)) + return TRUE + +/// Returns true if the mob is unconcious for any reason. +/datum/component/status_indicator/proc/is_unconcious() + if(!indicator_fakeouts() && HAS_TRAIT(attached_mob, TRAIT_KNOCKEDOUT)) + return TRUE + +/// Returns true if the mob has confusion. +/datum/component/status_indicator/proc/is_confused() + if(!indicator_fakeouts() && attached_mob.has_status_effect(/datum/status_effect/confusion)) + return TRUE + +/datum/component/status_indicator/RegisterWithParent() + attached_mob = parent + // The Basics + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(cut_indicators_overlays)) + RegisterSignal(parent, COMSIG_CARBON_HEALTH_UPDATE, PROC_REF(status_indicator_evaluate)) + RegisterSignal(parent, COMSIG_LIVING_LIFE, PROC_REF(check_indicators)) + // When things actually happen + RegisterSignal(parent, COMSIG_LIVING_STATUS_STUN, PROC_REF(status_indicator_evaluate)) + RegisterSignal(parent, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(status_indicator_evaluate)) + RegisterSignal(parent, COMSIG_LIVING_STATUS_PARALYZE, PROC_REF(status_indicator_evaluate)) + RegisterSignal(parent, COMSIG_LIVING_STATUS_IMMOBILIZE, PROC_REF(status_indicator_evaluate)) + RegisterSignal(parent, COMSIG_LIVING_STATUS_UNCONSCIOUS, PROC_REF(status_indicator_evaluate)) + RegisterSignal(parent, COMSIG_MOB_LOGIN, PROC_REF(apply_pref_on_login)) + +/datum/component/status_indicator/proc/apply_pref_on_login() + var/atom/movable/screen/plane_master/game_world_upper_fov_hidden/status_indicator/local_status = locate() in attached_mob.client.screen + if(local_status) + . = attached_mob.client.prefs.read_preference(/datum/preference/toggle/enable_status_indicators) + local_status.alpha = (.) ? 255 : 0 + +/datum/component/status_indicator/UnregisterFromParent() + QDEL_NULL(status_indicators) + UnregisterSignal(attached_mob, COMSIG_LIVING_DEATH) + UnregisterSignal(attached_mob, COMSIG_CARBON_HEALTH_UPDATE) + UnregisterSignal(attached_mob, COMSIG_LIVING_LIFE) + UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_STUN) + UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_KNOCKDOWN) + UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_PARALYZE) + UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_IMMOBILIZE) + UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_UNCONSCIOUS) + attached_mob = null +/// This proc makes it so that mobs that have status indicators are checked to remove them, especially in fakeout situations. +/datum/component/status_indicator/proc/check_indicators() + if(status_indicators) + status_indicator_evaluate() + +/// Receives signals to update on carbon health updates. Checks if the mob is dead - if true, removes all the indicators. Then, we determine what status indicators the mob should carry or remove. +/datum/component/status_indicator/proc/status_indicator_evaluate() + SIGNAL_HANDLER + if(attached_mob.stat == DEAD) + return + else + weaken_indicator_update() + paralyzed_indicator_update() + stunned_indicator_update() + unconcious_indicator_update() + confused_indicator_update() + return +/// Cases in which no status indicators should appear above a mob, such as changeling revive and regen coma. +/datum/component/status_indicator/proc/indicator_fakeouts() + if(HAS_TRAIT(attached_mob, TRAIT_DEATHCOMA)) + return TRUE + return FALSE + +/datum/component/status_indicator/proc/weaken_indicator_update() + SIGNAL_HANDLER + is_weakened() ? add_status_indicator(WEAKEN) : remove_status_indicator(WEAKEN) +/datum/component/status_indicator/proc/paralyzed_indicator_update() + SIGNAL_HANDLER + is_paralyzed() ? add_status_indicator(PARALYSIS) : remove_status_indicator(PARALYSIS) +/datum/component/status_indicator/proc/stunned_indicator_update() + SIGNAL_HANDLER + is_stunned() ? add_status_indicator(STUNNED) : remove_status_indicator(STUNNED) +/datum/component/status_indicator/proc/unconcious_indicator_update() + SIGNAL_HANDLER + is_unconcious() ? add_status_indicator(SLEEPING) : remove_status_indicator(SLEEPING) +/datum/component/status_indicator/proc/confused_indicator_update() + SIGNAL_HANDLER + is_confused() ? add_status_indicator(CONFUSED) : remove_status_indicator(CONFUSED) + +/// Adds a status indicator to the mob. Takes an image as an argument. If it exists, it won't dupe it. +/datum/component/status_indicator/proc/add_status_indicator(image/prospective_indicator) + if(get_status_indicator(prospective_indicator)) // No duplicates, please. + return + + prospective_indicator = GLOB.potential_indicators[prospective_indicator] + prospective_indicator.loc = src + LAZYADD(status_indicators, prospective_indicator) + handle_status_indicators(prospective_indicator) + +/// Similar to add_status_indicator() but removes it instead, and nulls the list if it becomes empty as a result. +/datum/component/status_indicator/proc/remove_status_indicator(image/prospective_indicator) + prospective_indicator = get_status_indicator(prospective_indicator) + + attached_mob.cut_overlay(prospective_indicator) + LAZYREMOVE(status_indicators, prospective_indicator) + handle_status_indicators(prospective_indicator) + +/// Finds a status indicator on a mob. +/datum/component/status_indicator/proc/get_status_indicator(image/prospective_indicator) + + for(var/image/indicator in status_indicators) + if(indicator.icon_state == prospective_indicator) + return indicator + return LAZYACCESS(status_indicators, LAZYFIND(status_indicators, prospective_indicator)) + +/// Cuts all the indicators on a mob in a loop. +/datum/component/status_indicator/proc/cut_indicators_overlays() + SIGNAL_HANDLER + for(var/prospective_indicator in status_indicators) + attached_mob.cut_overlay(prospective_indicator) + +/// Refreshes the indicators over a mob's head. Should only be called when adding or removing a status indicator with the above procs, +/// or when the mob changes size visually for some reason. +/datum/component/status_indicator/proc/handle_status_indicators(image/prospective_indicator) + // First, get rid of all the overlays. + + cut_indicators_overlays() + + if(!LAZYLEN(status_indicators)) + return + + var/mob/living/carbon/my_carbon_mob = attached_mob + + var/icon_scale = get_icon_scale(my_carbon_mob) + + if(my_carbon_mob.stat == DEAD) + cut_indicators_overlays() + return + + // Now put them back on in the right spot. + var/our_sprite_x = 16 * icon_scale + var/our_sprite_y = 24 * icon_scale + + var/x_offset = our_sprite_x // Add your own offset here later if you want. + var/y_offset = our_sprite_y + STATUS_INDICATOR_Y_OFFSET + + // Calculates how 'long' the row of indicators and the margin between them should be. + // The goal is to have the center of that row be horizontally aligned with the sprite's center. + var/expected_status_indicator_length = (STATUS_INDICATOR_ICON_X_SIZE * status_indicators.len) + (STATUS_INDICATOR_ICON_MARGIN * max(status_indicators.len - 1, 0)) + var/current_x_position = (x_offset / 2) - (expected_status_indicator_length / 2) + + // In /mob/living's `update_transform()`, the sprite is horizontally shifted when scaled up, so that the center of the sprite doesn't move to the right. + // Because of that, this adjustment needs to happen with the future indicator row as well, or it will look bad. + current_x_position -= 16 * (icon_scale - DEFAULT_MOB_SCALE) + + // Now the indicator row can actually be built. + for(var/all_indicators in status_indicators) + var/image/indicator = all_indicators + + // This is a semi-HUD element, in a similar manner as medHUDs, in that they're 'above' everything else in the world, + // but don't pierce obfuscation layers such as blindness or darkness, unlike actual HUD elements like inventory slots. + indicator.plane = GAME_PLANE_UPPER_FOV_HIDDEN + indicator.layer = STATUS_LAYER + indicator.appearance_flags = PIXEL_SCALE|TILE_BOUND|NO_CLIENT_COLOR|RESET_COLOR|RESET_ALPHA|RESET_TRANSFORM|KEEP_APART + indicator.pixel_y = y_offset + indicator.pixel_x = current_x_position + my_carbon_mob.add_overlay(indicator) + // Adding the margin space every time saves a conditional check on the last iteration, + // and it won't cause any issues since no more icons will be added, and the var is not used for anything else. + current_x_position += STATUS_INDICATOR_ICON_X_SIZE + STATUS_INDICATOR_ICON_MARGIN + +/datum/component/status_indicator/proc/get_icon_scale(livingmob) + if(!iscarbon(livingmob)) // normal mobs are always 1 for scale - hopefully all borgs and simplemobs get this one + return DEFAULT_MOB_SCALE + var/mob/living/carbon/passed_mob = livingmob // we're possibly a player! We have size prefs! + var/mysize = (passed_mob.dna?.current_body_size ? passed_mob.dna.current_body_size : DEFAULT_MOB_SCALE) + return mysize + +/atom/movable/screen/plane_master/game_world_upper_fov_hidden/status_indicator + name = "Status Indicator Plane" + documentation = "Status Indicator Plane" + plane = GAME_PLANE_UPPER_FOV_HIDDEN + start_hidden = FALSE + +#undef STATUS_INDICATOR_Y_OFFSET +#undef STATUS_INDICATOR_ICON_X_SIZE +#undef STATUS_INDICATOR_ICON_MARGIN diff --git a/modular_zubbers/code/modules/status_indicators/status_indicator_pref.dm b/modular_zubbers/code/modules/status_indicators/status_indicator_pref.dm new file mode 100644 index 00000000000..87a8fd20f18 --- /dev/null +++ b/modular_zubbers/code/modules/status_indicators/status_indicator_pref.dm @@ -0,0 +1,26 @@ +/datum/preference/toggle/enable_status_indicators + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "enable_status_indicators" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/toggle/enable_status_indicators/create_default_value() + return TRUE + + +/datum/preference/toggle/enable_status_indicators/apply_to_client(client/client, value) + if(client.mob) + var/datum/component/status_indicator/mystatus = client.mob.GetComponent(/datum/component/status_indicator) + if(mystatus) + mystatus.apply_pref_on_login() + +/* if(client && client.prefs) + . = client?.prefs?.read_preference(/datum/preference/toggle/enable_status_indicators) + var/atom/movable/screen/plane_master/status/status_indicators = locate() in client.screen + if(isnull(status_indicators)) + new /atom/movable/screen/plane_master/status in client.screen + status_indicators = locate() in client.screen + if(length(status_indicators) < 1) + pop(status_indicators) + (.) ? (status_indicators.alpha = 255) : (status_indicators.alpha = 0) + + */ diff --git a/modular_zubbers/icons/mob/status_indicators.dmi b/modular_zubbers/icons/mob/status_indicators.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9c80c2bf10aa31c4aff9026441d18bcee8625436 GIT binary patch literal 6751 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 Date: Mon, 17 Apr 2023 17:57:27 -0400 Subject: [PATCH 2/2] dun dun duuunnnn --- .../modules/status_indicators/status_indicator.dm | 14 ++++++-------- tgstation.dme | 7 +++---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/modular_zubbers/code/modules/status_indicators/status_indicator.dm b/modular_zubbers/code/modules/status_indicators/status_indicator.dm index e45f7abfd2d..43e1319adb4 100644 --- a/modular_zubbers/code/modules/status_indicators/status_indicator.dm +++ b/modular_zubbers/code/modules/status_indicators/status_indicator.dm @@ -1,10 +1,10 @@ GLOBAL_LIST_INIT(potential_indicators, list( - STUNNED = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = STUNNED), - WEAKEN = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = WEAKEN), - PARALYSIS = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = PARALYSIS), - SLEEPING = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = SLEEPING), - CONFUSED = image(icon = 'modular_skyrat/master_files/icons/mob/status_indicators.dmi', icon_state = CONFUSED), + STUNNED = image(icon = 'modular_zubbers/icons/mob/status_indicators.dmi', icon_state = STUNNED), + WEAKEN = image(icon = 'modular_zubbers/icons/mob/status_indicators.dmi', icon_state = WEAKEN), + PARALYSIS = image(icon = 'modular_zubbers/icons/mob/status_indicators.dmi', icon_state = PARALYSIS), + SLEEPING = image(icon = 'modular_zubbers/icons/mob/status_indicators.dmi', icon_state = SLEEPING), + CONFUSED = image(icon = 'modular_zubbers/icons/mob/status_indicators.dmi', icon_state = CONFUSED), )) /datum/component/status_indicator @@ -56,8 +56,7 @@ GLOBAL_LIST_INIT(potential_indicators, list( attached_mob = parent // The Basics RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(cut_indicators_overlays)) - RegisterSignal(parent, COMSIG_CARBON_HEALTH_UPDATE, PROC_REF(status_indicator_evaluate)) - RegisterSignal(parent, COMSIG_LIVING_LIFE, PROC_REF(check_indicators)) + RegisterSignal(parent, COMSIG_LIVING_LIFE, PROC_REF(status_indicator_evaluate)) // When things actually happen RegisterSignal(parent, COMSIG_LIVING_STATUS_STUN, PROC_REF(status_indicator_evaluate)) RegisterSignal(parent, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(status_indicator_evaluate)) @@ -75,7 +74,6 @@ GLOBAL_LIST_INIT(potential_indicators, list( /datum/component/status_indicator/UnregisterFromParent() QDEL_NULL(status_indicators) UnregisterSignal(attached_mob, COMSIG_LIVING_DEATH) - UnregisterSignal(attached_mob, COMSIG_CARBON_HEALTH_UPDATE) UnregisterSignal(attached_mob, COMSIG_LIVING_LIFE) UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_STUN) UnregisterSignal(attached_mob, COMSIG_LIVING_STATUS_KNOCKDOWN) diff --git a/tgstation.dme b/tgstation.dme index 34464f02a83..e65bc73ba9d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -374,7 +374,6 @@ #include "code\__DEFINES\~skyrat_defines\sound.dm" #include "code\__DEFINES\~skyrat_defines\span.dm" #include "code\__DEFINES\~skyrat_defines\species_clothing_paths.dm" -#include "code\__DEFINES\~skyrat_defines\status_indicator_defines.dm" #include "code\__DEFINES\~skyrat_defines\strippable.dm" #include "code\__DEFINES\~skyrat_defines\synth_defines.dm" #include "code\__DEFINES\~skyrat_defines\teshari_clothing_paths.dm" @@ -391,6 +390,7 @@ #include "code\__DEFINES\~~bubber_defines\access.dm" #include "code\__DEFINES\~~bubber_defines\quirk_whitelist.dm" #include "code\__DEFINES\~~bubber_defines\species.dm" +#include "code\__DEFINES\~~bubber_defines\status_indicator_defines.dm" #include "code\__DEFINES\~~bubber_defines\traits.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_lists.dm" @@ -5314,7 +5314,6 @@ #include "modular_skyrat\master_files\code\modules\mob\living\blood.dm" #include "modular_skyrat\master_files\code\modules\mob\living\emote_popup.dm" #include "modular_skyrat\master_files\code\modules\mob\living\examine_tgui.dm" -#include "modular_skyrat\master_files\code\modules\mob\living\living.dm" #include "modular_skyrat\master_files\code\modules\mob\living\living_defines.dm" #include "modular_skyrat\master_files\code\modules\mob\living\carbon\human.dm" #include "modular_skyrat\master_files\code\modules\mob\living\carbon\human_helpers.dm" @@ -6589,8 +6588,6 @@ #include "modular_skyrat\modules\stasisrework\code\machine_circuitboards.dm" #include "modular_skyrat\modules\stasisrework\code\medical_designs.dm" #include "modular_skyrat\modules\stasisrework\code\stasissleeper.dm" -#include "modular_skyrat\modules\status_indicators\status_indicator.dm" -#include "modular_skyrat\modules\status_indicators\status_indicator_pref.dm" #include "modular_skyrat\modules\stone\code\ore_veins.dm" #include "modular_skyrat\modules\stone\code\stone.dm" #include "modular_skyrat\modules\stormtrooper\code\stormtrooper_clothes.dm" @@ -6728,6 +6725,8 @@ #include "modular_zubbers\code\modules\mod\mod_theme.dm" #include "modular_zubbers\code\modules\mod\mod_types.dm" #include "modular_zubbers\code\modules\projectiles\guns\energy\pulse.dm" +#include "modular_zubbers\code\modules\status_indicators\status_indicator.dm" +#include "modular_zubbers\code\modules\status_indicators\status_indicator_pref.dm" #include "modular_zubbers\code\modules\surgery\bodyparts\species_parts\misc_bodyparts.dm" #include "modular_zubbers\code\modules\vending\wardrobe.dm" // END_INCLUDE