717902462b
An async asset load failure crashed the whole game via errorThrow, while the identical sync failure just logged and continued - a single missing/corrupted asset could take down the process. assetUpdate now handles the async error path the same way as sync (invoke onError, keep running). Also removes event.h/event.c and assetbatch, which existed only to support multiple subscribers per asset event but had no real caller that ever used more than one (assetbatch itself had zero callers anywhere). Asset entries, uifullbox, and uiloading now use plain single-callback + user-pointer fields instead of the generic array-backed event_t. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>