From fce4c5e2c2ab91109b5dbb2903feff2b9117b239 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 20 Oct 2007 21:39:50 +0000 Subject: (svn r11321) -Codechange: add support to load different graphics for halftile slopes using a NewGRF. Patch by frosch. --- src/gfxinit.cpp | 27 ++++++++++++++++----------- src/gfxinit.h | 1 + src/newgrf.cpp | 19 +++++++++++++++---- src/table/landscape_sprite.h | 7 +++++++ 4 files changed, 39 insertions(+), 15 deletions(-) (limited to 'src') 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 +}; -- cgit v1.2.3-70-g09d2