コード例 #1
0
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
            if (mTarget == null || mTarget.Health <= 0 || (mTarget is IDespawningUnit despawningUnit && despawningUnit.ForRemoval))
            {
                mTarget = null;
                return;
            }

            if (Vector2.Distance(mTarget.Position, mLastTargetPos) >= mAttackRange && mFollow)
            {
                mLastTargetPos = mTarget.Position;
                base.SetMovingTarget(mTarget.Position);
            }

            var canAttack = Vector2.Distance(mTarget.Position, Position) <= mAttackRange;

            if (mTarget is ABuilding building)
            {
                if (building.BlockedFields()
                    .Select(gridPosition => gridPosition.ToVector2() * GameScreen.GridSize)
                    .Any(position => Vector2.Distance(position, Position) - 2 * GameScreen.GridSize <= mAttackRange))
                {
                    canAttack = true;
                }
            }

            if (canAttack)
            {
                DealDamage();
            }
        }
コード例 #2
0
        public bool AttackUnitsAtPosition(Point entityGameFieldPosition)
        {
            IDamageableUnit damageableUnit = null;

            foreach (var key in UnitsByPlayer)
            {
                if (key.Key != Players.Global && key.Key != Players.Player)
                {
                    damageableUnit = GetDamageableUnitAtPosition(entityGameFieldPosition, key.Key);
                }
            }

            if (damageableUnit == null)
            {
                return(false);
            }
            var isTarget = false;

            foreach (var entity in SelectedEntities.OfType <IAttackingUnit>())
            {
                entity.SetTarget(damageableUnit, true);
                isTarget = true;
            }

            return(isTarget);
        }
コード例 #3
0
        public void SetTarget(IDamageableUnit target, bool follow)
        {
            if (target != null && follow)
            {
                mLastTargetPos = target.Position;
                base.SetMovingTarget(target.Position);
            }

            mTarget = target;
            mFollow = follow;
        }
コード例 #4
0
ファイル: DummyKi.cs プロジェクト: sopra02/KingsOfSacredStar
        private void AttackEnemyUnits(IEnumerable <IAttackingUnit> myUnits, IReadOnlyList <IDamageableUnit> enemyUnits)
        {
            foreach (var unit in myUnits)
            {
                // Bowmen only defend the base
                if (unit.UnitType == UnitTypes.Bowman)
                {
                    continue;
                }
                if (unit.HasTarget())
                {
                    continue;
                }
                var             tries      = 0;
                IDamageableUnit targetUnit = null;
                do
                {
                    if (tries <= 5)
                    {
                        if (tries == 0)
                        {
                            var unitsInRange =
                                GameState.Current.SpatialUnitsByPlayer.UnitsInRange(mEnemies.First(), unit.Position, 150);
                            if (unitsInRange.Count != 0)
                            {
                                targetUnit = (IDamageableUnit)unitsInRange[sRandom.Next((unitsInRange.Count - 1))];
                            }
                        }

                        if (tries > 0 || targetUnit == null)
                        {
                            targetUnit = enemyUnits[sRandom.Next(enemyUnits.Count)];
                        }
                    }
                    else
                    {
                        targetUnit = null;
                        break;
                    }

                    tries++;
                } while (Math.Abs(AttackModifiers.GetModifier(unit.UnitType, targetUnit.UnitType)) < float.Epsilon);

                if (targetUnit != null)
                {
                    unit.SetTarget(targetUnit, true);
                }
            }
        }
コード例 #5
0
        private void HoverSelectionMode(Vector2 gameFieldPosition)
        {
            var unit = GameState.Current.GetDamageableUnitAtPosition(gameFieldPosition.ToPoint(), Players.Player);

            if (unit != null)
            {
                unit.IsHit = true;
            }

            if (mLastSelectedUnit != null && mLastSelectedUnit != unit)
            {
                mLastSelectedUnit.IsHit = false;
            }

            mLastSelectedUnit = unit;
        }
コード例 #6
0
        private void DealDamage()
        {
            if (mDamageTimeout == 0)
            {
                var damage = mBaseDamage *
                             AttackModifiers.GetModifier(UnitType, mTarget.UnitType) *
                             GameState.Current.mDamageFactor[Owner];

                if (damage > 0)
                {
                    mTarget.Health = MathHelper.Clamp(mTarget.Health - (int)damage, 0, mTarget.MaxHealth);
                }
                mDamageTimeout++;
                mLastAttacked = mTarget;
            }
            else if (mDamageTimeout == mDamageInterval)
            {
                mDamageTimeout = 0;
            }
            else
            {
                mDamageTimeout++;
            }
        }
コード例 #7
0
 public override Task <bool> SetMovingTarget(Vector2?target)
 {
     mTarget = null;
     return(base.SetMovingTarget(target));
 }
コード例 #8
0
 public HitHelper(IDamageableUnit damageableUnit, int health)
 {
     mDamageableUnit = damageableUnit;
     mHealth         = health;
     mMaxHealth      = health;
 }