1
0
Fork 0

Codechange: Use EnumBitSet for HouseExtraFlags.

pull/13428/head
Peter Nelson 2025-01-25 20:25:01 +00:00 committed by Peter Nelson
parent 2c7b3bb55d
commit 113205c540
5 changed files with 15 additions and 17 deletions

View File

@ -81,15 +81,13 @@ enum HouseZones : uint16_t {
}; };
DECLARE_ENUM_AS_BIT_SET(HouseZones) DECLARE_ENUM_AS_BIT_SET(HouseZones)
enum HouseExtraFlags : uint8_t { enum class HouseExtraFlag : uint8_t {
NO_EXTRA_FLAG = 0, BuildingIsHistorical = 0, ///< this house will only appear during town generation in random games, thus the historical
BUILDING_IS_HISTORICAL = 1U << 0, ///< this house will only appear during town generation in random games, thus the historical BuildingIsProtected = 1, ///< towns and AI will not remove this house, while human players will be able to
BUILDING_IS_PROTECTED = 1U << 1, ///< towns and AI will not remove this house, while human players will be able to SynchronisedCallback1B = 2, ///< synchronized callback 1B will be performed, on multi tile houses
SYNCHRONISED_CALLBACK_1B = 1U << 2, ///< synchronized callback 1B will be performed, on multi tile houses Callback1ARandomBits = 3, ///< callback 1A needs random bits
CALLBACK_1A_RANDOM_BITS = 1U << 3, ///< callback 1A needs random bits
}; };
using HouseExtraFlags = EnumBitSet<HouseExtraFlag, uint8_t>;
DECLARE_ENUM_AS_BIT_SET(HouseExtraFlags)
struct HouseSpec { struct HouseSpec {
/* Standard properties */ /* Standard properties */
@ -111,7 +109,7 @@ struct HouseSpec {
HouseCallbackMasks callback_mask; ///< Bitmask of house callbacks that have to be called HouseCallbackMasks callback_mask; ///< Bitmask of house callbacks that have to be called
Colours random_colour[4]; ///< 4 "random" colours Colours random_colour[4]; ///< 4 "random" colours
uint8_t probability; ///< Relative probability of appearing (16 is the standard value) uint8_t probability; ///< Relative probability of appearing (16 is the standard value)
HouseExtraFlags extra_flags; ///< some more flags HouseExtraFlags extra_flags{}; ///< some more flags
HouseClassID class_id; ///< defines the class this house has (not grf file based) HouseClassID class_id; ///< defines the class this house has (not grf file based)
AnimationInfo animation; ///< information about the animation. AnimationInfo animation; ///< information about the animation.
uint8_t processing_time; ///< Periodic refresh multiplier uint8_t processing_time; ///< Periodic refresh multiplier

View File

@ -2607,7 +2607,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint first, uint last, int prop, Byt
break; break;
case 0x19: // Extra flags case 0x19: // Extra flags
housespec->extra_flags = (HouseExtraFlags)buf.ReadByte(); housespec->extra_flags = static_cast<HouseExtraFlags>(buf.ReadByte());
break; break;
case 0x1A: // Animation frames case 0x1A: // Animation frames

View File

@ -596,7 +596,7 @@ void AnimateNewHouseTile(TileIndex tile)
const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile)); const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
if (hs == nullptr) return; if (hs == nullptr) return;
HouseAnimationBase::AnimateTile(hs, Town::GetByTile(tile), tile, HasFlag(hs->extra_flags, CALLBACK_1A_RANDOM_BITS)); HouseAnimationBase::AnimateTile(hs, Town::GetByTile(tile), tile, hs->extra_flags.Test(HouseExtraFlag::Callback1ARandomBits));
} }
void AnimateNewHouseConstruction(TileIndex tile) void AnimateNewHouseConstruction(TileIndex tile)
@ -622,7 +622,7 @@ bool CanDeleteHouse(TileIndex tile)
uint16_t callback_res = GetHouseCallback(CBID_HOUSE_DENY_DESTRUCTION, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile); uint16_t callback_res = GetHouseCallback(CBID_HOUSE_DENY_DESTRUCTION, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
return (callback_res == CALLBACK_FAILED || !ConvertBooleanCallback(hs->grf_prop.grffile, CBID_HOUSE_DENY_DESTRUCTION, callback_res)); return (callback_res == CALLBACK_FAILED || !ConvertBooleanCallback(hs->grf_prop.grffile, CBID_HOUSE_DENY_DESTRUCTION, callback_res));
} else { } else {
return !(hs->extra_flags & BUILDING_IS_PROTECTED); return !hs->extra_flags.Test(HouseExtraFlag::BuildingIsProtected);
} }
} }
@ -631,7 +631,7 @@ static void AnimationControl(TileIndex tile, uint16_t random_bits)
const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile)); const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
if (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop)) { if (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop)) {
uint32_t param = (hs->extra_flags & SYNCHRONISED_CALLBACK_1B) ? (GB(Random(), 0, 16) | random_bits << 16) : Random(); uint32_t param = hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B) ? (GB(Random(), 0, 16) | random_bits << 16) : Random();
HouseAnimationBase::ChangeAnimationFrame(CBID_HOUSE_ANIMATION_START_STOP, hs, Town::GetByTile(tile), tile, param, 0); HouseAnimationBase::ChangeAnimationFrame(CBID_HOUSE_ANIMATION_START_STOP, hs, Town::GetByTile(tile), tile, param, 0);
} }
} }
@ -653,7 +653,7 @@ bool NewHouseTileLoop(TileIndex tile)
* tiles will have the callback called at once, rather than when the * tiles will have the callback called at once, rather than when the
* tile loop reaches them. This should only be enabled for the northern * tile loop reaches them. This should only be enabled for the northern
* tile, or strange things will happen (here, and in TTDPatch). */ * tile, or strange things will happen (here, and in TTDPatch). */
if (hs->extra_flags & SYNCHRONISED_CALLBACK_1B) { if (hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B)) {
uint16_t random = GB(Random(), 0, 16); uint16_t random = GB(Random(), 0, 16);
if (hs->building_flags & BUILDING_HAS_1_TILE) AnimationControl(tile, random); if (hs->building_flags & BUILDING_HAS_1_TILE) AnimationControl(tile, random);

View File

@ -1814,7 +1814,7 @@ static_assert(lengthof(_town_draw_tile_data) == (NEW_HOUSE_OFFSET) * 4 * 4);
{ca1, ca2, ca3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \ {ca1, ca2, ca3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \ {INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \
bf, ba, true, GRFFileProps(INVALID_HOUSE_ID), HouseCallbackMasks{}, {COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN}, \ bf, ba, true, GRFFileProps(INVALID_HOUSE_ID), HouseCallbackMasks{}, {COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN}, \
16, NO_EXTRA_FLAG, HOUSE_NO_CLASS, {0, 2, 0, 0}, 0, 0, 0, {cg1, cg2, cg3}, } 16, HouseExtraFlags{}, HOUSE_NO_CLASS, {0, 2, 0, 0}, 0, 0, 0, {cg1, cg2, cg3}, }
/** House specifications from original data */ /** House specifications from original data */
extern const HouseSpec _original_house_specs[] = { extern const HouseSpec _original_house_specs[] = {
/** /**

View File

@ -2741,7 +2741,7 @@ static void BuildTownHouse(Town *t, TileIndex tile, const HouseSpec *hs, HouseID
uint32_t construction_random = Random(); uint32_t construction_random = Random();
construction_stage = TOWN_HOUSE_COMPLETED; construction_stage = TOWN_HOUSE_COMPLETED;
if (_generating_world && !HasFlag(hs->extra_flags, HouseExtraFlags::BUILDING_IS_HISTORICAL) && Chance16(1, 7)) construction_stage = GB(construction_random, 0, 2); if (_generating_world && !hs->extra_flags.Test(HouseExtraFlag::BuildingIsHistorical) && Chance16(1, 7)) construction_stage = GB(construction_random, 0, 2);
if (construction_stage == TOWN_HOUSE_COMPLETED) { if (construction_stage == TOWN_HOUSE_COMPLETED) {
ChangePopulation(t, hs->population); ChangePopulation(t, hs->population);
@ -2835,7 +2835,7 @@ static bool TryBuildTownHouse(Town *t, TileIndex tile)
const HouseSpec *hs = HouseSpec::Get(house); const HouseSpec *hs = HouseSpec::Get(house);
if (!_generating_world && _game_mode != GM_EDITOR && (hs->extra_flags & BUILDING_IS_HISTORICAL) != 0) { if (!_generating_world && _game_mode != GM_EDITOR && hs->extra_flags.Test(HouseExtraFlag::BuildingIsHistorical)) {
continue; continue;
} }