Exemple #1
0
    void Update()
    {
        if (GameManager.Instance.IsGameOver || GameManager.Instance.GetLeaderActor().State == ActorState.Dead)
        {
            return;
        }

        RPGActor enemyActor = GetComponent <RPGActor>();

        if (enemyActor.State == ActorState.Idle)
        {
            float distance = Vector3.Distance(this.transform.position, GameManager.Instance.GetPartyLeader().transform.position);
            if (Mathf.Abs(distance) < Range)
            {
                enemyActor.SetTarget(GameManager.Instance.GetPartyLeader());
                enemyActor.EngageTarget(); //notify the enemy too.
            }
        }
    }
    public void DoDamageAttack(int damage, MagicElemancy element, GameObject target, float fontIncrement = 0, bool isSpecialDamage = false)
    {
        if (isPlayer)
        {
            ChainBarDisplayController.Instance.AddToChainBar(1.5f);
        }

        RPGActor targetActor = target.GetComponent <RPGActor>();

        //If target is not engaged, engage it with this actor
        if (targetActor.State == ActorState.Idle)
        {
            if (target.tag == "Player" /* && GameManager.Instance.CurrentState == GameManager.Instance.StateIdle */)
            {
                targetActor.SetSoftTarget(this.gameObject);
                GameManager.Instance.Log("Attacked target is a player who was idle, now entering battle state and showing UI");
            }

            this.TargetObject = target; //Set current target to this enemy
            targetActor.SetTarget(this.gameObject);
            targetActor.EngageTarget(); //notify the enemy.
        }
        else if (targetActor.State == ActorState.Engaged)
        {
            AddToEngaged(target); //When target is already in battle, add to engaged but don't set the current target
        }

        //
        var playerShoot = GetComponent <PlayerShoot>();

        if (playerShoot != null && target != null)
        {
            //playerShoot.TargetObject = target;
            playerShoot.ShootBullet(target);
        }

        DamageInfo damageInfo = ResolveDamageUnitAGivesUnitB(this.Properties, targetActor.Properties, damage);
        int        dmg        = (int)damageInfo.TotalDamage;

        targetActor.Properties.ChangeHealth(-dmg);
        targetActor.SpawnDamageParticles(element);

        if (fontIncrement == 0)
        {
            fontIncrement = damageInfo.CritMultiplier * 1.3f;

            //for auto attack size variation
            if (damage == 1)
            {
                fontIncrement *= 0.6f;
            }
            if (damage == 2)
            {
                fontIncrement *= 0.9f;
            }
            if (damage == 3)
            {
                fontIncrement *= 1.1f;
            }

            if (damage > 5)
            {
                fontIncrement *= 1.6f;
            }
        }

        Color playerDMG  = CoreUIManager.Instance.PlayerTakeDamageColor;
        Color enemyDMG   = CoreUIManager.Instance.EnemyTakeDamageColor;
        Color specialDMG = CoreUIManager.Instance.SpecialDamageColor;

        if (isSpecialDamage)
        {
            CoreUIManager.Instance.SpawnText(dmg.ToString(), target, specialDMG, 2.6f);
        }
        else if (this.tag == "Enemy")
        {
            CoreUIManager.Instance.SpawnText(dmg.ToString(), target, playerDMG, fontIncrement);
        }
        else
        {
            CoreUIManager.Instance.SpawnText(dmg.ToString(), target, enemyDMG, fontIncrement);
        }
    }