private GameObject FindClosestTarget(PositionBehavior currentPosition, PreferedTarget targetPriority, List <UnitBasicProperties> inRangeTargets)
        {
            var tile      = gameState.GetActiveTile();
            var positions = tile.GetPositions();

            var closestPlayers  = new List <GameObject>();
            var closestDistance = 20;

            foreach (var target in inRangeTargets)
            {
                if (targetPriority == PreferedTarget.Aggro && !target.hasAggroToken)
                {
                    continue;
                }

                var position = tile.GetUnitPosition(target.gameObject);
                var distance = PathFinder.GetPath(currentPosition, position).Count;

                if (distance < closestDistance)
                {
                    closestPlayers.Clear();
                    closestPlayers.Add(target.gameObject);
                    closestDistance = distance;
                }
                else if (distance == closestDistance)
                {
                    closestPlayers.Add(target.gameObject);
                }
            }

            if (!closestPlayers.Any())
            {
                return(null);
            }

            var closestProperties = closestPlayers.Select(p => p.GetComponent <PlayerProperties>()).ToList();

            if (closestProperties.Count == 1)
            {
                return(closestProperties.First().gameObject);
            }
            if (closestProperties.Count > 1)
            {
                var aggro = closestProperties.FirstOrDefault(p => p.hasAggroToken);
                if (aggro != null)
                {
                    return(aggro.gameObject);
                }
                else
                {
                    var taunt = closestProperties.OrderByDescending(p => p.initiative).First();
                    return(taunt.gameObject);
                }
            }

            return(null);
        }
    private void ShowValidDirections(PositionBehavior currentPosition, PositionBehavior awayFromPosition = null)
    {
        if (awayFromPosition == null || currentPosition == awayFromPosition)
        {
            EnableAll();
        }
        else
        {
            var currentDistance = PathFinder.GetPath(awayFromPosition, currentPosition).Count;
            var validCount      = 0;
            if (currentPosition.NorthPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.NorthPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                NorthArrowBehavior.SetTarget(currentPosition.NorthPosition);
            }
            if (currentPosition.NorthEastPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.NorthEastPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                NorthEastArrowBehavior.SetTarget(currentPosition.NorthEastPosition);
            }
            if (currentPosition.EastPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.EastPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                EastArrowBehavior.SetTarget(currentPosition.EastPosition);
            }
            if (currentPosition.SouthEastPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.SouthEastPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                SouthEastArrowBehavior.SetTarget(currentPosition.SouthEastPosition);
            }
            if (currentPosition.SouthPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.SouthPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                SouthArrowBehavior.SetTarget(currentPosition.SouthPosition);
            }
            if (currentPosition.SouthWestPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.SouthWestPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                SouthWestArrowBehavior.SetTarget(currentPosition.SouthWestPosition);
            }
            if (currentPosition.WestPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.WestPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                WestArrowBehavior.SetTarget(currentPosition.WestPosition);
            }
            if (currentPosition.NorthWestPosition != null && PathFinder.GetPath(awayFromPosition, currentPosition.NorthWestPosition.GetComponent <PositionBehavior>()).Count > currentDistance)
            {
                validCount++;
                NorthWestArrowBehavior.SetTarget(currentPosition.NorthWestPosition);
            }

            if (validCount == 0)
            {
                EnableAll();
            }
        }
    }
 private void NotifyPositionSelected(PositionBehavior position)
 {
     if (PositionClicked != null)
     {
         var moveCommand = new UnitMovement()
         {
             MoveFrom = currentPosition,
             MoveTo   = position ?? currentPosition,
             Unit     = movingUnit.gameObject,
         };
         EventManager.RaiseEvent(ObjectEventType.UnitMoved, moveCommand);
         PositionClicked(position);
     }
 }
示例#4
0
        // returns a world position
        public static Vector3 GetDesiredPositionForObject(AttachObject obj, PositionBehavior behavior,
                                                          ParamSelector anchor1, ParamSelector anchor2)
        {
            switch (behavior)
            {
            case PositionBehavior.DoNothing:
                throw new System.InvalidOperationException("PositionBehavior is to do nothing");

            // return obj.gameObject.transform.position;
            case PositionBehavior.Snap:
                return(GetSnapPosition(obj.attachable, obj.attachment, anchor1, anchor2, obj));
            }
            throw new System.NotImplementedException("Position behavior not implemented.");
        }
    public void SetupAndShow(UnitBasicProperties unit, MoveChoserType moveType, PositionBehavior awayFromPosition)
    {
        movingUnit           = unit;
        DescriptionText.text = $"Choose {moveType.ToString()} {Environment.NewLine} Direction";

        OcclusionBackground.SetActive(true);
        DescriptionText.gameObject.SetActive(true);

        var positions = GameStateManager.Instance.GetActiveTile().GetPositions();

        currentPosition = positions.First(p => p.HasUnit(unit.gameObject));

        ShowValidDirections(currentPosition, awayFromPosition);

        if (moveType == MoveChoserType.Shift)
        {
            NoneButton.SetActive(true);
        }
    }
