diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 67f0762a1e..733c2a7b2b 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1389,8 +1389,16 @@ static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent) image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size; gSprites[objectEvent->spriteId].images = ℑ paletteNum = gSprites[objectEvent->spriteId].oam.paletteNum; - DestroySprite(&gSprites[objectEvent->spriteId]); - FieldEffectFreePaletteIfUnused(paletteNum); + // It's possible that this function is called while the sprite pointed to `== sDummySprite`, i.e during map resume; + // In this case, don't free the palette as `paletteNum` is likely blank dummy data + if (!gSprites[objectEvent->spriteId].inUse && + !gSprites[objectEvent->spriteId].oam.paletteNum && + gSprites[objectEvent->spriteId].callback == SpriteCallbackDummy) { + DestroySprite(&gSprites[objectEvent->spriteId]); + } else { + DestroySprite(&gSprites[objectEvent->spriteId]); + FieldEffectFreePaletteIfUnused(paletteNum); + } } void RemoveAllObjectEventsExceptPlayer(void)