@@ -66,12 +66,6 @@ static_assert(lengthof(_orig_rail_vehicl
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)
this->type = type;
@@ -136,11 +130,6 @@ Engine::Engine(VehicleType type, EngineI
Engine::~Engine()
UnloadWagonOverrides(this);
/**
* Checks whether the engine is a valid (non-articulated part of an) engine.
* @return true if enabled
@@ -15,6 +15,12 @@
#include "core/pool_type.hpp"
#include "newgrf_commons.h"
struct WagonOverride {
std::vector<EngineID> engines;
CargoID cargo;
const SpriteGroup *group;
};
typedef Pool<Engine, EngineID, 64, 64000> EnginePool;
extern EnginePool _engine_pool;
@@ -56,13 +62,11 @@ struct Engine : EnginePool::PoolItem<&_e
* evaluating callbacks.
*/
GRFFilePropsBase<NUM_CARGO + 2> grf_prop;
uint16 overrides_count;
struct WagonOverride *overrides;
std::vector<WagonOverride> overrides;
uint16 list_position;
Engine();
Engine() {}
Engine(VehicleType type, EngineID base);
~Engine();
bool IsEnabled() const;
@@ -26,62 +26,29 @@
#include "safeguards.h"
EngineID *train_id;
uint trains;
void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, EngineID *train_id, uint trains)
Engine *e = Engine::Get(engine);
WagonOverride *wo;
assert(cargo < NUM_CARGO + 2); // Include CT_DEFAULT and CT_PURCHASE pseudo cargoes.
e->overrides_count++;
e->overrides = ReallocT(e->overrides, e->overrides_count);
wo = &e->overrides[e->overrides_count - 1];
WagonOverride *wo = &e->overrides.emplace_back();
wo->group = group;
wo->cargo = cargo;
wo->trains = trains;
wo->train_id = MallocT<EngineID>(trains);
memcpy(wo->train_id, train_id, trains * sizeof *train_id);
wo->engines.assign(train_id, train_id + trains);
const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, EngineID overriding_engine)
const Engine *e = Engine::Get(engine);
for (uint i = 0; i < e->overrides_count; i++) {
const WagonOverride *wo = &e->overrides[i];
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;
for (const WagonOverride &wo : e->overrides) {
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;
return nullptr;
* Unload all wagon override sprite groups.
void UnloadWagonOverrides(Engine *e)
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)
@@ -116,8 +116,6 @@ enum VehicleTrigger {
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
void UnloadWagonOverrides(Engine *e);
void AlterVehicleListOrder(EngineID engine, uint target);
void CommitVehicleListOrderChanges();
Status change: