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 EnumerateLiveHappinessIds()
{
var ids = new List();
try
{
HappinessLibrary lib = AssetManager.happiness_library;
if (lib?.list == null)
{
return ids;
}
for (int i = 0; i < lib.list.Count; i++)
{
HappinessAsset 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 HappinessAsset TryGetHappinessAsset(string effectId)
{
if (string.IsNullOrEmpty(effectId))
{
return null;
}
try
{
return AssetManager.happiness_library?.get(effectId.Trim());
}
catch
{
return null;
}
}
public static List EnumerateLiveTaskIds()
{
return EnumerateLibraryIds("tasks_actor");
}
public static List EnumerateLiveWorldLogIds()
{
return EnumerateLibraryIds("world_log_library");
}
public static WorldLogAsset TryGetWorldLogAsset(string assetId)
{
if (string.IsNullOrEmpty(assetId))
{
return null;
}
try
{
return AssetManager.world_log_library?.get(assetId.Trim());
}
catch
{
return null;
}
}
public static List EnumerateLiveDisasterIds()
{
return EnumerateLibraryIds("disasters");
}
public static DisasterAsset TryGetDisasterAsset(string disasterId)
{
if (string.IsNullOrEmpty(disasterId))
{
return null;
}
try
{
return AssetManager.disasters?.get(disasterId.Trim());
}
catch
{
return null;
}
}
public static List EnumerateLiveWarTypeIds()
{
return EnumerateLibraryIds("war_types_library");
}
public static WarTypeAsset TryGetWarTypeAsset(string warTypeId)
{
if (string.IsNullOrEmpty(warTypeId))
{
return null;
}
try
{
return AssetManager.war_types_library?.get(warTypeId.Trim());
}
catch
{
return null;
}
}
public static List EnumerateLivePlotIds()
{
return EnumerateLibraryIds("plots_library");
}
public static List EnumerateLiveEraIds()
{
return EnumerateLibraryIds("era_library");
}
public static List EnumerateLiveBookTypeIds()
{
return EnumerateLibraryIds("book_types");
}
public static List EnumerateLiveTraitIds()
{
return EnumerateLibraryIds("traits");
}
public static List EnumerateLiveBuildingIds()
{
return EnumerateLibraryIds("buildings");
}
private static List EnumerateLibraryIds(string assetManagerField)
{
var ids = new List();
try
{
object lib = typeof(AssetManager).GetField(assetManagerField)?.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 asset = list[i];
object idObj = asset?.GetType().GetField("id")?.GetValue(asset)
?? asset?.GetType().GetProperty("id")?.GetValue(asset, 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());
}
}
}