From fce4c5e2c2ab91109b5dbb2903feff2b9117b239 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 20 Oct 2007 21:39:50 +0000 Subject: [PATCH] (svn r11321) -Codechange: add support to load different graphics for halftile slopes using a NewGRF. Patch by frosch. --- src/gfxinit.cpp | 43 ++++++++++++++++++++---------------- src/gfxinit.h | 1 + src/newgrf.cpp | 19 ++++++++++++---- src/table/landscape_sprite.h | 7 ++++++ 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index f5263aad48..84a04f1b8a 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -74,33 +74,38 @@ 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; + 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 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); } diff --git a/src/gfxinit.h b/src/gfxinit.h index 0d6e79613a..a59cc62591 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 f8d5b788cc..307fc48edd 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 49b650e47b..b395c3a44d 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 +};