Пример #1
0
 public void UpgradeByExp(System.Action then)
 {
     if (_baseCharacter == null || _baseCharacter is Object && _baseCharacter.Equals(null))
     {
         return;
     }
     _currency.PurchaseByExperencePoint(upgradedCost.ExperencePoint, () =>
     {
         _baseCharacter.attackPower *= (1 + upgradedAttackRate);
         _baseCharacter.hp          *= (1 + upgradedHpRate);
         ++_baseCharacter.level;
         _baseCharacter.AssignUpgradedDisplay();
         attackPower                       = _baseCharacter.attackPower;
         hp                                = _baseCharacter.hp;
         level                             = _baseCharacter.level;
         display                           = _baseCharacter.displayPrefab;
         var upgradedGoldRate              = GetUpgradedCostRate();
         _baseCharacter.upgradedCost.Gold *= (1 + upgradedGoldRate);
         upgradedCost                      = _baseCharacter.upgradedCost;
         if (then != null)
         {
             then();
         }
     });
 }
Пример #2
0
    public override void Event_MoveFxToOpponent(AnimationEvent animEvent)
    {
        if (currentSkill == null || currentSkill is Object && currentSkill.Equals(null))
        {
            return;
        }
        if (!_opponents.Any())
        {
            return;
        }
        currentOpponent = _opponents[animEvent.intParameter];
        if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null))
        {
            return;
        }
        var fx = currentSkill.GetEffect(animEvent.stringParameter, _baseCharacter);

        if (fx == null || fx is Object && fx.Equals(null))
        {
            return;
        }
        var frameRate = animEvent.animatorClipInfo.clip.frameRate;
        var length    = CalculatorUtility.TimeByFrame(animEvent.floatParameter, frameRate);

        StartCoroutine(TransformUtility.MoveToTarget(fx, fx.transform.position, currentOpponent.hitPoint.transform.position, length, () => {
            Destroy(fx.gameObject);
        }));
    }
Пример #3
0
    public override void Event_ActivateFxAtOpponent(AnimationEvent animEvent)
    {
        if (currentSkill == null || currentSkill is Object && currentSkill.Equals(null))
        {
            return;
        }
        if (!_opponents.Any())
        {
            return;
        }
        currentOpponent = _opponents[animEvent.intParameter];
        if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null))
        {
            return;
        }
        var evtFxName = string.IsNullOrEmpty(animEvent.stringParameter) ? currentSkill.effectName : animEvent.stringParameter;

        currentSkill.ActivateEffect(evtFxName, _baseCharacter, currentOpponent, (_fx) => {
            if (currentOpponent != null)
            {
                _fx.SetParent(null);
                _fx.position = currentOpponent.hitPoint.position;
            }
        });
    }
Пример #4
0
    IEnumerator Spell(BaseCharacter owner, AbilityInfo info, Vector3 position)
    {
        owner.Audio.play(LoadManager.Instance.GetSFXData(SFXType.BossSkill).clip, 1F, 0F, 1F);

        owner.caster.abilityCast = true;
        info.isUse = true;

        owner.Order = order;
        owner.SetAnim( );
        owner.Anim_Event = false;
        while (owner.Anim_Event == false)
        {
            if (owner.Order != order || owner.IsDeath)
            {
                break;
            }
            yield return(null);
        }

        int cnt = info.amount[0];

        LayerMask            layerMask = GameLayerHelper.Layer(GameLayer.Actor);
        var                  col       = new Collider2D[MAX_COUNT];
        var                  actors    = Physics2D.OverlapCircleNonAlloc(position, Range, col, layerMask);
        List <BaseCharacter> targets   = new List <BaseCharacter> ( );

        for (int i = 0; i < actors; ++i)
        {
            BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( );
            if (character == null || character.Equals(owner) || owner.Owner.IsAlliance(character.Owner) || character.IsDeath)
            {
                continue;
            }
            targets.Insert(Random.Range(0, targets.Count + 1), character);
        }

        GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill);

        foreach (var t in targets)
        {
            Instantiate(vfx, t.Position, Quaternion.identity);
            DamageCalculator.DamageInfo damageInfo = new DamageCalculator.DamageInfo(DamageCalculator.DamageType.Magic);
            damageInfo.damage = 99999999;
            owner.damageCalculator.Damaged(t, damageInfo);
            if (--cnt == 0)
            {
                break;
            }
        }

        if (owner.Order == order || owner.Order == AbilityOrder.Idle)
        {
            owner.Order = AbilityOrder.Idle;
            owner.AddAnim( );
        }

        info.isUse = false;
        owner.caster.abilityCast = false;
    }
    private void Owner_Damaged(BaseCharacter source, BaseCharacter target, DamageCalculator.DamageInfo info)
    {
        if (info.type != DamageCalculator.DamageType.Normal)
        {
            return;
        }

        var abilityInfo = source.caster.Get(index);

        if (abilityInfo.isUse)
        {
            return;
        }
        abilityInfo.isUse = true;

        int cnt = abilityInfo.amount[0];

        LayerMask            layerMask = GameLayerHelper.Layer(GameLayer.Actor);
        var                  col       = new Collider2D[MAX_COUNT];
        var                  actors    = Physics2D.OverlapCircleNonAlloc(target.Position, Range, col, layerMask);
        List <BaseCharacter> targets   = new List <BaseCharacter> ( );

        for (int i = 0; i < actors; ++i)
        {
            BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( );
            if (character == null || character.Equals(source) || character.Equals(target) || source.Owner.IsAlliance(character.Owner) || character.IsDeath)
            {
                continue;
            }
            targets.Insert(Random.Range(0, targets.Count + 1), character);
        }

        GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill);

        foreach (var t in targets)
        {
            Instantiate(vfx, t.Position, Quaternion.identity);
            source.damageCalculator.Damaged(t, info);
            if (--cnt == 0)
            {
                break;
            }
        }
        abilityInfo.isUse = false;
    }
