void CvCity::doLbD()
{
//getting global values for formula
int base_chance_expert = GC.getLBD_BASE_CHANCE_EXPERT();
int chance_increase_expert = GC.getLBD_CHANCE_INCREASE_EXPERT();
int pre_rounds_expert = GC.getLBD_PRE_ROUNDS_EXPERT();
int chance_increase_expert_from_teacher = GC.getLBD_CHANCE_INCREASE_EXPERT_FROM_TEACHER(); // WTP, ray, teacher addon for LbD
int pre_rounds_expert_decrease_from_teacher = GC.getLBD_PRE_ROUNDS_EXPERT_DECREASE_FROM_TEACHER(); // WTP, ray, teacher addon for LbD
int base_chance_free = GC.getLBD_BASE_CHANCE_FREE();
int chance_increase_free = GC.getLBD_CHANCE_INCREASE_FREE();
int pre_rounds_free = GC.getLBD_PRE_ROUNDS_FREE();
int mod_free_criminal = GC.getLBD_CHANCE_MOD_FREE_CRIMINAL();
int mod_free_servant = GC.getLBD_CHANCE_MOD_FREE_SERVANT();
int base_chance_escape = GC.getLBD_CHANCE_ESCAPE();
int mod_escape_criminal = GC.getLBD_CHANCE_MOD_ESCAPE_CRIMINAL();
int mod_escape_servant = GC.getLBD_CHANCE_MOD_ESCAPE_SERVANT();
// WTP, ray, LbD Slaves Revolt and Free - START
int base_chance_revolt = GC.getLBD_CHANCE_REVOLT();
int mod_revolt_slave = GC.getLBD_CHANCE_MOD_REVOLT_SLAVE();
int mod_revolt_criminal = GC.getLBD_CHANCE_MOD_REVOLT_CRIMINAL();
// WTP, ray, LbD Slaves Revolt and Free - END
//getting GameSpeedModifiert in percent
int train_percent = GC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getTrainPercent();
//moddifying values with GameSpeed
chance_increase_expert = chance_increase_expert / train_percent / 100;
pre_rounds_expert = pre_rounds_expert * train_percent / 100;
chance_increase_expert_from_teacher = chance_increase_expert_from_teacher * train_percent / 100;
pre_rounds_expert_decrease_from_teacher = pre_rounds_expert_decrease_from_teacher * train_percent / 100;
chance_increase_free = chance_increase_free / train_percent / 100;
pre_rounds_free = pre_rounds_free * train_percent / 100;
// WTP, ray, Happiness - START
// we now calculate and apply Happiness vs. Unhappiness on it
int iCityHappiness = getCityHappiness();
int iCityUnHappiness = getCityUnHappiness();
// this is the percentage rate we apply for positive features - it may become negative but that is intended
int iPosHappinessBalance = iCityHappiness - iCityUnHappiness;
// become expert Happiness vs Unhappiness modification
base_chance_expert = base_chance_expert + (iPosHappinessBalance / 5); // chances are increased for positive values iPosHappinessBalance, decreased for negative values iPosHappinessBalance
chance_increase_expert = chance_increase_expert + (iPosHappinessBalance / 5); // chances are increased for positive values iPosHappinessBalance, decreased for negative values iPosHappinessBalance
pre_rounds_expert = pre_rounds_expert * (100 - iPosHappinessBalance) / 100; // pre rounds experts is shortened
// become free Happiness vs Unhappiness modification
base_chance_free = base_chance_free + (iPosHappinessBalance / 5); // chances are increased for positive values iPosHappinessBalance, decreased for negative values iPosHappinessBalance
chance_increase_free = chance_increase_free + (iPosHappinessBalance / 5); // chances are increased for positive values iPosHappinessBalance, decreased for negative values iPosHappinessBalance
pre_rounds_free = pre_rounds_free * (100 - iPosHappinessBalance) / 100; // pre rounds free is shortened
// this is the percentage rate we apply for negative features - it may become negative but that is intended
int iNegHappinessBalance = iCityUnHappiness - iCityHappiness;
// escape and revolt Unhappiness vs Happiness modification
base_chance_escape = base_chance_escape + (iNegHappinessBalance / 5); // chances are increased for positive values iNegHappinessBalance, decreased for negative values iNegHappinessBalance
base_chance_revolt = base_chance_revolt + (iNegHappinessBalance / 5); // chances are increased for positive values iNegHappinessBalance, decreased for negative values iNegHappinessBalance
// WTP, ray, Happiness - END
// loop through units
for (uint i = 0; i < m_aPopulationUnits.size(); ++i)
{
CvUnit* pLoopUnit = m_aPopulationUnits;
bool lbd_expert_successful = false;
bool lbd_free_successful = false;
bool lbd_escape_successful = false;
bool lbd_revolt_successful = false; // WTP, ray, LbD Slaves Revolt and Free - START
// only do something for this unit if the profession does use LbD
if (pLoopUnit->getProfession()!= NO_PROFESSION && GC.getProfessionInfo(pLoopUnit->getProfession()).LbD_isUsed())
{
//get LearnLevel of profession
int learn_level = GC.getProfessionInfo(pLoopUnit->getProfession()).LbD_getLearnLevel();
// just for safety, catch possible XML mistakes which might break calculation
if (learn_level == 0)
{
learn_level = 1;
}
// try to become expert if poosible
if(pLoopUnit->getUnitInfo().LbD_canBecomeExpert())
{
// WTP, ray, teacher addon for LbD
// adjusted method call with new teacher attributes
lbd_expert_successful = LbD_try_become_expert(pLoopUnit, base_chance_expert, chance_increase_expert, pre_rounds_expert, learn_level, chance_increase_expert_from_teacher, pre_rounds_expert_decrease_from_teacher);
}
// try to become free if poosible
if(pLoopUnit->getUnitInfo().LbD_canGetFree() && !lbd_expert_successful)
{
lbd_free_successful = LbD_try_get_free(pLoopUnit, base_chance_free, chance_increase_free, pre_rounds_free, mod_free_criminal, mod_free_servant, learn_level);
}
// try to escape if free unsuccesful and escape possible
if(pLoopUnit->getUnitInfo().LbD_canEscape() && !lbd_free_successful && !lbd_expert_successful)
{
lbd_escape_successful = LbD_try_escape(pLoopUnit, base_chance_escape, mod_escape_criminal, mod_escape_servant);
}
// WTP, ray, LbD Slaves Revolt and Free - START
// try to revolt if escape revolt possible and free unsuccessful and escape unsuccessufl
if(pLoopUnit->getUnitInfo().LbD_canRevolt() && !lbd_escape_successful && !lbd_free_successful && !lbd_expert_successful)
{
lbd_revolt_successful = LbD_try_revolt(pLoopUnit, base_chance_revolt, mod_revolt_criminal, mod_revolt_slave);
}
// WTP, ray, LbD Slaves Revolt and Free - END
}
}
}
// TAC - LbD - Ray - END