summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/town_cmd.cpp70
1 files changed, 68 insertions, 2 deletions
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp
index cc0b8d416..d86e4c774 100644
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -54,6 +54,11 @@ static void TownPoolNewBlock(uint start_item)
/* Initialize the town-pool */
DEFINE_OLD_POOL(Town, Town, TownPoolNewBlock, NULL)
+/**
+ * Removes a specific town as well as all industries
+ * under its "juridiction"
+ * @param t Town to remove
+ */
void DestroyTown(Town *t)
{
Industry *i;
@@ -120,6 +125,11 @@ uint OriginalTileRandomiser(uint x, uint y)
return variant;
}
+/**
+ * House Tile drawing handler.
+ * Part of the tile loop process
+ * @param ti TileInfo of the tile to draw
+ */
static void DrawTile_Town(TileInfo *ti)
{
const DrawBuildingsTileStruct *dcts;
@@ -187,6 +197,12 @@ static Slope GetSlopeTileh_Town(TileIndex tile, Slope tileh)
return SLOPE_FLAT;
}
+/**
+ * Animate a tile for a town
+ * Only certain houses can be animated
+ * The newhouses animation superseeds regular ones
+ * @param tile TileIndex of the house to animate
+ */
static void AnimateTile_Town(TileIndex tile)
{
int pos, dest;
@@ -233,6 +249,12 @@ static void AnimateTile_Town(TileIndex tile)
static void UpdateTownRadius(Town *t);
+/**
+ * Determines if a town is close to a tile
+ * @param tile TileIndex of the tile to query
+ * @param dist maximum distance to be accepted
+ * @returns true if the tile correspond to the distance criteria
+ */
static bool IsCloseToTown(TileIndex tile, uint dist)
{
const Town* t;
@@ -243,6 +265,10 @@ static bool IsCloseToTown(TileIndex tile, uint dist)
return false;
}
+/**
+ * Marks the town sign as needing a repaint
+ * @param t Town requesting repaint
+ */
static void MarkTownSignDirty(Town *t)
{
MarkAllViewportsDirty(
@@ -253,6 +279,11 @@ static void MarkTownSignDirty(Town *t)
);
}
+/**
+ * Resize the sign(label) of the town after changes in
+ * population (creation or growth or else)
+ * @param t Town to update
+ */
void UpdateTownVirtCoord(Town *t)
{
Point pt;
@@ -266,6 +297,11 @@ void UpdateTownVirtCoord(Town *t)
MarkTownSignDirty(t);
}
+/**
+ * Change the towns population
+ * @param t Town which polulation has changed
+ * @param mod polulation change (can be positive or negative)
+ */
static void ChangePopulation(Town *t, int mod)
{
t->population += mod;
@@ -275,6 +311,11 @@ static void ChangePopulation(Town *t, int mod)
if (_town_sort_order & 2) _town_sort_dirty = true;
}
+/**
+ * Determines the world population
+ * Basically, count population of all towns, one by one
+ * @return uint32 the calculated population of the world
+ */
uint32 GetWorldPopulation()
{
uint32 pop;
@@ -285,15 +326,22 @@ uint32 GetWorldPopulation()
return pop;
}
+/**
+ * Helper function for house completion stages progression
+ * @param tile TileIndex of the house (or parts of it) to "grow"
+ */
static void MakeSingleHouseBigger(TileIndex tile)
{
assert(IsTileType(tile, MP_HOUSE));
+ /* means it is completed, get out. */
if (LiftHasDestination(tile)) return;
+ /* progress in construction stages */
IncHouseConstructionTick(tile);
if (GetHouseConstructionTick(tile) != 0) return;
+ /* Check and/or */
if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_CONSTRUCTION_STATE_CHANGE)) {
uint16 callback_res = GetHouseCallback(CBID_CONSTRUCTION_STATE_CHANGE, 0, GetHouseType(tile), GetTownByTile(tile), tile);
if (callback_res != CALLBACK_FAILED) ChangeHouseAnimationFrame(tile, callback_res);
@@ -307,6 +355,9 @@ static void MakeSingleHouseBigger(TileIndex tile)
MarkTileDirtyByTile(tile);
}
+/** Make the house advances in its construction stages until completion
+ * @param tile TileIndex of house
+ */
static void MakeTownHouseBigger(TileIndex tile)
{
uint flags = GetHouseSpecs(GetHouseType(tile))->building_flags;
@@ -316,6 +367,10 @@ static void MakeTownHouseBigger(TileIndex tile)
if (flags & BUILDING_HAS_4_TILES) MakeSingleHouseBigger(TILE_ADDXY(tile, 1, 1));
}
+/**
+ * Periodic tic handler for houses and town
+ * @param tile been asked to do its stuff
+ */
static void TileLoop_Town(TileIndex tile)
{
Town *t;
@@ -334,7 +389,11 @@ static void TileLoop_Town(TileIndex tile)
}
/* If the lift has a destination, it is already an animated tile. */
- if ((hs->building_flags & BUILDING_IS_ANIMATED) && house_id < NEW_HOUSE_OFFSET && !LiftHasDestination(tile) && CHANCE16(1, 2)) AddAnimatedTile(tile);
+ if ((hs->building_flags & BUILDING_IS_ANIMATED) &&
+ house_id < NEW_HOUSE_OFFSET &&
+ !LiftHasDestination(tile) &&
+ CHANCE16(1, 2))
+ AddAnimatedTile(tile);
t = GetTownByTile(tile);
@@ -362,7 +421,10 @@ static void TileLoop_Town(TileIndex tile)
_current_player = OWNER_TOWN;
- if (hs->building_flags & BUILDING_HAS_1_TILE && HASBIT(t->flags12, TOWN_IS_FUNDED) && CanDeleteHouse(tile) && --t->time_until_rebuild == 0) {
+ if (hs->building_flags & BUILDING_HAS_1_TILE &&
+ HASBIT(t->flags12, TOWN_IS_FUNDED) &&
+ CanDeleteHouse(tile) &&
+ --t->time_until_rebuild == 0) {
t->time_until_rebuild = GB(r, 16, 8) + 192;
ClearTownHouse(t, tile);
@@ -374,6 +436,10 @@ static void TileLoop_Town(TileIndex tile)
_current_player = OWNER_NONE;
}
+/**
+ * Unused handler
+ * @param tile unused
+ */
static void ClickTile_Town(TileIndex tile)
{
/* not used */