[MIRROR] [READY] Several fixes/changes to mood, longterm mood effects, beauty component (#5992)
* [READY] Several fixes/changes to mood, longterm mood effects, beauty component (#36344) cl Floyd / Qustinnus del: Removes short-term effects of mood add; Adds long-term effects of mood by implementing sanity which goes up with good mood, down with bad mood, but takes time to change. Your sanity can be seen as your average mood in the recent past. All effects of moods are now covered by this system add: Beauty component, currently only attached to cleanables, but you could attach it to any atom/movable and make them pretty/ugly, affecting mood of anyone in the room. refactor: Removes the original way of adding mood events, uses signals properly instead. fix: Cleanables "giving" area's free beauty during initialization fix: Fixes some events not clearing properly /cl Fixes #36444 From now on mood no longer affects you directly, instead it decides whether your sanity goes up or down, when your sanity gets too low you will get the effects of what mood did before. This means getting hit with bad moods due to being attacked while not mean you are doomed anymore, and you get a large timeframe to get away and just fix your mood later. I also added the beauty component, you could add this to any object and it would either make a room prettier or uglier, comparable to DF or Rimworld. You could add traits to make certain people ugly, for example. * [READY] Several fixes/changes to mood, longterm mood effects, beauty component
This commit is contained in:
committed by
Poojawa
parent
088f3fda5d
commit
dad2d44ea2
@@ -43,9 +43,7 @@
|
||||
|
||||
/datum/brain_trauma/mild/dumbness/on_gain()
|
||||
owner.add_trait(TRAIT_DUMB, TRAUMA_TRAIT)
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, owner)
|
||||
if(mood)
|
||||
mood.add_event("dumb", /datum/mood_event/oblivious)
|
||||
owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious)
|
||||
..()
|
||||
|
||||
/datum/brain_trauma/mild/dumbness/on_life()
|
||||
@@ -59,9 +57,7 @@
|
||||
/datum/brain_trauma/mild/dumbness/on_lose()
|
||||
owner.remove_trait(TRAIT_DUMB, TRAUMA_TRAIT)
|
||||
owner.derpspeech = 0
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, owner)
|
||||
if(mood)
|
||||
mood.clear_event("dumb")
|
||||
owner.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "dumb")
|
||||
..()
|
||||
|
||||
/datum/brain_trauma/mild/speech_impediment
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/datum/component/beauty
|
||||
var/beauty = 0
|
||||
|
||||
/datum/component/beauty/Initialize(beautyamount)
|
||||
if(!ismovableatom(parent))
|
||||
. = COMPONENT_INCOMPATIBLE
|
||||
CRASH("Someone put a beauty component on a non-atom/movable, not everything can be pretty.")
|
||||
beauty = beautyamount
|
||||
RegisterSignal(COMSIG_ENTER_AREA, .proc/enter_area)
|
||||
RegisterSignal(COMSIG_EXIT_AREA, .proc/exit_area)
|
||||
var/area/A = get_area(parent)
|
||||
if(!A || A.outdoors)
|
||||
return
|
||||
A.totalbeauty += beauty
|
||||
A.update_beauty()
|
||||
|
||||
/datum/component/beauty/proc/enter_area(area/A)
|
||||
if(A.outdoors) //Fuck the outside.
|
||||
return FALSE
|
||||
A.totalbeauty += beauty
|
||||
A.update_beauty()
|
||||
|
||||
/datum/component/beauty/proc/exit_area(area/A)
|
||||
if(A.outdoors) //Fuck the outside.
|
||||
return FALSE
|
||||
A.totalbeauty -= beauty
|
||||
A.update_beauty()
|
||||
|
||||
/datum/component/beauty/Destroy()
|
||||
. = ..()
|
||||
var/area/A = get_area(parent)
|
||||
if(!A || A.outdoors)
|
||||
return
|
||||
A.totalbeauty -= beauty
|
||||
A.update_beauty()
|
||||
+117
-20
@@ -1,10 +1,12 @@
|
||||
/datum/component/mood
|
||||
var/mood //Real happiness
|
||||
var/sanity = 100 //Current sanity
|
||||
var/shown_mood //Shown happiness, this is what others can see when they try to examine you, prevents antag checking by noticing traitors are always very happy.
|
||||
var/mood_level //To track what stage of moodies they're on
|
||||
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/datum/looping_sound/reverse_bear_trap/slow/soundloop //Insanity ticking
|
||||
|
||||
/datum/component/mood/Initialize()
|
||||
if(!isliving(parent))
|
||||
@@ -12,16 +14,61 @@
|
||||
CRASH("Some good for nothing loser put a mood component on something that isn't even a living mob.")
|
||||
START_PROCESSING(SSmood, src)
|
||||
owner = parent
|
||||
soundloop = new(list(owner), FALSE, TRUE)
|
||||
RegisterSignal(COMSIG_ADD_MOOD_EVENT, .proc/add_event)
|
||||
RegisterSignal(COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
|
||||
RegisterSignal(COMSIG_ENTER_AREA, .proc/update_beauty)
|
||||
|
||||
/datum/component/mood/Destroy()
|
||||
STOP_PROCESSING(SSmood, src)
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
/datum/component/mood/proc/print_mood()
|
||||
var/msg = "<span class='info'>*---------*\n<EM>Your current mood</EM>\n"
|
||||
for(var/i in mood_events)
|
||||
var/datum/mood_event/event = mood_events[i]
|
||||
msg += event.description
|
||||
msg += "<span class='notice'>My mental status: </span>" //Long term
|
||||
switch(sanity)
|
||||
if(SANITY_GREAT to INFINITY)
|
||||
msg += "<span class='nicegreen'>My mind feels like a temple!<span>\n"
|
||||
if(SANITY_NEUTRAL to SANITY_GREAT)
|
||||
msg += "<span class='nicegreen'>I have been feeling great lately!<span>\n"
|
||||
if(SANITY_DISTURBED to SANITY_NEUTRAL)
|
||||
msg += "<span class='nicegreen'>I have felt quite decent lately.<span>\n"
|
||||
if(SANITY_UNSTABLE to SANITY_DISTURBED)
|
||||
msg += "<span class='warning'>I'm feeling a little bit unhinged...</span>\n"
|
||||
if(SANITY_CRAZY to SANITY_UNSTABLE)
|
||||
msg += "<span class='boldwarning'>I'm freaking out!!</span>\n"
|
||||
if(SANITY_INSANE to SANITY_CRAZY)
|
||||
msg += "<span class='boldwarning'>AHAHAHAHAHAHAHAHAHAH!!</span>\n"
|
||||
|
||||
msg += "<span class='notice'>My current mood: </span>" //Short term
|
||||
switch(mood_level)
|
||||
if(1)
|
||||
msg += "<span class='boldwarning'>I wish I was dead!<span>\n"
|
||||
if(2)
|
||||
msg += "<span class='boldwarning'>I feel terrible...<span>\n"
|
||||
if(3)
|
||||
msg += "<span class='boldwarning'>I feel very upset.<span>\n"
|
||||
if(4)
|
||||
msg += "<span class='boldwarning'>I'm a bit sad.<span>\n"
|
||||
if(5)
|
||||
msg += "<span class='nicegreen'>I'm alright.<span>\n"
|
||||
if(6)
|
||||
msg += "<span class='nicegreen'>I feel pretty okay.<span>\n"
|
||||
if(7)
|
||||
msg += "<span class='nicegreen'>I feel pretty good.<span>\n"
|
||||
if(8)
|
||||
msg += "<span class='nicegreen'>I feel amazing!<span>\n"
|
||||
if(9)
|
||||
msg += "<span class='nicegreen'>I love life!<span>\n"
|
||||
|
||||
msg += "<span class='notice'>Moodlets:\n</span>"//All moodlets
|
||||
if(mood_events.len)
|
||||
for(var/i in mood_events)
|
||||
var/datum/mood_event/event = mood_events[i]
|
||||
msg += event.description
|
||||
else
|
||||
msg += "<span class='nicegreen'>Nothing special has happend to me lately!<span>\n"
|
||||
to_chat(owner, msg)
|
||||
|
||||
/datum/component/mood/proc/update_mood() //Called whenever a mood event is added or removed
|
||||
@@ -54,41 +101,87 @@
|
||||
mood_level = 8
|
||||
if(MOOD_LEVEL_HAPPY4 to INFINITY)
|
||||
mood_level = 9
|
||||
update_mood_icon()
|
||||
|
||||
|
||||
/datum/component/mood/proc/update_mood_icon()
|
||||
if(owner.client && owner.hud_used)
|
||||
owner.hud_used.mood.icon_state = "mood[mood_level]"
|
||||
if(sanity < 25)
|
||||
owner.hud_used.mood.icon_state = "mood_insane"
|
||||
else
|
||||
owner.hud_used.mood.icon_state = "mood[mood_level]"
|
||||
|
||||
/datum/component/mood/process() //Called on SSmood process
|
||||
switch(mood)
|
||||
if(-INFINITY to MOOD_LEVEL_SAD4)
|
||||
switch(sanity)
|
||||
if(SANITY_INSANE to SANITY_CRAZY)
|
||||
owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 3)
|
||||
if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3)
|
||||
update_mood_icon()
|
||||
if(prob(7))
|
||||
owner.playsound_local(null, pick(CREEPY_SOUNDS), 100, 1)
|
||||
soundloop.start()
|
||||
if(SANITY_INSANE to SANITY_UNSTABLE)
|
||||
owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 2)
|
||||
if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2)
|
||||
if(prob(3))
|
||||
owner.playsound_local(null, pick(CREEPY_SOUNDS), 60, 1)
|
||||
soundloop.stop()
|
||||
if(SANITY_UNSTABLE to SANITY_DISTURBED)
|
||||
owner.overlay_fullscreen("depression", /obj/screen/fullscreen/depression, 1)
|
||||
if(MOOD_LEVEL_SAD2 to INFINITY)
|
||||
soundloop.stop()
|
||||
if(SANITY_DISTURBED to SANITY_GREAT)
|
||||
owner.clear_fullscreen("depression")
|
||||
soundloop.stop()
|
||||
|
||||
switch(mood_level)
|
||||
if(1)
|
||||
DecreaseSanity(0.4)
|
||||
if(2)
|
||||
DecreaseSanity(0.25)
|
||||
if(3)
|
||||
DecreaseSanity(0.15)
|
||||
if(4)
|
||||
DecreaseSanity(0.05)
|
||||
if(5)
|
||||
IncreaseSanity(0.1)
|
||||
if(6)
|
||||
IncreaseSanity(0.15)
|
||||
if(7)
|
||||
IncreaseSanity(0.20)
|
||||
if(8)
|
||||
IncreaseSanity(0.25, 125)
|
||||
if(9)
|
||||
IncreaseSanity(0.4, 125)
|
||||
|
||||
if(owner.has_trait(TRAIT_DEPRESSION))
|
||||
if(prob(0.1))
|
||||
if(prob(0.05))
|
||||
add_event("depression", /datum/mood_event/depression)
|
||||
clear_event("jolly")
|
||||
if(owner.has_trait(TRAIT_JOLLY))
|
||||
if(prob(0.1))
|
||||
if(prob(0.05))
|
||||
add_event("jolly", /datum/mood_event/jolly)
|
||||
clear_event("depression")
|
||||
|
||||
var/area/A = get_area(owner)
|
||||
if(A)
|
||||
update_beauty(A)
|
||||
|
||||
/datum/component/mood/proc/DecreaseSanity(amount)
|
||||
sanity = max(0, sanity - amount)
|
||||
|
||||
/datum/component/mood/proc/IncreaseSanity(amount, limit = 99)
|
||||
if(sanity > limit)
|
||||
DecreaseSanity(-0.5) //Removes some sanity to go back to our current limit.
|
||||
else
|
||||
sanity = min(limit, sanity + amount)
|
||||
|
||||
/datum/component/mood/proc/add_event(category, type, param) //Category will override any events in the same category, should be unique unless the event is based on the same thing like hunger.
|
||||
var/datum/mood_event/the_event
|
||||
if(mood_events[category])
|
||||
the_event = mood_events[category]
|
||||
if(the_event.type != type)
|
||||
clear_event(category)
|
||||
return .()
|
||||
else
|
||||
return 0 //Don't have to update the event.
|
||||
else
|
||||
the_event = new type(src, param)
|
||||
the_event = new type(src, param)
|
||||
|
||||
mood_events[category] = the_event
|
||||
update_mood()
|
||||
@@ -105,18 +198,22 @@
|
||||
qdel(event)
|
||||
update_mood()
|
||||
|
||||
/datum/component/mood/proc/update_beauty(var/area/A)
|
||||
/datum/component/mood/proc/update_beauty(area/A)
|
||||
if(A.outdoors) //if we're outside, we don't care.
|
||||
clear_event("area_beauty")
|
||||
return FALSE
|
||||
switch(A.beauty)
|
||||
if(-INFINITY to BEAUTY_LEVEL_HORRID)
|
||||
add_event("area_beauty", /datum/mood_event/disgustingroom)
|
||||
add_event("area_beauty", /datum/mood_event/horridroom)
|
||||
if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD)
|
||||
add_event("area_beauty", /datum/mood_event/grossroom)
|
||||
if(BEAUTY_LEVEL_BAD to BEAUTY_LEVEL_GOOD)
|
||||
add_event("area_beauty", /datum/mood_event/badroom)
|
||||
if(BEAUTY_LEVEL_BAD to BEAUTY_LEVEL_MEH)
|
||||
add_event("area_beauty", /datum/mood_event/mehroom)
|
||||
if(BEAUTY_LEVEL_MEH to BEAUTY_LEVEL_DECENT)
|
||||
clear_event("area_beauty")
|
||||
if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD)
|
||||
add_event("area_beauty", /datum/mood_event/decentroom)
|
||||
if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT)
|
||||
add_event("area_beauty", /datum/mood_event/niceroom)
|
||||
add_event("area_beauty", /datum/mood_event/goodroom)
|
||||
if(BEAUTY_LEVEL_GREAT to INFINITY)
|
||||
add_event("area_beauty", /datum/mood_event/greatroom)
|
||||
|
||||
@@ -41,6 +41,12 @@
|
||||
mid_length = 3.5
|
||||
volume = 25
|
||||
|
||||
/datum/looping_sound/reverse_bear_trap/slow
|
||||
mid_sounds = list('sound/effects/clock_tick.ogg')
|
||||
mid_length = 10
|
||||
volume = 40
|
||||
|
||||
|
||||
/datum/looping_sound/reverse_bear_trap_beep
|
||||
mid_sounds = list('sound/machines/beep.ogg')
|
||||
mid_length = 60
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/datum/mood_event/horridroom
|
||||
description = "<span class='boldwarning'>This room looks terrible!</span>\n"
|
||||
mood_change = -5
|
||||
|
||||
/datum/mood_event/badroom
|
||||
description = "<span class='warning'>This room looks really bad.</span>\n"
|
||||
mood_change = -3
|
||||
|
||||
/datum/mood_event/mehroom
|
||||
description = "<span class='warning'>This room doesn't look great.</span>\n"
|
||||
mood_change = -1
|
||||
|
||||
/datum/mood_event/decentroom
|
||||
description = "<span class='nicegreen'>This room looks alright.</span>\n"
|
||||
mood_change = 2
|
||||
|
||||
/datum/mood_event/goodroom
|
||||
description = "<span class='nicegreen'>This room looks really pretty!</span>\n"
|
||||
mood_change = 4
|
||||
|
||||
/datum/mood_event/greatroom
|
||||
description = "<span class='nicegreen'>This room is beautiful!</span>\n"
|
||||
mood_change = 7
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
/datum/mood_event/depression
|
||||
description = "<span class='warning'>I feel sad for no particular reason.</span>\n"
|
||||
mood_change = -6
|
||||
mood_change = -9
|
||||
timeout = 1200
|
||||
|
||||
/datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
/datum/mood_event/noshoes
|
||||
description = "<span class='warning'>I am a disgrace to comedy everywhere!</span>\n"
|
||||
mood_change = -3
|
||||
mood_change = -5
|
||||
|
||||
/datum/mood_event/tased
|
||||
description = "<span class='warning'>There's no \"z\" in \"taser\". It's in the zap.</span>\n"
|
||||
@@ -73,13 +73,22 @@
|
||||
|
||||
/datum/mood_event/embedded
|
||||
description = "<span class='boldwarning'>Pull it out!</span>\n"
|
||||
mood_change = -6
|
||||
mood_change = -7
|
||||
|
||||
/datum/mood_event/table
|
||||
description = "<span class='warning'>Someone threw me on a table!</span>\n"
|
||||
mood_change = -2
|
||||
timeout = 1200
|
||||
|
||||
/datum/mood_event/table/add_effects()
|
||||
if(ishuman(owner))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(iscatperson(H))
|
||||
H.startTailWag()
|
||||
addtimer(CALLBACK(H, /mob/living/carbon/human.proc/endTailWag), 30)
|
||||
description = "<span class='nicegreen'>They want to play on the table!</span>\n"
|
||||
mood_change = 2
|
||||
|
||||
/datum/mood_event/brain_damage
|
||||
mood_change = -3
|
||||
|
||||
@@ -96,15 +105,6 @@
|
||||
mood_change = -3
|
||||
timeout = 3000
|
||||
|
||||
|
||||
/datum/mood_event/grossroom
|
||||
description = "<span class='warning'>This room is kind of dirty...</span>\n"
|
||||
mood_change = -3
|
||||
|
||||
/datum/mood_event/disgustingroom
|
||||
description = "<span class='warning'>This room is disgusting!</span>\n"
|
||||
mood_change = -5
|
||||
|
||||
//These are unused so far but I want to remember them to use them later
|
||||
/datum/mood_event/cloned_corpse
|
||||
description = "<span class='boldwarning'>I recently saw my own corpse...</span>\n"
|
||||
|
||||
@@ -37,11 +37,6 @@
|
||||
description = "<span class='nicegreen'>What a lovely day.</span>\n"
|
||||
mood_change = 3
|
||||
|
||||
/datum/mood_event/happytable
|
||||
description = "<span class='nicegreen'>They want to play on the table!</span>\n"
|
||||
mood_change = 2
|
||||
timeout = 1200
|
||||
|
||||
/datum/mood_event/jolly
|
||||
description = "<span class='nicegreen'>I feel happy for no particular reason.</span>\n"
|
||||
mood_change = 6
|
||||
@@ -61,11 +56,3 @@
|
||||
description = "<span class='nicegreen'>I have seen the truth, praise the almighty one!</span>\n"
|
||||
mood_change = 40 //maybe being a cultist isnt that bad after all
|
||||
hidden = TRUE
|
||||
|
||||
/datum/mood_event/niceroom
|
||||
description = "<span class='nicegreen'>This room looks really pretty!</span>\n"
|
||||
mood_change = 4
|
||||
|
||||
/datum/mood_event/greatroom
|
||||
description = "<span class='nicegreen'>This room is beautiful!</span>\n"
|
||||
mood_change = 7
|
||||
|
||||
@@ -11,9 +11,7 @@
|
||||
owner.visible_message("<span class='danger'>[owner] starts having a seizure!</span>", "<span class='userdanger'>You have a seizure!</span>")
|
||||
owner.Unconscious(200)
|
||||
owner.Jitter(1000)
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, owner)
|
||||
if(mood)
|
||||
mood.add_event("epilepsy", /datum/mood_event/epilepsy)
|
||||
owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy)
|
||||
addtimer(CALLBACK(src, .proc/jitter_less, owner), 90)
|
||||
|
||||
/datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner)
|
||||
|
||||
@@ -14,9 +14,7 @@
|
||||
owner.add_trait(TRAIT_STUNIMMUNE, TRAIT_HULK)
|
||||
owner.add_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK)
|
||||
owner.update_body_parts()
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, owner)
|
||||
if(mood)
|
||||
mood.add_event("hulk", /datum/mood_event/hulk)
|
||||
owner.SendSignal(COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk)
|
||||
|
||||
/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity)
|
||||
if(proximity) //no telekinetic hulk attack
|
||||
@@ -33,10 +31,8 @@
|
||||
owner.remove_trait(TRAIT_STUNIMMUNE, TRAIT_HULK)
|
||||
owner.remove_trait(TRAIT_PUSHIMMUNE, TRAIT_HULK)
|
||||
owner.update_body_parts()
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, owner)
|
||||
if(mood)
|
||||
mood.clear_event("hulk")
|
||||
|
||||
owner.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hulk")
|
||||
|
||||
/datum/mutation/human/hulk/say_mod(message)
|
||||
if(message)
|
||||
message = "[uppertext(replacetext(message, ".", "!"))]!!"
|
||||
|
||||
Reference in New Issue
Block a user