using System;
using System.Collections.Generic;
namespace IdleSpectator;
/// Live asset/task lookup and species-token hygiene. No voice classification.
public static class ActivityAssetCatalog
{
private static HashSet _liveSpeciesPlaceTokens;
private static int _liveSpeciesPlaceTokensCount = -1;
public static ActorAsset TryGetActorAsset(string speciesId)
{
if (string.IsNullOrEmpty(speciesId))
{
return null;
}
try
{
return AssetManager.actor_library?.get(speciesId.Trim());
}
catch
{
return null;
}
}
public static bool IsLiveActorAssetId(string speciesId)
{
if (string.IsNullOrEmpty(speciesId))
{
return false;
}
try
{
return AssetManager.actor_library != null
&& AssetManager.actor_library.has(speciesId.Trim());
}
catch
{
return false;
}
}
public static string SpeciesDisplayLabel(ActorAsset asset)
{
if (asset == null)
{
return "";
}
try
{
string translated = asset.getTranslatedName();
if (!string.IsNullOrEmpty(translated))
{
string localeId = asset.getLocaleID() ?? "";
if (!translated.Equals(localeId, StringComparison.Ordinal)
&& translated.IndexOf('_') < 0)
{
return translated.Trim().ToLowerInvariant();
}
}
}
catch
{
// Localization may not be ready during early harness setup.
}
if (!string.IsNullOrEmpty(asset.name_locale))
{
return asset.name_locale.Trim().ToLowerInvariant();
}
return string.IsNullOrEmpty(asset.id) ? "" : asset.id.Replace('_', ' ').Trim();
}
public static string SpeciesDisplayLabel(string speciesId)
{
ActorAsset asset = TryGetActorAsset(speciesId);
return asset != null
? SpeciesDisplayLabel(asset)
: (string.IsNullOrEmpty(speciesId) ? "" : speciesId.Replace('_', ' ').Trim());
}
public static List EnumerateLiveActorAssetIds()
{
var ids = new List();
try
{
ActorAssetLibrary lib = AssetManager.actor_library;
if (lib?.list == null)
{
return ids;
}
for (int i = 0; i < lib.list.Count; i++)
{
ActorAsset asset = lib.list[i];
if (asset != null && !string.IsNullOrEmpty(asset.id))
{
ids.Add(asset.id);
}
}
}
catch
{
// Library can be unavailable during early boot.
}
return ids;
}
public static List EnumerateLiveStatusIds()
{
var ids = new List();
try
{
StatusLibrary lib = AssetManager.status;
if (lib?.list == null)
{
return ids;
}
for (int i = 0; i < lib.list.Count; i++)
{
StatusAsset asset = lib.list[i];
if (asset != null && !string.IsNullOrEmpty(asset.id))
{
ids.Add(asset.id);
}
}
}
catch
{
// Library can be unavailable during early boot.
}
return ids;
}
public static StatusAsset TryGetStatusAsset(string statusId)
{
if (string.IsNullOrEmpty(statusId))
{
return null;
}
try
{
return AssetManager.status?.get(statusId.Trim());
}
catch
{
return null;
}
}
public static List EnumerateLiveTaskIds()
{
var ids = new List();
try
{
object lib = typeof(AssetManager).GetField("tasks_actor")?.GetValue(null);
object listObj = lib?.GetType().GetField("list")?.GetValue(lib)
?? lib?.GetType().GetProperty("list")?.GetValue(lib, null);
System.Collections.IList list = listObj as System.Collections.IList;
if (list == null)
{
return ids;
}
for (int i = 0; i < list.Count; i++)
{
object task = list[i];
object idObj = task?.GetType().GetField("id")?.GetValue(task)
?? task?.GetType().GetProperty("id")?.GetValue(task, null);
string id = idObj as string;
if (!string.IsNullOrEmpty(id))
{
ids.Add(id);
}
}
}
catch
{
// Library can be unavailable during early boot.
}
return ids;
}
public static bool IsLiveSpeciesPlaceToken(string label)
{
if (string.IsNullOrEmpty(label))
{
return false;
}
EnsureLiveSpeciesPlaceTokens();
return _liveSpeciesPlaceTokens != null
&& _liveSpeciesPlaceTokens.Contains(label.Trim());
}
private static void EnsureLiveSpeciesPlaceTokens()
{
try
{
ActorAssetLibrary lib = AssetManager.actor_library;
if (lib?.list == null)
{
return;
}
int count = lib.list.Count;
if (_liveSpeciesPlaceTokens != null && _liveSpeciesPlaceTokensCount == count)
{
return;
}
var tokens = new HashSet(StringComparer.OrdinalIgnoreCase);
for (int i = 0; i < count; i++)
{
ActorAsset asset = lib.list[i];
if (asset == null)
{
continue;
}
Add(tokens, asset.id);
Add(tokens, asset.kingdom_id_wild);
Add(tokens, asset.name_locale);
if (!string.IsNullOrEmpty(asset.id))
{
Add(tokens, asset.id.Replace('_', ' '));
}
}
_liveSpeciesPlaceTokens = tokens;
_liveSpeciesPlaceTokensCount = count;
}
catch
{
// Keep prior cache if any.
}
}
private static void Add(HashSet tokens, string value)
{
if (!string.IsNullOrEmpty(value))
{
tokens.Add(value.Trim());
}
}
}