public void BlockedWhenActiveCharacterTurn()
        {
            GameState state = Factory.DefaultGameState;

            state = state.UpdateCharacter(state.Party[0].WithCT(Time.ActionAmount));
            state = state.WithActivePlayerID(state.Party[0].ID);

            TestCharacterBehavior behavior = new TestCharacterBehavior();
            GameEngine            engine   = Factory.CreateGameEngine(state, behavior);

            Assert.False(engine.Process());

            Assert.Empty(behavior.CharactersActed);
            Assert.Equal(Time.ActionAmount, state.Party[0].CT);
            Assert.Equal(0, state.Enemies[0].CT);
        }
        public void DeadCharacters_DontTakeActionsOrCT()
        {
            Character[] party = { Factory.Player, Factory.Player.WithCurrentHealth(0) };
            GameState   state = new GameState(0, party, null, null, -1, "");

            TestCharacterBehavior behavior = new TestCharacterBehavior();

            GameEngine engine = Factory.CreateGameEngine(state, behavior);

            for (int i = 0; i < Time.ActionAmount; ++i)
            {
                engine.Process();
            }

            Assert.Single(behavior.CharactersActed);
            Assert.Equal(0, engine.CurrentState.Party[1].CT);
        }
        public void OtherCharactersTakeActions()
        {
            GameState state = Factory.DefaultGameState;

            state = state.UpdateCharacter(state.Enemies[0].WithCT(50));

            TestCharacterBehavior behavior = new TestCharacterBehavior();
            GameEngine            engine   = Factory.CreateGameEngine(state, behavior);

            for (int i = 0; i < 90; ++i)
            {
                Assert.True(engine.Process());
            }

            Assert.Single(behavior.CharactersActed);
            Assert.Contains(behavior.CharactersActed.ToList(), x => x.ID == engine.CurrentState.Enemies[0].ID);
        }
        public void ActivePlayerDoesNotTakeAutomatedAction_WhenCTsAreSynced()
        {
            Character [] party = { Factory.Player, Factory.Player };
            GameState    state = new GameState(0, party, null, null, party[0].ID, "");

            TestCharacterBehavior behavior = new TestCharacterBehavior();

            GameEngine engine = Factory.CreateGameEngine(state, behavior);

            for (int i = 0; i < Time.ActionAmount; ++i)
            {
                engine.Process();
            }

            Assert.Single(behavior.CharactersActed);
            Assert.True(engine.BlockedOnActive);
        }
        public void CharacterBehavior_ReturnsSkill_GivenToSkillEngine()
        {
            GameState state = Factory.DefaultGameState;

            state = state.UpdateCharacter(state.Party[0].WithCT(99));

            Skill skill = Factory.TestSkill;

            TestCharacterBehavior characterBehavior = new TestCharacterBehavior();

            characterBehavior.SkillToReturn = new TargettedSkill(skill, TargettingInfo.Self(state.Party[0]));

            TestSkillEngine skillEngine = new TestSkillEngine();
            GameEngine      engine      = Factory.CreateGameEngine(state, characterBehavior, skillEngine);

            Skill skillReportedUsed = null;

            engine.SkillUsed += (o, s) => skillReportedUsed = s.Skill;
            engine.Process();

            Assert.Single(skillEngine.SkillsUsed);
            Assert.Contains(skillEngine.SkillsUsed, x => x.ID == skill.ID);
            Assert.Equal(skillReportedUsed, skillEngine.SkillsUsed.First());
        }