Quick answer: Calling instance_destroy doesn’t fire the instance’s Destroy event? You called the variant that suppresses events — pass execute_destroy = true.
A boss with a Destroy event that spawns loot doesn’t drop on death. The code calls instance_destroy(boss, false) — explicitly suppressing the event.
Default vs Variant
instance_destroy(id) runs the Destroy event. instance_destroy(id, false) explicitly skips it. The second is for hot-cleanup when you don’t want side effects.
CleanUp Event Always Runs
The CleanUp event runs regardless of execute_destroy — use it for memory release (surfaces, ds_lists) that should always happen.
Room Change Destroys Too
Non-persistent instances are destroyed on room change. Their Destroy event runs unless the room change is internal cleanup.
Verifying
Destroying via the right call fires the Destroy event; loot drops, sounds play, particles spawn. CleanUp also runs.
“instance_destroy without args runs the event. Passing false suppresses it.”
Put loot / death side-effects in Destroy. Put hard-resource cleanup (ds_*, surfaces) in CleanUp. Two layers, predictable behavior.