예제 #1
0
 void Shoot()
 {
     muzzleFlash.Play();
     //hitEffect.instance.spawnDefaultHitEffect(barrelEnd.position, barrelEnd.transform);
     Debug.DrawRay(barrelEnd.transform.position, barrelEnd.transform.forward * 200f, Color.black);
     if (Physics.Raycast(barrelEnd.transform.position, barrelEnd.transform.forward, out hit, Range) && hit.transform.tag == "Enemy")
     {
         Debug.Log(hit.transform.name);
         Enemies enemy = hit.transform.GetComponent <Enemies>();
         //Enemies enemy = hit.collider.gameObject.GetComponent<Enemies>();
         bool isCritical = UnityEngine.Random.Range(0, 100) < 25;
         if (isCritical)
         {
             bulletDamage *= 2;
         }
         if (explosiveBullets)
         {
             Instantiate(bullet, hit.point, hit.transform.rotation);
         }
         if (enemy != null)
         {
             enemy.TakeDamage(bulletDamage);
         }
         if (hit.rigidbody != null)
         {
             hit.rigidbody.AddForce(-hit.normal * impactForce);
         }
         DamagePopUp.Create(hit.point, bulletDamage, isCritical);
     }
 }
예제 #2
0
 public void TakeDamage(int playerDamage)
 {
     mCurrentHP -= playerDamage;
     DeathCheck();
     // DamagePop up as new feature
     DamagePopUp.Create(transform.position, playerDamage);
 }
예제 #3
0
    public override IEnumerator Execute(Unit initiator, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            bool stun = new Random().Next(1, 100) <= 99;

            var attackDamage = BattleManager.CalculatePhysicalDamage(0.8f * initiator.stats[StatString.PHYSICAL_DAMAGE].Value, target);
            target.stats[StatString.HP].AddModifier(new StatModifier(-attackDamage, StatModType.Flat));
            DamagePopUp.Create(target.transform.position, string.Format("- {0} HP", attackDamage), PopupType.DAMAGE);

            if (stun)
            {
                yield return(new WaitForSeconds(1f));

                Debug.Log("target stunned");
                target.Stun();
                yield return(target.StunAnimation());

                DamagePopUp.Create(target.transform.position, "Stunned!", PopupType.DAMAGE);
            }
        }
        UpdateStats(initiator, targets);

        yield break;
    }
예제 #4
0
파일: Enemy.cs 프로젝트: MonkeyDe2/Game
 public void Burn(float burnDamage)
 {
     health -= burnDamage;
     SpawnBlood();
     DamagePopUp.Create(transform.position, burnDamage, Color.red);
     image.fillAmount = health / maxHealth;
     CheckDeath();
 }
예제 #5
0
    public IEnumerator Execute(Unit initiator, Tile target, Map map)
    {
        {
            map.RemoveAllObstaclesFromTile(target);
            DamagePopUp.Create(target.transform.position, "Wall Break", PopupType.DEBUFF);
        }
        initiator.UpdateUI();

        yield break;
    }
예제 #6
0
    // Ranged AoE of 2-tile radius. Deals x1.5 physical damage to all targets in range
    public override IEnumerator Execute(Unit initiator, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            int attackDamage = BattleManager.CalculateMagicDamage(1.5f * initiator.stats[StatString.PHYSICAL_DAMAGE].Value, target);
            target.stats[StatString.HP].AddModifier(new StatModifier(-attackDamage, StatModType.Flat));
            DamagePopUp.Create(target.transform.position, string.Format("- {0} HP", attackDamage), PopupType.DAMAGE);
        }
        UpdateStats(initiator, targets);

        yield break;
    }
예제 #7
0
 public void OnOpenButton()
 {
     // Debug.Log($"Chest empty: {isEmpty}");
     if (!isEmpty)
     {
         inventory.AddItem(Instantiate(item));
         openChestPanel.SetActive(false);
         Debug.Log($"Added {item.itemName} to inventory");
         DamagePopUp.Create(gameObject.transform.position, $"{item.itemName} added to convoy", PopupType.ITEM_COLLECT);
         isEmpty = true;
     }
 }
예제 #8
0
    public override IEnumerator Execute(Unit initiator, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            int healingAmount = Mathf.CeilToInt(0.8f * initiator.stats[StatString.MAGIC_DAMAGE].Value);
            target.stats[StatString.HP].AddModifier(new StatModifier(healingAmount, StatModType.Flat));
            DamagePopUp.Create(target.transform.position, string.Format("+ {0} HP", healingAmount), PopupType.HEAL);
        }

        UpdateStats(initiator, targets);

        yield break;
    }
