using System; using System.Collections.Immutable; using System.Xml.Linq; #if CLIENT using Microsoft.Xna.Framework; #endif namespace Barotrauma { class TalentPrefab : PrefabWithUintIdentifier { public string OriginalName => Identifier.Value; public LocalizedString DisplayName { get; private set; } public LocalizedString Description { get; private set; } /// /// When set to false the AbilityEffects of multiple of the same talent will not be checked and only the first one. /// public bool AbilityEffectsStackWithSameTalent; public readonly Sprite Icon; /// /// When set to a value the talent tooltip will display a text showing the current value of the stat and the max value. /// For example "Progress: 37/100". /// public readonly Option<(Identifier PermanentStatIdentifier, int Max)> TrackedStat; #if CLIENT public readonly Option ColorOverride; #endif public static readonly PrefabCollection TalentPrefabs = new PrefabCollection(); public readonly ImmutableHashSet Migrations; public ContentXElement ConfigElement { get; private set; } public TalentPrefab(ContentXElement element, TalentsFile file) : base(file, element.GetAttributeIdentifier("identifier", Identifier.Empty)) { ConfigElement = element; DisplayName = TextManager.Get($"talentname.{Identifier}").Fallback(Identifier.Value); AbilityEffectsStackWithSameTalent = element.GetAttributeBool("abilityeffectsstackwithsametalent", true); var trackedStat = element.GetAttributeIdentifier("trackedstat", Identifier.Empty); var trackedMax = element.GetAttributeInt("trackedmax", 100); TrackedStat = !trackedStat.IsEmpty ? Option.Some((trackedStat, trackedMax)) : Option.None; Identifier nameIdentifier = element.GetAttributeIdentifier("nameidentifier", Identifier.Empty); if (!nameIdentifier.IsEmpty) { DisplayName = TextManager.Get(nameIdentifier).Fallback(Identifier.Value); } Description = string.Empty; #if CLIENT Color colorOverride = element.GetAttributeColor("coloroverride", Color.TransparentBlack); ColorOverride = colorOverride != Color.TransparentBlack ? Option.Some(colorOverride) : Option.None(); #endif var migrations = ImmutableHashSet.CreateBuilder(); foreach (var subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "icon": Icon = new Sprite(subElement); break; case "description": var tempDescription = Description; TextManager.ConstructDescription(ref tempDescription, subElement); Description = tempDescription; break; case "migrations": foreach (var migrationElement in subElement.Elements()) { try { var migration = TalentMigration.FromXML(migrationElement); migrations.Add(migration); } catch (Exception e) { DebugConsole.ThrowError($"Error while loading talent migration for talent \"{Identifier}\".", e, element?.ContentPackage); } } break; } } Migrations = migrations.ToImmutable(); if (element.GetAttribute("description") != null) { string description = element.GetAttributeString("description", string.Empty); Description = Description.Fallback(TextManager.Get(description)).Fallback(description); } else { Description = Description.Fallback(TextManager.Get($"talentdescription.{Identifier}")).Fallback(string.Empty); } } public override void Dispose() { } } }