worldbox-observer-mod/IdleSpectator/HudIcons.cs

364 lines
11 KiB
C#

using UnityEngine;
namespace IdleSpectator;
/// <summary>
/// Loads WorldBox ui/Icons sprites for HUD chrome.
/// </summary>
public static class HudIcons
{
public static Sprite FromUiIcon(string iconName)
{
if (string.IsNullOrEmpty(iconName))
{
return null;
}
try
{
Sprite sprite = SpriteTextureLoader.getSprite("ui/Icons/" + iconName);
if (sprite != null)
{
return sprite;
}
// Some paths are lower-case in older content.
return SpriteTextureLoader.getSprite("ui/icons/" + iconName);
}
catch
{
return null;
}
}
public static Sprite FromAsset(ActorAsset asset)
{
if (asset == null)
{
return FromUiIcon("iconQuestionMark");
}
try
{
Sprite sprite = asset.getSpriteIcon();
if (sprite != null)
{
return sprite;
}
}
catch
{
// fall through
}
try
{
if (!string.IsNullOrEmpty(asset.icon))
{
return FromUiIcon(asset.icon);
}
}
catch
{
// ignore
}
return FromUiIcon("iconQuestionMark");
}
public static Sprite FromActor(Actor actor)
{
if (actor == null)
{
return FromUiIcon("iconQuestionMark");
}
return FromAsset(actor.asset);
}
public static Sprite FromSpeciesId(string speciesId)
{
if (string.IsNullOrEmpty(speciesId))
{
return FromUiIcon("iconQuestionMark");
}
try
{
ActorAsset asset = AssetManager.actor_library?.get(speciesId);
if (asset != null)
{
return FromAsset(asset);
}
}
catch
{
// fall through
}
return FromUiIcon("iconQuestionMark");
}
/// <summary>
/// Live unit sprite as shown in inspect UI (phenotype/kingdom tint), not the species icon.
/// </summary>
public static Sprite FromActorLive(Actor actor)
{
if (actor == null || !actor.isAlive())
{
return null;
}
try
{
Sprite main = actor.calculateMainSprite();
if (main == null)
{
return FromActor(actor);
}
Sprite ui = DynamicActorSpriteCreatorUI.getUnitSpriteForUI(actor, main);
if (ui != null)
{
return ui;
}
if (actor.hasColoredSprite())
{
Sprite colored = actor.calculateColoredSprite(main);
if (colored != null)
{
return colored;
}
}
return main;
}
catch
{
return FromActor(actor);
}
}
public static Sprite ForChronicleKind(ChronicleKind kind)
{
switch (kind)
{
case ChronicleKind.Death:
return FromUiIcon("iconDead") ?? FromUiIcon("iconSkulls");
case ChronicleKind.Kill:
return FromUiIcon("iconKills") ?? FromUiIcon("iconAttack");
case ChronicleKind.Lover:
return FromUiIcon("iconArrowLover");
case ChronicleKind.Friend:
return FromUiIcon("iconFavoriteStar");
case ChronicleKind.World:
return FromUiIcon("iconWar") ?? FromUiIcon("iconBooks");
case ChronicleKind.AgeChapter:
return FromUiIcon("iconAge") ?? FromUiIcon("iconClock");
default:
return FromUiIcon("iconClock");
}
}
/// <summary>
/// Activity row icon from a task id, Beh* key, or milestone_* key.
/// </summary>
public static Sprite ForActivityKey(string key)
{
if (string.IsNullOrEmpty(key))
{
return Task() ?? FromUiIcon("iconClock");
}
string k = key.ToLowerInvariant();
if (k == "milestone_kill")
{
return ForChronicleKind(ChronicleKind.Kill);
}
if (k == "milestone_death")
{
return ForChronicleKind(ChronicleKind.Death);
}
if (k == "milestone_lover")
{
return ForChronicleKind(ChronicleKind.Lover);
}
if (k == "milestone_friend")
{
return ForChronicleKind(ChronicleKind.Friend);
}
string verb = ActivityVerbMap.Resolve(key);
if (string.IsNullOrEmpty(verb))
{
verb = k;
}
switch (verb)
{
case "fight":
case "warrior":
return FromUiIcon("iconAttack") ?? FromUiIcon("iconKills") ?? Task();
case "hunt":
return FromUiIcon("iconKills") ?? FromUiIcon("iconAttack") ?? Task();
case "lover":
return FromUiIcon("iconArrowLover") ?? Task();
case "social":
case "cry":
case "swear":
return FromUiIcon("iconTalk") ?? FromUiIcon("iconSpeech") ?? FromUiIcon("iconSocial")
?? FromUiIcon("iconArrowLover") ?? Task();
case "eat":
return FromUiIcon("iconFood") ?? FromUiIcon("iconHunger") ?? Task();
case "sleep":
case "dream":
return FromUiIcon("iconSleep") ?? FromUiIcon("iconRest") ?? FromUiIcon("iconClock") ?? Task();
case "farm":
return FromUiIcon("iconFarm") ?? FromUiIcon("iconCrops") ?? FromUiIcon("iconWheat") ?? Task();
case "work":
case "haul":
return FromUiIcon("iconShowTasks") ?? FromUiIcon("iconHammer") ?? FromUiIcon("iconWalker") ?? Task();
case "fire":
case "ignite":
case "extinguish":
return FromUiIcon("iconFire") ?? FromUiIcon("iconLava") ?? Task();
case "flee":
return FromUiIcon("iconFlee") ?? FromUiIcon("iconRun") ?? FromUiIcon("iconDanger")
?? FromUiIcon("iconAttack") ?? Task();
case "play":
case "laugh":
case "sing":
return FromUiIcon("iconHappy") ?? FromUiIcon("iconFun") ?? FromUiIcon("iconMusic")
?? FromUiIcon("iconFavoriteStar") ?? Task();
case "read":
return FromUiIcon("iconBooks") ?? FromUiIcon("iconBook") ?? Task();
case "heal":
case "recharge":
return FromUiIcon("iconHealth") ?? FromUiIcon("iconHeal") ?? FromUiIcon("iconHeart") ?? Task();
case "pollinate":
return FromUiIcon("iconFlower") ?? FromUiIcon("iconBee") ?? FromUiIcon("iconNature") ?? Task();
case "fish":
return FromUiIcon("iconFish") ?? FromUiIcon("iconFishing") ?? FromUiIcon("iconWater") ?? Task();
case "trade":
return FromUiIcon("iconTrade") ?? FromUiIcon("iconCoin") ?? FromUiIcon("iconGold") ?? Task();
case "settle":
case "group":
return FromUiIcon("iconCity") ?? FromUiIcon("iconHome") ?? FromUiIcon("iconKingdom") ?? Task();
case "relieve":
return FromUiIcon("iconPoop") ?? FromUiIcon("iconToilet") ?? Task();
case "confused":
case "strange_urge":
case "possessed":
return FromUiIcon("iconConfused") ?? FromUiIcon("iconMadness") ?? FromUiIcon("iconPossessed")
?? FromUiIcon("iconQuestionMark") ?? Task();
case "steal":
case "loot":
return FromUiIcon("iconSteal") ?? FromUiIcon("iconLoot") ?? FromUiIcon("iconBag") ?? Task();
case "harvest_life":
case "gather_life":
return FromUiIcon("iconSoulHarvested") ?? FromUiIcon("iconSoul") ?? FromUiIcon("iconSkulls")
?? FromUiIcon("iconDead") ?? Task();
case "move":
return FromUiIcon("iconWalker") ?? FromUiIcon("iconShowTasks") ?? Task();
case "wait":
return FromUiIcon("iconClock") ?? Task();
default:
return Task() ?? FromUiIcon("iconClock");
}
}
public static Sprite ForDeathManner(DeathManner manner)
{
switch (manner)
{
case DeathManner.Slain:
return FromUiIcon("iconKills") ?? FromUiIcon("iconAttack") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.OldAge:
return FromUiIcon("iconAge") ?? FromUiIcon("iconClock") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.Starvation:
return FromUiIcon("iconHunger") ?? FromUiIcon("iconFood") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.Drowned:
return FromUiIcon("iconRain") ?? FromUiIcon("iconWater") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.Burned:
return FromUiIcon("iconFire") ?? FromUiIcon("iconLava") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.Plague:
return FromUiIcon("iconPlague") ?? FromUiIcon("iconDisease") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.Divine:
return FromUiIcon("iconDivineLight") ?? FromUiIcon("iconGodFinger") ?? ForChronicleKind(ChronicleKind.Death);
case DeathManner.Accident:
return FromUiIcon("iconBomb") ?? FromUiIcon("iconExplosion") ?? ForChronicleKind(ChronicleKind.Death);
default:
return ForChronicleKind(ChronicleKind.Death);
}
}
public static Sprite Favorite() =>
FromUiIcon("iconFavorite") ?? FromUiIcon("iconFavoriteStar") ?? FromUiIcon("iconStar");
public static Sprite ExpandHistory() =>
FromUiIcon("iconBooks") ?? FromUiIcon("iconList") ?? FromUiIcon("iconClock");
public static Sprite Age() => FromUiIcon("iconAge");
public static Sprite Level() => FromUiIcon("iconLevels");
public static Sprite Kills() => FromUiIcon("iconKills") ?? FromUiIcon("iconAttack");
public static Sprite Task() => FromUiIcon("iconShowTasks") ?? FromUiIcon("iconWalker");
public static Sprite SexMale() => FromUiIcon("IconMale");
public static Sprite SexFemale() => FromUiIcon("IconFemale");
public static Sprite FromTrait(ActorTrait trait)
{
if (trait == null)
{
return null;
}
try
{
Sprite sprite = trait.getSprite();
if (sprite != null)
{
return sprite;
}
}
catch
{
// fall through
}
try
{
if (!string.IsNullOrEmpty(trait.path_icon))
{
return SpriteTextureLoader.getSprite(trait.path_icon);
}
}
catch
{
// ignore
}
return null;
}
public static void Apply(UnityEngine.UI.Image image, Sprite sprite, bool preserveAspect = true)
{
if (image == null)
{
return;
}
image.sprite = sprite;
image.enabled = sprite != null;
image.preserveAspect = preserveAspect;
image.color = Color.white;
}
}