summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-04-20 13:33:40 +0000
committerpeter1138 <peter1138@openttd.org>2006-04-20 13:33:40 +0000
commit9ed8c6d4acea5c41246d3fa54301d4a0cc814985 (patch)
treea4293081de1ea050c6764d3a8961ef11264725aa
parent62145d16b55aaf13451f7c6595d4675ff0499b47 (diff)
downloadopenttd-9ed8c6d4acea5c41246d3fa54301d4a0cc814985.tar.xz
(svn r4483) - NewGRF: Dynamically allocate memory for 'real' spritegroups. This removes the limit of 16 loading/unloading states, although will result in less memory usage as most of the time the full fixed allocation wasn't used.
-rw-r--r--newgrf.c12
-rw-r--r--sprite.c2
-rw-r--r--sprite.h10
3 files changed, 9 insertions, 15 deletions
diff --git a/newgrf.c b/newgrf.c
index a5efdff4d..f3a886134 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -1480,15 +1480,6 @@ static void NewSpriteGroup(byte *buf, int len)
if (_cur_grffile->first_spriteset == 0)
_cur_grffile->first_spriteset = _cur_grffile->spriteset_start;
- if (numloaded > 16) {
- grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
- numloaded = 16;
- }
- if (numloading > 16) {
- grfmsg(GMS_WARN, "NewSpriteGroup: More than 16 sprites in group %x, skipping the rest.", setid);
- numloading = 16;
- }
-
group = calloc(1, sizeof(*group));
group->type = SGT_REAL;
rg = &group->g.real;
@@ -1497,6 +1488,9 @@ static void NewSpriteGroup(byte *buf, int len)
rg->loaded_count = numloaded;
rg->loading_count = numloading;
+ rg->loaded = calloc(rg->loaded_count, sizeof(*rg->loaded));
+ rg->loading = calloc(rg->loading_count, sizeof(*rg->loading));
+
DEBUG(grf, 6) ("NewSpriteGroup: New SpriteGroup 0x%02hhx, %u views, %u loaded, %u loading, sprites %u - %u",
setid, rg->sprites_per_set, rg->loaded_count, rg->loading_count,
_cur_grffile->spriteset_start - _cur_grffile->sprite_offset,
diff --git a/sprite.c b/sprite.c
index 2d76b7527..47d0c1c8b 100644
--- a/sprite.c
+++ b/sprite.c
@@ -132,6 +132,8 @@ void UnloadSpriteGroup(SpriteGroup **group_ptr)
for (i = 0; i < rsg->loaded_count; i++) {
if (rsg->loaded[i] != NULL) UnloadSpriteGroup(&rsg->loaded[i]);
}
+ free(group->g.real.loaded);
+ free(group->g.real.loading);
free(group);
return;
}
diff --git a/sprite.h b/sprite.h
index 877e3c9e8..cba95de44 100644
--- a/sprite.h
+++ b/sprite.h
@@ -32,8 +32,6 @@ typedef struct DrawTileSprites {
typedef struct SpriteGroup SpriteGroup;
typedef struct RealSpriteGroup {
- // XXX: Would anyone ever need more than 16 spritesets? Maybe we should
- // use even less, now we take whole 8kb for custom sprites table, oh my!
byte sprites_per_set; // means number of directions - 4 or 8
// Loaded = in motion, loading = not moving
@@ -43,10 +41,10 @@ typedef struct RealSpriteGroup {
// with small amount of cargo whilst loading is for stations with a lot
// of da stuff.
- byte loaded_count;
- SpriteGroup *loaded[16]; // sprite ids
- byte loading_count;
- SpriteGroup *loading[16]; // sprite ids
+ byte loaded_count; ///< Number of loaded groups
+ SpriteGroup **loaded; ///< List of loaded groups (can be SpriteIDs or Callback results)
+ byte loading_count; ///< Number of loading groups
+ SpriteGroup **loading; ///< List of loading groups (can be SpriteIDs or Callback results)
} RealSpriteGroup;
/* Shared by deterministic and random groups. */