ui,game,pipeline: player nameplates always-on, level-up ring effect, vanilla tile fallback, warden null guard

- Nameplates: player names always rendered regardless of V-key toggle;
  separate cull distance 40u (players/target) vs 20u (NPCs); cyan name
  color for other players; fade alpha scales with cull distance
- Level-up: add expanding golden ring burst (3 staggered waves, 420u
  max radius) + full-screen flash to renderDingEffect(); M2 LevelUp.m2
  is still attempted as a bonus on top
- Vanilla tile loading: add AssetManager::setBaseFallbackPath() so that
  when the primary manifest is an expansion-specific DBC-only subset
  (e.g. Data/expansions/vanilla/), world terrain files fall back to
  the base Data/ extraction; wired in Application::initialize()
- Warden: map a null guard page at address 0x0 in the Unicorn emulator
  so NULL-pointer reads in the module don't crash with UC_ERR_MAP;
  execution continues past the NULL read for better diagnostics
This commit is contained in:
Kelsi 2026-03-10 07:25:04 -07:00
parent 3cdaf78369
commit 0ea8e55ad4
5 changed files with 100 additions and 11 deletions

View file

@ -137,8 +137,31 @@ std::string AssetManager::resolveFile(const std::string& normalizedPath) const {
}
}
}
// Fall back to base manifest
return manifest_.resolveFilesystemPath(normalizedPath);
// Primary manifest
std::string primaryPath = manifest_.resolveFilesystemPath(normalizedPath);
if (!primaryPath.empty()) return primaryPath;
// If a base-path fallback is configured (expansion-specific primary that only
// holds DBC overrides), retry against the base extraction.
if (!baseFallbackDataPath_.empty()) {
return baseFallbackManifest_.resolveFilesystemPath(normalizedPath);
}
return {};
}
void AssetManager::setBaseFallbackPath(const std::string& basePath) {
if (basePath.empty() || basePath == dataPath) return; // nothing to do
std::string manifestPath = basePath + "/manifest.json";
if (!std::filesystem::exists(manifestPath)) {
LOG_DEBUG("AssetManager: base fallback manifest not found at ", manifestPath,
" — fallback disabled");
return;
}
if (baseFallbackManifest_.load(manifestPath)) {
baseFallbackDataPath_ = basePath;
LOG_INFO("AssetManager: base fallback path set to '", basePath,
"' (", baseFallbackManifest_.getEntryCount(), " files)");
}
}
BLPImage AssetManager::loadTexture(const std::string& path) {