Skip to content

Commit fd7ba71

Browse files
Merge branch 'main' into linux-speech-recognition
2 parents bb59586 + f0fc329 commit fd7ba71

File tree

6 files changed

+111
-14
lines changed

6 files changed

+111
-14
lines changed

src/TrackerCouncil.Smz3.Abstractions/AutoTrackerBase.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ public abstract class AutoTrackerBase : IDisposable
6464
/// </summary>
6565
public event EventHandler? AutoTrackerDisconnected;
6666

67+
/// <summary>
68+
/// Occurs when the tracker detects that the game has changed
69+
/// </summary>
70+
public event EventHandler? GameChanged;
71+
6772
/// <summary>
6873
/// The action to run when the player asks Tracker to look at the game
6974
/// </summary>
@@ -156,5 +161,13 @@ protected virtual void OnAutoTrackerConnectorChanged()
156161
AutoTrackerConnectorChanged?.Invoke(this, EventArgs.Empty);
157162
}
158163

164+
/// <summary>
165+
/// Invokes the GameChanged event
166+
/// </summary>
167+
protected virtual void OnGameChanged()
168+
{
169+
GameChanged?.Invoke(this, EventArgs.Empty);
170+
}
171+
159172
public abstract void Dispose();
160173
}

src/TrackerCouncil.Smz3.Abstractions/ITrackerModeService.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,12 @@ public interface ITrackerModeService
7171
/// <param name="confidence">The speech recognition confidence.</param>
7272
public void Peg(float? confidence = null);
7373

74-
public void SetPegs(int count);
74+
/// <summary>
75+
/// Updates the number of pegs by auto tracker
76+
/// </summary>
77+
/// <param name="count">The current number of pegs</param>
78+
/// <returns>True if the peg count was updated, false otherwise</returns>
79+
public bool SetPegs(int count);
7580

7681
/// <summary>
7782
/// Starts Peg World mode.

src/TrackerCouncil.Smz3.Tracking/AutoTracking/AutoTracker.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ private void SnesConnectorServiceOnDisconnected(object? sender, EventArgs e)
105105

106106
HasStarted = false;
107107
CurrentGame = Game.Neither;
108+
OnGameChanged();
108109
_hasValidState = false;
109110

110111
if (_numDisconnects > 10)
@@ -200,6 +201,7 @@ public override void UpdateGame(Game game)
200201
{
201202
PreviousGame = CurrentGame;
202203
CurrentGame = game;
204+
OnGameChanged();
203205
}
204206

