Skip to content

Commit 4d32aaf

Browse files
Merge branch 'main' into fix-ap-goal-markers
2 parents f1f413c + 981b51b commit 4d32aaf

File tree

11 files changed

+99
-31
lines changed

11 files changed

+99
-31
lines changed

src/TrackerCouncil.Smz3.Abstractions/TrackerBase.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public abstract class TrackerBase : IDisposable
7575
/// <summary>
7676
/// Gets the configured responses.
7777
/// </summary>
78-
public ResponseConfig Responses { get; protected init; } = null!;
78+
public ResponseConfig Responses { get; protected set; } = null!;
7979

8080
/// <summary>
8181
/// Gets a collection of basic requests and responses.
@@ -370,5 +370,11 @@ protected virtual void OnVoiceRecognitionEnabledChanged()
370370
VoiceRecognitionEnabledChanged?.Invoke(this, EventArgs.Empty);
371371
}
372372

373+
/// <summary>
374+
/// Updates the responses to reflect the selected tracker image pack
375+
/// </summary>
376+
/// <param name="packName">The name of the pack</param>
377+
public abstract void SetImagePack(string? packName);
378+
373379
public abstract void Dispose();
374380
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace TrackerCouncil.Smz3.Data.Configuration.ConfigFiles;
2+
3+
public class TrackerProfileConfig
4+
{
5+
public bool UseAltVoice { get; set; }
6+
public ResponseConfig? ResponseConfig { get; set; }
7+
}

src/TrackerCouncil.Smz3.Data/Options/GeneralOptions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ public bool Validate()
265265
AutoMapUpdateBehavior = AutoMapUpdateBehavior ?? Options.AutoMapUpdateBehavior.Disabled,
266266
VoiceFrequency = TrackerVoiceFrequency,
267267
TrackerProfiles = SelectedProfiles,
268+
TrackerImagePackName = TrackerSpeechImagePack,
268269
UndoExpirationTime = UndoExpirationTime,
269270
TrackDisplayFormat = TrackDisplayFormat,
270271
MsuTrackOutputPath = MsuTrackOutputPath,

src/TrackerCouncil.Smz3.Data/Options/TrackerOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ public record TrackerOptions
100100
/// </summary>
101101
public ICollection<string?> TrackerProfiles { get; set; } = new List<string?>() { "Sassy" };
102102

103+
/// <summary>
104+
/// Gets the name of the tracker images that the user selected
105+
/// </summary>
106+
public string? TrackerImagePackName { get; set; }
107+
103108
/// <summary>
104109
/// The output style for the current song (Deprecated)
105110
/// </summary>

src/TrackerCouncil.Smz3.Data/Options/TrackerSpeechReactionImages.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using TrackerCouncil.Smz3.Data.Configuration.ConfigFiles;
23

34
namespace TrackerCouncil.Smz3.Data.Options;
45

@@ -38,6 +39,8 @@ public class TrackerSpeechImagePack
3839
/// </summary>
3940
public required Dictionary<string, TrackerSpeechReactionImages> Reactions { get; set; }
4041

42+
public required TrackerProfileConfig? ProfileConfig { get; set; }
43+
4144
/// <summary>
4245
/// Gets the reaction images for a given reaction type. Will return the default reaction type if not specified
4346
/// or the requested reaction type is not present in this pack.

src/TrackerCouncil.Smz3.Data/Services/TrackerSpriteService.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.IO;
34
using System.Linq;
45
using Microsoft.Extensions.Logging;
6+
using TrackerCouncil.Smz3.Data.Configuration.ConfigFiles;
57
using TrackerCouncil.Smz3.Data.Options;
8+
using YamlDotNet.Serialization;
9+
using YamlDotNet.Serialization.NamingConventions;
610

711
namespace TrackerCouncil.Smz3.Data.Services;
812

913
/// <summary>
1014
/// Service for loading tracker speech sprites
1115
/// </summary>
1216
/// <param name="optionsFactory"></param>
13-
public class TrackerSpriteService(OptionsFactory optionsFactory)
17+
public class TrackerSpriteService(OptionsFactory optionsFactory, ILogger<TrackerSpriteService> logger)
1418
{
1519
private List<TrackerSpeechImagePack> _packs = [];
1620

@@ -82,6 +86,9 @@ private void LoadPack(string folder, bool isUserPack)
8286
packName += " (Custom)";
8387
}
8488

