/* The hud datum Used to show and hide huds for all the different mob types, including inventories and item quick actions. */ // The default UI style is the first one in the list GLOBAL_LIST_INIT(available_ui_styles, list( "Midnight" = 'icons/mob/screen_midnight.dmi', "Retro" = 'icons/mob/screen_retro.dmi', "Plasmafire" = 'icons/mob/screen_plasmafire.dmi', "Slimecore" = 'icons/mob/screen_slimecore.dmi', "Operative" = 'icons/mob/screen_operative.dmi', "Clockwork" = 'icons/mob/screen_clockwork.dmi' )) /proc/ui_style2icon(ui_style) return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]] /datum/hud var/mob/mymob var/hud_shown = TRUE //Used for the HUD toggle (F12) var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD var/inventory_shown = FALSE //Equipped item inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/ling/chems/lingchemdisplay var/obj/screen/ling/sting/lingstingdisplay var/obj/screen/blobpwrdisplay var/obj/screen/alien_plasma_display var/obj/screen/alien_queen_finder var/obj/screen/devil/soul_counter/devilsouldisplay var/obj/screen/action_intent var/obj/screen/zone_select var/obj/screen/pull_icon var/obj/screen/throw_icon var/obj/screen/module_store_icon var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID. var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = FALSE var/obj/screen/healths var/obj/screen/healthdoll var/obj/screen/internals var/obj/screen/mood // subtypes can override this to force a specific UI style var/ui_style /datum/hud/New(mob/owner) mymob = owner if (!ui_style) // will fall back to the default if any of these are null ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style) hide_actions_toggle = new hide_actions_toggle.InitialiseIcon(src) if(mymob.client) hide_actions_toggle.locked = mymob.client.prefs.buttons_locked hand_slots = list() for(var/mytype in subtypesof(/obj/screen/plane_master)) var/obj/screen/plane_master/instance = new mytype() plane_masters["[instance.plane]"] = instance instance.backdrop(mymob) /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null QDEL_NULL(hide_actions_toggle) QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) inv_slots.Cut() action_intent = null zone_select = null pull_icon = null QDEL_LIST(toggleable_inventory) QDEL_LIST(hotkeybuttons) throw_icon = null QDEL_LIST(infodisplay) healths = null healthdoll = null internals = null mood = null lingchemdisplay = null devilsouldisplay = null lingstingdisplay = null blobpwrdisplay = null alien_plasma_display = null alien_queen_finder = null QDEL_LIST_ASSOC_VAL(plane_masters) QDEL_LIST(screenoverlays) mymob = null return ..() /mob/proc/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud(src) update_sight() //Version denotes which style should be displayed. blank or 0 means "next version" /datum/hud/proc/show_hud(version = 0, mob/viewmob) if(!ismob(mymob)) return FALSE var/mob/screenmob = viewmob || mymob if(!screenmob.client) return FALSE screenmob.client.screen = list() screenmob.client.apply_clickcatcher() var/display_hud_version = version if(!display_hud_version) //If 0 or blank, display the next hud version display_hud_version = hud_version + 1 if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version display_hud_version = 1 switch(display_hud_version) if(HUD_STYLE_STANDARD) //Default HUD hud_shown = TRUE //Governs behavior of other procs if(static_inventory.len) screenmob.client.screen += static_inventory if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown) screenmob.client.screen += toggleable_inventory if(hotkeybuttons.len && !hotkey_ui_hidden) screenmob.client.screen += hotkeybuttons if(infodisplay.len) screenmob.client.screen += infodisplay screenmob.client.screen += hide_actions_toggle if(action_intent) action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position if(HUD_STYLE_REDUCED) //Reduced HUD hud_shown = FALSE //Governs behavior of other procs if(static_inventory.len) screenmob.client.screen -= static_inventory if(toggleable_inventory.len) screenmob.client.screen -= toggleable_inventory if(hotkeybuttons.len) screenmob.client.screen -= hotkeybuttons if(infodisplay.len) screenmob.client.screen += infodisplay //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay for(var/h in hand_slots) var/obj/screen/hand = hand_slots[h] if(hand) screenmob.client.screen += hand if(action_intent) screenmob.client.screen += action_intent //we want the intent switcher visible action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. if(HUD_STYLE_NOHUD) //No HUD hud_shown = FALSE //Governs behavior of other procs if(static_inventory.len) screenmob.client.screen -= static_inventory if(toggleable_inventory.len) screenmob.client.screen -= toggleable_inventory if(hotkeybuttons.len) screenmob.client.screen -= hotkeybuttons if(infodisplay.len) screenmob.client.screen -= infodisplay hud_version = display_hud_version persistent_inventory_update(screenmob) screenmob.update_action_buttons(1) reorganize_alerts() screenmob.reload_fullscreen() update_parallax_pref(screenmob) // ensure observers get an accurate and up-to-date view if (!viewmob) plane_masters_update() for(var/M in mymob.observers) show_hud(hud_version, M) else if (viewmob.hud_used) viewmob.hud_used.plane_masters_update() return TRUE /datum/hud/proc/plane_masters_update() // Plane masters are always shown to OUR mob, never to observers for(var/thing in plane_masters) var/obj/screen/plane_master/PM = plane_masters[thing] PM.backdrop(mymob) mymob.client.screen += PM /datum/hud/human/show_hud(version = 0,mob/viewmob) . = ..() if(!.) return var/mob/screenmob = viewmob || mymob hidden_inventory_update(screenmob) /datum/hud/robot/show_hud(version = 0, mob/viewmob) . = ..() if(!.) return update_robot_modules_display() /datum/hud/proc/hidden_inventory_update() return /datum/hud/proc/persistent_inventory_update(mob/viewer) if(!mymob) return /datum/hud/proc/update_ui_style(new_ui_style) // do nothing if overridden by a subtype or already on that style if (initial(ui_style) || ui_style == new_ui_style) return for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) if (item.icon == ui_style) item.icon = new_ui_style ui_style = new_ui_style build_hand_slots() hide_actions_toggle.InitialiseIcon(src) //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() set name = "F12" set hidden = TRUE if(hud_used && client) hud_used.show_hud() //Shows the next hud preset to_chat(usr, "Switched HUD mode. Press F12 to toggle.") else to_chat(usr, "This mob type does not use a HUD.") //(re)builds the hand ui slots, throwing away old ones //not really worth jugglying existing ones so we just scrap+rebuild //9/10 this is only called once per mob and only for 2 hands /datum/hud/proc/build_hand_slots() for(var/h in hand_slots) var/obj/screen/inventory/hand/H = hand_slots[h] if(H) static_inventory -= H hand_slots = list() var/obj/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) hand_box = new /obj/screen/inventory/hand() hand_box.name = mymob.get_held_index_name(i) hand_box.icon = ui_style hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" hand_box.screen_loc = ui_hand_position(i) hand_box.held_index = i hand_slots["[i]"] = hand_box hand_box.hud = src static_inventory += hand_box hand_box.update_icon() var/i = 1 for(var/obj/screen/swap_hand/SH in static_inventory) SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1) i++ for(var/obj/screen/human/equip/E in static_inventory) E.screen_loc = ui_equip_position(mymob) if(ismob(mymob) && mymob.hud_used == src) show_hud(hud_version) /datum/hud/proc/update_locked_slots() return