(svn r2515) -Codechange: Removed a good deal of magic sprite numbers in the rail drawing code, and placed neatly into arrays and enums. This also makes way to implement more railtypes without having to do tons of ugly hacks.
authorcelestar
Mon, 04 Jul 2005 10:01:06 +0000
changeset 2007 b3bdf698ee26
parent 2006 324916f22a8a
child 2008 c9d6585c96c8
(svn r2515) -Codechange: Removed a good deal of magic sprite numbers in the rail drawing code, and placed neatly into arrays and enums. This also makes way to implement more railtypes without having to do tons of ugly hacks.
rail_cmd.c
table/sprites.h
--- a/rail_cmd.c	Sun Jul 03 13:02:54 2005 +0000
+++ b/rail_cmd.c	Mon Jul 04 10:01:06 2005 +0000
@@ -1326,10 +1326,88 @@
 	AddSortableSpriteToDraw(image, ti->x + x, ti->y + y, xsize, ysize, zsize, ti->z + z);
 }
 
+/* Arrangement of the sprites
+ *  1) Single track in Y direction
+ *  2) Northern and southern trackbits set
+ *  3) "Basis" for 3-way switch
+ *  4) Single rail in Y direction without ground sprite
+ *  5) as above, X direction
+ *  6) as above, nortern track
+ *  7) as above, southern track
+ *  8) as above, eastern track
+ *  9) as above, western track
+ * 10) the offset of the snow sprites
+ */
+static SpriteID RailSpriteIDs[] = {
+	SPR_RAIL_TRACK_Y,
+	SPR_RAIL_TRACK_N_S,
+	SPR_RAIL_TRACK_BASE,
+	SPR_RAIL_SINGLE_Y,
+	SPR_RAIL_SINGLE_X,
+	SPR_RAIL_SINGLE_NORTH,
+	SPR_RAIL_SINGLE_SOUTH,
+	SPR_RAIL_SINGLE_EAST,
+	SPR_RAIL_SINGLE_WEST,
+	SPR_RAIL_SNOW_OFFSET,
+};
+
+static SpriteID MonoSpriteIDs[] = {
+	SPR_MONO_TRACK_Y,
+	SPR_MONO_TRACK_N_S,
+	SPR_MONO_TRACK_BASE,
+	SPR_MONO_SINGLE_Y,
+	SPR_MONO_SINGLE_X,
+	SPR_MONO_SINGLE_NORTH,
+	SPR_MONO_SINGLE_SOUTH,
+	SPR_MONO_SINGLE_EAST,
+	SPR_MONO_SINGLE_WEST,
+	SPR_MONO_SNOW_OFFSET,
+};
+
+static SpriteID MaglevSpriteIDs[] = {
+	SPR_MGLV_TRACK_Y,
+	SPR_MGLV_TRACK_N_S,
+	SPR_MGLV_TRACK_BASE,
+	SPR_MGLV_SINGLE_Y,
+	SPR_MGLV_SINGLE_X,
+	SPR_MGLV_SINGLE_NORTH,
+	SPR_MGLV_SINGLE_SOUTH,
+	SPR_MGLV_SINGLE_EAST,
+	SPR_MGLV_SINGLE_WEST,
+	SPR_MGLV_SNOW_OFFSET,
+};
+
+/** Sprite reference enum */
+enum {
+	TRACK_Y,
+	TRACK_N_S,
+	TRACK_BASE,
+	SINGLE_Y,
+	SINGLE_X,
+	SINGLE_NORTH,
+	SINGLE_SOUTH,
+	SINGLE_EAST,
+	SINGLE_WEST,
+	SNOW_OFFSET,
+};
+
+/** Contains the pointers to the arrays *SpriteIDs.
+  * There, all the Sprites are recorded that the
+  * Track Draw system requireds. Note: Pointer arrangement
+  * must match the tracktype number
+  */
+static SpriteID *TrackSpriteIDs[RAILTYPE_END] = {
+	RailSpriteIDs,
+	MonoSpriteIDs,
+	MaglevSpriteIDs
+};
+
 static void DrawTile_Track(TileInfo *ti)
 {
-	uint32 tracktype_offs, image;
+	uint32 tracktype_offs;
 	byte m5;
+	SpriteID *TrackSet = TrackSpriteIDs[GetRailType(ti->tile)];
+	uint32 image;	//XXX ok why the hell is SpriteID 16 bit when all the drawing routines need 32?
 
 	_drawtile_track_palette = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)));
 
