package com.hearthsim.card.minion; import com.hearthsim.model.BoardModel; import com.hearthsim.model.PlayerSide; public abstract class MinionWithEnrage extends Minion { private boolean enraged_; protected MinionWithEnrage() { super(); } @Override public void setHealth(byte health) { super.setHealth(health); this.enrageCheck(); } @Override public void setMaxHealth(byte health) { super.setMaxHealth(health); this.enrageCheck(); } @Override public Minion deepCopy() { MinionWithEnrage minionWithEnrage = (MinionWithEnrage) super.deepCopy(); minionWithEnrage.enraged_ = enraged_; return minionWithEnrage; } public boolean isEnraged() { return this.enraged_; } /** * Turn on enrage * */ protected abstract void enrage(); /** * Turn off enrage */ protected abstract void pacify(); @Override public byte takeDamage(byte damage, PlayerSide originSide, PlayerSide thisPlayerSide, BoardModel board, boolean isSpellDamage) { byte actualDamage = super.takeDamage(damage, originSide, thisPlayerSide, board, isSpellDamage); if (actualDamage > 0) { this.enrageCheck(); } return actualDamage; } /** * Called when this minion is healed * * Always use this function to heal minions * @param healAmount The amount of healing to take * @param thisPlayerSide * @param boardState * */ @Override public byte takeHeal(byte healAmount, PlayerSide thisPlayerSide, BoardModel board) { byte actual = super.takeHeal(healAmount, thisPlayerSide, board); if (actual > 0) { this.enrageCheck(); } return actual; } /** * Called when this minion is silenced * * Always use this function to "silence" minions * * * * @param thisPlayerSide * @param boardState */ @Override public void silenced(PlayerSide thisPlayerSide, BoardModel boardState) { super.silenced(thisPlayerSide, boardState); if (enraged_) this.pacify(); } private void enrageCheck() { if (!silenced_) { if (health_ < maxHealth_ && !enraged_) { enraged_ = true; this.enrage(); } else if (health_ == maxHealth_ && enraged_) { enraged_ = false; this.pacify(); } } } }