mixedcards/Assets/Battle/BattleParticipant.cs
2020-09-20 22:02:34 -04:00

125 lines
2.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BattleParticipant
{
public delegate void DeathAction(BattleParticipant participant);
public event DeathAction OnDeath;
protected bool isHero;
protected string displayName;
protected int hp;
protected int maxHP;
protected int block;
protected bool dead;
protected Dictionary<BattleStatus, int> statuses;
public BattleParticipant(bool isHero) {
this.isHero = isHero;
this.statuses = new Dictionary<BattleStatus, int>();
}
public void Init() {
this.hp = this.maxHP;
}
public string GetDisplayName() {
return this.displayName;
}
public int GetHP() {
return this.hp;
}
public int GetMaxHP() {
return this.maxHP;
}
public bool IsAlive() {
return !this.dead;
}
public int DealDamage(int damage) {
int blockedDamage = Math.Min(damage, this.block);
if (blockedDamage > 0) {
this.block -= blockedDamage;
damage -= blockedDamage;
}
damage = Math.Min(this.hp, damage);
this.hp -= damage;
return damage;
}
public void CheckState() {
if (this.hp <= 0) {
this.dead = true;
TriggerOnDeath();
}
}
public int Heal(int amount) {
if (!IsAlive()) {
return 0;
}
amount = Math.Min(this.maxHP - this.hp, amount);
this.hp += amount;
return amount;
}
public void AddBlock(int block) {
this.block += block;
}
public void ResetBlock() {
this.block = 0;
}
public int GetBlock() {
return this.block;
}
public bool IsHero() {
return this.isHero;
}
public void IncreaseMaxHP(int amount) {
this.maxHP += amount;
if (this.hp > 0) {
this.hp += amount;
}
}
private void TriggerOnDeath() {
if (this.OnDeath != null) {
this.OnDeath(this);
}
}
public int AddStatus(BattleStatus status, int amount) {
int currentAmount;
this.statuses.TryGetValue(status, out currentAmount);
this.statuses[status] = currentAmount + amount;
return amount;
}
public void TickStatuses() {
Dictionary<BattleStatus, int> newStatuses = new Dictionary<BattleStatus, int>();
foreach (KeyValuePair<BattleStatus, int> pair in this.statuses) {
if (pair.Value >= 1) {
newStatuses[pair.Key] = pair.Value - 1;
}
}
this.statuses = newStatuses;
}
public bool CanUseCard(BaseCard card) {
return IsAlive() && !HasStatus(BattleStatus.Stun);
}
public bool HasStatus(BattleStatus status) {
return this.statuses.ContainsKey(status);
}
}