From ca96a9e2cdea83c9ceb917e7a43ef9e916cf22cf Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Thu, 29 May 2025 13:21:29 -0400 Subject: [PATCH] Ghost settings UI (#91370) ## About The Pull Request This is part of my ongoing project to remove the Stat panel which you can read/contribute to here: https://hackmd.io/443_dE5lRWeEAp9bjGcKYw Replaces the pAI button at the bottom of Ghost's HUD with a new button for Ghost settings Default look ![image](https://github.com/user-attachments/assets/7b97287d-5f8b-40a4-b574-98ecaafa8533) With fun verbs (admin only, the 2 buttons at the top right), No body, and lag switches on (disables T-Ray and Zooming) ![image](https://github.com/user-attachments/assets/3ee9bb9b-389c-452c-8ff5-fbd0ee677fef) The ghost icon next to "re-enter body" is the DNR button, which requires double click. Extra view is now easier to understand, 0 is "default", anything more is extra vision you get. Goes to 3 for regular users, 7 for BYOND members. Removes the "Ghost" tab from the stat panel entirely, this replaces it. ## Why It's Good For The Game The Ghost tab of the stat panel is filled with barely functional stuff, like "Jump to Mob" which allows you to jump to "oranges ear" which teleports you to nullspace, or the 4 different jump to verbs for different things which is irrelevant from the Orbit menu and the many improvements it got over the years, and even the Notifications panel, which seems pretty useful, but because it's delegated to a small button filled with the rest of these it gets entirely drowned out. This puts all the important things in front of the user at the click of a button, meant to be easy to navigate and giving important information first. ## Changelog :cl: add: Added a 'Ghost settings' button, taking the spot of the pAI candidate button and replacing the "Ghost" tab of the Stat panel. This button contains buttons pertinent to your time as an Observer. /:cl: --- code/__DEFINES/ghost.dm | 19 +- code/__DEFINES/hud.dm | 2 +- code/__HELPERS/view.dm | 3 + code/_onclick/hud/ghost.dm | 22 +- code/_onclick/observer.dm | 6 +- code/datums/view.dm | 4 +- code/modules/client/client_defines.dm | 3 - code/modules/events/wizard/ghost.dm | 7 +- .../modules/mob/dead/new_player/new_player.dm | 4 - code/modules/mob/dead/observer/ghost_menu.dm | 193 +++++++++++ .../mob/dead/observer/notificationprefs.dm | 50 --- code/modules/mob/dead/observer/observer.dm | 321 ++---------------- code/modules/mob/living/silicon/silicon.dm | 4 - code/modules/power/lighting/light.dm | 3 +- icons/hud/screen_ghost.dmi | Bin 28608 -> 29674 bytes tgstation.dme | 2 +- tgui/packages/tgui/interfaces/GhostMenu.tsx | 271 +++++++++++++++ .../interfaces/NotificationPreferences.jsx | 38 --- 18 files changed, 531 insertions(+), 421 deletions(-) create mode 100644 code/modules/mob/dead/observer/ghost_menu.dm delete mode 100644 code/modules/mob/dead/observer/notificationprefs.dm create mode 100644 tgui/packages/tgui/interfaces/GhostMenu.tsx delete mode 100644 tgui/packages/tgui/interfaces/NotificationPreferences.jsx diff --git a/code/__DEFINES/ghost.dm b/code/__DEFINES/ghost.dm index 84b6cdc7e33..526c08e790c 100644 --- a/code/__DEFINES/ghost.dm +++ b/code/__DEFINES/ghost.dm @@ -21,7 +21,7 @@ /// The default ghost display selection for the main player #define GHOST_ACCS_DEFAULT_OPTION GHOST_ACCS_FULL -/// The other players ghosts will display as a simple white ghost +/// The other players ghosts will display as a simple white ghost #define GHOST_OTHERS_SIMPLE "White ghosts" /// The other players ghosts will display as transparent mobs #define GHOST_OTHERS_DEFAULT_SPRITE "Default sprites" @@ -31,6 +31,8 @@ /// The default ghost display selection when viewing other players #define GHOST_OTHERS_DEFAULT_OPTION GHOST_OTHERS_THEIR_SETTING +/// A ghosts min view range that we won't allow them to go under by. +#define GHOST_MIN_VIEW_RANGE 7 /// A ghosts max view range if they are a BYOND guest or regular account #define GHOST_MAX_VIEW_RANGE_DEFAULT 10 /// A ghosts max view range if they are a BYOND paid member account (P2W feature) @@ -56,3 +58,18 @@ #define CAMERA_SEE_GHOSTS_BASIC 1 /// Pictures taken by a camera will display ghosts and their orbits #define CAMERA_SEE_GHOSTS_ORBIT 2 // this doesn't do anything right now as of Jan 2022 + + +#define GHOST_DATA_HUDS (1<<0) +#define GHOST_VISION (1<<1) +#define GHOST_HEALTH (1<<2) +#define GHOST_CHEM (1<<3) +#define GHOST_GAS (1<<4) + +#define ALL_GHOST_FLAGS list( \ + GHOST_DATA_HUDS, \ + GHOST_VISION, \ + GHOST_HEALTH, \ + GHOST_CHEM, \ + GHOST_GAS, \ +) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 9fac772cd2d..4ea51e41553 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -187,7 +187,7 @@ #define ui_ghost_orbit "SOUTH:6,CENTER-2:24" #define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24" #define ui_ghost_teleport "SOUTH:6,CENTER:24" -#define ui_ghost_pai "SOUTH: 6, CENTER+1:24" +#define ui_ghost_settings "SOUTH: 6, CENTER+1:24" #define ui_ghost_minigames "SOUTH: 6, CENTER+2:24" #define ui_ghost_language_menu "SOUTH: 6, CENTER+3:24" #define ui_ghost_floor_changer "SOUTH: 6, CENTER+3:8" diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index 61aaed88350..8456061caa8 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -2,6 +2,9 @@ SHOULD_BE_PURE(TRUE) if(isnum(view)) + //resetting back to 0- this is the same as just checking !view but we want to be clear the point of the check. + if(view == 0) + return list(0, 0) var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view return list(totalviewrange, totalviewrange) else diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 3ee08df77cb..a958e37a3f0 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -19,8 +19,7 @@ icon_state = "orbit" /atom/movable/screen/ghost/orbit/Click() - var/mob/dead/observer/G = usr - G.follow() + GLOB.orbit_menu.show(usr) /atom/movable/screen/ghost/reenter_corpse name = "Reenter corpse" @@ -38,13 +37,16 @@ var/mob/dead/observer/G = usr G.dead_tele() -/atom/movable/screen/ghost/pai - name = "pAI Candidate" - icon_state = "pai" +/atom/movable/screen/ghost/settings + name = "Ghost Settings" + icon_state = "settings" -/atom/movable/screen/ghost/pai/Click() - var/mob/dead/observer/G = usr - G.register_pai() +/atom/movable/screen/ghost/settings/MouseEntered(location, control, params) + . = ..() + flick(icon_state + "_anim", src) + +/atom/movable/screen/ghost/settings/Click() + GLOB.ghost_menu.ui_interact(usr) /atom/movable/screen/ghost/minigames_menu name ="Minigames" @@ -74,8 +76,8 @@ using.screen_loc = ui_ghost_teleport static_inventory += using - using = new /atom/movable/screen/ghost/pai(null, src) - using.screen_loc = ui_ghost_pai + using = new /atom/movable/screen/ghost/settings(null, src) + using.screen_loc = ui_ghost_settings static_inventory += using using = new /atom/movable/screen/ghost/minigames_menu(null, src) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 617a395ee4a..1e35113f47d 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -51,7 +51,7 @@ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE if(user.client) - if(user.gas_scan && atmos_scan(user=user, target=src, silent=TRUE)) + if((user.ghost_hud_flags & GHOST_GAS) && atmos_scan(user=user, target=src, silent=TRUE)) return TRUE else if(isAdminGhostAI(user)) attack_ai(user) @@ -60,9 +60,9 @@ return FALSE /mob/living/attack_ghost(mob/dead/observer/user) - if(user.client && user.health_scan) + if(user.client && (user.ghost_hud_flags & GHOST_HEALTH)) healthscan(user, src, 1, TRUE) - if(user.client && user.chem_scan) + if(user.client && (user.ghost_hud_flags & GHOST_CHEM)) chemscan(user, src) return ..() diff --git a/code/datums/view.dm b/code/datums/view.dm index 702550a4e18..380011fcdc7 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -72,8 +72,8 @@ height += shitcode[2] apply() -/datum/view_data/proc/setTo(toAdd) - var/list/shitcode = getviewsize(toAdd) //Backward compatibility to account +/datum/view_data/proc/setTo(to_set) + var/list/shitcode = getviewsize(to_set) //Backward compatibility to account width = shitcode[1] //for a change in how sizes get calculated. we used to include world.view in height = shitcode[2] //this, but it was jank, so I had to move it apply() diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 85b25978a52..2e89a101e2e 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -230,9 +230,6 @@ var/last_asset_job = 0 var/last_completed_asset_job = 0 - /// rate limiting for the crew manifest - var/crew_manifest_delay - /// A buffer of currently held keys. var/list/keys_held = list() /// A buffer for combinations such of modifiers + keys (ex: CtrlD, AltE, ShiftT). Format: `"key"` -> `"combo"` (ex: `"D"` -> `"CtrlD"`) diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm index 25f2dcfc6c3..def7f428e7c 100644 --- a/code/modules/events/wizard/ghost.dm +++ b/code/modules/events/wizard/ghost.dm @@ -24,7 +24,6 @@ description = "Ghosts become visible and gain the power of possession." /datum/round_event/wizard/possession/start() - for(var/mob/dead/observer/G in GLOB.player_list) - add_verb(G, /mob/dead/observer/verb/boo) - add_verb(G, /mob/dead/observer/verb/possess) - to_chat(G, "You suddenly feel a welling of new spooky powers...") + for(var/mob/dead/observer/ghost_player in GLOB.player_list) + ghost_player.fun_verbs = TRUE + to_chat(ghost_player, span_hypnophrase("You suddenly feel a welling of new spooky powers...")) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index e92357f3140..15c6ba475f7 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -297,10 +297,6 @@ /mob/dead/new_player/proc/ViewManifest() if(!client) return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - GLOB.manifest.ui_interact(src) /mob/dead/new_player/Move() diff --git a/code/modules/mob/dead/observer/ghost_menu.dm b/code/modules/mob/dead/observer/ghost_menu.dm new file mode 100644 index 00000000000..7580f844ea9 --- /dev/null +++ b/code/modules/mob/dead/observer/ghost_menu.dm @@ -0,0 +1,193 @@ +GLOBAL_DATUM_INIT(ghost_menu, /datum/ghost_menu, new) + +/datum/ghost_menu + ///Static assoc list of all types of lightings ghosts can use & names shown in the UI. + var/static/list/ghost_lightings = list( + "[LIGHTING_CUTOFF_VISIBLE]" = "Mob Vision", + "[LIGHTING_CUTOFF_MEDIUM]" = "Slight Night Vision", + "[LIGHTING_CUTOFF_HIGH]" = "Night Vision", + "[LIGHTING_CUTOFF_FULLBRIGHT]" = "Fullbright", + ) + +/datum/ghost_menu/ui_state(mob/user) + return GLOB.observer_state + +/datum/ghost_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if (!ui) + ui = new(user, src, "GhostMenu") + ui.open() + +/datum/ghost_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + var/mob/dead/observer/dead_user = ui.user + switch(action) + if("DNR") + dead_user.stay_dead() + return TRUE + if("return_to_body") + dead_user.reenter_corpse() + return TRUE + if("restore_appearance") + restore_ghost_appearance(dead_user) + return TRUE + if("change_notification") + var/key = params["key"] + if(key && islist(GLOB.poll_ignore[key])) + GLOB.poll_ignore[key] ^= list(dead_user.ckey) + return TRUE + if("turn_all_on") + for(var/key in GLOB.poll_ignore) + GLOB.poll_ignore[key] &= ~list(dead_user.ckey) + return TRUE + if("turn_all_off") + for(var/key in GLOB.poll_ignore) + GLOB.poll_ignore[key] |= list(dead_user.ckey) + return TRUE + if("signup_pai") + SSpai.recruit_window(dead_user) + return TRUE + if("tray_scan") + tray_view(dead_user) + return TRUE + if("darkness") + var/darkness_type = params["darkness_level"] + if(isnull(darkness_type)) + return FALSE + for(var/lighting_types in ghost_lightings) + if(darkness_type != ghost_lightings[lighting_types]) + continue + toggle_darkness(dead_user, lighting_types) + return TRUE + if("toggle_visibility") + var/to_toggle = params["toggling"] + if(!(to_toggle in ALL_GHOST_FLAGS)) + return + toggle_hud_type(dead_user, to_toggle) + return TRUE + if("crew_manifest") + GLOB.manifest.ui_interact(dead_user) + return TRUE + if("view_range") + var/setting_to = text2num(params["new_view_range"]) + GHOST_MIN_VIEW_RANGE + if(!isnum(setting_to)) + return FALSE + set_view(dead_user, setting_to) + return TRUE + if("boo") + if(!dead_user.fun_verbs) + return FALSE + dead_user.boo() + return TRUE + if("possess") + if(!dead_user.fun_verbs) + return FALSE + dead_user.possess() + return TRUE + + return FALSE + +/datum/ghost_menu/ui_data(mob/dead/observer/user) + var/list/data = list() + + data["can_boo"] = COOLDOWN_FINISHED(user, bootime) + data["has_fun"] = user.fun_verbs + data["body_name"] = user.can_reenter_corpse ? user.mind.current.real_name : FALSE + data["current_darkness"] = ghost_lightings["[user.lighting_cutoff]"] + data["notification_data"] = list() + for(var/key in GLOB.poll_ignore_desc) + data["notification_data"] += list(list( + "key" = key, + "enabled" = !!(user.ckey in GLOB.poll_ignore[key]), + "desc" = GLOB.poll_ignore_desc[key], + )) + + data["hud_info"] = list( + list( + "name" = "Data HUDs", + "enabled" = (user.ghost_hud_flags & GHOST_DATA_HUDS), + "flag" = GHOST_DATA_HUDS, + "tooltip" = "Grants you Med/Sec/Diag HUDs.", + ), + list( + "name" = "Ghost Vision", + "enabled" = (user.ghost_hud_flags & GHOST_VISION), + "flag" = GHOST_VISION, + "tooltip" = "Allows you to see ghost-only things (ex: smuggler satchels, countdowns, camera eyes).", + ), + list( + "name" = "Health Scanner", + "enabled" = (user.ghost_hud_flags & GHOST_HEALTH), + "flag" = GHOST_HEALTH, + "tooltip" = "Allows you to perform a health scan by clicking on someone.", + ), + list( + "name" = "Chemical Scanner", + "enabled" = (user.ghost_hud_flags & GHOST_CHEM), + "flag" = GHOST_CHEM, + "tooltip" = "Allows you to perform a chemical scan by clicking on someone.", + ), + list( + "name" = "Gas Scanner", + "enabled" = (user.ghost_hud_flags & GHOST_GAS), + "flag" = GHOST_GAS, + "tooltip" = "Allows you to perform a gas scan by clicking on a tile/atmos machine.", + ), + ) + + return data + +/datum/ghost_menu/ui_static_data(mob/dead/observer/user) + var/list/data = list() + data["max_extra_view"] = (user.client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT) - GHOST_MIN_VIEW_RANGE + data["darkness_levels"] = list() + for(var/level in ghost_lightings) + data["darkness_levels"] += ghost_lightings[level] + data["lag_switch_on"] = !!(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !user.client?.holder) + return data + +/datum/ghost_menu/proc/tray_view(mob/dead/observer/user) + if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !user.client?.holder) + to_chat(user, span_notice("That verb is currently globally disabled.")) + return + t_ray_scan(user) + +/datum/ghost_menu/proc/toggle_darkness(mob/dead/observer/user, darkness_type) + if(user.lighting_cutoff == darkness_type) + return + user.lighting_cutoff = text2num(darkness_type) + user.update_sight() + +/datum/ghost_menu/proc/toggle_hud_type(mob/dead/observer/user, hud_type) + user.ghost_hud_flags ^= hud_type + //special aftereffects for specific flags. + switch(hud_type) + if(GHOST_VISION) + user.update_sight() + if(GHOST_DATA_HUDS) + if(user.ghost_hud_flags & GHOST_DATA_HUDS) + user.show_data_huds() + else + user.remove_data_huds() + +/datum/ghost_menu/proc/restore_ghost_appearance(mob/dead/observer/user) + user.set_ghost_appearance() + if(!user.client?.prefs) + return + var/real_name_pref = user.client.prefs.read_preference(/datum/preference/name/real_name) + user.deadchat_name = real_name_pref + if(user.mind) + user.mind.ghostname = real_name_pref + user.name = real_name_pref + +/datum/ghost_menu/proc/set_view(mob/dead/observer/user, new_view) + if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !user.client?.holder) + to_chat(user, span_notice("That verb is currently globally disabled.")) + return TRUE + var/max_view = user.client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT + if(max_view >= new_view && new_view < GHOST_MIN_VIEW_RANGE) + return TRUE + user.client.view_size.setTo(round(new_view, 1) - GHOST_MIN_VIEW_RANGE) diff --git a/code/modules/mob/dead/observer/notificationprefs.dm b/code/modules/mob/dead/observer/notificationprefs.dm deleted file mode 100644 index 5e14f1e5ce9..00000000000 --- a/code/modules/mob/dead/observer/notificationprefs.dm +++ /dev/null @@ -1,50 +0,0 @@ -/mob/dead/observer/verb/show_notificationprefs() - set category = "Ghost" - set name = "Notification preferences" - set desc = "Notification preferences" - - var/datum/notificationpanel/panel = new(usr) - - panel.ui_interact(usr) - -/datum/notificationpanel - var/client/user - -/datum/notificationpanel/New(user) - if (ismob(user)) - var/mob/M = user - if (!M.client) - CRASH("Ghost role notification panel attempted to open to a mob without a client") - src.user = M.client - else - src.user = user - -/datum/notificationpanel/ui_state(mob/user) - return GLOB.observer_state - -/datum/notificationpanel/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NotificationPreferences") - ui.open() - -/datum/notificationpanel/ui_data(mob/user) - . = list() - .["ignore"] = list() - for(var/key in GLOB.poll_ignore_desc) - .["ignore"] += list(list( - "key" = key, - "enabled" = (user.ckey in GLOB.poll_ignore[key]), - "desc" = GLOB.poll_ignore_desc[key] - )) - -/datum/notificationpanel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - switch (action) - if ("toggle_ignore") - var/key = params["key"] - if (key && islist(GLOB.poll_ignore[key])) - GLOB.poll_ignore[key] ^= list(user.ckey) - . = TRUE diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index fcd61a3205c..0218035616b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -22,20 +22,24 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) light_on = FALSE shift_to_open_context_menu = FALSE var/can_reenter_corpse - var/bootime = 0 var/started_as_observer //This variable is set to 1 when you enter the game as an observer. //If you died in the game and are a ghost - this will remain as null. //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. var/atom/movable/following = null - var/fun_verbs = 0 + + ///The time between being able to use boo(), if fun_verbs is TRUE. + COOLDOWN_DECLARE(bootime) + ///Boolean on whether this ghost has access to 'fun' verbs in the ghost menu. + var/fun_verbs = FALSE + var/image/ghostimage_default = null //this mobs ghost image without accessories and dirs var/image/ghostimage_simple = null //this mob with the simple white ghost sprite - var/ghostvision = 1 //is the ghost able to see things humans can't? var/mob/observetarget = null //The target mob that the ghost is observing. Used as a reference in logout() - var/data_huds_on = 0 //Are data HUDs currently enabled? - var/health_scan = FALSE //Are health scans currently enabled? - var/chem_scan = FALSE //Are chem scans currently enabled? - var/gas_scan = FALSE //Are gas scans currently enabled? + + ///Flags of huds the ghost currently has enabled, data huds & ghost vision by default. + ///Selection: GHOST_DATA_HUDS | GHOST_VISION | GHOST_HEALTH | GHOST_CHEM | GHOST_GAS + var/ghost_hud_flags = GHOST_DATA_HUDS | GHOST_VISION + ///The shape the ghost will make while orbiting mobs. var/ghost_orbit = GHOST_ORBIT_CIRCLE //These variables store hair data if the ghost originates from a species with head and/or facial hair. @@ -72,12 +76,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) /mob/dead/observer/Initialize(mapload) set_invisibility(GLOB.observer_default_invisibility) - add_verb(src, list( - /mob/dead/observer/proc/dead_tele, - /mob/dead/observer/proc/open_spawners_menu, - /mob/dead/observer/proc/tray_view, - /mob/dead/observer/proc/open_minigames_menu)) - if(icon_state in GLOB.ghost_forms_with_directions_list) ghostimage_default = image(src.icon,src,src.icon_state + "_nodir") else @@ -133,10 +131,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) name ||= generate_random_mob_name(FALSE) real_name = name - if(!fun_verbs) - remove_verb(src, /mob/dead/observer/verb/boo) - remove_verb(src, /mob/dead/observer/verb/possess) - AddElement(/datum/element/movetype_handler) add_to_dead_mob_list() @@ -149,7 +143,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) grant_all_languages() setup_hud_traits() show_data_huds() - data_huds_on = 1 SSpoints_of_interest.make_point_of_interest(src) ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, ref(src)) @@ -165,7 +158,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 1 SECONDS) /mob/dead/observer/Destroy() - if(data_huds_on) + if(ghost_hud_flags & GHOST_DATA_HUDS) remove_data_huds() // Update our old body's medhud since we're abandoning it @@ -368,9 +361,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(new_area != ambience_tracked_area) update_ambience_area(new_area) -/mob/dead/observer/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" +/mob/dead/observer/proc/reenter_corpse() if(!client) return if(!mind || QDELETED(mind.current)) @@ -390,19 +381,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp mind.current.client.init_verbs() return TRUE -/mob/dead/observer/verb/stay_dead() - set category = "Ghost" - set name = "Do Not Resuscitate" - if(!client) - return +/mob/dead/observer/proc/stay_dead() if(!can_reenter_corpse) to_chat(usr, span_warning("You're already stuck out of your body!")) return FALSE - var/response = tgui_alert(usr, "Are you sure you want to prevent (almost) all means of resuscitation? This cannot be undone.", "Are you sure you want to stay dead?", list("DNR","Save Me")) - if(response != "DNR") - return - can_reenter_corpse = FALSE var/mob/living/current_mob = mind.current if(istype(current_mob)) @@ -441,9 +424,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp SEND_SOUND(src, sound(sound)) /mob/dead/observer/proc/dead_tele() - set category = "Ghost" - set name = "Teleport" - set desc= "Teleport to a location" if(!isobserver(usr)) to_chat(usr, span_warning("Not when you're not dead!")) return @@ -469,13 +449,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr.abstract_move(pick(L)) -/mob/dead/observer/verb/follow() - set category = "Ghost" - set name = "Orbit" // "Haunt" - set desc = "Follow and orbit a mob." - - GLOB.orbit_menu.show(src) - // This is the ghost's follow verb with an argument /mob/dead/observer/proc/ManualFollow(atom/movable/target) if (!istype(target) || (is_secret_level(target.z) && !client?.holder)) @@ -513,57 +486,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!isnull(client) && !isnull(client.eye)) reset_perspective(null) -/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - - if(!isobserver(usr)) //Make sure they're an observer! - return - - var/list/possible_destinations = SSpoints_of_interest.get_mob_pois() - var/target = null - - target = tgui_input_list(usr, "Please, select a player!", "Jump to Mob", possible_destinations) - if(isnull(target)) - return - if (!isobserver(usr)) - return - - var/mob/destination_mob = possible_destinations[target] //Destination mob - - // During the break between opening the input menu and selecting our target, has this become an invalid option? - if(!SSpoints_of_interest.is_valid_poi(destination_mob)) - return - - var/mob/source_mob = src //Source mob - var/turf/destination_turf = get_turf(destination_mob) //Turf of the destination mob - - if(isturf(destination_turf)) - source_mob.abstract_move(destination_turf) - else - to_chat(source_mob, span_danger("This mob is not located in the game world.")) - -/mob/dead/observer/verb/change_view_range() - set category = "Ghost" - set name = "View Range" - set desc = "Change your view range." - - if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) - to_chat(usr, span_notice("That verb is currently globally disabled.")) - return - - var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT - if(client.view_size.getView() == client.view_size.default) - var/list/views = list() - for(var/i in 7 to max_view) - views |= i - var/new_view = tgui_input_list(usr, "New view", "Modify view range", views) - if(new_view) - client.view_size.setTo(clamp(new_view, 7, max_view) - 7) - else - client.view_size.resetToDefault() - /mob/dead/observer/verb/add_view_range(input as num) set name = "Add View Range" set hidden = TRUE @@ -574,49 +496,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT if(input) - client.rescale_view(input, 0, ((max_view*2)+1) - 15) + client.rescale_view(input, 0, ((max_view * 2) + 1) - 15) -/mob/dead/observer/verb/boo() - set category = "Ghost" - set name = "Boo!" - set desc= "Scare your crew members because of boredom!" - - if(bootime > world.time) +/mob/dead/observer/proc/boo() + if(!COOLDOWN_FINISHED(src, bootime)) return var/obj/machinery/light/L = locate(/obj/machinery/light) in view(1, src) if(L?.flicker()) - bootime = world.time + 600 + COOLDOWN_START(src, bootime, 60 SECONDS) //Maybe in the future we can add more spooky code here! - -/mob/dead/observer/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !(ghostvision) - update_sight() - to_chat(usr, span_boldnotice("You [(ghostvision?"now":"no longer")] have ghost vision.")) - -/mob/dead/observer/verb/toggle_darkness() - set name = "Toggle Darkness" - set category = "Ghost" - switch(lighting_cutoff) - if (LIGHTING_CUTOFF_VISIBLE) - lighting_cutoff = LIGHTING_CUTOFF_MEDIUM - if (LIGHTING_CUTOFF_MEDIUM) - lighting_cutoff = LIGHTING_CUTOFF_HIGH - if (LIGHTING_CUTOFF_HIGH) - lighting_cutoff = LIGHTING_CUTOFF_FULLBRIGHT - else - lighting_cutoff = LIGHTING_CUTOFF_VISIBLE - - update_sight() - /mob/dead/observer/update_sight() if(client) ghost_others = client.prefs.read_preference(/datum/preference/choiced/ghost_others) //A quick update just in case this setting was changed right before calling the proc - if (!ghostvision) + if(!(ghost_hud_flags & GHOST_VISION)) set_invis_see(SEE_INVISIBLE_LIVING) else set_invis_see(SEE_INVISIBLE_OBSERVER) @@ -643,7 +537,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(GHOST_OTHERS_SIMPLE) client?.images -= GLOB.ghost_images_simple lastsetting = client?.prefs.read_preference(/datum/preference/choiced/ghost_others) - if(!ghostvision) + if(!(ghost_hud_flags & GHOST_VISION)) return if(lastsetting != GHOST_OTHERS_THEIR_SETTING) switch(lastsetting) @@ -652,11 +546,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(GHOST_OTHERS_SIMPLE) client?.images |= (GLOB.ghost_images_simple-ghostimage_simple) -/mob/dead/observer/verb/possess() - set category = "Ghost" - set name = "Possess!" - set desc= "Take over the body of a mindless creature!" - +/mob/dead/observer/proc/possess() var/list/possessible = list() for(var/mob/living/L in GLOB.alive_mob_list) if(istype(L,/mob/living/carbon/human/dummy) || !get_turf(L)) //Haha no. @@ -690,18 +580,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp visible_message(span_deadsay("[src] points to [pointed_at].")) -/mob/dead/observer/verb/view_manifest() - set name = "View Crew Manifest" - set category = "Ghost" - - if(!client) - return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - - GLOB.manifest.ui_interact(src) - //this is called when a ghost is drag clicked to something. /mob/dead/observer/mouse_drop_dragged(atom/over, mob/user) if (isobserver(user) && user.client.holder && (isliving(over) || iseyemob(over))) @@ -768,70 +646,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/remove_data_huds() remove_traits(observer_hud_traits, REF(src)) -/mob/dead/observer/verb/toggle_data_huds() - set name = "Toggle Sec/Med/Diag HUD" - set desc = "Toggles whether you see medical/security/diagnostic HUDs" - set category = "Ghost" - - if(data_huds_on) //remove old huds - remove_data_huds() - to_chat(src, span_notice("Data HUDs disabled.")) - data_huds_on = 0 - else - show_data_huds() - to_chat(src, span_notice("Data HUDs enabled.")) - data_huds_on = 1 - -/mob/dead/observer/verb/toggle_health_scan() - set name = "Toggle Health Scan" - set desc = "Toggles whether you health-scan living beings on click" - set category = "Ghost" - - if(health_scan) //remove old huds - to_chat(src, span_notice("Health scan disabled.")) - health_scan = FALSE - else - to_chat(src, span_notice("Health scan enabled.")) - health_scan = TRUE - -/mob/dead/observer/verb/toggle_chem_scan() - set name = "Toggle Chem Scan" - set desc = "Toggles whether you scan living beings for chemicals and addictions on click" - set category = "Ghost" - - if(chem_scan) //remove old huds - to_chat(src, span_notice("Chem scan disabled.")) - chem_scan = FALSE - else - to_chat(src, span_notice("Chem scan enabled.")) - chem_scan = TRUE - -/mob/dead/observer/verb/toggle_gas_scan() - set name = "Toggle Gas Scan" - set desc = "Toggles whether you analyze gas contents on click" - set category = "Ghost" - - if(gas_scan) - to_chat(src, span_notice("Gas scan disabled.")) - gas_scan = FALSE - else - to_chat(src, span_notice("Gas scan enabled.")) - gas_scan = TRUE - -/mob/dead/observer/verb/restore_ghost_appearance() - set name = "Restore Ghost Character" - set desc = "Sets your deadchat name and ghost appearance to your \ - roundstart character." - set category = "Ghost" - - set_ghost_appearance() - if(client?.prefs) - var/real_name = client.prefs.read_preference(/datum/preference/name/real_name) - deadchat_name = real_name - if(mind) - mind.ghostname = real_name - name = real_name - /mob/dead/observer/proc/set_ghost_appearance() if(!client?.prefs) return @@ -868,13 +682,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(NAMEOF(src, icon_state)) ghostimage_default.icon_state = icon_state ghostimage_simple.icon_state = icon_state - if(NAMEOF(src, fun_verbs)) - if(fun_verbs) - add_verb(src, /mob/dead/observer/verb/boo) - add_verb(src, /mob/dead/observer/verb/possess) - else - remove_verb(src, /mob/dead/observer/verb/boo) - remove_verb(src, /mob/dead/observer/verb/possess) + if(NAMEOF(src, invisibility)) + set_invisibility(invisibility) // updates light /mob/dead/observer/reset_perspective(atom/A) if(client) @@ -898,37 +707,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp hide_other_mob_action_buttons(target) LAZYREMOVE(target.observers, src) -/mob/dead/observer/verb/observe() - set name = "Observe" - set category = "Ghost" - - if(!isobserver(usr) || HAS_TRAIT(src, TRAIT_NO_OBSERVE)) //Make sure they're an observer! - return - - reset_perspective(null) - - var/list/possible_destinations = SSpoints_of_interest.get_mob_pois() - var/target = null - - target = tgui_input_list(usr, "Please, select a player!", "Jump to Mob", possible_destinations) - if(isnull(target)) - return - if (!isobserver(usr)) - return - - reset_perspective(null) // Reset again for sanity - - var/mob/chosen_target = possible_destinations[target] - - // During the break between opening the input menu and selecting our target, has this become an invalid option? - if(!SSpoints_of_interest.is_valid_poi(chosen_target)) - return - - if (chosen_target == usr) - return - - do_observe(chosen_target) - /mob/dead/observer/proc/do_observe(mob/mob_eye) if(isnewplayer(mob_eye)) stack_trace("/mob/dead/new_player: \[[mob_eye]\] is being observed by [key_name(src)]. This should never happen and has been blocked.") @@ -965,37 +743,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else set_sight(initial(sight)) -/mob/dead/observer/verb/register_pai_candidate() - set category = "Ghost" - set name = "pAI Setup" - set desc = "Upload a fragment of your personality to the global pAI databanks" - - register_pai() - -/mob/dead/observer/proc/register_pai() - if(isobserver(src)) - SSpai.recruit_window(src) - else - to_chat(usr, span_warning("Can't become a pAI candidate while not dead!")) - -/mob/dead/observer/verb/mafia_game_signup() - set category = "Ghost" - set name = "Signup for Mafia" - set desc = "Sign up for a game of Mafia to pass the time while dead." - - mafia_signup() - -/mob/dead/observer/proc/mafia_signup() - if(!client) - return - if(!isobserver(src)) - to_chat(usr, span_warning("You must be a ghost to join mafia!")) - return - var/datum/mafia_controller/game = GLOB.mafia_game //this needs to change if you want multiple mafia games up at once. - if(!game) - game = create_mafia_game() - game.ui_interact(usr) - /mob/dead/observer/AltClickOn(atom/target) client.loot_panel.open(get_turf(target)) @@ -1030,11 +777,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/Process_Spacemove(movement_dir, continuous_move = FALSE) return TRUE -/mob/dead/observer/vv_edit_var(var_name, var_value) - . = ..() - if(var_name == NAMEOF(src, invisibility)) - set_invisibility(invisibility) // updates light - /proc/set_observer_default_invisibility(amount, message=null) for(var/mob/dead/observer/G in GLOB.player_list) G.set_invisibility(amount) @@ -1043,18 +785,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp GLOB.observer_default_invisibility = amount /mob/dead/observer/proc/open_spawners_menu() - set name = "Spawners Menu" - set desc = "See all currently available spawners" - set category = "Ghost" if(!spawners_menu) spawners_menu = new(src) spawners_menu.ui_interact(src) /mob/dead/observer/proc/open_minigames_menu() - set name = "Minigames Menu" - set desc = "See all currently available minigames" - set category = "Ghost" if(!client) return if(!isobserver(src)) @@ -1065,17 +801,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp minigames_menu.ui_interact(src) -/mob/dead/observer/proc/tray_view() - set category = "Ghost" - set name = "T-ray scan" - set desc = "Perfom a scan to view sub-floor objects" - - if(SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] && !client?.holder) - to_chat(usr, span_notice("That verb is currently globally disabled.")) - return - - t_ray_scan(src) - /mob/dead/observer/default_lighting_cutoff() var/datum/preferences/prefs = client?.prefs if(!prefs || (client?.combo_hud_enabled && prefs.toggles & COMBOHUD_LIGHTING)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 01ec2806a0f..e46f09a0873 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -385,10 +385,6 @@ /mob/living/silicon/proc/ai_roster() if(!client) return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - GLOB.manifest.ui_interact(src) /mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals). diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 5c13152551b..fb89d70789e 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -500,13 +500,13 @@ ) return TRUE - /obj/machinery/light/proc/flicker(amount = rand(10, 20)) set waitfor = FALSE if(flickering) return flickering = TRUE if(on && status == LIGHT_OK) + . = TRUE //did we actually flicker? Send this now because we expect immediate response, before sleeping. for(var/i in 1 to amount) if(status != LIGHT_OK || !has_power()) break @@ -518,7 +518,6 @@ else on = FALSE update(FALSE) - . = TRUE //did we actually flicker? flickering = FALSE // ai attack - make lights flicker, because why not diff --git a/icons/hud/screen_ghost.dmi b/icons/hud/screen_ghost.dmi index 13255a2a168903fca9e6524ecd83c664b449ef1e..5868fcfbad485205e553dd96b319d18860e05226 100644 GIT binary patch literal 29674 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 literal 28608 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 { + const { act, data } = useBackend(); + const { has_fun, can_boo } = data; + return ( + + + + + ) + } + > + + + +
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+ ); +}; + +const RoundSection = (props) => { + const { act, data } = useBackend(); + const { body_name } = data; + return ( + <> + {!!body_name && ( + act('return_to_body')} + fontSize="11px" + buttons={ + act('DNR')} + /> + } + > + Re-enter {body_name} + + )} + act('crew_manifest')} + fontSize="11px" + > + View Crew Manifest + + act('signup_pai')} + fontSize="11px" + > + Sign up as pAI + + + ); +}; + +const HudSection = (props) => { + const { act, data } = useBackend(); + const { hud_info, lag_switch_on } = data; + return ( + + {hud_info.map((individual_hud) => ( + + + + ))} + {!lag_switch_on && ( + + )} + + ); +}; + +const GhostSettingsSection = (props) => { + const [viewNumber, setviewNumber] = useState(0); + const { act, data } = useBackend(); + const { current_darkness, darkness_levels, max_extra_view, lag_switch_on } = + data; + return ( + + + + act('darkness', { + darkness_level: value, + }) + } + /> + + + + + {!lag_switch_on && ( + + Extra View Distance: + setviewNumber(newValue)} + onChange={(new_range) => + act('view_range', { + new_view_range: new_range, + }) + } + /> + + )} + + ); +}; + +const NotificationPreferences = (props) => { + const { act, data } = useBackend(); + const { notification_data } = data; + if (!notification_data) { + return 'No notifications!'; + } + + const ignores = notification_data.sort((a, b) => { + const descA = a.desc.toLowerCase(); + const descB = b.desc.toLowerCase(); + if (descA < descB) { + return -1; + } + if (descA > descB) { + return 1; + } + return 0; + }); + + return ( +
+ + ))} +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NotificationPreferences.jsx b/tgui/packages/tgui/interfaces/NotificationPreferences.jsx deleted file mode 100644 index 41ec2d9958a..00000000000 --- a/tgui/packages/tgui/interfaces/NotificationPreferences.jsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Button, Section } from 'tgui-core/components'; - -import { useBackend } from '../backend'; -import { Window } from '../layouts'; - -export const NotificationPreferences = (props) => { - const { act, data } = useBackend(); - const ignoresPreSort = data.ignore || []; - const ignores = ignoresPreSort.sort((a, b) => { - const descA = a.desc.toLowerCase(); - const descB = b.desc.toLowerCase(); - if (descA < descB) { - return -1; - } - if (descA > descB) { - return 1; - } - return 0; - }); - return ( - - -
- {ignores.map((ignore) => ( -
-
-
- ); -};