summaryrefslogtreecommitdiff
path: root/rail_gui.c
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-08-15 20:23:42 +0000
committerdarkvater <darkvater@openttd.org>2004-08-15 20:23:42 +0000
commit3fe3a023e5eb1fe01f81644b755561a46c2825f4 (patch)
treeff066d8d1481018e973b2aa7bc39ae471d049d54 /rail_gui.c
parent69b09ef302fd9c9514203292e5c664f032a85a7d (diff)
downloadopenttd-3fe3a023e5eb1fe01f81644b755561a46c2825f4.tar.xz
(svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
Diffstat (limited to 'rail_gui.c')
-rw-r--r--rail_gui.c51
1 files changed, 47 insertions, 4 deletions
diff --git a/rail_gui.c b/rail_gui.c
index ddbbd26b8..a2e830ec5 100644
--- a/rail_gui.c
+++ b/rail_gui.c
@@ -140,7 +140,7 @@ static void PlaceRail_Station(uint tile)
}
}
-static void PlaceRail_Signals(uint tile)
+static void GenericPlaceSignals(uint tile)
{
uint trackstat;
int i;
@@ -199,6 +199,11 @@ static void PlaceRail_ConvertRail(uint tile)
VpStartPlaceSizing(tile, VPM_X_AND_Y | (1<<4));
}
+static void PlaceRail_AutoSignals(uint tile)
+{
+ VpStartPlaceSizing(tile, VPM_SIGNALDIRS);
+}
+
static void BuildRailClick_AutoRail(Window *w)
{
HandlePlacePushButton(w, 3, _cur_railtype + SPR_OPENTTD_BASE + 4, 1, PlaceRail_AutoRail);
@@ -255,9 +260,9 @@ static void BuildRailClick_Station(Window *w)
if (HandlePlacePushButton(w, 12, 0x514, 1, PlaceRail_Station)) ShowStationBuilder();
}
-static void BuildRailClick_Signals(Window *w)
+static void BuildRailClick_AutoSignals(Window *w)
{
- HandlePlacePushButton(w, 13, ANIMCURSOR_BUILDSIGNALS, 1, PlaceRail_Signals);
+ HandlePlacePushButton(w, 13, ANIMCURSOR_BUILDSIGNALS , 1, PlaceRail_AutoSignals);
}
static void BuildRailClick_Bridge(Window *w)
@@ -508,6 +513,42 @@ static void HandleAutodirPlacement()
}
}
+static void HandleAutoSignalPlacement()
+{
+ TileHighlightData *thd = &_thd;
+ int mode;
+ uint trackstat = 0;
+
+ int dx = thd->selstart.x - (thd->selend.x&~0xF);
+ int dy = thd->selstart.y - (thd->selend.y&~0xF);
+
+ if (dx == 0 && dy == 0 ) // 1x1 tile signals
+ GenericPlaceSignals(TILE_FROM_XY(thd->selend.x, thd->selend.y));
+ else { // signals have been dragged
+ if (thd->drawstyle == HT_RECT) { // X,Y direction
+ if (dx == 0)
+ mode = VPM_FIX_X;
+ else if (dy == 0)
+ mode = VPM_FIX_Y;
+
+ trackstat = 0xC0;
+ } else { // W-E or N-S direction
+ mode = thd->drawstyle & 1 ? 0 : 3;
+
+ if (dx == dy || abs(dx - dy) == 16) // North<->South track |
+ trackstat = (thd->drawstyle & 1) ? 0x20 : 0x10;
+ else if (dx == -dy || abs(dx + dy) == 16) // East<->West track --
+ trackstat = (thd->drawstyle & 1) ? 4 : 8;
+ }
+
+ DoCommandP(TILE_FROM_XY(thd->selstart.x, thd->selstart.y), TILE_FROM_XY(thd->selend.x, thd->selend.y),
+ (mode << 4) | (_remove_button_clicked + (_ctrl_pressed ? 8 : 0)) | (trackstat << 8),
+ CcPlaySound1E,
+ (_remove_button_clicked ? CMD_BUILD_MANY_SIGNALS | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1013_CAN_T_REMOVE_SIGNALS_FROM) :
+ CMD_BUILD_MANY_SIGNALS | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1010_CAN_T_BUILD_SIGNALS_HERE) ) );
+ }
+}
+
static OnButtonClick * const _build_railroad_button_proc[] = {
BuildRailClick_AutoRail,
BuildRailClick_N,
@@ -519,7 +560,7 @@ static OnButtonClick * const _build_railroad_button_proc[] = {
BuildRailClick_Raise,
BuildRailClick_Depot,
BuildRailClick_Station,
- BuildRailClick_Signals,
+ BuildRailClick_AutoSignals,
BuildRailClick_Bridge,
BuildRailClick_Tunnel,
BuildRailClick_Remove,
@@ -603,6 +644,8 @@ static void BuildRailToolbWndProc(Window *w, WindowEvent *e)
if (_ctrl_pressed) _remove_button_clicked = true;
HandleAutodirPlacement();
_remove_button_clicked = old;
+ } else if (e->place.userdata == VPM_SIGNALDIRS) {
+ HandleAutoSignalPlacement();
} else if (e->place.userdata == VPM_X_AND_Y) {
DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
} else if (e->place.userdata == (VPM_X_AND_Y | (1<<4))) {