using Content.Shared._DV.Species; // DeltaV - Hidden species using Content.Shared.Construction.Prototypes; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; namespace Content.Shared.Preferences { /// /// Contains all player characters and the index of the currently selected character. /// Serialized both over the network and to disk. /// [Serializable] [NetSerializable] public sealed class PlayerPreferences { private Dictionary _characters; public PlayerPreferences(IEnumerable> characters, int selectedCharacterIndex, Color adminOOCColor, List> constructionFavorites) { _characters = new Dictionary(characters); SelectedCharacterIndex = selectedCharacterIndex; AdminOOCColor = adminOOCColor; ConstructionFavorites = constructionFavorites; } /// /// All player characters. /// public IReadOnlyDictionary Characters => _characters; public ICharacterProfile GetProfile(int index) { return _characters[index]; } /// /// Index of the currently selected character. /// public int SelectedCharacterIndex { get; } /// /// The currently selected character. /// public ICharacterProfile SelectedCharacter { // Start DeltaV - Prevent spawning as hidden speceis (At all costs) get { // Firstly, check if we CAN use the selected character. if (Characters.ContainsKey(SelectedCharacterIndex)) // If we've selected a character { // Throughout this, we use this If(Valid)return pattern rather than the inverse if(Invalid)continue // Because the conditions in which it's valid are more seperate. This makes it slightly more readable. if (Characters[SelectedCharacterIndex] is not HumanoidCharacterProfile humanoidProfile) return Characters[SelectedCharacterIndex]; // If it's a non-humanoid, return it. if (!SpeciesHiderSystem.IsHidden(humanoidProfile.Species)) return humanoidProfile; // Otherwise, return it if it's not hidden } // Otherwise, return the first valid character we can find. foreach (var (_index, profile) in Characters) { if (profile is not HumanoidCharacterProfile nextHumanoidProfile) return profile; // If it's a non-humanoid, return it. if (!SpeciesHiderSystem.IsHidden(nextHumanoidProfile.Species)) return profile; // If it's not a hidden species, return it. } // If we can't find ANY valid character, make a new one. return HumanoidCharacterProfile.Random(); } } // End DeltaV public Color AdminOOCColor { get; set; } /// /// List of favorite items in the construction menu. /// public List> ConstructionFavorites { get; set; } = []; public int IndexOfCharacter(ICharacterProfile profile) { return _characters.FirstOrNull(p => p.Value == profile)?.Key ?? -1; } public bool TryIndexOfCharacter(ICharacterProfile profile, out int index) { return (index = IndexOfCharacter(profile)) != -1; } } }