public void GameConfiguration_CheckConstructors()
        {
            GameConfiguration gc = new GameConfiguration();
            Assert.AreEqual(100, gc.PlayingFieldWidth);
            Assert.AreEqual(100, gc.PlayingFieldHeight);

            Assert.AreEqual(10, gc.BrilliantStudentRegistrationMin);
            Assert.AreEqual(20, gc.BrilliantStudentRegistrationMax);

            Assert.AreEqual(100.0F, gc.BrilliantStudentInitialStrength);
            Assert.AreEqual(0.25F, gc.BrilliantStudentBaseSpeed);
            Assert.AreEqual(1.5F, gc.BrilliantStudentSidewalkSpeedMultiplier);
            Assert.AreEqual(2.0F, gc.BrilliantStudentDeathToZombieDelay);

            Assert.AreEqual(10, gc.ExcuseGeneratorRegistrationMin);
            Assert.AreEqual(20, gc.ExcuseGeneratorRegistrationMax);
            Assert.AreEqual(100.0F, gc.ExcuseGeneratorInitialStrength);
            Assert.AreEqual(3, gc.NumberOfTicksRequiredToBuildAnExcuse);

            Assert.AreEqual(10, gc.WhiningSpinnerRegistrationMin);
            Assert.AreEqual(20, gc.WhiningSpinnerRegistrationMax);
            Assert.AreEqual(100.0F, gc.WhiningSpinnerInitialStrength);
            Assert.AreEqual(3, gc.NumberOfTicksRequiredToBuildTwine);

            Assert.AreEqual(25, gc.ZombieInitialStrengthMin);
            Assert.AreEqual(75, gc.ZombieInitialStrengthMax);
            Assert.AreEqual(0.15F, gc.ZombieInitialSpeedMax);
            Assert.AreEqual(0.5F, gc.ZombieInitialSpeedMin);
            Assert.AreEqual(1.5F, gc.ZombieSidewalkSpeedMultiplier);
            Assert.AreEqual(1.0F, gc.ZombieCreationRate);
            Assert.AreEqual(0.2F, gc.ZombieCreationAcceleration);
            Assert.AreEqual(2.0F, gc.ZombieEatingRate);
            Assert.AreEqual(10.0F, gc.ZombieStrengthIncreaseForEatingStudent);
            Assert.AreEqual(5.0F, gc.ZombieStrengthIncreaseForExcuseGenerator);
            Assert.AreEqual(5.0F, gc.ZombieStrengthIncreaseForWhiningSpinner);
            Assert.AreEqual(1.0F, gc.MinEatingDistance);
            Assert.AreEqual(5.0F, gc.MaxEatingDistance);

            Assert.AreEqual(0, gc.RefereeRegistrationMin);
            Assert.AreEqual(2, gc.RefereeRegistrationMax);

            Assert.AreEqual(2, gc.BombExcuseDamage);
            Assert.AreEqual(2.0F, gc.BombTwinePerSquareOfDistance);
            Assert.AreEqual(.75F, gc.BombDamageDiffusionFactor);

            Assert.AreEqual(120, gc.TickLifetime);
            Assert.AreEqual(1.0F, gc.TicksToStrengthRatio);
        }
        public GameConfiguration(GameConfiguration orig)
        {
            PlayingFieldWidth = orig.PlayingFieldWidth;
            PlayingFieldHeight = orig.PlayingFieldHeight;

            BrilliantStudentRegistrationMin = orig.BrilliantStudentRegistrationMin;
            BrilliantStudentRegistrationMax = orig.BrilliantStudentRegistrationMax;
            BrilliantStudentInitialStrength = orig.BrilliantStudentInitialStrength;
            BrilliantStudentBaseSpeed = orig.BrilliantStudentBaseSpeed;
            BrilliantStudentSidewalkSpeedMultiplier = orig.BrilliantStudentSidewalkSpeedMultiplier;
            BrilliantStudentDeathToZombieDelay = orig.BrilliantStudentDeathToZombieDelay;

            ExcuseGeneratorRegistrationMin = orig.ExcuseGeneratorRegistrationMin;
            ExcuseGeneratorRegistrationMax = orig.ExcuseGeneratorRegistrationMax;
            ExcuseGeneratorInitialStrength = orig.ExcuseGeneratorInitialStrength;
            NumberOfTicksRequiredToBuildAnExcuse = orig.NumberOfTicksRequiredToBuildAnExcuse;

            WhiningSpinnerRegistrationMin = orig.WhiningSpinnerRegistrationMin;
            WhiningSpinnerRegistrationMax = orig.WhiningSpinnerRegistrationMax;
            WhiningSpinnerInitialStrength = orig.WhiningSpinnerInitialStrength;
            NumberOfTicksRequiredToBuildTwine = orig.NumberOfTicksRequiredToBuildTwine;

            ZombieInitialStrengthMin = orig.ZombieInitialStrengthMin;
            ZombieInitialStrengthMax = orig.ZombieInitialStrengthMax;
            ZombieInitialSpeedMax = orig.ZombieInitialSpeedMax;
            ZombieInitialSpeedMin = orig.ZombieInitialSpeedMin;
            ZombieSidewalkSpeedMultiplier = orig.ZombieSidewalkSpeedMultiplier;
            ZombieCreationRate = orig.ZombieCreationRate;
            ZombieCreationAcceleration = orig.ZombieCreationAcceleration;
            ZombieEatingRate = orig.ZombieEatingRate;
            ZombieStrengthIncreaseForEatingStudent = orig.ZombieStrengthIncreaseForEatingStudent;
            ZombieStrengthIncreaseForExcuseGenerator = orig.ZombieStrengthIncreaseForExcuseGenerator;
            ZombieStrengthIncreaseForWhiningSpinner = orig.ZombieStrengthIncreaseForWhiningSpinner;
            MinEatingDistance = orig.MinEatingDistance;
            MaxEatingDistance = orig.MaxEatingDistance;

            RefereeRegistrationMin = orig.RefereeRegistrationMin;
            RefereeRegistrationMax = orig.RefereeRegistrationMax;

            BombExcuseDamage = orig.BombExcuseDamage;
            BombTwinePerSquareOfDistance = orig.BombTwinePerSquareOfDistance;
            BombDamageDiffusionFactor = orig.BombDamageDiffusionFactor;

            TickInterval = orig.TickInterval;
            TickLifetime = orig.TickLifetime;
            TicksToStrengthRatio = orig.TicksToStrengthRatio;
        }
        public void GameConfiguration_CheckEncodeAndDecode()
        {
            GameConfiguration gc1 = new GameConfiguration();

            gc1.PlayingFieldWidth = 50;
            gc1.PlayingFieldHeight = 51;

            gc1.BrilliantStudentRegistrationMin = 10;
            gc1.BrilliantStudentRegistrationMax = 11;

            gc1.BrilliantStudentInitialStrength = 2.1F;
            gc1.BrilliantStudentBaseSpeed = 2.2F;
            gc1.BrilliantStudentSidewalkSpeedMultiplier = 2.3F;
            gc1.BrilliantStudentDeathToZombieDelay = 2.4F;

            gc1.ExcuseGeneratorRegistrationMin = 12;
            gc1.ExcuseGeneratorRegistrationMax = 13;
            gc1.ExcuseGeneratorInitialStrength = 2.5F;
            gc1.NumberOfTicksRequiredToBuildTwine = 3;

            gc1.WhiningSpinnerRegistrationMin = 14;
            gc1.WhiningSpinnerRegistrationMax = 15;
            gc1.WhiningSpinnerInitialStrength = 2.8F;
            gc1.NumberOfTicksRequiredToBuildTwine = 2;

            gc1.ZombieInitialStrengthMin = 16;
            gc1.ZombieInitialStrengthMax = 17;
            gc1.ZombieInitialSpeedMax = 3.1F;
            gc1.ZombieInitialSpeedMin = 3.2F;
            gc1.ZombieSidewalkSpeedMultiplier = 3.3F;
            gc1.ZombieCreationRate = 3.4F;
            gc1.ZombieCreationAcceleration = 3.5F;
            gc1.ZombieEatingRate = 3.6F;
            gc1.ZombieStrengthIncreaseForEatingStudent = 3.7F;
            gc1.ZombieStrengthIncreaseForExcuseGenerator = 3.8F;
            gc1.ZombieStrengthIncreaseForWhiningSpinner = 3.9F;
            gc1.MaxEatingDistance = 0.5F;
            gc1.MaxEatingDistance = 4.5F;

            gc1.RefereeRegistrationMin = 22;
            gc1.RefereeRegistrationMax = 23;

            gc1.BombExcuseDamage = 18;
            gc1.BombTwinePerSquareOfDistance = 4.0F;
            gc1.BombDamageDiffusionFactor = 4.1F;

            gc1.TickLifetime = 19;
            gc1.TicksToStrengthRatio = 4.2F;

            ByteList bytes = new ByteList();
            gc1.Encode(bytes);
            GameConfiguration gc2 = GameConfiguration.Create(bytes);
            Assert.AreEqual(gc1.PlayingFieldWidth, gc2.PlayingFieldWidth);
            Assert.AreEqual(gc1.PlayingFieldHeight, gc2.PlayingFieldHeight);

            Assert.AreEqual(gc1.BrilliantStudentRegistrationMin, gc2.BrilliantStudentRegistrationMin);
            Assert.AreEqual(gc1.BrilliantStudentRegistrationMax, gc2.BrilliantStudentRegistrationMax);

            Assert.AreEqual(gc1.BrilliantStudentInitialStrength, gc2.BrilliantStudentInitialStrength);
            Assert.AreEqual(gc1.BrilliantStudentBaseSpeed, gc2.BrilliantStudentBaseSpeed);
            Assert.AreEqual(gc1.BrilliantStudentSidewalkSpeedMultiplier, gc2.BrilliantStudentSidewalkSpeedMultiplier);
            Assert.AreEqual(gc1.BrilliantStudentDeathToZombieDelay, gc2.BrilliantStudentDeathToZombieDelay);

            Assert.AreEqual(gc1.ExcuseGeneratorRegistrationMin, gc2.ExcuseGeneratorRegistrationMin);
            Assert.AreEqual(gc1.ExcuseGeneratorRegistrationMax, gc2.ExcuseGeneratorRegistrationMax);
            Assert.AreEqual(gc1.ExcuseGeneratorInitialStrength, gc2.ExcuseGeneratorInitialStrength);
            Assert.AreEqual(gc1.NumberOfTicksRequiredToBuildAnExcuse, gc2.NumberOfTicksRequiredToBuildAnExcuse);

            Assert.AreEqual(gc1.WhiningSpinnerRegistrationMin, gc2.WhiningSpinnerRegistrationMin);
            Assert.AreEqual(gc1.WhiningSpinnerRegistrationMax, gc2.WhiningSpinnerRegistrationMax);
            Assert.AreEqual(gc1.WhiningSpinnerInitialStrength, gc2.WhiningSpinnerInitialStrength);
            Assert.AreEqual(gc1.NumberOfTicksRequiredToBuildTwine, gc2.NumberOfTicksRequiredToBuildTwine);

            Assert.AreEqual(gc1.ZombieInitialStrengthMin, gc2.ZombieInitialStrengthMin);
            Assert.AreEqual(gc1.ZombieInitialStrengthMax, gc2.ZombieInitialStrengthMax);
            Assert.AreEqual(gc1.ZombieInitialSpeedMax, gc2.ZombieInitialSpeedMax);
            Assert.AreEqual(gc1.ZombieInitialSpeedMin, gc2.ZombieInitialSpeedMin);
            Assert.AreEqual(gc1.ZombieSidewalkSpeedMultiplier, gc2.ZombieSidewalkSpeedMultiplier);
            Assert.AreEqual(gc1.ZombieCreationRate, gc2.ZombieCreationRate);
            Assert.AreEqual(gc1.ZombieCreationAcceleration, gc2.ZombieCreationAcceleration);
            Assert.AreEqual(gc1.ZombieEatingRate, gc2.ZombieEatingRate);
            Assert.AreEqual(gc1.ZombieStrengthIncreaseForEatingStudent, gc2.ZombieStrengthIncreaseForEatingStudent);
            Assert.AreEqual(gc1.ZombieStrengthIncreaseForExcuseGenerator, gc2.ZombieStrengthIncreaseForExcuseGenerator);
            Assert.AreEqual(gc1.ZombieStrengthIncreaseForWhiningSpinner, gc2.ZombieStrengthIncreaseForWhiningSpinner);
            Assert.AreEqual(gc1.MinEatingDistance, gc2.MinEatingDistance);
            Assert.AreEqual(gc1.MaxEatingDistance, gc2.MaxEatingDistance);

            Assert.AreEqual(gc1.RefereeRegistrationMin, gc2.RefereeRegistrationMin);
            Assert.AreEqual(gc1.RefereeRegistrationMax, gc2.RefereeRegistrationMax);

            Assert.AreEqual(gc1.BombExcuseDamage, gc2.BombExcuseDamage);
            Assert.AreEqual(gc1.BombTwinePerSquareOfDistance, gc2.BombTwinePerSquareOfDistance);
            Assert.AreEqual(gc1.BombDamageDiffusionFactor, gc2.BombDamageDiffusionFactor);

            Assert.AreEqual(gc1.TickLifetime, gc2.TickLifetime);
            Assert.AreEqual(gc1.TicksToStrengthRatio, gc2.TicksToStrengthRatio);

            bytes.Clear();
            gc1.Encode(bytes);
            bytes.GetByte();            // Read one byte, which will throw the length off
            try
            {
                gc2 = GameConfiguration.Create(bytes);
                Assert.Fail("Expected an exception to be thrown");
            }
            catch (ApplicationException)
            {
            }

            bytes.Clear();
            gc1.Encode(bytes);
            bytes.Add((byte)100);       // Add a byte
            bytes.GetByte();            // Read one byte, which will make the ID wrong
            try
            {
                gc2 = GameConfiguration.Create(bytes);
                Assert.Fail("Expected an exception to be thrown");
            }
            catch (ApplicationException)
            {
            }
        }
        public void GameConfiguration_CheckProperties()
        {
            GameConfiguration gc = new GameConfiguration();

            gc.PlayingFieldWidth=100;
            Assert.AreEqual(100, gc.PlayingFieldWidth);
            gc.PlayingFieldHeight=101;
            Assert.AreEqual(101, gc.PlayingFieldHeight);

            gc.BrilliantStudentRegistrationMin=10;
            Assert.AreEqual(10, gc.BrilliantStudentRegistrationMin);
            gc.BrilliantStudentRegistrationMax = 11;
            Assert.AreEqual(11, gc.BrilliantStudentRegistrationMax);

            gc.BrilliantStudentInitialStrength=2.1F;
            Assert.AreEqual(2.1F, gc.BrilliantStudentInitialStrength);
            gc.BrilliantStudentBaseSpeed = 2.2F;
            Assert.AreEqual(2.2F, gc.BrilliantStudentBaseSpeed);
            gc.BrilliantStudentSidewalkSpeedMultiplier = 2.3F;
            Assert.AreEqual(2.3F, gc.BrilliantStudentSidewalkSpeedMultiplier);
            gc.BrilliantStudentDeathToZombieDelay = 2.4F;
            Assert.AreEqual(2.4F, gc.BrilliantStudentDeathToZombieDelay);

            gc.ExcuseGeneratorRegistrationMin = 12;
            Assert.AreEqual(12, gc.ExcuseGeneratorRegistrationMin);
            gc.ExcuseGeneratorRegistrationMax = 13;
            Assert.AreEqual(13, gc.ExcuseGeneratorRegistrationMax);
            gc.ExcuseGeneratorInitialStrength = 2.5F;
            Assert.AreEqual(2.5F, gc.ExcuseGeneratorInitialStrength);
            gc.NumberOfTicksRequiredToBuildAnExcuse = 6;
            Assert.AreEqual(6, gc.NumberOfTicksRequiredToBuildAnExcuse);

            gc.WhiningSpinnerRegistrationMin = 14;
            Assert.AreEqual(14, gc.WhiningSpinnerRegistrationMin);
            gc.WhiningSpinnerRegistrationMax = 15;
            Assert.AreEqual(15, gc.WhiningSpinnerRegistrationMax);
            gc.WhiningSpinnerInitialStrength = 2.8F;
            Assert.AreEqual(2.8F, gc.WhiningSpinnerInitialStrength);
            gc.NumberOfTicksRequiredToBuildTwine = 5;
            Assert.AreEqual(5, gc.NumberOfTicksRequiredToBuildTwine);

            gc.ZombieInitialStrengthMin=16;
            Assert.AreEqual(16, gc.ZombieInitialStrengthMin);
            gc.ZombieInitialStrengthMax = 17;
            Assert.AreEqual(17, gc.ZombieInitialStrengthMax);
            gc.ZombieInitialSpeedMax = 3.1F;
            Assert.AreEqual(3.1F, gc.ZombieInitialSpeedMax);
            gc.ZombieInitialSpeedMin = 3.2F;
            Assert.AreEqual(3.2F, gc.ZombieInitialSpeedMin);
            gc.ZombieSidewalkSpeedMultiplier=3.3F;
            Assert.AreEqual(3.3F, gc.ZombieSidewalkSpeedMultiplier);
            gc.ZombieCreationRate = 3.4F;
            Assert.AreEqual(3.4F, gc.ZombieCreationRate);
            gc.ZombieCreationAcceleration = 3.5F;
            Assert.AreEqual(3.5F, gc.ZombieCreationAcceleration);
            gc.ZombieEatingRate = 3.6F;
            Assert.AreEqual(3.6F, gc.ZombieEatingRate);
            gc.ZombieStrengthIncreaseForEatingStudent = 3.7F;
            Assert.AreEqual(3.7F, gc.ZombieStrengthIncreaseForEatingStudent);
            gc.ZombieStrengthIncreaseForExcuseGenerator = 3.8F;
            Assert.AreEqual(3.8F, gc.ZombieStrengthIncreaseForExcuseGenerator);
            gc.ZombieStrengthIncreaseForWhiningSpinner = 3.9F;
            Assert.AreEqual(3.9F, gc.ZombieStrengthIncreaseForWhiningSpinner);
            gc.MinEatingDistance = 2.0F;
            Assert.AreEqual(2.0F, gc.MinEatingDistance);
            gc.MaxEatingDistance = 10.0F;
            Assert.AreEqual(10.0F, gc.MaxEatingDistance);

            gc.RefereeRegistrationMin = 24;
            Assert.AreEqual(24, gc.RefereeRegistrationMin);
            gc.RefereeRegistrationMax = 25;
            Assert.AreEqual(25, gc.RefereeRegistrationMax);

            gc.BombExcuseDamage=18;
            Assert.AreEqual(18, gc.BombExcuseDamage);
            gc.BombTwinePerSquareOfDistance = 4.0F;
            Assert.AreEqual(4.0F, gc.BombTwinePerSquareOfDistance);
            gc.BombDamageDiffusionFactor = 4.1F;
            Assert.AreEqual(4.1F, gc.BombDamageDiffusionFactor);

            gc.TickLifetime=19;
            Assert.AreEqual(19, gc.TickLifetime);
            gc.TicksToStrengthRatio = 4.2F;
            Assert.AreEqual(4.2F, gc.TicksToStrengthRatio);
        }
 /// <summary>
 /// Factor method to create a FieldLocation from a byte list
 /// </summary>
 /// <param name="bytes">A byte list from which the distributable object will be decoded</param>
 /// <returns>A new object of this class</returns>
 public static new GameConfiguration Create(ByteList bytes)
 {
     GameConfiguration result = new GameConfiguration();
     result.Decode(bytes);
     return result;
 }
 /// <summary>
 /// Constructor used by all specializations, which in turn are used by
 /// senders of a message 
 /// </summary>
 /// <param name="conversationId">conversation id</param>
 /// <param name="status">Status of the ack/nak</status>
 /// <param name="note">error message or note</note>
 public ConfigurationReply(PossibleStatus status, GameConfiguration config, string note = null)
     : base(Reply.PossibleTypes.ConfigurationReply, status, note)
 {
     Configuration = config;
 }