mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
* Virus antagonist initial commit * Updated disease code * Sentient virus improvements * Renamed /mob/living/var/viruses to diseases, and /mob/living/var/resistances to disease_resistances * Added sentient virus event * Renamed VIRUS defines to DISEASE defines * Fixed bugs in rewritten disease code * Fixed advanced disease Copy() * Finalized disease antagonist * Made cooldown buttons stop processing if they are removed from an owner. Made sentient disease active sneeze and cough not available if the host is unconscious. Made sentient disease menu refresh when adaptations are ready or hosts are added or removed. Made sentient disease following use movement signals instead of fastprocess. * Added better icons to sentient disease abilities
128 lines
4.0 KiB
Plaintext
128 lines
4.0 KiB
Plaintext
/* HUD DATUMS */
|
|
|
|
GLOBAL_LIST_EMPTY(all_huds)
|
|
|
|
//GLOBAL HUD LIST
|
|
GLOBAL_LIST_INIT(huds, list(
|
|
DATA_HUD_SECURITY_BASIC = new/datum/atom_hud/data/human/security/basic(),
|
|
DATA_HUD_SECURITY_ADVANCED = new/datum/atom_hud/data/human/security/advanced(),
|
|
DATA_HUD_MEDICAL_BASIC = new/datum/atom_hud/data/human/medical/basic(),
|
|
DATA_HUD_MEDICAL_ADVANCED = new/datum/atom_hud/data/human/medical/advanced(),
|
|
DATA_HUD_DIAGNOSTIC_BASIC = new/datum/atom_hud/data/diagnostic/basic(),
|
|
DATA_HUD_DIAGNOSTIC_ADVANCED = new/datum/atom_hud/data/diagnostic/advanced(),
|
|
DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(),
|
|
DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(),
|
|
ANTAG_HUD_CULT = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_REV = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_OPS = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_WIZ = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_SHADOW = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_TRAITOR = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_ABDUCTOR = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),
|
|
ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),
|
|
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
|
|
))
|
|
|
|
/datum/atom_hud
|
|
var/list/atom/hudatoms = list() //list of all atoms which display this hud
|
|
var/list/mob/hudusers = list() //list with all mobs who can see the hud
|
|
var/list/hud_icons = list() //these will be the indexes for the atom's hud_list
|
|
|
|
var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them
|
|
var/list/queued_to_see = list() //mobs that have triggered the cooldown and are queued to see the hud, but do not yet
|
|
|
|
/datum/atom_hud/New()
|
|
GLOB.all_huds += src
|
|
|
|
/datum/atom_hud/Destroy()
|
|
for(var/v in hudusers)
|
|
remove_hud_from(v)
|
|
for(var/v in hudatoms)
|
|
remove_from_hud(v)
|
|
GLOB.all_huds -= src
|
|
return ..()
|
|
|
|
/datum/atom_hud/proc/remove_hud_from(mob/M)
|
|
if(!M || !hudusers[M])
|
|
return
|
|
if (!--hudusers[M])
|
|
hudusers -= M
|
|
if(queued_to_see[M])
|
|
queued_to_see -= M
|
|
else
|
|
for(var/atom/A in hudatoms)
|
|
remove_from_single_hud(M, A)
|
|
|
|
/datum/atom_hud/proc/remove_from_hud(atom/A)
|
|
if(!A)
|
|
return FALSE
|
|
for(var/mob/M in hudusers)
|
|
remove_from_single_hud(M, A)
|
|
hudatoms -= A
|
|
return TRUE
|
|
|
|
/datum/atom_hud/proc/remove_from_single_hud(mob/M, atom/A) //unsafe, no sanity apart from client
|
|
if(!M || !M.client || !A)
|
|
return
|
|
for(var/i in hud_icons)
|
|
M.client.images -= A.hud_list[i]
|
|
|
|
/datum/atom_hud/proc/add_hud_to(mob/M)
|
|
if(!M)
|
|
return
|
|
if(!hudusers[M])
|
|
hudusers[M] = 1
|
|
if(next_time_allowed[M] > world.time)
|
|
if(!queued_to_see[M])
|
|
addtimer(CALLBACK(src, .proc/show_hud_images_after_cooldown, M), next_time_allowed[M] - world.time)
|
|
queued_to_see[M] = TRUE
|
|
else
|
|
next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN
|
|
for(var/atom/A in hudatoms)
|
|
add_to_single_hud(M, A)
|
|
else
|
|
hudusers[M]++
|
|
|
|
/datum/atom_hud/proc/show_hud_images_after_cooldown(M)
|
|
if(queued_to_see[M])
|
|
queued_to_see -= M
|
|
next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN
|
|
for(var/atom/A in hudatoms)
|
|
add_to_single_hud(M, A)
|
|
|
|
/datum/atom_hud/proc/add_to_hud(atom/A)
|
|
if(!A)
|
|
return FALSE
|
|
hudatoms |= A
|
|
for(var/mob/M in hudusers)
|
|
add_to_single_hud(M, A)
|
|
return TRUE
|
|
|
|
/datum/atom_hud/proc/add_to_single_hud(mob/M, atom/A) //unsafe, no sanity apart from client
|
|
if(!M || !M.client || !A)
|
|
return
|
|
for(var/i in hud_icons)
|
|
if(A.hud_list[i])
|
|
M.client.images |= A.hud_list[i]
|
|
|
|
//MOB PROCS
|
|
/mob/proc/reload_huds()
|
|
for(var/datum/atom_hud/hud in GLOB.all_huds)
|
|
if(hud && hud.hudusers[src])
|
|
for(var/atom/A in hud.hudatoms)
|
|
hud.add_to_single_hud(src, A)
|
|
|
|
/mob/dead/new_player/reload_huds()
|
|
return
|
|
|
|
/mob/proc/add_click_catcher()
|
|
client.screen += client.void
|
|
|
|
/mob/dead/new_player/add_click_catcher()
|
|
return
|