Пример #1
0
        public void ActivateAbility(Ability ability)
        {
            if (ability.targetType.Equals(TargetType.Self))
            {
                ability.target = gameObject;
            }
            else
            {
                ability.target = controller.target;
            }

            if (ability.CanUse(this))
            {
                AbilityUsed?.Invoke();
                activeAbilites.Add(ability);
                stats.stats.UseAbilityPoints(ability.cost);
                ability.TriggerAnimator(this);
                ability.startTime = Time.time;
                foreach (var action in ability.actions)
                {
                    action.target = ability.target;
                }
                foreach (var action in ability.actions.Where(t => t.type.Equals(ActionType.Instant)))
                {
                    action.Act(this);
                }
            }
        }
Пример #2
0
        public void Set(List <Ability> abilities)
        {
            abilities?.ForEach(ability => abilitySystems.Add(new AbilitySystem(ability, owner)));

            if (owner is SpiritSystem spirit)
            {
                spirit.ShootSystem.Shooting += OnSpiritShooting;
            }

            void OnSpiritShooting(BulletSystem obj)
            {
                abilitySystems.ForEach(abilitySystem =>
                {
                    if (abilitySystem.Ability.IsUsedWhenShoot)
                    {
                        abilitySystem.SetTarget(owner.Targets[0] as IAppliedEffectsComponent);
                        abilitySystem.Init();
                        AbilityUsed?.Invoke(abilitySystem);
                    }
                });
            }
        }
Пример #3
0
        public void UpdateSystem()
        {
            if (owner is EnemySystem)
            {
                InitEnemyAbilities();
            }
            else
            {
                if (!isOwnedByPlayer)
                {
                    return;
                }

                InitSpiritAbilities();
            }

            void InitEnemyAbilities()
            {
                abilitySystems.ForEach(system =>
                {
                    if (owner.CheckHaveMana(system.Ability.ManaCost))
                    {
                        system.Init();
                    }
                });
            }

            void InitSpiritAbilities()
            {
                abilitySystems.ForEach(abilitySystem =>
                {
                    if (owner.CheckHaveMana(abilitySystem.Ability.ManaCost))
                    {
                        if (!abilitySystem.Ability.IsUsedWhenShoot)
                        {
                            if (owner.Targets.Count > 0)
                            {
                                abilitySystem.SetTarget(owner.Targets[0] as IAppliedEffectsComponent);
                                Init(abilitySystem, CheckTargetInRange(abilitySystem.Target));
                            }
                            else
                            {
                                abilitySystem.SetTarget(null);
                                Init(abilitySystem, !abilitySystem.CheckAllEffectsEnded());
                            }

                            if (abilitySystem.IsNeedStack)
                            {
                                abilityStacks.Add(CreateStack(abilitySystem));
                                abilitySystem.IsNeedStack = false;
                            }
                        }
                    }
                });

                InitStacks();

                void InitStacks()
                {
                    for (int i = 0; i < abilityStacks.Count; i++)
                    {
                        Init(abilityStacks[i], !abilityStacks[i].CheckAllEffectsEnded());
                    }
                }
            }

            AbilitySystem CreateStack(AbilitySystem baseAbilitySystem)
            {
                var stack = new AbilitySystem(baseAbilitySystem.Ability, owner);

                stack.SetTarget(baseAbilitySystem.Target);
                stack.StackReset(baseAbilitySystem);

                return(stack);
            }

            bool CheckTargetInRange(IAppliedEffectsComponent target) =>
            owner.Targets.Find(targetInRange => target == targetInRange) != null;

            void Init(AbilitySystem abilitySystem, bool condition)
            {
                if (abilitySystem.Target != null && condition)
                {
                    abilitySystem.Init();
                    AbilityUsed?.Invoke(abilitySystem);
                }
                else if (abilitySystem.IsStacked && abilitySystem.CheckAllEffectsEnded())
                {
                    abilityStacks.Remove(abilitySystem);
                }
            }
        }