using System.Linq; using Content.Client.UserInterface.Controls; using Content.Shared._Horizon.Bark; using Content.Shared._Horizon.CCVar; using Content.Shared.Speech; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.XAML; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; namespace Content.Client.VoiceMask; [GenerateTypedNameReferences] public sealed partial class VoiceMaskNameChangeWindow : FancyWindow { public Action? OnNameChange; public Action? OnVerbChange; public Action? OnBarkChange; // _Horizon public Action? OnPitchChange; // _Horizon private List<(string, string)> _verbs = new(); private List _barks = new(); // _Horizon private string? _verb; public VoiceMaskNameChangeWindow() { RobustXamlLoader.Load(this); NameSelectorSet.OnPressed += _ => { OnNameChange?.Invoke(NameSelector.Text); }; SpeechVerbSelector.OnItemSelected += args => { OnVerbChange?.Invoke((string?) args.Button.GetItemMetadata(args.Id)); SpeechVerbSelector.SelectId(args.Id); }; // _Horizon start if (IoCManager.Resolve().GetCVar(HorizonCCVars.BarksEnabled)) { BarksContainer.Visible = true; BarksPitchContainer.Visible = true; ReloadBarks(IoCManager.Resolve()); } // _Horizon end } public void ReloadVerbs(IPrototypeManager proto) { foreach (var verb in proto.EnumeratePrototypes()) { _verbs.Add((Loc.GetString(verb.Name), verb.ID)); } _verbs.Sort((a, b) => a.Item1.CompareTo(b.Item1)); } public void AddVerbs() { SpeechVerbSelector.Clear(); AddVerb(Loc.GetString("chat-speech-verb-name-none"), null); foreach (var (name, id) in _verbs) { AddVerb(name, id); } } private void AddVerb(string name, string? verb) { var id = SpeechVerbSelector.ItemCount; SpeechVerbSelector.AddItem(name); if (verb is {} metadata) SpeechVerbSelector.SetItemMetadata(id, metadata); if (verb == _verb) SpeechVerbSelector.SelectId(id); } // _Horizon start private void ReloadBarks(IPrototypeManager proto) { BarkSelector.OnItemSelected += args => { BarkSelector.SelectId(args.Id); if (BarkSelector.SelectedMetadata != null) OnBarkChange!((string)BarkSelector.SelectedMetadata); }; PitchSelector.OnTextEntered += args => { if (float.TryParse(args.Text, out var newMsg)) { OnPitchChange!(args.Text); PitchSelector.SetText(args.Text); } }; _barks = proto .EnumeratePrototypes() .Where(o => o.RoundStart) .OrderBy(o => Loc.GetString(o.Name)) .ToList(); for (var i = 0; i < _barks.Count; i++) { var name = Loc.GetString(_barks[i].Name); BarkSelector.AddItem(name); BarkSelector.SetItemMetadata(i, _barks[i].ID); } } // _Horizon end public void UpdateState(string name, string barkId, float barkPitch, string? verb) // _Horizon { NameSelector.Text = name; _verb = verb; for (int id = 0; id < SpeechVerbSelector.ItemCount; id++) { if (string.Equals(verb, SpeechVerbSelector.GetItemMetadata(id))) { SpeechVerbSelector.SelectId(id); break; } } // _Horizon start var barkIdx = _barks.FindIndex(b => b.ID == barkId); if (barkIdx != -1) BarkSelector.Select(barkIdx); PitchSelector.SetText(barkPitch.ToString()); // _Horizon end } }