Extend the multiplayer animation system to support animations from all
three game worlds (ACT1, ACT2, ACT3) while playing in the Isle world.
Catalog: Parse DTA files directly for all worlds instead of borrowing
from LegoAnimationManager. World-encoded animIndex (top 2 bits = world
slot) provides globally unique IDs without wire protocol changes.
Loader: Support multiple SI files (isle.si, act2main.si, act3.si) with
lazy opening and composite (worldId, objectId) cache keys.
WDB: Load missing model LODs from WORLD.WDB for all worlds during
catalog refresh, using LegoPartPresenter for parts and
LegoModelPresenter for compound models (ray, chptr).
Protocol: AnimCompleteMsg now carries animIndex instead of objectId.
Also fix pre-existing bugs:
- PhonemePlayer UAF when multiple tracks target the same ROI
- ModelDbModel buffer overflow on word-aligned strlcpy reads
- SIReader UBSan violation on uninitialized filetype enum
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Use SDL IOStream in for MXIOINFO
* Use SDL IOStream for WDB file
* Use SDL IOStream for LegoStorage
* Update README.md
* Fixes
* Add names to skip.yml
* Add #include <stdio.h> where necessary
* Use macros for `Seek` modes
* Fix syntax
* Use `OF_READ`
* Add names to skip.yml
* Revert "Add names to skip.yml"
This reverts commit 28b6f577dc0c47070064070f4655a15dab3bda25.
* implement ModelDbPart::Read & ModelDbModel::Read
* Update modeldb.cpp
* Minor style fixes
* Add comment about buffer overrun
* Use sizeof on var
---------
Co-authored-by: Christian Semmler <mail@csemmler.com>