Finish Owner Relationship, update races and add first helpers for derived values. Update naming
This commit is contained in:
parent
15b252248a
commit
aff9d23841
@ -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.Owner = Owner;
|
dbPlanet.OwnerId = Owner != "" ? Owner : null;
|
||||||
dbPlanet.StarbaseType = StarbaseType;
|
dbPlanet.StarbaseType = StarbaseType;
|
||||||
dbPlanet.ReportAge = ReportAge;
|
dbPlanet.ReportAge = ReportAge;
|
||||||
dbPlanet.Population = Population;
|
dbPlanet.Population = Population;
|
||||||
|
@ -5,12 +5,14 @@ namespace StarsAssistant.Model;
|
|||||||
|
|
||||||
public class Planet
|
public class Planet
|
||||||
{
|
{
|
||||||
|
#region Persistant and derived propeties
|
||||||
|
|
||||||
public const int MinEffectiveValue = 5;
|
public const int MinEffectiveValue = 5;
|
||||||
|
|
||||||
[Key]
|
[Key]
|
||||||
public required string Name { get; set; }
|
public required string Name { get; set; }
|
||||||
|
|
||||||
public string? Owner { get; set; }
|
public string? OwnerId { get; set; }
|
||||||
|
|
||||||
public string? StarbaseType { get; set; }
|
public string? StarbaseType { get; set; }
|
||||||
|
|
||||||
@ -77,4 +79,41 @@ public class Planet
|
|||||||
public int? GateMass { get; set; }
|
public int? GateMass { get; set; }
|
||||||
|
|
||||||
public int? PctDamage { get; set; }
|
public int? PctDamage { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Relationships
|
||||||
|
|
||||||
|
public Race? Owner { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Derived Properties
|
||||||
|
|
||||||
|
public int EffectiveValue => (Value == null) ? 0 : Math.Max((int)Value, MinEffectiveValue);
|
||||||
|
|
||||||
|
public int MaxPopOnPlanet => Race.Player.MaxPopOnPlanet * EffectiveValue / 100;
|
||||||
|
|
||||||
|
public int PopGrowth(int currentPop, int maxPop, int value) {
|
||||||
|
// What to do with non player races?
|
||||||
|
if (OwnerId != Race.Player.Name) return 0;
|
||||||
|
|
||||||
|
double popRatio = currentPop / maxPop;
|
||||||
|
int growth = 0;
|
||||||
|
if (value < 0)
|
||||||
|
growth = currentPop * value / 10;
|
||||||
|
else if (popRatio <= 0.25)
|
||||||
|
growth = currentPop * value * (Race.Player.GrowthRatePercent ?? 0) / 100;
|
||||||
|
else if (popRatio <= 1)
|
||||||
|
growth = currentPop * value * (Race.Player.GrowthRatePercent ?? 0) /100 * 16 / 9 * ((int) Math.Pow(1 - popRatio, 2));
|
||||||
|
else
|
||||||
|
growth = (int) (currentPop * (popRatio - 1) * 0.04);
|
||||||
|
|
||||||
|
return growth / 100 * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int PopGrowth() => PopGrowth(Population ?? 0, MaxPopOnPlanet, Value ?? 0);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
@ -15,14 +15,18 @@ public enum PRT {
|
|||||||
|
|
||||||
public class Race
|
public class Race
|
||||||
{
|
{
|
||||||
|
#region Persistant and derived properties
|
||||||
|
|
||||||
[Key]
|
[Key]
|
||||||
public required string Name { get; set; }
|
public required string Name { get; set; }
|
||||||
|
|
||||||
public int ColonistsPerResource { get; set; }
|
public bool PlayerRace { get; set; } = false;
|
||||||
|
|
||||||
public int GrowthRatePercent { get; set; }
|
public int? ColonistsPerResource { get; set; }
|
||||||
|
|
||||||
private PRT _PRT;
|
public int? GrowthRatePercent { get; set; }
|
||||||
|
|
||||||
|
private PRT _PRT = PRT.Other;
|
||||||
public PRT PRT {
|
public PRT PRT {
|
||||||
get => _PRT;
|
get => _PRT;
|
||||||
set {
|
set {
|
||||||
@ -31,8 +35,8 @@ public class Race
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool _hasOBRM;
|
private bool? _hasOBRM;
|
||||||
public bool HasOBRM {
|
public bool? HasOBRM {
|
||||||
get => _hasOBRM;
|
get => _hasOBRM;
|
||||||
set {
|
set {
|
||||||
_hasOBRM = value;
|
_hasOBRM = value;
|
||||||
@ -49,29 +53,50 @@ public class Race
|
|||||||
[NotMapped]
|
[NotMapped]
|
||||||
public int MaxEffectivePopOnGreen { get; private set; }
|
public int MaxEffectivePopOnGreen { get; private set; }
|
||||||
|
|
||||||
private bool _factoryCost3;
|
private bool? _factoryCost3;
|
||||||
public bool FactoryCost3 {
|
public bool? FactoryCost3 {
|
||||||
get => _factoryCost3;
|
get => _factoryCost3;
|
||||||
set {
|
set {
|
||||||
_factoryCost3 = value;
|
_factoryCost3 = value;
|
||||||
FactoryGerCost = _factoryCost3 ? 3 : 4;
|
FactoryGerCost = (_factoryCost3 ?? false) ? 3 : 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public int FactoryGerCost { get; private set; }
|
public int FactoryGerCost { get; private set; }
|
||||||
|
|
||||||
public int FactoryNumberPer10k { get; set; }
|
public int? FactoryNumberPer10k { get; set; }
|
||||||
|
|
||||||
public int FactoryResCost { get; set; }
|
public int? FactoryResCost { get; set; }
|
||||||
|
|
||||||
public int FactoryResPer10 { get; set; }
|
public int? FactoryResPer10 { get; set; }
|
||||||
|
|
||||||
public int MineResCost { get; set; }
|
public int? MineResCost { get; set; }
|
||||||
|
|
||||||
public int MineNumberPer10k { get; set; }
|
public int? MineNumberPer10k { get; set; }
|
||||||
|
|
||||||
public int MineMineralsPer10 { get; set; }
|
public int? MineMineralsPer10 { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Relationships
|
||||||
|
|
||||||
|
public ICollection<Planet> Planets { get; } = new List<Planet>();
|
||||||
|
|
||||||
|
// TODO: Implement Lazy Loader, currently hardcoded in testing startup code
|
||||||
|
public static Race _player = null!;
|
||||||
|
public static Race Player {
|
||||||
|
get => _player;
|
||||||
|
set => _player = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Public Helpers
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Internal Helpers
|
||||||
|
|
||||||
private void UpdatePopDerivedValues() {
|
private void UpdatePopDerivedValues() {
|
||||||
const int basePop = 1_000_000;
|
const int basePop = 1_000_000;
|
||||||
@ -81,10 +106,11 @@ public class Race
|
|||||||
PRT.JOAT => 1.2,
|
PRT.JOAT => 1.2,
|
||||||
_ => 1,
|
_ => 1,
|
||||||
};
|
};
|
||||||
double obrmMod = HasOBRM ? 1.1 : 1.0;
|
double obrmMod = (HasOBRM ?? false) ? 1.1 : 1.0;
|
||||||
MaxPopOnPlanet = Convert.ToInt32(basePop * prtMod * obrmMod);
|
MaxPopOnPlanet = Convert.ToInt32(basePop * prtMod * obrmMod);
|
||||||
MaxEffectivePopOnRed = MaxPopOnPlanet * Planet.MinEffectiveValue / 100 * 3;
|
MaxEffectivePopOnRed = MaxPopOnPlanet * Planet.MinEffectiveValue / 100 * 3;
|
||||||
MaxEffectivePopOnGreen = MaxPopOnPlanet * 3;
|
MaxEffectivePopOnGreen = MaxPopOnPlanet * 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
@ -25,12 +25,12 @@ public class StarsDatabase(string DbPath) : DbContext
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// List of all Planets read.
|
/// List of all Planets read.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DbSet<Planet> Planets { get; set; }
|
public DbSet<Planet> Planet { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Lists of all defined races.
|
/// Lists of all defined races.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DbSet<Race> Races { get; set; }
|
public DbSet<Race> Race { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
@ -45,6 +45,7 @@ sealed class Program
|
|||||||
Race r = new()
|
Race r = new()
|
||||||
{
|
{
|
||||||
Name = "Atlantis",
|
Name = "Atlantis",
|
||||||
|
PlayerRace = true,
|
||||||
ColonistsPerResource = 1000,
|
ColonistsPerResource = 1000,
|
||||||
GrowthRatePercent = 19,
|
GrowthRatePercent = 19,
|
||||||
PRT = PRT.Other,
|
PRT = PRT.Other,
|
||||||
@ -58,6 +59,8 @@ sealed class Program
|
|||||||
MineNumberPer10k = 10
|
MineNumberPer10k = 10
|
||||||
};
|
};
|
||||||
db.Add(r);
|
db.Add(r);
|
||||||
|
db.SaveChanges();
|
||||||
|
Race.Player = r;
|
||||||
|
|
||||||
var config = CsvConfiguration.FromAttributes<Planet>(CultureInfo.InvariantCulture);
|
var config = CsvConfiguration.FromAttributes<Planet>(CultureInfo.InvariantCulture);
|
||||||
config.Delimiter = "\t";
|
config.Delimiter = "\t";
|
||||||
@ -68,7 +71,23 @@ sealed class Program
|
|||||||
using (var csv = new CsvReader(reader, config))
|
using (var csv = new CsvReader(reader, config))
|
||||||
{
|
{
|
||||||
List<CSV.Planet> records = csv.GetRecords<CSV.Planet>().ToList();
|
List<CSV.Planet> records = csv.GetRecords<CSV.Planet>().ToList();
|
||||||
foreach (CSV.Planet csvp in records)
|
var planetByPlayer = from csvp in records
|
||||||
|
group csvp by csvp.Owner into byOwners
|
||||||
|
select byOwners;
|
||||||
|
|
||||||
|
foreach (var owner in planetByPlayer)
|
||||||
|
{
|
||||||
|
if (owner.Key != "Atlantis")
|
||||||
|
{
|
||||||
|
r = new()
|
||||||
|
{
|
||||||
|
Name = owner.Key
|
||||||
|
};
|
||||||
|
db.Add(r);
|
||||||
|
db.SaveChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (CSV.Planet csvp in owner)
|
||||||
{
|
{
|
||||||
Planet p = new Planet{ Name = csvp.Name };
|
Planet p = new Planet{ Name = csvp.Name };
|
||||||
csvp.UpdateDbPlanet(p);
|
csvp.UpdateDbPlanet(p);
|
||||||
@ -76,7 +95,7 @@ sealed class Program
|
|||||||
}
|
}
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using StarsAssistant.Model;
|
using StarsAssistant.Model;
|
||||||
|
|
||||||
namespace StarsAssistant.ViewModels;
|
namespace StarsAssistant.ViewModels;
|
||||||
@ -8,7 +9,7 @@ public partial class PlanetViewModel(Planet planet) : ViewModelBase
|
|||||||
public static ObservableCollection<PlanetViewModel> LoadAll() {
|
public static ObservableCollection<PlanetViewModel> LoadAll() {
|
||||||
var context = new StarsDatabase("stars.sqlite");
|
var context = new StarsDatabase("stars.sqlite");
|
||||||
var result = new ObservableCollection<PlanetViewModel>();
|
var result = new ObservableCollection<PlanetViewModel>();
|
||||||
foreach (Planet planet in context.Planets.ToList())
|
foreach (Planet planet in context.Planet.Where(p => p.OwnerId == "Atlantis").ToList())
|
||||||
{
|
{
|
||||||
var vm = new PlanetViewModel(planet);
|
var vm = new PlanetViewModel(planet);
|
||||||
result.Add(vm);
|
result.Add(vm);
|
||||||
@ -20,7 +21,7 @@ public partial class PlanetViewModel(Planet planet) : ViewModelBase
|
|||||||
|
|
||||||
public string Name => planet.Name;
|
public string Name => planet.Name;
|
||||||
|
|
||||||
public string Owner => planet.Owner ?? String.Empty;
|
public string Owner => planet.OwnerId ?? String.Empty;
|
||||||
|
|
||||||
public int Value => planet.Value ?? 0;
|
public int Value => planet.Value ?? 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user