205207
public override void UpdateValidState(bool hasValidState)
Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Linq;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24
using TrackerCouncil.Smz3.Abstractions;
35
using TrackerCouncil.Smz3.Data.Tracking;
46
using TrackerCouncil.Smz3.Shared.Enums;
@@ -9,16 +11,19 @@ namespace TrackerCouncil.Smz3.Tracking.AutoTracking.MetroidStateChecks;
911
/// Metroid state check for nearing Shaktool
1012
/// Player enters the room with the grapple block from the left
1113
/// </summary>
12-
public class Shaktool : IMetroidStateCheck
14+
public class Shaktool(TrackerBase tracker) : IMetroidStateCheck
1315
{
16+
private readonly HashSet<int> _shaktoolRooms = [70, 154, 197, 208];
17+
private bool _enabledOnGameChangedCheck;
18+
1419
/// <summary>
1520
/// Executes the check for the current state
1621
/// </summary>
17-
/// <param name="tracker">The tracker instance</param>
22+
/// <param name="trackerBase">The tracker instance</param>
1823
/// <param name="currentState">The current state in Super Metroid</param>
1924
/// <param name="prevState">The previous state in Super Metroid</param>
2025
/// <returns>True if the check was identified, false otherwise</returns>
21-
public bool ExecuteCheck(TrackerBase tracker, AutoTrackerMetroidState currentState, AutoTrackerMetroidState prevState)
26+
public bool ExecuteCheck(TrackerBase trackerBase, AutoTrackerMetroidState currentState, AutoTrackerMetroidState prevState)
2227
{
2328
if (currentState is { CurrentRegion: 4, CurrentRoomInRegion: 36 } && prevState.CurrentRoomInRegion == 28 &&
2429
tracker.World.FindLocation(LocationId.InnerMaridiaSpringBall).Cleared != true &&
@@ -27,17 +32,46 @@ public bool ExecuteCheck(TrackerBase tracker, AutoTrackerMetroidState currentSta
2732
tracker.ShutUp();
2833
tracker.Say(x => x.AutoTracker.NearShaktool, once: true);
2934
tracker.ModeTracker.StartShaktoolMode();
35+
EnableGameChangedCheck();
3036
return true;
3137
}
3238

33-
if (tracker.ModeTracker.ShaktoolMode &&
34-
((currentState is { CurrentRegion: 4, CurrentRoomInRegion: 28 } && prevState.CurrentRoomInRegion == 36) ||
35-
currentState.CurrentRegion != 4))
39+
if (tracker.ModeTracker.ShaktoolMode && (currentState.CurrentRoom == null ||
40+
!_shaktoolRooms.Contains(currentState.CurrentRoom.Value)))
3641
{
37-
tracker.ModeTracker.StopShaktoolMode();
42+
DisableShaktoolMode();
3843
return true;
3944
}
4045

4146
return false;
4247
}
48+
49+
private void EnableGameChangedCheck()
50+
{
51+
if (_enabledOnGameChangedCheck || tracker.AutoTracker == null) return;
52+
_enabledOnGameChangedCheck = true;
53+
tracker.AutoTracker.GameChanged += AutoTrackerOnGameChanged;
54+
}
55+
56+
private void DisableGameChangedCheck()
57+
{
58+
if (!_enabledOnGameChangedCheck || tracker.AutoTracker == null ) return;
59+
_enabledOnGameChangedCheck = false;
60+
tracker.AutoTracker.GameChanged -= AutoTrackerOnGameChanged;
61+
}
62+
63+
private void AutoTrackerOnGameChanged(object? sender, EventArgs e)
64+
{
65+
DisableShaktoolMode();
66+
}
67+
68+
private void DisableShaktoolMode()
69+
{
70+
if (tracker.ModeTracker.ShaktoolMode)
71+
{
72+
tracker.ModeTracker.StopShaktoolMode();
73+
}
74+
75+
DisableGameChangedCheck();
76+
}
4377
}

src/TrackerCouncil.Smz3.Tracking/AutoTracking/ZeldaStateChecks/PegWorld.cs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System;
2+
using System.Threading.Tasks;
23
using SnesConnectorLibrary;
34
using SnesConnectorLibrary.Requests;
45
using SNI;
@@ -12,6 +13,8 @@ namespace TrackerCouncil.Smz3.Tracking.AutoTracking.ZeldaStateChecks;
1213
/// </summary>
1314
public class PegWorld(TrackerBase tracker, ISnesConnectorService snesConnector) : IZeldaStateCheck
1415
{
16+
private bool _enabledOnGameChangedCheck;
17+
1518
/// <summary>
1619
/// Executes the check for the current state
1720
/// </summary>
@@ -27,9 +30,43 @@ public bool ExecuteCheck(TrackerBase trackerBase, AutoTrackerZeldaState currentS
2730
return true;
2831
}
2932

33+
if (tracker.ModeTracker.PegWorldMode && !(currentState.OverworldScreen == 0x62 || currentState is { OverworldScreen: 0, CurrentRoom: 295 }))
34+
{
35+
DisablePegWorldNode();
36+
}
37+
3038
return false;
3139
}
3240

41+
private void EnableGameChangedCheck()
42+
{
43+
if (_enabledOnGameChangedCheck || tracker.AutoTracker == null) return;
44+
_enabledOnGameChangedCheck = true;
45+
tracker.AutoTracker.GameChanged += AutoTrackerOnGameChanged;
46+
}
47+
48+
private void DisableGameChangedCheck()
49+
{
50+
if (!_enabledOnGameChangedCheck || tracker.AutoTracker == null ) return;
51+
_enabledOnGameChangedCheck = false;
52+
tracker.AutoTracker.GameChanged -= AutoTrackerOnGameChanged;
53+
}
54+
55+
private void AutoTrackerOnGameChanged(object? sender, EventArgs e)
56+
{
57+
DisablePegWorldNode();
58+
}
59+
60+
private void DisablePegWorldNode()
61+
{
62+
if (tracker.ModeTracker.PegWorldMode)
63+
{
64+
tracker.ModeTracker.StopPegWorldMode();
65+
}
66+
67+
DisableGameChangedCheck();
68+
}
69+
3370
private async Task CountPegs()
3471
{
3572
var response = await snesConnector.MakeMemoryRequestAsync(new SnesSingleMemoryRequest()
@@ -46,9 +83,9 @@ private async Task CountPegs()
4683

4784
var count = response.Data.ReadUInt8(0);
4885

49-
if (count != null)
86+
if (count != null && tracker.ModeTracker.SetPegs((int)count))
5087
{
51-
tracker.ModeTracker.SetPegs((int)count);
88+
EnableGameChangedCheck();
5289
}
5390
}
5491
}

src/TrackerCouncil.Smz3.Tracking/TrackingServices/TrackerModeService.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,18 @@ public void Peg(float? confidence = null)
7272
RestartIdleTimers();
7373
}
7474

75-
public void SetPegs(int count)
75+
public bool SetPegs(int count)
7676
{
7777
if (count <= PegsPegged)
78-
return;
78+
return false;
79+
80+
var updated = false;
7981

8082
if (!PegWorldMode)
8183
{
8284
PegWorldMode = true;
8385
ToggledPegWorldModeOn?.Invoke(this, new TrackerEventArgs(null, true));
86+
updated = true;
8487
}
8588

8689
if (count <= PegWorldModeModule.TotalPegs)
@@ -90,7 +93,10 @@ public void SetPegs(int count)
9093
PegsPegged = count;
9194
Tracker.Say(responses: Responses.PegWorldModePeggedMultiple, tieredKey: delta, wait: true);
9295
PegPegged?.Invoke(this, new TrackerEventArgs(null, true));
96+
updated = true;
9397
}
98+
99+
return updated;
94100
}
95101

96102
public void StartPegWorldMode(float? confidence = null)

0 commit comments

Comments
 (0)