mirror of https://github.com/OpenTTD/OpenTTD
(svn r3044) -NewGRF, Codechange: Improve handling of non-existent sprite sets.
parent
f97d1274bc
commit
5c3625b88f
29
newgrf.c
29
newgrf.c
|
@ -1404,14 +1404,10 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||||
if (HASBIT(groupid, 15)) {
|
if (HASBIT(groupid, 15)) {
|
||||||
dg->ranges[i].group = NewCallBackResultSpriteGroup(groupid);
|
dg->ranges[i].group = NewCallBackResultSpriteGroup(groupid);
|
||||||
dg->ranges[i].group->ref_count++;
|
dg->ranges[i].group->ref_count++;
|
||||||
} else if (groupid >= _cur_grffile->spritegroups_count) {
|
} else if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
|
||||||
/* This doesn't exist for us. */
|
grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Groupid %04x does not exist, leaving empty.", setid, numloaded, groupid);
|
||||||
grf_load_word(&buf); // skip range
|
dg->ranges[i].group = NULL;
|
||||||
i--; dg->num_ranges--;
|
|
||||||
continue;
|
|
||||||
} else {
|
} else {
|
||||||
/* XXX: If multiple surreal sets attach a surreal
|
|
||||||
* set this way, we are in trouble. */
|
|
||||||
dg->ranges[i].group = _cur_grffile->spritegroups[groupid];
|
dg->ranges[i].group = _cur_grffile->spritegroups[groupid];
|
||||||
dg->ranges[i].group->ref_count++;
|
dg->ranges[i].group->ref_count++;
|
||||||
}
|
}
|
||||||
|
@ -1423,15 +1419,14 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||||
groupid = grf_load_word(&buf);
|
groupid = grf_load_word(&buf);
|
||||||
if (HASBIT(groupid, 15)) {
|
if (HASBIT(groupid, 15)) {
|
||||||
dg->default_group = NewCallBackResultSpriteGroup(groupid);
|
dg->default_group = NewCallBackResultSpriteGroup(groupid);
|
||||||
} else if (groupid >= _cur_grffile->spritegroups_count) {
|
dg->default_group->ref_count++;
|
||||||
/* This spritegroup stinks. */
|
} else if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
|
||||||
free(dg->ranges), dg->ranges = NULL;
|
grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Groupid %04x does not exist, leaving empty.", setid, numloaded, groupid);
|
||||||
grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Default groupid %04x is cargo callback or unknown, ignoring spritegroup.", setid, numloaded, groupid);
|
dg->default_group = NULL;
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
dg->default_group = _cur_grffile->spritegroups[groupid];
|
dg->default_group = _cur_grffile->spritegroups[groupid];
|
||||||
}
|
|
||||||
dg->default_group->ref_count++;
|
dg->default_group->ref_count++;
|
||||||
|
}
|
||||||
|
|
||||||
if (_cur_grffile->spritegroups[setid] != NULL)
|
if (_cur_grffile->spritegroups[setid] != NULL)
|
||||||
UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]);
|
UnloadSpriteGroup(&_cur_grffile->spritegroups[setid]);
|
||||||
|
@ -1474,11 +1469,9 @@ static void NewSpriteGroup(byte *buf, int len)
|
||||||
if (HASBIT(groupid, 15)) {
|
if (HASBIT(groupid, 15)) {
|
||||||
rg->groups[i] = NewCallBackResultSpriteGroup(groupid);
|
rg->groups[i] = NewCallBackResultSpriteGroup(groupid);
|
||||||
rg->groups[i]->ref_count++;
|
rg->groups[i]->ref_count++;
|
||||||
} else if (groupid >= _cur_grffile->spritegroups_count) {
|
} else if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
|
||||||
/* This doesn't exist for us. */
|
grfmsg(GMS_WARN, "NewSpriteGroup(%02x:0x%x): Groupid %04x does not exist, leaving empty.", setid, numloaded, groupid);
|
||||||
i--;
|
rg->groups[i] = NULL;
|
||||||
rg->num_groups--;
|
|
||||||
continue;
|
|
||||||
} else {
|
} else {
|
||||||
rg->groups[i] = _cur_grffile->spritegroups[groupid];
|
rg->groups[i] = _cur_grffile->spritegroups[groupid];
|
||||||
rg->groups[i]->ref_count++;
|
rg->groups[i]->ref_count++;
|
||||||
|
|
10
sprite.c
10
sprite.c
|
@ -127,10 +127,10 @@ void UnloadSpriteGroup(SpriteGroup **group_ptr)
|
||||||
{
|
{
|
||||||
RealSpriteGroup *rsg = &group->g.real;
|
RealSpriteGroup *rsg = &group->g.real;
|
||||||
for (i = 0; i < rsg->loading_count; i++) {
|
for (i = 0; i < rsg->loading_count; i++) {
|
||||||
UnloadSpriteGroup(&rsg->loading[i]);
|
if (rsg->loading[i] != NULL) UnloadSpriteGroup(&rsg->loading[i]);
|
||||||
}
|
}
|
||||||
for (i = 0; i < rsg->loaded_count; i++) {
|
for (i = 0; i < rsg->loaded_count; i++) {
|
||||||
UnloadSpriteGroup(&rsg->loaded[i]);
|
if (rsg->loaded[i] != NULL) UnloadSpriteGroup(&rsg->loaded[i]);
|
||||||
}
|
}
|
||||||
free(group);
|
free(group);
|
||||||
return;
|
return;
|
||||||
|
@ -140,9 +140,9 @@ void UnloadSpriteGroup(SpriteGroup **group_ptr)
|
||||||
{
|
{
|
||||||
DeterministicSpriteGroup *dsg = &group->g.determ;
|
DeterministicSpriteGroup *dsg = &group->g.determ;
|
||||||
for (i = 0; i < group->g.determ.num_ranges; i++) {
|
for (i = 0; i < group->g.determ.num_ranges; i++) {
|
||||||
UnloadSpriteGroup(&dsg->ranges[i].group);
|
if (dsg->ranges[i].group != NULL) UnloadSpriteGroup(&dsg->ranges[i].group);
|
||||||
}
|
}
|
||||||
UnloadSpriteGroup(&dsg->default_group);
|
if (dsg->default_group != NULL) UnloadSpriteGroup(&dsg->default_group);
|
||||||
free(group->g.determ.ranges);
|
free(group->g.determ.ranges);
|
||||||
free(group);
|
free(group);
|
||||||
return;
|
return;
|
||||||
|
@ -151,7 +151,7 @@ void UnloadSpriteGroup(SpriteGroup **group_ptr)
|
||||||
case SGT_RANDOMIZED:
|
case SGT_RANDOMIZED:
|
||||||
{
|
{
|
||||||
for (i = 0; i < group->g.random.num_groups; i++) {
|
for (i = 0; i < group->g.random.num_groups; i++) {
|
||||||
UnloadSpriteGroup(&group->g.random.groups[i]);
|
if (group->g.random.groups[i] != NULL) UnloadSpriteGroup(&group->g.random.groups[i]);
|
||||||
}
|
}
|
||||||
free(group->g.random.groups);
|
free(group->g.random.groups);
|
||||||
free(group);
|
free(group);
|
||||||
|
|
Loading…
Reference in New Issue