File diff r5115:7edde0aba70e → r5116:6ab72109f482
elrail.c
Show inline comments
 
@@ -61,6 +61,9 @@
 
#include "rail_map.h"
 
#include "table/sprites.h"
 
#include "table/elrail_data.h"
 
#include "vehicle.h"
 
#include "train.h"
 
#include "gui.h"
 

	
 
static inline TLG GetTLG(TileIndex t)
 
{
 
@@ -360,6 +363,8 @@ static void DrawCatenaryOnBridge(const T
 

	
 
void DrawCatenary(const TileInfo *ti)
 
{
 
	if (_patches.disable_elrails) return;
 

	
 
	switch (GetTileType(ti->tile)) {
 
		case MP_RAILWAY:
 
			if (IsRailDepot(ti->tile)) {
 
@@ -385,3 +390,55 @@ void DrawCatenary(const TileInfo *ti)
 
	}
 
	DrawCatenaryRailway(ti);
 
}
 

	
 
int32 SettingsDisableElrail(int32 p1)
 
{
 
	EngineID e_id;
 
	Vehicle* v;
 
	Player *p;
 
	bool disable = (p1 != 0);
 

	
 
	/* we will now walk through all electric train engines and change their railtypes if it is the wrong one*/
 
	const RailType old_railtype = disable ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL;
 
	const RailType new_railtype = disable ? RAILTYPE_RAIL : RAILTYPE_ELECTRIC;
 

	
 
	/* walk through all train engines */
 
	for (e_id = 0; e_id < NUM_TRAIN_ENGINES; e_id++)
 
	{
 
		const RailVehicleInfo *rv_info = RailVehInfo(e_id);
 
		Engine *e = GetEngine(e_id);
 
		/* if it is an electric rail engine and its railtype is the wrong one */
 
		if (rv_info->engclass == 2 && e->railtype == old_railtype) {
 
			/* change it to the proper one */
 
			e->railtype = new_railtype;
 
		}
 
	}
 

	
 
	/* when disabling elrails, make sure that all existing trains can run on
 
	*  normal rail too */
 
	if (disable) {
 
		FOR_ALL_VEHICLES(v) {
 
			if (v->type == VEH_Train && v->u.rail.railtype == RAILTYPE_ELECTRIC) {
 
				/* this railroad vehicle is now compatible only with elrail,
 
				*  so add there also normal rail compatibility */
 
				v->u.rail.compatible_railtypes |= (1 << RAILTYPE_RAIL);
 
				v->u.rail.railtype = RAILTYPE_RAIL;
 
				SETBIT(v->u.rail.flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL);
 
			}
 
		}
 
	}
 

	
 
	/* setup total power for trains */
 
	FOR_ALL_VEHICLES(v) {
 
		/* power is cached only for front engines */
 
		if (v->type == VEH_Train && IsFrontEngine(v)) TrainPowerChanged(v);
 
	}
 

	
 
	FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
 

	
 
	/* This resets the _last_built_railtype, which will be invalid for electric
 
	* rails. It may have unintended consequences if that function is ever
 
	* extended, though. */
 
	ReinitGuiAfterToggleElrail(disable);
 
	return 0;
 
}