예제 #9
0
    private void HandleAttack()
    {
        foreach (Structure struc in enemyStructuresInRange)
        {
            if (struc != null)
            {
                if (behaviour == Behaviour.Win)
                {
                    if (struc.gameObject.GetComponent <Base>() != null)
                    {
                        state = State.Attacking;

                        DamagePopUp.Create(struc.transform.position, 20, false);
                        struc.TakeDamage(20);
                    }
                }

                if (behaviour == Behaviour.Destroy)
                {
                    state = State.Attacking;
                    if (attackTarget == null)
                    {
                        attackTarget = struc;
                    }
                    else
                    {
                        DamagePopUp.Create(attackTarget.transform.position, 20, false);
                        attackTarget.TakeDamage(20);
                    }

                    if (attackTarget != null)
                    {
                        speed = 0;
                        if (attackTarget.IsDead())
                        {
                            speed = MAX_SPEED;
                        }
                    }
                }

                if (behaviour == Behaviour.Rampage)
                {
                    state = State.Attacking;
                    speed = MAX_SPEED / 2;
                    DamagePopUp.Create(struc.transform.position, 20, false);
                    struc.TakeDamage(20);
                }
            }
        }
    }
예제 #10
0
    // Does 110% magic damage to all units in range, and also reduces attack damage by 20%
    public override IEnumerator Execute(Unit initiator, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            int   attackDamage = BattleManager.CalculateMagicDamage(1.2f * initiator.stats[StatString.MAGIC_DAMAGE].Value, target);
            float armorDebuff  = 0.2f;
            target.stats[StatString.HP].AddModifier(new StatModifier(-attackDamage, StatModType.Flat));
            target.stats[StatString.ARMOR].AddModifier(new StatModifier(-armorDebuff, duration, StatModType.PercentAdd));
            DamagePopUp.Create(target.transform.position, string.Format("- {0} HP", attackDamage), PopupType.DAMAGE);
            DamagePopUp.Create(target.transform.position, string.Format("\n\n- {0}% Attack", armorDebuff * 100), PopupType.DEBUFF);
        }
        UpdateStats(initiator, targets);

        yield break;
    }
예제 #11
0
    public override IEnumerator Execute(Unit initiator, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            int heuristicDistance =
                Mathf.CeilToInt(Vector3.Distance(initiator.transform.position, target.transform.position));

            var attackDamage = Mathf.CeilToInt((1 + (heuristicDistance - 1) * 0.2f) * BattleManager.CalculatePhysicalDamage(initiator.stats[StatString.PHYSICAL_DAMAGE].Value, target));

            target.stats[StatString.HP].AddModifier(new StatModifier(-attackDamage, StatModType.Flat));
            DamagePopUp.Create(target.transform.position, string.Format("- {0} HP", attackDamage), PopupType.DAMAGE);
        }

        UpdateStats(initiator, targets);

        yield break;
    }
예제 #12
0
파일: Enemy.cs 프로젝트: MonkeyDe2/Game
    public void TakeDamage(Vector3 attackPosition, float damageAmount, Transform source, Color customColor)
    {
        health -= damageAmount;

        CheckDeath();
        SetTarget(source);
        image.fillAmount = health / maxHealth;
        Vector3 dirFromAttacker = (transform.position - attackPosition).normalized;

        float knockbackDistance = 10f;

        transform.position += dirFromAttacker * knockbackDistance;
        SpawnBlood();
        DamagePopUp.Create(transform.position, damageAmount, customColor);

        Debug.Log("YOU HIT AN ENEMYYYYY");
    }
예제 #13
0
    public override IEnumerator Execute(Unit attacker, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            float attackDamage = BattleManager.CalculateBaseDamage(attacker, target);
            target.stats[StatString.HP].AddModifier(new StatModifier(-2 * attackDamage, StatModType.Flat));

            DamagePopUp.Create(target.transform.position, string.Format("- {0} HP", attackDamage), PopupType.DAMAGE);
            yield return(new WaitForSeconds(1f));

            DamagePopUp.Create(target.transform.position, string.Format("- {0} HP", attackDamage), PopupType.DAMAGE);
        }

        UpdateStats(attacker, targets);

        yield break;
    }
예제 #14
0
    public static void Battle(Unit attacker, Unit recipient)
    {
        TurnScheduler turnScheduler = GameAssets.MyInstance.turnScheduler;

        bool hit  = new Random().Next(1, 100) <= attacker.stats[StatString.HIT_RATE].Value;
        bool crit = new Random().Next(1, 100) <= attacker.stats[StatString.CRIT_RATE].Value;

        if (!recipient.isDead())
        {
            if (hit)
            {
                // must take into account whether the main attack is magic or physical
                int attackDamage = CalculateBaseDamage(attacker, recipient);
                attackDamage = crit ? attackDamage * CritMultiplier : attackDamage;
                recipient.TakeDamage(attackDamage);
                attacker.UseWeapon();
                DamagePopUp.Create(recipient.transform.position, string.Format("- {0} HP", (int)attackDamage),
                                   PopupType.DAMAGE, crit);
            }
            else
            {
                DamagePopUp.Create(recipient.transform.position, "MISS!", PopupType.DAMAGE);
            }
        }

        bool killed = false;

        if (recipient.isDead())
        {
            turnScheduler.StartCoroutine(turnScheduler.RemoveUnit(recipient));
            killed = true;
        }
        else
        {
            recipient.UpdateUI();
        }

        // add exp
        if (hit)
        {
            int exp = Level.CalculateExp(recipient.level, attacker.level, killed);
            attacker.level.AddExp(exp);
        }

        attacker.UpdateUI();
    }
