105 lines
3.9 KiB
C#
105 lines
3.9 KiB
C#
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<AudioSource>();
|
|
monsterController = gameObject.GetComponent<MonsterController>();
|
|
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<float> 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<int> finalDamage = new List<int>();
|
|
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<int> 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<DamageTextController>();
|
|
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; }
|
|
}
|