summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gfxinit.cpp27
-rw-r--r--src/gfxinit.h1
-rw-r--r--src/newgrf.cpp19
-rw-r--r--src/table/landscape_sprite.h7
4 files changed, 39 insertions, 15 deletions
diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp
index f5263aad4..84a04f1b8 100644
--- a/src/gfxinit.cpp
+++ b/src/gfxinit.cpp
@@ -74,35 +74,40 @@ static uint LoadGrfFile(const char* filename, uint load_index, int file_index)
}
-static void LoadGrfIndexed(const char* filename, const SpriteID* index_tbl, int file_index)
+void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl)
{
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;
+ (*sprite_id) += end;
} else { // load sprites and use indexes from start to end
do {
#ifdef NDEBUG
- LoadNextSprite(start, file_index, sprite_id);
+ LoadNextSprite(start, file_index, *sprite_id);
#else
- bool b = LoadNextSprite(start, file_index, sprite_id);
+ bool b = LoadNextSprite(start, file_index, *sprite_id);
assert(b);
#endif
- sprite_id++;
+ (*sprite_id)++;
} while (++start <= end);
}
}
}
+static void LoadGrfIndexed(const char* filename, const SpriteID* index_tbl, int file_index)
+{
+ uint sprite_id = 0;
+
+ FioOpenFile(file_index, filename);
+
+ DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename);
+
+ LoadSpritesIndexed(file_index, &sprite_id, index_tbl);
+}
+
/* Check that the supplied MD5 hash matches that stored for the supplied filename */
static bool CheckMD5Digest(const MD5File file, md5_byte_t *digest, bool warn)
diff --git a/src/gfxinit.h b/src/gfxinit.h
index 0d6e79613..a59cc6259 100644
--- a/src/gfxinit.h
+++ b/src/gfxinit.h
@@ -7,5 +7,6 @@
void CheckExternalFiles();
void GfxLoadSprites();
+void LoadSpritesIndexed(int file_index, uint *sprite_id, const SpriteID *index_tbl);
#endif /* GFXINIT_H */
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index f8d5b788c..307fc48ed 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -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 @@ static void GraphicsNew(byte *buf, int len)
/* TODO */
SpriteID replace = 0;
+ const SpriteID *index_tbl = NULL;
if (!check_length(len, 2, "GraphicsNew")) return;
buf++;
@@ -3256,11 +3259,13 @@ static void GraphicsNew(byte *buf, int len)
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 @@ static void GraphicsNew(byte *buf, int len)
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 {
diff --git a/src/table/landscape_sprite.h b/src/table/landscape_sprite.h
index 49b650e47..b395c3a44 100644
--- a/src/table/landscape_sprite.h
+++ b/src/table/landscape_sprite.h
@@ -197,3 +197,10 @@ static const SpriteID _halftile_foundation_spriteindexes_3[] = {
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
+};