Пример #1
0
        public void CalcDot()
        {
            GConfig.D.EffectTicksMilliseconds = 1000;
            var el   = DemoEffectModel();
            var dMob = new MobData {
                Hp = 21
            };

            StatusCalculator.CalculateDot(dMob, el, 290, i =>
            {
                Assert.True(false, "Shouldnt trigger killCallback 1");
            });

            Assert.Equal(21, dMob.Hp);
            Assert.Equal(590, el[1].TimeSinceLastTick);

            el   = DemoEffectModel();
            dMob = new MobData {
                Hp = 21
            };
            el[1].TimeSinceLastTick = 1001;
            StatusCalculator.CalculateDot(dMob, el, 701, i =>
            {
                Assert.True(false, "Shouldnt trigger killCallback 2");
            });
            Assert.Equal(1, dMob.Hp);
            Assert.Equal(0, el[1].TimeSinceLastTick);

            var killtrigger = false;

            el = DemoEffectModel();
            el[1].TimeSinceLastTick = 1001;
            dMob = new MobData {
                Hp = 20
            };
            StatusCalculator.CalculateDot(dMob, el, 10101, i =>
            {
                Assert.Equal(2, i);
                killtrigger = true;
            });
            Assert.True(killtrigger);
            Assert.Equal(0, dMob.Hp);
            Assert.Equal(0, el[1].TimeSinceLastTick);
        }
        public void Update(double delta)
        {
            if (IsDead || IsOnGoal)
            {
                WaitBeforeRemoved -= delta;
                if (WaitBeforeRemoved <= 0)
                {
                    RemoveMob();
                }
                return;
            }
            StatusEffect = StatusCalculator.GetCleardEffectList(StatusEffect);
            StatusCalculator.CalculateLeftTime(StatusEffect, delta);
            StatusCalculator.CalculateHot(MobData, StatusEffect, delta);
            StatusCalculator.CalculateDot(MobData, StatusEffect, delta, towerInstanceId =>
            {
                Killed(_session.GameTower.SingleOrDefault(x => x.InstanceId == towerInstanceId));
            });
            if (IsTowerCollision(delta))
            {
                return;
            }
            var transformedSpeed = (float)StatusCalculator.GetSpeedValueByStatus(MobData, StatusEffect);

            if (CurrentGoal.X > TilePosX)
            {
                TilePosX += transformedSpeed / GConfig.D.GameSimulationTime * (float)delta;
            }
            if (CurrentGoal.X < TilePosX)
            {
                TilePosX -= transformedSpeed / GConfig.D.GameSimulationTime * (float)delta;
            }
            if (CurrentGoal.Y > TilePosY)
            {
                TilePosY += transformedSpeed / GConfig.D.GameSimulationTime * (float)delta;
            }
            if (CurrentGoal.Y < TilePosY)
            {
                TilePosY -= transformedSpeed / GConfig.D.GameSimulationTime * (float)delta;
            }
            if (!IsMobNearPoint(this))
            {
                return;
            }

            X = CurrentGoal.X;
            Y = CurrentGoal.Y;
            CurrentPathPos++;
            if (Path == null)
            {
                return;
            }
            if (CurrentPathPos >= Path.Count)
            {
                if (VisitedWayPoint)
                {
                    ReachGoal();
                }
                else
                {
                    VisitedWayPoint = true;
                    UpdatePath();
                }
                return;
            }

            CurrentGoal = Path[CurrentPathPos];
        }