using System.Collections; using System.Collections.Generic; using UnityEngine; public class DamageController : MonoBehaviour { [SerializeField] public float damageTransposeX = 1.0f; [SerializeField] public float damageTransposeY = 1.0f; [SerializeField] public float baseTransposeX = 1.0f; [SerializeField] public float baseTransposeY = 1.0f; [SerializeField] public MonsterController monsterController; [SerializeField] public AudioSource audioSource; [SerializeField] private Transform damageText; [SerializeField] private Transform damageTextSpecial; [SerializeField] private HPBarController hpBarController; public MonsterInfo info; [SerializeField] private long hp = 1; private long maxHP = 1; // Start is called before the first frame update void Start() { audioSource = gameObject.GetComponent(); monsterController = gameObject.GetComponent(); info = (MonsterInfo)MonsterInfo.MonsterInfoMap[monsterController.monsterID]; hp = info.maxHP; maxHP = info.maxHP; hpBarController.ShowHP(1.0f); } // Returns true iff damage was issued. public bool IssueDamage(List amounts, float timeOffset, bool transposeRight = true, AudioClip hitClip = null, AudioClip tickClip = null) { if (hp < 1) return false; // Convert player baseDamage to monster received damage. List finalDamage = new List(); int dmg, totalDamage = 0; foreach(float amt in amounts) { dmg = Mathf.Max((int)(amt * info.defenseMultiplier - info.defense), 1); finalDamage.Add(dmg); totalDamage += dmg; } hp -= totalDamage; if (hp < 0) hp = 0; float ratio = (float)(hp / (double)maxHP); hpBarController.ShowHP(ratio); Debug.Log("My HP: " + hp.ToString() + " / " + maxHP.ToString() + " (" + ratio.ToString() + ")"); StartCoroutine(TakeDamage(finalDamage, timeOffset, transposeRight, hitClip, tickClip)); monsterController.OnHurtStart(transposeRight); return true; } bool IsSpecialDamage(int amount) { return amount > 1; } IEnumerator TakeDamage(List amounts, float timeOffset, bool transposeRight = true, AudioClip hitClip = null, AudioClip tickClip = null) { monsterController.numSkillsTakingDamageFrom += 1; Vector3 damageTextPosition; float totalTransposeX = baseTransposeX; float totalTransposeY = baseTransposeY; if (transposeRight) { totalTransposeX *= -1; } if (hitClip != null) { audioSource.PlayOneShot(hitClip); } foreach(int amount in amounts) { if (tickClip != null) { audioSource.PlayOneShot(tickClip); } damageTextPosition = new Vector3(gameObject.transform.position.x + totalTransposeX, gameObject.transform.position.y + totalTransposeY, gameObject.transform.position.z); Transform transform; if (IsSpecialDamage(amount)) { transform = Instantiate(damageTextSpecial, damageTextPosition, Quaternion.identity); } else { transform = Instantiate(damageText, damageTextPosition, Quaternion.identity); } DamageTextController text = transform.GetComponent(); text.Setup(amount); yield return new WaitForSeconds(timeOffset); if (transposeRight) { totalTransposeX += damageTransposeX; } else { totalTransposeX -= damageTransposeX; } totalTransposeY += damageTransposeY; } monsterController.numSkillsTakingDamageFrom -= 1; } public long GetHP() { return hp; } }