/// <summary>
        /// Creates a command to move your character on the playing field.
        /// </summary>
        public void MovePlayer(int x, int y)
        { //TODO: Übergabe der Richtung und Anzahl Schritte
            if (_isConnected)
            {
                if (_gameSession_ID != null && _currentStatus == Status.Busy)
                {
                    CommandGameMove command = new CommandGameMove(_client_ID, x, y);
                    SendCommandToServer(command);

                    CommandFeedback feedback = EvaluateFeedback();
                    if (feedback is CommandFeedbackOK)
                    {
                    }
                    else if (feedback is CommandFeedbackEndOfTurn)
                    {
                        Thread updateThread = new Thread(new ThreadStart(() => WaitForNextTurn()));
                        updateThread.Start();
                    }
                    else if (feedback is CommandFeedbackGameException)
                    {
                        throw ((CommandFeedbackGameException)feedback).GameException;
                    }
                    else
                    {
                        throw new CommandNotRecognizedException();
                    }
                }
            }
        }
        public void TrapTestSpikefield()
        {
            Level level8 = new Level(MAX_PLAYER);

            Hero    player30 = new Hero("hero", new Archer(), 11, 9);
            Monster player31 = new Monster("monster", new Knight(), 7, 7);
            Monster player32 = new Monster("monster", new Knight(), 18, 7);
            Monster player33 = new Monster("monster", new Knight(), 9, 7);

            Field field9 = new Field(12, 9, new SpikeField());

            level8.AddPlayerToLevel(player30);
            level8.AddPlayerToLevel(player31);
            level8.AddPlayerToLevel(player32);
            level8.AddPlayerToLevel(player33);
            level8.AddFieldToLevel(field9);

            CommandManager cm5 = new CommandManager();

            CommandGameMove cmove = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 12, 9);

            cmove.SourcePlayer = player30;
            cmove.Level        = level8;

            cm5.AddCommand(cmove);
            cm5.ProcessPendingTransactions();

            Assert.AreEqual(4, player30.Life);
        }
        public void TrapTestLaserbeam()
        {
            Level level9 = new Level(MAX_PLAYER);

            Hero    player34 = new Hero("hero", new Archer(), 11, 9);
            Monster player35 = new Monster("monster", new Knight(), 7, 7);
            Monster player36 = new Monster("monster", new Knight(), 18, 7);
            Monster player37 = new Monster("monster", new Knight(), 9, 7);

            Field field10 = new Field(12, 9, new LaserBeam(true));

            level9.AddPlayerToLevel(player34);
            level9.AddPlayerToLevel(player35);
            level9.AddPlayerToLevel(player36);
            level9.AddPlayerToLevel(player37);
            level9.AddFieldToLevel(field10);

            CommandManager cm6 = new CommandManager();

            CommandGameMove cmove13 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 12, 9);

            cmove13.SourcePlayer = player34;
            cmove13.Level        = level9;

            cm6.AddCommand(cmove13);
            cm6.ProcessPendingTransactions();

            Assert.AreEqual(3.5, player34.Life);
        }
        public void MonsterCantCollecteKey()
        {
            Level level11 = new Level(MAX_PLAYER);

            Monster player7 = new Monster("monster", new Archer(), 10, 10);
            Field   field22 = new Field(10, 11, new Floor());

            field22.Item = Key.GetInstance();
            level11.AddPlayerToLevel(player7);
            level11.AddFieldToLevel(field22);
            field22.Item.IsVisible = true;
            Assert.IsTrue(field22.Item.IsVisible);

            CommandGameMove cmove2 = new CommandGameMove("23156asd1a56sd", 10, 11);

            cmove2.SourcePlayer = player7;
            cmove2.Level        = level11;

            CommandManager cm3 = new CommandManager();

            cm3.AddCommand(cmove2);
            cm3.ProcessPendingTransactions();

            Assert.IsFalse(player7.HasKey);
            Assert.IsNotNull(field22.Item);
            Assert.IsTrue(field22.Item is Key);
        }
        public void ManualTrapdoorAttackAndTrapHidden()
        {
            Level level7 = new Level(MAX_PLAYER);

            Hero player2 = new Hero("hero", new Archer(), 11, 9);

            Field field2 = new Field(12, 9, new Trapdoor());
            Field field5 = new Field(11, 9, new Floor());

            level7.AddPlayerToLevel(player2);
            level7.AddFieldToLevel(field2);
            level7.AddFieldToLevel(field5);

            CommandManager cm7 = new CommandManager();

            CommandGameMove cmove7 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 12, 9);

            cmove7.SourcePlayer = player2;
            cmove7.Level        = level7;

            cm7.AddCommand(cmove7);

            cm7.ProcessPendingTransactions();

            Assert.AreEqual(4.25, player2.Life);
            Assert.AreEqual(11, player2.XPosition);
            Assert.AreEqual(9, player2.YPosition);
        }
        public void HeroCollecteKey()
        {
            Level level12 = new Level(MAX_PLAYER);

            Hero  player8 = new Hero("hero", new Archer(), 10, 10);
            Field field23 = new Field(10, 11, new Floor());

            field23.Item = Key.GetInstance();
            level12.AddPlayerToLevel(player8);
            level12.AddFieldToLevel(field23);
            field23.Item.IsVisible = true;
            Assert.IsTrue(field23.Item.IsVisible);

            CommandGameMove cmove3 = new CommandGameMove("23156asd1a56sd", 10, 11);

            cmove3.SourcePlayer = player8;
            cmove3.Level        = level12;

            CommandManager cm2 = new CommandManager();

            cm2.AddCommand(cmove3);
            cm2.ProcessPendingTransactions();

            Assert.IsTrue(player8.HasKey);
            Assert.IsNull(field23.Item);
        }
        public void MoveInRange()
        {
            Hero player12 = new Hero("hero", new Knight(), 16, 12);

            //move down
            CommandGameMove cmove7 = new CommandGameMove("54s56s45df66s", 16, 13);

            cmove7.SourcePlayer = player12;

            Assert.IsTrue(cmove7.VerifyMoveRange());

            //move up
            CommandGameMove cmove8 = new CommandGameMove("54s56s45df66s", 16, 11);

            cmove8.SourcePlayer = player12;

            Assert.IsTrue(cmove8.VerifyMoveRange());

            //move right
            CommandGameMove cmove9 = new CommandGameMove("54s56s45df66s", 17, 12);

            cmove9.SourcePlayer = player12;

            Assert.IsTrue(cmove9.VerifyMoveRange());

            //move left
            CommandGameMove cmove10 = new CommandGameMove("54s56s45df66s", 15, 12);

            cmove10.SourcePlayer = player12;

            Assert.IsTrue(cmove10.VerifyMoveRange());

            //move out of range
            CommandGameMove cmove11 = new CommandGameMove("54s56s45df66s", 16, 14);

            cmove11.SourcePlayer = player12;

            Assert.IsFalse(cmove11.VerifyMoveRange());

            //move out of range
            CommandGameMove cmove12 = new CommandGameMove("54s56s45df66s", 18, 12);

            cmove12.SourcePlayer = player12;

            Assert.IsFalse(cmove12.VerifyMoveRange());

            //move out of range
            CommandGameMove cmove13 = new CommandGameMove("54s56s45df66s", 18, 13);

            cmove13.SourcePlayer = player12;

            Assert.IsFalse(cmove13.VerifyMoveRange());
        }
        public void ItemOnTargetField()
        {   //need number of max. clients
            Level level6 = new Level(MAX_PLAYER);

            Monster player13 = new Monster("monster", new Archer(), 2, 3);
            Monster player14 = new Monster("monster", new Archer(), 3, 3);
            Monster player15 = new Monster("monster", new Archer(), 4, 3);

            Hero  player16 = new Hero("hero", new Knight(), 10, 10);
            Field field7   = new Field(10, 11, new Floor());
            Field field8   = new Field(10, 13, new Floor());
            Field field9   = new Field(10, 12, new Floor());

            field7.Item = new DefenseBoost(2);
            field9.Item = new AttackBoost(3);

            level6.AddPlayerToLevel(player13);
            level6.AddPlayerToLevel(player14);
            level6.AddPlayerToLevel(player15);
            level6.AddPlayerToLevel(player16);
            level6.AddFieldToLevel(field7);
            level6.AddFieldToLevel(field8);
            level6.AddFieldToLevel(field9);

            CommandGameMove cmove14 = new CommandGameMove("234hug2haa1248325sdf5", 10, 11);

            cmove14.SourcePlayer = player16;
            cmove14.Level        = level6;

            CommandManager cm3 = new CommandManager();

            cm3.AddCommand(cmove14);
            cm3.ProcessPendingTransactions();

            Assert.AreEqual(0.5, player16.DefenseBoost);
            Assert.AreEqual(null, field7.Item);
            Assert.AreEqual(null, field8.Item);

            CommandGameMove cmove16 = new CommandGameMove("234hug2haa1248325sdf5", 10, 12);

            cmove16.SourcePlayer = player16;
            cmove16.Level        = level6;

            cm3.AddCommand(cmove16);
            cm3.ProcessPendingTransactions();

            Assert.AreEqual(0.75, player16.AttackBoost);
            Assert.AreEqual(null, field9.Item);
        }
        public void TrapTargetField()
        {   //need number of max. clients
            Level level7 = new Level(MAX_PLAYER);

            Monster player8  = new Monster("monster", new Archer(), 2, 3);
            Monster player9  = new Monster("monster", new Archer(), 3, 3);
            Monster player10 = new Monster("monster", new Archer(), 4, 3);

            Hero  player11 = new Hero("hero", new Archer(), 10, 10);
            Field field5   = new Field(10, 11, new SpikeField());
            Field field6   = new Field(10, 12, new LaserBeam());

            level7.AddPlayerToLevel(player8);
            level7.AddPlayerToLevel(player9);
            level7.AddPlayerToLevel(player10);
            level7.AddPlayerToLevel(player11);
            level7.AddFieldToLevel(field5);
            level7.AddFieldToLevel(field6);

            field6.FieldType.OnNextRound();

            CommandGameMove cmove5 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 10, 11);

            cmove5.SourcePlayer = player11;
            cmove5.Level        = level7;

            CommandManager cm2 = new CommandManager();

            cm2.AddCommand(cmove5);
            cm2.ProcessPendingTransactions();

            Assert.AreEqual(4, player11.Life);

            CommandGameMove cmove6 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 10, 12);

            cmove6.SourcePlayer = player11;
            cmove6.Level        = level7;
            cm2.AddCommand(cmove6);
            cm2.ProcessPendingTransactions();

            Assert.AreEqual(2.5, player11.Life);
        }
        public void CantCollectInvisibleKey()
        {
            Level level10 = new Level(MAX_PLAYER);

            Hero  player6 = new Hero("hero", new Archer(), 10, 10);
            Field field21 = new Field(10, 11, new Floor());

            field21.Item = Key.GetInstance();
            level10.AddPlayerToLevel(player6);
            level10.AddFieldToLevel(field21);

            CommandGameMove cmove1 = new CommandGameMove("23156asd1a56sd", 10, 11);

            cmove1.SourcePlayer = player6;
            cmove1.Level        = level10;

            CommandManager cm1 = new CommandManager();

            cm1.AddCommand(cmove1);
            cm1.ProcessPendingTransactions();

            Assert.IsFalse(player6.HasKey);
        }
        public void AttackWithoutRemainingMoves()
        {   //need number of max. clients
            Level level1 = new Level(MAX_PLAYER);

            Hero    player3 = new Hero("hero", new Knight(), 10, 18);
            Monster player4 = new Monster("monster", new Archer(), 8, 14);
            Monster player5 = new Monster("monster", new Knight(), 13, 1);
            Monster player6 = new Monster("monster", new Archer(), 2, 2);
            Field   field1  = new Field(10, 17, new Floor());
            Field   field2  = new Field(9, 17, new SpikeField());
            Field   field3  = new Field(8, 17, new Floor());
            Field   field4  = new Field(8, 16, new Floor());
            Field   field5  = new Field(8, 15, new Floor());

            field3.Item = new AttackBoost(3);

            level1.AddPlayerToLevel(player3);
            level1.AddPlayerToLevel(player4);
            level1.AddPlayerToLevel(player5);
            level1.AddPlayerToLevel(player6);
            level1.AddFieldToLevel(field1);
            level1.AddFieldToLevel(field2);
            level1.AddFieldToLevel(field3);
            level1.AddFieldToLevel(field4);
            level1.AddFieldToLevel(field5);

            CommandManager cm1 = new CommandManager();

            //move to field (10, 17)
            CommandGameMove cmove1 = new CommandGameMove("adua5as7da5sd5", 10, 17);

            cmove1.SourcePlayer = player3;
            cmove1.Level        = level1;
            cm1.AddCommand(cmove1);
            cm1.ProcessPendingTransactions();

            //move to field with trap (9, 17)
            CommandGameMove cmove2 = new CommandGameMove("adua5as7da5sd5", 9, 17);

            cmove2.SourcePlayer = player3;
            cmove2.Level        = level1;
            cm1.AddCommand(cmove2);
            cm1.ProcessPendingTransactions();

            //move to field with item (8, 17)
            CommandGameMove cmove3 = new CommandGameMove("adua5as7da5sd5", 8, 17);

            cmove3.SourcePlayer = player3;
            cmove3.Level        = level1;
            cm1.AddCommand(cmove3);
            cm1.ProcessPendingTransactions();

            //move to field with item (8, 16)
            CommandGameMove cmove4 = new CommandGameMove("adua5as7da5sd5", 8, 16);

            cmove4.SourcePlayer = player3;
            cmove4.Level        = level1;
            cm1.AddCommand(cmove4);
            cm1.ProcessPendingTransactions();

            //move to field with item (8, 15)
            CommandGameMove cmove5 = new CommandGameMove("adua5as7da5sd5", 8, 15);

            cmove5.SourcePlayer = player3;
            cmove5.Level        = level1;
            cm1.AddCommand(cmove5);
            cm1.ProcessPendingTransactions();

            //attack monster (8, 14)
            CommandGameAttack cattack1 = new CommandGameAttack("adua5as7da5sd5", "6a6sd465a4s9");

            cattack1.SourcePlayer = player3;
            cattack1.TargetPlayer = player4;
            cattack1.Level        = level1;
            cm1.AddCommand(cattack1);
            cm1.ProcessPendingTransactions();
        }
        public void GameSzenario1()
        {   //need number of max. clients
            Level level1 = new Level(MAX_PLAYER);

            Hero    player3 = new Hero("hero", new Knight(), 10, 18);
            Monster player4 = new Monster("monster", new Archer(), 8, 16);
            Monster player5 = new Monster("monster", new Knight(), 13, 1);
            Monster player6 = new Monster("monster", new Archer(), 2, 2);
            Field   field1  = new Field(10, 17, new Floor());
            Field   field2  = new Field(9, 17, new SpikeField());
            Field   field3  = new Field(8, 17, new Floor());

            field3.Item = new AttackBoost(3);

            CommandManager cm1 = new CommandManager();

            level1.AddPlayerToLevel(player3);
            level1.AddPlayerToLevel(player4);
            level1.AddPlayerToLevel(player5);
            level1.AddPlayerToLevel(player6);
            level1.AddFieldToLevel(field1);
            level1.AddFieldToLevel(field2);
            level1.AddFieldToLevel(field3);

            //move to field (10, 17)
            CommandGameMove cmove1 = new CommandGameMove("adua5as7da5sd5", 10, 17);

            cmove1.SourcePlayer = player3;
            cmove1.Level        = level1;
            cm1.AddCommand(cmove1);
            cm1.ProcessPendingTransactions();

            Assert.AreEqual(4, player3.PlayerRemainingMoves);
            Assert.IsTrue(10 == player3.XPosition && 17 == player3.YPosition);


            //move to field with trap (9, 17)
            CommandGameMove cmove2 = new CommandGameMove("adua5as7da5sd5", 9, 17);

            cmove2.SourcePlayer = player3;
            cmove2.Level        = level1;
            cm1.AddCommand(cmove2);
            cm1.ProcessPendingTransactions();

            Assert.AreEqual(3, player3.PlayerRemainingMoves);
            Assert.IsTrue(9 == player3.XPosition && 17 == player3.YPosition);
            Assert.AreEqual(4.25, player3.Life);


            //move to field with item (8, 17)
            CommandGameMove cmove3 = new CommandGameMove("adua5as7da5sd5", 8, 17);

            cmove3.SourcePlayer = player3;
            cmove3.Level        = level1;
            cm1.AddCommand(cmove3);
            cm1.ProcessPendingTransactions();

            Assert.AreEqual(2, player3.PlayerRemainingMoves);
            Assert.IsTrue(8 == player3.XPosition && 17 == player3.YPosition);
            Assert.AreEqual(0.75, player3.AttackBoost);


            //attack monster (8, 16)
            CommandGameAttack cattack1 = new CommandGameAttack("adua5as7da5sd5", "6a6sd465a4s9");

            cattack1.SourcePlayer = player3;
            cattack1.TargetPlayer = player4;
            cattack1.Level        = level1;
            cm1.AddCommand(cattack1);
            cm1.ProcessPendingTransactions();

            Assert.AreEqual(0, player3.PlayerRemainingMoves);
            Assert.IsTrue(8 == player3.XPosition && 17 == player3.YPosition);
            Assert.IsTrue(8 == player4.XPosition && 16 == player4.YPosition);
            Assert.AreEqual(1.25, player4.Life);
        }
        public void InvalidTargetField()
        {
            Level level5 = new Level(MAX_PLAYER);

            //targetfield is equal current field
            Hero  player3 = new Hero("hero", new Knight(), 18, 18);
            Field field1  = new Field(18, 18, new Floor());

            level5.AddPlayerToLevel(player3);
            level5.AddFieldToLevel(field1);

            CommandGameMove cmove1 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 18, 18);

            cmove1.SourcePlayer = player3;
            cmove1.Level        = level5;

            Assert.IsTrue(cmove1.TargetFieldIsInvalid());


            //targetfield is a wall
            Hero  player4 = new Hero("hero", new Knight(), 8, 8);
            Field field2  = new Field(8, 9, new Wall());

            level5.AddPlayerToLevel(player4);
            level5.AddFieldToLevel(field2);

            CommandGameMove cmove2 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 8, 9);

            cmove2.SourcePlayer = player4;
            cmove2.Level        = level5;

            Assert.IsTrue(cmove2.TargetFieldIsInvalid());


            //targetfield is blocked by another player
            Hero    player5 = new Hero("hero", new Knight(), 2, 2);
            Monster player6 = new Monster("monster", new Archer(), 2, 3);
            Field   field3  = new Field(2, 3, new Floor());

            level5.AddPlayerToLevel(player5);
            level5.AddPlayerToLevel(player6);
            level5.AddFieldToLevel(field3);

            CommandGameMove cmove3 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 2, 3);

            cmove3.SourcePlayer = player5;
            cmove3.Level        = level5;

            Assert.IsTrue(cmove3.TargetFieldIsInvalid());


            //targetfield is valid
            Hero  player7 = new Hero("hero", new Knight(), 1, 1);
            Field field4  = new Field(1, 2, new Floor());

            level5.AddPlayerToLevel(player7);
            level5.AddFieldToLevel(field4);

            CommandGameMove cmove4 = new CommandGameMove("2f2de19a291c41b5ae950faa11162e07", 1, 2);

            cmove4.SourcePlayer = player7;
            cmove4.Level        = level5;

            Assert.IsFalse(cmove4.TargetFieldIsInvalid());

            CommandManager cm1 = new CommandManager();

            cm1.AddCommand(cmove4);
            cm1.ProcessPendingTransactions();

            Assert.AreEqual(4, player7.PlayerRemainingMoves);


            //targetfield is diagonal
            Hero  player8 = new Hero("hero", new Knight(), 5, 5);
            Field field5  = new Field(6, 6, new Floor());

            level5.AddPlayerToLevel(player8);
            level5.AddFieldToLevel(field5);

            CommandGameMove cmove5 = new CommandGameMove("5a45dsf5s4as5d4as8", 6, 6);

            cmove5.SourcePlayer = player8;
            cmove5.Level        = level5;

            Assert.IsFalse(cmove5.VerifyMoveRange());
        }
        public void SwappingItems()
        {//need number of max. clients
            Hero    player5 = new Hero("hero", new Knight(), 12, 1);
            Monster player6 = new Monster("monster", new Archer(), 2, 3);
            Monster player7 = new Monster("monster", new Archer(), 10, 11);
            Monster player8 = new Monster("monster", new Archer(), 11, 10);
            Field   field3  = new Field(12, 2, new Floor());
            Field   field4  = new Field(12, 3, new Floor());
            Field   field5  = new Field(12, 4, new Floor());

            field3.Item = new DefenseBoost(2);
            field4.Item = new DefenseBoost(3);
            field5.Item = new DefenseBoost(1);

            CommandGameMove cmove3 = new CommandGameMove("1jhb2h48325sdf5", 12, 2);

            cmove3.SourcePlayer = player5;

            Level level1 = new Level(MAX_PLAYER);

            level1.AddPlayerToLevel(player5);
            level1.AddPlayerToLevel(player6);
            level1.AddPlayerToLevel(player7);
            level1.AddPlayerToLevel(player8);
            level1.AddFieldToLevel(field3);
            level1.AddFieldToLevel(field4);
            level1.AddFieldToLevel(field5);

            cmove3.Level = level1;

            CommandManager cm2 = new CommandManager();

            cm2.AddCommand(cmove3);
            cm2.ProcessPendingTransactions();

            Assert.IsNotNull(player5.DefenseItem);
            Assert.AreEqual(0.5, player5.DefenseBoost);
            Assert.IsNull(field3.Item);

            CommandGameMove cmove4 = new CommandGameMove("1jhb2h48325sdf5", 12, 3);

            cmove4.SourcePlayer = player5;
            cmove4.Level        = level1;
            cm2.AddCommand(cmove4);
            cm2.ProcessPendingTransactions();

            Assert.IsNotNull(player5.DefenseItem);
            Assert.AreEqual(0.75, player5.DefenseBoost);
            Assert.IsNull(field4.Item);

            CommandGameMove cmove5 = new CommandGameMove("1jhb2h48325sdf5", 12, 4);

            cmove5.SourcePlayer = player5;
            cmove5.Level        = level1;
            cm2.AddCommand(cmove5);
            cm2.ProcessPendingTransactions();

            Assert.IsNotNull(player5.DefenseItem);
            Assert.AreEqual(0.75, player5.DefenseBoost);
            Assert.IsNotNull(field5.Item);
        }