Exemplo n.º 1
0
 public List <ICollider> GetAdjecentUnits(Vector2 position)
 {
     return(mUnitMap.GetAdjacentUnits(position));
 }
Exemplo n.º 2
0
        public void Update(GameTime gametime)
        {
            mUnitMap?.Update(gametime);

            #region Check targets for friendly units

            foreach (var unit in mFriendlyMilitary)
            {
                // iterate through each friendly unit, if there's a target nearby, shoot the closest one.
                // get all the adjacent units
                var adjacentUnits = mUnitMap?.GetAdjacentUnits(unit.AbsolutePosition);

                // remember the closest adjacent unit.
                ICollider closestAdjacent         = null;
                var       closestAdjacentDistance =
                    1500f; // a separate variable is used so that it can be initalized with a very big value.

                if (adjacentUnits == null)
                {
                    continue;
                }
                // iterate through all adjacent units to find the closest adjacent unit.
                foreach (var adjacentUnit in adjacentUnits)
                {
                    // only calculate the distance to the adjacent unit if the unit is not friendly.
                    if (!adjacentUnit.Friendly)
                    {
                        // calculate the distance
                        var dist = Geometry.GetQuickDistance(unit.AbsolutePosition, adjacentUnit.AbsolutePosition);
                        // check if it's within range
                        if (dist < unit.Range)
                        {
                            // if yes, check if it's closer than the previous closest
                            if (dist < closestAdjacentDistance)
                            {
                                closestAdjacentDistance = dist;
                                closestAdjacent         = adjacentUnit;
                            }
                        }
                    }
                }

                // if there is something close enough, shoot it. Else, set the target to null.
                if (closestAdjacent != null)
                {
                    unit.SetShootingTarget(closestAdjacent);
                }
                else
                {
                    unit.SetShootingTarget(null);
                }
            }

            #endregion

            #region Check targets for friendly turrets

            foreach (var turret in mFriendlyDefensePlatforms)
            {
                // iterate through each friendly turret, if there's a target nearby, shoot it.
                // get all the adjacent units
                var adjacentUnits = mUnitMap?.GetAdjacentUnits(turret.AbsolutePosition);

                // remember the closest adjacent unit.
                ICollider closestAdjacent         = null;
                var       closestAdjacentDistance =
                    1500f; // a separate variable is used so that it can be initalized with a very big value.

                if (adjacentUnits == null)
                {
                    continue;
                }
                // iterate through all adjacent units to find the closest adjacent unit.
                foreach (var adjacentUnit in adjacentUnits)
                {
                    // only calculate the distance to the adjacent unit if the unit is not friendly.
                    if (!adjacentUnit.Friendly)
                    {
                        // calculate the distance
                        var dist = Geometry.GetQuickDistance(turret.AbsolutePosition, adjacentUnit.AbsolutePosition);
                        // check if it's within range
                        if (dist < turret.Range)
                        {
                            // if yes, check if it's closer than the previous closest
                            if (dist < closestAdjacentDistance)
                            {
                                closestAdjacentDistance = dist;
                                closestAdjacent         = adjacentUnit;
                            }
                        }
                    }
                }

                // if there is something close enough, shoot it. Else, set the target to null.
                if (closestAdjacent != null)
                {
                    turret.SetShootingTarget(closestAdjacent);
                }
                else
                {
                    turret.SetShootingTarget(null);
                }
            }

            #endregion

            #region Check targets for hostile units

            foreach (var unit in mHostileMilitary)
            {
                // iterate through each hostile unit, if there's a target nearby, shoot it.
                // get all the adjacent units
                var adjacentUnits = mUnitMap?.GetAdjacentUnits(unit.AbsolutePosition);

                // remember the closest adjacent unit.
                ICollider closestAdjacent         = null;
                var       closestAdjacentDistance =
                    1500f; // a separate variable is used so that it can be initalized with a very big value.

                if (adjacentUnits == null)
                {
                    continue;
                }
                // iterate through all adjacent units to find the closest adjacent unit.
                foreach (var adjacentUnit in adjacentUnits)
                {
                    // only calculate the distance to the adjacent unit if the unit is friendly.
                    if (adjacentUnit.Friendly)
                    {
                        // calculate the distance
                        var dist = Geometry.GetQuickDistance(unit.AbsolutePosition, adjacentUnit.AbsolutePosition);
                        // check if it's within range
                        if (dist < unit.Range)
                        {
                            // if yes, check if it's closer than the previous closest
                            if (dist < closestAdjacentDistance)
                            {
                                closestAdjacentDistance = dist;
                                closestAdjacent         = adjacentUnit;
                            }
                        }
                    }
                }

                // if there is something close enough, shoot it. Else, set the target to null.
                if (closestAdjacent != null)
                {
                    var platform = closestAdjacent as PlatformBlank;
                    if (platform != null && !platform.GetBluePrintStatus())
                    {
                        unit.SetShootingTarget(closestAdjacent);
                    }
                    else if (platform == null)
                    {
                        unit.SetShootingTarget(closestAdjacent);
                    }
                }
                else
                {
                    unit.SetShootingTarget(null);
                }
            }

            #endregion

            #region Check targets for hostile turrets

            foreach (var turret in mHostileDefensePlatforms)
            {
                // iterate through each friendly turret, if there's a target nearby, shoot it.
                // get all the adjacent units
                var adjacentUnits = mUnitMap?.GetAdjacentUnits(turret.AbsolutePosition);

                // remember the closest adjacent unit.
                ICollider closestAdjacent         = null;
                var       closestAdjacentDistance =
                    1500f; // a separate variable is used so that it can be initalized with a very big value.

                if (adjacentUnits == null)
                {
                    continue;
                }
                // iterate through all adjacent units to find the closest adjacent unit.
                foreach (var adjacentUnit in adjacentUnits)
                {
                    // only calculate the distance to the adjacent unit if the unit is friendly.
                    if (adjacentUnit.Friendly)
                    {
                        // calculate the distance
                        var dist = Geometry.GetQuickDistance(turret.AbsolutePosition, adjacentUnit.AbsolutePosition);
                        // check if it's within range
                        if (dist < turret.Range)
                        {
                            // if yes, check if it's closer than the previous closest
                            if (dist < closestAdjacentDistance)
                            {
                                closestAdjacentDistance = dist;
                                closestAdjacent         = adjacentUnit;
                            }
                        }
                    }
                }

                // if there is something close enough, shoot it. Else, set the target to null.
                if (closestAdjacent != null)
                {
                    turret.SetShootingTarget(closestAdjacent);
                }
                else
                {
                    turret.SetShootingTarget(null);
                }
            }

            #endregion

            #region Flocking adding

            if (mSelected.Count > 0)
            {
                mIsSelected = true;
                mSelectedGroup.Reset();
                mSelected.ForEach(u => mSelectedGroup.AssignUnit(u));
                mGroups.Add(mSelectedGroup);
            }
            else if (mIsSelected)
            {
                mIsSelected    = false;
                mSelectedGroup = new FlockingGroup(ref mDirector, ref mMap);
            }
            mSelected = new List <IFlocking>();

            mGroups.RemoveAll(g => g.Die());

            mGroups.ForEach(g => g.Update(gametime));

            #endregion
        }