mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Use EnumBitSet for RailTypes.
parent
732109e444
commit
47d078c033
|
@ -71,7 +71,7 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company)
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case VEH_TRAIN: {
|
case VEH_TRAIN: {
|
||||||
/* make sure the railtypes are compatible */
|
/* make sure the railtypes are compatible */
|
||||||
if ((GetRailTypeInfo(e_from->u.rail.railtype)->compatible_railtypes & GetRailTypeInfo(e_to->u.rail.railtype)->compatible_railtypes) == 0) return false;
|
if (!GetRailTypeInfo(e_from->u.rail.railtype)->compatible_railtypes.Any(GetRailTypeInfo(e_to->u.rail.railtype)->compatible_railtypes)) return false;
|
||||||
|
|
||||||
/* make sure we do not replace wagons with engines or vice versa */
|
/* make sure we do not replace wagons with engines or vice versa */
|
||||||
if ((e_from->u.rail.railveh_type == RAILVEH_WAGON) != (e_to->u.rail.railveh_type == RAILVEH_WAGON)) return false;
|
if ((e_from->u.rail.railveh_type == RAILVEH_WAGON) != (e_to->u.rail.railveh_type == RAILVEH_WAGON)) return false;
|
||||||
|
|
|
@ -1780,19 +1780,19 @@ struct CompanyInfrastructureWindow : Window
|
||||||
|
|
||||||
void UpdateRailRoadTypes()
|
void UpdateRailRoadTypes()
|
||||||
{
|
{
|
||||||
this->railtypes = RAILTYPES_NONE;
|
this->railtypes = {};
|
||||||
this->roadtypes = {};
|
this->roadtypes = {};
|
||||||
|
|
||||||
/* Find the used railtypes. */
|
/* Find the used railtypes. */
|
||||||
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
||||||
if (!e->info.climates.Test(_settings_game.game_creation.landscape)) continue;
|
if (!e->info.climates.Test(_settings_game.game_creation.landscape)) continue;
|
||||||
|
|
||||||
this->railtypes |= GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes;
|
this->railtypes.Set(GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the date introduced railtypes as well. */
|
/* Get the date introduced railtypes as well. */
|
||||||
this->railtypes = AddDateIntroducedRailTypes(this->railtypes, CalendarTime::MAX_DATE);
|
this->railtypes = AddDateIntroducedRailTypes(this->railtypes, CalendarTime::MAX_DATE);
|
||||||
this->railtypes &= ~_railtypes_hidden_mask;
|
this->railtypes.Reset(_railtypes_hidden_mask);
|
||||||
|
|
||||||
/* Find the used roadtypes. */
|
/* Find the used roadtypes. */
|
||||||
for (const Engine *e : Engine::IterateType(VEH_ROAD)) {
|
for (const Engine *e : Engine::IterateType(VEH_ROAD)) {
|
||||||
|
@ -1814,7 +1814,7 @@ struct CompanyInfrastructureWindow : Window
|
||||||
|
|
||||||
uint32_t rail_total = c->infrastructure.GetRailTotal();
|
uint32_t rail_total = c->infrastructure.GetRailTotal();
|
||||||
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
||||||
if (HasBit(this->railtypes, rt)) total += RailMaintenanceCost(rt, c->infrastructure.rail[rt], rail_total);
|
if (this->railtypes.Test(rt)) total += RailMaintenanceCost(rt, c->infrastructure.rail[rt], rail_total);
|
||||||
}
|
}
|
||||||
total += SignalMaintenanceCost(c->infrastructure.signal);
|
total += SignalMaintenanceCost(c->infrastructure.signal);
|
||||||
|
|
||||||
|
@ -1853,12 +1853,12 @@ struct CompanyInfrastructureWindow : Window
|
||||||
size.width = std::max(size.width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT).width + padding.width);
|
size.width = std::max(size.width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT).width + padding.width);
|
||||||
|
|
||||||
for (const auto &rt : _sorted_railtypes) {
|
for (const auto &rt : _sorted_railtypes) {
|
||||||
if (HasBit(this->railtypes, rt)) {
|
if (this->railtypes.Test(rt)) {
|
||||||
lines++;
|
lines++;
|
||||||
size.width = std::max(size.width, GetStringBoundingBox(GetRailTypeInfo(rt)->strings.name).width + padding.width + WidgetDimensions::scaled.hsep_indent);
|
size.width = std::max(size.width, GetStringBoundingBox(GetRailTypeInfo(rt)->strings.name).width + padding.width + WidgetDimensions::scaled.hsep_indent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this->railtypes != RAILTYPES_NONE) {
|
if (this->railtypes.Any()) {
|
||||||
lines++;
|
lines++;
|
||||||
size.width = std::max(size.width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS).width + padding.width + WidgetDimensions::scaled.hsep_indent);
|
size.width = std::max(size.width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS).width + padding.width + WidgetDimensions::scaled.hsep_indent);
|
||||||
}
|
}
|
||||||
|
@ -1978,10 +1978,10 @@ struct CompanyInfrastructureWindow : Window
|
||||||
case WID_CI_RAIL_DESC:
|
case WID_CI_RAIL_DESC:
|
||||||
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT);
|
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT);
|
||||||
|
|
||||||
if (this->railtypes != RAILTYPES_NONE) {
|
if (this->railtypes.Any()) {
|
||||||
/* Draw name of each valid railtype. */
|
/* Draw name of each valid railtype. */
|
||||||
for (const auto &rt : _sorted_railtypes) {
|
for (const auto &rt : _sorted_railtypes) {
|
||||||
if (HasBit(this->railtypes, rt)) {
|
if (this->railtypes.Test(rt)) {
|
||||||
DrawString(ir.left, ir.right, y += GetCharacterHeight(FS_NORMAL), GetRailTypeInfo(rt)->strings.name, TC_WHITE);
|
DrawString(ir.left, ir.right, y += GetCharacterHeight(FS_NORMAL), GetRailTypeInfo(rt)->strings.name, TC_WHITE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1997,11 +1997,11 @@ struct CompanyInfrastructureWindow : Window
|
||||||
/* Draw infrastructure count for each valid railtype. */
|
/* Draw infrastructure count for each valid railtype. */
|
||||||
uint32_t rail_total = c->infrastructure.GetRailTotal();
|
uint32_t rail_total = c->infrastructure.GetRailTotal();
|
||||||
for (const auto &rt : _sorted_railtypes) {
|
for (const auto &rt : _sorted_railtypes) {
|
||||||
if (HasBit(this->railtypes, rt)) {
|
if (this->railtypes.Test(rt)) {
|
||||||
this->DrawCountLine(r, y, c->infrastructure.rail[rt], RailMaintenanceCost(rt, c->infrastructure.rail[rt], rail_total));
|
this->DrawCountLine(r, y, c->infrastructure.rail[rt], RailMaintenanceCost(rt, c->infrastructure.rail[rt], rail_total));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this->railtypes != RAILTYPES_NONE) {
|
if (this->railtypes.Any()) {
|
||||||
this->DrawCountLine(r, y, c->infrastructure.signal, SignalMaintenanceCost(c->infrastructure.signal));
|
this->DrawCountLine(r, y, c->infrastructure.signal, SignalMaintenanceCost(c->infrastructure.signal));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -622,7 +622,7 @@ void UpdateDisableElrailSettingState(bool disable, bool update_vehicles)
|
||||||
if (t->railtype == RAILTYPE_ELECTRIC) {
|
if (t->railtype == RAILTYPE_ELECTRIC) {
|
||||||
/* this railroad vehicle is now compatible only with elrail,
|
/* this railroad vehicle is now compatible only with elrail,
|
||||||
* so add there also normal rail compatibility */
|
* so add there also normal rail compatibility */
|
||||||
t->compatible_railtypes |= RAILTYPES_RAIL;
|
t->compatible_railtypes.Set(RAILTYPE_RAIL);
|
||||||
t->railtype = RAILTYPE_RAIL;
|
t->railtype = RAILTYPE_RAIL;
|
||||||
SetBit(t->flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL);
|
SetBit(t->flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1276,7 +1276,7 @@ bool IsEngineBuildable(EngineID engine, VehicleType type, CompanyID company)
|
||||||
if (type == VEH_TRAIN && company != OWNER_DEITY) {
|
if (type == VEH_TRAIN && company != OWNER_DEITY) {
|
||||||
/* Check if the rail type is available to this company */
|
/* Check if the rail type is available to this company */
|
||||||
const Company *c = Company::Get(company);
|
const Company *c = Company::Get(company);
|
||||||
if (((GetRailTypeInfo(e->u.rail.railtype))->compatible_railtypes & c->avail_railtypes) == 0) return false;
|
if (!GetRailTypeInfo(e->u.rail.railtype)->compatible_railtypes.Any(c->avail_railtypes)) return false;
|
||||||
}
|
}
|
||||||
if (type == VEH_ROAD && company != OWNER_DEITY) {
|
if (type == VEH_ROAD && company != OWNER_DEITY) {
|
||||||
/* Check if the road type is available to this company */
|
/* Check if the road type is available to this company */
|
||||||
|
|
|
@ -86,10 +86,10 @@ static ChangeInfoResult RailTypeChangeInfo(uint first, uint last, int prop, Byte
|
||||||
RailType resolved_rt = GetRailTypeByLabel(std::byteswap(label), false);
|
RailType resolved_rt = GetRailTypeByLabel(std::byteswap(label), false);
|
||||||
if (resolved_rt != INVALID_RAILTYPE) {
|
if (resolved_rt != INVALID_RAILTYPE) {
|
||||||
switch (prop) {
|
switch (prop) {
|
||||||
case 0x0F: SetBit(rti->powered_railtypes, resolved_rt); [[fallthrough]]; // Powered implies compatible.
|
case 0x0F: rti->powered_railtypes.Set(resolved_rt); [[fallthrough]]; // Powered implies compatible.
|
||||||
case 0x0E: SetBit(rti->compatible_railtypes, resolved_rt); break;
|
case 0x0E: rti->compatible_railtypes.Set(resolved_rt); break;
|
||||||
case 0x18: SetBit(rti->introduction_required_railtypes, resolved_rt); break;
|
case 0x18: rti->introduction_required_railtypes.Set(resolved_rt); break;
|
||||||
case 0x19: SetBit(rti->introduces_railtypes, resolved_rt); break;
|
case 0x19: rti->introduces_railtypes.Set(resolved_rt); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -333,7 +333,7 @@ protected:
|
||||||
/* rail transport is possible only on compatible rail types */
|
/* rail transport is possible only on compatible rail types */
|
||||||
if (IsRailTT()) {
|
if (IsRailTT()) {
|
||||||
RailType rail_type = GetTileRailType(this->new_tile);
|
RailType rail_type = GetTileRailType(this->new_tile);
|
||||||
if (!HasBit(this->railtypes, rail_type)) {
|
if (!this->railtypes.Test(rail_type)) {
|
||||||
/* incompatible rail type */
|
/* incompatible rail type */
|
||||||
this->err = EC_RAIL_ROAD_TYPE;
|
this->err = EC_RAIL_ROAD_TYPE;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -22,12 +22,12 @@ public:
|
||||||
void SetDestination(const Train *v, bool override_rail_type = false)
|
void SetDestination(const Train *v, bool override_rail_type = false)
|
||||||
{
|
{
|
||||||
this->compatible_railtypes = v->compatible_railtypes;
|
this->compatible_railtypes = v->compatible_railtypes;
|
||||||
if (override_rail_type) this->compatible_railtypes |= GetRailTypeInfo(v->railtype)->compatible_railtypes;
|
if (override_rail_type) this->compatible_railtypes.Set(GetRailTypeInfo(v->railtype)->compatible_railtypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsCompatibleRailType(RailType rt)
|
bool IsCompatibleRailType(RailType rt)
|
||||||
{
|
{
|
||||||
return HasBit(this->compatible_railtypes, rt);
|
return this->compatible_railtypes.Test(rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
RailTypes GetCompatibleRailTypes() const
|
RailTypes GetCompatibleRailTypes() const
|
||||||
|
|
20
src/rail.cpp
20
src/rail.cpp
|
@ -185,7 +185,7 @@ RailType GetTileRailType(Tile tile)
|
||||||
*/
|
*/
|
||||||
bool HasRailTypeAvail(const CompanyID company, const RailType railtype)
|
bool HasRailTypeAvail(const CompanyID company, const RailType railtype)
|
||||||
{
|
{
|
||||||
return !HasBit(_railtypes_hidden_mask, railtype) && HasBit(Company::Get(company)->avail_railtypes, railtype);
|
return !_railtypes_hidden_mask.Test(railtype) && Company::Get(company)->avail_railtypes.Test(railtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -195,7 +195,9 @@ bool HasRailTypeAvail(const CompanyID company, const RailType railtype)
|
||||||
*/
|
*/
|
||||||
bool HasAnyRailTypesAvail(const CompanyID company)
|
bool HasAnyRailTypesAvail(const CompanyID company)
|
||||||
{
|
{
|
||||||
return (Company::Get(company)->avail_railtypes & ~_railtypes_hidden_mask) != 0;
|
RailTypes avail = Company::Get(company)->avail_railtypes;
|
||||||
|
avail.Reset(_railtypes_hidden_mask);
|
||||||
|
return avail.Any();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -234,7 +236,7 @@ RailTypes AddDateIntroducedRailTypes(RailTypes current, TimerGameCalendar::Date
|
||||||
RailTypes required = rti->introduction_required_railtypes;
|
RailTypes required = rti->introduction_required_railtypes;
|
||||||
if ((rts & required) != required) continue;
|
if ((rts & required) != required) continue;
|
||||||
|
|
||||||
rts |= rti->introduces_railtypes;
|
rts.Set(rti->introduces_railtypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When we added railtypes we need to run this method again; the added
|
/* When we added railtypes we need to run this method again; the added
|
||||||
|
@ -250,7 +252,7 @@ RailTypes AddDateIntroducedRailTypes(RailTypes current, TimerGameCalendar::Date
|
||||||
*/
|
*/
|
||||||
RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
|
RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
|
||||||
{
|
{
|
||||||
RailTypes rts = RAILTYPES_NONE;
|
RailTypes rts{};
|
||||||
|
|
||||||
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
||||||
const EngineInfo *ei = &e->info;
|
const EngineInfo *ei = &e->info;
|
||||||
|
@ -262,9 +264,9 @@ RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
|
||||||
if (rvi->railveh_type != RAILVEH_WAGON) {
|
if (rvi->railveh_type != RAILVEH_WAGON) {
|
||||||
assert(rvi->railtype < RAILTYPE_END);
|
assert(rvi->railtype < RAILTYPE_END);
|
||||||
if (introduces) {
|
if (introduces) {
|
||||||
rts |= GetRailTypeInfo(rvi->railtype)->introduces_railtypes;
|
rts.Set(GetRailTypeInfo(rvi->railtype)->introduces_railtypes);
|
||||||
} else {
|
} else {
|
||||||
SetBit(rts, rvi->railtype);
|
rts.Set(rvi->railtype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,7 +283,7 @@ RailTypes GetCompanyRailTypes(CompanyID company, bool introduces)
|
||||||
*/
|
*/
|
||||||
RailTypes GetRailTypes(bool introduces)
|
RailTypes GetRailTypes(bool introduces)
|
||||||
{
|
{
|
||||||
RailTypes rts = RAILTYPES_NONE;
|
RailTypes rts{};
|
||||||
|
|
||||||
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) {
|
||||||
const EngineInfo *ei = &e->info;
|
const EngineInfo *ei = &e->info;
|
||||||
|
@ -291,9 +293,9 @@ RailTypes GetRailTypes(bool introduces)
|
||||||
if (rvi->railveh_type != RAILVEH_WAGON) {
|
if (rvi->railveh_type != RAILVEH_WAGON) {
|
||||||
assert(rvi->railtype < RAILTYPE_END);
|
assert(rvi->railtype < RAILTYPE_END);
|
||||||
if (introduces) {
|
if (introduces) {
|
||||||
rts |= GetRailTypeInfo(rvi->railtype)->introduces_railtypes;
|
rts.Set(GetRailTypeInfo(rvi->railtype)->introduces_railtypes);
|
||||||
} else {
|
} else {
|
||||||
SetBit(rts, rvi->railtype);
|
rts.Set(rvi->railtype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -314,7 +314,7 @@ inline const RailTypeInfo *GetRailTypeInfo(RailType railtype)
|
||||||
*/
|
*/
|
||||||
inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
|
inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
|
||||||
{
|
{
|
||||||
return HasBit(GetRailTypeInfo(enginetype)->compatible_railtypes, tiletype);
|
return GetRailTypeInfo(enginetype)->compatible_railtypes.Test(tiletype);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -327,7 +327,7 @@ inline bool IsCompatibleRail(RailType enginetype, RailType tiletype)
|
||||||
*/
|
*/
|
||||||
inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
|
inline bool HasPowerOnRail(RailType enginetype, RailType tiletype)
|
||||||
{
|
{
|
||||||
return HasBit(GetRailTypeInfo(enginetype)->powered_railtypes, tiletype);
|
return GetRailTypeInfo(enginetype)->powered_railtypes.Test(tiletype);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -64,12 +64,12 @@ enum SignalOffsets {
|
||||||
*/
|
*/
|
||||||
void ResetRailTypes()
|
void ResetRailTypes()
|
||||||
{
|
{
|
||||||
static_assert(lengthof(_original_railtypes) <= lengthof(_railtypes));
|
static_assert(std::size(_original_railtypes) <= std::size(_railtypes));
|
||||||
|
|
||||||
auto insert = std::copy(std::begin(_original_railtypes), std::end(_original_railtypes), std::begin(_railtypes));
|
auto insert = std::copy(std::begin(_original_railtypes), std::end(_original_railtypes), std::begin(_railtypes));
|
||||||
std::fill(insert, std::end(_railtypes), RailTypeInfo{});
|
std::fill(insert, std::end(_railtypes), RailTypeInfo{});
|
||||||
|
|
||||||
_railtypes_hidden_mask = RAILTYPES_NONE;
|
_railtypes_hidden_mask = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResolveRailTypeGUISprites(RailTypeInfo *rti)
|
void ResolveRailTypeGUISprites(RailTypeInfo *rti)
|
||||||
|
@ -132,7 +132,7 @@ void InitRailTypes()
|
||||||
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
||||||
RailTypeInfo *rti = &_railtypes[rt];
|
RailTypeInfo *rti = &_railtypes[rt];
|
||||||
ResolveRailTypeGUISprites(rti);
|
ResolveRailTypeGUISprites(rti);
|
||||||
if (rti->flags.Test(RailTypeFlag::Hidden)) SetBit(_railtypes_hidden_mask, rt);
|
if (rti->flags.Test(RailTypeFlag::Hidden)) _railtypes_hidden_mask.Set(rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
_sorted_railtypes.clear();
|
_sorted_railtypes.clear();
|
||||||
|
@ -158,11 +158,11 @@ RailType AllocateRailType(RailTypeLabel label)
|
||||||
rti->alternate_labels.clear();
|
rti->alternate_labels.clear();
|
||||||
|
|
||||||
/* Make us compatible with ourself. */
|
/* Make us compatible with ourself. */
|
||||||
rti->powered_railtypes = (RailTypes)(1LL << rt);
|
rti->powered_railtypes = rt;
|
||||||
rti->compatible_railtypes = (RailTypes)(1LL << rt);
|
rti->compatible_railtypes = rt;
|
||||||
|
|
||||||
/* We also introduce ourself. */
|
/* We also introduce ourself. */
|
||||||
rti->introduces_railtypes = (RailTypes)(1LL << rt);
|
rti->introduces_railtypes = rt;
|
||||||
|
|
||||||
/* Default sort order; order of allocation, but with some
|
/* Default sort order; order of allocation, but with some
|
||||||
* offsets so it's easier for NewGRF to pick a spot without
|
* offsets so it's easier for NewGRF to pick a spot without
|
||||||
|
|
|
@ -2052,9 +2052,9 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
|
||||||
Dimension d = { 0, 0 };
|
Dimension d = { 0, 0 };
|
||||||
/* Get largest icon size, to ensure text is aligned on each menu item. */
|
/* Get largest icon size, to ensure text is aligned on each menu item. */
|
||||||
if (!for_replacement) {
|
if (!for_replacement) {
|
||||||
used_railtypes &= ~_railtypes_hidden_mask;
|
used_railtypes.Reset(_railtypes_hidden_mask);
|
||||||
for (const auto &rt : _sorted_railtypes) {
|
for (const auto &rt : _sorted_railtypes) {
|
||||||
if (!HasBit(used_railtypes, rt)) continue;
|
if (!used_railtypes.Test(rt)) continue;
|
||||||
const RailTypeInfo *rti = GetRailTypeInfo(rt);
|
const RailTypeInfo *rti = GetRailTypeInfo(rt);
|
||||||
d = maxdim(d, GetSpriteSize(rti->gui_sprites.build_x_rail));
|
d = maxdim(d, GetSpriteSize(rti->gui_sprites.build_x_rail));
|
||||||
}
|
}
|
||||||
|
@ -2065,17 +2065,17 @@ DropDownList GetRailTypeDropDownList(bool for_replacement, bool all_option)
|
||||||
|
|
||||||
for (const auto &rt : _sorted_railtypes) {
|
for (const auto &rt : _sorted_railtypes) {
|
||||||
/* If it's not used ever, don't show it to the user. */
|
/* If it's not used ever, don't show it to the user. */
|
||||||
if (!HasBit(used_railtypes, rt)) continue;
|
if (!used_railtypes.Test(rt)) continue;
|
||||||
|
|
||||||
const RailTypeInfo *rti = GetRailTypeInfo(rt);
|
const RailTypeInfo *rti = GetRailTypeInfo(rt);
|
||||||
|
|
||||||
if (for_replacement) {
|
if (for_replacement) {
|
||||||
list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !HasBit(avail_railtypes, rt)));
|
list.push_back(MakeDropDownListBadgeItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, GetString(rti->strings.replace_text), rt, !avail_railtypes.Test(rt)));
|
||||||
} else {
|
} else {
|
||||||
std::string str = rti->max_speed > 0
|
std::string str = rti->max_speed > 0
|
||||||
? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed)
|
? GetString(STR_TOOLBAR_RAILTYPE_VELOCITY, rti->strings.menu_text, rti->max_speed)
|
||||||
: GetString(rti->strings.menu_text);
|
: GetString(rti->strings.menu_text);
|
||||||
list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, d, rti->gui_sprites.build_x_rail, PAL_NONE, std::move(str), rt, !HasBit(avail_railtypes, rt)));
|
list.push_back(MakeDropDownListBadgeIconItem(badge_class_list, rti->badges, GSF_RAILTYPES, rti->introduction_date, d, rti->gui_sprites.build_x_rail, PAL_NONE, std::move(str), rt, !avail_railtypes.Test(rt)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,6 @@ static const RailTypeLabel RAILTYPE_LABEL_MAGLEV = 'MGLV';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enumeration for all possible railtypes.
|
* Enumeration for all possible railtypes.
|
||||||
*
|
|
||||||
* This enumeration defines all 4 possible railtypes.
|
|
||||||
*/
|
*/
|
||||||
enum RailType : uint8_t {
|
enum RailType : uint8_t {
|
||||||
RAILTYPE_BEGIN = 0, ///< Used for iterations
|
RAILTYPE_BEGIN = 0, ///< Used for iterations
|
||||||
|
@ -37,18 +35,8 @@ enum RailType : uint8_t {
|
||||||
/** Allow incrementing of Track variables */
|
/** Allow incrementing of Track variables */
|
||||||
DECLARE_INCREMENT_DECREMENT_OPERATORS(RailType)
|
DECLARE_INCREMENT_DECREMENT_OPERATORS(RailType)
|
||||||
|
|
||||||
/**
|
using RailTypes = EnumBitSet<RailType, uint64_t>;
|
||||||
* The different railtypes we support, but then a bitmask of them.
|
|
||||||
* @note Must be treated as a uint64_t type, narrowing it causes bit membership tests to give wrong results, as in bug #6951.
|
static constexpr RailTypes INVALID_RAILTYPES{UINT64_MAX};
|
||||||
*/
|
|
||||||
enum RailTypes : uint64_t {
|
|
||||||
RAILTYPES_NONE = 0, ///< No rail types
|
|
||||||
RAILTYPES_RAIL = 1 << RAILTYPE_RAIL, ///< Non-electrified rails
|
|
||||||
RAILTYPES_ELECTRIC = 1 << RAILTYPE_ELECTRIC, ///< Electrified rails
|
|
||||||
RAILTYPES_MONO = 1 << RAILTYPE_MONO, ///< Monorail!
|
|
||||||
RAILTYPES_MAGLEV = 1 << RAILTYPE_MAGLEV, ///< Ever fast maglev
|
|
||||||
INVALID_RAILTYPES = UINT64_MAX, ///< Invalid railtypes
|
|
||||||
};
|
|
||||||
DECLARE_ENUM_AS_BIT_SET(RailTypes)
|
|
||||||
|
|
||||||
#endif /* RAIL_TYPE_H */
|
#endif /* RAIL_TYPE_H */
|
||||||
|
|
|
@ -60,10 +60,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
SPR_RAIL_SNOW_OFFSET,
|
SPR_RAIL_SNOW_OFFSET,
|
||||||
|
|
||||||
/* Powered railtypes */
|
/* Powered railtypes */
|
||||||
RAILTYPES_RAIL | RAILTYPES_ELECTRIC,
|
{RAILTYPE_RAIL, RAILTYPE_ELECTRIC},
|
||||||
|
|
||||||
/* Compatible railtypes */
|
/* Compatible railtypes */
|
||||||
RAILTYPES_RAIL | RAILTYPES_ELECTRIC,
|
{RAILTYPE_RAIL, RAILTYPE_ELECTRIC},
|
||||||
|
|
||||||
/* bridge offset */
|
/* bridge offset */
|
||||||
0,
|
0,
|
||||||
|
@ -102,10 +102,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
CalendarTime::INVALID_DATE,
|
CalendarTime::INVALID_DATE,
|
||||||
|
|
||||||
/* railtypes required for this to be introduced */
|
/* railtypes required for this to be introduced */
|
||||||
RAILTYPES_NONE,
|
{},
|
||||||
|
|
||||||
/* introduction rail types */
|
/* introduction rail types */
|
||||||
RAILTYPES_RAIL,
|
{RAILTYPE_RAIL},
|
||||||
|
|
||||||
/* sort order */
|
/* sort order */
|
||||||
0 << 4 | 7,
|
0 << 4 | 7,
|
||||||
|
@ -162,10 +162,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
SPR_RAIL_SNOW_OFFSET,
|
SPR_RAIL_SNOW_OFFSET,
|
||||||
|
|
||||||
/* Powered railtypes */
|
/* Powered railtypes */
|
||||||
RAILTYPES_ELECTRIC,
|
{RAILTYPE_ELECTRIC},
|
||||||
|
|
||||||
/* Compatible railtypes */
|
/* Compatible railtypes */
|
||||||
RAILTYPES_ELECTRIC | RAILTYPES_RAIL,
|
{RAILTYPE_RAIL, RAILTYPE_ELECTRIC},
|
||||||
|
|
||||||
/* bridge offset */
|
/* bridge offset */
|
||||||
0,
|
0,
|
||||||
|
@ -204,10 +204,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
CalendarTime::INVALID_DATE,
|
CalendarTime::INVALID_DATE,
|
||||||
|
|
||||||
/* railtypes required for this to be introduced */
|
/* railtypes required for this to be introduced */
|
||||||
RAILTYPES_NONE,
|
{},
|
||||||
|
|
||||||
/* introduction rail types */
|
/* introduction rail types */
|
||||||
RAILTYPES_ELECTRIC,
|
{RAILTYPE_ELECTRIC},
|
||||||
|
|
||||||
/* sort order */
|
/* sort order */
|
||||||
1 << 4 | 7,
|
1 << 4 | 7,
|
||||||
|
@ -260,10 +260,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
SPR_MONO_SNOW_OFFSET,
|
SPR_MONO_SNOW_OFFSET,
|
||||||
|
|
||||||
/* Powered railtypes */
|
/* Powered railtypes */
|
||||||
RAILTYPES_MONO,
|
{RAILTYPE_MONO},
|
||||||
|
|
||||||
/* Compatible Railtypes */
|
/* Compatible Railtypes */
|
||||||
RAILTYPES_MONO,
|
{RAILTYPE_MONO},
|
||||||
|
|
||||||
/* bridge offset */
|
/* bridge offset */
|
||||||
16,
|
16,
|
||||||
|
@ -302,10 +302,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
CalendarTime::INVALID_DATE,
|
CalendarTime::INVALID_DATE,
|
||||||
|
|
||||||
/* railtypes required for this to be introduced */
|
/* railtypes required for this to be introduced */
|
||||||
RAILTYPES_NONE,
|
{},
|
||||||
|
|
||||||
/* introduction rail types */
|
/* introduction rail types */
|
||||||
RAILTYPES_MONO,
|
{RAILTYPE_MONO},
|
||||||
|
|
||||||
/* sort order */
|
/* sort order */
|
||||||
2 << 4 | 7,
|
2 << 4 | 7,
|
||||||
|
@ -358,10 +358,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
SPR_MGLV_SNOW_OFFSET,
|
SPR_MGLV_SNOW_OFFSET,
|
||||||
|
|
||||||
/* Powered railtypes */
|
/* Powered railtypes */
|
||||||
RAILTYPES_MAGLEV,
|
{RAILTYPE_MAGLEV},
|
||||||
|
|
||||||
/* Compatible Railtypes */
|
/* Compatible Railtypes */
|
||||||
RAILTYPES_MAGLEV,
|
{RAILTYPE_MAGLEV},
|
||||||
|
|
||||||
/* bridge offset */
|
/* bridge offset */
|
||||||
24,
|
24,
|
||||||
|
@ -400,10 +400,10 @@ static const RailTypeInfo _original_railtypes[] = {
|
||||||
CalendarTime::INVALID_DATE,
|
CalendarTime::INVALID_DATE,
|
||||||
|
|
||||||
/* railtypes required for this to be introduced */
|
/* railtypes required for this to be introduced */
|
||||||
RAILTYPES_NONE,
|
{},
|
||||||
|
|
||||||
/* introduction rail types */
|
/* introduction rail types */
|
||||||
RAILTYPES_MAGLEV,
|
{RAILTYPE_MAGLEV},
|
||||||
|
|
||||||
/* sort order */
|
/* sort order */
|
||||||
3 << 4 | 7,
|
3 << 4 | 7,
|
||||||
|
|
|
@ -114,7 +114,7 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
|
||||||
const RailVehicleInfo *rvi_v = RailVehInfo(this->engine_type);
|
const RailVehicleInfo *rvi_v = RailVehInfo(this->engine_type);
|
||||||
EngineID first_engine = this->IsFrontEngine() ? this->engine_type : EngineID::Invalid();
|
EngineID first_engine = this->IsFrontEngine() ? this->engine_type : EngineID::Invalid();
|
||||||
this->gcache.cached_total_length = 0;
|
this->gcache.cached_total_length = 0;
|
||||||
this->compatible_railtypes = RAILTYPES_NONE;
|
this->compatible_railtypes = {};
|
||||||
|
|
||||||
bool train_can_tilt = true;
|
bool train_can_tilt = true;
|
||||||
int16_t min_curve_speed_mod = INT16_MAX;
|
int16_t min_curve_speed_mod = INT16_MAX;
|
||||||
|
@ -172,14 +172,14 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
|
||||||
/* Do not count powered wagons for the compatible railtypes, as wagons always
|
/* Do not count powered wagons for the compatible railtypes, as wagons always
|
||||||
have railtype normal */
|
have railtype normal */
|
||||||
if (rvi_u->power > 0) {
|
if (rvi_u->power > 0) {
|
||||||
this->compatible_railtypes |= GetRailTypeInfo(u->railtype)->powered_railtypes;
|
this->compatible_railtypes.Set(GetRailTypeInfo(u->railtype)->powered_railtypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Some electric engines can be allowed to run on normal rail. It happens to all
|
/* Some electric engines can be allowed to run on normal rail. It happens to all
|
||||||
* existing electric engines when elrails are disabled and then re-enabled */
|
* existing electric engines when elrails are disabled and then re-enabled */
|
||||||
if (HasBit(u->flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL)) {
|
if (HasBit(u->flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL)) {
|
||||||
u->railtype = RAILTYPE_RAIL;
|
u->railtype = RAILTYPE_RAIL;
|
||||||
u->compatible_railtypes |= RAILTYPES_RAIL;
|
u->compatible_railtypes.Set(RAILTYPE_RAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* max speed is the minimum of the speed limits of all vehicles in the consist */
|
/* max speed is the minimum of the speed limits of all vehicles in the consist */
|
||||||
|
@ -3031,7 +3031,7 @@ static void TrainEnterStation(Train *v, StationID station)
|
||||||
static inline bool CheckCompatibleRail(const Train *v, TileIndex tile)
|
static inline bool CheckCompatibleRail(const Train *v, TileIndex tile)
|
||||||
{
|
{
|
||||||
return IsTileOwner(tile, v->owner) &&
|
return IsTileOwner(tile, v->owner) &&
|
||||||
(!v->IsFrontEngine() || HasBit(v->compatible_railtypes, GetRailType(tile)));
|
(!v->IsFrontEngine() || v->compatible_railtypes.Test(GetRailType(tile)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Data structure for storing engine speed changes of an acceleration type. */
|
/** Data structure for storing engine speed changes of an acceleration type. */
|
||||||
|
|
Loading…
Reference in New Issue