Intermediate commit rewrite player planet cache

This commit is contained in:
2025-01-15 21:48:24 +01:00
parent 4789904284
commit ef5a8ae4af
3 changed files with 92 additions and 22 deletions

View File

@ -30,6 +30,11 @@ public class PlanetManager : IDisposable, IEnableLogger
.Filter(planet => planet.OwnerId == Game.Player.Name)
.Transform(planet => new PlayerPlanetViewModel(planet));
/// <summary>
/// Cache with all player planets, indexed by planet name.
/// </summary>
private SourceCache<PlayerPlanetViewModel, string> _playerPlanets = new(p => p.Planet.Name);
/// <summary>
/// Observable subject to trigger when we update the planet cache, allows the
/// UI to react to it.
@ -64,6 +69,27 @@ public class PlanetManager : IDisposable, IEnableLogger
innerCache.AddOrUpdate(allPlanets);
}
);
var allPlayerPlanets = allPlanets.Where(planet => planet.OwnerId == Game.Player.Name);
var allPlayerCacheKeys = _playerPlanets.Keys.ToList();
var playerPlanetNames = from p in allPlayerPlanets select p.Name;
var playerPlanetsToDelete = allPlayerCacheKeys.Except(playerPlanetNames);
_playerPlanets.Edit(innerCache =>
{
foreach (var name in playerPlanetsToDelete)
innerCache.RemoveKey(name);
foreach (var planet in allPlayerPlanets)
{
var playerPlanet = innerCache.Lookup(planet.Name);
if (playerPlanet.HasValue)
playerPlanet.Value.Planet = planet;
else
innerCache.Add(new PlayerPlanetViewModel(planet));
}
}
);
_planetsReloadedSubject.OnNext(Unit.Default);
}