mirror of https://github.com/OpenTTD/OpenTTD
Codechange: strongly type EngineID
parent
17b97e5d1b
commit
7e04651220
|
@ -508,11 +508,11 @@ bool Engine::IsVariantHidden(CompanyID c) const
|
||||||
*/
|
*/
|
||||||
void EngineOverrideManager::ResetToDefaultMapping()
|
void EngineOverrideManager::ResetToDefaultMapping()
|
||||||
{
|
{
|
||||||
EngineID id = ENGINE_BEGIN;
|
EngineID id = EngineID::Begin();
|
||||||
for (VehicleType type = VEH_TRAIN; type <= VEH_AIRCRAFT; type++) {
|
for (VehicleType type = VEH_TRAIN; type <= VEH_AIRCRAFT; type++) {
|
||||||
auto &map = this->mappings[type];
|
auto &map = this->mappings[type];
|
||||||
map.clear();
|
map.clear();
|
||||||
for (uint internal_id = 0; internal_id < _engine_counts[type]; internal_id++, id++) {
|
for (uint internal_id = 0; internal_id < _engine_counts[type]; internal_id++, ++id) {
|
||||||
map.emplace_back(INVALID_GRFID, internal_id, type, internal_id, id);
|
map.emplace_back(INVALID_GRFID, internal_id, type, internal_id, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -610,7 +610,7 @@ void SetupEngines()
|
||||||
assert(std::size(mapping) >= _engine_counts[type]);
|
assert(std::size(mapping) >= _engine_counts[type]);
|
||||||
|
|
||||||
for (const EngineIDMapping &eid : mapping) {
|
for (const EngineIDMapping &eid : mapping) {
|
||||||
new (eid.engine) Engine(type, eid.internal_id);
|
new (eid.engine.base()) Engine(type, eid.internal_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -755,7 +755,7 @@ void StartupOneEngine(Engine *e, const TimerGameCalendar::YearMonthDay &aging_ym
|
||||||
}
|
}
|
||||||
|
|
||||||
SetRandomSeed(_settings_game.game_creation.generation_seed ^ seed ^
|
SetRandomSeed(_settings_game.game_creation.generation_seed ^ seed ^
|
||||||
(re->index << 16) ^ (re->info.base_intro.base() << 12) ^ (re->info.decay_speed << 8) ^
|
(re->index.base() << 16) ^ (re->info.base_intro.base() << 12) ^ (re->info.decay_speed << 8) ^
|
||||||
(re->info.lifelength.base() << 4) ^ re->info.retire_early ^
|
(re->info.lifelength.base() << 4) ^ re->info.retire_early ^
|
||||||
e->type ^
|
e->type ^
|
||||||
e->GetGRFID());
|
e->GetGRFID());
|
||||||
|
|
|
@ -32,7 +32,7 @@ enum class EngineDisplayFlag : uint8_t {
|
||||||
|
|
||||||
using EngineDisplayFlags = EnumBitSet<EngineDisplayFlag, uint8_t>;
|
using EngineDisplayFlags = EnumBitSet<EngineDisplayFlag, uint8_t>;
|
||||||
|
|
||||||
typedef Pool<Engine, EngineID, 64, ENGINE_END> EnginePool;
|
typedef Pool<Engine, EngineID, 64, EngineID::End().base()> EnginePool;
|
||||||
extern EnginePool _engine_pool;
|
extern EnginePool _engine_pool;
|
||||||
|
|
||||||
struct Engine : EnginePool::PoolItem<&_engine_pool> {
|
struct Engine : EnginePool::PoolItem<&_engine_pool> {
|
||||||
|
|
|
@ -21,12 +21,8 @@
|
||||||
#include "strings_type.h"
|
#include "strings_type.h"
|
||||||
|
|
||||||
/** Unique identification number of an engine. */
|
/** Unique identification number of an engine. */
|
||||||
enum EngineID : uint16_t {
|
using EngineID = PoolID<uint16_t, struct EngineIDTag, 64000, 0xFFFF>;
|
||||||
ENGINE_BEGIN = 0,
|
static constexpr EngineID INVALID_ENGINE = EngineID::Invalid(); ///< Constant denoting an invalid engine.
|
||||||
ENGINE_END = 64000,
|
|
||||||
INVALID_ENGINE = 0xFFFF ///< Constant denoting an invalid engine.
|
|
||||||
};
|
|
||||||
DECLARE_INCREMENT_DECREMENT_OPERATORS(EngineID)
|
|
||||||
|
|
||||||
struct Engine;
|
struct Engine;
|
||||||
|
|
||||||
|
@ -214,7 +210,7 @@ enum class EngineNameContext : uint8_t {
|
||||||
/** Combine an engine ID and a name context to an engine name dparam. */
|
/** Combine an engine ID and a name context to an engine name dparam. */
|
||||||
inline uint64_t PackEngineNameDParam(EngineID engine_id, EngineNameContext context, uint32_t extra_data = 0)
|
inline uint64_t PackEngineNameDParam(EngineID engine_id, EngineNameContext context, uint32_t extra_data = 0)
|
||||||
{
|
{
|
||||||
return engine_id | (static_cast<uint64_t>(context) << 32) | (static_cast<uint64_t>(extra_data) << 40);
|
return engine_id.base() | (static_cast<uint64_t>(context) << 32) | (static_cast<uint64_t>(extra_data) << 40);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint MAX_LENGTH_ENGINE_NAME_CHARS = 32; ///< The maximum length of an engine name in characters including '\0'
|
static const uint MAX_LENGTH_ENGINE_NAME_CHARS = 32; ///< The maximum length of an engine name in characters including '\0'
|
||||||
|
|
|
@ -345,7 +345,7 @@ struct GRFTempEngineData {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<GRFTempEngineData> _gted; ///< Temporary engine data used during NewGRF loading
|
static ReferenceThroughBaseContainer<std::vector<GRFTempEngineData>> _gted; ///< Temporary engine data used during NewGRF loading
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains the GRF ID of the owner of a vehicle if it has been reserved.
|
* Contains the GRF ID of the owner of a vehicle if it has been reserved.
|
||||||
|
@ -6378,7 +6378,7 @@ static void FeatureNewName(ByteReader &buf)
|
||||||
if (!generic) {
|
if (!generic) {
|
||||||
Engine *e = GetNewEngine(_cur.grffile, (VehicleType)feature, id, _cur.grfconfig->flags.Test(GRFConfigFlag::Static));
|
Engine *e = GetNewEngine(_cur.grffile, (VehicleType)feature, id, _cur.grfconfig->flags.Test(GRFConfigFlag::Static));
|
||||||
if (e == nullptr) break;
|
if (e == nullptr) break;
|
||||||
StringID string = AddGRFString(_cur.grffile->grfid, GRFStringID{e->index}, lang, new_scheme, false, name, e->info.string_id);
|
StringID string = AddGRFString(_cur.grffile->grfid, GRFStringID{e->index.base()}, lang, new_scheme, false, name, e->info.string_id);
|
||||||
e->info.string_id = string;
|
e->info.string_id = string;
|
||||||
} else {
|
} else {
|
||||||
AddGRFString(_cur.grffile->grfid, GRFStringID{id}, lang, new_scheme, true, name, STR_UNDEFINED);
|
AddGRFString(_cur.grffile->grfid, GRFStringID{id}, lang, new_scheme, true, name, STR_UNDEFINED);
|
||||||
|
@ -9245,7 +9245,7 @@ static void FinaliseEngineArray()
|
||||||
|
|
||||||
/* Do final mapping on variant engine ID. */
|
/* Do final mapping on variant engine ID. */
|
||||||
if (e->info.variant_id != INVALID_ENGINE) {
|
if (e->info.variant_id != INVALID_ENGINE) {
|
||||||
e->info.variant_id = GetNewEngineID(e->grf_prop.grffile, e->type, e->info.variant_id);
|
e->info.variant_id = GetNewEngineID(e->grf_prop.grffile, e->type, e->info.variant_id.base());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!e->info.climates.Test(_settings_game.game_creation.landscape)) continue;
|
if (!e->info.climates.Test(_settings_game.game_creation.landscape)) continue;
|
||||||
|
|
|
@ -1332,7 +1332,7 @@ void CommitVehicleListOrderChanges()
|
||||||
{
|
{
|
||||||
/* Build a list of EngineIDs. EngineIDs are sequential from 0 up to the number of pool items with no gaps. */
|
/* Build a list of EngineIDs. EngineIDs are sequential from 0 up to the number of pool items with no gaps. */
|
||||||
std::vector<EngineID> ordering(Engine::GetNumItems());
|
std::vector<EngineID> ordering(Engine::GetNumItems());
|
||||||
std::iota(std::begin(ordering), std::end(ordering), ENGINE_BEGIN);
|
std::iota(std::begin(ordering), std::end(ordering), EngineID::Begin());
|
||||||
|
|
||||||
/* Pre-sort engines by scope-grfid and local index */
|
/* Pre-sort engines by scope-grfid and local index */
|
||||||
std::ranges::sort(ordering, EnginePreSort);
|
std::ranges::sort(ordering, EnginePreSort);
|
||||||
|
|
|
@ -924,7 +924,7 @@ uint32_t SerialiseNewsReference(const NewsReference &reference)
|
||||||
uint32_t operator()(const StationID s) { return s; }
|
uint32_t operator()(const StationID s) { return s; }
|
||||||
uint32_t operator()(const IndustryID i) { return i; }
|
uint32_t operator()(const IndustryID i) { return i; }
|
||||||
uint32_t operator()(const TownID t) { return t; }
|
uint32_t operator()(const TownID t) { return t; }
|
||||||
uint32_t operator()(const EngineID e) { return e; }
|
uint32_t operator()(const EngineID e) { return e.base(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
return std::visit(visitor{}, reference);
|
return std::visit(visitor{}, reference);
|
||||||
|
|
|
@ -41,7 +41,7 @@ static const SaveLoad _engine_desc[] = {
|
||||||
SLE_CONDSSTR(Engine, name, SLE_STR, SLV_84, SL_MAX_VERSION),
|
SLE_CONDSSTR(Engine, name, SLE_STR, SLV_84, SL_MAX_VERSION),
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<Engine> _temp_engine;
|
static ReferenceThroughBaseContainer<std::vector<Engine>> _temp_engine;
|
||||||
|
|
||||||
Engine *GetTempDataEngine(EngineID index)
|
Engine *GetTempDataEngine(EngineID index)
|
||||||
{
|
{
|
||||||
|
@ -134,12 +134,12 @@ struct ENGSChunkHandler : ChunkHandler {
|
||||||
{
|
{
|
||||||
/* Load old separate String ID list into a temporary array. This
|
/* Load old separate String ID list into a temporary array. This
|
||||||
* was always 256 entries. */
|
* was always 256 entries. */
|
||||||
StringID names[256];
|
ReferenceThroughBaseContainer<std::array<StringID, 256>> names{};
|
||||||
|
|
||||||
SlCopy(names, lengthof(names), SLE_STRINGID);
|
SlCopy(names.data(), std::size(names), SLE_STRINGID);
|
||||||
|
|
||||||
/* Copy each string into the temporary engine array. */
|
/* Copy each string into the temporary engine array. */
|
||||||
for (EngineID engine = ENGINE_BEGIN; engine < lengthof(names); engine++) {
|
for (EngineID engine = EngineID::Begin(); engine < std::size(names); ++engine) {
|
||||||
Engine *e = GetTempDataEngine(engine);
|
Engine *e = GetTempDataEngine(engine);
|
||||||
e->name = CopyFromOldName(names[engine]);
|
e->name = CopyFromOldName(names[engine]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -373,23 +373,23 @@ static bool FixTTOEngines()
|
||||||
|
|
||||||
for (Vehicle *v : Vehicle::Iterate()) {
|
for (Vehicle *v : Vehicle::Iterate()) {
|
||||||
if (v->engine_type >= lengthof(tto_to_ttd)) return false;
|
if (v->engine_type >= lengthof(tto_to_ttd)) return false;
|
||||||
v->engine_type = static_cast<EngineID>(tto_to_ttd[v->engine_type]);
|
v->engine_type = static_cast<EngineID>(tto_to_ttd[v->engine_type.base()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load the default engine set. Many of them will be overridden later */
|
/* Load the default engine set. Many of them will be overridden later */
|
||||||
{
|
{
|
||||||
EngineID j = ENGINE_BEGIN;
|
EngineID j = EngineID::Begin();
|
||||||
for (uint16_t i = 0; i < lengthof(_orig_rail_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_TRAIN, i);
|
for (uint16_t i = 0; i < lengthof(_orig_rail_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(VEH_TRAIN, i);
|
||||||
for (uint16_t i = 0; i < lengthof(_orig_road_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_ROAD, i);
|
for (uint16_t i = 0; i < lengthof(_orig_road_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(VEH_ROAD, i);
|
||||||
for (uint16_t i = 0; i < lengthof(_orig_ship_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_SHIP, i);
|
for (uint16_t i = 0; i < lengthof(_orig_ship_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(VEH_SHIP, i);
|
||||||
for (uint16_t i = 0; i < lengthof(_orig_aircraft_vehicle_info); i++, j++) new (GetTempDataEngine(j)) Engine(VEH_AIRCRAFT, i);
|
for (uint16_t i = 0; i < lengthof(_orig_aircraft_vehicle_info); ++i, ++j) new (GetTempDataEngine(j)) Engine(VEH_AIRCRAFT, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
TimerGameCalendar::Date aging_date = std::min(TimerGameCalendar::date + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::ConvertYMDToDate(TimerGameCalendar::Year{2050}, 0, 1));
|
TimerGameCalendar::Date aging_date = std::min(TimerGameCalendar::date + CalendarTime::DAYS_TILL_ORIGINAL_BASE_YEAR, TimerGameCalendar::ConvertYMDToDate(TimerGameCalendar::Year{2050}, 0, 1));
|
||||||
TimerGameCalendar::YearMonthDay aging_ymd = TimerGameCalendar::ConvertDateToYMD(aging_date);
|
TimerGameCalendar::YearMonthDay aging_ymd = TimerGameCalendar::ConvertDateToYMD(aging_date);
|
||||||
|
|
||||||
for (EngineID i = ENGINE_BEGIN; i < 256; i++) {
|
for (EngineID i = EngineID::Begin(); i < 256; ++i) {
|
||||||
OldEngineID oi = ttd_to_tto[i];
|
OldEngineID oi = ttd_to_tto[i.base()];
|
||||||
Engine *e = GetTempDataEngine(i);
|
Engine *e = GetTempDataEngine(i);
|
||||||
|
|
||||||
if (oi == 255) {
|
if (oi == 255) {
|
||||||
|
|
|
@ -19,6 +19,6 @@ ScriptEngineList::ScriptEngineList(ScriptVehicle::VehicleType vehicle_type)
|
||||||
bool is_deity = ScriptCompanyMode::IsDeity();
|
bool is_deity = ScriptCompanyMode::IsDeity();
|
||||||
::CompanyID owner = ScriptObject::GetCompany();
|
::CompanyID owner = ScriptObject::GetCompany();
|
||||||
for (const Engine *e : Engine::IterateType((::VehicleType)vehicle_type)) {
|
for (const Engine *e : Engine::IterateType((::VehicleType)vehicle_type)) {
|
||||||
if (is_deity || e->company_avail.Test(owner)) this->AddItem(e->index);
|
if (is_deity || e->company_avail.Test(owner)) this->AddItem(e->index.base());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1519,7 +1519,7 @@ static bool VehicleMaxSpeedSorter(const Vehicle * const &a, const Vehicle * cons
|
||||||
/** Sort vehicles by model */
|
/** Sort vehicles by model */
|
||||||
static bool VehicleModelSorter(const Vehicle * const &a, const Vehicle * const &b)
|
static bool VehicleModelSorter(const Vehicle * const &a, const Vehicle * const &b)
|
||||||
{
|
{
|
||||||
int r = a->engine_type - b->engine_type;
|
int r = a->engine_type.base() - b->engine_type.base();
|
||||||
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue