using System.Collections.ObjectModel; using System.Reactive.Disposables; using System.Reactive.Linq; using Microsoft.EntityFrameworkCore; using ReactiveUI; using ReactiveUI.SourceGenerators; using StarsAssistant.Services; using Splat; namespace StarsAssistant.ViewModels; public partial class PlayerPlanetViewModel : ViewModelBase { private readonly Model.Planet Planet; private Game Game; public PlayerPlanetViewModel(Model.Planet planet) { Game = Locator.Current.GetService()!; if (planet.OwnerId != Game.Player.Name) throw new InvalidOperationException("PlayerPlanet ViewModels can only be created for player planets."); Planet = planet; PopulationTargetPercent = planet.PopulationTargetPercent; _populationTargetHelper = this .WhenAnyValue(vm => vm.PopulationTargetPercent) .Select(popTgt => this.MaxPopulation * popTgt / 10000 * 100) .ToProperty(this, vm => vm.PopulationTarget); this.WhenActivated((CompositeDisposable disposables) => { // /* handle activation */ // Disposable // .Create(() => { /* handle deactivation */ }) // .DisposeWith(disposables); }); } #region Database Properties public string Name => Planet.Name; public string Owner => Planet.OwnerId; public string StarbaseType => Planet.StarbaseType; public int Population => Planet.Population ?? 0; public int Value => Planet.Value ?? 0; public int Mines => Planet.Mines ?? 0; public int Factories => Planet.Factories ?? 0; public decimal DefPercent => Planet.DefPercent ?? 0; public int SurfaceIronium => Planet.SurfaceIronium ?? 0; public int SurfaceBoranium => Planet.SurfaceBoranium ?? 0; public int SurfaceGermanium => Planet.SurfaceGermanium ?? 0; public int MRIronium => Planet.MRIronium ?? 0; public int MRBoranium => Planet.MRBoranium ?? 0; public int MRGermanium => Planet.MRGermanium ?? 0; public int MCIronium => Planet.MCIronium ?? 0; public int MCBoranium => Planet.MCBoranium ?? 0; public int MCGermanium => Planet.MCGermanium ?? 0; public int Resources => Planet.Resources ?? 0; public decimal Gravity => Planet.Gravity ?? 0; public decimal Temperature => Planet.Temperature ?? 0; public decimal Radiation => Planet.Radiation ?? 0; public decimal GravityOrig => Planet.GravityOrig ?? 0; public decimal TemperatureOrig => Planet.TemperatureOrig ?? 0; public decimal RadiationOrig => Planet.RadiationOrig ?? 0; public int MaxTerraforming => Planet.MaxTerraforming ?? 0; public int CapacityPercent => Planet.CapacityPercent ?? 0; public int ScanRange => Planet.ScanRange ?? 0; public int PenScanRange => Planet.PenScanRange ?? 0; public int Driver => Planet.Driver ?? 0; public int DriverWarp => Planet.DriverWarp ?? 0; public string RouteTarget => Planet.RouteTarget; public int GateRange => Planet.GateRange ?? 0; public int GateMass => Planet.GateMass ?? 0; public int PctDamage => Planet.PctDamage ?? 0; [Reactive] private int _populationTargetPercent; #endregion #region Derived Properties public int EffectiveValue => GameEngine.EffectivePlanetValue(Value); public int MaxPopulation => GameEngine.MaxPopOnPlanetForPlayer(Value); public int PopulationGrowth => GameEngine.PlanetPopGrowthForPlayer(Population, Value); public int BuildableFactories => GameEngine.MaxBuildableFactoriesForPlayer(Value); public int BuildableMines => GameEngine.MaxBuildableMinesForPlayer(Value); public int OperableFactories => GameEngine.MaxOperableFactoriesForPlayer(Population, Value); public int OperableMines => GameEngine.MaxOperableMinesForPlayer(Population, Value); public int ResourcesFromPopulation => GameEngine.ResourcesFromPopForPlayer(Population, Value); public int ResourcesFromFactories => GameEngine.ResourcesFromFactForPlayer(Population, Factories, Value); [ObservableAsProperty] private int _populationTarget; #endregion }