mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 16:05:07 +00:00
About The Pull Request
This makes space suits use a cell and warm the wearer, This was handled by the handle_environment proc in the past with an override to make the suits work. This corrects this issue, and removes the override.
All space suits will have a cell installed at round start, this cell will last 15 min on average usage.
The cell cover can be toggled by alt+clicking (press the button), or using a crowbar (just pry it open) on the suit.
With the cover open you can remove the cell by using the suit in hand, or ctrl+clicking the suit.
As well with the cover open you can use a screwdriver to set the thermal regulator's temperature. The normal range is 20 c to 45 c, do not use an emag on the suit to increase the temperature range.
Examining the suit will report the temperature setting and the cells charge, if the cover is open you will also be able to see the type of cell that is in the suit.
Suit storage units will now charge the cells in suits, they will also require power to operate properly now.
Why It's Good For The Game
Space suits should be managing the wearers temp in space not using some override.
Lizards now have a portable heater in the form of any space suit.
Now that suits need a cell it is not as easy to spend all session in a space suit.
New interactions with hardsuits and emp's give nice combat buff to an underused item.
Nuke ops can raid xeno for some nice yellow cells, or science for a big old bluespace cell.
294 lines
9.5 KiB
Plaintext
294 lines
9.5 KiB
Plaintext
/*
|
|
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/rest_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/spacesuit
|
|
|
|
// 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
|
|
spacesuit = 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)
|
|
return
|
|
hud_used = new hud_type(src)
|
|
update_sight()
|
|
SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED)
|
|
|
|
//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)
|
|
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, "<span class='info'>Switched HUD mode. Press F12 to toggle.</span>")
|
|
else
|
|
to_chat(usr, "<span class='warning'>This mob type does not use a HUD.</span>")
|
|
|
|
|
|
//(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
|