Add Race Table with basic derived properties (incomplete yet)

This commit is contained in:
Torben Nehmer 2024-08-17 16:52:31 +02:00
parent 1d3765a769
commit 15b252248a
No known key found for this signature in database
4 changed files with 115 additions and 1 deletions

View File

@ -5,6 +5,8 @@ namespace StarsAssistant.Model;
public class Planet
{
public const int MinEffectiveValue = 5;
[Key]
public required string Name { get; set; }

View File

@ -0,0 +1,90 @@
using System.ComponentModel.DataAnnotations;
using System;
using System.ComponentModel.DataAnnotations.Schema;
namespace StarsAssistant.Model;
/// <summary>
/// Primary Racial Trait, only PRTs with relevant rules are currently listed.
/// </summary>
public enum PRT {
Other = 0,
HE = 1,
JOAT = 2
}
public class Race
{
[Key]
public required string Name { get; set; }
public int ColonistsPerResource { get; set; }
public int GrowthRatePercent { get; set; }
private PRT _PRT;
public PRT PRT {
get => _PRT;
set {
_PRT = value;
UpdatePopDerivedValues();
}
}
private bool _hasOBRM;
public bool HasOBRM {
get => _hasOBRM;
set {
_hasOBRM = value;
UpdatePopDerivedValues();
}
}
[NotMapped]
public int MaxPopOnPlanet { get; private set; } = 1_000_000;
[NotMapped]
public int MaxEffectivePopOnRed { get; private set; }
[NotMapped]
public int MaxEffectivePopOnGreen { get; private set; }
private bool _factoryCost3;
public bool FactoryCost3 {
get => _factoryCost3;
set {
_factoryCost3 = value;
FactoryGerCost = _factoryCost3 ? 3 : 4;
}
}
[NotMapped]
public int FactoryGerCost { get; private set; }
public int FactoryNumberPer10k { get; set; }
public int FactoryResCost { get; set; }
public int FactoryResPer10 { get; set; }
public int MineResCost { get; set; }
public int MineNumberPer10k { get; set; }
public int MineMineralsPer10 { get; set; }
private void UpdatePopDerivedValues() {
const int basePop = 1_000_000;
var prtMod = PRT switch
{
PRT.HE => 0.5,
PRT.JOAT => 1.2,
_ => 1,
};
double obrmMod = HasOBRM ? 1.1 : 1.0;
MaxPopOnPlanet = Convert.ToInt32(basePop * prtMod * obrmMod);
MaxEffectivePopOnRed = MaxPopOnPlanet * Planet.MinEffectiveValue / 100 * 3;
MaxEffectivePopOnGreen = MaxPopOnPlanet * 3;
}
}

View File

@ -27,5 +27,10 @@ public class StarsDatabase(string DbPath) : DbContext
/// </summary>
public DbSet<Planet> Planets { get; set; }
/// <summary>
/// Lists of all defined races.
/// </summary>
public DbSet<Race> Races { get; set; }
#endregion
}

View File

@ -18,7 +18,7 @@ sealed class Program
[STAThread]
public static void Main(string[] args)
{
// __createTestData();
__createTestData();
BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
@ -42,6 +42,23 @@ sealed class Program
// Note: This sample requires the database to be created before running.
Console.WriteLine($"Database path: {db.DbPath}.");
Race r = new()
{
Name = "Atlantis",
ColonistsPerResource = 1000,
GrowthRatePercent = 19,
PRT = PRT.Other,
HasOBRM = true,
FactoryCost3 = false,
FactoryNumberPer10k = 8,
FactoryResCost = 8,
FactoryResPer10 = 15,
MineResCost = 3,
MineMineralsPer10 = 10,
MineNumberPer10k = 10
};
db.Add(r);
var config = CsvConfiguration.FromAttributes<Planet>(CultureInfo.InvariantCulture);
config.Delimiter = "\t";
config.Escape = '\0';