Populace is far too fickle / easy to persuade

Yeah, final happiness should be something like:
0.5 + (happiness factors - unhappiness factors)/2*|sum of factors| + cynicism + complacency.

Example:
Happiness from everything is 120%
Unhappiness from everything is 90%
Effective happiness: (120-90)/2*(120+90) = 30/420 = 0.07
Without complacency and cynicism approval rate of that voter group would be 0.57.

Another example:
Happiness - 1000%
Unhappiness - 100%
(happiness factors - unhappiness factors)/|sum of factors| = (1000 - 100)/2*(1000 + 100) = 900/2200 = 0.41
Final approval rate: 0.91, that value will be pushed down by complacency.

Complacency and cynicism then would easily moderate approval rate.

Currently it seems to be like:
0.5 + happiness factors - unhappiness factors + cynicism + complacency
clamped between 0 and 1.

If there is division by zero with (happiness factors - unhappiness factors)/|sum of factors|, then set it to 0.
That is if nothing affects happiness of voter group except default value, cynicism and complacency, then normalization factor would be set to 1.

This is why when you have lots of policies its harder to change their approval rate :smiley:
After adding normalization approval will be always easily changeable especially if its very low or very high.

EDIT:
Very similar thing happens with voter approval rate: looks like its weighted sum of influence*opinion, that is clamped between -1 and 1.
It should be weighted average instead.
This way you never would get someone with 100% approval rate - 90% happiness in one category would mean less than 100% approval rate.
Similarly 0% approval rate would be impossible to get too.

I turned UK into NK - all you need maxed out support and volume of 4 - 5 voter groups to have high approval despite zero approval of all other voter groups.