public RedGuard(Thing chaseTarget) : base("pixie") { IsCollisionFree = false; DrawInfo.DrawColor = new Color(255, 10, 4); Health = 13f; ComplexBehavior = new SubsumptionBehavior(); Add(ComplexBehavior); Combat = new CombatBehavior(typeof(Knight)); ComplexBehavior.Add(Combat); // chase knights that are very close ChasingComp = new ChaseBehavior(typeof(Knight), true); ChasingComp.MoveSpeed = RandomMath.RandomBetween(0.43f, 0.65f); ChasingComp.ChaseRange = 2f; // RandomMath.RandomBetween(12f, 40f); ComplexBehavior.Add(ChasingComp); // chase hero Chasing = new ChaseBehavior(chaseTarget); Chasing.MoveSpeed = RandomMath.RandomBetween(0.47f, 0.75f); Chasing.ChaseRange = 14f; // RandomMath.RandomBetween(12f, 40f); ComplexBehavior.Add(Chasing); Turning = new AlwaysTurnRightBehavior(); // patrolling Turning.MoveSpeed = Chasing.MoveSpeed; //RandomMath.RandomBetween(0.57f, 1.05f); Turning.MoveSpeed = 0.7f; ComplexBehavior.Add(Turning); Wandering = new RandomWanderBehavior(2.7f, 11.3f); Wandering.MoveSpeed = 0.7f; ComplexBehavior.Add(Wandering); }
public Companion() : base("pixie") { IsCollisionFree = false; SetColors(4f, new Color(38, 30, 240), new Color(150, 150, 255)); Pushing.Force = RandomMath.RandomBetween(1f, 1.5f); SubsumptionBehavior sub = new SubsumptionBehavior(); Add(sub); Combat = new CombatBehavior(typeof(RedGuard)); sub.Add(Combat); ChasingHero = new ChaseBehavior(Level.Current.pixie); ChasingHero.ChaseRange = 370f; ChasingHero.SatisfiedRange = 6f; ChasingHero.MoveDeltaTime = RandomMath.RandomBetween(1.2f, 1.5f); sub.Add(ChasingHero); ChasingRedGuard = new ChaseBehavior(typeof(RedGuard)); ChasingRedGuard.ChaseRange = 20f; ChasingRedGuard.MoveDeltaTime = RandomMath.RandomBetween(1.1f, 1.5f); sub.Add(ChasingRedGuard); Attacking = new AttackBehavior(Level.Current.pixie); Attacking.AttackDuration = RandomMath.RandomBetween(1.5f, 2.8f); sub.Add(Attacking); Wandering = new RandomWanderBehavior(2.7f, 11.3f); Wandering.MoveDeltaTime = RandomMath.RandomBetween(0.09f, 0.25f); sub.Add(Wandering); }
public void Test_VeryLongRun() { List <Character> characters = new List <Character>(); characters.Add( builder.WithBasicStats("helga", (long)1.0E6, 1).Build() ); List <Character> enemies = new List <Character>(); enemies.Add( builder.WithBasicStats("hugo", (long)5.0E5, 4).Build() ); SimulationResult result = Engine.Simulate( characters, enemies, true, CombatBehavior.Default(), CombatBehavior.Random() ); Assert.False(result.PartyVictorious); Assert.True(someoneIsAlive(result.Enemies)); Assert.False(someoneIsAlive(result.Party)); }
public void Test_RunWithSimpleCharacters() { List <Character> characters = new List <Character>(); characters.Add( builder.WithBasicStats("helga", 100, 7).Build() ); List <Character> enemies = new List <Character>(); enemies.Add( builder.WithBasicStats("hugo", 50, 20).Build() ); SimulationResult result = Engine.Simulate( characters, enemies, true, CombatBehavior.Default(), CombatBehavior.Random() ); Assert.False(result.PartyVictorious); Assert.True(someoneIsAlive(result.Enemies)); Assert.False(someoneIsAlive(result.Party)); }
public Knight() : base("pixie") { IsCollisionFree = false; SetColors(4f, new Color(28, 20, 230), new Color(76, 76, 255)); Health = 13f; Pushing.Force = RandomMath.RandomBetween(1f, 1.5f); ComplexBehavior = new SubsumptionBehavior(); ComplexBehavior.Active = false; // initially, knight stays near square table. Add(ComplexBehavior); Combat = new CombatBehavior(typeof(RedGuard)); ComplexBehavior.Add(Combat); ChasingHero = new ChaseBehavior(Level.Current.hero); ChasingHero.ChaseRange = 20f; ChasingHero.SatisfiedRange = 8f; ChasingHero.MoveSpeed = RandomMath.RandomBetween(1.54f, 1.87f); ComplexBehavior.Add(ChasingHero); var tb = new PathFindToTargetBehavior() { ChaseTarget = Level.Current.hero, ChaseRange = 970f, SatisfiedRange = ChasingHero.ChaseRange - 2f }; ComplexBehavior.Add(tb); ChasingRedGuard = new ChaseBehavior(typeof(RedGuard), true); ChasingRedGuard.ChaseRange = 20f; ChasingRedGuard.MoveSpeed = RandomMath.RandomBetween(1.1f, 1.5f); ComplexBehavior.Add(ChasingRedGuard); Attacking = new AttackBehavior(Level.Current.hero); Attacking.AttackDuration = RandomMath.RandomBetween(1.9f, 2.95f); ComplexBehavior.Add(Attacking); Wandering = new RandomWanderBehavior(15.7f, 23.3f); Wandering.MoveSpeed = RandomMath.RandomBetween(0.001f, 0.02f); ComplexBehavior.Add(Wandering); }
public void Test_RunEmpty() { // Here, a rather worrying misfeature of C# is obvious. // In order to access the classes in a test project, they need to be public. So you'd need to nest // solutions and/or projects in order to a) stick to information hiding principle and b) have // testable classes. 😠 List <Character> characters = new List <Character>(); List <Character> enemies = new List <Character>(); SimulationResult result = Engine.Simulate( characters, enemies, true, CombatBehavior.Default(), CombatBehavior.Random() ); Assert.Equal(0, result.Rounds); Assert.Empty(result.EventLog); }
static void Main(string[] args) { Console.WriteLine("Hi there! Welcome to the dungeon explorer."); Console.WriteLine("Let's get to know our party!"); List <Character> characters = QueryPartyMembers(); Console.WriteLine("Now let's talk about the enemies our party faces."); List <Character> enemies = QueryEnemies(); Console.WriteLine("====== OVERVIEW ======"); Console.WriteLine("====== THE PARTY ======"); foreach (Character character in characters) { Console.WriteLine(character.ToString()); } Console.WriteLine("-----------------------"); Console.WriteLine("====== THE ENEMIES ======"); foreach (Character enemy in enemies) { Console.WriteLine(enemy.ToString()); } Console.WriteLine("-----------------------"); Console.WriteLine("Processing..."); SimulationResult result = Engine.Simulate( characters, enemies, true, CombatBehavior.Default(), CombatBehavior.Random() ); Console.WriteLine(""); Console.WriteLine("Simulation Complete!"); Console.WriteLine("====== RESULTS ======="); Console.WriteLine(result.ToString()); Console.WriteLine("kthxbye ^u^"); }
public static void Do() { List <Entity> enemies = World.All(e => !e.My && !e.Mineral); List <Entity> turrets = World.All(e => e.My && e.Type == EntityType.Turret); List <Entity> army = World.All(e => e.My && (e.Type == EntityType.RangedUnit || e.Type == EntityType.MeleeUnit)); CombatBehavior.Combat(turrets, enemies); RangedMeleeDistanceBehavior.Apply(army); CombatBehavior.Combat(army, enemies); DefenceBehavior.Defence(army, enemies); GuardBehavior.Guard(army); RushBehavior.Rush(army, enemies); ExpansionBehavior.Expansion(army); // Base // 1. try build BB {if not exists} // 2. try build RB {if not exists} or build RANGED // 3. try build MB {if not exists} or build MELEE {p=0.2} // 4. try build HOUSE {if max population reached} // 5. try build BUILDER {if count <= 20} // 6. try build BUILDER {if count <= optBuilders and [BB, RB, MB] exists} List <Entity> builders = World.All(e => e.My && e.Type == EntityType.BuilderUnit); List <Entity> builderBases = World.All(u => u.My && u.Type == EntityType.BuilderBase); //List<Entity> meleeBases = World.All(u => u.My && u.Type == EntityType.MeleeBase); List <Entity> rangedBases = World.All(u => u.My && u.Type == EntityType.RangedBase); if (builderBases.Count == 0) { BuildBehavior.Build(builders, EntityType.BuilderBase); } if (rangedBases.Count == 0) { BuildBehavior.Build(builders, EntityType.RangedBase); } // if (meleeBases.Count == 0) // { // BuildBehavior.Build(builders, EntityType.MeleeBase); // } if (World.Population + World.PopulationUse + 5 >= World.MaxPopulation + World.PopulationProvide) { BuildBehavior.Build(builders, EntityType.House); } int builderLimit = World .All(e => e.Mineral) .Sum(e => e.Health) / (5 * World.Info[EntityType.BuilderUnit].Cost); int optBuildersCount = Math.Min(60, builderLimit); bool baseReady = builderBases.Count > 0 && rangedBases.Count > 0; //&& meleeBases.Count > 0; if (builders.Count <= 20 || (baseReady && builders.Count <= optBuildersCount)) { ProduceBehavior.Produce(builderBases); } if (World.All(e => e.My && e.Type == EntityType.Turret).Count <= 8 && World.All(e => e.My && e.Type == EntityType.RangedUnit).Count >= 5) { BuildBehavior.Build(builders, EntityType.Turret); } ProduceBehavior.Produce(rangedBases); //ProduceBehavior.Produce(meleeBases, 0.3); CowardBehavior.Coward(builders); RepairBehavior.Repair(builders); MineBehavior.Mine(builders); }