import java.util.* abstract class AggressiveCard: Card { override fun startSkill() { println(activeString) owner.enemy.effectBuffer = this.effects owner.enemy.attackingCard = this owner.enemy.effectBuffer.forEach { it.apply() } } override fun toString(): String { return "${this.id}. ${this.name}" } } abstract class DefensiveCard: Card { class NotInPassiveContextException: Exception() override fun startSkill() { if(owner.effectBuffer.isEmpty()) { throw NotInPassiveContextException() } println("attacking: ${owner.attackingCard}") println("${owner.enemy.attackingCard}") println(activeString) this.effects.forEach { it.apply() } } override fun toString(): String { return "${this.id}. ${this.name}" } } abstract class GeneralCard: Card { override fun startSkill() { println(activeString) this.effects.forEach { it.apply() } } override fun toString(): String { return "${this.id}. ${this.name}" } } class AttackCard(override val owner: Character): AggressiveCard() { override val name = "攻擊" override val id = 1 override val effects: Array = arrayOf(Damage(owner.enemy, decreaseLife = 2)) override val activeString = "$owner 攻擊 ${owner.enemy}" } class DefendCard(override val owner: Character): DefensiveCard() { override val name = "防禦" override val id = 2 override val effects: Array = arrayOf(Defense(owner)) override val activeString = "$owner 防禦成功" } class HealCard(override val owner: Character): GeneralCard() { override val name = "治癒" override val id = 3 override val effects: Array = arrayOf(Heal(owner, increaseLife = 2)) override val activeString = "$owner 回復2點生命" } class SupplyCard(override val owner: Character): GeneralCard() { override val name = "補給" override val id = 4 override val effects: Array = arrayOf(DrawFromDeck(owner, numberOfCards = 2)) override val activeString = "$owner 增加2張手牌" } class RobbingCard(override val owner: Character): AggressiveCard() { override val name = "強奪" override val id = 5 override val effects: Array = arrayOf(ChooseFromCharacterHand(owner, owner.enemy)) override val activeString = "$owner 正在對 ${owner.enemy} 行搶" } class SurpriceCard(override val owner: Character): AggressiveCard() { override val name = "奇襲" override val id = 6 override val effects: Array = arrayOf(Damage(owner.enemy, decreaseLife = 2), LoseCard(owner.enemy)) override val activeString = "$owner 發動奇襲" } class AwareCard(override val owner: Character): DefensiveCard() { override val name = "洞悉" override val id = 7 override val effects: Array = arrayOf(DrawFromDeck(owner, numberOfCards = 2), Defense(owner)) override val activeString = "$owner 洞悉了 ${owner.enemy} 的攻擊,並抽取2張手牌" } class PlanCard(override val owner: Character): GeneralCard() { override val name = "妙策" override val id = 8 override val effects: Array = arrayOf(ChooseFromDeck(owner)) override val activeString = "$owner 有個妙策" } class SweepCard(override val owner: Character): AggressiveCard() { override val name = "掃射" override val id = 9 private val damage = Random().nextInt(6) override val effects: Array get() = arrayOf(Damage(owner.enemy, decreaseLife = damage)) override val activeString = "$owner 對 ${owner.enemy} 進行掃射,威力是 $damage" } class BlessCard(override val owner: Character): GeneralCard() { override val name = "加護" override val id = 10 override val effects: Array = arrayOf(Heal(owner, increaseLife = 3), SolvePoison(owner)) override val activeString = "$owner 獲得加護,身上的毒素一掃而空,並回復3點生命" } class PoisonCard(override val owner: Character): GeneralCard() { override val name = "劇毒" override val id = 11 override val effects: Array = arrayOf(Poison(owner.enemy)) override val activeString = "$owner 在食物下毒,${owner.enemy} 中毒了" } class ChaosCard(override val owner: Character): AggressiveCard() { override val name = "狂亂" override val id = 12 override val effects: Array = arrayOf(Heal(owner, increaseLife = 3), Damage(owner.enemy, decreaseLife = 3)) override val activeString = "$owner 進入狂亂模式,回復三點生命,並對 ${owner.enemy} 造成三點傷害" } class ReverseCard(override val owner: Character): DefensiveCard() { override val name = "反制" override val id = 13 override val effects: Array = arrayOf(Reverse(owner), Defense(owner)) override val activeString = "$owner 反制了 ${owner.enemy} 的攻擊,反彈了其效果" }