using System.Collections.Generic;
public static void Main()
var rng = new Random(32492);
var targetings = new List<Targeting>();
for (var x = 0; x < 16; x++)
targetings.Add((Targeting)x);
Console.WriteLine("namespace Discord_MMO.Game_Objects.Monsters;");
foreach (var name in Names)
var targeting = rng.Pick(targetings);
var health = rng.Next(50, 151);
var damage = rng.Next(20, 61);
var attackSpeed = rng.Next(6, 12);
Console.WriteLine($@"public interface I{name} : IMonster");
Console.WriteLine( @"{");
Console.WriteLine($@" new IGameObjectId<I{name}> Id {{ get; }}");
Console.WriteLine($@" IGameObjectId<IMonster> IMonster.Id => Id;");
Console.WriteLine( @"}");
Console.WriteLine($@"record {name}(IGameObjectId<{name}> Id, BaseMaxHealth MaxHealth, CurrentHealth CurrentHealth, BaseAttackDamage Damage, BaseAttackSpeed AttackSpeed, Targeting Targeting, IGameObjectId<IHaveHealth>? Focus, ExperienceReward XPReward) :");
Console.WriteLine($@" I{name}");
Console.WriteLine( @"{");
Console.WriteLine($@" public {name}() : this");
Console.WriteLine($@" (");
Console.WriteLine($@" new GameObjectId<{name}>(),");
Console.WriteLine($@" {health},");
Console.WriteLine($@" 0,");
Console.WriteLine($@" {damage},");
Console.WriteLine($@" {attackSpeed},");
Console.WriteLine($@" Targeting.{targeting},");
Console.WriteLine($@" null,");
Console.WriteLine($@" 0");
Console.WriteLine($@" )");
Console.WriteLine( @" { }");
Console.WriteLine($@" public IMonster With(BaseMaxHealth? maxHealth, CurrentHealth? currentHealth, BaseAttackDamage? damage, BaseAttackSpeed? attackSpeed, Targeting? targeting, IGameObjectId<IHaveHealth>? focus, ExperienceReward? xpReward)");
Console.WriteLine( @" => this with { MaxHealth = maxHealth ?? MaxHealth, CurrentHealth = currentHealth ?? CurrentHealth, Damage = damage ?? Damage, AttackSpeed = attackSpeed ?? AttackSpeed, Targeting = targeting ?? Targeting, Focus = focus ?? Focus, XPReward = xpReward ?? XPReward };");
Console.WriteLine($@" public IMonster WithNewId() => this with {{ Id = new GameObjectId<{name}>() }};");
Console.WriteLine($@" public ICanAttack RemoveFocus() => this with {{ Focus = null }};");
Console.WriteLine($@" IGameObjectId<I{name}> I{name}.Id => Id;");
Console.WriteLine( @"}");
static List<string> Names { get; } = new()
HighestAgility, LowestAgility,
HighestIntelligence, LowestIntelligence,
HighestStrength, LowestStrength,
HighestMaxHP, LowestMaxHP,
HighestCurrentHP, LowestCurrentHP,
HighestDamage, LowestDamage,
HighestAttackSpeed, LowestAttackSpeed
public static T Pick<T>(this Random random, T[] items) =>
items[random.Next(items.Length)];
public static T Pick<T>(this Random random, IEnumerable<T> items) =>
random.Pick(items.ToArray());