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
{
#region Persistant and derived properties
[Key]
public required string Name { get; set; }
public bool PlayerRace { get; set; } = false;
public int? ColonistsPerResource { get; set; }
public int? GrowthRatePercent { get; set; }
private PRT _PRT = PRT.Other;
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 ?? false) ? 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; }
#endregion
#region Relationships
public ICollection Planets { get; } = new List();
// 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() {
const int basePop = 1_000_000;
var prtMod = PRT switch
{
PRT.HE => 0.5,
PRT.JOAT => 1.2,
_ => 1,
};
double obrmMod = (HasOBRM ?? false) ? 1.1 : 1.0;
MaxPopOnPlanet = Convert.ToInt32(basePop * prtMod * obrmMod);
MaxEffectivePopOnRed = MaxPopOnPlanet * Planet.MinEffectiveValue / 100 * 3;
MaxEffectivePopOnGreen = MaxPopOnPlanet * 3;
}
#endregion
}