89+
var config = GetConfig(Path.Combine(folder, "config.yml"))
90+
?? GetConfig(Path.Combine(folder, "config.yaml"));
91+
8592
_packs.Add(new TrackerSpeechImagePack
8693
{
8794
Name = packName,
@@ -90,7 +97,31 @@ private void LoadPack(string folder, bool isUserPack)
9097
IdleImage = Path.Combine(folder, "default_idle.png"),
9198
TalkingImage = Path.Combine(folder, "default_talk.png"),
9299
},
93-
Reactions = reactions
100+
Reactions = reactions,
101+
ProfileConfig = config,
94102
});
95103
}
104+
105+
private TrackerProfileConfig? GetConfig(string path)
106+
{
107+
if (!File.Exists(path))
108+
{
109+
return null;
110+
}
111+
112+
var yml = File.ReadAllText(path);
113+
var deserializer = new DeserializerBuilder()
114+
.WithNamingConvention(PascalCaseNamingConvention.Instance)
115+
.IgnoreUnmatchedProperties()
116+
.Build();
117+
try
118+
{
119+
return deserializer.Deserialize<TrackerProfileConfig>(yml);
120+
}
121+
catch (Exception e)
122+
{
123+
logger.LogError(e, "Unable to parse tracker profile config {Path}", path);
124+
return null;
125+
}
126+
}
96127
}

src/TrackerCouncil.Smz3.Tracking/Services/ICommunicator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void Abort() { }
4242
/// When overridden in an implementing class, uses an alternate voice
4343
/// when communicating with the player.
4444
/// </summary>
45-
public void UseAlternateVoice() { }
45+
public void UseAlternateVoice(bool useAlt = true) { }
4646

4747
/// <summary>
4848
/// When overridden in an implementing class, increases the

