From efa5d452ea049a27b459411c61e74f1769794b99 Mon Sep 17 00:00:00 2001 From: Torben Nehmer Date: Tue, 24 Sep 2024 22:32:13 +0200 Subject: [PATCH] Implement BuCol --- Stars Assistant/CSV/Planet.cs | 4 +- Stars Assistant/Model/Planet.cs | 24 +--- Stars Assistant/Model/StarsDatabase.cs | 9 ++ Stars Assistant/Services/GameEngine.cs | 14 +- Stars Assistant/ViewModels/BuColViewModel.cs | 2 +- Stars Assistant/ViewModels/PlanetViewModel.cs | 10 +- .../ViewModels/PlayerPlanetViewModel.cs | 128 ++++++++++++++++++ Stars Assistant/Views/BuColView.axaml | 32 +++++ 8 files changed, 188 insertions(+), 35 deletions(-) create mode 100644 Stars Assistant/ViewModels/PlayerPlanetViewModel.cs diff --git a/Stars Assistant/CSV/Planet.cs b/Stars Assistant/CSV/Planet.cs index 099401d..ebbed8e 100644 --- a/Stars Assistant/CSV/Planet.cs +++ b/Stars Assistant/CSV/Planet.cs @@ -10,7 +10,7 @@ public class Planet public required string Name { get; set; } [Index(1)] - public string? Owner { get; set; } + public string Owner { get; set; } = String.Empty; [Index(2)] public string StarbaseType { get; set; } = String.Empty; @@ -240,7 +240,7 @@ public class Planet if (dbPlanet.Name != Name) throw new InvalidOperationException($"DB Planet Name {dbPlanet.Name} does not macth the CSV Planet Name {Name}"); - dbPlanet.OwnerId = Owner != "" ? Owner : null; + dbPlanet.OwnerId = Owner; dbPlanet.StarbaseType = StarbaseType; dbPlanet.ReportAge = ReportAge; dbPlanet.Population = Population; diff --git a/Stars Assistant/Model/Planet.cs b/Stars Assistant/Model/Planet.cs index 08ea465..fc657f2 100644 --- a/Stars Assistant/Model/Planet.cs +++ b/Stars Assistant/Model/Planet.cs @@ -5,12 +5,12 @@ namespace StarsAssistant.Model; public class Planet { - #region Persistant and derived propeties + #region Persistant propeties [Key] public required string Name { get; set; } - public string? OwnerId { get; set; } + public string OwnerId { get; set; } = String.Empty; public string StarbaseType { get; set; } = String.Empty; @@ -70,7 +70,7 @@ public class Planet public int? DriverWarp { get; set; } - public string? RouteTarget { get; set; } + public string RouteTarget { get; set; } = String.Empty; public int? GateRange { get; set; } @@ -86,22 +86,4 @@ public class Planet #endregion - #region Derived Properties - - // public int EffectiveValue() => EffectiveValue(Value); - - // public int MaxPopOnPlanet() => MaxPopOnPlanet(Value); - - // public int PopGrowth() => PopGrowth(Population ?? 0, MaxPopOnPlanet(), Value ?? 0); - - // public int MaxFact() => MaxFact(Population ?? 0); - - // public int MaxMines() => MaxMines(Population ?? 0); - - // public int ResourcesFromPop() => ResourcesFromPop(Population ?? 0, Value ?? 0); - - // public int ResourcesFromFact() => ResourcesFromFact(Population ?? 0, Factories ?? 0, Value ?? 0); - - #endregion - } \ No newline at end of file diff --git a/Stars Assistant/Model/StarsDatabase.cs b/Stars Assistant/Model/StarsDatabase.cs index 58bc17d..23a5a0a 100644 --- a/Stars Assistant/Model/StarsDatabase.cs +++ b/Stars Assistant/Model/StarsDatabase.cs @@ -18,6 +18,15 @@ public class StarsDatabase(string DbPath) : DbContext protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlite($"Data Source={DbPath}"); + /// + /// Configure the model, force it to use property accessors we define. + /// + /// model builder + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Property); + } + #endregion #region IStarsDatabase Implementation diff --git a/Stars Assistant/Services/GameEngine.cs b/Stars Assistant/Services/GameEngine.cs index cfb9e89..25db46f 100644 --- a/Stars Assistant/Services/GameEngine.cs +++ b/Stars Assistant/Services/GameEngine.cs @@ -40,25 +40,25 @@ public class GameEngine public static int PlanetPopGrowthForPlayer(int currentPop, int value) { int maxPop = MaxPopOnPlanetForPlayer(value); - int growth; + double growth; if (value < 0) { - growth = currentPop * value / 10; + growth = currentPop * value / 1000; } else { - double popRatio = currentPop / maxPop; + double popRatio = (double) currentPop / maxPop; if (popRatio <= 0.25) - growth = currentPop * value * Game.Player.GrowthRatePercent / 100; + growth = currentPop * value / 100.0 * Game.Player.GrowthRatePercent / 100.0; else if (popRatio <= 1) - growth = currentPop * value * Game.Player.GrowthRatePercent /100 * 16 / 9 * ((int) Math.Pow(1 - popRatio, 2)); + growth = currentPop * value / 100.0 * Game.Player.GrowthRatePercent / 100.0 * 16.0 / 9.0 * Math.Pow(1.0 - popRatio, 2); else - growth = (int) (currentPop * (popRatio - 1) * 0.04); + growth = currentPop * (popRatio - 1) * 0.04; } // round to nearest 100 - return growth / 100 * 100; + return ((int) growth) / 100 * 100; } /// diff --git a/Stars Assistant/ViewModels/BuColViewModel.cs b/Stars Assistant/ViewModels/BuColViewModel.cs index 75e6c84..e5c3177 100644 --- a/Stars Assistant/ViewModels/BuColViewModel.cs +++ b/Stars Assistant/ViewModels/BuColViewModel.cs @@ -21,5 +21,5 @@ public partial class BuColViewModel : ViewModelBase }); } - public ObservableCollection Planets { get; } = PlanetViewModel.LoadAll(); + public ObservableCollection Planets { get; } = PlanetViewModel.LoadAll(); } diff --git a/Stars Assistant/ViewModels/PlanetViewModel.cs b/Stars Assistant/ViewModels/PlanetViewModel.cs index cdd39b2..7d9fee9 100644 --- a/Stars Assistant/ViewModels/PlanetViewModel.cs +++ b/Stars Assistant/ViewModels/PlanetViewModel.cs @@ -9,6 +9,8 @@ namespace StarsAssistant.ViewModels; public partial class PlanetViewModel : ViewModelBase { + private readonly Planet Planet; + public PlanetViewModel(Planet planet) { Planet = planet; @@ -22,7 +24,6 @@ public partial class PlanetViewModel : ViewModelBase }); } - private readonly Planet Planet; public string Name => Planet.Name; @@ -42,13 +43,14 @@ public partial class PlanetViewModel : ViewModelBase // ### TESTING CODE ### - public static ObservableCollection LoadAll() + public static ObservableCollection LoadAll() { using var db = Locator.Current.GetService()!; - var result = new ObservableCollection(); + var result = new ObservableCollection(); foreach (Planet planet in db.Planet.Where(p => p.OwnerId == "Atlantis").ToList()) + // foreach (Planet planet in db.Planet.Where(p => p.Name == "Saddam").ToList()) { - var vm = new PlanetViewModel(planet); + var vm = new PlayerPlanetViewModel(planet); result.Add(vm); } return result; diff --git a/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs b/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs new file mode 100644 index 0000000..84fcf0d --- /dev/null +++ b/Stars Assistant/ViewModels/PlayerPlanetViewModel.cs @@ -0,0 +1,128 @@ +using System.Collections.ObjectModel; +using System.Reactive.Disposables; +using Microsoft.EntityFrameworkCore; +using ReactiveUI; +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; + + 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; + + #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); + + #endregion + +} \ No newline at end of file diff --git a/Stars Assistant/Views/BuColView.axaml b/Stars Assistant/Views/BuColView.axaml index 809c530..dec6780 100644 --- a/Stars Assistant/Views/BuColView.axaml +++ b/Stars Assistant/Views/BuColView.axaml @@ -16,7 +16,39 @@ BorderThickness="1" BorderBrush="Gray"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +