(svn r703) Attempt to improve the town growth algorithm - now it scales over 76 houses, is slightly exponential and travels further for larger towns.

This commit is contained in:
pasky 2004-11-20 11:57:45 +00:00
parent 32f69dab0e
commit bf6dace925
1 changed files with 31 additions and 14 deletions

View File

@ -666,7 +666,7 @@ static int GrowTownAtRoad(Town *t, uint tile)
TILE_ASSERT(tile);
// Number of times to search.
_grow_town_result = 20;
_grow_town_result = 10 + t->num_houses * 4 / 9;
do {
// Get a bitmask of the road blocks on a tile
@ -773,32 +773,46 @@ bool GrowTown(Town *t)
static void UpdateTownRadius(Town *t)
{
static const uint16 _town_radius_data[23][5] = {
{ 4, 0, 0, 0, 0},
{ 4, 0, 0, 0, 0}, // 0
{16, 0, 0, 0, 0},
{25, 0, 0, 0, 0},
{36, 0, 0, 0, 0},
{49, 0, 4, 0, 0},
{64, 0, 4, 0, 0},
{64, 0, 4, 0, 0}, // 20
{64, 0, 9, 0, 1},
{64, 0, 9, 0, 4},
{64, 0, 16, 0, 4},
{81, 0, 16, 0, 4},
{81, 0, 16, 0, 4},
{81, 0, 16, 0, 4}, // 40
{81, 0, 25, 0, 9},
{81, 36, 25, 0, 9},
{81, 36, 25, 16, 9},
{81, 49, 0, 25, 9},
{81, 64, 0, 25, 9},
{81, 64, 0, 25, 9}, // 60
{81, 64, 0, 36, 9},
{81, 64, 0, 36, 16},
{ 0, 81, 0, 49, 16},
{ 0, 81, 0, 49, 25},
{ 0,100, 0, 49, 25},
{ 0,100, 0, 64, 25},
{ 0,100, 0, 64, 36},
{100, 81, 0, 49, 16},
{100, 81, 0, 49, 25},
{121, 81, 0, 49, 25}, // 80
{121, 81, 0, 49, 25},
{121, 81, 0, 49, 36}, // 88
};
int i = min(t->num_houses, 88) >> 2;
memcpy(t->radius, _town_radius_data[i], sizeof(t->radius));
if (t->num_houses < 92) {
memcpy(t->radius, _town_radius_data[t->num_houses / 4], sizeof(t->radius));
} else {
int mass = t->num_houses / 8;
// At least very roughly extrapolate. Empirical numbers dancing between
// overwhelming by cottages and skyscrapers outskirts.
t->radius[0] = mass * mass;
// Actually we are proportional to sqrt() but that's right because
// we are covering an area.
t->radius[1] = mass * 7;
t->radius[2] = 0;
t->radius[3] = mass * 4;
t->radius[4] = mass * 3;
//debug("%d (->%d): %d %d %d %d\n", t->num_houses, mass, t->radius[0], t->radius[1], t->radius[3], t->radius[4]);
}
}
static void UpdateTownVirtCoord(Town *t)
@ -1598,8 +1612,11 @@ static void UpdateTownGrowRate(Town *t)
t->flags12 &= ~1;
if (t->fund_buildings_months != 0) {
static const byte _grow_count_values[6] = {
60, 60, 60, 50, 40, 30
};
m = _grow_count_values[min(n, 5)];
t->fund_buildings_months--;
m = 60;
} else if (n == 0) {
m = 160;
if (!CHANCE16(1, 12))
@ -1619,7 +1636,7 @@ static void UpdateTownGrowRate(Town *t)
return;
}
t->growth_rate = m;
t->growth_rate = m / (t->num_houses / 50 + 1);
if (m <= t->grow_counter)
t->grow_counter = m;