using System.ComponentModel.DataAnnotations; using System; using System.ComponentModel.DataAnnotations.Schema; namespace StarsAssistant.Model; /// /// Primary Racial Trait, only PRTs with relevant rules are currently listed. /// 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; } }