Files
pgs/Assets/Scripts/DamageController.cs
2026-02-21 16:58:22 -08:00

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; }
}