(svn r11321) -Codechange: add support to load different graphics for halftile slopes using a NewGRF. Patch by frosch.
authorrubidium
Sat, 20 Oct 2007 21:39:50 +0000
changeset 7772 c89384e3f8de
parent 7771 a900b80b48f2
child 7773 6a97c5cba126
(svn r11321) -Codechange: add support to load different graphics for halftile slopes using a NewGRF. Patch by frosch.
src/gfxinit.cpp
src/gfxinit.h
src/newgrf.cpp
src/table/landscape_sprite.h
--- a/src/gfxinit.cpp	Sat Oct 20 21:05:18 2007 +0000
+++ b/src/gfxinit.cpp	Sat Oct 20 21:39:50 2007 +0000
@@ -74,33 +74,38 @@
 }
 
 
+void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl)
+{
+	uint start;
+	while ((start = *index_tbl++) != END) {
+		uint end = *index_tbl++;
+
+		if (start == SKIP) { // skip sprites (amount in second var)
+			SkipSprites(end);
+			(*sprite_id) += end;
+		} else { // load sprites and use indexes from start to end
+			do {
+			#ifdef NDEBUG
+				LoadNextSprite(start, file_index, *sprite_id);
+			#else
+				bool b = LoadNextSprite(start, file_index, *sprite_id);
+				assert(b);
+			#endif
+				(*sprite_id)++;
+			} while (++start <= end);
+		}
+	}
+}
+
 static void LoadGrfIndexed(const char* filename, const SpriteID* index_tbl, int file_index)
 {
-	uint start;
 	uint sprite_id = 0;
 
 	FioOpenFile(file_index, filename);
 
 	DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename);
 
-	while ((start = *index_tbl++) != END) {
-		uint end = *index_tbl++;
-
-		if (start == SKIP) { // skip sprites (amount in second var)
-			SkipSprites(end);
-			sprite_id += end;
-		} else { // load sprites and use indexes from start to end
-			do {
-			#ifdef NDEBUG
-				LoadNextSprite(start, file_index, sprite_id);
-			#else
-				bool b = LoadNextSprite(start, file_index, sprite_id);
-				assert(b);
-			#endif
-				sprite_id++;
-			} while (++start <= end);
-		}
-	}
+	LoadSpritesIndexed(file_index, &sprite_id, index_tbl);
 }
 
 
--- a/src/gfxinit.h	Sat Oct 20 21:05:18 2007 +0000
+++ b/src/gfxinit.h	Sat Oct 20 21:39:50 2007 +0000
@@ -7,5 +7,6 @@
 
 void CheckExternalFiles();
 void GfxLoadSprites();
+void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl);
 
 #endif /* GFXINIT_H */
--- a/src/newgrf.cpp	Sat Oct 20 21:05:18 2007 +0000
+++ b/src/newgrf.cpp	Sat Oct 20 21:39:50 2007 +0000
@@ -45,6 +45,8 @@
 #include "newgrf_commons.h"
 #include "newgrf_townname.h"
 #include "newgrf_industries.h"
+#include "table/landscape_sprite.h"
+#include "gfxinit.h"
 
 /* TTDPatch extended GRF format codec
  * (c) Petr Baudis 2004 (GPL'd)
@@ -3232,6 +3234,7 @@
 	/* TODO */
 
 	SpriteID replace = 0;
+	const SpriteID *index_tbl = NULL;
 
 	if (!check_length(len, 2, "GraphicsNew")) return;
 	buf++;
@@ -3256,11 +3259,13 @@
 			break;
 
 		case 0x06: // Foundations
-			if (num != 74) {
-				grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74, skipping");
-				return;
+			switch (num) {
+				case 74: replace = SPR_SLOPES_BASE; break;
+				case 90: index_tbl = _slopes_action05_90; break;
+				default:
+					grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74 or 90, skipping");
+					return;
 			}
-			replace = SPR_SLOPES_BASE;
 			break;
 
 		case 0x08: // Canal graphics
@@ -3326,6 +3331,12 @@
 			return;
 	}
 
+	if (index_tbl != NULL) {
+		grfmsg(2, "GraphicsNew: Loading %u sprites of type 0x%02X at indexed SpriteIDs", num, type);
+		LoadSpritesIndexed(_file_index, &_nfo_line, index_tbl);
+		return;
+	}
+
 	if (replace == 0) {
 		grfmsg(2, "GraphicsNew: Loading %u sprites of type 0x%02X at SpriteID 0x%04X", num, type, _cur_spriteid);
 	} else {
--- a/src/table/landscape_sprite.h	Sat Oct 20 21:05:18 2007 +0000
+++ b/src/table/landscape_sprite.h	Sat Oct 20 21:39:50 2007 +0000
@@ -197,3 +197,10 @@
 	SPR_HALFTILE_FOUNDATION_BASE, SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE - 1,
 	END
 };
+
+/* Slope graphics indexes for Action 05 type 06, 90 sprites */
+static const SpriteID _slopes_action05_90[] = {
+	SPR_SLOPES_VIRTUAL_BASE + 15, SPR_SLOPES_VIRTUAL_BASE + 4 * SPR_TRKFOUND_BLOCK_SIZE,
+	SPR_HALFTILE_FOUNDATION_BASE, SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE - 1,
+	END
+};