예제 #15
0
    void Update()
    {
        string info;

        PopUpTimer -= Time.deltaTime;

        if (popUps.Count > 0)
        {
            if (PopUpTimer <= 0)
            {
                PopUpInfo popUpInfo = popUps.Dequeue();
                info = popUpInfo.info;
                DamagePopUp.Create(gameObject.transform.position + new Vector3(0, (gameObject.GetComponent <TacticsMovement>().halfHeight) + 0.5f), info, popUpInfo.highlight);
                PopUpTimer = PopUpDelay;
            }
        }
    }
예제 #16
0
    public override IEnumerator Execute(Unit initiator, List <Unit> targets)
    {
        foreach (Unit target in targets)
        {
            float magicDamageBuff = 0.2f;
            float armorBuff       = 0.2f;
            target.stats[StatString.MAGIC_DAMAGE].AddModifier(new StatModifier(magicDamageBuff, duration, StatModType.PercentAdd));
            target.stats[StatString.ARMOR].AddModifier(new StatModifier(armorBuff, duration, StatModType.PercentAdd));
            DamagePopUp.Create(target.transform.position, string.Format("+ {0}% MagAttack", magicDamageBuff * 100), PopupType.BUFF);
            yield return(new WaitForSecondsRealtime(0.5f));

            DamagePopUp.Create(target.transform.position, string.Format("\n\n + {0}% Armor", armorBuff * 100), PopupType.BUFF);
        }

        UpdateStats(initiator, targets);

        yield break;
    }
예제 #17
0
    public void TeamFirst(CardAndSkillinfo info)
    {//Card传递伤害信息
        // Debug.Log(info.info.skillname);
        int   skilltype  = info.info.type;
        int   atktimes   = info.info.hittimes;
        float skillpower = info.info.skillpower;

        System.Random rd = new System.Random();
        if (skilltype == (int)SkillType.NearAT || skilltype == (int)SkillType.FarAT || skilltype == (int)SkillType.Magic)
        {
            for (int i = 0; i < info.info.hittimes; i++)
            {
                //暂时没找到好的延迟效果实现
                double extra  = rd.Next(90, 110) / 100.0;//技能攻击浮动在0.9~1.1
                int    damage = (int)(skillpower * info.cardatk * extra);
                monster.nowhp -= damage;
                DamagePopUp.Create(DamageEffect, MyDamage, damage, transform);
                monster.nowhp = Math.Max(0, monster.nowhp);
                audiosr.PlayOneShot(audiohit);
                UpdateMsHp();
            }
        }
        else if (skilltype == (int)SkillType.Heal)
        {
            double extra = rd.Next(90, 110) / 100.0;//技能攻击浮动在0.9~1.1
            team.nowhp += (int)(skillpower * info.cardatk * extra);
            team.nowhp  = (team.nowhp > team.hpall) ? team.hpall : team.nowhp;
            UpdateUsHp();
        }
        else if (skilltype == (int)SkillType.CHARGE)
        {
            team.power += 1;
            team.power  = Math.Min(6, team.power);
            ReDraw();
        }
        else if (skilltype == (int)SkillType.BUFF)
        {
            //BUFF是比较复杂的类,稍后分析
        }
    }
예제 #18
0
 public void MonsterSecond()
 {
     System.Random rd = new System.Random();
     for (int i = 0; i < monster.atktime; i++)
     {
         if (monster.list[i].type == (int)SkillType.NearAT || monster.list[i].type == (int)SkillType.FarAT || monster.list[i].type == (int)SkillType.Magic)
         {
             double extra  = rd.Next(90, 110) / 100.0;
             int    damage = (int)(monster.list[i].skillpower * monster.atkall * extra * (1 - 0.2f * team.guardlevel));
             team.nowhp -= damage;
             team.nowhp  = Math.Max(0, team.nowhp);
             DamagePopUp.Create(DamageEffect, MsDamage, damage, transform);
             audiosr.PlayOneShot(audiohit);
             UpdateUsHp();
         }
         else if (monster.list[i].type == (int)SkillType.Heal)
         {
             double extra = rd.Next(90, 110) / 100.0;
             monster.nowhp += (int)(monster.list[i].skillpower * monster.atkall * extra);
             UpdateMsHp();
         }
     }
     monster.Attack();
 }