示例#6
0
    private void MakePlayersFromBytes(byte[] data)
    {
        for (int x = 0; x < data.Length; x += 26)
        {
            var xPosition = BitConverter.ToSingle(data, x + 0);
            var yPosition = BitConverter.ToSingle(data, x + 4);

            var xSpeed = BitConverter.ToSingle(data, x + 8);
            var ySpeed = BitConverter.ToSingle(data, x + 12);

            PositionBehavior thisData = new PositionBehavior(xPosition, yPosition, xSpeed, ySpeed);

            var id = BitConverter.ToInt32(data, x + 16);
            var packetNumber = BitConverter.ToInt32(data, x + 20);

            if (id != this.id)
            {
                if (!otherPlayers.ContainsKey(id))
                {
                    var newObject = Instantiate(anotherPlayer);
                    newObject.SetActive(true);
                    var newInterpolator = new Interpolator(thisData);
                    otherPlayers[id] = newObject;
                    interpolators[id] = newInterpolator;
                    LatestUpdate[id] = packetNumber;
                    shouldDeleteOld[id] = 100;
                }
                else if (LatestUpdate[id] < packetNumber)
                {
                    LatestUpdate[id] = packetNumber;
                    shouldDeleteOld[id] = 100;
                    interpolators[id].CalculateNewInterpolation(thisData);
                    otherPlayers[id].GetComponent<Rigidbody>().position = interpolators[id].PositionAfterTime(0);
                }
            }
        }
    }
 public void SetTarget(GameObject positionObject)
 {
     TargetPosition = positionObject != null?positionObject.GetComponent <PositionBehavior>() : null;
 }
示例#8
0
 public abstract List <UnitBasicProperties> FindTargetsInRange(UnitBasicProperties attacker, PositionBehavior attackerPosition, IEnumerable <PositionBehavior> positions);
示例#9
0
        public override List <UnitBasicProperties> FindTargetsInRange(UnitBasicProperties attacker, PositionBehavior attackerPosition, IEnumerable <PositionBehavior> positions)
        {
            var currentSide = attacker.side;
            var targetSide  = currentSide == UnitSide.Hollow ? UnitSide.Player : UnitSide.Hollow;

            var targets = new List <UnitBasicProperties>();

            foreach (var position in positions)
            {
                var potential = position.GetUnits(targetSide).ToList();
                targets.AddRange(potential.Select(p => p.GetComponent <UnitBasicProperties>()));
            }
            return(targets);
        }
示例#10
0
        public List <UnitBasicProperties> FindTargetsOnNode(UnitBasicProperties attacker, PositionBehavior targetPosition, UnitBasicProperties originalTarget)
        {
            var currentSide = attacker.side;
            var targetSide  = TargetAllies ? currentSide : currentSide == UnitSide.Hollow ? UnitSide.Player : UnitSide.Hollow;

            var targets = new List <UnitBasicProperties>();

            if (NodeSplash)
            {
                targets = targetPosition.GetUnits(targetSide).Select(u => u.GetComponent <UnitBasicProperties>()).ToList();
            }
            else
            {
                targets.Add(originalTarget);
            }
            return(targets);
        }
示例#11
0
        private List <UnitBasicProperties> FindTargetsInRangeInternal(UnitBasicProperties attacker, PositionBehavior attackerPosition, IEnumerable <PositionBehavior> positions, bool withShift)
        {
            var currentSide = attacker.side;
            var targetSide  = TargetAllies ? currentSide : currentSide == UnitSide.Hollow ? UnitSide.Player : UnitSide.Hollow;

            var targets = new List <UnitBasicProperties>();

            foreach (var position in positions)
            {
                var pathLength = PathFinder.GetPath(attackerPosition, position).Count;
                if (!InRange(pathLength, withShift))
                {
                    continue;
                }

                var potential = position.GetUnits(targetSide).ToList();
                targets.AddRange(potential.Select(p => p.GetComponent <UnitBasicProperties>()));
            }
            return(targets);
        }
示例#12
0
 public List <UnitBasicProperties> FindTargetsInWeaponRange(UnitBasicProperties attacker, PositionBehavior attackerPosition, IEnumerable <PositionBehavior> positions)
 {
     return(FindTargetsInRangeInternal(attacker, attackerPosition, positions, false));
 }