diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 37dc2587ba..39ae46669b 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -5332,11 +5332,21 @@ static void GraphicsNew(ByteReader *buf) const Action5Type *action5_type = &_action5_types[type]; - /* Contrary to TTDP we allow always to specify too few sprites as we allow always an offset. - * Thus no check for the amount of sprites is needed (anymore). - * The only no-offset entry, shores, is handled above already. - * We'll assume that offsets are always allowed further down, thus assert on this */ - assert(action5_type->block_type == A5BLOCK_ALLOW_OFFSET); + /* Contrary to TTDP we allow always to specify too few sprites as we allow always an offset, + * except for the long version of the shore type: + * Ignore offset if not allowed */ + if ((action5_type->block_type != A5BLOCK_ALLOW_OFFSET) && (offset != 0)) { + grfmsg(1, "GraphicsNew: %s (type 0x%02X) do not allow an field. Ignoring offset.", action5_type->name, type); + offset = 0; + } + + /* Ignore action5 if too few sprites are specified. (for TTDP compatibility) + * This does not make sense, if is allowed */ + if ((action5_type->block_type == A5BLOCK_FIXED) && (num < action5_type->min_sprites)) { + grfmsg(1, "GraphicsNew: %s (type 0x%02X) count must be at least %d. Only %d were specified. Skipping.", action5_type->name, type, action5_type->min_sprites, num); + _cur.skip_sprites = num; + return; + } /* Load at most max_sprites sprites. Skip remaining sprites. (for compatibility with TTDP and future extentions) */ uint16 skip_num = SanitizeSpriteOffset(num, offset, action5_type->max_sprites, action5_type->name);