Refactors create_mob_hud() to add a signal (#39364)

* Refactors create_mob_hud() to add a signal

and make the mood component use it

* Register for the hud element click

* Observe observer safety
This commit is contained in:
Emmett Gaines
2018-07-29 01:47:16 -04:00
committed by oranges
parent dcde29b17c
commit 26c1031661
34 changed files with 66 additions and 94 deletions

View File

@@ -8,23 +8,32 @@
var/mood_level = 5 //To track what stage of moodies they're on
var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets
var/datum/mood_event/list/mood_events = list()
var/mob/living/owner
var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much?
var/holdmyinsanityeffect = 0 //before we edit our sanity lets take a look
var/obj/screen/mood/screen_obj
/datum/component/mood/Initialize()
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
START_PROCESSING(SSmood, src)
owner = parent
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
var/mob/living/owner = parent
if(owner.hud_used)
modify_hud()
var/datum/hud/hud = owner.hud_used
hud.show_hud(hud.hud_version)
/datum/component/mood/Destroy()
STOP_PROCESSING(SSmood, src)
unmodify_hud()
return ..()
/datum/component/mood/proc/print_mood()
/datum/component/mood/proc/print_mood(mob/user)
var/msg = "<span class='info'>*---------*\n<EM>Your current mood</EM>\n"
msg += "<span class='notice'>My mental status: </span>" //Long term
switch(sanity)
@@ -69,7 +78,7 @@
msg += event.description
else
msg += "<span class='nicegreen'>Nothing special has happened to me lately!<span>\n"
to_chat(owner, msg)
to_chat(user || parent, msg)
/datum/component/mood/proc/update_mood() //Called whenever a mood event is added or removed
mood = 0
@@ -105,13 +114,15 @@
/datum/component/mood/proc/update_mood_icon()
var/mob/living/owner = parent
if(owner.client && owner.hud_used)
if(sanity < 25)
owner.hud_used.mood.icon_state = "mood_insane"
screen_obj.icon_state = "mood_insane"
else
owner.hud_used.mood.icon_state = "mood[mood_level]"
screen_obj.icon_state = "mood[mood_level]"
/datum/component/mood/process() //Called on SSmood process
var/mob/living/owner = parent
switch(sanity)
if(SANITY_INSANE to SANITY_CRAZY)
owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 3)
@@ -207,5 +218,25 @@
qdel(event)
update_mood()
/datum/component/mood/proc/modify_hud()
var/mob/living/owner = parent
var/datum/hud/hud = owner.hud_used
screen_obj = new
hud.infodisplay += screen_obj
RegisterSignal(hud, COMSIG_PARENT_QDELETED, .proc/unmodify_hud)
RegisterSignal(screen_obj, COMSIG_CLICK, .proc/hud_click)
/datum/component/mood/proc/unmodify_hud()
if(!screen_obj)
return
var/mob/living/owner = parent
var/datum/hud/hud = owner.hud_used
if(hud && hud.infodisplay)
hud.infodisplay -= screen_obj
QDEL_NULL(screen_obj)
/datum/component/mood/proc/hud_click(location, control, params, mob/user)
print_mood(user)
#undef MINOR_INSANITY_PEN
#undef MAJOR_INSANITY_PEN