mirror of https://github.com/OpenTTD/OpenTTD.git
Codechange: Use C++ features for train wagon overrides. (#9141)
This removes the need for C-style array management and allows use of iterators to perform wagon override lookups.
This commit is contained in:
parent
665a3928e2
commit
3dbd6475fe
|
@ -66,12 +66,6 @@ static_assert(lengthof(_orig_rail_vehicle_info) + lengthof(_orig_road_vehicle_in
|
||||||
|
|
||||||
const uint EngineOverrideManager::NUM_DEFAULT_ENGINES = _engine_counts[VEH_TRAIN] + _engine_counts[VEH_ROAD] + _engine_counts[VEH_SHIP] + _engine_counts[VEH_AIRCRAFT];
|
const uint EngineOverrideManager::NUM_DEFAULT_ENGINES = _engine_counts[VEH_TRAIN] + _engine_counts[VEH_ROAD] + _engine_counts[VEH_SHIP] + _engine_counts[VEH_AIRCRAFT];
|
||||||
|
|
||||||
Engine::Engine() :
|
|
||||||
overrides_count(0),
|
|
||||||
overrides(nullptr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Engine::Engine(VehicleType type, EngineID base)
|
Engine::Engine(VehicleType type, EngineID base)
|
||||||
{
|
{
|
||||||
this->type = type;
|
this->type = type;
|
||||||
|
@ -136,11 +130,6 @@ Engine::Engine(VehicleType type, EngineID base)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Engine::~Engine()
|
|
||||||
{
|
|
||||||
UnloadWagonOverrides(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the engine is a valid (non-articulated part of an) engine.
|
* Checks whether the engine is a valid (non-articulated part of an) engine.
|
||||||
* @return true if enabled
|
* @return true if enabled
|
||||||
|
|
|
@ -15,6 +15,12 @@
|
||||||
#include "core/pool_type.hpp"
|
#include "core/pool_type.hpp"
|
||||||
#include "newgrf_commons.h"
|
#include "newgrf_commons.h"
|
||||||
|
|
||||||
|
struct WagonOverride {
|
||||||
|
std::vector<EngineID> engines;
|
||||||
|
CargoID cargo;
|
||||||
|
const SpriteGroup *group;
|
||||||
|
};
|
||||||
|
|
||||||
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
|
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
|
||||||
extern EnginePool _engine_pool;
|
extern EnginePool _engine_pool;
|
||||||
|
|
||||||
|
@ -56,13 +62,11 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> {
|
||||||
* evaluating callbacks.
|
* evaluating callbacks.
|
||||||
*/
|
*/
|
||||||
GRFFilePropsBase<NUM_CARGO + 2> grf_prop;
|
GRFFilePropsBase<NUM_CARGO + 2> grf_prop;
|
||||||
uint16 overrides_count;
|
std::vector<WagonOverride> overrides;
|
||||||
struct WagonOverride *overrides;
|
|
||||||
uint16 list_position;
|
uint16 list_position;
|
||||||
|
|
||||||
Engine();
|
Engine() {}
|
||||||
Engine(VehicleType type, EngineID base);
|
Engine(VehicleType type, EngineID base);
|
||||||
~Engine();
|
|
||||||
bool IsEnabled() const;
|
bool IsEnabled() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,62 +26,29 @@
|
||||||
|
|
||||||
#include "safeguards.h"
|
#include "safeguards.h"
|
||||||
|
|
||||||
struct WagonOverride {
|
|
||||||
EngineID *train_id;
|
|
||||||
uint trains;
|
|
||||||
CargoID cargo;
|
|
||||||
const SpriteGroup *group;
|
|
||||||
};
|
|
||||||
|
|
||||||
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains)
|
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains)
|
||||||
{
|
{
|
||||||
Engine *e = Engine::Get(engine);
|
Engine *e = Engine::Get(engine);
|
||||||
WagonOverride *wo;
|
|
||||||
|
|
||||||
assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes.
|
assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes.
|
||||||
|
|
||||||
e->overrides_count++;
|
WagonOverride *wo = &e->overrides.emplace_back();
|
||||||
e->overrides = ReallocT(e->overrides, e->overrides_count);
|
|
||||||
|
|
||||||
wo = &e->overrides[e->overrides_count - 1];
|
|
||||||
wo->group = group;
|
wo->group = group;
|
||||||
wo->cargo = cargo;
|
wo->cargo = cargo;
|
||||||
wo->trains = trains;
|
wo->engines.assign(train_id, train_id + trains);
|
||||||
wo->train_id = MallocT<EngineID>(trains);
|
|
||||||
memcpy(wo->train_id, train_id, trains * sizeof *train_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine)
|
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine)
|
||||||
{
|
{
|
||||||
const Engine *e = Engine::Get(engine);
|
const Engine *e = Engine::Get(engine);
|
||||||
|
|
||||||
for (uint i = 0; i < e->overrides_count; i++) {
|
for (const WagonOverride &wo : e->overrides) {
|
||||||
const WagonOverride *wo = &e->overrides[i];
|
if (wo.cargo != cargo && wo.cargo != CT_DEFAULT) continue;
|
||||||
|
if (std::find(wo.engines.begin(), wo.engines.end(), overriding_engine) != wo.engines.end()) return wo.group;
|
||||||
if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue;
|
|
||||||
|
|
||||||
for (uint j = 0; j < wo->trains; j++) {
|
|
||||||
if (wo->train_id[j] == overriding_engine) return wo->group;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Unload all wagon override sprite groups.
|
|
||||||
*/
|
|
||||||
void UnloadWagonOverrides(Engine *e)
|
|
||||||
{
|
|
||||||
for (uint i = 0; i < e->overrides_count; i++) {
|
|
||||||
WagonOverride *wo = &e->overrides[i];
|
|
||||||
free(wo->train_id);
|
|
||||||
}
|
|
||||||
free(e->overrides);
|
|
||||||
e->overrides_count = 0;
|
|
||||||
e->overrides = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
|
void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
|
||||||
{
|
{
|
||||||
Engine *e = Engine::Get(engine);
|
Engine *e = Engine::Get(engine);
|
||||||
|
|
|
@ -116,8 +116,6 @@ enum VehicleTrigger {
|
||||||
};
|
};
|
||||||
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
|
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
|
||||||
|
|
||||||
void UnloadWagonOverrides(Engine *e);
|
|
||||||
|
|
||||||
void AlterVehicleListOrder(EngineID engine, uint target);
|
void AlterVehicleListOrder(EngineID engine, uint target);
|
||||||
void CommitVehicleListOrderChanges();
|
void CommitVehicleListOrderChanges();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue