From: <geo...@us...> - 2009-06-08 01:15:53
|
Revision: 3111 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3111&view=rev Author: geoffthemedio Date: 2009-06-08 01:15:51 +0000 (Mon, 08 Jun 2009) Log Message: ----------- -Changed growth (death) formula for planet (popcenter) when health is less than 20, so that there is actually a significant dependence on rate of decay on health meter distance below 20. The particular formula was chosen to make the decay slow for values between 10 and 20, but increase rapidly as health approaches 0. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2009-06-06 02:29:04 UTC (rev 3110) +++ trunk/FreeOrion/universe/PopCenter.cpp 2009-06-08 01:15:51 UTC (rev 3111) @@ -79,7 +79,15 @@ } else if (cur_health == 20.0) { return 0.0; } else { // cur_health < 20.0 - return std::max(-cur_pop, -cur_pop*( exp( (cur_health-20)*(cur_health-20) / (400/log(2.0)) ) - 1 )); + // once squared, the fraction of population lost each turn. About 1% + // at 18 health, 25% at 10 health, 49% at 6 health, and 90% at 1 + // health. this gives a slight loss just below 20 health (the break- + // even point) but and doesn't get critically bad until health drops + // below 15 or so for extended periods, or below 12 for shorter + // periods. In any case, the loss is exponential decay, with a rate + // depending on the distance below full health. + double root_fraction = ((20.0 - cur_health) / 20.0); + return std::max(-cur_pop, -cur_pop*(root_fraction*root_fraction)); } } |
From: <geo...@us...> - 2009-10-19 07:19:49
|
Revision: 3226 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3226&view=rev Author: geoffthemedio Date: 2009-10-19 07:19:40 +0000 (Mon, 19 Oct 2009) Log Message: ----------- Fixed compile error Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2009-10-19 02:42:18 UTC (rev 3225) +++ trunk/FreeOrion/universe/PopCenter.cpp 2009-10-19 07:19:40 UTC (rev 3226) @@ -180,8 +180,6 @@ void PopCenter::PopGrowthProductionResearchPhase() { - assert(GetObjectSignal()); - Meter* pop = GetMeter(METER_POPULATION); Meter* health = GetMeter(METER_HEALTH); |
From: <geo...@us...> - 2009-11-01 18:15:41
|
Revision: 3254 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3254&view=rev Author: geoffthemedio Date: 2009-11-01 18:15:30 +0000 (Sun, 01 Nov 2009) Log Message: ----------- Fixed health meter growth prediction, which was inconsistent with actual health growth. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2009-11-01 06:08:26 UTC (rev 3253) +++ trunk/FreeOrion/universe/PopCenter.cpp 2009-11-01 18:15:30 UTC (rev 3254) @@ -123,7 +123,7 @@ { double max = GetMeter(METER_HEALTH)->Max(); double cur = GetMeter(METER_HEALTH)->Current(); - return std::min(max - cur, cur * (((max + 1.0) - cur) / (max + 1.0))); + return std::min(max - cur, 1.0); } double PopCenter::ProjectedCurrentMeter(MeterType type) const @@ -202,7 +202,7 @@ if (new_pop >= MINIMUM_POP_CENTER_POPULATION) { pop->SetCurrent(new_pop); - double health_delta = 1.0; + double health_delta = FutureHealthGrowth(); health->AdjustCurrent(health_delta); } else { // if population falls below threshold, fall completely to zero. |
From: <geo...@us...> - 2010-07-27 17:45:57
|
Revision: 3707 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3707&view=rev Author: geoffthemedio Date: 2010-07-27 17:45:51 +0000 (Tue, 27 Jul 2010) Log Message: ----------- (Hopefully) fixed issues with discrepancy between predicted and actual health growth being different and population growth not depending on health. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2010-07-27 08:03:06 UTC (rev 3706) +++ trunk/FreeOrion/universe/PopCenter.cpp 2010-07-27 17:45:51 UTC (rev 3707) @@ -79,8 +79,7 @@ } if (meter_type == METER_HEALTH) { - const Meter* target_meter = GetMeter(METER_TARGET_HEALTH); - return std::min(target_meter->Current(), meter->Current() + 1.0); + return meter->Current() + NextTurnHealthGrowth(); } else if (meter_type == METER_POPULATION) { return meter->Current() + NextTurnPopGrowth(); @@ -138,7 +137,7 @@ { double target_pop = std::max(GetMeter(METER_TARGET_POPULATION)->Current(), 1.0); // clamping target pop to at least 1 prevents divide by zero cases double cur_pop = GetMeter(METER_POPULATION)->Current(); - double cur_health = std::max(GetMeter(METER_HEALTH)->Current(), 120.0); // clamping current health to at most 120 prevents weird results with overpopulation decay health-dependence + double cur_health = std::min(GetMeter(METER_HEALTH)->Current(), 120.0); // clamping current health to at most 120 prevents weird results with overpopulation decay health-dependence // There are several factors that combine to produce the actual growth // or loss of population on a planet. |
From: <geo...@us...> - 2010-08-14 03:41:38
|
Revision: 3729 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3729&view=rev Author: geoffthemedio Date: 2010-08-14 03:41:31 +0000 (Sat, 14 Aug 2010) Log Message: ----------- Fixed issue where predicted change in planet food consumption was based on maximum possible population growth, rather than actual population growth, which depends on the current turn's food consumption. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2010-08-10 20:50:35 UTC (rev 3728) +++ trunk/FreeOrion/universe/PopCenter.cpp 2010-08-14 03:41:31 UTC (rev 3729) @@ -87,12 +87,13 @@ return meter->Current() + NextTurnPopGrowth(); } else if (meter_type == METER_FOOD_CONSUMPTION) { - // guesstimate food consumption next turn, and for full population - // growth, as a proportional increase in food consumption to the - // fractional increase in population that is possible. this could - // be an inaccurate estimate of next turn's food consumption, but - // it's the best estimate that can be made - double next_turn_max_pop_growth = this->NextTurnPopGrowthMax(); + // Guesstimate food consumption next turn. + // Assume an equal fractional increase in food consumption as the + // fractional increase in population that is expected (which depends on + // the current food allocation). + // this will be an accurate estimate of next turn's food consumption + // unless food consumption is not proportional to population + double next_turn_max_pop_growth = this->NextTurnPopGrowth(); double current_pop = std::max(MINIMUM_POP_CENTER_POPULATION, this->CurrentMeterValue(METER_POPULATION)); // floor to effective current population, to prevent overflow issues double fractional_growth = next_turn_max_pop_growth / current_pop; double expected_next_turn_food_consumption = this->CurrentMeterValue(METER_FOOD_CONSUMPTION) * (1.0 + fractional_growth); |
From: <geo...@us...> - 2010-10-02 07:13:29
|
Revision: 3804 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3804&view=rev Author: geoffthemedio Date: 2010-10-02 07:13:23 +0000 (Sat, 02 Oct 2010) Log Message: ----------- Added check in PopCenter::SetSpecies to avoid debug / error line when setting to no species. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2010-09-28 00:57:16 UTC (rev 3803) +++ trunk/FreeOrion/universe/PopCenter.cpp 2010-10-02 07:13:23 UTC (rev 3804) @@ -296,7 +296,7 @@ void PopCenter::SetSpecies(const std::string& species_name) { const Species* species = GetSpecies(species_name); - if (!species) { + if (!species && !species_name.empty()) { Logger().errorStream() << "PopCenter::SetSpecies couldn't get species with name " << species_name; } m_species_name = species_name; |
From: <geo...@us...> - 2012-04-01 08:53:55
|
Revision: 4778 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4778&view=rev Author: geoffthemedio Date: 2012-04-01 08:53:48 +0000 (Sun, 01 Apr 2012) Log Message: ----------- Fixed population growth. It now actually happens. The previous commit accidentally removed the bit of code that actually set the new population value during growth. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2012-04-01 06:49:06 UTC (rev 4777) +++ trunk/FreeOrion/universe/PopCenter.cpp 2012-04-01 08:53:48 UTC (rev 4778) @@ -18,16 +18,11 @@ PopCenter::PopCenter(const std::string& species_name) : m_species_name(species_name) -{ - //Logger().debugStream() << "PopCenter::PopCenter(" << species_name << ")"; - // TODO: if race isn't a valid race, throw a fit -} +{} PopCenter::PopCenter() : m_species_name("") -{ - //Logger().debugStream() << "PopCenter::PopCenter()"; -} +{} PopCenter::~PopCenter() {} @@ -84,9 +79,9 @@ } double PopCenter::NextTurnPopGrowth() const { - double target_pop = std::max(GetMeter(METER_TARGET_POPULATION)->Current(), 1.0); // clamping target pop to at least 1 prevents divide by zero cases + double target_pop = std::max(GetMeter(METER_TARGET_POPULATION)->Current(), 0.01); // clamping target pop to at least 1 prevents divide by zero cases double cur_pop = GetMeter(METER_POPULATION)->Current(); - + Logger().debugStream() << "pop: " << cur_pop << " / " << target_pop; double population_fraction = (target_pop - cur_pop) / target_pop; Logger().debugStream() << "pop frac: " << population_fraction; double change_potential = cur_pop * population_fraction * 0.05; @@ -107,9 +102,10 @@ double pop_growth = NextTurnPopGrowth(); // may be negative double new_pop = cur_pop + pop_growth; - //Logger().debugStream() << "Planet Pop: " << cur_pop << " growth: " << pop_growth; + Logger().debugStream() << "Planet Pop: " << cur_pop << " growth: " << pop_growth; if (new_pop >= MINIMUM_POP_CENTER_POPULATION) { + GetMeter(METER_POPULATION)->SetCurrent(new_pop); } else { // if population falls below threshold, kill off the remainder Reset(); |
From: <geo...@us...> - 2012-04-10 19:30:10
|
Revision: 4804 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4804&view=rev Author: geoffthemedio Date: 2012-04-10 19:30:04 +0000 (Tue, 10 Apr 2012) Log Message: ----------- Double planet population growth rate due to reports that it was too slow. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2012-04-10 00:04:36 UTC (rev 4803) +++ trunk/FreeOrion/universe/PopCenter.cpp 2012-04-10 19:30:04 UTC (rev 4804) @@ -84,7 +84,7 @@ Logger().debugStream() << "pop: " << cur_pop << " / " << target_pop; double population_fraction = (target_pop - cur_pop) / target_pop; Logger().debugStream() << "pop frac: " << population_fraction; - double change_potential = cur_pop * population_fraction * 0.05; + double change_potential = cur_pop * population_fraction * 0.1; Logger().debugStream() << "change potential: " << change_potential; double max_growth = target_pop - cur_pop; double max_loss = -cur_pop; |
From: <bi...@us...> - 2012-04-27 23:25:29
|
Revision: 4843 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4843&view=rev Author: bigjoe5 Date: 2012-04-27 23:25:22 +0000 (Fri, 27 Apr 2012) Log Message: ----------- -Added a small constant to growth rate to avoid current population asymptotically approaching target. Also made changes to prevent population dipping below target when slightly above target. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2012-04-26 17:58:30 UTC (rev 4842) +++ trunk/FreeOrion/universe/PopCenter.cpp 2012-04-27 23:25:22 UTC (rev 4843) @@ -84,15 +84,14 @@ Logger().debugStream() << "pop: " << cur_pop << " / " << target_pop; double population_fraction = (target_pop - cur_pop) / target_pop; Logger().debugStream() << "pop frac: " << population_fraction; - double change_potential = cur_pop * population_fraction * 0.1; + double change_potential = cur_pop * population_fraction * 0.1 + (target_pop > cur_pop ? 1 : -1) * 0.05; Logger().debugStream() << "change potential: " << change_potential; double max_growth = target_pop - cur_pop; - double max_loss = -cur_pop; double change = 0.0; if (change_potential > 0) change = std::min(max_growth, change_potential); else if (change_potential < 0) - change = std::max(max_loss, change_potential); + change = std::max(max_growth, change_potential); Logger().debugStream() << "pop change: " << change; return change; } |
From: <geo...@us...> - 2012-05-04 19:03:45
|
Revision: 4871 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4871&view=rev Author: geoffthemedio Date: 2012-05-04 19:03:38 +0000 (Fri, 04 May 2012) Log Message: ----------- Changed population growth formula to something that should be less prone to instant loss of all population when target drops to 0. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2012-05-04 15:13:49 UTC (rev 4870) +++ trunk/FreeOrion/universe/PopCenter.cpp 2012-05-04 19:03:38 UTC (rev 4871) @@ -79,21 +79,16 @@ } double PopCenter::NextTurnPopGrowth() const { - double target_pop = std::max(GetMeter(METER_TARGET_POPULATION)->Current(), 0.01); // clamping target pop to at least 1 prevents divide by zero cases + double target_pop = GetMeter(METER_TARGET_POPULATION)->Current(); double cur_pop = GetMeter(METER_POPULATION)->Current(); - Logger().debugStream() << "pop: " << cur_pop << " / " << target_pop; - double population_fraction = (target_pop - cur_pop) / target_pop; - Logger().debugStream() << "pop frac: " << population_fraction; - double change_potential = cur_pop * population_fraction * 0.1 + (target_pop > cur_pop ? 1 : -1) * 0.05; - Logger().debugStream() << "change potential: " << change_potential; - double max_growth = target_pop - cur_pop; - double change = 0.0; - if (change_potential > 0) - change = std::min(max_growth, change_potential); - else if (change_potential < 0) - change = std::max(max_growth, change_potential); - Logger().debugStream() << "pop change: " << change; - return change; + double pop_change = 0.0; + + if (target_pop > cur_pop) + pop_change = cur_pop * (target_pop - cur_pop) / 100; + else + pop_change = -(cur_pop - target_pop) / 10; + + return pop_change; } void PopCenter::PopCenterResetTargetMaxUnpairedMeters() |
From: <geo...@us...> - 2012-06-21 07:39:55
|
Revision: 4913 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4913&view=rev Author: geoffthemedio Date: 2012-06-21 07:39:44 +0000 (Thu, 21 Jun 2012) Log Message: ----------- Tweaked growth rate formulas to avoid growth / loss if population is zero, and because exponential decrease is fine for loss of population since there is already a minimum allowed PopCenter population limit. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2012-06-21 07:22:43 UTC (rev 4912) +++ trunk/FreeOrion/universe/PopCenter.cpp 2012-06-21 07:39:44 UTC (rev 4913) @@ -84,11 +84,10 @@ double pop_change = 0.0; if (target_pop > cur_pop) { - pop_change = cur_pop * (target_pop - cur_pop) / 100 + 0.05; // Adding a constant avoids slow asymptotic growth towards target. + pop_change = cur_pop * (target_pop + 1 - cur_pop) / 100; // Using target population slightly above actual population avoids excessively slow asymptotic growth towards target. pop_change = std::min(pop_change, target_pop - cur_pop); - } - else { - pop_change = -(cur_pop - target_pop) / 10 - 0.05; + } else { + pop_change = -(cur_pop - target_pop) / 10; pop_change = std::max(pop_change, target_pop - cur_pop); } |
From: <geo...@us...> - 2013-07-26 10:01:41
|
Revision: 6264 http://sourceforge.net/p/freeorion/code/6264 Author: geoffthemedio Date: 2013-07-26 10:01:35 +0000 (Fri, 26 Jul 2013) Log Message: ----------- Switched to slightly less general include; no apparent need for Planet.h rather than Meter.h. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2013-07-25 17:37:13 UTC (rev 6263) +++ trunk/FreeOrion/universe/PopCenter.cpp 2013-07-26 10:01:35 UTC (rev 6264) @@ -3,7 +3,7 @@ #include "../util/OptionsDB.h" #include "../util/Directories.h" #include "../util/Logger.h" -#include "Planet.h" +#include "Meter.h" #include <algorithm> #include <stdexcept> |
From: <geo...@us...> - 2013-07-27 04:22:42
|
Revision: 6268 http://sourceforge.net/p/freeorion/code/6268 Author: geoffthemedio Date: 2013-07-27 04:22:39 +0000 (Sat, 27 Jul 2013) Log Message: ----------- Modified PopCenter::Depopulate to not reset target meters, so that unpopulated planets that have meters set (from effects on special, for example) have these values sent to the clients, instead of having their values reset to 0, which would lead to the client thinking there is a client-server discrepancy after doing its own meter estimates that do include the special effect. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2013-07-26 12:11:30 UTC (rev 6267) +++ trunk/FreeOrion/universe/PopCenter.cpp 2013-07-27 04:22:39 UTC (rev 6268) @@ -125,8 +125,10 @@ m_species_name.clear(); } -void PopCenter::Depopulate() -{ PopCenter::Reset(); } +void PopCenter::Depopulate() { + GetMeter(METER_POPULATION)->Reset(); + GetMeter(METER_HAPPINESS)->Reset(); +} void PopCenter::SetSpecies(const std::string& species_name) { const Species* species = GetSpecies(species_name); |
From: <geo...@us...> - 2014-09-11 20:14:25
|
Revision: 7718 http://sourceforge.net/p/freeorion/code/7718 Author: geoffthemedio Date: 2014-09-11 20:14:20 +0000 (Thu, 11 Sep 2014) Log Message: ----------- Small patch by vincele removing redundant else if case. Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2014-09-11 19:48:48 UTC (rev 7717) +++ trunk/FreeOrion/universe/PopCenter.cpp 2014-09-11 20:14:20 UTC (rev 7718) @@ -87,11 +87,6 @@ return std::max(target_meter_value, current_meter_value - 1.0f); else return current_meter_value; - - } else if (meter_type == METER_TARGET_POPULATION) { - Logger().debugStream() << "PopCenter::PopCenterNextTurnMeterValue passed valid but unusual (TARGET) meter_type. Returning meter->Current()"; - return meter->Current(); - } else { Logger().errorStream() << "PopCenter::PopCenterNextTurnMeterValue dealing with invalid meter type"; return 0.0f; |