1
0
mirror of https://github.com/OpenTTD/OpenTTD synced 2026-01-19 10:22:39 +01:00

Codechange: Use EnumBitSet for DoCommandFlags

This commit is contained in:
Rubidium
2025-02-13 23:35:52 +01:00
committed by rubidium42
parent f309b90a1d
commit c3d5e6d2a0
95 changed files with 871 additions and 873 deletions

View File

@@ -197,7 +197,7 @@ void UpdateObjectColours(const Company *c)
}
extern CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z, bool allow_steep, bool check_bridge);
static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags);
static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlags flags);
/**
* Build an object object
@@ -207,7 +207,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags);
* @param view the view for the object
* @return the cost of this operation or an error
*/
CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type, uint8_t view)
CommandCost CmdBuildObject(DoCommandFlags flags, TileIndex tile, ObjectType type, uint8_t view)
{
CommandCost cost(EXPENSES_CONSTRUCTION);
@@ -245,7 +245,7 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type,
if (!IsWaterTile(t)) {
/* Normal water tiles don't have to be cleared. For all other tile types clear
* the tile but leave the water. */
cost.AddCost(Command<CMD_LANDSCAPE_CLEAR>::Do(flags & ~DC_NO_WATER & ~DC_EXEC, t));
cost.AddCost(Command<CMD_LANDSCAPE_CLEAR>::Do(DoCommandFlags{flags}.Reset(DoCommandFlag::NoWater).Reset(DoCommandFlag::Execute), t));
} else {
/* Can't build on water owned by another company. */
Owner o = GetTileOwner(t);
@@ -263,7 +263,7 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type,
IsTileType(t, MP_OBJECT) &&
IsTileOwner(t, _current_company) &&
IsObjectType(t, OBJECT_HQ))) {
cost.AddCost(Command<CMD_LANDSCAPE_CLEAR>::Do(flags & ~DC_EXEC, t));
cost.AddCost(Command<CMD_LANDSCAPE_CLEAR>::Do(DoCommandFlags{flags}.Reset(DoCommandFlag::Execute), t));
}
}
}
@@ -289,16 +289,16 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type,
}
}
if (flags & DC_EXEC) {
if (flags.Test(DoCommandFlag::Execute)) {
/* This is basically a copy of the loop above with the exception that we now
* execute the commands and don't check for errors, since that's already done. */
for (TileIndex t : ta) {
if (HasTileWaterGround(t)) {
if (!IsWaterTile(t)) {
Command<CMD_LANDSCAPE_CLEAR>::Do((flags & ~DC_NO_WATER) | DC_NO_MODIFY_TOWN_RATING, t);
Command<CMD_LANDSCAPE_CLEAR>::Do(DoCommandFlags{flags}.Reset(DoCommandFlag::NoWater).Set(DoCommandFlag::NoModifyTownRating), t);
}
} else {
Command<CMD_LANDSCAPE_CLEAR>::Do(flags | DC_NO_MODIFY_TOWN_RATING, t);
Command<CMD_LANDSCAPE_CLEAR>::Do(flags | DoCommandFlag::NoModifyTownRating, t);
}
}
}
@@ -341,7 +341,7 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type,
_current_company = c->index;
}
if (flags & DC_EXEC) {
if (flags.Test(DoCommandFlag::Execute)) {
hq_score = UpdateCompanyRatingAndValue(c, false);
c->location_of_HQ = tile;
SetWindowDirty(WC_COMPANY, c->index);
@@ -364,7 +364,7 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type,
return CommandCost(STR_ERROR_BUILD_OBJECT_LIMIT_REACHED);
}
if (flags & DC_EXEC) {
if (flags.Test(DoCommandFlag::Execute)) {
BuildObject(type, tile, _current_company == OWNER_DEITY ? OWNER_NONE : _current_company, nullptr, view);
/* Make sure the HQ starts at the right size. */
@@ -388,7 +388,7 @@ CommandCost CmdBuildObject(DoCommandFlag flags, TileIndex tile, ObjectType type,
* @param diagonal Whether to use the Orthogonal (0) or Diagonal (1) iterator.
* @return the cost of this operation or an error
*/
CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex start_tile, ObjectType type, uint8_t view, bool diagonal)
CommandCost CmdBuildObjectArea(DoCommandFlags flags, TileIndex tile, TileIndex start_tile, ObjectType type, uint8_t view, bool diagonal)
{
if (start_tile >= Map::Size()) return CMD_ERROR;
@@ -409,7 +409,7 @@ CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex st
std::unique_ptr<TileIterator> iter = TileIterator::Create(tile, start_tile, diagonal);
for (; *iter != INVALID_TILE; ++(*iter)) {
TileIndex t = *iter;
CommandCost ret = Command<CMD_BUILD_OBJECT>::Do(flags & ~DC_EXEC, t, type, view);
CommandCost ret = Command<CMD_BUILD_OBJECT>::Do(DoCommandFlags{flags}.Reset(DoCommandFlag::Execute), t, type, view);
/* If we've reached the limit, stop building (or testing). */
if (c != nullptr && limit-- <= 0) break;
@@ -420,7 +420,7 @@ CommandCost CmdBuildObjectArea(DoCommandFlag flags, TileIndex tile, TileIndex st
}
had_success = true;
if (flags & DC_EXEC) {
if (flags.Test(DoCommandFlag::Execute)) {
money -= ret.GetCost();
/* If we run out of money, stop building. */
@@ -539,7 +539,7 @@ ClearedObjectArea *FindClearedObject(TileIndex tile)
return nullptr;
}
static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlags flags)
{
/* Get to the northern most tile. */
Object *o = Object::GetByTile(tile);
@@ -556,10 +556,10 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
/* Water can remove everything! */
if (_current_company != OWNER_WATER) {
if ((flags & DC_NO_WATER) && IsTileOnWater(tile)) {
if (flags.Test(DoCommandFlag::NoWater) && IsTileOnWater(tile)) {
/* There is water under the object, treat it as water tile. */
return CommandCost(STR_ERROR_CAN_T_BUILD_ON_WATER);
} else if (!spec->flags.Test(ObjectFlag::Autoremove) && (flags & DC_AUTO)) {
} else if (!spec->flags.Test(ObjectFlag::Autoremove) && flags.Test(DoCommandFlag::Auto)) {
/* No automatic removal by overbuilding stuff. */
return CommandCost(type == OBJECT_HQ ? STR_ERROR_COMPANY_HEADQUARTERS_IN : STR_ERROR_OBJECT_IN_THE_WAY);
} else if (_game_mode == GM_EDITOR) {
@@ -588,7 +588,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
switch (type) {
case OBJECT_HQ: {
Company *c = Company::Get(GetTileOwner(tile));
if (flags & DC_EXEC) {
if (flags.Test(DoCommandFlag::Execute)) {
c->location_of_HQ = INVALID_TILE; // reset HQ position
SetWindowDirty(WC_COMPANY, c->index);
CargoPacket::InvalidateAllFrom({c->index, SourceType::Headquarters});
@@ -600,7 +600,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
}
case OBJECT_STATUE:
if (flags & DC_EXEC) {
if (flags.Test(DoCommandFlag::Execute)) {
Town *town = o->town;
town->statues.Reset(GetTileOwner(tile));
SetWindowDirty(WC_TOWN_AUTHORITY, town->index);
@@ -613,7 +613,7 @@ static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags)
_cleared_object_areas.push_back({tile, ta});
if (flags & DC_EXEC) ReallyClearObjectTile(o);
if (flags.Test(DoCommandFlag::Execute)) ReallyClearObjectTile(o);
return cost;
}
@@ -864,7 +864,7 @@ void GenerateObjects()
default:
uint8_t view = RandomRange(spec.views);
if (CmdBuildObject(DC_EXEC | DC_AUTO | DC_NO_TEST_TOWN_RATING | DC_NO_MODIFY_TOWN_RATING, RandomTile(), spec.Index(), view).Succeeded()) amount--;
if (CmdBuildObject({DoCommandFlag::Execute, DoCommandFlag::Auto, DoCommandFlag::NoTestTownRating, DoCommandFlag::NoModifyTownRating}, RandomTile(), spec.Index(), view).Succeeded()) amount--;
break;
}
}
@@ -908,7 +908,7 @@ static void ChangeTileOwner_Object(TileIndex tile, Owner old_owner, Owner new_ow
}
}
static CommandCost TerraformTile_Object(TileIndex tile, DoCommandFlag flags, int z_new, Slope tileh_new)
static CommandCost TerraformTile_Object(TileIndex tile, DoCommandFlags flags, int z_new, Slope tileh_new)
{
ObjectType type = GetObjectType(tile);