import java.util.* abstract class AggressiveCard: Card { override fun startSkill() { println(activeString) owner.enemy.attackingCard = this owner.enemy.effectBuffer = this.effects 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(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}" } } //ordinary card 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} 的攻擊,反彈了其效果" } //SP card //Guo's card class SpaceZipperDoor(override val owner: Character): DefensiveCard() { override val name = "空間之鍊(門)" override val id = 101 override val activeString = "$owner 使出了空間之鍊(門)" override val effects: Array = arrayOf(Copy(owner), Defense(owner)) } class SpaceZipperShell(override val owner: Character): GeneralCard() { override val name = "空間之鍊(殼)" override val id = 102 override val activeString = "$owner 使出了空間之鍊(殼)" override val effects: Array = arrayOf(BecomeInvincible(owner, turns = 2)) } class SpaceZipperDestroy(override val owner: Character): AggressiveCard() { override val name = "空間之鍊(滅)" override val id = 103 override val activeString = "$owner 使出了空間之鍊(滅)" override val effects: Array = arrayOf(Damage(owner.enemy, decreaseLife = 5), LoseCard(owner.enemy, num = 2)) } //Rabbit's card class NoScienceSlash(override val owner: Character): Card { override val name = "科學無用論(高速砍擊)" override val id = 201 override val activeString = "$owner 使用了科學無用論(高速砍擊)" override val effects: Array = arrayOf(UndefendableDamage(owner.enemy, decreaseLife = 3)) override fun startSkill() { effects.forEach { it.apply() } } override fun toString() = "$id. $name" } class NoSciencePowerIncrease(override val owner: Character): GeneralCard() { override val name = "科學無用論(力量增幅)" override val id = 202 override val activeString = "$owner 使用了科學無用論(力量增幅)" override val effects: Array = arrayOf(ChangeDamageAddition(owner.enemy, num = 1, turns = 3)) } class NoScienceFinal(override val owner: Character): Card { override val name = "科學無用論(終焉一擊)" override val id = 203 override val activeString = "$owner 使用了科學無用論(終焉一擊)" override val effects: Array = arrayOf(UndefendableDamage(owner.enemy, decreaseLife = 5)) override fun startSkill() { effects.forEach { it.apply() } } override fun toString() = "$id. $name" }