using UnityEngine; namespace IdleSpectator; /// /// Loads WorldBox ui/Icons sprites for HUD chrome. /// 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"); } /// /// Live unit sprite as shown in inspect UI (phenotype/kingdom tint), not the species icon. /// 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"); } } /// /// Activity row icon from a task id, Beh* key, or milestone_* key. /// 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; } }