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); } }
public void TakeDamage(int playerDamage) { mCurrentHP -= playerDamage; DeathCheck(); // DamagePop up as new feature DamagePopUp.Create(transform.position, playerDamage); }
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; }
public void Burn(float burnDamage) { health -= burnDamage; SpawnBlood(); DamagePopUp.Create(transform.position, burnDamage, Color.red); image.fillAmount = health / maxHealth; CheckDeath(); }
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; }
// 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; }
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; } }
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; }
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); } } } }
// 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; }
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; }
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"); }
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; }
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(); }
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; } } }
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; }
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是比较复杂的类,稍后分析 } }
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(); }