Пример #6
0
    public override void Event_MoveBack(AnimationEvent animEvent)
    {
        if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null))
        {
            return;
        }
        var frameRate = animEvent.animatorClipInfo.clip.frameRate;
        var length    = CalculatorUtility.TimeByFrame(animEvent.floatParameter, frameRate);

        StartCoroutine(TransformUtility.MoveToTarget(transform, currentOpponent.impactPoint.transform.position, _originalPosition, length));
    }
Пример #7
0
    void CreateHitEffect(BaseCharacter baseCharacter, BaseCharacter target)
    {
        if (target == null || target is Object && target.Equals(null))
        {
            return;
        }
        var hitFx = Instantiate <Transform>(hitEffectPrefab, target.hitPoint.transform.position, Quaternion.identity, baseCharacter.transform);

        hitFx.gameObject.SetActive(true);
        hitFx.transform.position = target.hitPoint.position;
        var hitFxAnim = hitFx.GetComponent <Animator>();
        var length    = hitFxAnim.GetCurrentAnimatorStateInfo(0).length;

        Destroy(hitFxAnim.gameObject, length);
    }
Пример #8
0
 public void Event_ActiveHurtAnimation(AnimationEvent animEvent)
 {
     if (currentSkill == null || currentSkill is Object && currentSkill.Equals(null))
     {
         return;
     }
     if (!_opponents.Any())
     {
         return;
     }
     currentOpponent = _opponents[animEvent.intParameter];
     if (currentOpponent == null || currentOpponent is Object && currentOpponent.Equals(null))
     {
         return;
     }
     StartCoroutine(currentSkill.ActiveHurtAnimation(currentOpponent));
 }
Пример #9
0
        public static string SimulateBattlesBetween(long enemyId = -1, long combatantId = 0, int simulations = 1000)
        {
            BaseCharacter combatant = GetCharacterClone(combatantId);
            BaseCharacter enemy     = enemyId > 0 ? GetCharacterClone(combatantId) : (BaseCharacter)MeasureStickJoe.Instance.Clone();
            int           wins      = 0;
            int           losses    = 0;
            double        percentWon;
            double        averageHealthLeft      = 0;
            double        enemyAverageHealthLeft = 0;
            int           initialHitPoints       = combatant.CurHitPoints;
            int           enemyInitialHitPoints  = enemy.CurHitPoints;
            string        initialName            = combatant.Name;
            string        enemyInitialName       = enemy.Name;

            for (int i = 0; i < simulations; i++)
            {
                combatant.DamageTaken = 0;

                enemy.DamageTaken = 0;

                Battle simulation = new Battle(combatant, enemy);
                if (combatant.Equals(simulation.Winner))
                {
                    wins++;
                    averageHealthLeft += simulation.CombatantStatistics.Character.CurHitPoints;
                }
                else if (enemy.Equals(simulation.Winner))
                {
                    losses++;
                    enemyAverageHealthLeft += simulation.OpponentStatistics.Character.CurHitPoints;
                }
                else
                {
                    throw new Exception("Unknown winner!");
                }
                combatant.Name = initialName;
                enemy.Name     = enemyInitialName;
            }
            combatant.CurHitPoints  = initialHitPoints;
            enemy.CurHitPoints      = enemyInitialHitPoints;
            averageHealthLeft      /= wins;
            enemyAverageHealthLeft /= losses;
            percentWon              = wins / ((double)wins + losses);
            return($"{percentWon*100}% winrate | AverageHealthLeft: {averageHealthLeft} | EnemyAverageHealthLeft: {enemyAverageHealthLeft}");
        }
Пример #10
0
    IEnumerator FindEnemy()
    {
        while (pawn.IsDeath == false)
        {
            var       col       = new Collider2D[FIND_ENEMY_MAX];
            LayerMask layerMask = GameLayerHelper.Layer(GameLayer.Actor);
            var       actors    = Physics2D.OverlapCircleNonAlloc(pawn.Center, AttackDistance, col, layerMask);
            holdCharacters.Clear( );
            for (int i = 0; i < actors; ++i)
            {
                BaseCharacter character = col[i].transform.GetComponentInParent <BaseCharacter> ( );
                if (character == null || character.Equals(pawn) || character.IsDeath)
                {
                    continue;
                }

                holdCharacters.Add(character);
            }
            yield return(new WaitForSeconds(FIND_ENEMY_TICK));
        }
    }
Пример #11
0
    public List <BaseCharacter> AttackRange(float range, FilterType filter)
    {
        LayerMask layer  = GameLayerHelper.Layer(GameLayer.Actor);
        var       col    = new Collider2D[OVERLAP_MAX_ACTOR];
        var       actors = Physics2D.OverlapCircleNonAlloc(Owner.Center, range, col, layer);

        List <BaseCharacter> targets = new List <BaseCharacter> ( );

        for (int i = 0; i < actors; ++i)
        {
            BaseCharacter character = col[i].transform.GetComponentInParent <BaseCharacter> ( );
            if (character == null || character.Equals(Owner))
            {
                continue;
            }

            switch (filter)
            {
            case FilterType.Alliance:
                if (Owner.Owner.IsEnemy(character.Owner))
                {
                    continue;
                }
                break;

            case FilterType.Enemy:
                if (Owner.Owner.IsAlliance(character.Owner))
                {
                    continue;
                }
                break;
            }
            targets.Add(character);
        }
        return(targets);
    }
 public bool Exists(BaseCharacter baseCharacter)
 {
     return(list.Any(x => baseCharacter.Equals(x)));
 }