Index: src/lang/english.txt =================================================================== --- src/lang/english.txt (revision 19316) +++ src/lang/english.txt (working copy) @@ -1249,6 +1249,7 @@ STR_CONFIG_SETTING_ALLOW_SHARES :{LTBLUE}Allow buying shares from other companies: {ORANGE}{STRING1} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :{LTBLUE}Percentage of leg profit to pay in feeder systems: {ORANGE}{STRING1}% STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :{LTBLUE}When dragging, place signals every: {ORANGE}{STRING1} tile(s) +STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE :{LTBLUE}When dragging, keep fixed distance between signals STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}Automatically build semaphores before: {ORANGE}{STRING1} STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI :{LTBLUE}Enable the signal GUI: {ORANGE}{STRING1} STR_CONFIG_SETTING_DEFAULT_SIGNAL_TYPE :{LTBLUE}Signal type to build by default: {ORANGE}{STRING1} Index: src/rail_cmd.cpp =================================================================== --- src/rail_cmd.cpp (revision 19316) +++ src/rail_cmd.cpp (working copy) @@ -1169,6 +1169,9 @@ /* signal_ctr - amount of tiles already processed * signals_density - setting to put signal on every Nth tile (double space on |, -- tracks) + * last_plain_tile - index of last plain rail tile (IsPlainRaiTile) + * last_plain_ctr - signal_ctr value for last plain rail tile + * last_used_ctr - signal_ctr value for last built/removed signal ********** * trackdir - trackdir to build with autorail * semaphores - semaphores or signals @@ -1176,9 +1179,16 @@ * and convert all others to semaphore/signal * remove - 1 remove signals, 0 build signals */ int signal_ctr = 0; + TileIndex last_plain_tile = INVALID_TILE; + int last_plain_ctr; + int last_used_ctr = INT_MIN; // initially INT_MIN to force building/removing at the first tile for (;;) { /* only build/remove signals with the specified density */ - if ((remove && autofill) || signal_ctr % signal_density == 0) { + if ( + (remove && autofill) || + (signal_ctr >= (last_used_ctr + signal_density)) || + (_settings_client.gui.drag_signals_fixed_distance && (signal_ctr % signal_density == 0)) + ) { uint32 p1 = GB(TrackdirToTrack(trackdir), 0, 3); SB(p1, 3, 1, mode); SB(p1, 4, 1, semaphores); @@ -1196,6 +1206,17 @@ if (ret.Succeeded()) { err = false; total_cost.AddCost(ret); + last_used_ctr = signal_ctr; + } else { + /* If signal can't be placed, place it before obstacle */ + if ((last_plain_tile != INVALID_TILE) && (last_plain_tile != tile) && (last_plain_ctr != last_used_ctr)) { + ret = DoCommand(last_plain_tile, p1, signals, flags, remove ? CMD_REMOVE_SIGNALS : CMD_BUILD_SIGNALS); + if (ret.Succeeded()) { + err = false; + total_cost.AddCost(ret); + last_used_ctr = last_plain_ctr; + } + } } } @@ -1217,6 +1238,12 @@ ToggleBit(trackdir, 0); } } + + /* remember last tile where we can place a signal */ + if (IsPlainRailTile(tile)) { + last_plain_tile = tile; + last_plain_ctr = signal_ctr; + } } return err ? CMD_ERROR : total_cost; Index: src/settings_gui.cpp =================================================================== --- src/settings_gui.cpp (revision 19316) +++ src/settings_gui.cpp (working copy) @@ -1309,6 +1309,7 @@ SettingEntry("construction.signal_side"), SettingEntry("gui.enable_signal_gui"), SettingEntry("gui.drag_signals_density"), + SettingEntry("gui.drag_signals_fixed_distance"), SettingEntry("gui.semaphore_build_before"), SettingEntry("gui.default_signal_type"), SettingEntry("gui.cycle_signal_types"), Index: src/settings_type.h =================================================================== --- src/settings_type.h (revision 19316) +++ src/settings_type.h (working copy) @@ -87,6 +87,7 @@ bool bridge_pillars; ///< show bridge pillars for high bridges bool auto_euro; ///< automatically switch to euro in 2002 byte drag_signals_density; ///< many signals density + bool drag_signals_fixed_distance; ///< keep fixed distance between signals when dragging Year semaphore_build_before; ///< build semaphore signals automatically before this year byte news_message_timeout; ///< how much longer than the news message "age" should we keep the message in the history bool show_track_reservation; ///< highlight reserved tracks. Index: src/table/settings.h =================================================================== --- src/table/settings.h (revision 19316) +++ src/table/settings.h (working copy) @@ -570,6 +570,7 @@ SDTC_VAR(gui.default_rail_type, SLE_UINT8, S, MS, 0, 0, 2, 0, STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE, NULL), SDTC_BOOL(gui.enable_signal_gui, S, 0, true, STR_CONFIG_SETTING_ENABLE_SIGNAL_GUI, CloseSignalGUI), SDTC_VAR(gui.drag_signals_density, SLE_UINT8, S, 0, 4, 1, 20, 0, STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY, DragSignalsDensityChanged), + SDTC_BOOL(gui.drag_signals_fixed_distance, S, 0, false, STR_CONFIG_SETTING_DRAG_SIGNALS_FIXED_DISTANCE, NULL), SDTC_VAR(gui.semaphore_build_before, SLE_INT32, S, NC, 1950, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_SETTING_SEMAPHORE_BUILD_BEFORE_DATE, ResetSignalVariant), SDTC_BOOL(gui.vehicle_income_warn, S, 0, true, STR_CONFIG_SETTING_WARN_INCOME_LESS, NULL), SDTC_VAR(gui.order_review_system, SLE_UINT8, S, MS, 2, 0, 2, 0, STR_CONFIG_SETTING_ORDER_REVIEW, NULL),