diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf
index 7f4f6cbc49..6cee79959e 100644
Binary files a/media/baseset/openttd.grf and b/media/baseset/openttd.grf differ
diff --git a/media/baseset/openttd.grf.hash b/media/baseset/openttd.grf.hash
index 25a50247f5..f3b216de53 100644
--- a/media/baseset/openttd.grf.hash
+++ b/media/baseset/openttd.grf.hash
@@ -1 +1 @@
-4f03553f614a06d86dc06376db3353c7
+8bc3926cb50e19747de498357417d973
diff --git a/media/baseset/openttd/CMakeLists.txt b/media/baseset/openttd/CMakeLists.txt
index 30844b8804..ee93ba80b1 100644
--- a/media/baseset/openttd/CMakeLists.txt
+++ b/media/baseset/openttd/CMakeLists.txt
@@ -20,6 +20,7 @@ if(GRFCODEC_FOUND)
${CMAKE_CURRENT_SOURCE_DIR}/openttdgui.nfo
${CMAKE_CURRENT_SOURCE_DIR}/palette.nfo
${CMAKE_CURRENT_SOURCE_DIR}/roadstops.nfo
+ ${CMAKE_CURRENT_SOURCE_DIR}/road_waypoints.nfo
${CMAKE_CURRENT_SOURCE_DIR}/signals.nfo
${CMAKE_CURRENT_SOURCE_DIR}/sloped_tracks.nfo
${CMAKE_CURRENT_SOURCE_DIR}/tramtracks.nfo
@@ -42,6 +43,7 @@ if(GRFCODEC_FOUND)
${CMAKE_CURRENT_SOURCE_DIR}/openttdgui_convert_tram.png
${CMAKE_CURRENT_SOURCE_DIR}/openttdgui_group_livery.png
${CMAKE_CURRENT_SOURCE_DIR}/roadstops.png
+ ${CMAKE_CURRENT_SOURCE_DIR}/road_waypoints.png
${CMAKE_CURRENT_SOURCE_DIR}/signals.png
${CMAKE_CURRENT_SOURCE_DIR}/sloped_tracks.png
${CMAKE_CURRENT_SOURCE_DIR}/tramtracks.png
diff --git a/media/baseset/openttd/openttd.nfo b/media/baseset/openttd/openttd.nfo
index c1ed751c55..3d59f08543 100644
--- a/media/baseset/openttd/openttd.nfo
+++ b/media/baseset/openttd/openttd.nfo
@@ -98,3 +98,4 @@
#include "mono.nfo"
#include "tunnel_portals.nfo"
#include "palette.nfo"
+#include "road_waypoints.nfo"
diff --git a/media/baseset/openttd/road_waypoints.nfo b/media/baseset/openttd/road_waypoints.nfo
new file mode 100644
index 0000000000..4e7a27019b
--- /dev/null
+++ b/media/baseset/openttd/road_waypoints.nfo
@@ -0,0 +1,14 @@
+// This file is part of OpenTTD.
+// OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+// OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
+//
+
+ -1 * 0 0C "Road waypoints"
+//@@LINT OFF
+ -1 * 3 05 19 04
+//@@LINT ON
+ -1 sprites/road_waypoints.png 8bpp 10 10 64 40 -5 -22 normal
+ -1 sprites/road_waypoints.png 8bpp 90 10 64 40 -31 -9 normal
+ -1 sprites/road_waypoints.png 8bpp 170 10 64 35 -31 -4 normal
+ -1 sprites/road_waypoints.png 8bpp 240 10 64 35 -57 -17 normal
diff --git a/media/baseset/openttd/road_waypoints.png b/media/baseset/openttd/road_waypoints.png
new file mode 100644
index 0000000000..2934cb5b22
Binary files /dev/null and b/media/baseset/openttd/road_waypoints.png differ
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index d026d4e9d4..c0507be74e 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -6384,6 +6384,7 @@ static constexpr auto _action5_types = std::to_array({
/* 0x16 */ { A5BLOCK_ALLOW_OFFSET, SPR_AIRPORT_PREVIEW_BASE, 1, SPR_AIRPORT_PREVIEW_COUNT, "Airport preview graphics" },
/* 0x17 */ { A5BLOCK_ALLOW_OFFSET, SPR_RAILTYPE_TUNNEL_BASE, 1, RAILTYPE_TUNNEL_BASE_COUNT, "Railtype tunnel base" },
/* 0x18 */ { A5BLOCK_ALLOW_OFFSET, SPR_PALETTE_BASE, 1, PALETTE_SPRITE_COUNT, "Palette" },
+ /* 0x19 */ { A5BLOCK_ALLOW_OFFSET, SPR_ROAD_WAYPOINTS_BASE, 1, ROAD_WAYPOINTS_SPRITE_COUNT, "Road waypoints" },
});
/**
diff --git a/src/table/sprites.h b/src/table/sprites.h
index ea522724b5..0ab4f1bc99 100644
--- a/src/table/sprites.h
+++ b/src/table/sprites.h
@@ -307,8 +307,16 @@ static const uint16_t EMPTY_BOUNDING_BOX_SPRITE_COUNT = 1;
static const SpriteID SPR_PALETTE_BASE = SPR_EMPTY_BOUNDING_BOX + EMPTY_BOUNDING_BOX_SPRITE_COUNT;
static const uint16_t PALETTE_SPRITE_COUNT = 1;
+/** Road waypoint sprites. */
+static const SpriteID SPR_ROAD_WAYPOINTS_BASE = SPR_PALETTE_BASE + PALETTE_SPRITE_COUNT;
+static const SpriteID SPR_ROAD_WAYPOINT_Y_W = SPR_ROAD_WAYPOINTS_BASE;
+static const SpriteID SPR_ROAD_WAYPOINT_Y_E = SPR_ROAD_WAYPOINTS_BASE + 1;
+static const SpriteID SPR_ROAD_WAYPOINT_X_W = SPR_ROAD_WAYPOINTS_BASE + 2;
+static const SpriteID SPR_ROAD_WAYPOINT_X_E = SPR_ROAD_WAYPOINTS_BASE + 3;
+static const uint16_t ROAD_WAYPOINTS_SPRITE_COUNT = 4;
+
/* From where can we start putting NewGRFs? */
-static const SpriteID SPR_NEWGRFS_BASE = SPR_PALETTE_BASE + PALETTE_SPRITE_COUNT;
+static const SpriteID SPR_NEWGRFS_BASE = SPR_ROAD_WAYPOINTS_BASE + ROAD_WAYPOINTS_SPRITE_COUNT;
/* Manager face sprites */
static const SpriteID SPR_GRADIENT = 874; // background gradient behind manager face
diff --git a/src/table/station_land.h b/src/table/station_land.h
index b67fbd94fe..fc47de8d77 100644
--- a/src/table/station_land.h
+++ b/src/table/station_land.h
@@ -763,6 +763,20 @@ static const DrawTileSeqStruct _station_display_datas_0171[] = {
TILE_SEQ_END()
};
+/* road waypoint X */
+static const DrawTileSeqStruct _station_display_datas_road_waypoint_X[] = {
+ TILE_SEQ_LINE( 0, 0, 0, 16, 3, 16, SPR_ROAD_WAYPOINT_X_W | (1U << PALETTE_MODIFIER_COLOUR))
+ TILE_SEQ_LINE( 0, 13, 0, 16, 3, 16, SPR_ROAD_WAYPOINT_X_E | (1U << PALETTE_MODIFIER_COLOUR))
+ TILE_SEQ_END()
+};
+
+/* road waypoint Y */
+static const DrawTileSeqStruct _station_display_datas_road_waypoint_Y[] = {
+ TILE_SEQ_LINE(13, 0, 0, 3, 16, 16, SPR_ROAD_WAYPOINT_Y_W | (1U << PALETTE_MODIFIER_COLOUR))
+ TILE_SEQ_LINE( 0, 0, 0, 3, 16, 16, SPR_ROAD_WAYPOINT_Y_E | (1U << PALETTE_MODIFIER_COLOUR))
+ TILE_SEQ_END()
+};
+
static const DrawTileSeqStruct _station_display_datas_waypoint_X[] = {
TILE_SEQ_LINE( 0, 0, 0, 16, 5, 23, SPR_WAYPOINT_X_1 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE( 0, 11, 0, 16, 5, 23, SPR_WAYPOINT_X_2 | (1U << PALETTE_MODIFIER_COLOUR))
@@ -956,12 +970,12 @@ static const DrawTileSprites _station_display_datas_bus[] = {
};
static const DrawTileSprites _station_display_datas_road_waypoint[] = {
- TILE_SPRITE_LINE(SPR_BUS_STOP_NE_GROUND | (1U << PALETTE_MODIFIER_COLOUR), _station_display_datas_71)
- TILE_SPRITE_LINE(SPR_BUS_STOP_SE_GROUND | (1U << PALETTE_MODIFIER_COLOUR), _station_display_datas_72)
- TILE_SPRITE_LINE(SPR_BUS_STOP_SW_GROUND | (1U << PALETTE_MODIFIER_COLOUR), _station_display_datas_73)
- TILE_SPRITE_LINE(SPR_BUS_STOP_NW_GROUND | (1U << PALETTE_MODIFIER_COLOUR), _station_display_datas_74)
- TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_X, _station_display_datas_0170)
- TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_Y, _station_display_datas_0171)
+ TILE_SPRITE_LINE(0, nullptr)
+ TILE_SPRITE_LINE(0, nullptr)
+ TILE_SPRITE_LINE(0, nullptr)
+ TILE_SPRITE_LINE(0, nullptr)
+ TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_X, _station_display_datas_road_waypoint_X)
+ TILE_SPRITE_LINE(SPR_ROAD_PAVED_STRAIGHT_Y, _station_display_datas_road_waypoint_Y)
};
static const DrawTileSprites _station_display_datas_oilrig[] = {