Implement BuCol
This commit is contained in:
		| @@ -10,7 +10,7 @@ public class Planet | |||||||
|     public required string Name { get; set; } |     public required string Name { get; set; } | ||||||
|  |  | ||||||
|     [Index(1)] |     [Index(1)] | ||||||
|     public string? Owner { get; set; } |     public string Owner { get; set; } = String.Empty; | ||||||
|      |      | ||||||
|     [Index(2)] |     [Index(2)] | ||||||
|     public string StarbaseType { get; set; } = String.Empty; |     public string StarbaseType { get; set; } = String.Empty; | ||||||
| @@ -240,7 +240,7 @@ public class Planet | |||||||
|         if (dbPlanet.Name != Name) |         if (dbPlanet.Name != Name) | ||||||
|             throw new InvalidOperationException($"DB Planet Name {dbPlanet.Name} does not macth the CSV Planet 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.StarbaseType = StarbaseType; | ||||||
|         dbPlanet.ReportAge = ReportAge; |         dbPlanet.ReportAge = ReportAge; | ||||||
|         dbPlanet.Population = Population; |         dbPlanet.Population = Population; | ||||||
|   | |||||||
| @@ -5,12 +5,12 @@ namespace StarsAssistant.Model; | |||||||
|  |  | ||||||
| public class Planet | public class Planet | ||||||
| { | { | ||||||
|     #region Persistant and derived propeties |     #region Persistant propeties | ||||||
|  |  | ||||||
|     [Key] |     [Key] | ||||||
|     public required string Name { get; set; } |     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; |     public string StarbaseType { get; set; } = String.Empty; | ||||||
|      |      | ||||||
| @@ -70,7 +70,7 @@ public class Planet | |||||||
|      |      | ||||||
|     public int? DriverWarp { get; set; } |     public int? DriverWarp { get; set; } | ||||||
|      |      | ||||||
|     public string? RouteTarget { get; set; } |     public string RouteTarget { get; set; } = String.Empty; | ||||||
|      |      | ||||||
|     public int? GateRange { get; set; } |     public int? GateRange { get; set; } | ||||||
|      |      | ||||||
| @@ -86,22 +86,4 @@ public class Planet | |||||||
|  |  | ||||||
|     #endregion |     #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 |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -18,6 +18,15 @@ public class StarsDatabase(string DbPath) : DbContext | |||||||
|     protected override void OnConfiguring(DbContextOptionsBuilder options) |     protected override void OnConfiguring(DbContextOptionsBuilder options) | ||||||
|         => options.UseSqlite($"Data Source={DbPath}"); |         => options.UseSqlite($"Data Source={DbPath}"); | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// Configure the model, force it to use property accessors we define. | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="modelBuilder">model builder</param> | ||||||
|  |     protected override void OnModelCreating(ModelBuilder modelBuilder) | ||||||
|  |     { | ||||||
|  |         modelBuilder.UsePropertyAccessMode(PropertyAccessMode.Property); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     #endregion |     #endregion | ||||||
|  |  | ||||||
|     #region IStarsDatabase Implementation |     #region IStarsDatabase Implementation | ||||||
|   | |||||||
| @@ -40,25 +40,25 @@ public class GameEngine | |||||||
|     public static int PlanetPopGrowthForPlayer(int currentPop, int value)  |     public static int PlanetPopGrowthForPlayer(int currentPop, int value)  | ||||||
|     { |     { | ||||||
|         int maxPop = MaxPopOnPlanetForPlayer(value); |         int maxPop = MaxPopOnPlanetForPlayer(value); | ||||||
|         int growth; |         double growth; | ||||||
|  |  | ||||||
|         if (value < 0) |         if (value < 0) | ||||||
|         { |         { | ||||||
|             growth = currentPop * value / 10; |             growth = currentPop * value / 1000; | ||||||
|         }  |         }  | ||||||
|         else  |         else  | ||||||
|         { |         { | ||||||
|             double popRatio = currentPop / maxPop; |             double popRatio = (double) currentPop / maxPop; | ||||||
|             if (popRatio <= 0.25) |             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) |             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 |             else | ||||||
|                  growth = (int) (currentPop * (popRatio - 1) * 0.04); |                 growth = currentPop * (popRatio - 1) * 0.04; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // round to nearest 100 |         // round to nearest 100 | ||||||
|         return growth / 100 * 100; |         return ((int) growth) / 100 * 100; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|   | |||||||
| @@ -21,5 +21,5 @@ public partial class BuColViewModel : ViewModelBase | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ObservableCollection<PlanetViewModel> Planets { get; } = PlanetViewModel.LoadAll(); |     public ObservableCollection<PlayerPlanetViewModel> Planets { get; } = PlanetViewModel.LoadAll(); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -9,6 +9,8 @@ namespace StarsAssistant.ViewModels; | |||||||
|  |  | ||||||
| public partial class PlanetViewModel : ViewModelBase | public partial class PlanetViewModel : ViewModelBase | ||||||
| { | { | ||||||
|  |     private readonly Planet Planet; | ||||||
|  |  | ||||||
|     public PlanetViewModel(Planet planet) |     public PlanetViewModel(Planet planet) | ||||||
|     { |     { | ||||||
|         Planet = planet; |         Planet = planet; | ||||||
| @@ -22,7 +24,6 @@ public partial class PlanetViewModel : ViewModelBase | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private readonly Planet Planet; |  | ||||||
|  |  | ||||||
|     public string Name => Planet.Name; |     public string Name => Planet.Name; | ||||||
|  |  | ||||||
| @@ -42,13 +43,14 @@ public partial class PlanetViewModel : ViewModelBase | |||||||
|  |  | ||||||
|     // ### TESTING CODE ### |     // ### TESTING CODE ### | ||||||
|  |  | ||||||
|     public static ObservableCollection<PlanetViewModel> LoadAll()  |     public static ObservableCollection<PlayerPlanetViewModel> LoadAll()  | ||||||
|     { |     { | ||||||
|         using var db = Locator.Current.GetService<StarsDatabase>()!; |         using var db = Locator.Current.GetService<StarsDatabase>()!; | ||||||
|         var result = new ObservableCollection<PlanetViewModel>(); |         var result = new ObservableCollection<PlayerPlanetViewModel>(); | ||||||
|         foreach (Planet planet in db.Planet.Where(p => p.OwnerId == "Atlantis").ToList()) |         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); |             result.Add(vm); | ||||||
|         } |         } | ||||||
|         return result; |         return result; | ||||||
|   | |||||||
							
								
								
									
										128
									
								
								Stars Assistant/ViewModels/PlayerPlanetViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								Stars Assistant/ViewModels/PlayerPlanetViewModel.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -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<Game>()!; | ||||||
|  |  | ||||||
|  |         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 | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -16,7 +16,39 @@ | |||||||
|     BorderThickness="1" BorderBrush="Gray"> |     BorderThickness="1" BorderBrush="Gray"> | ||||||
|     <DataGrid.Columns> |     <DataGrid.Columns> | ||||||
|         <DataGridTextColumn Header="Planet" Binding="{Binding Name}" /> |         <DataGridTextColumn Header="Planet" Binding="{Binding Name}" /> | ||||||
|  |         <!-- Class --> | ||||||
|  |         <!-- Info --> | ||||||
|  |         <DataGridTextColumn Header="Pop" Binding="{Binding Population}" /> | ||||||
|  |         <!-- Pop To Ship --> | ||||||
|  |         <DataGridTextColumn Header="Growth" Binding="{Binding PopulationGrowth}" /> | ||||||
|  |         <!-- Pop en route --> | ||||||
|  |         <!-- Pop Target % --> | ||||||
|  |         <DataGridTextColumn Header="Pop%" Binding="{Binding CapacityPercent}" /> | ||||||
|  |         <!-- Terra Delta assumed --> | ||||||
|         <DataGridTextColumn Header="Value" Binding="{Binding Value}" /> |         <DataGridTextColumn Header="Value" Binding="{Binding Value}" /> | ||||||
|  |         <!-- Effective Value including Terra Delta --> | ||||||
|  |         <DataGridTextColumn Header="Max Val" Binding="{Binding MaxTerraforming}" /> | ||||||
|  |         <!-- Cargo Cap T1 --> | ||||||
|  |         <!-- Cargo Cap T0 --> | ||||||
|  |         <!-- Iro MRE including Shipping --> | ||||||
|  |         <!-- Iro Avl including MRE --> | ||||||
|  |         <!-- Iro Shipping including MRE --> | ||||||
|  |         <!-- Bor MRE including Shipping --> | ||||||
|  |         <!-- Bor Avl including MRE --> | ||||||
|  |         <!-- Bor Shipping including MRE --> | ||||||
|  |         <!-- Ger MRE including Shipping --> | ||||||
|  |         <!-- Ger Avl including MRE --> | ||||||
|  |         <!-- Bor Shipping including MRE --> | ||||||
|  |         <!-- Shipbuilding Columns --> | ||||||
|  |         <!-- Factories remaining to pop target --> | ||||||
|  |         <!-- Factories Germanium Delta for target --> | ||||||
|  |         <!-- Factory production per turn --> | ||||||
|  |         <!-- Mines remaining to pop target --> | ||||||
|  |         <DataGridTextColumn Header="Mines" Binding="{Binding Mines}" /> | ||||||
|  |         <DataGridTextColumn Header="Fact" Binding="{Binding Factories}" /> | ||||||
|  |         <DataGridTextColumn Header="Res" Binding="{Binding Resources}" /> | ||||||
|  |         <!-- Overcrowding Rate --> | ||||||
|  |         <!-- Target population absolute --> | ||||||
|     </DataGrid.Columns> |     </DataGrid.Columns> | ||||||
|   </DataGrid> |   </DataGrid> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user