I'd like to propose a different way of happiness working entirely.
Right now, Happy, Content, Angry, whatever is just tied to an overall number, and that's why the changes we see in dwarves are so dramatic.
Happiness shouldn't directly reflect their mood state though. Mood states should be exist by themselves, and changes in mood state should be based on a number of factors like:
-Time
-Personality
-Further - or + inputs
So it would look like this.
[ANGRY] 0
[UPSET]
[UNHAPPY]
[OK] 125
[CONTENT]
[HAPPY]
[ECSTATIC] 255
Are the mood states. Dwarves still have a happiness score. The game tries to equalize their mood state with their happiness score by comparing the two and asking "Should there be a change?"
If yes, it asks "How big of a change?" and looks at the most recent group of inputs. It measures how long ago they occurred, adjusts for that and totals the sum.
It then applies the dwarves' personality, and adjust inputs accordingly, increasing the impact of some inputs while ignoring others.
The final total represents the magnitude of the shift from one mood state to another.
So you have Urist McEverydwaft, who is OK, with 125 Happiness.
His events are:
He was attacked. -10
His friend died. -30
His pet died. -20
His pet goes unburied. -20
He eats a good meal. +10
He drinks a good drink. +10
He sleeps in an ok room. 0
All these events happened in the most recent calc cycle, so they get full value. Urist McEverydwarf is totally average (for the sake of simplifying), and none of these values get adjusted further by his personality.
So it's a net loss of 60. He's now at 65 happiness total.
The game checks. 125 becomes 65. Yes, there should be a shift. Urist McEverydwarf is now unhappy.
On the next calc cycle (say every Dwarf Mode day), the list looks like this.
He was attacked. -5
His friend died. -25
His pet died. -15
His pet was unburied. -15
He ate a good meal. +5
He drinks a good drink. +5
He slept in an ok room. 0
He admired some great art. +10
He was comforted by an animal in a cage. +5
He talked with a good friend. +10
The italicized events are older events, and they have a reduced impact on happiness that they once had. Urist McEverydwarf, for this calc, loses 25 happiness, putting him at 40 happiness.
The game checks. Urist should be at Upset, but he only lost a further 25 happiness and the magnitude of change isn't great enough to warrant a further shift. (Plus there are no personality traits to factor in.)
So Urist's happiness is lower than it was last calc, but it didn't drop dramatically enough to make him get really really upset. Of course, if more bad things than good things happen..or if he doesn't get enough happiness to make him forget all the really bad things that continue to hang on his soul...he may skip several levels of unhappiness and just go straight to angry in the next calc cycle.
I think this better captures the ebb and flow of emotions like real life better than a simple meter which becomes all too easy to max out. It takes into account long-term, major life events whose negative (or positive impact) degrades slowly rather than being applied once and forgotten.
It also gives Toady another state to play off of, [MOOD STATE], which can be worked further into Strange Moods or other events.
Personality traits could directly alter the value/depreciation of happiness inputs.
So a dwarf who "Doesn't really care about anything anymore" might adjust ALL inputs to lose -50% value in every cycle. So no matter if a friend died, or they became elected mayor, how happy or unhappy that makes them over time is less than other dwarves, and they'll get over EVERYTHING quicker. But they'll still be vulnerable to becoming unhappy if enough bad stuff occurs at once.