mirror of https://github.com/OpenTTD/OpenTTD
(svn r15755) -Fix: Number of houses in house variables 0x44, 0x60 and 0x61 were incorrect after 0xFF had been reached and could desync clients joining afterwards.
parent
ef28042bf1
commit
c7345c6db0
|
@ -22,7 +22,7 @@
|
||||||
#include "animated_tile_func.h"
|
#include "animated_tile_func.h"
|
||||||
#include "company_base.h"
|
#include "company_base.h"
|
||||||
|
|
||||||
static BuildingCounts _building_counts;
|
static BuildingCounts<uint32> _building_counts;
|
||||||
static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX];
|
static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX];
|
||||||
|
|
||||||
HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, HOUSE_MAX, INVALID_HOUSE_ID);
|
HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, HOUSE_MAX, INVALID_HOUSE_ID);
|
||||||
|
@ -61,20 +61,13 @@ void IncreaseBuildingCount(Town *t, HouseID house_id)
|
||||||
|
|
||||||
if (!_loaded_newgrf_features.has_newhouses) return;
|
if (!_loaded_newgrf_features.has_newhouses) return;
|
||||||
|
|
||||||
/* If there are 255 buildings of this type in this town, there are also
|
|
||||||
* at least that many houses of the same class in the town, and
|
|
||||||
* therefore on the map as well. */
|
|
||||||
if (t->building_counts.id_count[house_id] == 255) return;
|
|
||||||
|
|
||||||
t->building_counts.id_count[house_id]++;
|
t->building_counts.id_count[house_id]++;
|
||||||
if (_building_counts.id_count[house_id] < 255) _building_counts.id_count[house_id]++;
|
_building_counts.id_count[house_id]++;
|
||||||
|
|
||||||
/* Similarly, if there are 255 houses of this class in this town, there
|
if (class_id == HOUSE_NO_CLASS) return;
|
||||||
* must be at least that number on the map too. */
|
|
||||||
if (class_id == HOUSE_NO_CLASS || t->building_counts.class_count[class_id] == 255) return;
|
|
||||||
|
|
||||||
t->building_counts.class_count[class_id]++;
|
t->building_counts.class_count[class_id]++;
|
||||||
if (_building_counts.class_count[class_id] < 255) _building_counts.class_count[class_id]++;
|
_building_counts.class_count[class_id]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,10 +114,10 @@ static uint32 GetNumHouses(HouseID house_id, const Town *town)
|
||||||
uint8 map_id_count, town_id_count, map_class_count, town_class_count;
|
uint8 map_id_count, town_id_count, map_class_count, town_class_count;
|
||||||
HouseClassID class_id = GetHouseSpecs(house_id)->class_id;
|
HouseClassID class_id = GetHouseSpecs(house_id)->class_id;
|
||||||
|
|
||||||
map_id_count = _building_counts.id_count[house_id];
|
map_id_count = ClampU(_building_counts.id_count[house_id], 0, 255);
|
||||||
map_class_count = _building_counts.class_count[class_id];
|
map_class_count = ClampU(_building_counts.class_count[class_id], 0, 255);
|
||||||
town_id_count = town->building_counts.id_count[house_id];
|
town_id_count = ClampU(town->building_counts.id_count[house_id], 0, 255);
|
||||||
town_class_count = town->building_counts.class_count[class_id];
|
town_class_count = ClampU(town->building_counts.class_count[class_id], 0, 255);
|
||||||
|
|
||||||
return map_class_count << 24 | town_class_count << 16 | map_id_count << 8 | town_id_count;
|
return map_class_count << 24 | town_class_count << 16 | map_id_count << 8 | town_id_count;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,9 +90,10 @@ enum HouseExtraFlags {
|
||||||
|
|
||||||
DECLARE_ENUM_AS_BIT_SET(HouseExtraFlags)
|
DECLARE_ENUM_AS_BIT_SET(HouseExtraFlags)
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
struct BuildingCounts {
|
struct BuildingCounts {
|
||||||
uint8 id_count[HOUSE_MAX];
|
T id_count[HOUSE_MAX];
|
||||||
uint8 class_count[HOUSE_CLASS_MAX];
|
T class_count[HOUSE_CLASS_MAX];
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY = 4; ///< value for custom town number in difficulty settings
|
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY = 4; ///< value for custom town number in difficulty settings
|
||||||
|
@ -176,7 +177,7 @@ struct Town : PoolItem<Town, TownID, &_Town_pool> {
|
||||||
uint32 squared_town_zone_radius[HZB_END];
|
uint32 squared_town_zone_radius[HZB_END];
|
||||||
|
|
||||||
/* NOSAVE: The number of each type of building in the town. */
|
/* NOSAVE: The number of each type of building in the town. */
|
||||||
BuildingCounts building_counts;
|
BuildingCounts<uint16> building_counts;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new town
|
* Creates a new town
|
||||||
|
|
Loading…
Reference in New Issue