diff --git a/Assets/Talo Game Services/Talo/Runtime/Utils/LeaderboardEntriesManager.cs b/Assets/Talo Game Services/Talo/Runtime/Utils/LeaderboardEntriesManager.cs index a086cfa..5acadd8 100644 --- a/Assets/Talo Game Services/Talo/Runtime/Utils/LeaderboardEntriesManager.cs +++ b/Assets/Talo Game Services/Talo/Runtime/Utils/LeaderboardEntriesManager.cs @@ -5,7 +5,7 @@ namespace TaloGameServices { public class LeaderboardEntriesManager { - private Dictionary> _currentEntries = new Dictionary>(); + private readonly Dictionary> _currentEntries = new(); public List GetEntries(string internalName) { @@ -16,7 +16,7 @@ public List GetEntries(string internalName) return _currentEntries[internalName]; } - public void UpsertEntry(string internalName, LeaderboardEntry entry, bool bumpPositions = false) + public void UpsertEntry(string internalName, LeaderboardEntry upsertEntry, bool bumpPositions = false) { if (!_currentEntries.ContainsKey(internalName)) { @@ -26,18 +26,23 @@ public void UpsertEntry(string internalName, LeaderboardEntry entry, bool bumpPo var entries = _currentEntries[internalName]; // ensure there isn't an existing entry - entries.RemoveAll((e) => e.id == entry.id); + entries.RemoveAll((e) => e.id == upsertEntry.id); - int insertPosition = FindInsertPosition(entries, entry); - entries.Insert(insertPosition, entry); + int insertPosition = FindInsertPosition(entries, upsertEntry); + entries.Insert(insertPosition, upsertEntry); if (bumpPositions) { - foreach (var e in entries) + // find any collisions and bump any subsequent entries down by 1 + int collisionIndex = entries.FindIndex((e) => e.id != upsertEntry.id && e.position == upsertEntry.position); + if (collisionIndex != -1) { - if (e.id != entry.id && e.position >= entry.position) + for (int i = collisionIndex; i < entries.Count; i++) { - e.position += 1; + if (entries[i].id != upsertEntry.id) + { + entries[i].position += 1; + } } } } diff --git a/Assets/Talo Game Services/Talo/Tests/LeaderboardsAPI/LeaderboardEntriesManagerTests.cs b/Assets/Talo Game Services/Talo/Tests/LeaderboardsAPI/LeaderboardEntriesManagerTests.cs index 4fff1e0..72faed1 100644 --- a/Assets/Talo Game Services/Talo/Tests/LeaderboardsAPI/LeaderboardEntriesManagerTests.cs +++ b/Assets/Talo Game Services/Talo/Tests/LeaderboardsAPI/LeaderboardEntriesManagerTests.cs @@ -191,6 +191,35 @@ public void UpsertEntry_BumpPositions_OnlyBumpsAffectedEntries() Assert.AreEqual(3, entries[3].position); // bumped from 2 to 3 } + [Test] + public void UpsertEntry_BumpPositions_DoesNotBumpWhenPlayerImprovesButKeepsSamePosition() + { + var entry1 = new LeaderboardEntry { id = 1, score = 100f, position = 0, leaderboardSortMode = "desc" }; + var entry2 = new LeaderboardEntry { id = 2, score = 80f, position = 1, leaderboardSortMode = "desc" }; + var entry3 = new LeaderboardEntry { id = 3, score = 60f, position = 2, leaderboardSortMode = "desc" }; + + manager.UpsertEntry("test", entry1); + manager.UpsertEntry("test", entry2); + manager.UpsertEntry("test", entry3); + + // entry1 improves their score but stays at position 0 - no one should be bumped + var updatedEntry1 = new LeaderboardEntry { id = 1, score = 110f, position = 0, leaderboardSortMode = "desc" }; + manager.UpsertEntry("test", updatedEntry1, bumpPositions: true); + + var entries = manager.GetEntries("test"); + + Assert.AreEqual(3, entries.Count); + + Assert.AreEqual(1, entries[0].id); + Assert.AreEqual(0, entries[0].position); // still first + + Assert.AreEqual(2, entries[1].id); + Assert.AreEqual(1, entries[1].position); // unchanged + + Assert.AreEqual(3, entries[2].id); + Assert.AreEqual(2, entries[2].position); // unchanged + } + [Test] public void UpsertEntry_NoBumpPositions_PreservesExistingPositions() {