int CvCity::unhappyLevel(int iExtra)
{
int iAngerPercent;
int iUnhappiness;
int iI;
iUnhappiness = 0;
if (!isNoUnhappiness())
{
iAngerPercent = 0;
iAngerPercent += getOvercrowdingPercentAnger(iExtra);
iAngerPercent += getNoMilitaryPercentAnger();
iAngerPercent += getCulturePercentAnger();
iAngerPercent += getReligionPercentAnger();
iAngerPercent += getHurryPercentAnger();
iAngerPercent += getConscriptPercentAnger();
iAngerPercent += getWarWearinessPercentAnger();
for (iI = 0; iI < GC.getNumCivicInfos(); iI++)
{
iAngerPercent += GET_PLAYER(getOwnerINLINE()).getCivicPercentAnger((CivicTypes)iI);
}
iUnhappiness = ((iAngerPercent * (getPopulation() + iExtra)) / GC.getDefineINT("PERCENT_ANGER_DIVISOR"));
iUnhappiness -= min(0, getLargestCityHappiness());
iUnhappiness -= min(0, getMilitaryHappiness());
iUnhappiness -= min(0, getCurrentStateReligionHappiness());
iUnhappiness -= min(0, getBuildingBadHappiness());
iUnhappiness -= min(0, getExtraBuildingBadHappiness());
iUnhappiness -= min(0, getFeatureBadHappiness());
iUnhappiness -= min(0, getBonusBadHappiness());
iUnhappiness -= min(0, getReligionBadHappiness());
iUnhappiness -= min(0, getCommerceHappiness());
iUnhappiness -= min(0, area()->getBuildingHappiness(getOwnerINLINE()));
iUnhappiness -= min(0, GET_PLAYER(getOwnerINLINE()).getBuildingHappiness());
iUnhappiness -= min(0, (getExtraHappiness() + GET_PLAYER(getOwnerINLINE()).getExtraHappiness()));
iUnhappiness -= min(0, GC.getHandicapInfo(getHandicapType()).getHappyBonus());
}
return max(0, iUnhappiness);
}