src/TrackerCouncil.Smz3.Tracking/Services/TextToSpeechCommunicator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ public TextToSpeechCommunicator(TrackerOptionsAccessor trackerOptionsAccessor, I
7272
/// <summary>
7373
/// Selects a different text-to-speech voice.
7474
/// </summary>
75-
public void UseAlternateVoice()
75+
public void UseAlternateVoice(bool useAlt = true)
7676
{
7777
if (!OperatingSystem.IsWindows())
7878
{
7979
return;
8080
}
8181

82-
_tts.SelectVoiceByHints(VoiceGender.Male);
82+
_tts.SelectVoiceByHints(useAlt ? VoiceGender.Male : VoiceGender.Female);
8383
}
8484

8585
/// <summary>

src/TrackerCouncil.Smz3.Tracking/Tracker.cs

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@ public sealed class Tracker : TrackerBase, IDisposable
4747
private readonly ITrackerStateService _stateService;
4848
private readonly ITrackerTimerService _timerService;
4949
private readonly ISpeechRecognitionService _recognizer;
50+
private readonly TrackerSpriteService _trackerSpriteService;
51+
private readonly HashSet<SchrodingersString> _saidLines = new();
52+
5053
private bool _disposed;
5154
private string? _lastSpokenText;
52-
private readonly bool _alternateTracker;
53-
private readonly HashSet<SchrodingersString> _saidLines = new();
55+
private string? _previousImagePackName;
56+
private ResponseConfig _defaultResponseConfig;
5457

5558
/// <summary>
5659
/// Initializes a new instance of the <see cref="Tracker"/> class.
@@ -71,6 +74,7 @@ public sealed class Tracker : TrackerBase, IDisposable
7174
/// <param name="stateService"></param>
7275
/// <param name="timerService"></param>
7376
/// <param name="serviceProvider"></param>
77+
/// <param name="trackerSpriteService"></param>
7478
public Tracker(IWorldAccessor worldAccessor,
7579
TrackerModuleFactory moduleFactory,
7680
IChatClient chatClient,
@@ -82,7 +86,8 @@ public Tracker(IWorldAccessor worldAccessor,
8286
Configs configs,
8387
ITrackerStateService stateService,
8488
ITrackerTimerService timerService,
85-
IServiceProvider serviceProvider)
89+
IServiceProvider serviceProvider,
90+
TrackerSpriteService trackerSpriteService)
8691
{
8792
if (trackerOptions.Options == null)
8893
throw new InvalidOperationException("Tracker options have not yet been activated.");
@@ -98,10 +103,12 @@ public Tracker(IWorldAccessor worldAccessor,
98103
_communicator = communicator;
99104
_stateService = stateService;
100105
_timerService = timerService;
106+
_trackerSpriteService = trackerSpriteService;
101107

102108
// Initialize the tracker configuration
103109
Configs = configs;
104-
Responses = configs.Responses;
110+
_defaultResponseConfig = Responses = configs.Responses;
111+
SetImagePack(trackerOptions.Options.TrackerImagePackName);
105112
Requests = configs.Requests;
106113
PlayerProgressionService.ResetProgression();
107114

@@ -119,14 +126,6 @@ public Tracker(IWorldAccessor worldAccessor,
119126
_idleTimers = new();
120127
}
121128

122-
123-
// Initialize the text-to-speech
124-
if (s_random.NextDouble() <= 0.01)
125-
{
126-
_alternateTracker = true;
127-
_communicator.UseAlternateVoice();
128-
}
129-
130129
// Initialize the speech recognition engine
131130
if (_trackerOptions.Options.SpeechRecognitionMode == SpeechRecognitionMode.Disabled ||
132131
!OperatingSystem.IsWindows())
@@ -217,6 +216,30 @@ public override bool Load(GeneratedRom rom, string romPath)
217216
return false;
218217
}
219218

219+
public override void SetImagePack(string? packName)
220+
{
221+
if (packName == _previousImagePackName)
222+
{
223+
return;
224+
}
225+
226+
_previousImagePackName = packName;
227+
var profileConfig = _trackerSpriteService.GetPack(packName).ProfileConfig;
228+
_communicator.UseAlternateVoice(profileConfig?.UseAltVoice ?? false);
229+
230+
if (profileConfig?.ResponseConfig == null)
231+
{
232+
Responses = _defaultResponseConfig;
233+
return;
234+
}
235+
236+
var newResponseConfig = ResponseConfig.Default();
237+
IMergeable<ResponseConfig> mergeableConfig = newResponseConfig;
238+
mergeableConfig.MergeFrom(_defaultResponseConfig);
239+
mergeableConfig.MergeFrom(profileConfig.ResponseConfig);
240+
Responses = newResponseConfig;
241+
}
242+
220243
private void LoadServices(IServiceProvider serviceProvider)
221244
{
222245
var interfaceNamespace = typeof(TrackerBase).Namespace;
@@ -319,7 +342,7 @@ public override bool TryStartTracking()
319342
loadError = true;
320343
}
321344

322-
Say(response: _alternateTracker ? Responses.StartingTrackingAlternate : Responses.StartedTracking);
345+
Say(response: Responses.StartedTracking);
323346
RestartIdleTimers();
324347
return !loadError;
325348
}

src/TrackerCouncil.Smz3.Tracking/VoiceCommands/GoModeModule.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Diagnostics.CodeAnalysis;
33
using Microsoft.Extensions.Logging;
44
using TrackerCouncil.Smz3.Abstractions;
5-
using TrackerCouncil.Smz3.Data.Configuration.ConfigFiles;
65
using TrackerCouncil.Smz3.Tracking.Services;
76

87
namespace TrackerCouncil.Smz3.Tracking.VoiceCommands;
@@ -12,20 +11,16 @@ namespace TrackerCouncil.Smz3.Tracking.VoiceCommands;
1211
/// </summary>
1312
public class GoModeModule : TrackerModule
1413
{
15-
private ResponseConfig _responseConfig;
16-
1714
/// <summary>
1815
/// Initializes a new instance of the <see cref="GoModeModule"/> class.
1916
/// </summary>
2017
/// <param name="tracker">The tracker instance.</param>
2118
/// <param name="playerProgressionService">Service to get item information</param>
2219
/// <param name="worldQueryService">Service to get world information</param>
2320
/// <param name="logger">Used to log information.</param>
24-
/// <param name="responseConfig"></param>
25-
public GoModeModule(TrackerBase tracker, IPlayerProgressionService playerProgressionService, IWorldQueryService worldQueryService, ILogger<GoModeModule> logger, ResponseConfig responseConfig)
21+
public GoModeModule(TrackerBase tracker, IPlayerProgressionService playerProgressionService, IWorldQueryService worldQueryService, ILogger<GoModeModule> logger)
2622
: base(tracker, playerProgressionService, worldQueryService, logger)
2723
{
28-
_responseConfig = responseConfig;
2924
}
3025

3126
private GrammarBuilder GetGoModeRule(List<string> prompts)
@@ -38,12 +33,12 @@ private GrammarBuilder GetGoModeRule(List<string> prompts)
3833
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility")]
3934
public override void AddCommands()
4035
{
41-
if (_responseConfig.GoModePrompts == null)
36+
if (TrackerBase.Responses.GoModePrompts == null)
4237
{
4338
return;
4439
}
4540

46-
AddCommand("Toggle Go Mode", GetGoModeRule(_responseConfig.GoModePrompts), (result) =>
41+
AddCommand("Toggle Go Mode", GetGoModeRule(TrackerBase.Responses.GoModePrompts), (result) =>
4742
{
4843
TrackerBase.ModeTracker.ToggleGoMode(result.Confidence);
4944
});

0 commit comments

Comments
 (0)