Index: elrail.c =================================================================== --- elrail.c (revision 7194) +++ elrail.c (working copy) @@ -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 @@ 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 @@ } 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; +} Index: gui.h =================================================================== --- gui.h (revision 7194) +++ gui.h (working copy) @@ -35,9 +35,10 @@ void ShowMessageOptions(void); void ShowMessageHistory(void); -/* traintoolb_gui.c */ +/* rail_gui.c */ void ShowBuildRailToolbar(RailType railtype, int button); void PlaceProc_BuyLand(TileIndex tile); +void ReinitGuiAfterToggleElrail(bool disable); /* train_gui.c */ void ShowTrainViewWindow(const Vehicle *v); Index: lang/american.txt =================================================================== --- lang/american.txt (revision 7194) +++ lang/american.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Switch climate: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Change date: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Enable modifying production values: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Allow electric engines to run on normal rail STR_HEADING_FOR_WAYPOINT :{LTBLUE}Heading for {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY} Index: lang/brazilian_portuguese.txt =================================================================== --- lang/brazilian_portuguese.txt (revision 7194) +++ lang/brazilian_portuguese.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Mudar de clima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Alterar data: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Ativar modificação de valores de produção: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Permite Trens elétricos em trilho normal STR_HEADING_FOR_WAYPOINT :{LTBLUE}Dirigindo-se para {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dirigindo-se para {WAYPOINT}, {VELOCITY} Index: lang/catalan.txt =================================================================== --- lang/catalan.txt (revision 7194) +++ lang/catalan.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Canviar clima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Canviar data: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Activar modificació de valors de producció: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Deixar que els trens elèctrics circulin per rails normals STR_HEADING_FOR_WAYPOINT :{LTBLUE}Cap a {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Cap a {WAYPOINT}, a {VELOCITY} Index: lang/czech.txt =================================================================== --- lang/czech.txt (revision 7194) +++ lang/czech.txt (working copy) @@ -1197,7 +1197,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Zmenit podnebí: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Zmenit datum: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Povolit zmenu produkce prumyslu: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Povolit elektrickým lokomotivám vyjet na normální koleje STR_HEADING_FOR_WAYPOINT :{LTBLUE}Mirim do {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Mirim do {WAYPOINT}, {VELOCITY} Index: lang/danish.txt =================================================================== --- lang/danish.txt (revision 7194) +++ lang/danish.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Skift klima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Ændre dato: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Aktiver modifikation af produktion: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Tillad elektriske tog at køre på almindelige skinner STR_HEADING_FOR_WAYPOINT :{LTBLUE}Retning mod {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Retning mod {WAYPOINT}, {VELOCITY} Index: lang/dutch.txt =================================================================== --- lang/dutch.txt (revision 7194) +++ lang/dutch.txt (working copy) @@ -1142,7 +1142,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Verander klimaat: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Verander datum: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Sta aanpassen productiewaarden toe: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Sta elektrische locomotieven toe op normale rails STR_HEADING_FOR_WAYPOINT :{LTBLUE}Op weg naar {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Op weg naar {WAYPOINT}, {VELOCITY} Index: lang/english.txt =================================================================== --- lang/english.txt (revision 7194) +++ lang/english.txt (working copy) @@ -1095,6 +1095,7 @@ STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Default service interval for ships: {ORANGE}disabled STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}Disable servicing when breakdowns set to none: {ORANGE}{STRING1} STR_CONFIG_PATCHES_WAGONSPEEDLIMITS :{LTBLUE}Enable wagon speed limits: {ORANGE}{STRING1} +STR_CONFIG_PATCHES_DISABLE_ELRAILS :{LTBLUE}Disable electric rails: {ORANGE}{STRING1} STR_CONFIG_PATCHES_COLORED_NEWS_YEAR :{LTBLUE}Coloured news appears in: {ORANGE}{STRING1} STR_CONFIG_PATCHES_STARTING_YEAR :{LTBLUE}Starting year: {ORANGE}{STRING1} @@ -1143,7 +1144,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Switch climate: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Change date: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Enable modifying production values: {ORANGE}{STRING1} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Allow electric engines to run on normal rail STR_HEADING_FOR_WAYPOINT :{LTBLUE}Heading for {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY} Index: lang/estonian.txt =================================================================== --- lang/estonian.txt (revision 7194) +++ lang/estonian.txt (working copy) @@ -1197,7 +1197,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Vaheta kliimat: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Muuda kuupäeva: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Luba muutuvad tootmisväärtused: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Luba elektrirongidel sõita tavalisel raudteel STR_HEADING_FOR_WAYPOINT :{LTBLUE}Suudub kontrollpunti: {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Suundub {WAYPOINT}, {VELOCITY} Index: lang/finnish.txt =================================================================== --- lang/finnish.txt (revision 7194) +++ lang/finnish.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Vaihda ilmastoa: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Muuta päiväystä: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Muuntuvat tuotantoarvot: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Salli sähköveturien kulkeminen tavallisella rautatiellä. STR_HEADING_FOR_WAYPOINT :{LTBLUE}Kohde: {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Kohde: {WAYPOINT}, {VELOCITY} Index: lang/french.txt =================================================================== --- lang/french.txt (revision 7194) +++ lang/french.txt (working copy) @@ -1141,7 +1141,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Changer de climat : {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Changer la date: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Permettre la modification des valeurs de production : {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Autoriser les locomotives électriques à circuler sur des voies non-électrifiées STR_HEADING_FOR_WAYPOINT :{LTBLUE}En route pour {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}En route pour {WAYPOINT}, {VELOCITY} Index: lang/german.txt =================================================================== --- lang/german.txt (revision 7194) +++ lang/german.txt (working copy) @@ -1141,7 +1141,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Wechsle Klima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Ändere Datum: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Aktiviere Veränderung der Produktionswerte: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Erlaube E-Loks auf normalen Gleisen zu fahren STR_HEADING_FOR_WAYPOINT :{LTBLUE}Fahre zu {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Fahre zu {WAYPOINT}, {VELOCITY} Index: lang/hungarian.txt =================================================================== --- lang/hungarian.txt (revision 7194) +++ lang/hungarian.txt (working copy) @@ -1206,7 +1206,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Klíma változtatás: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Dátum módosítás: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}A nyersanyagüzemek termelése változtatható: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Közlekedhessenek elektromos mozdonyok hagyományos síneken STR_HEADING_FOR_WAYPOINT :{LTBLUE}Úton {WAYPOINT} felé STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Úton {WAYPOINT} felé, {VELOCITY} Index: lang/icelandic.txt =================================================================== --- lang/icelandic.txt (revision 7194) +++ lang/icelandic.txt (working copy) @@ -1110,7 +1110,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Skipta um loftslag: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Breyta dagsetningu: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Leyfa breytingar á verðmæti framleiðslu: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Leyfa rafdrifnum lestum að nota venjuleg spor STR_HEADING_FOR_WAYPOINT :{LTBLUE}Á leiðinni til {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Á leiðinni til {WAYPOINT}, {VELOCITY} Index: lang/italian.txt =================================================================== --- lang/italian.txt (revision 7194) +++ lang/italian.txt (working copy) @@ -1142,7 +1142,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Cambia paesaggio: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambia data: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Permetti la modifica dei valori di produzione: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Permetti l'uso di locomotori elettrici sui binari normali STR_HEADING_FOR_WAYPOINT :{LTBLUE}Direzione {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Direzione {WAYPOINT}, {VELOCITY} Index: lang/norwegian.txt =================================================================== --- lang/norwegian.txt (revision 7194) +++ lang/norwegian.txt (working copy) @@ -1137,7 +1137,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Bytt klima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Bytt dato: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Tillat endring av produksjonsmengder: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Tillat elektriske lokomotiv å kjøre på vanlige skinner STR_HEADING_FOR_WAYPOINT :{LTBLUE}Har kurs mot {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Har kurs mot {WAYPOINT}, {VELOCITY} Index: lang/polish.txt =================================================================== --- lang/polish.txt (revision 7194) +++ lang/polish.txt (working copy) @@ -1227,7 +1227,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Zmien klimat: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Zmien date: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Pozwol modyfikowac wielkosc produkcji przedsiebiorstw: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Pozwol lokomotywom elektrycznym pracowac na zwyklych torach STR_HEADING_FOR_WAYPOINT :{LTBLUE}Zmierza do {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Zmierza do {WAYPOINT}, {VELOCITY} Index: lang/portuguese.txt =================================================================== --- lang/portuguese.txt (revision 7194) +++ lang/portuguese.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Mudar de clima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Alterar data: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Activar modificação de valores de produção: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Permitir comboios eléctricos em carris normais STR_HEADING_FOR_WAYPOINT :{LTBLUE}Dirige-se a {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Dirige-se a {WAYPOINT}, {VELOCITY} Index: lang/romanian.txt =================================================================== --- lang/romanian.txt (revision 7194) +++ lang/romanian.txt (working copy) @@ -1106,7 +1106,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Schimbã peisajul: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Schimbã data: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Activeaza accesul la valorile de productie: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Permite motoarealor electrice sã ruleze pe sine normale STR_HEADING_FOR_WAYPOINT :{LTBLUE}Merge spre {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Merge spre {WAYPOINT}, {VELOCITY} Index: lang/slovak.txt =================================================================== --- lang/slovak.txt (revision 7194) +++ lang/slovak.txt (working copy) @@ -1206,7 +1206,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Zmenit klimu: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Zmenit datum: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Povolit zmenu objemu vyroby: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Umoznit pouzitie el. rusnov na normalnych tratiach STR_HEADING_FOR_WAYPOINT :{LTBLUE}Smeruje do {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Smeruje do {WAYPOINT}, {VELOCITY} Index: lang/spanish.txt =================================================================== --- lang/spanish.txt (revision 7194) +++ lang/spanish.txt (working copy) @@ -1141,7 +1141,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Cambiar clima: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Cambiar fecha: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Activar modificación de los valores de producción: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Permitir locomotoras eléctricas sobre railes normales STR_HEADING_FOR_WAYPOINT :{LTBLUE}Hacia {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Hacia {WAYPOINT}, {VELOCITY} Index: lang/swedish.txt =================================================================== --- lang/swedish.txt (revision 7194) +++ lang/swedish.txt (working copy) @@ -1140,7 +1140,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}Byt klimat: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Byt datum: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Aktivera modifierande produceringsvärden: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Tillåt elektriska lok att använda vanlig räls STR_HEADING_FOR_WAYPOINT :{LTBLUE}På väg mot {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}På väg mot {WAYPOINT}, {VELOCITY} Index: lang/turkish.txt =================================================================== --- lang/turkish.txt (revision 7194) +++ lang/turkish.txt (working copy) @@ -1139,7 +1139,6 @@ STR_CHEAT_SWITCH_CLIMATE :{LTBLUE}iklimi degistir: {ORANGE} {STRING} STR_CHEAT_CHANGE_DATE :{LTBLUE}Tarihi degistir: {ORANGE} {DATE_SHORT} STR_CHEAT_SETUP_PROD :{LTBLUE}Üretim degerlerini degistir: {ORANGE}{STRING} -STR_CHEAT_ALLOW_CONVRAIL :{LTBLUE}Elektrikli trenler normal raylarda da gidebilsin STR_HEADING_FOR_WAYPOINT :{LTBLUE}Gidiyor -> {WAYPOINT} STR_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}Gidiyor -> {WAYPOINT}, {VELOCITY} Index: main_gui.c =================================================================== --- main_gui.c (revision 7194) +++ main_gui.c (working copy) @@ -46,7 +46,7 @@ static int _rename_what; static byte _terraform_size = 1; -static RailType _last_built_railtype; +RailType _last_built_railtype; static int _scengen_town_size = 2; // depress medium-sized towns per default extern void GenerateIndustries(void); @@ -2448,3 +2448,4 @@ /* Clean old GUI values */ _last_built_railtype = 0; } + Index: misc_gui.c =================================================================== --- misc_gui.c (revision 7194) +++ misc_gui.c (working copy) @@ -1682,18 +1682,6 @@ return _cur_year; } -static int32 ClickAllowConvrail(int32 p1, int32 p2) -{ - Vehicle *v; - SB(_railtypes[RAILTYPE_ELECTRIC].powered_railtypes, RAILTYPE_RAIL, 1, p1); - - FOR_ALL_VEHICLES(v) { - if (v->type == VEH_Train && IsFrontEngine(v)) TrainConsistChanged(v); - } - return p1; -} - - typedef int32 CheckButtonClick(int32, int32); enum ce_flags {CE_CLICK = 1 << 0}; @@ -1720,7 +1708,6 @@ {SLE_BOOL, 0, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL, 0, 0}, {SLE_UINT8, 0, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat,-1, 4}, {SLE_INT32, 0, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat, -1, 1}, - {SLE_BOOL, 0, STR_CHEAT_ALLOW_CONVRAIL, &_cheats.elrail.value, &_cheats.elrail.been_used, &ClickAllowConvrail, 0, 0}, }; Index: openttd.c =================================================================== --- openttd.c (revision 7194) +++ openttd.c (working copy) @@ -606,6 +606,8 @@ _current_player = _local_player; DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE); + SettingsDisableElrail(_patches.disable_elrails); + MarkWholeScreenDirty(); } @@ -1536,5 +1538,19 @@ ConvertNameArray(); } + /* from version 38 we have optional elrails */ + if (CheckSavegameVersion(38)) { + /* old game - before elrails made optional */ + if (CheckSavegameVersion(24)) { + /* very old game - before elrail was introduced */ + _patches.disable_elrails = true; // disable elrails + } else { + /* game with mandatory elrails (r4150+) */ + _patches.disable_elrails = false; // enable elrails + } + } + /* do the same as when elrails were enabled/disabled manually just now */ + SettingsDisableElrail(_patches.disable_elrails); + return true; } Index: rail.h =================================================================== --- rail.h (revision 7194) +++ rail.h (working copy) @@ -465,4 +465,7 @@ void DrawCatenary(const TileInfo *ti); uint GetRailFoundation(Slope tileh, TrackBits bits); + +int32 SettingsDisableElrail(int32 p1); ///< _patches.disable_elrail callback + #endif /* RAIL_H */ Index: rail_cmd.c =================================================================== --- rail_cmd.c (revision 7194) +++ rail_cmd.c (working copy) @@ -883,6 +883,9 @@ // tile is already of requested type? if (GetRailType(tile) == totype) return CMD_ERROR; + // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled + if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; + // change type. if (exec) { TrackBits tracks; Index: rail_gui.c =================================================================== --- rail_gui.c (revision 7194) +++ rail_gui.c (working copy) @@ -22,6 +22,7 @@ #include "variables.h" #include "newgrf_callbacks.h" #include "newgrf_station.h" +#include "train.h" static RailType _cur_railtype; static bool _remove_button_clicked; @@ -1150,3 +1151,20 @@ _railstation.platlength = 1; _railstation.dragdrop = true; } + +void ReinitGuiAfterToggleElrail(bool disable) +{ + extern RailType _last_built_railtype; + if (disable && _last_built_railtype == RAILTYPE_ELECTRIC) { + Window *w; + _last_built_railtype = _cur_railtype = RAILTYPE_RAIL; + w = FindWindowById(WC_BUILD_TOOLBAR, 0); + if (w != NULL && w->wndproc == BuildRailToolbWndProc) { + SetupRailToolbar(_cur_railtype, w); + SetWindowDirty(w); + } + } + MarkWholeScreenDirty(); +} + + Index: road_cmd.c =================================================================== --- road_cmd.c (revision 7194) +++ road_cmd.c (working copy) @@ -430,6 +430,9 @@ if (GetRailTypeCrossing(tile) == totype) return CMD_ERROR; + // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled + if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailTypeCrossing(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; + if (exec) { SetRailTypeCrossing(tile, totype); MarkTileDirtyByTile(tile); Index: saveload.c =================================================================== --- saveload.c (revision 7194) +++ saveload.c (working copy) @@ -30,7 +30,7 @@ #include "variables.h" #include -const uint16 SAVEGAME_VERSION = 37; +const uint16 SAVEGAME_VERSION = 38; uint16 _sl_version; /// the major savegame version identifier byte _sl_minor_version; /// the minor savegame version, DO NOT USE! Index: settings.c =================================================================== --- settings.c (revision 7194) +++ settings.c (working copy) @@ -38,6 +38,7 @@ #include "newgrf.h" #include "genworld.h" #include "date.h" +#include "rail.h" #ifdef WITH_FREETYPE #include "gfx.h" #include "fontcache.h" @@ -1320,6 +1321,7 @@ SDT_VAR(Patches, servint_aircraft, SLE_UINT16, 0,D0, 100, 5, 800, 0, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT, InValidateDetailsWindow), SDT_BOOL(Patches, no_servicing_if_no_breakdowns, 0, 0, false, STR_CONFIG_PATCHES_NOSERVICE, NULL), SDT_BOOL(Patches, wagon_speed_limits, 0, 0, true, STR_CONFIG_PATCHES_WAGONSPEEDLIMITS, NULL), + SDT_CONDBOOL(Patches, disable_elrails, 38, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_PATCHES_DISABLE_ELRAILS, SettingsDisableElrail), /***************************************************************************/ /* Station section of the GUI-configure patches window */ Index: settings_gui.c =================================================================== --- settings_gui.c (revision 7194) +++ settings_gui.c (working copy) @@ -646,6 +646,7 @@ "servint_aircraft", "no_servicing_if_no_breakdowns", "wagon_speed_limits", + "disable_elrails", }; typedef struct PatchEntry { Index: station_cmd.c =================================================================== --- station_cmd.c (revision 7194) +++ station_cmd.c (working copy) @@ -1358,6 +1358,9 @@ if (GetRailType(tile) == totype) return CMD_ERROR; + // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled + if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; + if (exec) { SetRailType(tile, totype); MarkTileDirtyByTile(tile); Index: train_cmd.c =================================================================== --- train_cmd.c (revision 7194) +++ train_cmd.c (working copy) @@ -192,6 +192,13 @@ v->u.rail.compatible_railtypes |= GetRailTypeInfo(u->u.rail.railtype)->powered_railtypes; } + /* Some electric engines can be allowed to run on normal rail. It happens to all + * existing electric engines when elrails are disabled and then re-enabled */ + if (HASBIT(u->u.rail.flags, VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL)) { + u->u.rail.railtype = RAILTYPE_RAIL; + u->u.rail.compatible_railtypes |= (1 << RAILTYPE_RAIL); + } + // max speed is the minimum of the speed limits of all vehicles in the consist if (!(rvi_u->flags & RVI_WAGON) || _patches.wagon_speed_limits) if (rvi_u->max_speed != 0 && !UsesWagonOverride(u)) Index: tunnelbridge_cmd.c =================================================================== --- tunnelbridge_cmd.c (revision 7194) +++ tunnelbridge_cmd.c (working copy) @@ -772,6 +772,9 @@ if (GetRailType(tile) == totype) return CMD_ERROR; + // 'hidden' elrails can't be downgraded to normal rail when elrails are disabled + if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR; + endtile = CheckTunnelBusy(tile, &length); if (endtile == INVALID_TILE) return CMD_ERROR; Index: variables.h =================================================================== --- variables.h (revision 7194) +++ variables.h (working copy) @@ -125,6 +125,7 @@ bool no_servicing_if_no_breakdowns; // dont send vehicles to depot when breakdowns are disabled bool link_terraform_toolbar; // display terraform toolbar when displaying rail, road, water and airport toolbars bool reverse_scroll; // Right-Click-Scrolling scrolls in the opposite direction + bool disable_elrails; // when true, the elrails are disabled bool measure_tooltip; // Show a permanent tooltip when dragging tools byte liveries; // Options for displaying company liveries, 0=none, 1=self, 2=all bool prefer_teamchat; // Choose the chat message target with , true=all players, false=your team @@ -240,7 +241,7 @@ Cheat switch_climate; Cheat change_date; // changes date ingame Cheat setup_prod; // setup raw-material production in game - Cheat elrail; // allow electric engines to be powered on conventional rail + Cheat dummy; // empty cheat (enable running el-engines on normal rail) } Cheats; VARDEF Cheats _cheats; Index: vehicle.h =================================================================== --- vehicle.h (revision 7194) +++ vehicle.h (working copy) @@ -95,6 +95,9 @@ // used to mark train as lost because PF can't find the route VRF_NO_PATH_TO_DESTINATION = 5, + + // used to mark that electric train engine is allowed to run on normal rail + VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL = 6, }; typedef struct VehicleAir {