Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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^");
        }
Esempio n. 8
0
        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);
        }