Ejemplo n.º 1
0
        protected override IEnumerator InnerDoGroupAbility(Transform groupTransform)
        {
            _toons.transform.position = groupTransform.transform.position + new Vector3(0f, 1f, 0f);

            _toons.transform.SetParent(groupTransform);

            GroupAggro groupAggro = groupTransform.GetComponent <GroupAggro>();

            groupAggro.SetAggro(float.MaxValue);

            yield return(new WaitForSeconds(data.ActivatedDuration));

            groupAggro.SetAggro(data.AssociatedTactic.GetTactic().GetData().TacticAggro);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Sort players by aggro
        /// Use aggro as probability
        /// If a player pass probability test, set as target
        /// </summary>
        /// <returns></returns>
        private bool TryChooseByAggro()
        {
            if (GroupAggro.ForcedTargets.Count > 0)
            {
                _targetData.SetTarget(GroupAggro.ForcedTargets[Random.Range(0,GroupAggro.ForcedTargets.Count)].GetComponent<GroupManager>().GetRandomImp());
                _contextSteering.SetTarget(_targetData);
                OnBossTargetChanged?.Invoke(_targetData.Target);

                _currentTargetStillValid = true;
                
                return true;
            }

            // TODO :- this should be a separate node
            if(PlayerAggro.ReadAggro() >= Random.Range(1f, 100f))
            {
                _currentTargetStillValid = true;

                // TODO :- create a player manager, this will lead to errors
                _targetData.SetTarget(ReincarnationManager.Instance.CurrentLeader.transform);

                _contextSteering.SetTarget(_targetData);

                OnBossTargetChanged?.Invoke(_targetData.Target);

                return true;
            }

            GroupAggro selected = null;

            float probabilitySum = _groupAggros.
                Where(aggro => aggro.GetComponent<GroupManager>().Imps.Keys.Count > 0 ).
                Aggregate(0f, (sum, next) => sum + next.CurrentAggro);

            float diceThrow = Random.Range(1f, probabilitySum);

            float temp = 0f;

            List<GroupAggro> _groups = new List<GroupAggro>();
            
            foreach(GroupAggro groupAggro in _groupAggros.Where(aggro => !aggro.GetComponent<GroupManager>().HasNoImps()).OrderByDescending(aggro => aggro.CurrentAggro))
            {
                float groupProbability = groupAggro.CurrentAggro;

                if(!(diceThrow >= temp && diceThrow <= temp + groupProbability))
                {
                    temp += groupProbability;

                    continue;
                }

                _groups.Add(groupAggro);

                break;
            }

            if(_groups.Count == 0)
                return false;

            selected = _groups
                .OrderBy(group => Vector3.Distance(group.transform.position, _arenaBoss.Arena.transform.position))
                .FirstOrDefault();

            if (selected == null) return false;

            _currentTargetStillValid = true;

            _targetData.SetTarget(selected.GetComponent<GroupManager>().GetRandomImp());

            _contextSteering.SetTarget(_targetData);

            OnBossTargetChanged?.Invoke(_targetData.Target);

            return true;
        }