(svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
authorpeter1138
Sat, 06 May 2006 09:40:12 +0000
changeset 3757 a0bba34a94ba
parent 3756 b3835d8eca4d
child 3758 1ec9e4e26a9f
(svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
rail_cmd.c
--- a/rail_cmd.c	Sat May 06 09:31:06 2006 +0000
+++ b/rail_cmd.c	Sat May 06 09:40:12 2006 +0000
@@ -27,6 +27,8 @@
 #include "rail.h"
 #include "railtypes.h" // include table for railtypes
 #include "newgrf.h"
+#include "newgrf_callbacks.h"
+#include "newgrf_station.h"
 
 extern uint16 _custom_sprites_base;
 
@@ -1323,17 +1325,18 @@
 			if (statspec != NULL) {
 				DrawTileSeqStruct const *seq;
 				// emulate station tile - open with building
-				const DrawTileSprites *cust = &statspec->renderdata[2 + GetWaypointAxis(ti->tile)];
-				uint32 relocation = GetCustomStationRelocation(statspec, ComposeWaypointStation(ti->tile), ti->tile);
+				uint tile = 2;
+				const DrawTileSprites *cust;
+				Station *st = ComposeWaypointStation(ti->tile);
 
-				/* We don't touch the 0x8000 bit. In all this
-				 * waypoint code, it is used to indicate that
-				 * we should offset by railtype, but we always
-				 * do that for custom ground sprites and never
-				 * for station sprites. And in the drawing
-				 * code, it is used to indicate that the sprite
-				 * should be drawn in company colors, and it's
-				 * up to the GRF file to decide that. */
+				uint32 relocation = GetCustomStationRelocation(statspec, st, ti->tile);
+
+				if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+					uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
+					if (callback != CALLBACK_FAILED) tile = callback;
+				}
+
+				cust = &statspec->renderdata[(tile < statspec->tiles ? tile : 0) + GetWaypointAxis(ti->tile)];
 
 				/* If there is no sprite layout, we fall back to the default waypoint graphics. */
 				if (cust != NULL && cust->seq != NULL) {