protected override void OnNextMove()
        {
            base.OnNextMove();

            Vector2 dir = CurrentDirection;

            if (dir.Length() < 0.1f)
            {
                dir = Vector2.Zero;
            }
            else
            {
                // choose one direction randomly, if diagonals would be required
                if (dir.X != 0f && dir.Y != 0f)
                {
                    float r = RandomMath.RandomUnit();
                    if (r > 0.5f)
                    {
                        dir.X = 0f;
                    }
                    else
                    {
                        dir.Y = 0f;
                    }
                }
                dir.Normalize();
            }
            TargetMove = dir;
        }
Ejemplo n.º 2
0
 public void LeadAttack()
 {
     if (SimTime < 280 && SimTime > 21.6)
     {
         ShowAttackDirectionString();
     }
     if (SimTime > 45 && RandomMath.RandomUnit() < 0.4)
     {
         Level.Current.Sound.PlayAttackSignal();
     }
     foreach (Knight c in Knights)
     {
         c.Attacking.TriggerAttack();
     }
 }
Ejemplo n.º 3
0
        protected override void  OnNextMove()
        {
            base.OnNextMove();

            // compute direction towards chase-target
            Vector2 dif = ChaseTarget.Position - ParentThing.Target;

            // choose one direction randomly, if diagonals would be required
            if (dif.X != 0f && dif.Y != 0f)
            {
                float r = RandomMath.RandomUnit();
                if (r > 0.5f)
                {
                    dif.X = 0f;
                }
                else
                {
                    dif.Y = 0f;
                }
            }
            dif.Normalize();
            TargetMove = dif;
        }
        protected override void OnNextMove()
        {
            base.OnNextMove();

            Vector2 dir = CurrentDirection;

            if (dir.Length() < 0.1f)
            {
                dir = Vector2.Zero;
            }
            else
            {
                // choose one direction randomly, if diagonals would be required
                if (dir.X != 0f && dir.Y != 0f)
                {
                    float r = RandomMath.RandomUnit();
                    if (r > 0.5f)
                    {
                        dir.X = 0f;
                    }
                    else
                    {
                        dir.Y = 0f;
                    }
                }
                dir.Normalize();
            }
            TargetMove = dir;

            // direction changing
            if (timeSinceLastChange >= dirChangeTime)
            {
                timeSinceLastChange = 0f;
                dirChangeTime       = RandomMath.RandomBetween(MinDirectionChangeTime, MaxDirectionChangeTime);
                CurrentDirection    = RandomMath.RandomDirection();
            }
        }
Ejemplo n.º 5
0
        protected override void OnNextMove()
        {
            base.OnNextMove();

            // check for enemy facing
            List <Thing> facing = ParentThing.DetectCollisions(ParentThing.FacingDirection);

            WasCombat = IsCombat;
            IsCombat  = false;
            float randomVal = RandomMath.RandomUnit();

            foreach (Thing t in facing)
            {
                if (t.GetType() == EnemyType && t.Health > 0 && !t.IsStealthy)
                {
                    IsCombat            = true;
                    IsTargetMoveDefined = true;
                    TargetMove          = Vector2.Zero;
                    if (!WasCombat || randomVal < 0.08f)
                    {
                        var damage = RandomMath.RandomBetween(MinDamage, MaxDamage);
                        HurtBehavior.Apply(t, damage, MaxDamage);
                        t.Health -= damage;
                    }
                    break; // only attack one thing at a time
                }
            }

            if (IsCombat)
            {
                if (!WasCombat || randomVal < 0.08f)
                {
                    var dist = (ParentThing.Position - Level.Current.hero.Position).Length();
                    Level.Current.Sound.PlayRandomCombatSound(0.2f, 0.3f, dist);
                }
            }
        }
Ejemplo n.º 6
0
        protected override void OnUpdate(ref TTengine.Core.UpdateParams p)
        {
            base.OnUpdate(ref p);

            // check for trigger key to see whether still used
            if (!IsTriggered)
            {
                StopUsing();
            }

            // if used, spray pixel paint
            if (IsUsed)
            {
                Vector2 usePos = ParentThing.Position;
                Color   bgCol  = bg.SamplePixel(usePos);

                if (bgCol.Equals(bg.ForegroundColor))
                {
                    Color paintColor = new Color(RandomMath.RandomUnit(), RandomMath.RandomUnit(), RandomMath.RandomUnit());
                    bg.SetPixel(usePos, paintColor);
                    UsesLeft--;
                }
            }
        }
Ejemplo n.º 7
0
        protected override void OnNextMove()
        {
            base.OnNextMove();

            // compute direction towards chase-target
            Vector2 dif = ChaseTarget.Position - ParentThing.Target;

            if (Avoidance)
            {
                dif = -dif;
            }
            if (dif.Length() == 0f)
            {
                return;
            }

            Vector2 difX = new Vector2(dif.X, 0f);
            Vector2 difY = new Vector2(0f, dif.Y);

            if (difX.Length() > 0f)
            {
                difX.Normalize();
            }
            if (difY.Length() > 0f)
            {
                difY.Normalize();
            }

            // whats-free
            bool isBlockedX     = (difX.X != 0f) && ParentThing.ChecksCollisions && ParentThing.CollidesWithBackground(difX);
            bool isBlockedY     = (difY.Y != 0f) && ParentThing.ChecksCollisions && ParentThing.CollidesWithBackground(difY);
            bool isFullyBlocked = (isBlockedX && (dif.Y == 0f)) ||
                                  (isBlockedY && (dif.X == 0f)) ||
                                  (isBlockedX && isBlockedY);
            bool isDiagonal = (dif.X != 0f) && (dif.Y != 0f);

            // choose one direction 1) based on whats free, then 2) semi-randomly, if diagonals would be required
            isPauseChase = false;
            if (isFullyBlocked)
            {
                dif = new Vector2(difY.Y, difX.X); // try a swap to get around obstacle
            }
            else if (isBlockedX)                   // choose Y move if x is blocked
            {
                dif = difY;
            }
            else if (isBlockedY)    // choose X move if y is blocked
            {
                dif = difX;
            }
            else if (isDiagonal)   // choose random x/y if a diagonal move would be required
            {
                float r     = RandomMath.RandomUnit();
                float thres = 0.5f;
                if (r > thres)
                {
                    dif = difX;
                }
                else
                {
                    dif = difY;
                }
            }
            else
            {
                dif.Normalize();
            }

            TargetMove = dif;
        }