Code quality improvements

This commit is contained in:
rwjuk 2017-07-05 22:33:59 +01:00 committed by Michał Janiszewski
parent 247d72b1aa
commit 372781cc74
1 changed files with 27 additions and 27 deletions

View File

@ -259,15 +259,13 @@ void sprite_clear_all_unused()
spriteIndex = gSpriteListHead[SPRITE_LIST_NULL]; spriteIndex = gSpriteListHead[SPRITE_LIST_NULL];
while (spriteIndex != SPRITE_INDEX_NULL) { while (spriteIndex != SPRITE_INDEX_NULL) {
sprite = &get_sprite(spriteIndex)->unknown; sprite = &get_sprite(spriteIndex)->unknown;
nextSpriteIndex = sprite->next; sprite_reset(sprite);
previousSpriteIndex = sprite->previous;
memset(sprite, 0, sizeof(rct_sprite));
sprite->sprite_identifier = SPRITE_IDENTIFIER_NULL;
sprite->next = nextSpriteIndex;
sprite->previous = previousSpriteIndex;
sprite->linked_list_type_offset = SPRITE_LIST_NULL * 2; sprite->linked_list_type_offset = SPRITE_LIST_NULL * 2;
sprite->sprite_index = spriteIndex;
sprite->next_in_quadrant = (sprite->next_in_quadrant == 0) ? SPRITE_INDEX_NULL : sprite->next_in_quadrant; // sprite->next_in_quadrant will only end up as zero owing to corruption
// most likely due to previous builds not preserving it when resetting sprites
// We reset it to SPRITE_INDEX_NULL to prevent cycles in the sprite lists
if (sprite->next_in_quadrant == 0) { sprite->next_in_quadrant = SPRITE_INDEX_NULL; }
_spriteFlashingList[spriteIndex] = false; _spriteFlashingList[spriteIndex] = false;
spriteIndex = nextSpriteIndex; spriteIndex = nextSpriteIndex;
} }
@ -290,6 +288,7 @@ static void sprite_reset(rct_unk_sprite *sprite)
sprite->next_in_quadrant = next_in_quadrant; sprite->next_in_quadrant = next_in_quadrant;
sprite->previous = prev; sprite->previous = prev;
sprite->sprite_index = sprite_index; sprite->sprite_index = sprite_index;
sprite->sprite_identifier = SPRITE_IDENTIFIER_NULL;
} }
// Resets all sprites in SPRITE_LIST_NULL list // Resets all sprites in SPRITE_LIST_NULL list
@ -827,7 +826,7 @@ bool sprite_get_flashing(rct_sprite *sprite)
return _spriteFlashingList[sprite->unknown.sprite_index]; return _spriteFlashingList[sprite->unknown.sprite_index];
} }
static bool sprite_is_in_cycle(uint16 sprite_idx, bool fix) static bool sprite_is_in_cycle(uint16 sprite_idx)
{ {
if (sprite_idx == SPRITE_INDEX_NULL) if (sprite_idx == SPRITE_INDEX_NULL)
{ {
@ -856,19 +855,13 @@ static bool sprite_is_in_cycle(uint16 sprite_idx, bool fix)
if (fast == slow) if (fast == slow)
{ {
cycled = true; cycled = true;
if (fix)
{
rct_sprite * spr = get_sprite(sprite_idx);
// There may be a better solution than simply setting this to 0xFFFF
spr->unknown.next = SPRITE_INDEX_NULL;
}
break; break;
} }
} }
return cycled; return cycled;
} }
static bool sprite_is_in_cycle_quadrant(uint16 sprite_idx, bool fix) static bool sprite_is_in_quadrant_cycle(uint16 sprite_idx)
{ {
if (sprite_idx == SPRITE_INDEX_NULL) if (sprite_idx == SPRITE_INDEX_NULL)
{ {
@ -897,13 +890,6 @@ static bool sprite_is_in_cycle_quadrant(uint16 sprite_idx, bool fix)
if (fast == slow) if (fast == slow)
{ {
cycled = true; cycled = true;
if (fix)
{
rct_sprite * spr = get_sprite(sprite_idx);
// There may be a better solution than simply setting this to 0xFFFF
spr->unknown.next_in_quadrant = SPRITE_INDEX_NULL;
}
break; break;
} }
} }
@ -912,8 +898,15 @@ static bool sprite_is_in_cycle_quadrant(uint16 sprite_idx, bool fix)
bool check_for_sprite_list_cycles(bool fix) bool check_for_sprite_list_cycles(bool fix)
{ {
for (sint32 i = 0; i < 6; i++) { for (sint32 i = 0; i < NUM_SPRITE_LISTS; i++) {
if (sprite_is_in_cycle(gSpriteListHead[i], fix)) { if (sprite_is_in_cycle(gSpriteListHead[i], fix)) {
if (fix)
{
rct_sprite * spr = get_sprite(gSpriteListHead[i]);
// There may be a better solution than simply setting this to 0xFFFF
spr->unknown.next = SPRITE_INDEX_NULL;
}
return true; return true;
} }
} }
@ -922,8 +915,15 @@ bool check_for_sprite_list_cycles(bool fix)
bool check_for_spatial_index_cycles(bool fix) bool check_for_spatial_index_cycles(bool fix)
{ {
for (size_t i = 0; i < 0x10000; i++) { for (sint32 i = 0; i < SPATIAL_INDEX_LOCATION_NULL; i++) {
if (sprite_is_in_cycle_quadrant(gSpriteSpatialIndex[i], fix)) { if (sprite_is_in_quadrant_cycle(gSpriteSpatialIndex[i])) {
if (fix)
{
rct_sprite * spr = get_sprite(gSpriteSpatialIndex[i]);
// There may be a better solution than simply setting this to 0xFFFF
spr->unknown.next_in_quadrant = SPRITE_INDEX_NULL;
}
return true; return true;
} }
} }