1
0
Fork 0

(svn r3044) -NewGRF, Codechange: Improve handling of non-existent sprite sets.

release/0.4.5
peter1138 2005-10-14 20:10:12 +00:00
parent f97d1274bc
commit 5c3625b88f
2 changed files with 16 additions and 23 deletions

View File

@ -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++;

View File

@ -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);