@@ -1344,7 +1422,7 @@
 		special = false;
 
 		// select the sprite to use based on the map5 byte.
-		(image = 0x3F3, m5 == TRACK_BIT_DIAG2) ||
+		(image = TrackSet[TRACK_Y], m5 == TRACK_BIT_DIAG2) ||
 		(image++,				m5 == TRACK_BIT_DIAG1) ||
 		(image++,				m5 == TRACK_BIT_UPPER) ||
 		(image++,				m5 == TRACK_BIT_LOWER) ||
@@ -1352,12 +1430,12 @@
 		(image++,				m5 == TRACK_BIT_LEFT) ||
 		(image++,				m5 == (TRACK_BIT_DIAG1|TRACK_BIT_DIAG2)) ||
 
-		(image = 0x40B, m5 == (TRACK_BIT_UPPER|TRACK_BIT_LOWER)) ||
+		(image = TrackSet[TRACK_N_S], m5 == (TRACK_BIT_UPPER|TRACK_BIT_LOWER)) ||
 		(image++,				m5 == (TRACK_BIT_LEFT|TRACK_BIT_RIGHT)) ||
 
 		(special=true, false) ||
 
-		(image = 0x3FA, !(m5 & (TRACK_BIT_RIGHT|TRACK_BIT_UPPER|TRACK_BIT_DIAG1))) ||
+		(image = TrackSet[TRACK_BASE], !(m5 & (TRACK_BIT_RIGHT|TRACK_BIT_UPPER|TRACK_BIT_DIAG1))) ||
 		(image++,				!(m5 & (TRACK_BIT_LEFT|TRACK_BIT_LOWER|TRACK_BIT_DIAG1))) ||
 		(image++,				!(m5 & (TRACK_BIT_LEFT|TRACK_BIT_UPPER|TRACK_BIT_DIAG2))) ||
 		(image++,				!(m5 & (TRACK_BIT_RIGHT|TRACK_BIT_LOWER|TRACK_BIT_DIAG2))) ||
@@ -1368,23 +1446,24 @@
 			if (f) DrawFoundation(ti, f);
 
 			// default sloped sprites..
-			if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + 0x3F3;
+			if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + TrackSet[TRACK_Y];
 		}
 
-		if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_BROWN)
+		if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_BROWN) {
 			image = (image & 0xFFFF) | 0x3178000; // use a brown palette
-		else if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_ICE_DESERT)
-			image += 26;
+		 } else if ((_map2[ti->tile] & RAIL_MAP2LO_GROUND_MASK)==RAIL_GROUND_ICE_DESERT) {
+			image += TrackSet[SNOW_OFFSET];
+		}
 
