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">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+