summaryrefslogtreecommitdiff
path: root/newgrf.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2005-10-04 20:38:26 +0000
committerpeter1138 <peter1138@openttd.org>2005-10-04 20:38:26 +0000
commit4879e04986197627ec316307cbdb8709665541d8 (patch)
treebcbf57a70d93521f7bd3ab8c7435ae0250cbd8e6 /newgrf.c
parente8bca26b7407c4c14aec0571595d97ea1e59ae4e (diff)
downloadopenttd-4879e04986197627ec316307cbdb8709665541d8.tar.xz
(svn r3015) -NewGRF: Add a new sprite group result type, and support loading of callbacks results within random and "real" groups. (Not fully supported yet.)
Diffstat (limited to 'newgrf.c')
-rw-r--r--newgrf.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/newgrf.c b/newgrf.c
index 2d1542561..ef4fa1f3f 100644
--- a/newgrf.c
+++ b/newgrf.c
@@ -1228,6 +1228,21 @@ SpriteGroup *NewCallBackResultSpriteGroup(uint16 value)
return group;
}
+/**
+ * Creates a spritegroup representing a sprite number result.
+ * @param value The sprite number.
+ * @param sprites The number of sprites per set.
+ * @return A spritegroup representing the sprite number result.
+ */
+SpriteGroup *NewResultSpriteGroup(uint16 value, byte sprites)
+{
+ SpriteGroup *group = calloc(1, sizeof(*group));
+ group->type = SGT_RESULT;
+ group->g.result.result = value;
+ group->g.result.sprites = sprites;
+ return group;
+}
+
/* Action 0x01 */
static void NewSpriteSet(byte *buf, int len)
{
@@ -1421,15 +1436,18 @@ static void NewSpriteGroup(byte *buf, int len)
for (i = 0; i < rg->num_groups; i++) {
uint16 groupid = grf_load_word(&buf);
- if (groupid & 0x8000 || groupid >= _cur_grffile->spritegroups_count) {
+ if (HASBIT(groupid, 15)) {
+ rg->groups[i] = NewCallBackResultSpriteGroup(groupid);
+ } else if (groupid >= _cur_grffile->spritegroups_count) {
/* This doesn't exist for us. */
i--;
rg->num_groups--;
continue;
+ } else {
+ /* XXX: If multiple surreal sets attach a surreal
+ * set this way, we are in trouble. */
+ rg->groups[i] = _cur_grffile->spritegroups[groupid];
}
- /* XXX: If multiple surreal sets attach a surreal
- * set this way, we are in trouble. */
- rg->groups[i] = _cur_grffile->spritegroups[groupid];
}
_cur_grffile->spritegroups[setid] = group;
@@ -1476,14 +1494,22 @@ static void NewSpriteGroup(byte *buf, int len)
for (i = 0; i < numloaded; i++) {
uint16 spriteset_id = grf_load_word(&loaded_ptr);
- rg->loaded[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents;
- DEBUG(grf, 8) ("NewSpriteGroup: + rg->loaded[%i] = %u (subset %u)", i, rg->loaded[i], spriteset_id);
+ if (HASBIT(spriteset_id, 15)) {
+ rg->loaded[i] = NewCallBackResultSpriteGroup(spriteset_id);
+ } else {
+ rg->loaded[i] = NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents, rg->sprites_per_set);
+ }
+ DEBUG(grf, 8) ("NewSpriteGroup: + rg->loaded[%i] = %u (subset %u)", i, rg->loaded[i]->g.result.result, spriteset_id);
}
for (i = 0; i < numloading; i++) {
uint16 spriteset_id = grf_load_word(&loading_ptr);
- rg->loading[i] = _cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents;
- DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i], spriteset_id);
+ if (HASBIT(spriteset_id, 15)) {
+ rg->loading[i] = NewCallBackResultSpriteGroup(spriteset_id);
+ } else {
+ rg->loading[i] = NewResultSpriteGroup(_cur_grffile->spriteset_start + spriteset_id * _cur_grffile->spriteset_numents, rg->sprites_per_set);
+ }
+ DEBUG(grf, 8) ("NewSpriteGroup: + rg->loading[%i] = %u (subset %u)", i, rg->loading[i]->g.result.result, spriteset_id);
}
_cur_grffile->spritegroups[setid] = group;