changeset 3638:bcf3d5966548 draft

(svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test with.
author peter1138 <peter1138@openttd.org>
date Sun, 23 Apr 2006 15:57:34 +0000
parents a8c73fd8a834
children 2ce67e880abf
files newgrf.c newgrf.h rail_cmd.c
diffstat 3 files changed, 34 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/newgrf.c
+++ b/newgrf.c
@@ -38,6 +38,7 @@
 static int _skip_sprites; // XXX
 static uint _file_index; // XXX
 extern int _traininfo_vehicle_pitch;
+SpriteID _signal_base = 0;
 
 static GRFFile *_cur_grffile;
 GRFFile *_first_grffile;
@@ -1823,8 +1824,27 @@
 	type = grf_load_byte(&buf);
 	num  = grf_load_extended(&buf);
 
-	grfmsg(GMS_NOTICE, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %d (unimplemented, ignoring).\n",
-	       type, num);
+	switch (type) {
+		case 0x04: /* Signal graphics */
+			if (num != 112 && num != 240) {
+				grfmsg(GMS_WARN, "GraphicsNews: Signal graphics sprite count must be 112 or 240, skipping.");
+				return;
+			}
+			_signal_base = _cur_spriteid;
+			break;
+
+		default:
+			grfmsg(GMS_NOTICE, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring).\n",
+					type, num);
+			return;
+	}
+
+	grfmsg(GMS_NOTICE, "GraphicsNew: Loading %u sprites of type 0x%02X at SpriteID 0x%04X", num, type, _cur_spriteid);
+
+	for (; num > 0; num--) {
+		LoadNextSprite(_cur_spriteid++, _file_index);
+		_nfo_line++;
+	}
 }
 
 /* Action 0x06 */
--- a/newgrf.h
+++ b/newgrf.h
@@ -60,6 +60,7 @@
 } GRFConfig;
 
 extern GRFConfig *_first_grfconfig;
+extern SpriteID _signal_base;
 
 void LoadNewGRF(uint load_index, uint file_index);
 
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -26,6 +26,7 @@
 #include "waypoint.h"
 #include "rail.h"
 #include "railtypes.h" // include table for railtypes
+#include "newgrf.h"
 
 extern uint16 _custom_sprites_base;
 
@@ -1047,7 +1048,16 @@
 	uint x = TileX(tile) * TILE_SIZE + SignalPositions[side][pos].x;
 	uint y = TileY(tile) * TILE_SIZE + SignalPositions[side][pos].y;
 
-	SpriteID sprite = SignalBase[side][GetSignalVariant(tile)][GetSignalType(tile)] + image + condition;
+	SpriteID sprite;
+
+	/* _signal_base is set by our NewGRF Action 5 loader. If it is 0 then we
+	 * just draw the standard signals, else we get the offset from _signal_base
+	 * and draw that sprite. All the signal sprites are loaded sequentially. */
+	if (_signal_base == 0 || (GetSignalType(tile) == 0 && GetSignalVariant(tile) == SIG_ELECTRIC)) {
+		sprite = SignalBase[side][GetSignalVariant(tile)][GetSignalType(tile)] + image + condition;
+	} else {
+		sprite = _signal_base + (GetSignalType(tile) - 1) * 16 + GetSignalVariant(tile) * 64 + image + condition;
+	}
 
 	AddSortableSpriteToDraw(sprite, x, y, 1, 1, 10, GetSlopeZ(x,y));
 }