-		DrawGroundSprite(image + tracktype_offs);
+		DrawGroundSprite(image);
 
 		if (special) {
-			if (m5 & TRACK_BIT_DIAG1) DrawGroundSprite(0x3ED + tracktype_offs);
-			if (m5 & TRACK_BIT_DIAG2) DrawGroundSprite(0x3EE + tracktype_offs);
-			if (m5 & TRACK_BIT_UPPER) DrawGroundSprite(0x3EF + tracktype_offs);
-			if (m5 & TRACK_BIT_LOWER) DrawGroundSprite(0x3F0 + tracktype_offs);
-			if (m5 & TRACK_BIT_LEFT)  DrawGroundSprite(0x3F2 + tracktype_offs);
-			if (m5 & TRACK_BIT_RIGHT) DrawGroundSprite(0x3F1 + tracktype_offs);
+			if (m5 & TRACK_BIT_DIAG1) DrawGroundSprite(TrackSet[SINGLE_Y]);
+			if (m5 & TRACK_BIT_DIAG2) DrawGroundSprite(TrackSet[SINGLE_X]);
+			if (m5 & TRACK_BIT_UPPER) DrawGroundSprite(TrackSet[SINGLE_NORTH]);
+			if (m5 & TRACK_BIT_LOWER) DrawGroundSprite(TrackSet[SINGLE_SOUTH]);
+			if (m5 & TRACK_BIT_LEFT)  DrawGroundSprite(TrackSet[SINGLE_WEST]);
+			if (m5 & TRACK_BIT_RIGHT) DrawGroundSprite(TrackSet[SINGLE_EAST]);
 		}
 
 		if (_display_opt & DO_FULL_DETAIL) {
--- a/table/sprites.h	Sun Jul 03 13:02:54 2005 +0000
+++ b/table/sprites.h	Mon Jul 04 10:01:06 2005 +0000
@@ -112,8 +112,20 @@
 	SPR_BOUGHT_LAND							= 4790,
 
 	/* sprites for rail and rail stations*/
+	SPR_RAIL_SNOW_OFFSET             = 26,
+	SPR_MONO_SNOW_OFFSET             = 26,
+	SPR_MGLV_SNOW_OFFSET             = 26,
+
+	SPR_RAIL_SINGLE_Y           = 1005,
+  SPR_RAIL_SINGLE_X           = 1006,
+  SPR_RAIL_SINGLE_NORTH       = 1007,
+  SPR_RAIL_SINGLE_SOUTH       = 1008,
+  SPR_RAIL_SINGLE_EAST        = 1009,
+  SPR_RAIL_SINGLE_WEST        = 1010,
 	SPR_RAIL_TRACK_Y						= 1011,
 	SPR_RAIL_TRACK_X						= 1012,
+	SPR_RAIL_TRACK_BASE         = 1018,
+	SPR_RAIL_TRACK_N_S          = 1035,
 	SPR_RAIL_TRACK_Y_SNOW				= 1037,
 	SPR_RAIL_TRACK_X_SNOW				= 1038,
 	SPR_RAIL_DEPOT_SE_1					= 1063,
@@ -140,6 +152,24 @@
 	SPR_RAIL_ROOF_GLASS_Y_TILE_A			= 1084,
 	SPR_RAIL_ROOF_GLASS_X_TILE_B			= 1085,	//second half of the roof glass
 	SPR_RAIL_ROOF_GLASS_Y_TILE_B			= 1086,
+	SPR_MONO_SINGLE_Y                 = 1087,
+  SPR_MONO_SINGLE_X                 = 1088,
+  SPR_MONO_SINGLE_NORTH             = 1089,
+  SPR_MONO_SINGLE_SOUTH             = 1090,
+  SPR_MONO_SINGLE_EAST              = 1091,
+  SPR_MONO_SINGLE_WEST              = 1092,
+	SPR_MONO_TRACK_Y                  = 1093,
+	SPR_MONO_TRACK_BASE               = 1100,
+  SPR_MONO_TRACK_N_S                = 1117,
+	SPR_MGLV_SINGLE_Y                 = 1169,
+  SPR_MGLV_SINGLE_X                 = 1170,
+  SPR_MGLV_SINGLE_NORTH             = 1171,
+  SPR_MGLV_SINGLE_SOUTH             = 1172,
+  SPR_MGLV_SINGLE_EAST              = 1173,
+  SPR_MGLV_SINGLE_WEST              = 1174,
+	SPR_MGLV_TRACK_Y                  = 1175,
+	SPR_MGLV_TRACK_BASE               = 1182,
+  SPR_MGLV_TRACK_N_S                = 1199,
 	SPR_WAYPOINT_X_1						= SPR_OPENTTD_BASE + 18,
 	SPR_WAYPOINT_X_2						= SPR_OPENTTD_BASE + 19,
 	SPR_WAYPOINT_Y_1						= SPR_OPENTTD_BASE + 20,