From d1591e864d2cc68ef7c1bfaa4d35093e64ae5a24 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Tue, 4 Oct 2005 20:38:26 +0000 Subject: (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.) --- newgrf.c | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) (limited to 'newgrf.c') 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; -- cgit v1.2.3-54-g00ecf