Changeset - r25316:59902ba5b847
[Not reviewed]
master
0 4 0
PeterN - 3 years ago 2021-04-30 11:03:07
peter1138@openttd.org
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.
4 files changed with 13 insertions and 55 deletions:
0 comments (0 inline, 0 general)
src/engine.cpp
Show inline comments
 
@@ -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
src/engine_base.h
Show inline comments
 
@@ -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;
 

	
 
	/**
src/newgrf_engine.cpp
Show inline comments
 
@@ -26,62 +26,29 @@
 

	
 
#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)
 
{
 
	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)
 
{
 
	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)
 
{
 
	Engine *e = Engine::Get(engine);
src/newgrf_engine.h
Show inline comments
 
@@ -116,8 +116,6 @@ enum VehicleTrigger {
 
};
 
void TriggerVehicle(Vehicle *veh, VehicleTrigger trigger);
 

	
 
void UnloadWagonOverrides(Engine *e);
 

	
 
void AlterVehicleListOrder(EngineID engine, uint target);
 
void CommitVehicleListOrderChanges();
 

	
0 comments (0 inline, 0 general)