From 4b559ca7fa3370fef4ca883a8a30b4ba8d4196d0 Mon Sep 17 00:00:00 2001 From: gahusb Date: Fri, 3 Jul 2026 23:07:41 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9B=8C=EB=A6=AC=EC=96=B4=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EC=99=80=20=EA=B3=B5=EC=9A=A9=20=EC=A0=84=ED=88=AC=20?= =?UTF-8?q?=ED=9A=A8=EA=B3=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RootDesk/MyDesk/SlayDeckController.codeblock | 266 ++++- data/cards.json | 1042 +++++++++++++++--- data/cards.xlsx | Bin 21544 -> 27004 bytes docs/card-effect-fields.md | 18 + tools/balance/sim-balance.mjs | 232 +++- tools/balance/sim-balance.test.mjs | 184 +++- tools/deck/cb/combat.mjs | 31 +- tools/deck/cb/deckturn.mjs | 13 +- tools/deck/cb/hand.mjs | 237 +++- tools/deck/cb/run.mjs | 2 + tools/deck/gen-slaydeck.mjs | 2 + tools/deck/lib/data.mjs | 29 +- tools/verify/cardkinds.mjs | 3 +- 13 files changed, 1870 insertions(+), 189 deletions(-) diff --git a/RootDesk/MyDesk/SlayDeckController.codeblock b/RootDesk/MyDesk/SlayDeckController.codeblock index 4b9c518..47b032d 100644 --- a/RootDesk/MyDesk/SlayDeckController.codeblock +++ b/RootDesk/MyDesk/SlayDeckController.codeblock @@ -841,6 +841,13 @@ "Attributes": [], "Name": "ActiveKillReward" }, + { + "Type": "number", + "DefaultValue": "0", + "SyncDirection": 0, + "Attributes": [], + "Name": "ActiveKillMaxHpGain" + }, { "Type": "number", "DefaultValue": "0", @@ -1057,6 +1064,13 @@ "SyncDirection": 0, "Attributes": [], "Name": "NextTurnAddCards" + }, + { + "Type": "any", + "DefaultValue": "nil", + "SyncDirection": 0, + "Attributes": [], + "Name": "ZeroCostCardIdsThisTurn" } ], "Methods": [ @@ -1069,7 +1083,7 @@ "Name": null }, "Arguments": [], - "Code": "self.Cards = {\n\tStrike = { name = \"파워 스트라이크\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tDefend = { name = \"아이언 바디\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tBash = { name = \"슬래시 블러스트\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10, class = \"warrior\", rarity = \"normal\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tWarLeap = { name = \"워 리프\", cost = 1, desc = \"피해 4, 방어도 3\", kind = \"Attack\", damage = 4, block = 3, class = \"warrior\", rarity = \"normal\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tBrandish = { name = \"브랜디시\", cost = 2, desc = \"피해 13\", kind = \"Attack\", damage = 13, class = \"warrior\", rarity = \"unique\", fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tChargedBlow = { name = \"차지 블로우\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, firstCardDamageBonus = 2, vuln = 2, class = \"warrior\", rarity = \"unique\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tThreaten = { name = \"위협\", cost = 0, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"warrior\", rarity = \"normal\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tEnrage = { name = \"인레이지\", cost = 1, desc = \"힘 +2\", kind = \"Skill\", strength = 2, class = \"warrior\", rarity = \"unique\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tRage = { name = \"분노\", cost = 1, desc = \"모든 적에게 피해를 4 줍니다.\", kind = \"Attack\", damage = 4, class = \"warrior\", rarity = \"legend\", aoe = true, image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tComboAttack = { name = \"콤보 어택\", cost = 1, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"fighter\", rarity = \"unique\", hits = 2, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBerserk = { name = \"버서크\", cost = 2, desc = \"매턴 에너지 +1, 취약 1 자가\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"fighter\", rarity = \"legend\", selfVuln = 1, image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tRisingAttack = { name = \"라이징 어택\", cost = 2, desc = \"피해 12\", kind = \"Attack\", damage = 12, class = \"fighter\", rarity = \"unique\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"115e309771604743853abad2d8d186bc\" },\n\tThunderCharge = { name = \"썬더 차지\", cost = 1, desc = \"피해 7, 약화 1\", kind = \"Attack\", damage = 7, weak = 1, class = \"page\", rarity = \"unique\", fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tBlizzardCharge = { name = \"블리자드 차지\", cost = 1, desc = \"피해 7, 취약 1\", kind = \"Attack\", damage = 7, vuln = 1, class = \"page\", rarity = \"unique\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tPowerGuard = { name = \"파워 가드\", cost = 1, desc = \"방어도 10\", kind = \"Skill\", block = 10, class = \"page\", rarity = \"unique\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tPierce = { name = \"피어스\", cost = 1, desc = \"피해 9, 방어 무시\", kind = \"Attack\", damage = 9, class = \"spearman\", rarity = \"unique\", pierce = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tIronWall = { name = \"아이언 월\", cost = 2, desc = \"방어도 12\", kind = \"Skill\", block = 12, class = \"spearman\", rarity = \"unique\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tHyperBody = { name = \"하이퍼 바디\", cost = 1, desc = \"매턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"spearman\", rarity = \"legend\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tEnergyBolt = { name = \"에너지 볼트\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"magician\", rarity = \"normal\", fx = \"1d5877e1120a42d0907f204c959888b1\", image = \"e84880eaf89442128d3af2be5c80a74f\" },\n\tMagicGuard = { name = \"매직 가드\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"magician\", rarity = \"normal\", image = \"01b249c26eb34b8aaab774bf221907a1\" },\n\tMagicClaw = { name = \"매직 클로\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"magician\", rarity = \"normal\", hits = 2, fx = \"ba4ac7c8f24845b68b7e689b7effcc93\", image = \"f3fcac2d460041b288cc1973caaaf30f\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", discardAll = true, drawPerDiscarded = 1, image = \"7f70a9dc7e304433bb8121dd9c4df98b\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"7224cd3f9b7e497d9dd65f32a50865e4\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", fx = \"4a937e208875468eb63d891806fba3cd\", image = \"6fa15fd3a0004b409ea516c11a67e533\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"07200f3c74854022baa7ebbefdc4ad8c\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"06865473977849bebe79062dbd608944\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, fx = \"7d52f5e389bd4d44a30cf7cc54538f8f\", image = \"c6685d33cb2641f09d11cfa2d5cc820c\" },\n\tColdBeam = { name = \"콜드 빔\", cost = 2, desc = \"피해 7, 약화 2\", kind = \"Attack\", damage = 7, weak = 2, class = \"icelightning\", rarity = \"unique\", image = \"e8f7c148c79f497d83014e3361f59f5c\" },\n\tChillingStep = { name = \"칠링 스텝\", cost = 1, desc = \"방어도 8\", kind = \"Skill\", block = 8, class = \"icelightning\", rarity = \"unique\", image = \"bef20873a68a4651a91d74be457c2cfc\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"8b935b7d7066493cb462834bbe287c74\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"607fc5457c1c44a0993a5c2fe3fb0c68\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", fx = \"4faa7b78e09643cf86339b8b7cf2abac\", image = \"a80127195bf7471f9545b70e491f4719\" },\n\tWound = { name = \"상처\", cost = 0, desc = \"사용할 수 없다. 손패를 막는 저주.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true },\n\tBurn = { name = \"화상\", cost = 0, desc = \"사용 불가. 손패에 있으면 턴 종료 시 피해 2.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true, endTurnDamage = 2 },\n\tNeutralize = { name = \"커닝식 견제\", cost = 0, desc = \"피해를 3 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 3, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSilentStrike = { name = \"초보 도적의 칼끝\", cost = 1, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSurvivor = { name = \"골목길 생존술\", cost = 1, desc = \"방어도를 8 얻습니다. 카드를 1장 버립니다.\", kind = \"Skill\", block = 8, class = \"rogue\", rarity = \"normal\", discard = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSilentDefend = { name = \"낡은 가죽 방패\", cost = 1, desc = \"방어도를 5 얻습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 1, desc = \"피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"rogue\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해를 3만큼 3번 줍니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"unique\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"카드를 1장 뽑습니다. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"normal\", draw = 1, gainEnergy = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"rogue\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tFlashJump = { name = \"플래시 점프\", cost = 0, desc = \"방어도를 4 얻습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", draw = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNimbleBody = { name = \"님블 바디\", cost = 1, desc = \"민첩을 1 얻습니다. 매 턴 방어도를 2 얻습니다.\", kind = \"Power\", dex = 1, powerEffect = \"blockPerTurn\", value = 2, class = \"rogue\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSlice = { name = \"짧은 단검질\", cost = 0, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShiv = { name = \"표창\", cost = 0, desc = \"피해를 4 줍니다. 소멸.\", kind = \"Attack\", damage = 4, class = \"shiv\", rarity = \"normal\", exhaust = true, token = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerSpray = { name = \"단검비\", cost = 1, desc = \"모든 적에게 피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"thief\", rarity = \"normal\", hits = 2, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerThrow = { name = \"비도 투척\", cost = 1, desc = \"피해를 9 줍니다. 카드를 1장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Attack\", damage = 9, class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPoisonedStab = { name = \"초록 독단검\", cost = 1, desc = \"피해를 6 줍니다. 중독을 3 부여합니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", poison = 3, image = \"19361e72087946b1888684185b40d935\" },\n\tSuckerPunch = { name = \"골목 기습\", cost = 1, desc = \"피해를 7 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 7, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tLeadingStrike = { name = \"초보 표창 던지기\", cost = 1, desc = \"피해를 3 줍니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"normal\", addShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFollowThrough = { name = \"연달아 찌르기\", cost = 1, desc = \"피해를 7 줍니다. 손에 다른 카드가 5장 이상 있다면, 1번 추가로 적중합니다.\", kind = \"Attack\", damage = 7, otherHandAtLeast = 5, bonusHitsWhenOtherHandAtLeast = 1, class = \"thief\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlickFlack = { name = \"커닝 난무\", cost = 1, desc = \"교활. 모든 적에게 피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"thief\", rarity = \"normal\", sly = true, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tRicochet = { name = \"통통 튀는 표창\", cost = 2, desc = \"교활. 무작위 적에게 피해를 3만큼 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, sly = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPrepared = { name = \"비장의 패\", cost = 1, desc = \"카드를 1장 버리고, 이번 턴에 준 피해의 절반만큼 방어를 얻습니다.\", kind = \"Skill\", blockPerDamageDealtThisTurn = 0.5, class = \"thief\", rarity = \"normal\", discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tAnticipate = { name = \"럭키 예감\", cost = 0, desc = \"이번 턴 동안 민첩을 2 얻습니다.\", kind = \"Skill\", endTurnDexLoss = 2, dex = 2, class = \"rogue\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tDeflect = { name = \"단검 쳐내기\", cost = 0, desc = \"방어도를 4 얻습니다.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tBladeDance = { name = \"표창 별무리\", cost = 1, desc = \"표창을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", addShiv = 3, exhaust = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBackflip = { name = \"커닝 곡예\", cost = 1, desc = \"방어도를 5 얻습니다. 카드를 2장 뽑습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", draw = 2, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDodgeAndRoll = { name = \"골목 구르기\", cost = 1, desc = \"방어도를 4 얻습니다. 다음 턴에, 방어도를 4 얻습니다\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", nextTurnBlock = 4, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPiercingWail = { name = \"골목의 살기\", cost = 1, desc = \"이번 턴 동안 모든 적이 힘을 6 잃습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", affectsAllEnemies = true, enemyStrengthLossThisTurn = 6, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCloakAndDagger = { name = \"망토 속 별\", cost = 1, desc = \"방어도를 6 얻습니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Skill\", block = 6, class = \"assassin\", rarity = \"normal\", addShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDeadlyPoison = { name = \"맹독 조제\", cost = 1, desc = \"중독을 5 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 5, image = \"19361e72087946b1888684185b40d935\" },\n\tSnakebite = { name = \"독니 단검\", cost = 2, desc = \"보존. 중독을 7 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 7, retain = true, image = \"19361e72087946b1888684185b40d935\" },\n\tUntouchable = { name = \"연막 속 숨기\", cost = 2, desc = \"교활. 방어도를 6 얻습니다.\", kind = \"Skill\", block = 6, class = \"rogue\", rarity = \"normal\", sly = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSkewer = { name = \"꿰뚫는 표창\", cost = 2, desc = \"피해를 8만큼 X번 줍니다.\", kind = \"Attack\", class = \"assassin\", rarity = \"unique\", useAllEnergy = true, xDamagePerEnergy = 8, image = \"92a5020c978c46bdabab910598118b86\" },\n\tBackstab = { name = \"그림자 등찌르기\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 소멸.\", kind = \"Attack\", damage = 10, class = \"rogue\", rarity = \"unique\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPreciseCut = { name = \"급소 절개\", cost = 0, desc = \"피해를 13 줍니다. 손에 있는 다른 카드 1장당 피해량이 2 감소합니다.\", kind = \"Attack\", damage = 13, damagePerOtherHandCard = -2, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFinisher = { name = \"마지막 칼끝\", cost = 1, desc = \"이번 턴에 사용한 공격 카드 1장당 피해를 6 줍니다.\", kind = \"Attack\", damage = 0, damagePerAttackPlayedThisTurn = 6, class = \"thief\", rarity = \"unique\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMementoMori = { name = \"사신의 장부\", cost = 1, desc = \"피해를 9 줍니다. 이번 턴에 버린 카드 1장당 피해량이 4 증가합니다.\", kind = \"Attack\", damage = 9, damagePerDiscardedThisTurn = 4, class = \"thief\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStrangle = { name = \"그림자 올가미\", cost = 1, desc = \"피해를 8 줍니다.\", kind = \"Attack\", damage = 8, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlechettes = { name = \"표창 셈법\", cost = 1, desc = \"손에 있는 스킬 카드 1장당 피해를 5 줍니다.\", kind = \"Attack\", damage = 0, damagePerSkillInHand = 5, class = \"assassin\", rarity = \"unique\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPounce = { name = \"어둠을 가르는 도약\", cost = 2, desc = \"피해를 12 줍니다. 다음에 사용하는 스킬 카드의 비용이 0 이 됩니다.\", kind = \"Attack\", damage = 12, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDash = { name = \"뒷골목 돌파\", cost = 2, desc = \"방어도를 10 얻습니다. 피해를 10 줍니다.\", kind = \"Attack\", damage = 10, block = 10, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPredator = { name = \"표창 끝의 추격\", cost = 2, desc = \"피해를 15 줍니다. 다음 턴에, 카드를 2장 뽑습니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", nextTurnDraw = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPinpoint = { name = \"한 점 겨냥\", cost = 3, desc = \"피해를 15 줍니다. 이번 턴에 스킬을 사용할 때마다 비용이 1 감소합니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", skillCostReductionThisTurn = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tCalculatedGamble = { name = \"메소 건 승부\", cost = 0, desc = \"손에 있는 모든 카드를 버린 뒤, 버린 카드의 수만큼 카드를 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", discardAll = true, drawPerDiscarded = 1, exhaust = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpose = { name = \"약점 들추기\", cost = 0, desc = \"대상 적의 모든 인공물과 방어도를 제거합니다. 취약을 2 부여합니다. 소멸.\", kind = \"Skill\", vuln = 2, class = \"thief\", rarity = \"unique\", removeEnemyBlock = true, removeEnemyArtifact = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHiddenDaggers = { name = \"숨겨둔 표창\", cost = 0, desc = \"카드를 2장 버립니다. 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", discard = 2, addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tEscapePlan = { name = \"비상용 연막탄\", cost = 0, desc = \"카드를 1장 뽑습니다. 뽑은 카드가 스킬 카드라면, 방어도를 3 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"unique\", draw = 1, drawSkillBlock = 3, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tAcrobatics = { name = \"지붕 위 곡예\", cost = 1, desc = \"카드를 3장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 3, discard = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tHandTrick = { name = \"재빠른 손놀림\", cost = 1, desc = \"방어도를 7 얻습니다. 이번 턴 동안 손에 있는 스킬 카드 1장에 교활을 추가합니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpertise = { name = \"노련한 단검술\", cost = 1, desc = \"손에 있는 카드가 6장이 될 때까지 카드를 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", drawUntilHandSize = 6, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tBubbleBubble = { name = \"독액 농축\", cost = 1, desc = \"적이 중독을 보유하고 있다면, 중독을 9 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", poison = 9, poisonIfTargetPoisoned = true, image = \"19361e72087946b1888684185b40d935\" },\n\tBlur = { name = \"흐린 잔영\", cost = 1, desc = \"방어도를 5 얻습니다. 다음 턴 시작 시 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 5, class = \"thief\", rarity = \"unique\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tLegSweep = { name = \"발목 베기\", cost = 2, desc = \"약화를 2 부여합니다. 방어도를 11 얻습니다.\", kind = \"Skill\", block = 11, weak = 2, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tUpMySleeve = { name = \"소매 속 표창\", cost = 2, desc = \"표창을 3장 손으로 가져옵니다. 이 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", addShiv = 3, combatCostReductionOnPlay = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBouncingFlask = { name = \"통통 독병\", cost = 2, desc = \"무작위 적에게 중독을 3만큼 3번 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 3, poisonHits = 3, poisonRandomTargets = true, image = \"19361e72087946b1888684185b40d935\" },\n\tReflex = { name = \"찰나의 반응\", cost = 3, desc = \"교활. 카드를 2장 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 2, sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tHaze = { name = \"보랏빛 독연기\", cost = 3, desc = \"교활. 모든 적에게 중독을 4 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 4, sly = true, image = \"19361e72087946b1888684185b40d935\" },\n\tTactician = { name = \"골목길 책략\", cost = 3, desc = \"교활. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", gainEnergy = 1, sly = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tWellLaidPlans = { name = \"빈틈없는 작전\", cost = 1, desc = \"내 턴 종료 시, 카드를 최대 1장까지 보존합니다.\", kind = \"Power\", powerEffect = \"retainOne\", value = 1, class = \"thief\", rarity = \"unique\", image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tInfiniteBlades = { name = \"끝없는 표창통\", cost = 1, desc = \"내 턴 시작 시, 표창을 1장 손으로 가져옵니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", turnStartShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFootwork = { name = \"사뿐한 발놀림\", cost = 1, desc = \"민첩을 2 얻습니다.\", kind = \"Power\", dex = 2, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tOutbreak = { name = \"독맥 터뜨리기\", cost = 2, desc = \"독이 3번 부여될 때마다 모든 적에게 6 피해를 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 6, image = \"19361e72087946b1888684185b40d935\" },\n\tNoxiousFumes = { name = \"숨막히는 독연기\", cost = 1, desc = \"내 턴 시작 시, 모든 적에게 중독을 2 부여합니다.\", kind = \"Power\", powerEffect = \"poisonPerTurn\", value = 2, class = \"thief\", rarity = \"unique\", poison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tSpeedster = { name = \"그림자 속도전\", cost = 2, desc = \"내 턴 동안 카드를 뽑을 때마다, 모든 적에게 피해를 1 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", drawDamage = 1, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tGrandFinale = { name = \"커닝의 대단원\", cost = 0, desc = \"뽑을 카드 더미에 카드가 없을 때만 사용할 수 있습니다. 모든 적에게 피해를 45 줍니다.\", kind = \"Attack\", damage = 45, class = \"thiefmaster\", rarity = \"legend\", playableWhenDrawPileEmpty = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tAssassinate = { name = \"어둠 속 급소\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 취약을 1 부여합니다. 소멸.\", kind = \"Attack\", damage = 10, vuln = 1, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tEchoingSlash = { name = \"메아리 칼자국\", cost = 2, desc = \"모든 적에게 피해를 6 줍니다. 적을 처치할 때마다 이 효과를 반복합니다.\", kind = \"Attack\", damage = 10, class = \"thiefmaster\", rarity = \"legend\", repeatOnKill = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tTheHunt = { name = \"커닝 현상금\", cost = 1, desc = \"피해를 10 줍니다. 이 카드로 적을 처치하면 카드 보상을 추가로 얻습니다. 소멸.\", kind = \"Attack\", damage = 6, rewardOnKill = 1, class = \"assassin\", rarity = \"legend\", exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMurder = { name = \"쌓여가는 살의\", cost = 3, desc = \"피해를 1 줍니다. 이번 전투 동안 뽑은 카드 1장당 피해량이 1 증가합니다.\", kind = \"Attack\", damage = 1, damagePerCardDrawnThisCombat = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMalaise = { name = \"기운 빼는 독\", cost = 2, desc = \"에너지를 모두 사용하고, 사용한 에너지만큼 적에게 약화를 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", useAllEnergy = true, xWeakPerEnergy = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStormOfSteel = { name = \"쇠별 폭풍\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 버린 카드의 수만큼 표창을 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"legend\", discardAll = true, addShivPerDiscard = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStep = { name = \"그림자 발자국\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 다음 턴에, 공격 카드의 피해량이 2배가 됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", discardAll = true, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShadowmeld = { name = \"연막 속 은신\", cost = 1, desc = \"이번 턴 동안 얻는 방어도가 2배가 됩니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCorrosiveWave = { name = \"부식 독물결\", cost = 1, desc = \"이번 턴에 카드를 뽑을 때마다, 모든 적에게 중독을 2 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", drawPoison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tBladeOfInk = { name = \"먹빛 표창\", cost = 1, desc = \"잉크투성이 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBurst = { name = \"연속 술수\", cost = 1, desc = \"이번 턴에 다음에 사용하는 스킬 카드가 1번 추가로 사용됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextSkillRepeatCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKnifeTrap = { name = \"숨은 칼날덫\", cost = 2, desc = \"교활. 모든 적에게 피해를 7 주고 중독을 2 부여합니다.\", kind = \"Attack\", damage = 7, class = \"thiefmaster\", rarity = \"legend\", poison = 2, sly = true, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBulletTime = { name = \"멈춘 듯한 순간\", cost = 3, desc = \"이번 턴 동안 더 이상 카드를 뽑을 수 없습니다. 이번 턴 동안 손에 있는 모든 카드를 비용 없이 사용할 수 있습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", handCostZeroThisTurn = true, drawDisabledThisTurn = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNightmare = { name = \"검은 꿈\", cost = 3, desc = \"카드를 1장 선택합니다. 다음 턴에, 그 카드의 복사본을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextTurnCopies = 3, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tToolsOfTheTrade = { name = \"도적의 연장통\", cost = 1, desc = \"내 턴 시작 시, 카드를 1장 뽑고 카드를 1장 버립니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", turnStartDraw = 1, turnStartDiscard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMasterPlanner = { name = \"작전의 달인\", cost = 2, desc = \"사용한 스킬 카드는 교활해집니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", skillSlyOnPlay = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tFanOfKnives = { name = \"사방 표창비\", cost = 2, desc = \"표창이 이제 모든 적을 대상으로 합니다. 표창을 4장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 4, shivAoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSerpentForm = { name = \"독사의 몸놀림\", cost = 2, desc = \"카드를 사용할 때마다, 무작위 적에게 피해를 4 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 4, class = \"thiefmaster\", rarity = \"legend\", image = \"19361e72087946b1888684185b40d935\" },\n\tAbrasive = { name = \"거친 숫돌질\", cost = 2, desc = \"교활. 민첩을 1 얻습니다. 가시를 4 얻습니다.\", kind = \"Power\", dex = 1, thorns = 4, class = \"thiefmaster\", rarity = \"legend\", sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSuppress = { name = \"소리 없는 제압\", cost = 0, desc = \"선천성. 피해를 9 줍니다. 약화를 2 부여합니다. 소멸.\", kind = \"Attack\", damage = 9, weak = 2, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tWraithForm = { name = \"유령 같은 몸놀림\", cost = 3, desc = \"불가침을 2 얻습니다. 내 턴 종료 시 민첩을 1 잃습니다.\", kind = \"Power\", intangible = 2, endTurnDexLoss = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해를 3만큼 2번 줍니다. 이번 턴에 사용한 공격 카드 1장당 피해가 2 증가합니다.\", kind = \"Attack\", damage = 3, damagePerAttackPlayedThisTurn = 2, class = \"thief\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tCriticalEdge = { name = \"크리티컬 엣지\", cost = 1, desc = \"카드를 1장 뽑습니다. 다음 턴에 공격 카드의 피해량이 2배가 됩니다. 보존.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 1, nextTurnAttackMultiplier = 2, retain = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"피해를 3 줍니다. 이번 턴에 버린 카드 1장당 피해가 3 증가합니다. 에너지를 1 얻습니다.\", kind = \"Attack\", damage = 3, damagePerDiscardedThisTurn = 3, class = \"thief\", rarity = \"normal\", gainEnergy = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerAcceleration = { name = \"대거 액셀레이션\", cost = 0, desc = \"카드를 1장 뽑습니다. 카드를 1장 버립니다. 버린 카드마다 카드를 1장 더 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, drawPerDiscarded = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKarma = { name = \"카르마\", cost = 1, desc = \"피해를 7 줍니다. 방어도를 무시합니다. 약화 상태의 적에게는 피해가 2배가 됩니다.\", kind = \"Attack\", damage = 7, class = \"thief\", rarity = \"unique\", pierce = true, attackDamageVsWeakMultiplier = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tDaggerMastery = { name = \"대거 마스터리\", cost = 1, desc = \"카드를 사용할 때마다 방어도를 1 얻습니다. 매 턴 첫 카드의 피해가 3 증가합니다.\", kind = \"Power\", firstCardDamageBonus = 3, cardPlayedBlock = 1, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘을 1 얻습니다. 민첩을 1 얻습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"thief\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tShieldMastery = { name = \"실드 마스터리\", cost = 1, desc = \"방어도를 7 얻습니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"normal\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tThiefAgility = { name = \"시프 어질리티\", cost = 1, desc = \"방어도를 5 얻습니다. 이번 턴 동안 민첩을 1 얻습니다. 손의 다른 스킬 카드 1장이 교활해집니다.\", kind = \"Skill\", endTurnDexLoss = 1, block = 5, dex = 1, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tEdgeCarnival = { name = \"엣지 카니발\", cost = 1, desc = \"무작위 적에게 피해를 2만큼 4번 줍니다.\", kind = \"Attack\", damage = 2, class = \"thiefmaster\", rarity = \"unique\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tMuspelHeim = { name = \"무스펠 하임\", cost = 1, desc = \"모든 적에게 피해를 4 줍니다. 이번 턴에 버린 카드 1장당 피해가 2 증가합니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 4, damagePerDiscardedThisTurn = 2, weak = 1, class = \"thiefmaster\", rarity = \"unique\", aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMesoExplosion = { name = \"메소 익스플로젼\", cost = 1, desc = \"피해를 2 줍니다. 이번 턴에 버린 카드 1장당 피해가 7 증가합니다. 방어도를 무시합니다.\", kind = \"Attack\", damage = 2, damagePerDiscardedThisTurn = 7, class = \"thiefmaster\", rarity = \"unique\", pierce = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDarkFlare = { name = \"다크 플레어\", cost = 1, desc = \"매 턴 모든 적에게 피해를 2 줍니다. 카드를 사용할 때마다 무작위 적에게 피해를 2 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 2, powerEffect = \"damagePerTurn\", value = 2, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tPickPocket = { name = \"픽 파킷\", cost = 1, desc = \"카드를 1장 뽑습니다. 카드를 1장 버리고, 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", draw = 1, gainEnergy = 1, discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 선택합니다. 다음 턴에 그 카드의 복사본 1장을 손에 넣습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnCopies = 1, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요.\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tAdvancedDarkSight = { name = \"어드밴스드 다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", intangible = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tIntoDarkness = { name = \"인투 다크니스\", cost = 1, desc = \"모든 적에게 약화를 1 부여합니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", weak = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, affectsAllEnemies = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tVenom = { name = \"베놈\", cost = 1, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독을 1 부여합니다. 적 턴 시작 시 독이 한 번 더 적용됩니다.\", kind = \"Power\", attackPoison = 1, class = \"thiefmaster\", rarity = \"legend\", extraPoisonTicks = 1, image = \"19361e72087946b1888684185b40d935\" },\n\tGrid = { name = \"그리드\", cost = 2, desc = \"가시를 3 얻습니다. 카드를 사용할 때마다 방어도를 1 얻습니다.\", kind = \"Power\", thorns = 3, cardPlayedBlock = 1, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tRadicalDarkness = { name = \"래디컬 다크니스\", cost = 2, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShurikenBurst = { name = \"슈리켄 버스트\", cost = 1, desc = \"무작위 적에게 피해를 3씩 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tWindTalisman = { name = \"윈드 탈리스만\", cost = 1, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 스킬 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", draw = 1, skillCostReductionThisTurn = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMarkOfAssassin = { name = \"마크 오브 어쌔신\", cost = 1, desc = \"약화 1을 부여합니다. 약화 상태의 적에게 주는 공격 피해가 1.5배가 됩니다.\", kind = \"Power\", weak = 1, class = \"assassin\", rarity = \"unique\", attackDamageVsWeakMultiplier = 1.5, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowRush = { name = \"쉐도우 러쉬\", cost = 1, desc = \"피해 7, 방어도 5를 얻습니다.\", kind = \"Attack\", damage = 7, block = 5, class = \"assassin\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShadowLeap = { name = \"쉐도우 리프\", cost = 0, desc = \"방어도 4를 얻습니다. 다음 턴에 방어도 4를 얻습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"assassin\", rarity = \"normal\", nextTurnBlock = 4, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tShadowBlink = { name = \"쉐도우 블링크\", cost = 1, desc = \"무형 1을 얻습니다. 다음 스킬 카드의 비용이 0이 됩니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tJavelinMastery = { name = \"자벨린 마스터리\", cost = 1, desc = \"표창의 피해량이 2 증가합니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", shivDamageBonus = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tJavelinAcceleration = { name = \"자벨린 액셀레이션\", cost = 1, desc = \"카드를 2장 뽑습니다. 카드를 1장 버립니다. 표창 1장을 손에 넣습니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", draw = 2, discard = 1, addShiv = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 1, desc = \"피해를 6씩 2번 줍니다. 방어도를 무시합니다. 이번 턴 첫 카드라면 피해가 더 강해집니다.\", kind = \"Attack\", damage = 6, firstCardDamageBonus = 2, class = \"assassin\", rarity = \"unique\", hits = 2, pierce = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tAssassinPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘 1, 민첩 1을 얻고 카드를 1장 뽑습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"assassin\", rarity = \"normal\", draw = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tTripleThrow = { name = \"트리플 스로우\", cost = 1, desc = \"피해를 4씩 3번 줍니다.\", kind = \"Attack\", damage = 4, class = \"hermit\", rarity = \"normal\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShurikenChallenge = { name = \"슈리켄 챌린지\", cost = 1, desc = \"피해를 5씩 2번 줍니다. 다음 턴에 카드를 1장 더 뽑습니다.\", kind = \"Attack\", damage = 5, class = \"hermit\", rarity = \"unique\", hits = 2, nextTurnDraw = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitDarkFlare = { name = \"다크 플레어\", cost = 2, desc = \"매 턴 모든 적에게 피해 3을 줍니다. 턴 시작마다 표창 1장을 손에 넣습니다.\", kind = \"Power\", powerEffect = \"damagePerTurn\", value = 3, class = \"hermit\", rarity = \"unique\", turnStartShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 뽑습니다. 다음 턴 공격 카드의 피해가 2배가 됩니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSpiritJavelin = { name = \"스피릿 자벨린\", cost = 1, desc = \"표창이 턴 종료 시 사라지지 않습니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", firstShivDamageBonus = 4, shivRetain = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitRadicalDarkness = { name = \"래디컬 다크니스\", cost = 1, desc = \"방어도 4를 얻습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 소멸.\", kind = \"Skill\", block = 4, blockGainMultiplier = 2, class = \"hermit\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitVenom = { name = \"베놈\", cost = 2, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독 1을 부여합니다. 전투 중 독 부여 3회마다 모든 적에게 피해 8을 줍니다.\", kind = \"Power\", attackPoison = 1, class = \"hermit\", rarity = \"legend\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 8, image = \"19361e72087946b1888684185b40d935\" },\n\tSkilledJavelin = { name = \"숙련된 표창술\", cost = 1, desc = \"표창의 피해량이 2 증가합니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", shivDamageBonus = 2, firstShivDamageBonus = 4, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitAdrenaline = { name = \"아드레날린\", cost = 0, desc = \"에너지를 1 얻고 카드를 1장 뽑습니다. 표창 1장을 손에 넣습니다. 소멸.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, gainEnergy = 1, addShiv = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\trogue = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tcurse = \"rogue\",\n\tshiv = \"rogue\",\n\trogue = \"rogue\",\n\tassassin = \"rogue\",\n\thermit = \"rogue\",\n\tthief = \"rogue\",\n\tthiefmaster = \"rogue\",\n}\nself.NodeIcons = {\n\tcombat = \"f98db6823e894a4f90308d61f75894ac\",\n\telite = \"793ed8a757534b89a82f460747d2df24\",\n\tboss = \"423056cdbbc04f4da131b9721c404d96\",\n\tshop = \"da37e1fac55d455b9ade08569f09f798\",\n\trest = \"b86c1b0568bd45f3ae4a4b97e1b4a594\",\n\ttreasure = \"f8a6d58e20f54e2ca899485055df1ce4\",\n}\nself.ClassPortraits = {\n\twarrior = \"28c88fdc5ab44f34a8b3fc1e19d4ce78\",\n\tmagician = \"3b9ea1f066a744bb859df47fef817277\",\n\trogue = \"efa920e58d31426486ef974106e7dc8b\",\n}\nself.SoulShopDef = {\n\t{ key = \"meso\", name = \"두둑한 지갑\", desc = \"런 시작 시 메소 +60\", cost = 3 },\n\t{ key = \"hp\", name = \"단련된 육체\", desc = \"시작 최대 HP +15\", cost = 4 },\n\t{ key = \"trim\", name = \"덱 정제\", desc = \"시작 덱에서 기본 카드 1장 제거\", cost = 5 },\n\t{ key = \"relic\", name = \"유물 수집가\", desc = \"런 시작 시 유물 1개 추가\", cost = 6 },\n}\nself.SoulUnlocks = {}\nself.SoulPoints = self.SoulPoints or 0\nlocal uiTries = 0\nlocal uiInit = 0\nuiInit = _TimerService:SetTimerRepeat(function()\n\tuiTries = uiTries + 1\n\tif _EntityService:GetEntityByPath(\"/ui/DeckUIGroup\") ~= nil then\n\t\tself:ActivateUIGroups()\n\t\t-- MainMenu는 한동안 비활성화: 시작 시 바로 로비로 진입.\n\t\t-- 추후 싱글/멀티/종료 선택 메뉴가 필요하면 self:ShowMainMenu()로 되돌린다(메서드·UI 유지됨).\n\t\tself:ShowLobby()\n\t\t_TimerService:ClearTimer(uiInit)\n\telseif uiTries > 80 then\n\t\t_TimerService:ClearTimer(uiInit)\n\tend\nend, 0.1)\nlocal lp = _UserService.LocalPlayer\nif lp ~= nil then\n\tself:ReqLoadAscension(lp.PlayerComponent.UserId)\n\tself:ReqLoadSouls(lp.PlayerComponent.UserId)\nend\n_InputService:ConnectEvent(KeyDownEvent, function(e)\n\tif e.key == KeyboardKey.LeftControl then\n\t\tself.DebugCtrlDown = true\n\t\tlocal lp2 = _UserService.LocalPlayer\n\t\tif lp2 ~= nil and lp2.CurrentMapName == \"lobby\" and self.RunActive ~= true then\n\t\t\tself:PlayerAttackMotion()\n\t\tend\n\telseif e.key == KeyboardKey.LeftShift or e.key == KeyboardKey.RightShift then\n\t\tself.DebugShiftDown = true\n\telseif e.key == KeyboardKey.C then\n\t\tif self.DebugCtrlDown == true and self.DebugShiftDown == true then\n\t\t\tself:OpenDebugCardPicker()\n\t\tend\n\telseif e.key == KeyboardKey.E then\n\t\tif self.DebugCtrlDown == true and self.DebugShiftDown == true then\n\t\t\tself:CheatFillEnergy()\n\t\tend\n\tend\nend)\n_InputService:ConnectEvent(KeyUpEvent, function(e)\n\tif e.key == KeyboardKey.LeftControl then\n\t\tself.DebugCtrlDown = false\n\telseif e.key == KeyboardKey.LeftShift or e.key == KeyboardKey.RightShift then\n\t\tself.DebugShiftDown = false\n\tend\nend)", + "Code": "self.Cards = {\n\tStrike = { name = \"타격\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tBash = { name = \"강타\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, vuln = 2, class = \"warrior\", rarity = \"normal\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tDefend = { name = \"수비\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tAnger = { name = \"분노\", cost = 0, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tMoltenFist = { name = \"녹아내리는 주먹\", cost = 1, desc = \"피해 10, 취약 2. 소멸.\", kind = \"Attack\", damage = 10, vuln = 2, class = \"warrior\", rarity = \"normal\", exhaust = true, fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tBodySlam = { name = \"몸통 박치기\", cost = 1, desc = \"현재 방어도만큼 피해를 줍니다.\", kind = \"Attack\", damageFromCurrentBlock = 1, class = \"warrior\", rarity = \"normal\", fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tHeadbutt = { name = \"박치기\", cost = 1, desc = \"피해 9, 카드 1장 뽑기\", kind = \"Attack\", damage = 9, class = \"warrior\", rarity = \"normal\", draw = 1, fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tSwordBoomerang = { name = \"부메랑 칼날\", cost = 1, desc = \"무작위 적에게 피해 3 x 3회\", kind = \"Attack\", damage = 3, class = \"warrior\", rarity = \"normal\", hits = 3, randomTargetEachHit = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tSetupStrike = { name = \"사전 타격\", cost = 1, desc = \"피해 7, 힘 +2\", kind = \"Attack\", damage = 7, strength = 2, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tTwinStrike = { name = \"이중 타격\", cost = 1, desc = \"피해 5 x 2회\", kind = \"Attack\", damage = 5, class = \"warrior\", rarity = \"normal\", hits = 2, fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBreakthrough = { name = \"정면 돌파\", cost = 1, desc = \"모든 적에게 피해 9\", kind = \"Attack\", damage = 9, class = \"warrior\", rarity = \"normal\", aoe = true, fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tThunderclap = { name = \"천둥\", cost = 1, desc = \"모든 적에게 피해 4, 취약 1\", kind = \"Attack\", damage = 4, vuln = 1, class = \"warrior\", rarity = \"normal\", affectsAllEnemies = true, aoe = true, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"115e309771604743853abad2d8d186bc\" },\n\tIronWave = { name = \"철의 파동\", cost = 1, desc = \"피해 5, 방어도 5\", kind = \"Attack\", damage = 5, block = 5, class = \"warrior\", rarity = \"normal\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tPommelStrike = { name = \"폼멜 타격\", cost = 1, desc = \"피해 9, 카드 1장 뽑기\", kind = \"Attack\", damage = 9, class = \"warrior\", rarity = \"normal\", draw = 1, fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tPerfectedStrike = { name = \"완벽한 타격\", cost = 2, desc = \"피해 6. 보유한 이름에 \\\"타격\\\"이 포함된 카드마다 피해 +2\", kind = \"Attack\", damage = 6, damageNameMatch = \"타격\", damagePerOwnedNameMatch = 2, class = \"warrior\", rarity = \"normal\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tCinder = { name = \"잿불\", cost = 2, desc = \"피해 18. 소멸.\", kind = \"Attack\", damage = 18, class = \"warrior\", rarity = \"normal\", exhaust = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tBloodletting = { name = \"사혈\", cost = 0, desc = \"에너지 +2\", kind = \"Skill\", class = \"warrior\", rarity = \"normal\", gainEnergy = 2, image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tTremble = { name = \"떨림\", cost = 1, desc = \"취약 3. 소멸.\", kind = \"Skill\", vuln = 3, class = \"warrior\", rarity = \"normal\", exhaust = true, image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tArmaments = { name = \"전투장비\", cost = 1, desc = \"방어도 5, 카드 1장 뽑기\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", draw = 1, image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tTrueGrit = { name = \"진정한 끈기\", cost = 1, desc = \"방어도 7, 카드 1장 버리기\", kind = \"Skill\", block = 7, class = \"warrior\", rarity = \"normal\", discard = 1, image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tHavoc = { name = \"파괴\", cost = 1, desc = \"다음 스킬의 비용이 0\", kind = \"Skill\", class = \"warrior\", rarity = \"normal\", nextSkillCostZero = true, image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tShrugItOff = { name = \"흘려보내기\", cost = 1, desc = \"방어도 8, 카드 1장 뽑기\", kind = \"Skill\", block = 8, class = \"warrior\", rarity = \"normal\", draw = 1, image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tBloodWall = { name = \"피의 벽\", cost = 2, desc = \"방어도 16\", kind = \"Skill\", block = 16, class = \"warrior\", rarity = \"normal\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tWhirlwind = { name = \"소용돌이\", cost = 0, desc = \"모든 에너지를 사용해 에너지당 모든 적에게 피해 5\", kind = \"Attack\", damage = 0, class = \"warrior\", rarity = \"unique\", useAllEnergy = true, xDamagePerEnergy = 5, aoe = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tSpite = { name = \"악의\", cost = 0, desc = \"피해 5 x 2회\", kind = \"Attack\", damage = 5, class = \"warrior\", rarity = \"unique\", hits = 2, fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tBully = { name = \"협박\", cost = 0, desc = \"피해 4. 대상이 약화 상태면 피해 2배\", kind = \"Attack\", damage = 4, class = \"warrior\", rarity = \"unique\", attackDamageVsWeakMultiplier = 2, fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tPillage = { name = \"갈취\", cost = 1, desc = \"피해 6, 카드 2장 뽑기\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"unique\", draw = 2, fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tRampage = { name = \"광란\", cost = 2, desc = \"피해 12. 사용할 때마다 이번 전투에서 비용 1 감소\", kind = \"Attack\", damage = 12, class = \"warrior\", rarity = \"unique\", combatCostReductionOnPlay = 1, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tAshenStrike = { name = \"잿빛 타격\", cost = 1, desc = \"피해 6. 이번 전투에서 뽑은 카드마다 피해 +1\", kind = \"Attack\", damage = 6, damagePerCardDrawnThisCombat = 1, class = \"warrior\", rarity = \"unique\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tDismantle = { name = \"해체\", cost = 1, desc = \"피해 8 x 2회\", kind = \"Attack\", damage = 8, class = \"warrior\", rarity = \"unique\", hits = 2, fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"115e309771604743853abad2d8d186bc\" },\n\tHemokinesis = { name = \"혈류\", cost = 1, desc = \"피해 15\", kind = \"Attack\", damage = 15, class = \"warrior\", rarity = \"unique\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tFightMe = { name = \"덤벼라!\", cost = 2, desc = \"피해 5 x 2회, 힘 +3\", kind = \"Attack\", damage = 5, strength = 3, class = \"warrior\", rarity = \"unique\", hits = 2, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tUnrelenting = { name = \"무자비\", cost = 2, desc = \"피해 14, 에너지 +1\", kind = \"Attack\", damage = 14, class = \"warrior\", rarity = \"unique\", gainEnergy = 1, fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tUppercut = { name = \"어퍼컷\", cost = 2, desc = \"피해 12, 약화 1, 취약 1\", kind = \"Attack\", damage = 12, weak = 1, vuln = 1, class = \"warrior\", rarity = \"unique\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tBludgeon = { name = \"몽둥이질\", cost = 3, desc = \"피해 32\", kind = \"Attack\", damage = 32, class = \"warrior\", rarity = \"unique\", fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tHowlFromBeyond = { name = \"저편의 울음소리\", cost = 3, desc = \"모든 적에게 피해 16. 소멸.\", kind = \"Attack\", damage = 16, class = \"warrior\", rarity = \"unique\", exhaust = true, aoe = true, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tStomp = { name = \"짓밟기\", cost = 3, desc = \"모든 적에게 피해 12. 이번 턴 사용한 공격 카드마다 피해 +2\", kind = \"Attack\", damage = 12, damagePerAttackPlayedThisTurn = 2, class = \"warrior\", rarity = \"unique\", aoe = true, fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tRage = { name = \"격노\", cost = 0, desc = \"방어도 5, 카드 1장 뽑기\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"unique\", draw = 1, image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tBattleTrance = { name = \"전투 최면\", cost = 0, desc = \"카드 3장 뽑기. 이번 턴 더 뽑을 수 없음\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", draw = 3, drawDisabledThisTurn = true, image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tColossus = { name = \"거상\", cost = 1, desc = \"방어도 5, 무형 1\", kind = \"Skill\", intangible = 1, block = 5, class = \"warrior\", rarity = \"unique\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tSecondWind = { name = \"기사회생\", cost = 1, desc = \"손의 공격이 아닌 모든 카드를 소멸시키고, 소멸시킨 카드마다 방어도 5\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", exhaustHandNonAttack = true, blockPerExhaustedCard = 5, image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tTaunt = { name = \"도발\", cost = 1, desc = \"방어도 7, 취약 1\", kind = \"Skill\", block = 7, vuln = 1, class = \"warrior\", rarity = \"unique\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tBurningPact = { name = \"불타는 조약\", cost = 1, desc = \"카드 1장 버리고 카드 3장 뽑기\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", draw = 3, discard = 1, image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tEvilEye = { name = \"악마의 눈\", cost = 1, desc = \"방어도 16\", kind = \"Skill\", block = 16, class = \"warrior\", rarity = \"unique\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tForgottenRitual = { name = \"잊힌 의식\", cost = 1, desc = \"에너지 +2. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", gainEnergy = 2, exhaust = true, image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tDrumOfBattle = { name = \"전투의 북소리\", cost = 1, desc = \"카드 2장 뽑기, 에너지 +1. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", draw = 2, gainEnergy = 1, exhaust = true, image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tDominate = { name = \"제압\", cost = 1, desc = \"취약 2, 힘 +2. 소멸.\", kind = \"Skill\", strength = 2, vuln = 2, class = \"warrior\", rarity = \"unique\", exhaust = true, image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tInfernalBlade = { name = \"지옥검\", cost = 1, desc = \"무작위 공격 카드 1장을 손으로 가져옵니다. 이번 턴 동안 그 카드를 비용 없이 사용할 수 있습니다. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", addRandomCardCount = 1, addRandomCardKind = \"Attack\", addRandomCardSameClass = true, addedCardsCostZeroThisTurn = true, exhaust = true, image = \"115e309771604743853abad2d8d186bc\" },\n\tExpectAFight = { name = \"싸움 준비\", cost = 1, desc = \"이번 턴 스킬 비용 1 감소\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", skillCostReductionThisTurn = 1, image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tFlameBarrier = { name = \"화염 장벽\", cost = 2, desc = \"방어도 12, 가시 4\", kind = \"Skill\", block = 12, thorns = 4, class = \"warrior\", rarity = \"unique\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tStoneArmor = { name = \"돌 갑옷\", cost = 1, desc = \"매턴 방어도 +4\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 4, class = \"warrior\", rarity = \"unique\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tFeelNoPain = { name = \"무감각\", cost = 1, desc = \"매턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"warrior\", rarity = \"unique\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tInflame = { name = \"발화\", cost = 1, desc = \"매턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"unique\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tInferno = { name = \"불바다\", cost = 1, desc = \"매턴 모든 적에게 피해 6\", kind = \"Power\", powerEffect = \"damagePerTurn\", value = 6, class = \"warrior\", rarity = \"unique\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tJuggling = { name = \"저글링\", cost = 1, desc = \"카드를 사용할 때마다 무작위 적에게 피해 3\", kind = \"Power\", cardPlayedRandomDamage = 3, class = \"warrior\", rarity = \"unique\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tRupture = { name = \"파열\", cost = 1, desc = \"매턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"unique\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tVicious = { name = \"포악함\", cost = 1, desc = \"턴 시작 시 카드 1장 추가로 뽑기\", kind = \"Power\", class = \"warrior\", rarity = \"unique\", turnStartDraw = 1, image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tStampede = { name = \"쇄도\", cost = 2, desc = \"카드를 사용할 때마다 무작위 적에게 피해 8\", kind = \"Power\", cardPlayedRandomDamage = 8, class = \"warrior\", rarity = \"unique\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tPactsEnd = { name = \"조약의 끝\", cost = 0, desc = \"뽑을 카드 더미가 비었을 때 모든 적에게 피해 17\", kind = \"Attack\", damage = 17, class = \"warrior\", rarity = \"legend\", playableWhenDrawPileEmpty = true, aoe = true, fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tThrash = { name = \"난타\", cost = 1, desc = \"피해 4 x 2회. 이번 턴 사용한 공격 카드마다 피해 +2\", kind = \"Attack\", damage = 4, damagePerAttackPlayedThisTurn = 2, class = \"warrior\", rarity = \"legend\", hits = 2, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tConflagration = { name = \"대화재\", cost = 1, desc = \"모든 적에게 피해 2 x 4회\", kind = \"Attack\", damage = 2, class = \"warrior\", rarity = \"legend\", hits = 4, aoe = true, fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tFeed = { name = \"포식\", cost = 1, desc = \"피해를 10 줍니다. 치명타라면, 최대 체력이 3 증가합니다. 소멸.\", kind = \"Attack\", damage = 10, maxHpOnKill = 3, class = \"warrior\", rarity = \"legend\", exhaust = true, fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tTearAsunder = { name = \"갈가리 찢기\", cost = 2, desc = \"피해 5 x 3회\", kind = \"Attack\", damage = 5, class = \"warrior\", rarity = \"legend\", hits = 3, fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tFiendFire = { name = \"지옥불\", cost = 2, desc = \"손의 다른 카드마다 피해 +7 후 모두 버리기. 소멸.\", kind = \"Attack\", damage = 0, damagePerOtherHandCard = 7, class = \"warrior\", rarity = \"legend\", discardAll = true, exhaust = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tMangle = { name = \"난도질\", cost = 3, desc = \"피해 15. 이번 턴 적 힘 -10\", kind = \"Attack\", damage = 15, class = \"warrior\", rarity = \"legend\", enemyStrengthLossThisTurn = 10, fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tBrand = { name = \"낙인\", cost = 0, desc = \"카드 1장 버리기, 힘 +1\", kind = \"Skill\", strength = 1, class = \"warrior\", rarity = \"legend\", discard = 1, image = \"115e309771604743853abad2d8d186bc\" },\n\tCascade = { name = \"연쇄\", cost = 0, desc = \"뽑을 카드 더미 맨 위의 카드 X장을 사용합니다. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", playTopDrawPileCountPerEnergy = 1, useAllEnergy = true, exhaust = true, image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tPrimalForce = { name = \"원시의 힘\", cost = 0, desc = \"이번 턴 손의 카드 비용이 0\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", handCostZeroThisTurn = true, image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tOffering = { name = \"제물\", cost = 0, desc = \"에너지 +2, 카드 3장 뽑기. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", draw = 3, gainEnergy = 2, exhaust = true, image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tOneTwoPunch = { name = \"원투 펀치\", cost = 1, desc = \"다음 스킬을 1회 추가 발동\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", nextSkillRepeatCount = 1, image = \"251b6e12329048429490049a4f3cf564\" },\n\tStoke = { name = \"화력 증폭\", cost = 1, desc = \"손의 모든 카드를 소멸시키고, 소멸시킨 카드 수만큼 뽑습니다. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", exhaustHandAll = true, drawPerExhausted = 1, exhaust = true, image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tImpervious = { name = \"무적\", cost = 2, desc = \"방어도 30. 소멸.\", kind = \"Skill\", block = 30, class = \"warrior\", rarity = \"legend\", exhaust = true, image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tNotYet = { name = \"불굴\", cost = 2, desc = \"HP 10 회복. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", heal = 10, exhaust = true, image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tAggression = { name = \"공격성\", cost = 1, desc = \"턴 시작 시 카드 1장 추가로 뽑기\", kind = \"Power\", class = \"warrior\", rarity = \"legend\", turnStartDraw = 1, image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tCruelty = { name = \"악랄함\", cost = 1, desc = \"매턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tCrimsonMantle = { name = \"핏빛 망토\", cost = 1, desc = \"매턴 방어도 +8\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 8, class = \"warrior\", rarity = \"legend\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tPyre = { name = \"불의 심장\", cost = 2, desc = \"매턴 에너지 +1\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tDarkEmbrace = { name = \"어둠의 포옹\", cost = 2, desc = \"카드가 소멸될 때마다 카드 1장 뽑기\", kind = \"Power\", drawOnExhaust = 1, class = \"warrior\", rarity = \"legend\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tUnmovable = { name = \"요지부동\", cost = 2, desc = \"이번 전투 동안 방어도 획득량 2배\", kind = \"Power\", blockGainMultiplier = 2, powerEffect = \"blockPerTurn\", value = 0, class = \"warrior\", rarity = \"legend\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tJuggernaut = { name = \"절대적인 힘\", cost = 2, desc = \"카드를 사용할 때마다 무작위 적에게 피해 5\", kind = \"Power\", cardPlayedRandomDamage = 5, class = \"warrior\", rarity = \"legend\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tHellraiser = { name = \"지옥검무\", cost = 2, desc = \"이름에 \\\"타격\\\"이 포함된 카드를 뽑을 때마다, 무작위 적에게 사용합니다.\", kind = \"Power\", drawNameMatchAutoPlay = \"타격\", class = \"warrior\", rarity = \"legend\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tBarricade = { name = \"바리케이드\", cost = 3, desc = \"내 턴 시작 시 방어도가 사라지지 않습니다.\", kind = \"Power\", powerEffect = \"keepBlock\", value = 0, class = \"warrior\", rarity = \"legend\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tDemonForm = { name = \"악마의 형상\", cost = 3, desc = \"매턴 힘 +2\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 2, class = \"warrior\", rarity = \"legend\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tEnergyBolt = { name = \"에너지 볼트\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"magician\", rarity = \"normal\", fx = \"1d5877e1120a42d0907f204c959888b1\", image = \"e84880eaf89442128d3af2be5c80a74f\" },\n\tMagicGuard = { name = \"매직 가드\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"magician\", rarity = \"normal\", image = \"01b249c26eb34b8aaab774bf221907a1\" },\n\tMagicClaw = { name = \"매직 클로\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"magician\", rarity = \"normal\", hits = 2, fx = \"ba4ac7c8f24845b68b7e689b7effcc93\", image = \"f3fcac2d460041b288cc1973caaaf30f\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", discardAll = true, drawPerDiscarded = 1, image = \"7f70a9dc7e304433bb8121dd9c4df98b\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"7224cd3f9b7e497d9dd65f32a50865e4\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", fx = \"4a937e208875468eb63d891806fba3cd\", image = \"6fa15fd3a0004b409ea516c11a67e533\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"07200f3c74854022baa7ebbefdc4ad8c\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"06865473977849bebe79062dbd608944\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, fx = \"7d52f5e389bd4d44a30cf7cc54538f8f\", image = \"c6685d33cb2641f09d11cfa2d5cc820c\" },\n\tColdBeam = { name = \"콜드 빔\", cost = 2, desc = \"피해 7, 약화 2\", kind = \"Attack\", damage = 7, weak = 2, class = \"icelightning\", rarity = \"unique\", image = \"e8f7c148c79f497d83014e3361f59f5c\" },\n\tChillingStep = { name = \"칠링 스텝\", cost = 1, desc = \"방어도 8\", kind = \"Skill\", block = 8, class = \"icelightning\", rarity = \"unique\", image = \"bef20873a68a4651a91d74be457c2cfc\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"8b935b7d7066493cb462834bbe287c74\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"607fc5457c1c44a0993a5c2fe3fb0c68\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", fx = \"4faa7b78e09643cf86339b8b7cf2abac\", image = \"a80127195bf7471f9545b70e491f4719\" },\n\tWound = { name = \"상처\", cost = 0, desc = \"사용할 수 없다. 손패를 막는 저주.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true },\n\tBurn = { name = \"화상\", cost = 0, desc = \"사용 불가. 손패에 있으면 턴 종료 시 피해 2.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true, endTurnDamage = 2 },\n\tNeutralize = { name = \"커닝식 견제\", cost = 0, desc = \"피해를 3 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 3, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSilentStrike = { name = \"초보 도적의 칼끝\", cost = 1, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSurvivor = { name = \"골목길 생존술\", cost = 1, desc = \"방어도를 8 얻습니다. 카드를 1장 버립니다.\", kind = \"Skill\", block = 8, class = \"rogue\", rarity = \"normal\", discard = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSilentDefend = { name = \"낡은 가죽 방패\", cost = 1, desc = \"방어도를 5 얻습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 1, desc = \"피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"rogue\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해를 3만큼 3번 줍니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"unique\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"카드를 1장 뽑습니다. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"normal\", draw = 1, gainEnergy = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"rogue\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tFlashJump = { name = \"플래시 점프\", cost = 0, desc = \"방어도를 4 얻습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", draw = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNimbleBody = { name = \"님블 바디\", cost = 1, desc = \"민첩을 1 얻습니다. 매 턴 방어도를 2 얻습니다.\", kind = \"Power\", dex = 1, powerEffect = \"blockPerTurn\", value = 2, class = \"rogue\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSlice = { name = \"짧은 단검질\", cost = 0, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShiv = { name = \"표창\", cost = 0, desc = \"피해를 4 줍니다. 소멸.\", kind = \"Attack\", damage = 4, class = \"shiv\", rarity = \"normal\", exhaust = true, token = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerSpray = { name = \"단검비\", cost = 1, desc = \"모든 적에게 피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"thief\", rarity = \"normal\", hits = 2, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerThrow = { name = \"비도 투척\", cost = 1, desc = \"피해를 9 줍니다. 카드를 1장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Attack\", damage = 9, class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPoisonedStab = { name = \"초록 독단검\", cost = 1, desc = \"피해를 6 줍니다. 중독을 3 부여합니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", poison = 3, image = \"19361e72087946b1888684185b40d935\" },\n\tSuckerPunch = { name = \"골목 기습\", cost = 1, desc = \"피해를 7 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 7, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tLeadingStrike = { name = \"초보 표창 던지기\", cost = 1, desc = \"피해를 3 줍니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"normal\", addShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFollowThrough = { name = \"연달아 찌르기\", cost = 1, desc = \"피해를 7 줍니다. 손에 다른 카드가 5장 이상 있다면, 1번 추가로 적중합니다.\", kind = \"Attack\", damage = 7, otherHandAtLeast = 5, bonusHitsWhenOtherHandAtLeast = 1, class = \"thief\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlickFlack = { name = \"커닝 난무\", cost = 1, desc = \"교활. 모든 적에게 피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"thief\", rarity = \"normal\", sly = true, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tRicochet = { name = \"통통 튀는 표창\", cost = 2, desc = \"교활. 무작위 적에게 피해를 3만큼 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, sly = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPrepared = { name = \"비장의 패\", cost = 1, desc = \"카드를 1장 버리고, 이번 턴에 준 피해의 절반만큼 방어를 얻습니다.\", kind = \"Skill\", blockPerDamageDealtThisTurn = 0.5, class = \"thief\", rarity = \"normal\", discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tAnticipate = { name = \"럭키 예감\", cost = 0, desc = \"이번 턴 동안 민첩을 2 얻습니다.\", kind = \"Skill\", endTurnDexLoss = 2, dex = 2, class = \"rogue\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tDeflect = { name = \"단검 쳐내기\", cost = 0, desc = \"방어도를 4 얻습니다.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tBladeDance = { name = \"표창 별무리\", cost = 1, desc = \"표창을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", addShiv = 3, exhaust = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBackflip = { name = \"커닝 곡예\", cost = 1, desc = \"방어도를 5 얻습니다. 카드를 2장 뽑습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", draw = 2, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDodgeAndRoll = { name = \"골목 구르기\", cost = 1, desc = \"방어도를 4 얻습니다. 다음 턴에, 방어도를 4 얻습니다\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", nextTurnBlock = 4, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPiercingWail = { name = \"골목의 살기\", cost = 1, desc = \"이번 턴 동안 모든 적이 힘을 6 잃습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", affectsAllEnemies = true, enemyStrengthLossThisTurn = 6, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCloakAndDagger = { name = \"망토 속 별\", cost = 1, desc = \"방어도를 6 얻습니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Skill\", block = 6, class = \"assassin\", rarity = \"normal\", addShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDeadlyPoison = { name = \"맹독 조제\", cost = 1, desc = \"중독을 5 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 5, image = \"19361e72087946b1888684185b40d935\" },\n\tSnakebite = { name = \"독니 단검\", cost = 2, desc = \"보존. 중독을 7 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 7, retain = true, image = \"19361e72087946b1888684185b40d935\" },\n\tUntouchable = { name = \"연막 속 숨기\", cost = 2, desc = \"교활. 방어도를 6 얻습니다.\", kind = \"Skill\", block = 6, class = \"rogue\", rarity = \"normal\", sly = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSkewer = { name = \"꿰뚫는 표창\", cost = 2, desc = \"피해를 8만큼 X번 줍니다.\", kind = \"Attack\", class = \"assassin\", rarity = \"unique\", useAllEnergy = true, xDamagePerEnergy = 8, image = \"92a5020c978c46bdabab910598118b86\" },\n\tBackstab = { name = \"그림자 등찌르기\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 소멸.\", kind = \"Attack\", damage = 10, class = \"rogue\", rarity = \"unique\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPreciseCut = { name = \"급소 절개\", cost = 0, desc = \"피해를 13 줍니다. 손에 있는 다른 카드 1장당 피해량이 2 감소합니다.\", kind = \"Attack\", damage = 13, damagePerOtherHandCard = -2, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFinisher = { name = \"마지막 칼끝\", cost = 1, desc = \"이번 턴에 사용한 공격 카드 1장당 피해를 6 줍니다.\", kind = \"Attack\", damage = 0, damagePerAttackPlayedThisTurn = 6, class = \"thief\", rarity = \"unique\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMementoMori = { name = \"사신의 장부\", cost = 1, desc = \"피해를 9 줍니다. 이번 턴에 버린 카드 1장당 피해량이 4 증가합니다.\", kind = \"Attack\", damage = 9, damagePerDiscardedThisTurn = 4, class = \"thief\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStrangle = { name = \"그림자 올가미\", cost = 1, desc = \"피해를 8 줍니다.\", kind = \"Attack\", damage = 8, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlechettes = { name = \"표창 셈법\", cost = 1, desc = \"손에 있는 스킬 카드 1장당 피해를 5 줍니다.\", kind = \"Attack\", damage = 0, damagePerSkillInHand = 5, class = \"assassin\", rarity = \"unique\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPounce = { name = \"어둠을 가르는 도약\", cost = 2, desc = \"피해를 12 줍니다. 다음에 사용하는 스킬 카드의 비용이 0 이 됩니다.\", kind = \"Attack\", damage = 12, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDash = { name = \"뒷골목 돌파\", cost = 2, desc = \"방어도를 10 얻습니다. 피해를 10 줍니다.\", kind = \"Attack\", damage = 10, block = 10, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPredator = { name = \"표창 끝의 추격\", cost = 2, desc = \"피해를 15 줍니다. 다음 턴에, 카드를 2장 뽑습니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", nextTurnDraw = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPinpoint = { name = \"한 점 겨냥\", cost = 3, desc = \"피해를 15 줍니다. 이번 턴에 스킬을 사용할 때마다 비용이 1 감소합니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", skillCostReductionThisTurn = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tCalculatedGamble = { name = \"메소 건 승부\", cost = 0, desc = \"손에 있는 모든 카드를 버린 뒤, 버린 카드의 수만큼 카드를 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", discardAll = true, drawPerDiscarded = 1, exhaust = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpose = { name = \"약점 들추기\", cost = 0, desc = \"대상 적의 모든 인공물과 방어도를 제거합니다. 취약을 2 부여합니다. 소멸.\", kind = \"Skill\", vuln = 2, class = \"thief\", rarity = \"unique\", removeEnemyBlock = true, removeEnemyArtifact = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHiddenDaggers = { name = \"숨겨둔 표창\", cost = 0, desc = \"카드를 2장 버립니다. 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", discard = 2, addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tEscapePlan = { name = \"비상용 연막탄\", cost = 0, desc = \"카드를 1장 뽑습니다. 뽑은 카드가 스킬 카드라면, 방어도를 3 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"unique\", draw = 1, drawSkillBlock = 3, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tAcrobatics = { name = \"지붕 위 곡예\", cost = 1, desc = \"카드를 3장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 3, discard = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tHandTrick = { name = \"재빠른 손놀림\", cost = 1, desc = \"방어도를 7 얻습니다. 이번 턴 동안 손에 있는 스킬 카드 1장에 교활을 추가합니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpertise = { name = \"노련한 단검술\", cost = 1, desc = \"손에 있는 카드가 6장이 될 때까지 카드를 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", drawUntilHandSize = 6, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tBubbleBubble = { name = \"독액 농축\", cost = 1, desc = \"적이 중독을 보유하고 있다면, 중독을 9 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", poison = 9, poisonIfTargetPoisoned = true, image = \"19361e72087946b1888684185b40d935\" },\n\tBlur = { name = \"흐린 잔영\", cost = 1, desc = \"방어도를 5 얻습니다. 다음 턴 시작 시 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 5, class = \"thief\", rarity = \"unique\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tLegSweep = { name = \"발목 베기\", cost = 2, desc = \"약화를 2 부여합니다. 방어도를 11 얻습니다.\", kind = \"Skill\", block = 11, weak = 2, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tUpMySleeve = { name = \"소매 속 표창\", cost = 2, desc = \"표창을 3장 손으로 가져옵니다. 이 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", addShiv = 3, combatCostReductionOnPlay = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBouncingFlask = { name = \"통통 독병\", cost = 2, desc = \"무작위 적에게 중독을 3만큼 3번 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 3, poisonHits = 3, poisonRandomTargets = true, image = \"19361e72087946b1888684185b40d935\" },\n\tReflex = { name = \"찰나의 반응\", cost = 3, desc = \"교활. 카드를 2장 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 2, sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tHaze = { name = \"보랏빛 독연기\", cost = 3, desc = \"교활. 모든 적에게 중독을 4 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 4, sly = true, image = \"19361e72087946b1888684185b40d935\" },\n\tTactician = { name = \"골목길 책략\", cost = 3, desc = \"교활. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", gainEnergy = 1, sly = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tWellLaidPlans = { name = \"빈틈없는 작전\", cost = 1, desc = \"내 턴 종료 시, 카드를 최대 1장까지 보존합니다.\", kind = \"Power\", powerEffect = \"retainOne\", value = 1, class = \"thief\", rarity = \"unique\", image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tInfiniteBlades = { name = \"끝없는 표창통\", cost = 1, desc = \"내 턴 시작 시, 표창을 1장 손으로 가져옵니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", turnStartShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFootwork = { name = \"사뿐한 발놀림\", cost = 1, desc = \"민첩을 2 얻습니다.\", kind = \"Power\", dex = 2, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tOutbreak = { name = \"독맥 터뜨리기\", cost = 2, desc = \"독이 3번 부여될 때마다 모든 적에게 6 피해를 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 6, image = \"19361e72087946b1888684185b40d935\" },\n\tNoxiousFumes = { name = \"숨막히는 독연기\", cost = 1, desc = \"내 턴 시작 시, 모든 적에게 중독을 2 부여합니다.\", kind = \"Power\", powerEffect = \"poisonPerTurn\", value = 2, class = \"thief\", rarity = \"unique\", poison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tSpeedster = { name = \"그림자 속도전\", cost = 2, desc = \"내 턴 동안 카드를 뽑을 때마다, 모든 적에게 피해를 1 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", drawDamage = 1, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tGrandFinale = { name = \"커닝의 대단원\", cost = 0, desc = \"뽑을 카드 더미에 카드가 없을 때만 사용할 수 있습니다. 모든 적에게 피해를 45 줍니다.\", kind = \"Attack\", damage = 45, class = \"thiefmaster\", rarity = \"legend\", playableWhenDrawPileEmpty = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tAssassinate = { name = \"어둠 속 급소\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 취약을 1 부여합니다. 소멸.\", kind = \"Attack\", damage = 10, vuln = 1, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tEchoingSlash = { name = \"메아리 칼자국\", cost = 2, desc = \"모든 적에게 피해를 6 줍니다. 적을 처치할 때마다 이 효과를 반복합니다.\", kind = \"Attack\", damage = 10, class = \"thiefmaster\", rarity = \"legend\", repeatOnKill = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tTheHunt = { name = \"커닝 현상금\", cost = 1, desc = \"피해를 10 줍니다. 이 카드로 적을 처치하면 카드 보상을 추가로 얻습니다. 소멸.\", kind = \"Attack\", damage = 6, rewardOnKill = 1, class = \"assassin\", rarity = \"legend\", exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMurder = { name = \"쌓여가는 살의\", cost = 3, desc = \"피해를 1 줍니다. 이번 전투 동안 뽑은 카드 1장당 피해량이 1 증가합니다.\", kind = \"Attack\", damage = 1, damagePerCardDrawnThisCombat = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMalaise = { name = \"기운 빼는 독\", cost = 2, desc = \"에너지를 모두 사용하고, 사용한 에너지만큼 적에게 약화를 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", useAllEnergy = true, xWeakPerEnergy = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStormOfSteel = { name = \"쇠별 폭풍\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 버린 카드의 수만큼 표창을 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"legend\", discardAll = true, addShivPerDiscard = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStep = { name = \"그림자 발자국\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 다음 턴에, 공격 카드의 피해량이 2배가 됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", discardAll = true, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShadowmeld = { name = \"연막 속 은신\", cost = 1, desc = \"이번 턴 동안 얻는 방어도가 2배가 됩니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCorrosiveWave = { name = \"부식 독물결\", cost = 1, desc = \"이번 턴에 카드를 뽑을 때마다, 모든 적에게 중독을 2 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", drawPoison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tBladeOfInk = { name = \"먹빛 표창\", cost = 1, desc = \"잉크투성이 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBurst = { name = \"연속 술수\", cost = 1, desc = \"이번 턴에 다음에 사용하는 스킬 카드가 1번 추가로 사용됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextSkillRepeatCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKnifeTrap = { name = \"숨은 칼날덫\", cost = 2, desc = \"교활. 모든 적에게 피해를 7 주고 중독을 2 부여합니다.\", kind = \"Attack\", damage = 7, class = \"thiefmaster\", rarity = \"legend\", poison = 2, sly = true, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBulletTime = { name = \"멈춘 듯한 순간\", cost = 3, desc = \"이번 턴 동안 더 이상 카드를 뽑을 수 없습니다. 이번 턴 동안 손에 있는 모든 카드를 비용 없이 사용할 수 있습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", handCostZeroThisTurn = true, drawDisabledThisTurn = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNightmare = { name = \"검은 꿈\", cost = 3, desc = \"카드를 1장 선택합니다. 다음 턴에, 그 카드의 복사본을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextTurnCopies = 3, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tToolsOfTheTrade = { name = \"도적의 연장통\", cost = 1, desc = \"내 턴 시작 시, 카드를 1장 뽑고 카드를 1장 버립니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", turnStartDraw = 1, turnStartDiscard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMasterPlanner = { name = \"작전의 달인\", cost = 2, desc = \"사용한 스킬 카드는 교활해집니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", skillSlyOnPlay = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tFanOfKnives = { name = \"사방 표창비\", cost = 2, desc = \"표창이 이제 모든 적을 대상으로 합니다. 표창을 4장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 4, shivAoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSerpentForm = { name = \"독사의 몸놀림\", cost = 2, desc = \"카드를 사용할 때마다, 무작위 적에게 피해를 4 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 4, class = \"thiefmaster\", rarity = \"legend\", image = \"19361e72087946b1888684185b40d935\" },\n\tAbrasive = { name = \"거친 숫돌질\", cost = 2, desc = \"교활. 민첩을 1 얻습니다. 가시를 4 얻습니다.\", kind = \"Power\", dex = 1, thorns = 4, class = \"thiefmaster\", rarity = \"legend\", sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSuppress = { name = \"소리 없는 제압\", cost = 0, desc = \"선천성. 피해를 9 줍니다. 약화를 2 부여합니다. 소멸.\", kind = \"Attack\", damage = 9, weak = 2, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tWraithForm = { name = \"유령 같은 몸놀림\", cost = 3, desc = \"불가침을 2 얻습니다. 내 턴 종료 시 민첩을 1 잃습니다.\", kind = \"Power\", intangible = 2, endTurnDexLoss = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해를 3만큼 2번 줍니다. 이번 턴에 사용한 공격 카드 1장당 피해가 2 증가합니다.\", kind = \"Attack\", damage = 3, damagePerAttackPlayedThisTurn = 2, class = \"thief\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tCriticalEdge = { name = \"크리티컬 엣지\", cost = 1, desc = \"카드를 1장 뽑습니다. 다음 턴에 공격 카드의 피해량이 2배가 됩니다. 보존.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 1, nextTurnAttackMultiplier = 2, retain = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"피해를 3 줍니다. 이번 턴에 버린 카드 1장당 피해가 3 증가합니다. 에너지를 1 얻습니다.\", kind = \"Attack\", damage = 3, damagePerDiscardedThisTurn = 3, class = \"thief\", rarity = \"normal\", gainEnergy = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerAcceleration = { name = \"대거 액셀레이션\", cost = 0, desc = \"카드를 1장 뽑습니다. 카드를 1장 버립니다. 버린 카드마다 카드를 1장 더 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, drawPerDiscarded = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKarma = { name = \"카르마\", cost = 1, desc = \"피해를 7 줍니다. 방어도를 무시합니다. 약화 상태의 적에게는 피해가 2배가 됩니다.\", kind = \"Attack\", damage = 7, class = \"thief\", rarity = \"unique\", pierce = true, attackDamageVsWeakMultiplier = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tDaggerMastery = { name = \"대거 마스터리\", cost = 1, desc = \"카드를 사용할 때마다 방어도를 1 얻습니다. 매 턴 첫 카드의 피해가 3 증가합니다.\", kind = \"Power\", firstCardDamageBonus = 3, cardPlayedBlock = 1, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘을 1 얻습니다. 민첩을 1 얻습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"thief\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tShieldMastery = { name = \"실드 마스터리\", cost = 1, desc = \"방어도를 7 얻습니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"normal\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tThiefAgility = { name = \"시프 어질리티\", cost = 1, desc = \"방어도를 5 얻습니다. 이번 턴 동안 민첩을 1 얻습니다. 손의 다른 스킬 카드 1장이 교활해집니다.\", kind = \"Skill\", endTurnDexLoss = 1, block = 5, dex = 1, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tEdgeCarnival = { name = \"엣지 카니발\", cost = 1, desc = \"무작위 적에게 피해를 2만큼 4번 줍니다.\", kind = \"Attack\", damage = 2, class = \"thiefmaster\", rarity = \"unique\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tMuspelHeim = { name = \"무스펠 하임\", cost = 1, desc = \"모든 적에게 피해를 4 줍니다. 이번 턴에 버린 카드 1장당 피해가 2 증가합니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 4, damagePerDiscardedThisTurn = 2, weak = 1, class = \"thiefmaster\", rarity = \"unique\", aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMesoExplosion = { name = \"메소 익스플로젼\", cost = 1, desc = \"피해를 2 줍니다. 이번 턴에 버린 카드 1장당 피해가 7 증가합니다. 방어도를 무시합니다.\", kind = \"Attack\", damage = 2, damagePerDiscardedThisTurn = 7, class = \"thiefmaster\", rarity = \"unique\", pierce = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDarkFlare = { name = \"다크 플레어\", cost = 1, desc = \"매 턴 모든 적에게 피해를 2 줍니다. 카드를 사용할 때마다 무작위 적에게 피해를 2 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 2, powerEffect = \"damagePerTurn\", value = 2, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tPickPocket = { name = \"픽 파킷\", cost = 1, desc = \"카드를 1장 뽑습니다. 카드를 1장 버리고, 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", draw = 1, gainEnergy = 1, discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 선택합니다. 다음 턴에 그 카드의 복사본 1장을 손에 넣습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnCopies = 1, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요.\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tAdvancedDarkSight = { name = \"어드밴스드 다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", intangible = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tIntoDarkness = { name = \"인투 다크니스\", cost = 1, desc = \"모든 적에게 약화를 1 부여합니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", weak = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, affectsAllEnemies = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tVenom = { name = \"베놈\", cost = 1, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독을 1 부여합니다. 적 턴 시작 시 독이 한 번 더 적용됩니다.\", kind = \"Power\", attackPoison = 1, class = \"thiefmaster\", rarity = \"legend\", extraPoisonTicks = 1, image = \"19361e72087946b1888684185b40d935\" },\n\tGrid = { name = \"그리드\", cost = 2, desc = \"가시를 3 얻습니다. 카드를 사용할 때마다 방어도를 1 얻습니다.\", kind = \"Power\", thorns = 3, cardPlayedBlock = 1, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tRadicalDarkness = { name = \"래디컬 다크니스\", cost = 2, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShurikenBurst = { name = \"슈리켄 버스트\", cost = 1, desc = \"무작위 적에게 피해를 3씩 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tWindTalisman = { name = \"윈드 탈리스만\", cost = 1, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 스킬 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", draw = 1, skillCostReductionThisTurn = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMarkOfAssassin = { name = \"마크 오브 어쌔신\", cost = 1, desc = \"약화 1을 부여합니다. 약화 상태의 적에게 주는 공격 피해가 1.5배가 됩니다.\", kind = \"Power\", weak = 1, class = \"assassin\", rarity = \"unique\", attackDamageVsWeakMultiplier = 1.5, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowRush = { name = \"쉐도우 러쉬\", cost = 1, desc = \"피해 7, 방어도 5를 얻습니다.\", kind = \"Attack\", damage = 7, block = 5, class = \"assassin\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShadowLeap = { name = \"쉐도우 리프\", cost = 0, desc = \"방어도 4를 얻습니다. 다음 턴에 방어도 4를 얻습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"assassin\", rarity = \"normal\", nextTurnBlock = 4, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tShadowBlink = { name = \"쉐도우 블링크\", cost = 1, desc = \"무형 1을 얻습니다. 다음 스킬 카드의 비용이 0이 됩니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tJavelinMastery = { name = \"자벨린 마스터리\", cost = 1, desc = \"표창의 피해량이 2 증가합니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", shivDamageBonus = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tJavelinAcceleration = { name = \"자벨린 액셀레이션\", cost = 1, desc = \"카드를 2장 뽑습니다. 카드를 1장 버립니다. 표창 1장을 손에 넣습니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", draw = 2, discard = 1, addShiv = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 1, desc = \"피해를 6씩 2번 줍니다. 방어도를 무시합니다. 이번 턴 첫 카드라면 피해가 더 강해집니다.\", kind = \"Attack\", damage = 6, firstCardDamageBonus = 2, class = \"assassin\", rarity = \"unique\", hits = 2, pierce = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tAssassinPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘 1, 민첩 1을 얻고 카드를 1장 뽑습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"assassin\", rarity = \"normal\", draw = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tTripleThrow = { name = \"트리플 스로우\", cost = 1, desc = \"피해를 4씩 3번 줍니다.\", kind = \"Attack\", damage = 4, class = \"hermit\", rarity = \"normal\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShurikenChallenge = { name = \"슈리켄 챌린지\", cost = 1, desc = \"피해를 5씩 2번 줍니다. 다음 턴에 카드를 1장 더 뽑습니다.\", kind = \"Attack\", damage = 5, class = \"hermit\", rarity = \"unique\", hits = 2, nextTurnDraw = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitDarkFlare = { name = \"다크 플레어\", cost = 2, desc = \"매 턴 모든 적에게 피해 3을 줍니다. 턴 시작마다 표창 1장을 손에 넣습니다.\", kind = \"Power\", powerEffect = \"damagePerTurn\", value = 3, class = \"hermit\", rarity = \"unique\", turnStartShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 뽑습니다. 다음 턴 공격 카드의 피해가 2배가 됩니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSpiritJavelin = { name = \"스피릿 자벨린\", cost = 1, desc = \"표창이 턴 종료 시 사라지지 않습니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", firstShivDamageBonus = 4, shivRetain = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitRadicalDarkness = { name = \"래디컬 다크니스\", cost = 1, desc = \"방어도 4를 얻습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 소멸.\", kind = \"Skill\", block = 4, blockGainMultiplier = 2, class = \"hermit\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitVenom = { name = \"베놈\", cost = 2, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독 1을 부여합니다. 전투 중 독 부여 3회마다 모든 적에게 피해 8을 줍니다.\", kind = \"Power\", attackPoison = 1, class = \"hermit\", rarity = \"legend\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 8, image = \"19361e72087946b1888684185b40d935\" },\n\tSkilledJavelin = { name = \"숙련된 표창술\", cost = 1, desc = \"표창의 피해량이 2 증가합니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", shivDamageBonus = 2, firstShivDamageBonus = 4, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitAdrenaline = { name = \"아드레날린\", cost = 0, desc = \"에너지를 1 얻고 카드를 1장 뽑습니다. 표창 1장을 손에 넣습니다. 소멸.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, gainEnergy = 1, addShiv = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\trogue = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tcurse = \"rogue\",\n\tshiv = \"rogue\",\n\trogue = \"rogue\",\n\tassassin = \"rogue\",\n\thermit = \"rogue\",\n\tthief = \"rogue\",\n\tthiefmaster = \"rogue\",\n}\nself.NodeIcons = {\n\tcombat = \"f98db6823e894a4f90308d61f75894ac\",\n\telite = \"793ed8a757534b89a82f460747d2df24\",\n\tboss = \"423056cdbbc04f4da131b9721c404d96\",\n\tshop = \"da37e1fac55d455b9ade08569f09f798\",\n\trest = \"b86c1b0568bd45f3ae4a4b97e1b4a594\",\n\ttreasure = \"f8a6d58e20f54e2ca899485055df1ce4\",\n}\nself.ClassPortraits = {\n\twarrior = \"28c88fdc5ab44f34a8b3fc1e19d4ce78\",\n\tmagician = \"3b9ea1f066a744bb859df47fef817277\",\n\trogue = \"efa920e58d31426486ef974106e7dc8b\",\n}\nself.SoulShopDef = {\n\t{ key = \"meso\", name = \"두둑한 지갑\", desc = \"런 시작 시 메소 +60\", cost = 3 },\n\t{ key = \"hp\", name = \"단련된 육체\", desc = \"시작 최대 HP +15\", cost = 4 },\n\t{ key = \"trim\", name = \"덱 정제\", desc = \"시작 덱에서 기본 카드 1장 제거\", cost = 5 },\n\t{ key = \"relic\", name = \"유물 수집가\", desc = \"런 시작 시 유물 1개 추가\", cost = 6 },\n}\nself.SoulUnlocks = {}\nself.SoulPoints = self.SoulPoints or 0\nlocal uiTries = 0\nlocal uiInit = 0\nuiInit = _TimerService:SetTimerRepeat(function()\n\tuiTries = uiTries + 1\n\tif _EntityService:GetEntityByPath(\"/ui/DeckUIGroup\") ~= nil then\n\t\tself:ActivateUIGroups()\n\t\t-- MainMenu는 한동안 비활성화: 시작 시 바로 로비로 진입.\n\t\t-- 추후 싱글/멀티/종료 선택 메뉴가 필요하면 self:ShowMainMenu()로 되돌린다(메서드·UI 유지됨).\n\t\tself:ShowLobby()\n\t\t_TimerService:ClearTimer(uiInit)\n\telseif uiTries > 80 then\n\t\t_TimerService:ClearTimer(uiInit)\n\tend\nend, 0.1)\nlocal lp = _UserService.LocalPlayer\nif lp ~= nil then\n\tself:ReqLoadAscension(lp.PlayerComponent.UserId)\n\tself:ReqLoadSouls(lp.PlayerComponent.UserId)\nend\n_InputService:ConnectEvent(KeyDownEvent, function(e)\n\tif e.key == KeyboardKey.LeftControl then\n\t\tself.DebugCtrlDown = true\n\t\tlocal lp2 = _UserService.LocalPlayer\n\t\tif lp2 ~= nil and lp2.CurrentMapName == \"lobby\" and self.RunActive ~= true then\n\t\t\tself:PlayerAttackMotion()\n\t\tend\n\telseif e.key == KeyboardKey.LeftShift or e.key == KeyboardKey.RightShift then\n\t\tself.DebugShiftDown = true\n\telseif e.key == KeyboardKey.C then\n\t\tif self.DebugCtrlDown == true and self.DebugShiftDown == true then\n\t\t\tself:OpenDebugCardPicker()\n\t\tend\n\telseif e.key == KeyboardKey.E then\n\t\tif self.DebugCtrlDown == true and self.DebugShiftDown == true then\n\t\t\tself:CheatFillEnergy()\n\t\tend\n\tend\nend)\n_InputService:ConnectEvent(KeyUpEvent, function(e)\n\tif e.key == KeyboardKey.LeftControl then\n\t\tself.DebugCtrlDown = false\n\telseif e.key == KeyboardKey.LeftShift or e.key == KeyboardKey.RightShift then\n\t\tself.DebugShiftDown = false\n\tend\nend)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1852,7 +1866,7 @@ "Name": null }, "Arguments": [], - "Code": "if self.SelectedClass == \"magician\" then\n\tself.PlayerMaxHp = 70\nself.RunDeck = { \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicClaw\" }\nelseif self.SelectedClass == \"rogue\" then\n\tself.PlayerMaxHp = 70\n\tself.RunDeck = { \"SilentStrike\", \"SilentStrike\", \"SilentStrike\", \"SilentStrike\", \"SilentStrike\", \"SilentDefend\", \"SilentDefend\", \"SilentDefend\", \"SilentDefend\", \"SilentDefend\", \"Neutralize\", \"Survivor\" }\nelse\n\tself.PlayerMaxHp = 80\n\tself.RunDeck = { \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Defend\", \"Defend\", \"Defend\", \"Defend\", \"Bash\" }\nend\nself.PlayerMaxHp = self.PlayerMaxHp - self:AscStartHpPenalty()\nself.PlayerHp = self.PlayerMaxHp\nself.Gold = 0\nself.Floor = 1\nself.RunLength = 5\nself.RunActive = true\nself.RunRelics = {}\nself.RunPotions = {}\nself.PotionSlots = 3\nself.Potions = {\n\tredPotion = { name = \"빨간 포션\", desc = \"HP 20 회복\", effect = \"heal\", value = 20, icon = \"393e2a0d8da544899eaa8b22c97f832b\" },\n\tfirebomb = { name = \"화염병\", desc = \"적에게 피해 20\", effect = \"damage\", value = 20, icon = \"7ddb464c2574456289a4eb72ce86f193\" },\n\twarriorElixir = { name = \"전사의 물약\", desc = \"힘 +2\", effect = \"strength\", value = 2, icon = \"7cfbd410581e4073815daaf5f3e6c72f\" },\n\tguardPotion = { name = \"수호의 물약\", desc = \"방어도 +12\", effect = \"block\", value = 12, icon = \"8f8402dfa0f746e18bf606ed74302c0a\" },\n\tmanaElixir = { name = \"마나 엘릭서\", desc = \"에너지 +2\", effect = \"energy\", value = 2, icon = \"ec2778c366f6477ab0f8e7f06bcd73f4\" },\n\tcursedVial = { name = \"저주의 병\", desc = \"적에게 약화 3\", effect = \"weak\", value = 3, icon = \"a9a2763fdb6849dcba3028c737487680\" },\n}\nself.Relics = {\n\tironHeart = { name = \"강철 심장\", desc = \"전투 시작 시 방어도 +6\", hook = \"combatStart\", effect = \"block\", value = 6, icon = \"e555b3a62f3c49dbb2c53784e6bd481f\" },\n\tenergyCore = { name = \"에너지 코어\", desc = \"턴 시작 시 에너지 +1\", hook = \"turnStart\", effect = \"energy\", value = 1, icon = \"a41014f28b47434ab9f49ef104523862\" },\n\tvampire = { name = \"흡혈 송곳니\", desc = \"공격 카드 사용 시 HP +1\", hook = \"cardPlayed\", effect = \"healOnAttack\", value = 1, icon = \"ed64cde7e6c44b9e99502847e54f04e9\" },\n\tgoldIdol = { name = \"황금 우상\", desc = \"전투 승리 시 메소 +10\", hook = \"combatReward\", effect = \"gold\", value = 10, icon = \"03bb05c92b8f45edb0f3dad2e118fd5a\" },\n\tpotionBelt = { name = \"장인의 벨트\", desc = \"물약 슬롯이 5칸으로 늘어난다\", hook = \"passive\", effect = \"potionSlots\", value = 5, icon = \"36725b4566ac40d4902e2ab2113c2096\" },\n\tburningBlood = { name = \"자쿰의 투구\", desc = \"전투 승리 시 HP 6 회복\", hook = \"combatEnd\", effect = \"healOnWin\", value = 6, icon = \"07f994825ce34131b419d43e890c878d\" },\n\tvajra = { name = \"미스릴 해머\", desc = \"전투 시작 시 힘 +1\", hook = \"combatStart\", effect = \"strength\", value = 1, icon = \"59d2579d46dc41d590a9e6b141ad458b\" },\n\tanchor = { name = \"메이플 실드\", desc = \"첫 턴 방어도 +10\", hook = \"combatStart\", effect = \"block\", value = 10, icon = \"6349413e08cc49848862591863d056a0\" },\n\tbagOfPrep = { name = \"모험가의 배낭\", desc = \"첫 턴 드로우 +2\", hook = \"combatStart\", effect = \"draw\", value = 2, icon = \"77b240cb8af245b4801a714380267ae9\" },\n\tbloodVial = { name = \"피의 목걸이\", desc = \"전투 시작 시 HP 2 회복\", hook = \"combatStart\", effect = \"heal\", value = 2, icon = \"c782e949506a42c49eb139c7e65527d7\" },\n\tbronzeScales = { name = \"브론즈 체인메일\", desc = \"피격 시 공격자에게 3 반사\", hook = \"onPlayerDamaged\", effect = \"thorns\", value = 3, icon = \"87272346b145412391622cf803f888d1\" },\n\tstrawberry = { name = \"건강의 반지\", desc = \"획득 시 최대 HP +7\", hook = \"passive\", effect = \"maxHp\", value = 7, icon = \"58f643e29c354c2783a5ce9a72ec155c\" },\n\tpenNib = { name = \"황금 깃펜\", desc = \"10번째 공격마다 피해 2배\", hook = \"attackCalc\", effect = \"penNib\", value = 10, icon = \"4d38d721cc064d14b31b9e9a92754139\" },\n\tboot = { name = \"브론즈 부츠\", desc = \"5 미만 공격 피해가 5로\", hook = \"attackCalc\", effect = \"boot\", value = 5, icon = \"d572b3aa4dac4162aa0d9e551b055dce\" },\n\takabeko = { name = \"황소 투구\", desc = \"전투 첫 공격 피해 +8\", hook = \"attackCalc\", effect = \"akabeko\", value = 8, icon = \"eb3330a6e2274eff958639f8792119d3\" },\n\tcentennialPuzzle = { name = \"백년의 부적\", desc = \"전투 첫 피격 시 드로우 3\", hook = \"onPlayerDamaged\", effect = \"firstLossDraw\", value = 3, icon = \"cfe5ed6556b944fc83ab58b774bb2b73\" },\n\tmeatOnBone = { name = \"고기 망치\", desc = \"승리 시 HP 50% 이하면 12 회복\", hook = \"combatEnd\", effect = \"healIfLow\", value = 12, icon = \"a93e8e87f184411c98c96b877d9f8b10\" },\n\tselfFormingClay = { name = \"점토 갑옷\", desc = \"피해를 받으면 다음 턴 방어 +3\", hook = \"onPlayerDamaged\", effect = \"clayBlock\", value = 3, icon = \"bb446793c5204d5db7d33563fe79f648\" },\n\tchampionBelt = { name = \"챔피언 벨트\", desc = \"취약 부여 시 약화 1 추가\", hook = \"cardDebuff\", effect = \"vulnAddsWeak\", value = 1, icon = \"7ca8c63026034113a561d6adf679fed2\" },\n}\nself.RelicPool = { \"energyCore\", \"vampire\", \"goldIdol\", \"potionBelt\", \"burningBlood\", \"vajra\", \"anchor\", \"bagOfPrep\", \"bloodVial\", \"bronzeScales\", \"strawberry\", \"penNib\", \"boot\", \"akabeko\", \"centennialPuzzle\", \"meatOnBone\", \"selfFormingClay\", \"championBelt\" }\nself.Enemies = {\n\tslime = { name = \"슬라임\", maxHp = 45, intents = { { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 8 } } },\n\tslime_elite = { name = \"정예 슬라임\", maxHp = 70, intents = { { kind = \"Attack\", value = 14 }, { kind = \"Attack\", value = 8 }, { kind = \"Defend\", value = 10 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tslime_boss = { name = \"슬라임 킹\", maxHp = 120, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 12 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 22 } } },\n\torange_mushroom = { name = \"주황버섯\", maxHp = 16, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 4 }, { kind = \"Attack\", value = 8 } } },\n\tblue_mushroom = { name = \"파란버섯\", maxHp = 22, intents = { { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 10 }, { kind = \"AddCard\", value = 0, card = \"Wound\", count = 1 } } },\n\tpig = { name = \"돼지\", maxHp = 18, intents = { { kind = \"Attack\", value = 6 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 5 } } },\n\tgreen_mushroom = { name = \"초록버섯\", maxHp = 20, intents = { { kind = \"Attack\", value = 7 }, { kind = \"Defend\", value = 3 }, { kind = \"Attack\", value = 9 } } },\n\tred_snail = { name = \"빨간 달팽이\", maxHp = 14, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 6 }, { kind = \"Attack\", value = 7 } } },\n\tstump = { name = \"나무토막\", maxHp = 19, intents = { { kind = \"Defend\", value = 5 }, { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 6 } } },\n\tmushmom = { name = \"머쉬맘\", maxHp = 75, intents = { { kind = \"Defend\", value = 10 }, { kind = \"Debuff\", value = 2, effect = \"weak\" }, { kind = \"Attack\", value = 16 }, { kind = \"Attack\", value = 9 }, { kind = \"Defend\", value = 6 }, { kind = \"AddCard\", value = 0, card = \"Burn\", count = 1 } } },\n\tmodified_snail = { name = \"변형된 달팽이\", maxHp = 60, intents = { { kind = \"Attack\", value = 12 }, { kind = \"Defend\", value = 8 }, { kind = \"Attack\", value = 7 }, { kind = \"Attack\", value = 14 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tking_slime = { name = \"킹 슬라임\", maxHp = 130, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 14 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 12 }, { kind = \"Attack\", value = 24 } } },\n\toctopus = { name = \"문어\", maxHp = 15, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 4 } } },\n\tkapa_drake = { name = \"카파 드레이크\", maxHp = 24, intents = { { kind = \"Attack\", value = 9 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 6 }, { kind = \"Attack\", value = 11 } } },\n\tjunior_neki = { name = \"주니어 네키\", maxHp = 18, intents = { { kind = \"Attack\", value = 6 }, { kind = \"Attack\", value = 8 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tjunior_bugi = { name = \"주니어 부기\", maxHp = 20, intents = { { kind = \"Attack\", value = 7 }, { kind = \"Defend\", value = 5 }, { kind = \"Attack\", value = 9 } } },\n\tdile = { name = \"다일\", maxHp = 65, intents = { { kind = \"Attack\", value = 13 }, { kind = \"Defend\", value = 9 }, { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 16 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tmano = { name = \"마노\", maxHp = 80, intents = { { kind = \"Defend\", value = 12 }, { kind = \"Attack\", value = 14 }, { kind = \"Debuff\", value = 1, effect = \"vuln\" }, { kind = \"Attack\", value = 10 }, { kind = \"AddCard\", value = 0, card = \"Wound\", count = 1 } } },\n}\nself.CurrentNodeId = \"\"\nself.CurrentEnemyId = \"\"\nself.PlayerJob = \"\"\nself.Jobs = {\n\twarrior = {\n\t\t{ id = \"fighter\", name = \"파이터\", desc = \"공격 특화\\n콤보 어택 · 버서크\\n라이징 어택\", starter = \"ComboAttack\", tier = 2, parent = \"warrior\" },\n\t\t{ id = \"page\", name = \"페이지\", desc = \"속성 차지 특화\\n썬더/블리자드 차지\\n파워 가드\", starter = \"ThunderCharge\", tier = 2, parent = \"warrior\" },\n\t\t{ id = \"spearman\", name = \"스피어맨\", desc = \"방어·관통 특화\\n피어스 · 아이언 월\\n하이퍼 바디\", starter = \"Pierce\", tier = 2, parent = \"warrior\" },\n\t},\n\tfighter = {\n\t\t{ id = \"crusader\", name = \"크루세이더\", desc = \"Fighter의 3차 전직\\n콤보 압박과 화력 심화\\n파이터 카드 계승\", starter = \"\", tier = 3, parent = \"fighter\" },\n\t},\n\tpage = {\n\t\t{ id = \"knight\", name = \"나이트\", desc = \"Page의 3차 전직\\n방어와 차지 운영 심화\\n페이지 카드 계승\", starter = \"\", tier = 3, parent = \"page\" },\n\t},\n\tspearman = {\n\t\t{ id = \"berserker\", name = \"버서커\", desc = \"Spearman의 3차 전직\\n관통과 생존 운영 심화\\n스피어맨 카드 계승\", starter = \"\", tier = 3, parent = \"spearman\" },\n\t},\n\tmagician = {\n\t\t{ id = \"firepoison\", name = \"위자드(불·독)\", desc = \"화염·독 특화\\n파이어 애로우\\n포이즌 브레스 · 앰플\", starter = \"FireArrow\", tier = 2, parent = \"magician\" },\n\t\t{ id = \"icelightning\", name = \"위자드(썬·콜)\", desc = \"광역·빙결 특화\\n썬더 볼트(전체)\\n콜드 빔 · 칠링 스텝\", starter = \"ThunderBolt\", tier = 2, parent = \"magician\" },\n\t\t{ id = \"cleric\", name = \"클레릭\", desc = \"회복·축복 특화\\n힐 · 블레스\\n홀리 애로우\", starter = \"Heal\", tier = 2, parent = \"magician\" },\n\t},\n\trogue = {\n\t\t{ id = \"assassin\", name = \"Assassin\", desc = \"표창 중심 전직\\n표창 생성과 연속 공격\\n빠른 마무리\", starter = \"JavelinAcceleration\", tier = 2, parent = \"rogue\" },\n\t\t{ id = \"thief\", name = \"Thief\", desc = \"단검 중심 전직\\n드로우와 운영 강화\\n빠른 연계\", starter = \"DaggerAcceleration\", tier = 2, parent = \"rogue\" },\n\t},\n\tassassin = {\n\t\t{ id = \"hermit\", name = \"Hermit\", desc = \"Assassin의 3차 전직\\n표창 생성과 강화 심화\\n연속 공격 완성\", starter = \"SpiritJavelin\", tier = 3, parent = \"assassin\" },\n\t},\n\tthief = {\n\t\t{ id = \"thiefmaster\", name = \"Thief Master\", desc = \"Thief의 3차 전직\\n단검·교활·중독 심화\\n연계 운영 완성\", starter = \"Venom\", tier = 3, parent = \"thief\" },\n\t},\n}\nself.JobMeta = {\n\tfighter = { name = \"파이터\", starter = \"ComboAttack\", tier = 2, parent = \"warrior\", sourceClass = \"warrior\" },\n\tpage = { name = \"페이지\", starter = \"ThunderCharge\", tier = 2, parent = \"warrior\", sourceClass = \"warrior\" },\n\tspearman = { name = \"스피어맨\", starter = \"Pierce\", tier = 2, parent = \"warrior\", sourceClass = \"warrior\" },\n\tcrusader = { name = \"크루세이더\", starter = \"\", tier = 3, parent = \"fighter\", sourceClass = \"fighter\" },\n\tknight = { name = \"나이트\", starter = \"\", tier = 3, parent = \"page\", sourceClass = \"page\" },\n\tberserker = { name = \"버서커\", starter = \"\", tier = 3, parent = \"spearman\", sourceClass = \"spearman\" },\n\tfirepoison = { name = \"위자드(불·독)\", starter = \"FireArrow\", tier = 2, parent = \"magician\", sourceClass = \"magician\" },\n\ticelightning = { name = \"위자드(썬·콜)\", starter = \"ThunderBolt\", tier = 2, parent = \"magician\", sourceClass = \"magician\" },\n\tcleric = { name = \"클레릭\", starter = \"Heal\", tier = 2, parent = \"magician\", sourceClass = \"magician\" },\n\tassassin = { name = \"Assassin\", starter = \"JavelinAcceleration\", tier = 2, parent = \"rogue\", sourceClass = \"rogue\" },\n\tthief = { name = \"Thief\", starter = \"DaggerAcceleration\", tier = 2, parent = \"rogue\", sourceClass = \"rogue\" },\n\thermit = { name = \"Hermit\", starter = \"SpiritJavelin\", tier = 3, parent = \"assassin\", sourceClass = \"assassin\" },\n\tthiefmaster = { name = \"Thief Master\", starter = \"Venom\", tier = 3, parent = \"thief\", sourceClass = \"thief\" },\n}\nself.ClassGroups = {\n\twarrior = { \"warrior\", \"fighter\", \"crusader\", \"page\", \"knight\", \"spearman\", \"berserker\" },\n\tmagician = { \"magician\", \"firepoison\", \"icelightning\", \"cleric\" },\n\trogue = { \"rogue\", \"assassin\", \"hermit\", \"thief\", \"thiefmaster\" },\n}\nself.ClassLineages = {\n\twarrior = { \"warrior\" },\n\tfighter = { \"warrior\", \"fighter\" },\n\tcrusader = { \"warrior\", \"fighter\", \"crusader\" },\n\tpage = { \"warrior\", \"page\" },\n\tknight = { \"warrior\", \"page\", \"knight\" },\n\tspearman = { \"warrior\", \"spearman\" },\n\tberserker = { \"warrior\", \"spearman\", \"berserker\" },\n\tmagician = { \"magician\" },\n\tfirepoison = { \"magician\", \"firepoison\" },\n\ticelightning = { \"magician\", \"icelightning\" },\n\tcleric = { \"magician\", \"cleric\" },\n\trogue = { \"rogue\" },\n\tassassin = { \"rogue\", \"assassin\" },\n\thermit = { \"rogue\", \"assassin\", \"hermit\" },\n\tthief = { \"rogue\", \"thief\" },\n\tthiefmaster = { \"rogue\", \"thief\", \"thiefmaster\" },\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\trogue = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tcurse = \"rogue\",\n\tshiv = \"rogue\",\n\trogue = \"rogue\",\n\tassassin = \"rogue\",\n\thermit = \"rogue\",\n\tthief = \"rogue\",\n\tthiefmaster = \"rogue\",\n}\nself.NodeIcons = {\n\tcombat = \"f98db6823e894a4f90308d61f75894ac\",\n\telite = \"793ed8a757534b89a82f460747d2df24\",\n\tboss = \"423056cdbbc04f4da131b9721c404d96\",\n\tshop = \"da37e1fac55d455b9ade08569f09f798\",\n\trest = \"b86c1b0568bd45f3ae4a4b97e1b4a594\",\n\ttreasure = \"f8a6d58e20f54e2ca899485055df1ce4\",\n}\nself.ClassPortraits = {\n\twarrior = \"28c88fdc5ab44f34a8b3fc1e19d4ce78\",\n\tmagician = \"3b9ea1f066a744bb859df47fef817277\",\n\trogue = \"efa920e58d31426486ef974106e7dc8b\",\n}\nself:GenerateMap()\nself:BindButtons()\nself:AddRelic(\"ironHeart\")\nself:ApplySoulUnlocks()\nself:RenderPotions()\nself:TeleportToActMap()\nself:ShowMap()", + "Code": "if self.SelectedClass == \"magician\" then\n\tself.PlayerMaxHp = 70\nself.RunDeck = { \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicClaw\" }\nelseif self.SelectedClass == \"rogue\" then\n\tself.PlayerMaxHp = 70\n\tself.RunDeck = { \"SilentStrike\", \"SilentStrike\", \"SilentStrike\", \"SilentStrike\", \"SilentStrike\", \"SilentDefend\", \"SilentDefend\", \"SilentDefend\", \"SilentDefend\", \"SilentDefend\", \"Neutralize\", \"Survivor\" }\nelse\n\tself.PlayerMaxHp = 80\n\tself.RunDeck = { \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Defend\", \"Defend\", \"Defend\", \"Defend\", \"Bash\" }\nend\nself.PlayerMaxHp = self.PlayerMaxHp - self:AscStartHpPenalty()\nself.PlayerHp = self.PlayerMaxHp\nself.Gold = 0\nself.Floor = 1\nself.RunLength = 5\nself.RunActive = true\nself.RunRelics = {}\nself.RunPotions = {}\nself.PotionSlots = 3\nself.Potions = {\n\tredPotion = { name = \"빨간 포션\", desc = \"HP 20 회복\", effect = \"heal\", value = 20, icon = \"393e2a0d8da544899eaa8b22c97f832b\" },\n\tfirebomb = { name = \"화염병\", desc = \"적에게 피해 20\", effect = \"damage\", value = 20, icon = \"7ddb464c2574456289a4eb72ce86f193\" },\n\twarriorElixir = { name = \"전사의 물약\", desc = \"힘 +2\", effect = \"strength\", value = 2, icon = \"7cfbd410581e4073815daaf5f3e6c72f\" },\n\tguardPotion = { name = \"수호의 물약\", desc = \"방어도 +12\", effect = \"block\", value = 12, icon = \"8f8402dfa0f746e18bf606ed74302c0a\" },\n\tmanaElixir = { name = \"마나 엘릭서\", desc = \"에너지 +2\", effect = \"energy\", value = 2, icon = \"ec2778c366f6477ab0f8e7f06bcd73f4\" },\n\tcursedVial = { name = \"저주의 병\", desc = \"적에게 약화 3\", effect = \"weak\", value = 3, icon = \"a9a2763fdb6849dcba3028c737487680\" },\n}\nself.Relics = {\n\tironHeart = { name = \"강철 심장\", desc = \"전투 시작 시 방어도 +6\", hook = \"combatStart\", effect = \"block\", value = 6, icon = \"e555b3a62f3c49dbb2c53784e6bd481f\" },\n\tenergyCore = { name = \"에너지 코어\", desc = \"턴 시작 시 에너지 +1\", hook = \"turnStart\", effect = \"energy\", value = 1, icon = \"a41014f28b47434ab9f49ef104523862\" },\n\tvampire = { name = \"흡혈 송곳니\", desc = \"공격 카드 사용 시 HP +1\", hook = \"cardPlayed\", effect = \"healOnAttack\", value = 1, icon = \"ed64cde7e6c44b9e99502847e54f04e9\" },\n\tgoldIdol = { name = \"황금 우상\", desc = \"전투 승리 시 메소 +10\", hook = \"combatReward\", effect = \"gold\", value = 10, icon = \"03bb05c92b8f45edb0f3dad2e118fd5a\" },\n\tpotionBelt = { name = \"장인의 벨트\", desc = \"물약 슬롯이 5칸으로 늘어난다\", hook = \"passive\", effect = \"potionSlots\", value = 5, icon = \"36725b4566ac40d4902e2ab2113c2096\" },\n\tburningBlood = { name = \"자쿰의 투구\", desc = \"전투 승리 시 HP 6 회복\", hook = \"combatEnd\", effect = \"healOnWin\", value = 6, icon = \"07f994825ce34131b419d43e890c878d\" },\n\tvajra = { name = \"미스릴 해머\", desc = \"전투 시작 시 힘 +1\", hook = \"combatStart\", effect = \"strength\", value = 1, icon = \"59d2579d46dc41d590a9e6b141ad458b\" },\n\tanchor = { name = \"메이플 실드\", desc = \"첫 턴 방어도 +10\", hook = \"combatStart\", effect = \"block\", value = 10, icon = \"6349413e08cc49848862591863d056a0\" },\n\tbagOfPrep = { name = \"모험가의 배낭\", desc = \"첫 턴 드로우 +2\", hook = \"combatStart\", effect = \"draw\", value = 2, icon = \"77b240cb8af245b4801a714380267ae9\" },\n\tbloodVial = { name = \"피의 목걸이\", desc = \"전투 시작 시 HP 2 회복\", hook = \"combatStart\", effect = \"heal\", value = 2, icon = \"c782e949506a42c49eb139c7e65527d7\" },\n\tbronzeScales = { name = \"브론즈 체인메일\", desc = \"피격 시 공격자에게 3 반사\", hook = \"onPlayerDamaged\", effect = \"thorns\", value = 3, icon = \"87272346b145412391622cf803f888d1\" },\n\tstrawberry = { name = \"건강의 반지\", desc = \"획득 시 최대 HP +7\", hook = \"passive\", effect = \"maxHp\", value = 7, icon = \"58f643e29c354c2783a5ce9a72ec155c\" },\n\tpenNib = { name = \"황금 깃펜\", desc = \"10번째 공격마다 피해 2배\", hook = \"attackCalc\", effect = \"penNib\", value = 10, icon = \"4d38d721cc064d14b31b9e9a92754139\" },\n\tboot = { name = \"브론즈 부츠\", desc = \"5 미만 공격 피해가 5로\", hook = \"attackCalc\", effect = \"boot\", value = 5, icon = \"d572b3aa4dac4162aa0d9e551b055dce\" },\n\takabeko = { name = \"황소 투구\", desc = \"전투 첫 공격 피해 +8\", hook = \"attackCalc\", effect = \"akabeko\", value = 8, icon = \"eb3330a6e2274eff958639f8792119d3\" },\n\tcentennialPuzzle = { name = \"백년의 부적\", desc = \"전투 첫 피격 시 드로우 3\", hook = \"onPlayerDamaged\", effect = \"firstLossDraw\", value = 3, icon = \"cfe5ed6556b944fc83ab58b774bb2b73\" },\n\tmeatOnBone = { name = \"고기 망치\", desc = \"승리 시 HP 50% 이하면 12 회복\", hook = \"combatEnd\", effect = \"healIfLow\", value = 12, icon = \"a93e8e87f184411c98c96b877d9f8b10\" },\n\tselfFormingClay = { name = \"점토 갑옷\", desc = \"피해를 받으면 다음 턴 방어 +3\", hook = \"onPlayerDamaged\", effect = \"clayBlock\", value = 3, icon = \"bb446793c5204d5db7d33563fe79f648\" },\n\tchampionBelt = { name = \"챔피언 벨트\", desc = \"취약 부여 시 약화 1 추가\", hook = \"cardDebuff\", effect = \"vulnAddsWeak\", value = 1, icon = \"7ca8c63026034113a561d6adf679fed2\" },\n}\nself.RelicPool = { \"energyCore\", \"vampire\", \"goldIdol\", \"potionBelt\", \"burningBlood\", \"vajra\", \"anchor\", \"bagOfPrep\", \"bloodVial\", \"bronzeScales\", \"strawberry\", \"penNib\", \"boot\", \"akabeko\", \"centennialPuzzle\", \"meatOnBone\", \"selfFormingClay\", \"championBelt\" }\nself.Enemies = {\n\tslime = { name = \"슬라임\", maxHp = 45, intents = { { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 8 } } },\n\tslime_elite = { name = \"정예 슬라임\", maxHp = 70, intents = { { kind = \"Attack\", value = 14 }, { kind = \"Attack\", value = 8 }, { kind = \"Defend\", value = 10 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tslime_boss = { name = \"슬라임 킹\", maxHp = 120, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 12 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 22 } } },\n\torange_mushroom = { name = \"주황버섯\", maxHp = 16, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 4 }, { kind = \"Attack\", value = 8 } } },\n\tblue_mushroom = { name = \"파란버섯\", maxHp = 22, intents = { { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 10 }, { kind = \"AddCard\", value = 0, card = \"Wound\", count = 1 } } },\n\tpig = { name = \"돼지\", maxHp = 18, intents = { { kind = \"Attack\", value = 6 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 5 } } },\n\tgreen_mushroom = { name = \"초록버섯\", maxHp = 20, intents = { { kind = \"Attack\", value = 7 }, { kind = \"Defend\", value = 3 }, { kind = \"Attack\", value = 9 } } },\n\tred_snail = { name = \"빨간 달팽이\", maxHp = 14, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 6 }, { kind = \"Attack\", value = 7 } } },\n\tstump = { name = \"나무토막\", maxHp = 19, intents = { { kind = \"Defend\", value = 5 }, { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 6 } } },\n\tmushmom = { name = \"머쉬맘\", maxHp = 75, intents = { { kind = \"Defend\", value = 10 }, { kind = \"Debuff\", value = 2, effect = \"weak\" }, { kind = \"Attack\", value = 16 }, { kind = \"Attack\", value = 9 }, { kind = \"Defend\", value = 6 }, { kind = \"AddCard\", value = 0, card = \"Burn\", count = 1 } } },\n\tmodified_snail = { name = \"변형된 달팽이\", maxHp = 60, intents = { { kind = \"Attack\", value = 12 }, { kind = \"Defend\", value = 8 }, { kind = \"Attack\", value = 7 }, { kind = \"Attack\", value = 14 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tking_slime = { name = \"킹 슬라임\", maxHp = 130, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 14 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 12 }, { kind = \"Attack\", value = 24 } } },\n\toctopus = { name = \"문어\", maxHp = 15, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 4 } } },\n\tkapa_drake = { name = \"카파 드레이크\", maxHp = 24, intents = { { kind = \"Attack\", value = 9 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 6 }, { kind = \"Attack\", value = 11 } } },\n\tjunior_neki = { name = \"주니어 네키\", maxHp = 18, intents = { { kind = \"Attack\", value = 6 }, { kind = \"Attack\", value = 8 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tjunior_bugi = { name = \"주니어 부기\", maxHp = 20, intents = { { kind = \"Attack\", value = 7 }, { kind = \"Defend\", value = 5 }, { kind = \"Attack\", value = 9 } } },\n\tdile = { name = \"다일\", maxHp = 65, intents = { { kind = \"Attack\", value = 13 }, { kind = \"Defend\", value = 9 }, { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 16 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tmano = { name = \"마노\", maxHp = 80, intents = { { kind = \"Defend\", value = 12 }, { kind = \"Attack\", value = 14 }, { kind = \"Debuff\", value = 1, effect = \"vuln\" }, { kind = \"Attack\", value = 10 }, { kind = \"AddCard\", value = 0, card = \"Wound\", count = 1 } } },\n}\nself.CurrentNodeId = \"\"\nself.CurrentEnemyId = \"\"\nself.PlayerJob = \"\"\nself.Jobs = {\n\twarrior = {\n\t\t{ id = \"fighter\", name = \"파이터\", desc = \"연속 공격 계열\\n이중 타격 · 난타\\n악마의 형상\", starter = \"TwinStrike\", tier = 2, parent = \"warrior\" },\n\t\t{ id = \"page\", name = \"페이지\", desc = \"방어·운영 계열\\n전투의 북소리 · 무적\\n바리케이드\", starter = \"DrumOfBattle\", tier = 2, parent = \"warrior\" },\n\t\t{ id = \"spearman\", name = \"스피어맨\", desc = \"광역·장기전 계열\\n대화재 · 소용돌이\\n불의 심장\", starter = \"Conflagration\", tier = 2, parent = \"warrior\" },\n\t},\n\tfighter = {\n\t\t{ id = \"crusader\", name = \"크루세이더\", desc = \"파이터의 3차 전직\\n아이언클래드 공격 풀 계승\\n전사 카드 사용\", starter = \"\", tier = 3, parent = \"fighter\" },\n\t},\n\tpage = {\n\t\t{ id = \"knight\", name = \"나이트\", desc = \"페이지의 3차 전직\\n아이언클래드 운영 풀 계승\\n전사 카드 사용\", starter = \"\", tier = 3, parent = \"page\" },\n\t},\n\tspearman = {\n\t\t{ id = \"berserker\", name = \"버서커\", desc = \"스피어맨의 3차 전직\\n아이언클래드 장기전 풀 계승\\n전사 카드 사용\", starter = \"\", tier = 3, parent = \"spearman\" },\n\t},\n\tmagician = {\n\t\t{ id = \"firepoison\", name = \"위자드(불·독)\", desc = \"화염·독 특화\\n파이어 애로우\\n포이즌 브레스 · 앰플\", starter = \"FireArrow\", tier = 2, parent = \"magician\" },\n\t\t{ id = \"icelightning\", name = \"위자드(썬·콜)\", desc = \"광역·빙결 특화\\n썬더 볼트(전체)\\n콜드 빔 · 칠링 스텝\", starter = \"ThunderBolt\", tier = 2, parent = \"magician\" },\n\t\t{ id = \"cleric\", name = \"클레릭\", desc = \"회복·축복 특화\\n힐 · 블레스\\n홀리 애로우\", starter = \"Heal\", tier = 2, parent = \"magician\" },\n\t},\n\trogue = {\n\t\t{ id = \"assassin\", name = \"Assassin\", desc = \"표창 중심 전직\\n표창 생성과 연속 공격\\n빠른 마무리\", starter = \"JavelinAcceleration\", tier = 2, parent = \"rogue\" },\n\t\t{ id = \"thief\", name = \"Thief\", desc = \"단검 중심 전직\\n드로우와 운영 강화\\n빠른 연계\", starter = \"DaggerAcceleration\", tier = 2, parent = \"rogue\" },\n\t},\n\tassassin = {\n\t\t{ id = \"hermit\", name = \"Hermit\", desc = \"Assassin의 3차 전직\\n표창 생성과 강화 심화\\n연속 공격 완성\", starter = \"SpiritJavelin\", tier = 3, parent = \"assassin\" },\n\t},\n\tthief = {\n\t\t{ id = \"thiefmaster\", name = \"Thief Master\", desc = \"Thief의 3차 전직\\n단검·교활·중독 심화\\n연계 운영 완성\", starter = \"Venom\", tier = 3, parent = \"thief\" },\n\t},\n}\nself.JobMeta = {\n\tfighter = { name = \"파이터\", starter = \"TwinStrike\", tier = 2, parent = \"warrior\", sourceClass = \"warrior\" },\n\tpage = { name = \"페이지\", starter = \"DrumOfBattle\", tier = 2, parent = \"warrior\", sourceClass = \"warrior\" },\n\tspearman = { name = \"스피어맨\", starter = \"Conflagration\", tier = 2, parent = \"warrior\", sourceClass = \"warrior\" },\n\tcrusader = { name = \"크루세이더\", starter = \"\", tier = 3, parent = \"fighter\", sourceClass = \"fighter\" },\n\tknight = { name = \"나이트\", starter = \"\", tier = 3, parent = \"page\", sourceClass = \"page\" },\n\tberserker = { name = \"버서커\", starter = \"\", tier = 3, parent = \"spearman\", sourceClass = \"spearman\" },\n\tfirepoison = { name = \"위자드(불·독)\", starter = \"FireArrow\", tier = 2, parent = \"magician\", sourceClass = \"magician\" },\n\ticelightning = { name = \"위자드(썬·콜)\", starter = \"ThunderBolt\", tier = 2, parent = \"magician\", sourceClass = \"magician\" },\n\tcleric = { name = \"클레릭\", starter = \"Heal\", tier = 2, parent = \"magician\", sourceClass = \"magician\" },\n\tassassin = { name = \"Assassin\", starter = \"JavelinAcceleration\", tier = 2, parent = \"rogue\", sourceClass = \"rogue\" },\n\tthief = { name = \"Thief\", starter = \"DaggerAcceleration\", tier = 2, parent = \"rogue\", sourceClass = \"rogue\" },\n\thermit = { name = \"Hermit\", starter = \"SpiritJavelin\", tier = 3, parent = \"assassin\", sourceClass = \"assassin\" },\n\tthiefmaster = { name = \"Thief Master\", starter = \"Venom\", tier = 3, parent = \"thief\", sourceClass = \"thief\" },\n}\nself.ClassGroups = {\n\twarrior = { \"warrior\", \"fighter\", \"crusader\", \"page\", \"knight\", \"spearman\", \"berserker\" },\n\tmagician = { \"magician\", \"firepoison\", \"icelightning\", \"cleric\" },\n\trogue = { \"rogue\", \"assassin\", \"hermit\", \"thief\", \"thiefmaster\" },\n}\nself.ClassLineages = {\n\twarrior = { \"warrior\" },\n\tfighter = { \"warrior\", \"fighter\" },\n\tcrusader = { \"warrior\", \"fighter\", \"crusader\" },\n\tpage = { \"warrior\", \"page\" },\n\tknight = { \"warrior\", \"page\", \"knight\" },\n\tspearman = { \"warrior\", \"spearman\" },\n\tberserker = { \"warrior\", \"spearman\", \"berserker\" },\n\tmagician = { \"magician\" },\n\tfirepoison = { \"magician\", \"firepoison\" },\n\ticelightning = { \"magician\", \"icelightning\" },\n\tcleric = { \"magician\", \"cleric\" },\n\trogue = { \"rogue\" },\n\tassassin = { \"rogue\", \"assassin\" },\n\thermit = { \"rogue\", \"assassin\", \"hermit\" },\n\tthief = { \"rogue\", \"thief\" },\n\tthiefmaster = { \"rogue\", \"thief\", \"thiefmaster\" },\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\trogue = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tcurse = \"rogue\",\n\tshiv = \"rogue\",\n\trogue = \"rogue\",\n\tassassin = \"rogue\",\n\thermit = \"rogue\",\n\tthief = \"rogue\",\n\tthiefmaster = \"rogue\",\n}\nself.NodeIcons = {\n\tcombat = \"f98db6823e894a4f90308d61f75894ac\",\n\telite = \"793ed8a757534b89a82f460747d2df24\",\n\tboss = \"423056cdbbc04f4da131b9721c404d96\",\n\tshop = \"da37e1fac55d455b9ade08569f09f798\",\n\trest = \"b86c1b0568bd45f3ae4a4b97e1b4a594\",\n\ttreasure = \"f8a6d58e20f54e2ca899485055df1ce4\",\n}\nself.ClassPortraits = {\n\twarrior = \"28c88fdc5ab44f34a8b3fc1e19d4ce78\",\n\tmagician = \"3b9ea1f066a744bb859df47fef817277\",\n\trogue = \"efa920e58d31426486ef974106e7dc8b\",\n}\nself:GenerateMap()\nself:BindButtons()\nself:AddRelic(\"ironHeart\")\nself:ApplySoulUnlocks()\nself:RenderPotions()\nself:TeleportToActMap()\nself:ShowMap()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1882,7 +1896,7 @@ "Name": null }, "Arguments": [], - "Code": "self:ShowState(\"combat\")\nself:KickCombatCamera()\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/Result\", false)\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/PotionMenu\", false)\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/TooltipBox\", false)\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/DiscardPrompt\", false)\nself:SetText(\"/ui/RunUIGroup/CombatHud/PlayerPanel/Name\", self:JobLabel())\nself.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.BlockGainMultiplier = 1\nself.CardsDrawnThisCombat = 0\nself.HandCostZeroThisTurn = false\nself.DrawDisabledThisTurn = false\nself.NextSkillCostZero = false\nself.NextSkillRepeatCount = 0\nself.SkillCostReductionThisTurn = 0\nself.CombatCardCostReduction = {}\nself.SkillSlyOnPlayCards = {}\nself.TurnSkillSlyCards = {}\nself.ShivFirstDamageBonusUsed = false\nself.ActiveAttackDamageVsWeakMultiplier = 1\nself.DrawDamageThisTurn = 0\nself.DrawPoisonThisTurn = 0\nself.ShivAoeThisCombat = false\nself.PoisonApplicationsThisCombat = 0\nself.EnemyStrengthLossThisTurn = 0\nself.PlayerStr = 0\nself.PlayerDex = 0\nself.PlayerThorns = 0\nself.PlayerWeak = 0\nself.PlayerVuln = 0\nself.PlayerIntangible = 0\nself.BonusRewardScreens = 0\nself.ActiveKillReward = 0\nself.PlayerPowers = {}\nself.FightAttackCount = 0\nself.TurnAttackCardsPlayed = 0\nself.TurnDiscardedCards = 0\nself.TurnCardsPlayedThisTurn = 0\nself.DamageDealtThisTurn = 0\nself.DmgPopSeq = 0\nself.FirstHpLossDone = false\nself.ClayBlockNext = 0\nself.DiscardSelectRemaining = 0\nself.DiscardSelectTotal = 0\nself.DiscardPostShiv = 0\nself.DiscardShivPerPick = 0\nself.RetainSelectActive = false\nself.ReserveSelectActive = false\nself.NextTurnBlock = 0\nself.NextTurnDraw = 0\nself.NextTurnKeepBlock = false\nself.NextTurnAttackMultiplier = 1\nself.TurnAttackMultiplier = 1\nself.NextTurnSelectPrompt = \"\"\nself.NextTurnSelectCopies = 0\nself.NextTurnAddCards = {}\nself.CombatOver = false\nself.DiscardPile = {}\nself.ExhaustPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"파워 스트라이크\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tDefend = { name = \"아이언 바디\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tBash = { name = \"슬래시 블러스트\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10, class = \"warrior\", rarity = \"normal\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tWarLeap = { name = \"워 리프\", cost = 1, desc = \"피해 4, 방어도 3\", kind = \"Attack\", damage = 4, block = 3, class = \"warrior\", rarity = \"normal\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tBrandish = { name = \"브랜디시\", cost = 2, desc = \"피해 13\", kind = \"Attack\", damage = 13, class = \"warrior\", rarity = \"unique\", fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tChargedBlow = { name = \"차지 블로우\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, firstCardDamageBonus = 2, vuln = 2, class = \"warrior\", rarity = \"unique\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tThreaten = { name = \"위협\", cost = 0, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"warrior\", rarity = \"normal\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tEnrage = { name = \"인레이지\", cost = 1, desc = \"힘 +2\", kind = \"Skill\", strength = 2, class = \"warrior\", rarity = \"unique\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tRage = { name = \"분노\", cost = 1, desc = \"모든 적에게 피해를 4 줍니다.\", kind = \"Attack\", damage = 4, class = \"warrior\", rarity = \"legend\", aoe = true, image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tComboAttack = { name = \"콤보 어택\", cost = 1, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"fighter\", rarity = \"unique\", hits = 2, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBerserk = { name = \"버서크\", cost = 2, desc = \"매턴 에너지 +1, 취약 1 자가\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"fighter\", rarity = \"legend\", selfVuln = 1, image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tRisingAttack = { name = \"라이징 어택\", cost = 2, desc = \"피해 12\", kind = \"Attack\", damage = 12, class = \"fighter\", rarity = \"unique\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"115e309771604743853abad2d8d186bc\" },\n\tThunderCharge = { name = \"썬더 차지\", cost = 1, desc = \"피해 7, 약화 1\", kind = \"Attack\", damage = 7, weak = 1, class = \"page\", rarity = \"unique\", fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tBlizzardCharge = { name = \"블리자드 차지\", cost = 1, desc = \"피해 7, 취약 1\", kind = \"Attack\", damage = 7, vuln = 1, class = \"page\", rarity = \"unique\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tPowerGuard = { name = \"파워 가드\", cost = 1, desc = \"방어도 10\", kind = \"Skill\", block = 10, class = \"page\", rarity = \"unique\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tPierce = { name = \"피어스\", cost = 1, desc = \"피해 9, 방어 무시\", kind = \"Attack\", damage = 9, class = \"spearman\", rarity = \"unique\", pierce = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tIronWall = { name = \"아이언 월\", cost = 2, desc = \"방어도 12\", kind = \"Skill\", block = 12, class = \"spearman\", rarity = \"unique\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tHyperBody = { name = \"하이퍼 바디\", cost = 1, desc = \"매턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"spearman\", rarity = \"legend\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tEnergyBolt = { name = \"에너지 볼트\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"magician\", rarity = \"normal\", fx = \"1d5877e1120a42d0907f204c959888b1\", image = \"e84880eaf89442128d3af2be5c80a74f\" },\n\tMagicGuard = { name = \"매직 가드\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"magician\", rarity = \"normal\", image = \"01b249c26eb34b8aaab774bf221907a1\" },\n\tMagicClaw = { name = \"매직 클로\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"magician\", rarity = \"normal\", hits = 2, fx = \"ba4ac7c8f24845b68b7e689b7effcc93\", image = \"f3fcac2d460041b288cc1973caaaf30f\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", discardAll = true, drawPerDiscarded = 1, image = \"7f70a9dc7e304433bb8121dd9c4df98b\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"7224cd3f9b7e497d9dd65f32a50865e4\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", fx = \"4a937e208875468eb63d891806fba3cd\", image = \"6fa15fd3a0004b409ea516c11a67e533\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"07200f3c74854022baa7ebbefdc4ad8c\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"06865473977849bebe79062dbd608944\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, fx = \"7d52f5e389bd4d44a30cf7cc54538f8f\", image = \"c6685d33cb2641f09d11cfa2d5cc820c\" },\n\tColdBeam = { name = \"콜드 빔\", cost = 2, desc = \"피해 7, 약화 2\", kind = \"Attack\", damage = 7, weak = 2, class = \"icelightning\", rarity = \"unique\", image = \"e8f7c148c79f497d83014e3361f59f5c\" },\n\tChillingStep = { name = \"칠링 스텝\", cost = 1, desc = \"방어도 8\", kind = \"Skill\", block = 8, class = \"icelightning\", rarity = \"unique\", image = \"bef20873a68a4651a91d74be457c2cfc\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"8b935b7d7066493cb462834bbe287c74\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"607fc5457c1c44a0993a5c2fe3fb0c68\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", fx = \"4faa7b78e09643cf86339b8b7cf2abac\", image = \"a80127195bf7471f9545b70e491f4719\" },\n\tWound = { name = \"상처\", cost = 0, desc = \"사용할 수 없다. 손패를 막는 저주.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true },\n\tBurn = { name = \"화상\", cost = 0, desc = \"사용 불가. 손패에 있으면 턴 종료 시 피해 2.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true, endTurnDamage = 2 },\n\tNeutralize = { name = \"커닝식 견제\", cost = 0, desc = \"피해를 3 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 3, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSilentStrike = { name = \"초보 도적의 칼끝\", cost = 1, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSurvivor = { name = \"골목길 생존술\", cost = 1, desc = \"방어도를 8 얻습니다. 카드를 1장 버립니다.\", kind = \"Skill\", block = 8, class = \"rogue\", rarity = \"normal\", discard = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSilentDefend = { name = \"낡은 가죽 방패\", cost = 1, desc = \"방어도를 5 얻습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 1, desc = \"피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"rogue\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해를 3만큼 3번 줍니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"unique\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"카드를 1장 뽑습니다. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"normal\", draw = 1, gainEnergy = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"rogue\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tFlashJump = { name = \"플래시 점프\", cost = 0, desc = \"방어도를 4 얻습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", draw = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNimbleBody = { name = \"님블 바디\", cost = 1, desc = \"민첩을 1 얻습니다. 매 턴 방어도를 2 얻습니다.\", kind = \"Power\", dex = 1, powerEffect = \"blockPerTurn\", value = 2, class = \"rogue\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSlice = { name = \"짧은 단검질\", cost = 0, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShiv = { name = \"표창\", cost = 0, desc = \"피해를 4 줍니다. 소멸.\", kind = \"Attack\", damage = 4, class = \"shiv\", rarity = \"normal\", exhaust = true, token = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerSpray = { name = \"단검비\", cost = 1, desc = \"모든 적에게 피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"thief\", rarity = \"normal\", hits = 2, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerThrow = { name = \"비도 투척\", cost = 1, desc = \"피해를 9 줍니다. 카드를 1장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Attack\", damage = 9, class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPoisonedStab = { name = \"초록 독단검\", cost = 1, desc = \"피해를 6 줍니다. 중독을 3 부여합니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", poison = 3, image = \"19361e72087946b1888684185b40d935\" },\n\tSuckerPunch = { name = \"골목 기습\", cost = 1, desc = \"피해를 7 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 7, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tLeadingStrike = { name = \"초보 표창 던지기\", cost = 1, desc = \"피해를 3 줍니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"normal\", addShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFollowThrough = { name = \"연달아 찌르기\", cost = 1, desc = \"피해를 7 줍니다. 손에 다른 카드가 5장 이상 있다면, 1번 추가로 적중합니다.\", kind = \"Attack\", damage = 7, otherHandAtLeast = 5, bonusHitsWhenOtherHandAtLeast = 1, class = \"thief\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlickFlack = { name = \"커닝 난무\", cost = 1, desc = \"교활. 모든 적에게 피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"thief\", rarity = \"normal\", sly = true, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tRicochet = { name = \"통통 튀는 표창\", cost = 2, desc = \"교활. 무작위 적에게 피해를 3만큼 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, sly = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPrepared = { name = \"비장의 패\", cost = 1, desc = \"카드를 1장 버리고, 이번 턴에 준 피해의 절반만큼 방어를 얻습니다.\", kind = \"Skill\", blockPerDamageDealtThisTurn = 0.5, class = \"thief\", rarity = \"normal\", discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tAnticipate = { name = \"럭키 예감\", cost = 0, desc = \"이번 턴 동안 민첩을 2 얻습니다.\", kind = \"Skill\", endTurnDexLoss = 2, dex = 2, class = \"rogue\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tDeflect = { name = \"단검 쳐내기\", cost = 0, desc = \"방어도를 4 얻습니다.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tBladeDance = { name = \"표창 별무리\", cost = 1, desc = \"표창을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", addShiv = 3, exhaust = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBackflip = { name = \"커닝 곡예\", cost = 1, desc = \"방어도를 5 얻습니다. 카드를 2장 뽑습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", draw = 2, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDodgeAndRoll = { name = \"골목 구르기\", cost = 1, desc = \"방어도를 4 얻습니다. 다음 턴에, 방어도를 4 얻습니다\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", nextTurnBlock = 4, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPiercingWail = { name = \"골목의 살기\", cost = 1, desc = \"이번 턴 동안 모든 적이 힘을 6 잃습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", affectsAllEnemies = true, enemyStrengthLossThisTurn = 6, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCloakAndDagger = { name = \"망토 속 별\", cost = 1, desc = \"방어도를 6 얻습니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Skill\", block = 6, class = \"assassin\", rarity = \"normal\", addShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDeadlyPoison = { name = \"맹독 조제\", cost = 1, desc = \"중독을 5 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 5, image = \"19361e72087946b1888684185b40d935\" },\n\tSnakebite = { name = \"독니 단검\", cost = 2, desc = \"보존. 중독을 7 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 7, retain = true, image = \"19361e72087946b1888684185b40d935\" },\n\tUntouchable = { name = \"연막 속 숨기\", cost = 2, desc = \"교활. 방어도를 6 얻습니다.\", kind = \"Skill\", block = 6, class = \"rogue\", rarity = \"normal\", sly = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSkewer = { name = \"꿰뚫는 표창\", cost = 2, desc = \"피해를 8만큼 X번 줍니다.\", kind = \"Attack\", class = \"assassin\", rarity = \"unique\", useAllEnergy = true, xDamagePerEnergy = 8, image = \"92a5020c978c46bdabab910598118b86\" },\n\tBackstab = { name = \"그림자 등찌르기\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 소멸.\", kind = \"Attack\", damage = 10, class = \"rogue\", rarity = \"unique\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPreciseCut = { name = \"급소 절개\", cost = 0, desc = \"피해를 13 줍니다. 손에 있는 다른 카드 1장당 피해량이 2 감소합니다.\", kind = \"Attack\", damage = 13, damagePerOtherHandCard = -2, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFinisher = { name = \"마지막 칼끝\", cost = 1, desc = \"이번 턴에 사용한 공격 카드 1장당 피해를 6 줍니다.\", kind = \"Attack\", damage = 0, damagePerAttackPlayedThisTurn = 6, class = \"thief\", rarity = \"unique\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMementoMori = { name = \"사신의 장부\", cost = 1, desc = \"피해를 9 줍니다. 이번 턴에 버린 카드 1장당 피해량이 4 증가합니다.\", kind = \"Attack\", damage = 9, damagePerDiscardedThisTurn = 4, class = \"thief\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStrangle = { name = \"그림자 올가미\", cost = 1, desc = \"피해를 8 줍니다.\", kind = \"Attack\", damage = 8, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlechettes = { name = \"표창 셈법\", cost = 1, desc = \"손에 있는 스킬 카드 1장당 피해를 5 줍니다.\", kind = \"Attack\", damage = 0, damagePerSkillInHand = 5, class = \"assassin\", rarity = \"unique\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPounce = { name = \"어둠을 가르는 도약\", cost = 2, desc = \"피해를 12 줍니다. 다음에 사용하는 스킬 카드의 비용이 0 이 됩니다.\", kind = \"Attack\", damage = 12, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDash = { name = \"뒷골목 돌파\", cost = 2, desc = \"방어도를 10 얻습니다. 피해를 10 줍니다.\", kind = \"Attack\", damage = 10, block = 10, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPredator = { name = \"표창 끝의 추격\", cost = 2, desc = \"피해를 15 줍니다. 다음 턴에, 카드를 2장 뽑습니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", nextTurnDraw = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPinpoint = { name = \"한 점 겨냥\", cost = 3, desc = \"피해를 15 줍니다. 이번 턴에 스킬을 사용할 때마다 비용이 1 감소합니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", skillCostReductionThisTurn = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tCalculatedGamble = { name = \"메소 건 승부\", cost = 0, desc = \"손에 있는 모든 카드를 버린 뒤, 버린 카드의 수만큼 카드를 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", discardAll = true, drawPerDiscarded = 1, exhaust = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpose = { name = \"약점 들추기\", cost = 0, desc = \"대상 적의 모든 인공물과 방어도를 제거합니다. 취약을 2 부여합니다. 소멸.\", kind = \"Skill\", vuln = 2, class = \"thief\", rarity = \"unique\", removeEnemyBlock = true, removeEnemyArtifact = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHiddenDaggers = { name = \"숨겨둔 표창\", cost = 0, desc = \"카드를 2장 버립니다. 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", discard = 2, addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tEscapePlan = { name = \"비상용 연막탄\", cost = 0, desc = \"카드를 1장 뽑습니다. 뽑은 카드가 스킬 카드라면, 방어도를 3 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"unique\", draw = 1, drawSkillBlock = 3, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tAcrobatics = { name = \"지붕 위 곡예\", cost = 1, desc = \"카드를 3장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 3, discard = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tHandTrick = { name = \"재빠른 손놀림\", cost = 1, desc = \"방어도를 7 얻습니다. 이번 턴 동안 손에 있는 스킬 카드 1장에 교활을 추가합니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpertise = { name = \"노련한 단검술\", cost = 1, desc = \"손에 있는 카드가 6장이 될 때까지 카드를 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", drawUntilHandSize = 6, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tBubbleBubble = { name = \"독액 농축\", cost = 1, desc = \"적이 중독을 보유하고 있다면, 중독을 9 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", poison = 9, poisonIfTargetPoisoned = true, image = \"19361e72087946b1888684185b40d935\" },\n\tBlur = { name = \"흐린 잔영\", cost = 1, desc = \"방어도를 5 얻습니다. 다음 턴 시작 시 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 5, class = \"thief\", rarity = \"unique\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tLegSweep = { name = \"발목 베기\", cost = 2, desc = \"약화를 2 부여합니다. 방어도를 11 얻습니다.\", kind = \"Skill\", block = 11, weak = 2, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tUpMySleeve = { name = \"소매 속 표창\", cost = 2, desc = \"표창을 3장 손으로 가져옵니다. 이 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", addShiv = 3, combatCostReductionOnPlay = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBouncingFlask = { name = \"통통 독병\", cost = 2, desc = \"무작위 적에게 중독을 3만큼 3번 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 3, poisonHits = 3, poisonRandomTargets = true, image = \"19361e72087946b1888684185b40d935\" },\n\tReflex = { name = \"찰나의 반응\", cost = 3, desc = \"교활. 카드를 2장 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 2, sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tHaze = { name = \"보랏빛 독연기\", cost = 3, desc = \"교활. 모든 적에게 중독을 4 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 4, sly = true, image = \"19361e72087946b1888684185b40d935\" },\n\tTactician = { name = \"골목길 책략\", cost = 3, desc = \"교활. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", gainEnergy = 1, sly = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tWellLaidPlans = { name = \"빈틈없는 작전\", cost = 1, desc = \"내 턴 종료 시, 카드를 최대 1장까지 보존합니다.\", kind = \"Power\", powerEffect = \"retainOne\", value = 1, class = \"thief\", rarity = \"unique\", image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tInfiniteBlades = { name = \"끝없는 표창통\", cost = 1, desc = \"내 턴 시작 시, 표창을 1장 손으로 가져옵니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", turnStartShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFootwork = { name = \"사뿐한 발놀림\", cost = 1, desc = \"민첩을 2 얻습니다.\", kind = \"Power\", dex = 2, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tOutbreak = { name = \"독맥 터뜨리기\", cost = 2, desc = \"독이 3번 부여될 때마다 모든 적에게 6 피해를 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 6, image = \"19361e72087946b1888684185b40d935\" },\n\tNoxiousFumes = { name = \"숨막히는 독연기\", cost = 1, desc = \"내 턴 시작 시, 모든 적에게 중독을 2 부여합니다.\", kind = \"Power\", powerEffect = \"poisonPerTurn\", value = 2, class = \"thief\", rarity = \"unique\", poison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tSpeedster = { name = \"그림자 속도전\", cost = 2, desc = \"내 턴 동안 카드를 뽑을 때마다, 모든 적에게 피해를 1 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", drawDamage = 1, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tGrandFinale = { name = \"커닝의 대단원\", cost = 0, desc = \"뽑을 카드 더미에 카드가 없을 때만 사용할 수 있습니다. 모든 적에게 피해를 45 줍니다.\", kind = \"Attack\", damage = 45, class = \"thiefmaster\", rarity = \"legend\", playableWhenDrawPileEmpty = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tAssassinate = { name = \"어둠 속 급소\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 취약을 1 부여합니다. 소멸.\", kind = \"Attack\", damage = 10, vuln = 1, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tEchoingSlash = { name = \"메아리 칼자국\", cost = 2, desc = \"모든 적에게 피해를 6 줍니다. 적을 처치할 때마다 이 효과를 반복합니다.\", kind = \"Attack\", damage = 10, class = \"thiefmaster\", rarity = \"legend\", repeatOnKill = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tTheHunt = { name = \"커닝 현상금\", cost = 1, desc = \"피해를 10 줍니다. 이 카드로 적을 처치하면 카드 보상을 추가로 얻습니다. 소멸.\", kind = \"Attack\", damage = 6, rewardOnKill = 1, class = \"assassin\", rarity = \"legend\", exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMurder = { name = \"쌓여가는 살의\", cost = 3, desc = \"피해를 1 줍니다. 이번 전투 동안 뽑은 카드 1장당 피해량이 1 증가합니다.\", kind = \"Attack\", damage = 1, damagePerCardDrawnThisCombat = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMalaise = { name = \"기운 빼는 독\", cost = 2, desc = \"에너지를 모두 사용하고, 사용한 에너지만큼 적에게 약화를 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", useAllEnergy = true, xWeakPerEnergy = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStormOfSteel = { name = \"쇠별 폭풍\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 버린 카드의 수만큼 표창을 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"legend\", discardAll = true, addShivPerDiscard = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStep = { name = \"그림자 발자국\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 다음 턴에, 공격 카드의 피해량이 2배가 됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", discardAll = true, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShadowmeld = { name = \"연막 속 은신\", cost = 1, desc = \"이번 턴 동안 얻는 방어도가 2배가 됩니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCorrosiveWave = { name = \"부식 독물결\", cost = 1, desc = \"이번 턴에 카드를 뽑을 때마다, 모든 적에게 중독을 2 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", drawPoison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tBladeOfInk = { name = \"먹빛 표창\", cost = 1, desc = \"잉크투성이 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBurst = { name = \"연속 술수\", cost = 1, desc = \"이번 턴에 다음에 사용하는 스킬 카드가 1번 추가로 사용됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextSkillRepeatCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKnifeTrap = { name = \"숨은 칼날덫\", cost = 2, desc = \"교활. 모든 적에게 피해를 7 주고 중독을 2 부여합니다.\", kind = \"Attack\", damage = 7, class = \"thiefmaster\", rarity = \"legend\", poison = 2, sly = true, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBulletTime = { name = \"멈춘 듯한 순간\", cost = 3, desc = \"이번 턴 동안 더 이상 카드를 뽑을 수 없습니다. 이번 턴 동안 손에 있는 모든 카드를 비용 없이 사용할 수 있습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", handCostZeroThisTurn = true, drawDisabledThisTurn = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNightmare = { name = \"검은 꿈\", cost = 3, desc = \"카드를 1장 선택합니다. 다음 턴에, 그 카드의 복사본을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextTurnCopies = 3, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tToolsOfTheTrade = { name = \"도적의 연장통\", cost = 1, desc = \"내 턴 시작 시, 카드를 1장 뽑고 카드를 1장 버립니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", turnStartDraw = 1, turnStartDiscard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMasterPlanner = { name = \"작전의 달인\", cost = 2, desc = \"사용한 스킬 카드는 교활해집니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", skillSlyOnPlay = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tFanOfKnives = { name = \"사방 표창비\", cost = 2, desc = \"표창이 이제 모든 적을 대상으로 합니다. 표창을 4장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 4, shivAoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSerpentForm = { name = \"독사의 몸놀림\", cost = 2, desc = \"카드를 사용할 때마다, 무작위 적에게 피해를 4 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 4, class = \"thiefmaster\", rarity = \"legend\", image = \"19361e72087946b1888684185b40d935\" },\n\tAbrasive = { name = \"거친 숫돌질\", cost = 2, desc = \"교활. 민첩을 1 얻습니다. 가시를 4 얻습니다.\", kind = \"Power\", dex = 1, thorns = 4, class = \"thiefmaster\", rarity = \"legend\", sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSuppress = { name = \"소리 없는 제압\", cost = 0, desc = \"선천성. 피해를 9 줍니다. 약화를 2 부여합니다. 소멸.\", kind = \"Attack\", damage = 9, weak = 2, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tWraithForm = { name = \"유령 같은 몸놀림\", cost = 3, desc = \"불가침을 2 얻습니다. 내 턴 종료 시 민첩을 1 잃습니다.\", kind = \"Power\", intangible = 2, endTurnDexLoss = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해를 3만큼 2번 줍니다. 이번 턴에 사용한 공격 카드 1장당 피해가 2 증가합니다.\", kind = \"Attack\", damage = 3, damagePerAttackPlayedThisTurn = 2, class = \"thief\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tCriticalEdge = { name = \"크리티컬 엣지\", cost = 1, desc = \"카드를 1장 뽑습니다. 다음 턴에 공격 카드의 피해량이 2배가 됩니다. 보존.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 1, nextTurnAttackMultiplier = 2, retain = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"피해를 3 줍니다. 이번 턴에 버린 카드 1장당 피해가 3 증가합니다. 에너지를 1 얻습니다.\", kind = \"Attack\", damage = 3, damagePerDiscardedThisTurn = 3, class = \"thief\", rarity = \"normal\", gainEnergy = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerAcceleration = { name = \"대거 액셀레이션\", cost = 0, desc = \"카드를 1장 뽑습니다. 카드를 1장 버립니다. 버린 카드마다 카드를 1장 더 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, drawPerDiscarded = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKarma = { name = \"카르마\", cost = 1, desc = \"피해를 7 줍니다. 방어도를 무시합니다. 약화 상태의 적에게는 피해가 2배가 됩니다.\", kind = \"Attack\", damage = 7, class = \"thief\", rarity = \"unique\", pierce = true, attackDamageVsWeakMultiplier = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tDaggerMastery = { name = \"대거 마스터리\", cost = 1, desc = \"카드를 사용할 때마다 방어도를 1 얻습니다. 매 턴 첫 카드의 피해가 3 증가합니다.\", kind = \"Power\", firstCardDamageBonus = 3, cardPlayedBlock = 1, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘을 1 얻습니다. 민첩을 1 얻습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"thief\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tShieldMastery = { name = \"실드 마스터리\", cost = 1, desc = \"방어도를 7 얻습니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"normal\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tThiefAgility = { name = \"시프 어질리티\", cost = 1, desc = \"방어도를 5 얻습니다. 이번 턴 동안 민첩을 1 얻습니다. 손의 다른 스킬 카드 1장이 교활해집니다.\", kind = \"Skill\", endTurnDexLoss = 1, block = 5, dex = 1, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tEdgeCarnival = { name = \"엣지 카니발\", cost = 1, desc = \"무작위 적에게 피해를 2만큼 4번 줍니다.\", kind = \"Attack\", damage = 2, class = \"thiefmaster\", rarity = \"unique\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tMuspelHeim = { name = \"무스펠 하임\", cost = 1, desc = \"모든 적에게 피해를 4 줍니다. 이번 턴에 버린 카드 1장당 피해가 2 증가합니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 4, damagePerDiscardedThisTurn = 2, weak = 1, class = \"thiefmaster\", rarity = \"unique\", aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMesoExplosion = { name = \"메소 익스플로젼\", cost = 1, desc = \"피해를 2 줍니다. 이번 턴에 버린 카드 1장당 피해가 7 증가합니다. 방어도를 무시합니다.\", kind = \"Attack\", damage = 2, damagePerDiscardedThisTurn = 7, class = \"thiefmaster\", rarity = \"unique\", pierce = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDarkFlare = { name = \"다크 플레어\", cost = 1, desc = \"매 턴 모든 적에게 피해를 2 줍니다. 카드를 사용할 때마다 무작위 적에게 피해를 2 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 2, powerEffect = \"damagePerTurn\", value = 2, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tPickPocket = { name = \"픽 파킷\", cost = 1, desc = \"카드를 1장 뽑습니다. 카드를 1장 버리고, 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", draw = 1, gainEnergy = 1, discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 선택합니다. 다음 턴에 그 카드의 복사본 1장을 손에 넣습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnCopies = 1, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요.\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tAdvancedDarkSight = { name = \"어드밴스드 다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", intangible = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tIntoDarkness = { name = \"인투 다크니스\", cost = 1, desc = \"모든 적에게 약화를 1 부여합니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", weak = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, affectsAllEnemies = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tVenom = { name = \"베놈\", cost = 1, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독을 1 부여합니다. 적 턴 시작 시 독이 한 번 더 적용됩니다.\", kind = \"Power\", attackPoison = 1, class = \"thiefmaster\", rarity = \"legend\", extraPoisonTicks = 1, image = \"19361e72087946b1888684185b40d935\" },\n\tGrid = { name = \"그리드\", cost = 2, desc = \"가시를 3 얻습니다. 카드를 사용할 때마다 방어도를 1 얻습니다.\", kind = \"Power\", thorns = 3, cardPlayedBlock = 1, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tRadicalDarkness = { name = \"래디컬 다크니스\", cost = 2, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShurikenBurst = { name = \"슈리켄 버스트\", cost = 1, desc = \"무작위 적에게 피해를 3씩 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tWindTalisman = { name = \"윈드 탈리스만\", cost = 1, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 스킬 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", draw = 1, skillCostReductionThisTurn = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMarkOfAssassin = { name = \"마크 오브 어쌔신\", cost = 1, desc = \"약화 1을 부여합니다. 약화 상태의 적에게 주는 공격 피해가 1.5배가 됩니다.\", kind = \"Power\", weak = 1, class = \"assassin\", rarity = \"unique\", attackDamageVsWeakMultiplier = 1.5, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowRush = { name = \"쉐도우 러쉬\", cost = 1, desc = \"피해 7, 방어도 5를 얻습니다.\", kind = \"Attack\", damage = 7, block = 5, class = \"assassin\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShadowLeap = { name = \"쉐도우 리프\", cost = 0, desc = \"방어도 4를 얻습니다. 다음 턴에 방어도 4를 얻습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"assassin\", rarity = \"normal\", nextTurnBlock = 4, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tShadowBlink = { name = \"쉐도우 블링크\", cost = 1, desc = \"무형 1을 얻습니다. 다음 스킬 카드의 비용이 0이 됩니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tJavelinMastery = { name = \"자벨린 마스터리\", cost = 1, desc = \"표창의 피해량이 2 증가합니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", shivDamageBonus = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tJavelinAcceleration = { name = \"자벨린 액셀레이션\", cost = 1, desc = \"카드를 2장 뽑습니다. 카드를 1장 버립니다. 표창 1장을 손에 넣습니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", draw = 2, discard = 1, addShiv = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 1, desc = \"피해를 6씩 2번 줍니다. 방어도를 무시합니다. 이번 턴 첫 카드라면 피해가 더 강해집니다.\", kind = \"Attack\", damage = 6, firstCardDamageBonus = 2, class = \"assassin\", rarity = \"unique\", hits = 2, pierce = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tAssassinPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘 1, 민첩 1을 얻고 카드를 1장 뽑습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"assassin\", rarity = \"normal\", draw = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tTripleThrow = { name = \"트리플 스로우\", cost = 1, desc = \"피해를 4씩 3번 줍니다.\", kind = \"Attack\", damage = 4, class = \"hermit\", rarity = \"normal\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShurikenChallenge = { name = \"슈리켄 챌린지\", cost = 1, desc = \"피해를 5씩 2번 줍니다. 다음 턴에 카드를 1장 더 뽑습니다.\", kind = \"Attack\", damage = 5, class = \"hermit\", rarity = \"unique\", hits = 2, nextTurnDraw = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitDarkFlare = { name = \"다크 플레어\", cost = 2, desc = \"매 턴 모든 적에게 피해 3을 줍니다. 턴 시작마다 표창 1장을 손에 넣습니다.\", kind = \"Power\", powerEffect = \"damagePerTurn\", value = 3, class = \"hermit\", rarity = \"unique\", turnStartShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 뽑습니다. 다음 턴 공격 카드의 피해가 2배가 됩니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSpiritJavelin = { name = \"스피릿 자벨린\", cost = 1, desc = \"표창이 턴 종료 시 사라지지 않습니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", firstShivDamageBonus = 4, shivRetain = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitRadicalDarkness = { name = \"래디컬 다크니스\", cost = 1, desc = \"방어도 4를 얻습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 소멸.\", kind = \"Skill\", block = 4, blockGainMultiplier = 2, class = \"hermit\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitVenom = { name = \"베놈\", cost = 2, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독 1을 부여합니다. 전투 중 독 부여 3회마다 모든 적에게 피해 8을 줍니다.\", kind = \"Power\", attackPoison = 1, class = \"hermit\", rarity = \"legend\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 8, image = \"19361e72087946b1888684185b40d935\" },\n\tSkilledJavelin = { name = \"숙련된 표창술\", cost = 1, desc = \"표창의 피해량이 2 증가합니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", shivDamageBonus = 2, firstShivDamageBonus = 4, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitAdrenaline = { name = \"아드레날린\", cost = 0, desc = \"에너지를 1 얻고 카드를 1장 뽑습니다. 표창 1장을 손에 넣습니다. 소멸.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, gainEnergy = 1, addShiv = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:PrepareCombatDrawPile()\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()\nlocal slotTid = 0\nslotTid = _TimerService:SetTimerRepeat(function()\n\tif self.CombatOver == true or self.Monsters == nil or #self.Monsters == 0 then\n\t\t_TimerService:ClearTimer(slotTid)\n\t\treturn\n\tend\n\tfor i = 1, #self.Monsters do\n\t\tif self.Monsters[i] ~= nil and self.Monsters[i].alive == true then\n\t\t\tself:PositionMonsterSlot(i)\n\t\tend\n\tend\nend, 0.15)", + "Code": "self:ShowState(\"combat\")\nself:KickCombatCamera()\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/Result\", false)\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/PotionMenu\", false)\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/TooltipBox\", false)\nself:SetEntityEnabled(\"/ui/RunUIGroup/CombatHud/DiscardPrompt\", false)\nself:SetText(\"/ui/RunUIGroup/CombatHud/PlayerPanel/Name\", self:JobLabel())\nself.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.BlockGainMultiplier = 1\nself.CardsDrawnThisCombat = 0\nself.HandCostZeroThisTurn = false\nself.DrawDisabledThisTurn = false\nself.NextSkillCostZero = false\nself.NextSkillRepeatCount = 0\nself.SkillCostReductionThisTurn = 0\nself.CombatCardCostReduction = {}\nself.SkillSlyOnPlayCards = {}\nself.TurnSkillSlyCards = {}\nself.ShivFirstDamageBonusUsed = false\nself.ActiveAttackDamageVsWeakMultiplier = 1\nself.DrawDamageThisTurn = 0\nself.DrawPoisonThisTurn = 0\nself.ShivAoeThisCombat = false\nself.PoisonApplicationsThisCombat = 0\nself.EnemyStrengthLossThisTurn = 0\nself.PlayerStr = 0\nself.PlayerDex = 0\nself.PlayerThorns = 0\nself.PlayerWeak = 0\nself.PlayerVuln = 0\nself.PlayerIntangible = 0\nself.BonusRewardScreens = 0\nself.ActiveKillReward = 0\nself.ActiveKillMaxHpGain = 0\nself.PlayerPowers = {}\nself.FightAttackCount = 0\nself.TurnAttackCardsPlayed = 0\nself.TurnDiscardedCards = 0\nself.TurnCardsPlayedThisTurn = 0\nself.DamageDealtThisTurn = 0\nself.DmgPopSeq = 0\nself.FirstHpLossDone = false\nself.ClayBlockNext = 0\nself.DiscardSelectRemaining = 0\nself.DiscardSelectTotal = 0\nself.DiscardPostShiv = 0\nself.DiscardShivPerPick = 0\nself.RetainSelectActive = false\nself.ReserveSelectActive = false\nself.NextTurnBlock = 0\nself.NextTurnDraw = 0\nself.NextTurnKeepBlock = false\nself.NextTurnAttackMultiplier = 1\nself.TurnAttackMultiplier = 1\nself.NextTurnSelectPrompt = \"\"\nself.NextTurnSelectCopies = 0\nself.NextTurnAddCards = {}\nself.ZeroCostCardIdsThisTurn = {}\nself.CombatOver = false\nself.DiscardPile = {}\nself.ExhaustPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"타격\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tBash = { name = \"강타\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, vuln = 2, class = \"warrior\", rarity = \"normal\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tDefend = { name = \"수비\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tAnger = { name = \"분노\", cost = 0, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tMoltenFist = { name = \"녹아내리는 주먹\", cost = 1, desc = \"피해 10, 취약 2. 소멸.\", kind = \"Attack\", damage = 10, vuln = 2, class = \"warrior\", rarity = \"normal\", exhaust = true, fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tBodySlam = { name = \"몸통 박치기\", cost = 1, desc = \"현재 방어도만큼 피해를 줍니다.\", kind = \"Attack\", damageFromCurrentBlock = 1, class = \"warrior\", rarity = \"normal\", fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tHeadbutt = { name = \"박치기\", cost = 1, desc = \"피해 9, 카드 1장 뽑기\", kind = \"Attack\", damage = 9, class = \"warrior\", rarity = \"normal\", draw = 1, fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tSwordBoomerang = { name = \"부메랑 칼날\", cost = 1, desc = \"무작위 적에게 피해 3 x 3회\", kind = \"Attack\", damage = 3, class = \"warrior\", rarity = \"normal\", hits = 3, randomTargetEachHit = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tSetupStrike = { name = \"사전 타격\", cost = 1, desc = \"피해 7, 힘 +2\", kind = \"Attack\", damage = 7, strength = 2, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tTwinStrike = { name = \"이중 타격\", cost = 1, desc = \"피해 5 x 2회\", kind = \"Attack\", damage = 5, class = \"warrior\", rarity = \"normal\", hits = 2, fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBreakthrough = { name = \"정면 돌파\", cost = 1, desc = \"모든 적에게 피해 9\", kind = \"Attack\", damage = 9, class = \"warrior\", rarity = \"normal\", aoe = true, fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tThunderclap = { name = \"천둥\", cost = 1, desc = \"모든 적에게 피해 4, 취약 1\", kind = \"Attack\", damage = 4, vuln = 1, class = \"warrior\", rarity = \"normal\", affectsAllEnemies = true, aoe = true, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"115e309771604743853abad2d8d186bc\" },\n\tIronWave = { name = \"철의 파동\", cost = 1, desc = \"피해 5, 방어도 5\", kind = \"Attack\", damage = 5, block = 5, class = \"warrior\", rarity = \"normal\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tPommelStrike = { name = \"폼멜 타격\", cost = 1, desc = \"피해 9, 카드 1장 뽑기\", kind = \"Attack\", damage = 9, class = \"warrior\", rarity = \"normal\", draw = 1, fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tPerfectedStrike = { name = \"완벽한 타격\", cost = 2, desc = \"피해 6. 보유한 이름에 \\\"타격\\\"이 포함된 카드마다 피해 +2\", kind = \"Attack\", damage = 6, damageNameMatch = \"타격\", damagePerOwnedNameMatch = 2, class = \"warrior\", rarity = \"normal\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tCinder = { name = \"잿불\", cost = 2, desc = \"피해 18. 소멸.\", kind = \"Attack\", damage = 18, class = \"warrior\", rarity = \"normal\", exhaust = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tBloodletting = { name = \"사혈\", cost = 0, desc = \"에너지 +2\", kind = \"Skill\", class = \"warrior\", rarity = \"normal\", gainEnergy = 2, image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tTremble = { name = \"떨림\", cost = 1, desc = \"취약 3. 소멸.\", kind = \"Skill\", vuln = 3, class = \"warrior\", rarity = \"normal\", exhaust = true, image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tArmaments = { name = \"전투장비\", cost = 1, desc = \"방어도 5, 카드 1장 뽑기\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", draw = 1, image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tTrueGrit = { name = \"진정한 끈기\", cost = 1, desc = \"방어도 7, 카드 1장 버리기\", kind = \"Skill\", block = 7, class = \"warrior\", rarity = \"normal\", discard = 1, image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tHavoc = { name = \"파괴\", cost = 1, desc = \"다음 스킬의 비용이 0\", kind = \"Skill\", class = \"warrior\", rarity = \"normal\", nextSkillCostZero = true, image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tShrugItOff = { name = \"흘려보내기\", cost = 1, desc = \"방어도 8, 카드 1장 뽑기\", kind = \"Skill\", block = 8, class = \"warrior\", rarity = \"normal\", draw = 1, image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tBloodWall = { name = \"피의 벽\", cost = 2, desc = \"방어도 16\", kind = \"Skill\", block = 16, class = \"warrior\", rarity = \"normal\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tWhirlwind = { name = \"소용돌이\", cost = 0, desc = \"모든 에너지를 사용해 에너지당 모든 적에게 피해 5\", kind = \"Attack\", damage = 0, class = \"warrior\", rarity = \"unique\", useAllEnergy = true, xDamagePerEnergy = 5, aoe = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tSpite = { name = \"악의\", cost = 0, desc = \"피해 5 x 2회\", kind = \"Attack\", damage = 5, class = \"warrior\", rarity = \"unique\", hits = 2, fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tBully = { name = \"협박\", cost = 0, desc = \"피해 4. 대상이 약화 상태면 피해 2배\", kind = \"Attack\", damage = 4, class = \"warrior\", rarity = \"unique\", attackDamageVsWeakMultiplier = 2, fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tPillage = { name = \"갈취\", cost = 1, desc = \"피해 6, 카드 2장 뽑기\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"unique\", draw = 2, fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tRampage = { name = \"광란\", cost = 2, desc = \"피해 12. 사용할 때마다 이번 전투에서 비용 1 감소\", kind = \"Attack\", damage = 12, class = \"warrior\", rarity = \"unique\", combatCostReductionOnPlay = 1, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tAshenStrike = { name = \"잿빛 타격\", cost = 1, desc = \"피해 6. 이번 전투에서 뽑은 카드마다 피해 +1\", kind = \"Attack\", damage = 6, damagePerCardDrawnThisCombat = 1, class = \"warrior\", rarity = \"unique\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tDismantle = { name = \"해체\", cost = 1, desc = \"피해 8 x 2회\", kind = \"Attack\", damage = 8, class = \"warrior\", rarity = \"unique\", hits = 2, fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"115e309771604743853abad2d8d186bc\" },\n\tHemokinesis = { name = \"혈류\", cost = 1, desc = \"피해 15\", kind = \"Attack\", damage = 15, class = \"warrior\", rarity = \"unique\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tFightMe = { name = \"덤벼라!\", cost = 2, desc = \"피해 5 x 2회, 힘 +3\", kind = \"Attack\", damage = 5, strength = 3, class = \"warrior\", rarity = \"unique\", hits = 2, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tUnrelenting = { name = \"무자비\", cost = 2, desc = \"피해 14, 에너지 +1\", kind = \"Attack\", damage = 14, class = \"warrior\", rarity = \"unique\", gainEnergy = 1, fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tUppercut = { name = \"어퍼컷\", cost = 2, desc = \"피해 12, 약화 1, 취약 1\", kind = \"Attack\", damage = 12, weak = 1, vuln = 1, class = \"warrior\", rarity = \"unique\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tBludgeon = { name = \"몽둥이질\", cost = 3, desc = \"피해 32\", kind = \"Attack\", damage = 32, class = \"warrior\", rarity = \"unique\", fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tHowlFromBeyond = { name = \"저편의 울음소리\", cost = 3, desc = \"모든 적에게 피해 16. 소멸.\", kind = \"Attack\", damage = 16, class = \"warrior\", rarity = \"unique\", exhaust = true, aoe = true, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tStomp = { name = \"짓밟기\", cost = 3, desc = \"모든 적에게 피해 12. 이번 턴 사용한 공격 카드마다 피해 +2\", kind = \"Attack\", damage = 12, damagePerAttackPlayedThisTurn = 2, class = \"warrior\", rarity = \"unique\", aoe = true, fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tRage = { name = \"격노\", cost = 0, desc = \"방어도 5, 카드 1장 뽑기\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"unique\", draw = 1, image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tBattleTrance = { name = \"전투 최면\", cost = 0, desc = \"카드 3장 뽑기. 이번 턴 더 뽑을 수 없음\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", draw = 3, drawDisabledThisTurn = true, image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tColossus = { name = \"거상\", cost = 1, desc = \"방어도 5, 무형 1\", kind = \"Skill\", intangible = 1, block = 5, class = \"warrior\", rarity = \"unique\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tSecondWind = { name = \"기사회생\", cost = 1, desc = \"손의 공격이 아닌 모든 카드를 소멸시키고, 소멸시킨 카드마다 방어도 5\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", exhaustHandNonAttack = true, blockPerExhaustedCard = 5, image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tTaunt = { name = \"도발\", cost = 1, desc = \"방어도 7, 취약 1\", kind = \"Skill\", block = 7, vuln = 1, class = \"warrior\", rarity = \"unique\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tBurningPact = { name = \"불타는 조약\", cost = 1, desc = \"카드 1장 버리고 카드 3장 뽑기\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", draw = 3, discard = 1, image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tEvilEye = { name = \"악마의 눈\", cost = 1, desc = \"방어도 16\", kind = \"Skill\", block = 16, class = \"warrior\", rarity = \"unique\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tForgottenRitual = { name = \"잊힌 의식\", cost = 1, desc = \"에너지 +2. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", gainEnergy = 2, exhaust = true, image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tDrumOfBattle = { name = \"전투의 북소리\", cost = 1, desc = \"카드 2장 뽑기, 에너지 +1. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", draw = 2, gainEnergy = 1, exhaust = true, image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tDominate = { name = \"제압\", cost = 1, desc = \"취약 2, 힘 +2. 소멸.\", kind = \"Skill\", strength = 2, vuln = 2, class = \"warrior\", rarity = \"unique\", exhaust = true, image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tInfernalBlade = { name = \"지옥검\", cost = 1, desc = \"무작위 공격 카드 1장을 손으로 가져옵니다. 이번 턴 동안 그 카드를 비용 없이 사용할 수 있습니다. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", addRandomCardCount = 1, addRandomCardKind = \"Attack\", addRandomCardSameClass = true, addedCardsCostZeroThisTurn = true, exhaust = true, image = \"115e309771604743853abad2d8d186bc\" },\n\tExpectAFight = { name = \"싸움 준비\", cost = 1, desc = \"이번 턴 스킬 비용 1 감소\", kind = \"Skill\", class = \"warrior\", rarity = \"unique\", skillCostReductionThisTurn = 1, image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tFlameBarrier = { name = \"화염 장벽\", cost = 2, desc = \"방어도 12, 가시 4\", kind = \"Skill\", block = 12, thorns = 4, class = \"warrior\", rarity = \"unique\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tStoneArmor = { name = \"돌 갑옷\", cost = 1, desc = \"매턴 방어도 +4\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 4, class = \"warrior\", rarity = \"unique\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tFeelNoPain = { name = \"무감각\", cost = 1, desc = \"매턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"warrior\", rarity = \"unique\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tInflame = { name = \"발화\", cost = 1, desc = \"매턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"unique\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tInferno = { name = \"불바다\", cost = 1, desc = \"매턴 모든 적에게 피해 6\", kind = \"Power\", powerEffect = \"damagePerTurn\", value = 6, class = \"warrior\", rarity = \"unique\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tJuggling = { name = \"저글링\", cost = 1, desc = \"카드를 사용할 때마다 무작위 적에게 피해 3\", kind = \"Power\", cardPlayedRandomDamage = 3, class = \"warrior\", rarity = \"unique\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tRupture = { name = \"파열\", cost = 1, desc = \"매턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"unique\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tVicious = { name = \"포악함\", cost = 1, desc = \"턴 시작 시 카드 1장 추가로 뽑기\", kind = \"Power\", class = \"warrior\", rarity = \"unique\", turnStartDraw = 1, image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tStampede = { name = \"쇄도\", cost = 2, desc = \"카드를 사용할 때마다 무작위 적에게 피해 8\", kind = \"Power\", cardPlayedRandomDamage = 8, class = \"warrior\", rarity = \"unique\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tPactsEnd = { name = \"조약의 끝\", cost = 0, desc = \"뽑을 카드 더미가 비었을 때 모든 적에게 피해 17\", kind = \"Attack\", damage = 17, class = \"warrior\", rarity = \"legend\", playableWhenDrawPileEmpty = true, aoe = true, fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tThrash = { name = \"난타\", cost = 1, desc = \"피해 4 x 2회. 이번 턴 사용한 공격 카드마다 피해 +2\", kind = \"Attack\", damage = 4, damagePerAttackPlayedThisTurn = 2, class = \"warrior\", rarity = \"legend\", hits = 2, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tConflagration = { name = \"대화재\", cost = 1, desc = \"모든 적에게 피해 2 x 4회\", kind = \"Attack\", damage = 2, class = \"warrior\", rarity = \"legend\", hits = 4, aoe = true, fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tFeed = { name = \"포식\", cost = 1, desc = \"피해를 10 줍니다. 치명타라면, 최대 체력이 3 증가합니다. 소멸.\", kind = \"Attack\", damage = 10, maxHpOnKill = 3, class = \"warrior\", rarity = \"legend\", exhaust = true, fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tTearAsunder = { name = \"갈가리 찢기\", cost = 2, desc = \"피해 5 x 3회\", kind = \"Attack\", damage = 5, class = \"warrior\", rarity = \"legend\", hits = 3, fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tFiendFire = { name = \"지옥불\", cost = 2, desc = \"손의 다른 카드마다 피해 +7 후 모두 버리기. 소멸.\", kind = \"Attack\", damage = 0, damagePerOtherHandCard = 7, class = \"warrior\", rarity = \"legend\", discardAll = true, exhaust = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tMangle = { name = \"난도질\", cost = 3, desc = \"피해 15. 이번 턴 적 힘 -10\", kind = \"Attack\", damage = 15, class = \"warrior\", rarity = \"legend\", enemyStrengthLossThisTurn = 10, fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tBrand = { name = \"낙인\", cost = 0, desc = \"카드 1장 버리기, 힘 +1\", kind = \"Skill\", strength = 1, class = \"warrior\", rarity = \"legend\", discard = 1, image = \"115e309771604743853abad2d8d186bc\" },\n\tCascade = { name = \"연쇄\", cost = 0, desc = \"뽑을 카드 더미 맨 위의 카드 X장을 사용합니다. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", playTopDrawPileCountPerEnergy = 1, useAllEnergy = true, exhaust = true, image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tPrimalForce = { name = \"원시의 힘\", cost = 0, desc = \"이번 턴 손의 카드 비용이 0\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", handCostZeroThisTurn = true, image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tOffering = { name = \"제물\", cost = 0, desc = \"에너지 +2, 카드 3장 뽑기. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", draw = 3, gainEnergy = 2, exhaust = true, image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tOneTwoPunch = { name = \"원투 펀치\", cost = 1, desc = \"다음 스킬을 1회 추가 발동\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", nextSkillRepeatCount = 1, image = \"251b6e12329048429490049a4f3cf564\" },\n\tStoke = { name = \"화력 증폭\", cost = 1, desc = \"손의 모든 카드를 소멸시키고, 소멸시킨 카드 수만큼 뽑습니다. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", exhaustHandAll = true, drawPerExhausted = 1, exhaust = true, image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tImpervious = { name = \"무적\", cost = 2, desc = \"방어도 30. 소멸.\", kind = \"Skill\", block = 30, class = \"warrior\", rarity = \"legend\", exhaust = true, image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tNotYet = { name = \"불굴\", cost = 2, desc = \"HP 10 회복. 소멸.\", kind = \"Skill\", class = \"warrior\", rarity = \"legend\", heal = 10, exhaust = true, image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tAggression = { name = \"공격성\", cost = 1, desc = \"턴 시작 시 카드 1장 추가로 뽑기\", kind = \"Power\", class = \"warrior\", rarity = \"legend\", turnStartDraw = 1, image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tCruelty = { name = \"악랄함\", cost = 1, desc = \"매턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tCrimsonMantle = { name = \"핏빛 망토\", cost = 1, desc = \"매턴 방어도 +8\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 8, class = \"warrior\", rarity = \"legend\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tPyre = { name = \"불의 심장\", cost = 2, desc = \"매턴 에너지 +1\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tDarkEmbrace = { name = \"어둠의 포옹\", cost = 2, desc = \"카드가 소멸될 때마다 카드 1장 뽑기\", kind = \"Power\", drawOnExhaust = 1, class = \"warrior\", rarity = \"legend\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tUnmovable = { name = \"요지부동\", cost = 2, desc = \"이번 전투 동안 방어도 획득량 2배\", kind = \"Power\", blockGainMultiplier = 2, powerEffect = \"blockPerTurn\", value = 0, class = \"warrior\", rarity = \"legend\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tJuggernaut = { name = \"절대적인 힘\", cost = 2, desc = \"카드를 사용할 때마다 무작위 적에게 피해 5\", kind = \"Power\", cardPlayedRandomDamage = 5, class = \"warrior\", rarity = \"legend\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tHellraiser = { name = \"지옥검무\", cost = 2, desc = \"이름에 \\\"타격\\\"이 포함된 카드를 뽑을 때마다, 무작위 적에게 사용합니다.\", kind = \"Power\", drawNameMatchAutoPlay = \"타격\", class = \"warrior\", rarity = \"legend\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tBarricade = { name = \"바리케이드\", cost = 3, desc = \"내 턴 시작 시 방어도가 사라지지 않습니다.\", kind = \"Power\", powerEffect = \"keepBlock\", value = 0, class = \"warrior\", rarity = \"legend\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tDemonForm = { name = \"악마의 형상\", cost = 3, desc = \"매턴 힘 +2\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 2, class = \"warrior\", rarity = \"legend\", image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tEnergyBolt = { name = \"에너지 볼트\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"magician\", rarity = \"normal\", fx = \"1d5877e1120a42d0907f204c959888b1\", image = \"e84880eaf89442128d3af2be5c80a74f\" },\n\tMagicGuard = { name = \"매직 가드\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"magician\", rarity = \"normal\", image = \"01b249c26eb34b8aaab774bf221907a1\" },\n\tMagicClaw = { name = \"매직 클로\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"magician\", rarity = \"normal\", hits = 2, fx = \"ba4ac7c8f24845b68b7e689b7effcc93\", image = \"f3fcac2d460041b288cc1973caaaf30f\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", discardAll = true, drawPerDiscarded = 1, image = \"7f70a9dc7e304433bb8121dd9c4df98b\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"7224cd3f9b7e497d9dd65f32a50865e4\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", fx = \"4a937e208875468eb63d891806fba3cd\", image = \"6fa15fd3a0004b409ea516c11a67e533\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"07200f3c74854022baa7ebbefdc4ad8c\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"06865473977849bebe79062dbd608944\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, fx = \"7d52f5e389bd4d44a30cf7cc54538f8f\", image = \"c6685d33cb2641f09d11cfa2d5cc820c\" },\n\tColdBeam = { name = \"콜드 빔\", cost = 2, desc = \"피해 7, 약화 2\", kind = \"Attack\", damage = 7, weak = 2, class = \"icelightning\", rarity = \"unique\", image = \"e8f7c148c79f497d83014e3361f59f5c\" },\n\tChillingStep = { name = \"칠링 스텝\", cost = 1, desc = \"방어도 8\", kind = \"Skill\", block = 8, class = \"icelightning\", rarity = \"unique\", image = \"bef20873a68a4651a91d74be457c2cfc\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"8b935b7d7066493cb462834bbe287c74\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"607fc5457c1c44a0993a5c2fe3fb0c68\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", fx = \"4faa7b78e09643cf86339b8b7cf2abac\", image = \"a80127195bf7471f9545b70e491f4719\" },\n\tWound = { name = \"상처\", cost = 0, desc = \"사용할 수 없다. 손패를 막는 저주.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true },\n\tBurn = { name = \"화상\", cost = 0, desc = \"사용 불가. 손패에 있으면 턴 종료 시 피해 2.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true, endTurnDamage = 2 },\n\tNeutralize = { name = \"커닝식 견제\", cost = 0, desc = \"피해를 3 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 3, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSilentStrike = { name = \"초보 도적의 칼끝\", cost = 1, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSurvivor = { name = \"골목길 생존술\", cost = 1, desc = \"방어도를 8 얻습니다. 카드를 1장 버립니다.\", kind = \"Skill\", block = 8, class = \"rogue\", rarity = \"normal\", discard = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSilentDefend = { name = \"낡은 가죽 방패\", cost = 1, desc = \"방어도를 5 얻습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 1, desc = \"피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"rogue\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해를 3만큼 3번 줍니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"unique\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"카드를 1장 뽑습니다. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"normal\", draw = 1, gainEnergy = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"rogue\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tFlashJump = { name = \"플래시 점프\", cost = 0, desc = \"방어도를 4 얻습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", draw = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNimbleBody = { name = \"님블 바디\", cost = 1, desc = \"민첩을 1 얻습니다. 매 턴 방어도를 2 얻습니다.\", kind = \"Power\", dex = 1, powerEffect = \"blockPerTurn\", value = 2, class = \"rogue\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSlice = { name = \"짧은 단검질\", cost = 0, desc = \"피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShiv = { name = \"표창\", cost = 0, desc = \"피해를 4 줍니다. 소멸.\", kind = \"Attack\", damage = 4, class = \"shiv\", rarity = \"normal\", exhaust = true, token = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerSpray = { name = \"단검비\", cost = 1, desc = \"모든 적에게 피해를 4만큼 2번 줍니다.\", kind = \"Attack\", damage = 4, class = \"thief\", rarity = \"normal\", hits = 2, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerThrow = { name = \"비도 투척\", cost = 1, desc = \"피해를 9 줍니다. 카드를 1장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Attack\", damage = 9, class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPoisonedStab = { name = \"초록 독단검\", cost = 1, desc = \"피해를 6 줍니다. 중독을 3 부여합니다.\", kind = \"Attack\", damage = 6, class = \"rogue\", rarity = \"normal\", poison = 3, image = \"19361e72087946b1888684185b40d935\" },\n\tSuckerPunch = { name = \"골목 기습\", cost = 1, desc = \"피해를 7 줍니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 7, weak = 1, class = \"rogue\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tLeadingStrike = { name = \"초보 표창 던지기\", cost = 1, desc = \"피해를 3 줍니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Attack\", damage = 3, class = \"rogue\", rarity = \"normal\", addShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFollowThrough = { name = \"연달아 찌르기\", cost = 1, desc = \"피해를 7 줍니다. 손에 다른 카드가 5장 이상 있다면, 1번 추가로 적중합니다.\", kind = \"Attack\", damage = 7, otherHandAtLeast = 5, bonusHitsWhenOtherHandAtLeast = 1, class = \"thief\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlickFlack = { name = \"커닝 난무\", cost = 1, desc = \"교활. 모든 적에게 피해를 6 줍니다.\", kind = \"Attack\", damage = 6, class = \"thief\", rarity = \"normal\", sly = true, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tRicochet = { name = \"통통 튀는 표창\", cost = 2, desc = \"교활. 무작위 적에게 피해를 3만큼 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, sly = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPrepared = { name = \"비장의 패\", cost = 1, desc = \"카드를 1장 버리고, 이번 턴에 준 피해의 절반만큼 방어를 얻습니다.\", kind = \"Skill\", blockPerDamageDealtThisTurn = 0.5, class = \"thief\", rarity = \"normal\", discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tAnticipate = { name = \"럭키 예감\", cost = 0, desc = \"이번 턴 동안 민첩을 2 얻습니다.\", kind = \"Skill\", endTurnDexLoss = 2, dex = 2, class = \"rogue\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tDeflect = { name = \"단검 쳐내기\", cost = 0, desc = \"방어도를 4 얻습니다.\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tBladeDance = { name = \"표창 별무리\", cost = 1, desc = \"표창을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", addShiv = 3, exhaust = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBackflip = { name = \"커닝 곡예\", cost = 1, desc = \"방어도를 5 얻습니다. 카드를 2장 뽑습니다.\", kind = \"Skill\", block = 5, class = \"rogue\", rarity = \"normal\", draw = 2, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDodgeAndRoll = { name = \"골목 구르기\", cost = 1, desc = \"방어도를 4 얻습니다. 다음 턴에, 방어도를 4 얻습니다\", kind = \"Skill\", block = 4, class = \"rogue\", rarity = \"normal\", nextTurnBlock = 4, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPiercingWail = { name = \"골목의 살기\", cost = 1, desc = \"이번 턴 동안 모든 적이 힘을 6 잃습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", affectsAllEnemies = true, enemyStrengthLossThisTurn = 6, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCloakAndDagger = { name = \"망토 속 별\", cost = 1, desc = \"방어도를 6 얻습니다. 표창을 1장 손으로 가져옵니다.\", kind = \"Skill\", block = 6, class = \"assassin\", rarity = \"normal\", addShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tDeadlyPoison = { name = \"맹독 조제\", cost = 1, desc = \"중독을 5 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 5, image = \"19361e72087946b1888684185b40d935\" },\n\tSnakebite = { name = \"독니 단검\", cost = 2, desc = \"보존. 중독을 7 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", poison = 7, retain = true, image = \"19361e72087946b1888684185b40d935\" },\n\tUntouchable = { name = \"연막 속 숨기\", cost = 2, desc = \"교활. 방어도를 6 얻습니다.\", kind = \"Skill\", block = 6, class = \"rogue\", rarity = \"normal\", sly = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSkewer = { name = \"꿰뚫는 표창\", cost = 2, desc = \"피해를 8만큼 X번 줍니다.\", kind = \"Attack\", class = \"assassin\", rarity = \"unique\", useAllEnergy = true, xDamagePerEnergy = 8, image = \"92a5020c978c46bdabab910598118b86\" },\n\tBackstab = { name = \"그림자 등찌르기\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 소멸.\", kind = \"Attack\", damage = 10, class = \"rogue\", rarity = \"unique\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPreciseCut = { name = \"급소 절개\", cost = 0, desc = \"피해를 13 줍니다. 손에 있는 다른 카드 1장당 피해량이 2 감소합니다.\", kind = \"Attack\", damage = 13, damagePerOtherHandCard = -2, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFinisher = { name = \"마지막 칼끝\", cost = 1, desc = \"이번 턴에 사용한 공격 카드 1장당 피해를 6 줍니다.\", kind = \"Attack\", damage = 0, damagePerAttackPlayedThisTurn = 6, class = \"thief\", rarity = \"unique\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMementoMori = { name = \"사신의 장부\", cost = 1, desc = \"피해를 9 줍니다. 이번 턴에 버린 카드 1장당 피해량이 4 증가합니다.\", kind = \"Attack\", damage = 9, damagePerDiscardedThisTurn = 4, class = \"thief\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStrangle = { name = \"그림자 올가미\", cost = 1, desc = \"피해를 8 줍니다.\", kind = \"Attack\", damage = 8, class = \"thief\", rarity = \"unique\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tFlechettes = { name = \"표창 셈법\", cost = 1, desc = \"손에 있는 스킬 카드 1장당 피해를 5 줍니다.\", kind = \"Attack\", damage = 0, damagePerSkillInHand = 5, class = \"assassin\", rarity = \"unique\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tPounce = { name = \"어둠을 가르는 도약\", cost = 2, desc = \"피해를 12 줍니다. 다음에 사용하는 스킬 카드의 비용이 0 이 됩니다.\", kind = \"Attack\", damage = 12, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tDash = { name = \"뒷골목 돌파\", cost = 2, desc = \"방어도를 10 얻습니다. 피해를 10 줍니다.\", kind = \"Attack\", damage = 10, block = 10, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tPredator = { name = \"표창 끝의 추격\", cost = 2, desc = \"피해를 15 줍니다. 다음 턴에, 카드를 2장 뽑습니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", nextTurnDraw = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tPinpoint = { name = \"한 점 겨냥\", cost = 3, desc = \"피해를 15 줍니다. 이번 턴에 스킬을 사용할 때마다 비용이 1 감소합니다.\", kind = \"Attack\", damage = 15, class = \"assassin\", rarity = \"unique\", skillCostReductionThisTurn = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tCalculatedGamble = { name = \"메소 건 승부\", cost = 0, desc = \"손에 있는 모든 카드를 버린 뒤, 버린 카드의 수만큼 카드를 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", discardAll = true, drawPerDiscarded = 1, exhaust = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpose = { name = \"약점 들추기\", cost = 0, desc = \"대상 적의 모든 인공물과 방어도를 제거합니다. 취약을 2 부여합니다. 소멸.\", kind = \"Skill\", vuln = 2, class = \"thief\", rarity = \"unique\", removeEnemyBlock = true, removeEnemyArtifact = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHiddenDaggers = { name = \"숨겨둔 표창\", cost = 0, desc = \"카드를 2장 버립니다. 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", discard = 2, addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tEscapePlan = { name = \"비상용 연막탄\", cost = 0, desc = \"카드를 1장 뽑습니다. 뽑은 카드가 스킬 카드라면, 방어도를 3 얻습니다.\", kind = \"Skill\", class = \"rogue\", rarity = \"unique\", draw = 1, drawSkillBlock = 3, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tAcrobatics = { name = \"지붕 위 곡예\", cost = 1, desc = \"카드를 3장 뽑습니다. 카드를 1장 버립니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 3, discard = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tHandTrick = { name = \"재빠른 손놀림\", cost = 1, desc = \"방어도를 7 얻습니다. 이번 턴 동안 손에 있는 스킬 카드 1장에 교활을 추가합니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tExpertise = { name = \"노련한 단검술\", cost = 1, desc = \"손에 있는 카드가 6장이 될 때까지 카드를 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", drawUntilHandSize = 6, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tBubbleBubble = { name = \"독액 농축\", cost = 1, desc = \"적이 중독을 보유하고 있다면, 중독을 9 부여합니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", poison = 9, poisonIfTargetPoisoned = true, image = \"19361e72087946b1888684185b40d935\" },\n\tBlur = { name = \"흐린 잔영\", cost = 1, desc = \"방어도를 5 얻습니다. 다음 턴 시작 시 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 5, class = \"thief\", rarity = \"unique\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tLegSweep = { name = \"발목 베기\", cost = 2, desc = \"약화를 2 부여합니다. 방어도를 11 얻습니다.\", kind = \"Skill\", block = 11, weak = 2, class = \"thief\", rarity = \"unique\", image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tUpMySleeve = { name = \"소매 속 표창\", cost = 2, desc = \"표창을 3장 손으로 가져옵니다. 이 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", addShiv = 3, combatCostReductionOnPlay = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBouncingFlask = { name = \"통통 독병\", cost = 2, desc = \"무작위 적에게 중독을 3만큼 3번 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 3, poisonHits = 3, poisonRandomTargets = true, image = \"19361e72087946b1888684185b40d935\" },\n\tReflex = { name = \"찰나의 반응\", cost = 3, desc = \"교활. 카드를 2장 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 2, sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tHaze = { name = \"보랏빛 독연기\", cost = 3, desc = \"교활. 모든 적에게 중독을 4 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", poison = 4, sly = true, image = \"19361e72087946b1888684185b40d935\" },\n\tTactician = { name = \"골목길 책략\", cost = 3, desc = \"교활. 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", gainEnergy = 1, sly = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tWellLaidPlans = { name = \"빈틈없는 작전\", cost = 1, desc = \"내 턴 종료 시, 카드를 최대 1장까지 보존합니다.\", kind = \"Power\", powerEffect = \"retainOne\", value = 1, class = \"thief\", rarity = \"unique\", image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tInfiniteBlades = { name = \"끝없는 표창통\", cost = 1, desc = \"내 턴 시작 시, 표창을 1장 손으로 가져옵니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", turnStartShiv = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tFootwork = { name = \"사뿐한 발놀림\", cost = 1, desc = \"민첩을 2 얻습니다.\", kind = \"Power\", dex = 2, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tOutbreak = { name = \"독맥 터뜨리기\", cost = 2, desc = \"독이 3번 부여될 때마다 모든 적에게 6 피해를 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 6, image = \"19361e72087946b1888684185b40d935\" },\n\tNoxiousFumes = { name = \"숨막히는 독연기\", cost = 1, desc = \"내 턴 시작 시, 모든 적에게 중독을 2 부여합니다.\", kind = \"Power\", powerEffect = \"poisonPerTurn\", value = 2, class = \"thief\", rarity = \"unique\", poison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tSpeedster = { name = \"그림자 속도전\", cost = 2, desc = \"내 턴 동안 카드를 뽑을 때마다, 모든 적에게 피해를 1 줍니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"unique\", drawDamage = 1, aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tGrandFinale = { name = \"커닝의 대단원\", cost = 0, desc = \"뽑을 카드 더미에 카드가 없을 때만 사용할 수 있습니다. 모든 적에게 피해를 45 줍니다.\", kind = \"Attack\", damage = 45, class = \"thiefmaster\", rarity = \"legend\", playableWhenDrawPileEmpty = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tAssassinate = { name = \"어둠 속 급소\", cost = 0, desc = \"선천성. 피해를 10 줍니다. 취약을 1 부여합니다. 소멸.\", kind = \"Attack\", damage = 10, vuln = 1, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tEchoingSlash = { name = \"메아리 칼자국\", cost = 2, desc = \"모든 적에게 피해를 6 줍니다. 적을 처치할 때마다 이 효과를 반복합니다.\", kind = \"Attack\", damage = 10, class = \"thiefmaster\", rarity = \"legend\", repeatOnKill = true, aoe = true, image = \"dbdbb1b56ae54672ae68ac6882fff6a2\" },\n\tTheHunt = { name = \"커닝 현상금\", cost = 1, desc = \"피해를 10 줍니다. 이 카드로 적을 처치하면 카드 보상을 추가로 얻습니다. 소멸.\", kind = \"Attack\", damage = 6, rewardOnKill = 1, class = \"assassin\", rarity = \"legend\", exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMurder = { name = \"쌓여가는 살의\", cost = 3, desc = \"피해를 1 줍니다. 이번 전투 동안 뽑은 카드 1장당 피해량이 1 증가합니다.\", kind = \"Attack\", damage = 1, damagePerCardDrawnThisCombat = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tMalaise = { name = \"기운 빼는 독\", cost = 2, desc = \"에너지를 모두 사용하고, 사용한 에너지만큼 적에게 약화를 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", useAllEnergy = true, xWeakPerEnergy = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tStormOfSteel = { name = \"쇠별 폭풍\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 버린 카드의 수만큼 표창을 손으로 가져옵니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"legend\", discardAll = true, addShivPerDiscard = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStep = { name = \"그림자 발자국\", cost = 1, desc = \"손에 있는 모든 카드를 버립니다. 다음 턴에, 공격 카드의 피해량이 2배가 됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", discardAll = true, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShadowmeld = { name = \"연막 속 은신\", cost = 1, desc = \"이번 턴 동안 얻는 방어도가 2배가 됩니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tCorrosiveWave = { name = \"부식 독물결\", cost = 1, desc = \"이번 턴에 카드를 뽑을 때마다, 모든 적에게 중독을 2 부여합니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", drawPoison = 2, image = \"19361e72087946b1888684185b40d935\" },\n\tBladeOfInk = { name = \"먹빛 표창\", cost = 1, desc = \"잉크투성이 표창을 2장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBurst = { name = \"연속 술수\", cost = 1, desc = \"이번 턴에 다음에 사용하는 스킬 카드가 1번 추가로 사용됩니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextSkillRepeatCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKnifeTrap = { name = \"숨은 칼날덫\", cost = 2, desc = \"교활. 모든 적에게 피해를 7 주고 중독을 2 부여합니다.\", kind = \"Attack\", damage = 7, class = \"thiefmaster\", rarity = \"legend\", poison = 2, sly = true, aoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tBulletTime = { name = \"멈춘 듯한 순간\", cost = 3, desc = \"이번 턴 동안 더 이상 카드를 뽑을 수 없습니다. 이번 턴 동안 손에 있는 모든 카드를 비용 없이 사용할 수 있습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", handCostZeroThisTurn = true, drawDisabledThisTurn = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tNightmare = { name = \"검은 꿈\", cost = 3, desc = \"카드를 1장 선택합니다. 다음 턴에, 그 카드의 복사본을 3장 손으로 가져옵니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", nextTurnCopies = 3, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tToolsOfTheTrade = { name = \"도적의 연장통\", cost = 1, desc = \"내 턴 시작 시, 카드를 1장 뽑고 카드를 1장 버립니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", turnStartDraw = 1, turnStartDiscard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMasterPlanner = { name = \"작전의 달인\", cost = 2, desc = \"사용한 스킬 카드는 교활해집니다.\", kind = \"Power\", class = \"thiefmaster\", rarity = \"legend\", skillSlyOnPlay = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tFanOfKnives = { name = \"사방 표창비\", cost = 2, desc = \"표창이 이제 모든 적을 대상으로 합니다. 표창을 4장 손으로 가져옵니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", addShiv = 4, shivAoe = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tSerpentForm = { name = \"독사의 몸놀림\", cost = 2, desc = \"카드를 사용할 때마다, 무작위 적에게 피해를 4 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 4, class = \"thiefmaster\", rarity = \"legend\", image = \"19361e72087946b1888684185b40d935\" },\n\tAbrasive = { name = \"거친 숫돌질\", cost = 2, desc = \"교활. 민첩을 1 얻습니다. 가시를 4 얻습니다.\", kind = \"Power\", dex = 1, thorns = 4, class = \"thiefmaster\", rarity = \"legend\", sly = true, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tSuppress = { name = \"소리 없는 제압\", cost = 0, desc = \"선천성. 피해를 9 줍니다. 약화를 2 부여합니다. 소멸.\", kind = \"Attack\", damage = 9, weak = 2, class = \"thiefmaster\", rarity = \"legend\", innate = true, exhaust = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tWraithForm = { name = \"유령 같은 몸놀림\", cost = 3, desc = \"불가침을 2 얻습니다. 내 턴 종료 시 민첩을 1 잃습니다.\", kind = \"Power\", intangible = 2, endTurnDexLoss = 1, class = \"thiefmaster\", rarity = \"legend\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해를 3만큼 2번 줍니다. 이번 턴에 사용한 공격 카드 1장당 피해가 2 증가합니다.\", kind = \"Attack\", damage = 3, damagePerAttackPlayedThisTurn = 2, class = \"thief\", rarity = \"normal\", hits = 2, image = \"92a5020c978c46bdabab910598118b86\" },\n\tCriticalEdge = { name = \"크리티컬 엣지\", cost = 1, desc = \"카드를 1장 뽑습니다. 다음 턴에 공격 카드의 피해량이 2배가 됩니다. 보존.\", kind = \"Skill\", class = \"thief\", rarity = \"unique\", draw = 1, nextTurnAttackMultiplier = 2, retain = true, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"피해를 3 줍니다. 이번 턴에 버린 카드 1장당 피해가 3 증가합니다. 에너지를 1 얻습니다.\", kind = \"Attack\", damage = 3, damagePerDiscardedThisTurn = 3, class = \"thief\", rarity = \"normal\", gainEnergy = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDaggerAcceleration = { name = \"대거 액셀레이션\", cost = 0, desc = \"카드를 1장 뽑습니다. 카드를 1장 버립니다. 버린 카드마다 카드를 1장 더 뽑습니다.\", kind = \"Skill\", class = \"thief\", rarity = \"normal\", draw = 1, discard = 1, drawPerDiscarded = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tKarma = { name = \"카르마\", cost = 1, desc = \"피해를 7 줍니다. 방어도를 무시합니다. 약화 상태의 적에게는 피해가 2배가 됩니다.\", kind = \"Attack\", damage = 7, class = \"thief\", rarity = \"unique\", pierce = true, attackDamageVsWeakMultiplier = 2, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tDaggerMastery = { name = \"대거 마스터리\", cost = 1, desc = \"카드를 사용할 때마다 방어도를 1 얻습니다. 매 턴 첫 카드의 피해가 3 증가합니다.\", kind = \"Power\", firstCardDamageBonus = 3, cardPlayedBlock = 1, class = \"thief\", rarity = \"unique\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘을 1 얻습니다. 민첩을 1 얻습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"thief\", rarity = \"normal\", image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tShieldMastery = { name = \"실드 마스터리\", cost = 1, desc = \"방어도를 7 얻습니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", block = 7, class = \"thief\", rarity = \"normal\", nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tThiefAgility = { name = \"시프 어질리티\", cost = 1, desc = \"방어도를 5 얻습니다. 이번 턴 동안 민첩을 1 얻습니다. 손의 다른 스킬 카드 1장이 교활해집니다.\", kind = \"Skill\", endTurnDexLoss = 1, block = 5, dex = 1, class = \"thief\", rarity = \"unique\", turnHandSlyCount = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tEdgeCarnival = { name = \"엣지 카니발\", cost = 1, desc = \"무작위 적에게 피해를 2만큼 4번 줍니다.\", kind = \"Attack\", damage = 2, class = \"thiefmaster\", rarity = \"unique\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tMuspelHeim = { name = \"무스펠 하임\", cost = 1, desc = \"모든 적에게 피해를 4 줍니다. 이번 턴에 버린 카드 1장당 피해가 2 증가합니다. 약화를 1 부여합니다.\", kind = \"Attack\", damage = 4, damagePerDiscardedThisTurn = 2, weak = 1, class = \"thiefmaster\", rarity = \"unique\", aoe = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMesoExplosion = { name = \"메소 익스플로젼\", cost = 1, desc = \"피해를 2 줍니다. 이번 턴에 버린 카드 1장당 피해가 7 증가합니다. 방어도를 무시합니다.\", kind = \"Attack\", damage = 2, damagePerDiscardedThisTurn = 7, class = \"thiefmaster\", rarity = \"unique\", pierce = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tDarkFlare = { name = \"다크 플레어\", cost = 1, desc = \"매 턴 모든 적에게 피해를 2 줍니다. 카드를 사용할 때마다 무작위 적에게 피해를 2 줍니다.\", kind = \"Power\", cardPlayedRandomDamage = 2, powerEffect = \"damagePerTurn\", value = 2, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tPickPocket = { name = \"픽 파킷\", cost = 1, desc = \"카드를 1장 뽑습니다. 카드를 1장 버리고, 에너지를 1 얻습니다.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"unique\", draw = 1, gainEnergy = 1, discard = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 선택합니다. 다음 턴에 그 카드의 복사본 1장을 손에 넣습니다. 카드를 1장 뽑습니다. 소멸.\", kind = \"Skill\", class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnCopies = 1, nextTurnSelectHandCard = true, nextTurnSelectPrompt = \"복사할 카드를 선택하세요.\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tAdvancedDarkSight = { name = \"어드밴스드 다크 사이트\", cost = 1, desc = \"무형을 1 얻습니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", intangible = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tIntoDarkness = { name = \"인투 다크니스\", cost = 1, desc = \"모든 적에게 약화를 1 부여합니다. 이번 턴 동안 손의 다른 스킬 카드 2장이 교활해집니다.\", kind = \"Skill\", weak = 1, class = \"thiefmaster\", rarity = \"unique\", turnHandSlyCount = 2, affectsAllEnemies = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tVenom = { name = \"베놈\", cost = 1, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독을 1 부여합니다. 적 턴 시작 시 독이 한 번 더 적용됩니다.\", kind = \"Power\", attackPoison = 1, class = \"thiefmaster\", rarity = \"legend\", extraPoisonTicks = 1, image = \"19361e72087946b1888684185b40d935\" },\n\tGrid = { name = \"그리드\", cost = 2, desc = \"가시를 3 얻습니다. 카드를 사용할 때마다 방어도를 1 얻습니다.\", kind = \"Power\", thorns = 3, cardPlayedBlock = 1, class = \"thiefmaster\", rarity = \"unique\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tRadicalDarkness = { name = \"래디컬 다크니스\", cost = 2, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 다음 턴에 방어도가 사라지지 않습니다.\", kind = \"Skill\", blockGainMultiplier = 2, class = \"thiefmaster\", rarity = \"legend\", draw = 1, nextTurnKeepBlock = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tShurikenBurst = { name = \"슈리켄 버스트\", cost = 1, desc = \"무작위 적에게 피해를 3씩 4번 줍니다.\", kind = \"Attack\", damage = 3, class = \"assassin\", rarity = \"normal\", hits = 4, randomTargetEachHit = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tWindTalisman = { name = \"윈드 탈리스만\", cost = 1, desc = \"카드를 1장 뽑습니다. 이번 턴 동안 스킬 카드의 비용이 1 감소합니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"unique\", draw = 1, skillCostReductionThisTurn = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tMarkOfAssassin = { name = \"마크 오브 어쌔신\", cost = 1, desc = \"약화 1을 부여합니다. 약화 상태의 적에게 주는 공격 피해가 1.5배가 됩니다.\", kind = \"Power\", weak = 1, class = \"assassin\", rarity = \"unique\", attackDamageVsWeakMultiplier = 1.5, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tShadowRush = { name = \"쉐도우 러쉬\", cost = 1, desc = \"피해 7, 방어도 5를 얻습니다.\", kind = \"Attack\", damage = 7, block = 5, class = \"assassin\", rarity = \"normal\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tShadowLeap = { name = \"쉐도우 리프\", cost = 0, desc = \"방어도 4를 얻습니다. 다음 턴에 방어도 4를 얻습니다. 소멸.\", kind = \"Skill\", block = 4, class = \"assassin\", rarity = \"normal\", nextTurnBlock = 4, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tShadowBlink = { name = \"쉐도우 블링크\", cost = 1, desc = \"무형 1을 얻습니다. 다음 스킬 카드의 비용이 0이 됩니다. 소멸.\", kind = \"Skill\", intangible = 1, class = \"assassin\", rarity = \"unique\", nextSkillCostZero = true, exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tJavelinMastery = { name = \"자벨린 마스터리\", cost = 1, desc = \"표창의 피해량이 2 증가합니다.\", kind = \"Power\", class = \"assassin\", rarity = \"unique\", shivDamageBonus = 2, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tJavelinAcceleration = { name = \"자벨린 액셀레이션\", cost = 1, desc = \"카드를 2장 뽑습니다. 카드를 1장 버립니다. 표창 1장을 손에 넣습니다.\", kind = \"Skill\", class = \"assassin\", rarity = \"normal\", draw = 2, discard = 1, addShiv = 1, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 1, desc = \"피해를 6씩 2번 줍니다. 방어도를 무시합니다. 이번 턴 첫 카드라면 피해가 더 강해집니다.\", kind = \"Attack\", damage = 6, firstCardDamageBonus = 2, class = \"assassin\", rarity = \"unique\", hits = 2, pierce = true, image = \"b1360ed0c4b942309d240634b8f36872\" },\n\tAssassinPhysicalTraining = { name = \"피지컬 트레이닝\", cost = 2, desc = \"힘 1, 민첩 1을 얻고 카드를 1장 뽑습니다.\", kind = \"Power\", strength = 1, dex = 1, class = \"assassin\", rarity = \"normal\", draw = 1, image = \"49c8f279bfa64bf3954037f17da0052d\" },\n\tTripleThrow = { name = \"트리플 스로우\", cost = 1, desc = \"피해를 4씩 3번 줍니다.\", kind = \"Attack\", damage = 4, class = \"hermit\", rarity = \"normal\", hits = 3, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShurikenChallenge = { name = \"슈리켄 챌린지\", cost = 1, desc = \"피해를 5씩 2번 줍니다. 다음 턴에 카드를 1장 더 뽑습니다.\", kind = \"Attack\", damage = 5, class = \"hermit\", rarity = \"unique\", hits = 2, nextTurnDraw = 1, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitDarkFlare = { name = \"다크 플레어\", cost = 2, desc = \"매 턴 모든 적에게 피해 3을 줍니다. 턴 시작마다 표창 1장을 손에 넣습니다.\", kind = \"Power\", powerEffect = \"damagePerTurn\", value = 3, class = \"hermit\", rarity = \"unique\", turnStartShiv = 1, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitShadowPartner = { name = \"쉐도우 파트너\", cost = 2, desc = \"카드를 1장 뽑습니다. 다음 턴 공격 카드의 피해가 2배가 됩니다.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, nextTurnAttackMultiplier = 2, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tSpiritJavelin = { name = \"스피릿 자벨린\", cost = 1, desc = \"표창이 턴 종료 시 사라지지 않습니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", firstShivDamageBonus = 4, shivRetain = true, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitRadicalDarkness = { name = \"래디컬 다크니스\", cost = 1, desc = \"방어도 4를 얻습니다. 이번 턴 동안 얻는 방어도가 2배가 됩니다. 소멸.\", kind = \"Skill\", block = 4, blockGainMultiplier = 2, class = \"hermit\", rarity = \"unique\", exhaust = true, image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHermitVenom = { name = \"베놈\", cost = 2, desc = \"공격 카드가 막히지 않은 피해를 줄 때마다 중독 1을 부여합니다. 전투 중 독 부여 3회마다 모든 적에게 피해 8을 줍니다.\", kind = \"Power\", attackPoison = 1, class = \"hermit\", rarity = \"legend\", poisonApplicationBurstEvery = 3, poisonApplicationBurstDamage = 8, image = \"19361e72087946b1888684185b40d935\" },\n\tSkilledJavelin = { name = \"숙련된 표창술\", cost = 1, desc = \"표창의 피해량이 2 증가합니다. 매 턴 처음 사용하는 표창의 피해량이 4 증가합니다.\", kind = \"Power\", class = \"hermit\", rarity = \"unique\", shivDamageBonus = 2, firstShivDamageBonus = 4, image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tHermitAdrenaline = { name = \"아드레날린\", cost = 0, desc = \"에너지를 1 얻고 카드를 1장 뽑습니다. 표창 1장을 손에 넣습니다. 소멸.\", kind = \"Skill\", class = \"hermit\", rarity = \"legend\", draw = 1, gainEnergy = 1, addShiv = 1, exhaust = true, image = \"91a2d1c16cb041549adbf1a0d7b1f37f\" },\n}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:PrepareCombatDrawPile()\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()\nlocal slotTid = 0\nslotTid = _TimerService:SetTimerRepeat(function()\n\tif self.CombatOver == true or self.Monsters == nil or #self.Monsters == 0 then\n\t\t_TimerService:ClearTimer(slotTid)\n\t\treturn\n\tend\n\tfor i = 1, #self.Monsters do\n\t\tif self.Monsters[i] ~= nil and self.Monsters[i].alive == true then\n\t\t\tself:PositionMonsterSlot(i)\n\t\tend\n\tend\nend, 0.15)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -2017,7 +2031,7 @@ "Name": null }, "Arguments": [], - "Code": "self.Turn = self.Turn + 1\nself.RetainSelectActive = false\nself.ReserveSelectActive = false\nself.TurnAttackCardsPlayed = 0\nself.TurnDiscardedCards = 0\nself.TurnCardsPlayedThisTurn = 0\nself.DamageDealtThisTurn = 0\nself.NextTurnSelectCopies = 0\nself.NextTurnSelectPrompt = \"\"\nself.SkillCostReductionThisTurn = 0\nself:UpdateDiscardPrompt()\nself.Energy = self.MaxEnergy\nself.BlockGainMultiplier = 1\nself:ApplyRelics(\"turnStart\")\nif self.NextTurnKeepBlock == true then\n\tself.NextTurnKeepBlock = false\nelse\n\tself.PlayerBlock = 0\nend\nif self.ClayBlockNext > 0 then\n\tself.PlayerBlock = self.PlayerBlock + self.ClayBlockNext\n\tself.ClayBlockNext = 0\nend\nself.TurnAttackMultiplier = self.NextTurnAttackMultiplier or 1\nself.NextTurnAttackMultiplier = 1\nself.CardsDrawnThisCombat = self.CardsDrawnThisCombat or 0\nself.ShivFirstDamageBonusUsed = false\nself.ActiveAttackDamageVsWeakMultiplier = 1\nself.DrawDamageThisTurn = 0\nself.DrawPoisonThisTurn = 0\nself.ShivAoeThisCombat = false\nself.SkillSlyOnPlayCards = self.SkillSlyOnPlayCards or {}\nself.TurnSkillSlyCards = {}\nself.EnemyStrengthLossThisTurn = 0\nself.HandCostZeroThisTurn = false\nself.DrawDisabledThisTurn = false\nlocal powerTurnDraw = 0\nlocal powerTurnDiscard = 0\nif self.PlayerPowers ~= nil then\n\tfor i = 1, #self.PlayerPowers do\n\t\tlocal pc = self.Cards[self.PlayerPowers[i]]\n\t\tif pc ~= nil then\n\t\t\tif pc.powerEffect == \"strengthPerTurn\" then\n\t\t\t\tself.PlayerStr = self.PlayerStr + pc.value\n\t\t\telseif pc.powerEffect == \"energyPerTurn\" then\n\t\t\t\tself.Energy = self.Energy + pc.value\n\t\t\telseif pc.powerEffect == \"blockPerTurn\" then\n\t\t\t\tself.PlayerBlock = self.PlayerBlock + pc.value\n\t\t\telseif pc.powerEffect == \"poisonPerTurn\" then\n\t\t\t\tif self.Monsters ~= nil then\n\t\t\t\t\tfor j = 1, #self.Monsters do\n\t\t\t\t\t\tlocal tm = self.Monsters[j]\n\t\t\t\t\t\tif tm ~= nil and tm.alive == true then\n\t\t\t\t\t\t\tself:ApplyPoisonToMonster(tm, pc.value)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif pc.powerEffect == \"damagePerTurn\" then\n\t\t\t\tif self.Monsters ~= nil then\n\t\t\t\t\tself:PlayAoeFx(pc.fx or pc.image, pc.value or 0)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif pc.turnStartShiv ~= nil then\n\t\t\t\tself:AddCardsToHand(\"Shiv\", pc.turnStartShiv)\n\t\t\tend\n\t\t\tif pc.turnStartDraw ~= nil then\n\t\t\t\tpowerTurnDraw = powerTurnDraw + pc.turnStartDraw\n\t\t\tend\n\t\t\tif pc.turnStartDiscard ~= nil then\n\t\t\t\tpowerTurnDiscard = powerTurnDiscard + pc.turnStartDiscard\n\t\t\tend\n\t\tend\n\tend\nend\nif self.NextTurnBlock ~= nil and self.NextTurnBlock > 0 then\n\tself:AddCardBlock(self.NextTurnBlock)\n\tself.NextTurnBlock = 0\nend\nif self.NextTurnAddCards ~= nil then\n\tfor i = 1, #self.NextTurnAddCards do\n\t\tlocal entry = self.NextTurnAddCards[i]\n\t\tif entry ~= nil and entry.cardId ~= nil and entry.amount ~= nil and entry.amount > 0 then\n\t\t\tself:AddCardsToHand(entry.cardId, entry.amount)\n\t\tend\n\tend\n\tself.NextTurnAddCards = {}\nend\nlocal drawN = 5 + (self.NextTurnDraw or 0) + powerTurnDraw\nself.NextTurnDraw = 0\nself:DrawCards(drawN)\nself:RenderHand(true)\nself:RenderCombat()\nif powerTurnDiscard > 0 then\n\tself:BeginDiscardSelection({ discard = math.min(powerTurnDiscard, #self.Hand) })\n\treturn\nend\nself:RenderCombat()", + "Code": "self.Turn = self.Turn + 1\nself.RetainSelectActive = false\nself.ReserveSelectActive = false\nself.TurnAttackCardsPlayed = 0\nself.TurnDiscardedCards = 0\nself.TurnCardsPlayedThisTurn = 0\nself.DamageDealtThisTurn = 0\nself.NextTurnSelectCopies = 0\nself.NextTurnSelectPrompt = \"\"\nself.SkillCostReductionThisTurn = 0\nself:UpdateDiscardPrompt()\nself.Energy = self.MaxEnergy\nself.BlockGainMultiplier = 1\nself:ApplyRelics(\"turnStart\")\nif self.NextTurnKeepBlock == true then\n\tself.NextTurnKeepBlock = false\nelseif self:HasPowerEffect(\"keepBlock\") == true then\nelse\n\tself.PlayerBlock = 0\nend\nif self.ClayBlockNext > 0 then\n\tself.PlayerBlock = self.PlayerBlock + self.ClayBlockNext\n\tself.ClayBlockNext = 0\nend\nself.TurnAttackMultiplier = self.NextTurnAttackMultiplier or 1\nself.NextTurnAttackMultiplier = 1\nself.CardsDrawnThisCombat = self.CardsDrawnThisCombat or 0\nself.ShivFirstDamageBonusUsed = false\nself.ActiveAttackDamageVsWeakMultiplier = 1\nself.DrawDamageThisTurn = 0\nself.DrawPoisonThisTurn = 0\nself.ShivAoeThisCombat = false\nself.ZeroCostCardIdsThisTurn = {}\nself.SkillSlyOnPlayCards = self.SkillSlyOnPlayCards or {}\nself.TurnSkillSlyCards = {}\nself.EnemyStrengthLossThisTurn = 0\nself.HandCostZeroThisTurn = false\nself.DrawDisabledThisTurn = false\nlocal powerTurnDraw = 0\nlocal powerTurnDiscard = 0\nif self.PlayerPowers ~= nil then\n\tfor i = 1, #self.PlayerPowers do\n\t\tlocal pc = self.Cards[self.PlayerPowers[i]]\n\t\tif pc ~= nil then\n\t\t\tif pc.powerEffect == \"strengthPerTurn\" then\n\t\t\t\tself.PlayerStr = self.PlayerStr + pc.value\n\t\t\telseif pc.powerEffect == \"energyPerTurn\" then\n\t\t\t\tself.Energy = self.Energy + pc.value\n\t\t\telseif pc.powerEffect == \"blockPerTurn\" then\n\t\t\t\tself.PlayerBlock = self.PlayerBlock + pc.value\n\t\t\telseif pc.powerEffect == \"keepBlock\" then\n\t\t\telseif pc.powerEffect == \"poisonPerTurn\" then\n\t\t\t\tif self.Monsters ~= nil then\n\t\t\t\t\tfor j = 1, #self.Monsters do\n\t\t\t\t\t\tlocal tm = self.Monsters[j]\n\t\t\t\t\t\tif tm ~= nil and tm.alive == true then\n\t\t\t\t\t\t\tself:ApplyPoisonToMonster(tm, pc.value)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telseif pc.powerEffect == \"damagePerTurn\" then\n\t\t\t\tif self.Monsters ~= nil then\n\t\t\t\t\tself:PlayAoeFx(pc.fx or pc.image, pc.value or 0)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif pc.turnStartShiv ~= nil then\n\t\t\t\tself:AddCardsToHand(\"Shiv\", pc.turnStartShiv)\n\t\t\tend\n\t\t\tif pc.turnStartDraw ~= nil then\n\t\t\t\tpowerTurnDraw = powerTurnDraw + pc.turnStartDraw\n\t\t\tend\n\t\t\tif pc.turnStartDiscard ~= nil then\n\t\t\t\tpowerTurnDiscard = powerTurnDiscard + pc.turnStartDiscard\n\t\t\tend\n\t\tend\n\tend\nend\nif self.NextTurnBlock ~= nil and self.NextTurnBlock > 0 then\n\tself:AddCardBlock(self.NextTurnBlock)\n\tself.NextTurnBlock = 0\nend\nif self.NextTurnAddCards ~= nil then\n\tfor i = 1, #self.NextTurnAddCards do\n\t\tlocal entry = self.NextTurnAddCards[i]\n\t\tif entry ~= nil and entry.cardId ~= nil and entry.amount ~= nil and entry.amount > 0 then\n\t\t\tself:AddCardsToHand(entry.cardId, entry.amount)\n\t\tend\n\tend\n\tself.NextTurnAddCards = {}\nend\nlocal drawN = 5 + (self.NextTurnDraw or 0) + powerTurnDraw\nself.NextTurnDraw = 0\nself:DrawCards(drawN)\nself:RenderHand(true)\nself:RenderCombat()\nif powerTurnDiscard > 0 then\n\tself:BeginDiscardSelection({ discard = math.min(powerTurnDiscard, #self.Hand) })\n\treturn\nend\nself:RenderCombat()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -2199,7 +2213,7 @@ "Name": "animate" } ], - "Code": "local drawnSlots = {}\nlocal drawnCards = {}\nlocal drewAny = false\nif self.DrawDisabledThisTurn == true then\n\treturn drawnCards\nend\nfor i = 1, amount do\n\tif #self.DrawPile <= 0 then\n\t\tself:RecycleDiscardIntoDraw()\n\tend\n\tif #self.DrawPile <= 0 then\n\t\tbreak\n\tend\n\tlocal cardId = table.remove(self.DrawPile)\n\ttable.insert(drawnCards, cardId)\n\tself.CardsDrawnThisCombat = (self.CardsDrawnThisCombat or 0) + 1\n\tself:ApplyDrawTrigger()\n\tif #self.Hand >= 10 then\n\t\ttable.insert(self.DiscardPile, cardId)\n\t\tself:TriggerSly(cardId)\n\telse\n\t\ttable.insert(self.Hand, cardId)\n\t\tdrewAny = true\n\t\ttable.insert(drawnSlots, #self.Hand)\n\tend\nend\nself:RenderPiles()\nif drewAny == true then\n\tself:RenderHand(false)\nend\nif animate == true and #drawnSlots > 0 then\n\tlocal drawStart = Vector2(-590, 8)\n\tfor i = 1, #drawnSlots do\n\t\tlocal slot = drawnSlots[i]\n\t\tself:AnimateCardFrom(slot, drawStart, Vector2(self:GetHandSlotX(slot), 0), 0.08 + i * 0.045)\n\tend\nreturn drawnCards\nend", + "Code": "local drawnSlots = {}\nlocal drawnCards = {}\nlocal drewAny = false\nif self.DrawDisabledThisTurn == true then\n\treturn drawnCards\nend\nfor i = 1, amount do\n\tif #self.DrawPile <= 0 then\n\t\tself:RecycleDiscardIntoDraw()\n\tend\n\tif #self.DrawPile <= 0 then\n\t\tbreak\n\tend\n\tlocal cardId = table.remove(self.DrawPile)\n\ttable.insert(drawnCards, cardId)\n\tself.CardsDrawnThisCombat = (self.CardsDrawnThisCombat or 0) + 1\n\tself:ApplyDrawTrigger()\n\tif #self.Hand >= 10 then\n\t\ttable.insert(self.DiscardPile, cardId)\n\t\tself:TriggerSly(cardId)\n\telse\n\t\ttable.insert(self.Hand, cardId)\n\t\tlocal autoPlayed = self:TriggerDrawnCardAutoPlay(cardId)\n\t\tif autoPlayed ~= true then\n\t\t\tdrewAny = true\n\t\t\ttable.insert(drawnSlots, #self.Hand)\n\t\tend\n\tend\nend\nself:RenderPiles()\nif drewAny == true then\n\tself:RenderHand(false)\nend\nif animate == true and #drawnSlots > 0 then\n\tlocal drawStart = Vector2(-590, 8)\n\tfor i = 1, #drawnSlots do\n\t\tlocal slot = drawnSlots[i]\n\t\tself:AnimateCardFrom(slot, drawStart, Vector2(self:GetHandSlotX(slot), 0), 0.08 + i * 0.045)\n\tend\nend\nreturn drawnCards\n", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -2883,6 +2897,29 @@ "Attributes": [], "Name": "CountOtherHandSkills" }, + { + "Return": { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "string", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "match" + } + ], + "Code": "if match == nil or match == \"\" then\n\treturn 0\nend\nlocal n = 0\nlocal function countPile(pile)\n\tif pile == nil then return end\n\tfor i = 1, #pile do\n\t\tlocal c2 = self.Cards[pile[i]]\n\t\tlocal name = \"\"\n\t\tif c2 ~= nil and c2.name ~= nil then name = c2.name end\n\t\tif string.find(name, match, 1, true) ~= nil then\n\t\t\tn = n + 1\n\t\tend\n\tend\nend\ncountPile(self.Hand)\ncountPile(self.DrawPile)\ncountPile(self.DiscardPile)\ncountPile(self.ExhaustPile)\nreturn n", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "CountOwnedNameMatches" + }, { "Return": { "Type": "number", @@ -2907,12 +2944,217 @@ "Name": "c" } ], - "Code": "local base2 = c.damage or 0\nlocal otherHand = 0\nif self.Hand ~= nil then\n\totherHand = #self.Hand - 1\n\tif otherHand < 0 then otherHand = 0 end\nend\nif c.damagePerOtherHandCard ~= nil then\n\tbase2 = base2 + otherHand * c.damagePerOtherHandCard\nend\nif c.damagePerAttackPlayedThisTurn ~= nil then\n\tbase2 = base2 + (self.TurnAttackCardsPlayed or 0) * c.damagePerAttackPlayedThisTurn\nend\nif c.damagePerDiscardedThisTurn ~= nil then\n\tbase2 = base2 + (self.TurnDiscardedCards or 0) * c.damagePerDiscardedThisTurn\nend\nif c.damagePerSkillInHand ~= nil then\n\tbase2 = base2 + self:CountOtherHandSkills(slot) * c.damagePerSkillInHand\nend\nif c.damagePerCardDrawnThisCombat ~= nil then\n\tbase2 = base2 + (self.CardsDrawnThisCombat or 0) * c.damagePerCardDrawnThisCombat\nend\nif c.kind == \"Attack\" and (self.TurnCardsPlayedThisTurn or 0) == 0 and c.firstCardDamageBonus ~= nil then\n\tbase2 = base2 + c.firstCardDamageBonus\nend\nif c.class == \"shiv\" then\n\tif self:HasPowerField(\"shivDamageBonus\") == true then\n\t\tbase2 = base2 + self:AddPowerFieldTotal(\"shivDamageBonus\")\n\tend\n\tif self.ShivFirstDamageBonusUsed ~= true and self:HasPowerField(\"firstShivDamageBonus\") == true then\n\t\tbase2 = base2 + self:AddPowerFieldTotal(\"firstShivDamageBonus\")\n\tend\nend\nif base2 < 0 then\n\tbase2 = 0\nend\nreturn base2", + "Code": "local base2 = c.damage or 0\nif c.damageNameMatch ~= nil and c.damagePerOwnedNameMatch ~= nil then\n\tbase2 = base2 + self:CountOwnedNameMatches(c.damageNameMatch) * c.damagePerOwnedNameMatch\nend\nif c.damageFromCurrentBlock ~= nil and c.damageFromCurrentBlock ~= 0 then\n\tbase2 = base2 + (self.PlayerBlock or 0) * c.damageFromCurrentBlock\nend\nlocal otherHand = 0\nif self.Hand ~= nil then\n\totherHand = #self.Hand - 1\n\tif otherHand < 0 then otherHand = 0 end\nend\nif c.damagePerOtherHandCard ~= nil then\n\tbase2 = base2 + otherHand * c.damagePerOtherHandCard\nend\nif c.damagePerAttackPlayedThisTurn ~= nil then\n\tbase2 = base2 + (self.TurnAttackCardsPlayed or 0) * c.damagePerAttackPlayedThisTurn\nend\nif c.damagePerDiscardedThisTurn ~= nil then\n\tbase2 = base2 + (self.TurnDiscardedCards or 0) * c.damagePerDiscardedThisTurn\nend\nif c.damagePerSkillInHand ~= nil then\n\tbase2 = base2 + self:CountOtherHandSkills(slot) * c.damagePerSkillInHand\nend\nif c.damagePerCardDrawnThisCombat ~= nil then\n\tbase2 = base2 + (self.CardsDrawnThisCombat or 0) * c.damagePerCardDrawnThisCombat\nend\nif c.kind == \"Attack\" and (self.TurnCardsPlayedThisTurn or 0) == 0 and c.firstCardDamageBonus ~= nil then\n\tbase2 = base2 + c.firstCardDamageBonus\nend\nif c.class == \"shiv\" then\n\tif self:HasPowerField(\"shivDamageBonus\") == true then\n\t\tbase2 = base2 + self:AddPowerFieldTotal(\"shivDamageBonus\")\n\tend\n\tif self.ShivFirstDamageBonusUsed ~= true and self:HasPowerField(\"firstShivDamageBonus\") == true then\n\t\tbase2 = base2 + self:AddPowerFieldTotal(\"firstShivDamageBonus\")\n\tend\nend\nif base2 < 0 then\n\tbase2 = 0\nend\nreturn base2", "Scope": 2, "ExecSpace": 6, "Attributes": [], "Name": "AttackBaseForCard" }, + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "count" + } + ], + "Code": "if count == nil or count <= 0 then\n\treturn\nend\nlocal drawOnExhaust = self:AddPowerFieldTotal(\"drawOnExhaust\")\nif drawOnExhaust ~= nil and drawOnExhaust > 0 then\n\tself:DrawCards(drawOnExhaust * count, true)\nend", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "TriggerExhaustEffects" + }, + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "string", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "cardId" + } + ], + "Code": "if cardId == nil or cardId == \"\" then\n\treturn\nend\nif self.ZeroCostCardIdsThisTurn == nil then\n\tself.ZeroCostCardIdsThisTurn = {}\nend\nself.ZeroCostCardIdsThisTurn[cardId] = true", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "MarkCardCostZeroThisTurn" + }, + { + "Return": { + "Type": "boolean", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "string", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "cardId" + }, + { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "energySpent" + } + ], + "Code": "local c = self.Cards[cardId]\nif c == nil then\n\treturn false\nend\nlocal spent = energySpent or 0\nlocal skillFree = false\nlocal skillRepeat = 0\nif c.kind == \"Skill\" and c.useAllEnergy ~= true and self.NextSkillCostZero == true then\n\tskillFree = true\nend\nif c.kind == \"Skill\" and self.NextSkillRepeatCount ~= nil and self.NextSkillRepeatCount > 0 then\n\tskillRepeat = self.NextSkillRepeatCount\nend\nself.ActiveKillReward = c.rewardOnKill or 0\nself.ActiveKillMaxHpGain = c.maxHpOnKill or 0\nself:ResolveCardEffects(cardId, 0, c, false, spent)\nlocal function applyCardPlayHooks()\n\tif self:HasPowerField(\"cardPlayedBlock\") == true then\n\t\tself:AddCardBlock(self:AddPowerFieldTotal(\"cardPlayedBlock\"))\n\tend\n\tif c.cardPlayedDamage ~= nil and c.cardPlayedDamage > 0 then\n\t\tself:DealDirectDamageToTarget(c.cardPlayedDamage)\n\tend\n\tif c.cardPlayedRandomDamage ~= nil and c.cardPlayedRandomDamage > 0 then\n\t\tself:DealDirectDamageToRandomMonster(c.cardPlayedRandomDamage)\n\tend\nend\napplyCardPlayHooks()\nif skillRepeat > 0 then\n\tlocal remaining = (self.NextSkillRepeatCount or 0) - skillRepeat\n\tif remaining < 0 then remaining = 0 end\n\tself.NextSkillRepeatCount = remaining\n\tfor i = 1, skillRepeat do\n\t\tself:ResolveCardEffects(cardId, 0, c, false, spent)\n\t\tapplyCardPlayHooks()\n\tend\nend\nif c.kind == \"Attack\" then\n\tself.TurnAttackCardsPlayed = (self.TurnAttackCardsPlayed or 0) + 1\nend\nif skillFree == true and c.nextSkillCostZero ~= true then\n\tself.NextSkillCostZero = false\nend\nif c.exhaust == true then\n\tif self.ExhaustPile == nil then self.ExhaustPile = {} end\n\ttable.insert(self.ExhaustPile, cardId)\n\tself:TriggerExhaustEffects(1)\nelseif c.kind ~= \"Power\" then\n\ttable.insert(self.DiscardPile, cardId)\nend\nif self.ActiveKillReward ~= nil and self.ActiveKillReward <= 0 then\n\tself.ActiveKillReward = 0\nend\nif self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain <= 0 then\n\tself.ActiveKillMaxHpGain = 0\nend\nreturn true", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "AutoPlayCardId" + }, + { + "Return": { + "Type": "boolean", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "string", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "cardId" + } + ], + "Code": "if cardId == nil or cardId == \"\" or self.Hand == nil or self.PlayerPowers == nil then\n\treturn false\nend\nlocal c = self.Cards[cardId]\nif c == nil or c.name == nil or c.name == \"\" then\n\treturn false\nend\nfor i = 1, #self.PlayerPowers do\n\tlocal powerCard = self.Cards[self.PlayerPowers[i]]\n\tif powerCard ~= nil and powerCard.drawNameMatchAutoPlay ~= nil and powerCard.drawNameMatchAutoPlay ~= \"\" then\n\t\tif string.find(c.name, powerCard.drawNameMatchAutoPlay, 1, true) ~= nil then\n\t\t\tlocal foundSlot = 0\n\t\t\tfor hi = 1, #self.Hand do\n\t\t\t\tif self.Hand[hi] == cardId then\n\t\t\t\t\tfoundSlot = hi\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\t\tif foundSlot <= 0 then\n\t\t\t\treturn false\n\t\t\tend\n\t\t\ttable.remove(self.Hand, foundSlot)\n\t\t\tself:AutoPlayCardId(cardId, 0)\n\t\t\treturn true\n\t\tend\n\tend\nend\nreturn false", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "TriggerDrawnCardAutoPlay" + }, + { + "Return": { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "any", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "c" + }, + { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "energySpent" + } + ], + "Code": "if c == nil or self.DrawPile == nil then\n\treturn 0\nend\nlocal count = c.playTopDrawPileCount or 0\nif c.playTopDrawPileCountPerEnergy ~= nil and c.playTopDrawPileCountPerEnergy > 0 then\n\tcount = count + ((energySpent or 0) * c.playTopDrawPileCountPerEnergy)\nend\nif count <= 0 then\n\treturn 0\nend\nlocal played = 0\nfor i = 1, count do\n\tif #self.DrawPile <= 0 then\n\t\tbreak\n\tend\n\tlocal topCardId = table.remove(self.DrawPile)\n\tif topCardId ~= nil then\n\t\tself:AutoPlayCardId(topCardId, 0)\n\t\tplayed = played + 1\n\tend\nend\nreturn played", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "PlayTopDrawPileCards" + }, + { + "Return": { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "any", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "c" + }, + { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "count" + } + ], + "Code": "if c == nil or count == nil or count <= 0 then\n\treturn 0\nend\nlocal pool = {}\nfor id, rc in pairs(self.Cards) do\n\tif rc ~= nil and rc.token ~= true and rc.curse ~= true and rc.unplayable ~= true then\n\t\tlocal ok = true\n\t\tif c.addRandomCardKind ~= nil and rc.kind ~= c.addRandomCardKind then ok = false end\n\t\tif c.addRandomCardSameClass == true and rc.class ~= c.class then ok = false end\n\t\tif ok == true then table.insert(pool, id) end\n\tend\nend\nif #pool <= 0 then\n\treturn 0\nend\nlocal added = 0\nfor i = 1, count do\n\tlocal cardId2 = pool[math.random(1, #pool)]\n\tif cardId2 ~= nil then\n\t\tself:AddCardsToHand(cardId2, 1)\n\t\tif c.addedCardsCostZeroThisTurn == true then\n\t\t\tself:MarkCardCostZeroThisTurn(cardId2)\n\t\tend\n\t\tadded = added + 1\n\tend\nend\nreturn added", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "AddRandomCardsFromEffect" + }, + { + "Return": { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "any", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "c" + } + ], + "Code": "if c == nil or c.exhaustHandNonAttack ~= true or self.Hand == nil or #self.Hand <= 0 then\n\treturn 0\nend\nlocal exhausted = 0\nfor i = #self.Hand, 1, -1 do\n\tlocal cardId2 = self.Hand[i]\n\tlocal hc = self.Cards[cardId2]\n\tif hc == nil or hc.kind ~= \"Attack\" then\n\t\ttable.remove(self.Hand, i)\n\t\tif self.ExhaustPile == nil then self.ExhaustPile = {} end\n\t\ttable.insert(self.ExhaustPile, cardId2)\n\t\texhausted = exhausted + 1\n\tend\nend\nif exhausted > 0 then\n\tif c.blockPerExhaustedCard ~= nil and c.blockPerExhaustedCard > 0 then\n\t\tself:AddCardBlock(exhausted * c.blockPerExhaustedCard)\n\tend\n\tself:TriggerExhaustEffects(exhausted)\nend\nreturn exhausted", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "ExhaustHandNonAttack" + }, + { + "Return": { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "any", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "c" + } + ], + "Code": "if c == nil or c.exhaustHandAll ~= true or self.Hand == nil or #self.Hand <= 0 then\n\treturn 0\nend\nlocal exhausted = 0\nwhile #self.Hand > 0 do\n\tlocal cardId2 = table.remove(self.Hand)\n\tif self.ExhaustPile == nil then self.ExhaustPile = {} end\n\ttable.insert(self.ExhaustPile, cardId2)\n\texhausted = exhausted + 1\nend\nif exhausted > 0 then\n\tself:TriggerExhaustEffects(exhausted)\nend\nreturn exhausted", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "ExhaustHandAll" + }, { "Return": { "Type": "number", @@ -3034,7 +3276,7 @@ "Name": "energySpent" } ], - "Code": "if c == nil then\n\treturn\nend\nif c.blockGainMultiplier ~= nil and c.blockGainMultiplier > 0 then\n\tself.BlockGainMultiplier = (self.BlockGainMultiplier or 1) * c.blockGainMultiplier\nend\nif c.nextSkillCostZero == true then\n\tself.NextSkillCostZero = true\nend\nif c.nextSkillRepeatCount ~= nil and c.nextSkillRepeatCount > 0 then\n\tself.NextSkillRepeatCount = (self.NextSkillRepeatCount or 0) + c.nextSkillRepeatCount\nend\nif c.skillCostReductionThisTurn ~= nil and c.skillCostReductionThisTurn > 0 then\n\tself.SkillCostReductionThisTurn = (self.SkillCostReductionThisTurn or 0) + c.skillCostReductionThisTurn\nend\nif c.handCostZeroThisTurn == true then\n\tself.HandCostZeroThisTurn = true\nend\nif c.drawDisabledThisTurn == true then\n\tself.DrawDisabledThisTurn = true\nend\nif c.drawDamage ~= nil and c.drawDamage > 0 and c.kind ~= \"Power\" then\n\tself.DrawDamageThisTurn = (self.DrawDamageThisTurn or 0) + c.drawDamage\nend\nif c.drawPoison ~= nil and c.drawPoison > 0 and c.kind ~= \"Power\" then\n\tself.DrawPoisonThisTurn = (self.DrawPoisonThisTurn or 0) + c.drawPoison\nend\nif c.shivAoe == true and c.kind ~= \"Power\" then\n\tself.ShivAoeThisCombat = true\nend\nif c.skillSlyOnPlay == true and c.kind == \"Skill\" then\n\tif self.SkillSlyOnPlayCards == nil then\n\t\tself.SkillSlyOnPlayCards = {}\n\tend\n\tself.SkillSlyOnPlayCards[cardId] = true\nend\nif c.turnHandSlyCount ~= nil and c.turnHandSlyCount > 0 then\n\tif self.TurnSkillSlyCards == nil then\n\t\tself.TurnSkillSlyCards = {}\n\tend\n\tlocal picked = 0\n\tif self.Hand ~= nil then\n\t\tfor i = 1, #self.Hand do\n\t\t\tlocal hid = self.Hand[i]\n\t\t\tif hid ~= nil and hid ~= cardId then\n\t\t\t\tlocal hc = self.Cards[hid]\n\t\t\t\tif hc ~= nil and hc.kind == \"Skill\" and self.TurnSkillSlyCards[hid] ~= true and self.SkillSlyOnPlayCards[hid] ~= true and hc.sly ~= true then\n\t\t\t\t\tself.TurnSkillSlyCards[hid] = true\n\t\t\t\t\tpicked = picked + 1\n\t\t\t\t\tif picked >= c.turnHandSlyCount then\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nlocal xEnergy = energySpent or 0\nlocal weakAmount = c.weak or 0\nlocal vulnAmount = c.vuln or 0\nlocal poisonAmount = c.poison or 0\nif c.xWeakPerEnergy ~= nil and c.xWeakPerEnergy > 0 then\n\tweakAmount = weakAmount + xEnergy * c.xWeakPerEnergy\nend\nif c.kind == \"Attack\" then\n\tif c.damage ~= nil or c.xDamagePerEnergy ~= nil then\n\t\tself:PlayerAttackMotion()\n\t\tlocal baseDmg = self:AttackBaseForCard(slot, c)\n\t\tself.ActiveAttackDamageVsWeakMultiplier = c.attackDamageVsWeakMultiplier or 1\n\t\tif c.xDamagePerEnergy ~= nil and c.xDamagePerEnergy > 0 then\n\t\t\tbaseDmg = xEnergy * c.xDamagePerEnergy\n\t\tend\n\t\tlocal total = 0\n\t\tlocal hitN = c.hits or 1\n\t\tif c.otherHandAtLeast ~= nil and c.bonusHitsWhenOtherHandAtLeast ~= nil then\n\t\t\tlocal otherHand = 0\n\t\t\tif self.Hand ~= nil then\n\t\t\t\totherHand = #self.Hand - 1\n\t\t\t\tif otherHand < 0 then otherHand = 0 end\n\t\t\tend\n\t\t\tif otherHand >= c.otherHandAtLeast then\n\t\t\t\thitN = hitN + c.bonusHitsWhenOtherHandAtLeast\n\t\t\tend\n\t\tend\n\t\tfor h = 1, hitN do\n\t\t\ttotal = total + self:CalcPlayerAttack(baseDmg)\n\t\tend\n\t\tlocal useAoe = c.aoe == true\n\t\tif c.class == \"shiv\" and (self.ShivAoeThisCombat == true or self:HasPowerField(\"shivAoe\") == true) then\n\t\t\tuseAoe = true\n\t\tend\n\t\tif c.class == \"shiv\" and self.ShivFirstDamageBonusUsed ~= true and self:HasPowerField(\"firstShivDamageBonus\") == true then\n\t\t\tself.ShivFirstDamageBonusUsed = true\n\t\tend\n\t\tlocal function countAliveMonsters()\n\t\t\tlocal n = 0\n\t\t\tif self.Monsters ~= nil then\n\t\t\t\tfor mi = 1, #self.Monsters do\n\t\t\t\t\tlocal om = self.Monsters[mi]\n\t\t\t\t\tif om ~= nil and om.alive == true then n = n + 1 end\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn n\n\t\tend\n\t\tlocal function randomAliveMonsterIndex()\n\t\t\tlocal alive = {}\n\t\t\tif self.Monsters ~= nil then\n\t\t\t\tfor mi = 1, #self.Monsters do\n\t\t\t\t\tlocal om = self.Monsters[mi]\n\t\t\t\t\tif om ~= nil and om.alive == true then\n\t\t\t\t\t\ttable.insert(alive, mi)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #alive <= 0 then\n\t\t\t\treturn 0\n\t\t\tend\n\t\t\treturn alive[math.random(1, #alive)]\n\t\tend\n\t\tlocal function resolveAttackRound()\n\t\t\tlocal roundKilled = false\n\t\t\tif useAoe == true then\n\t\t\t\tlocal killed = self:DealDamageToAllMonsters(total, true)\n\t\t\t\tif killed == true then roundKilled = true end\n\t\t\telseif c.randomTargetEachHit == true then\n\t\t\t\tfor h = 1, hitN do\n\t\t\t\t\tlocal targetIdx = randomAliveMonsterIndex()\n\t\t\t\t\tif targetIdx ~= nil and targetIdx > 0 then\n\t\t\t\t\t\tlocal prev = self.TargetIndex\n\t\t\t\t\t\tself.TargetIndex = targetIdx\n\t\t\t\t\t\tlocal killed = self:DealDamageToTarget(total / hitN, c.pierce == true)\n\t\t\t\t\t\tself.TargetIndex = prev\n\t\t\t\t\t\tif killed == true then roundKilled = true end\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal killed = self:DealDamageToTarget(total, c.pierce == true)\n\t\t\t\tif killed == true then roundKilled = true end\n\t\t\tend\n\t\t\treturn roundKilled\n\t\tend\n\t\tlocal totalDamage = 0\n\t\tlocal roundKilled = false\n\t\trepeat\n\t\t\troundKilled = resolveAttackRound()\n\t\t\ttotalDamage = totalDamage + total\n\t\tuntil c.repeatOnKill ~= true or roundKilled ~= true or countAliveMonsters() <= 0\n\t\tself.DamageDealtThisTurn = (self.DamageDealtThisTurn or 0) + totalDamage\n\tend\n\tif c.block ~= nil then\n\t\tself:AddCardBlock(c.block)\n\tend\n\tif free ~= true then\n\t\tself:ApplyRelics(\"cardPlayed\")\n\tend\nelseif c.kind == \"Skill\" then\n\tif c.block ~= nil then\n\t\tself:AddCardBlock(c.block)\n\tend\nelseif c.kind == \"Power\" then\n\tif free ~= true then\n\t\ttable.insert(self.PlayerPowers, cardId)\n\tend\nend\nif c.strength ~= nil then\n\tself.PlayerStr = self.PlayerStr + c.strength\nend\nif c.dex ~= nil then\n\tself.PlayerDex = self.PlayerDex + c.dex\nend\nif c.thorns ~= nil then\n\tself.PlayerThorns = self.PlayerThorns + c.thorns\nend\nif c.selfVuln ~= nil then\n\tself.PlayerVuln = self.PlayerVuln + c.selfVuln\nend\nif c.heal ~= nil then\n\tself.PlayerHp = math.min(self.PlayerHp + c.heal, self.PlayerMaxHp)\nend\nif c.gainEnergy ~= nil and c.gainEnergy ~= 0 then\n\tself.Energy = self.Energy + c.gainEnergy\nend\nif c.intangible ~= nil and c.intangible > 0 then\n\tself.PlayerIntangible = (self.PlayerIntangible or 0) + c.intangible\nend\nself.TurnCardsPlayedThisTurn = (self.TurnCardsPlayedThisTurn or 0) + 1\nif c.blockPerDamageDealtThisTurn ~= nil and c.blockPerDamageDealtThisTurn > 0 then\n\tself:AddCardBlock((self.DamageDealtThisTurn or 0) * c.blockPerDamageDealtThisTurn)\nend\nself:QueueNextTurnEffects(c)\nif c.combatCostReductionOnPlay ~= nil and c.combatCostReductionOnPlay > 0 then\n\tif self.CombatCardCostReduction == nil then\n\t\tself.CombatCardCostReduction = {}\n\tend\n\tself.CombatCardCostReduction[cardId] = (self.CombatCardCostReduction[cardId] or 0) + c.combatCostReductionOnPlay\nend\nif c.weak ~= nil or c.vuln ~= nil or c.poison ~= nil or c.xWeakPerEnergy ~= nil or c.affectsAllEnemies == true or c.removeEnemyBlock == true or c.removeEnemyArtifact == true or (c.enemyStrengthLossThisTurn ~= nil and c.enemyStrengthLossThisTurn > 0) then\n\tlocal tm = self.Monsters[self.TargetIndex]\n\tif tm == nil or tm.alive ~= true then\n\t\tfor i = 1, #self.Monsters do\n\t\t\tif self.Monsters[i].alive == true then tm = self.Monsters[i]; self.TargetIndex = i; break end\n\t\tend\n\tend\n\tlocal targets = {}\n\tif c.affectsAllEnemies == true and self.Monsters ~= nil then\n\t\tfor mi = 1, #self.Monsters do\n\t\t\tlocal om = self.Monsters[mi]\n\t\t\tif om ~= nil and om.alive == true then\n\t\t\t\ttable.insert(targets, om)\n\t\t\tend\n\t\tend\n\telseif tm ~= nil and tm.alive == true then\n\t\ttable.insert(targets, tm)\n\tend\n\tif c.enemyStrengthLossThisTurn ~= nil and c.enemyStrengthLossThisTurn > 0 then\n\t\tself.EnemyStrengthLossThisTurn = (self.EnemyStrengthLossThisTurn or 0) + c.enemyStrengthLossThisTurn\n\tend\n\tfor ti = 1, #targets do\n\t\tlocal target = targets[ti]\n\t\tif target ~= nil and target.alive == true then\n\t\t\tif c.removeEnemyBlock == true then\n\t\t\t\ttarget.block = 0\n\t\t\tend\n\t\t\tif c.removeEnemyArtifact == true then\n\t\t\t\ttarget.artifact = 0\n\t\t\tend\n\t\t\tif weakAmount ~= nil and weakAmount > 0 then\n\t\t\t\tif target.artifact ~= nil and target.artifact > 0 then\n\t\t\t\t\ttarget.artifact = target.artifact - 1\n\t\t\t\telse\n\t\t\t\t\ttarget.weak = target.weak + weakAmount\n\t\t\t\tend\n\t\t\tend\n\t\t\tif poisonAmount ~= nil and poisonAmount > 0 then\n\t\t\t\tif c.poisonIfTargetPoisoned ~= true or (target.poison ~= nil and target.poison > 0) then\n\t\t\t\t\tlocal poisonHits = c.poisonHits or 1\n\t\t\t\t\tfor pi = 1, poisonHits do\n\t\t\t\t\t\tlocal target2 = target\n\t\t\t\t\t\tif c.poisonRandomTargets == true and self.Monsters ~= nil then\n\t\t\t\t\t\t\tlocal alive = {}\n\t\t\t\t\t\t\tfor mi = 1, #self.Monsters do\n\t\t\t\t\t\t\t\tlocal om = self.Monsters[mi]\n\t\t\t\t\t\t\t\tif om ~= nil and om.alive == true then\n\t\t\t\t\t\t\t\t\ttable.insert(alive, om)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif #alive > 0 then\n\t\t\t\t\t\t\t\ttarget2 = alive[math.random(#alive)]\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif target2 ~= nil and target2.alive == true then\n\t\t\t\t\t\t\tself:ApplyPoisonToMonster(target2, poisonAmount)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif vulnAmount ~= nil and vulnAmount > 0 then\n\t\t\t\tif target.artifact ~= nil and target.artifact > 0 then\n\t\t\t\t\ttarget.artifact = target.artifact - 1\n\t\t\t\telse\n\t\t\t\t\ttarget.vuln = target.vuln + vulnAmount\n\t\t\t\t\tif self:HasRelic(\"championBelt\") then\n\t\t\t\t\t\ttarget.weak = target.weak + 1\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nlocal drawnCards = {}\nif c.draw ~= nil then\n\tdrawnCards = self:DrawCards(c.draw, true) or {}\nend\nif c.drawUntilHandSize ~= nil and c.drawUntilHandSize > 0 then\n\tlocal currentHand = 0\n\tif self.Hand ~= nil then\n\t\tcurrentHand = #self.Hand\n\t\tif slot ~= nil and slot > 0 and self.Hand[slot] == cardId then\n\t\t\tcurrentHand = currentHand - 1\n\t\tend\n\tend\n\tlocal need = c.drawUntilHandSize - currentHand\n\tif need > 0 then\n\t\tlocal moreDrawnCards = self:DrawCards(need, true) or {}\n\t\tfor i = 1, #moreDrawnCards do\n\t\t\ttable.insert(drawnCards, moreDrawnCards[i])\n\t\tend\n\tend\nend\nif c.drawSkillBlock ~= nil and c.drawSkillBlock > 0 then\n\tfor i = 1, #drawnCards do\n\t\tlocal drawnCard = self.Cards[drawnCards[i]]\n\t\tif drawnCard ~= nil and drawnCard.kind == \"Skill\" then\n\t\t\tself:AddCardBlock(c.drawSkillBlock)\n\t\tend\n\tend\nend\nif c.addShiv ~= nil and c.discard == nil and c.discardAll ~= true then\n\tself:AddCardsToHand(\"Shiv\", c.addShiv)\nend", + "Code": "if c == nil then\n\treturn\nend\nif c.blockGainMultiplier ~= nil and c.blockGainMultiplier > 0 then\n\tself.BlockGainMultiplier = (self.BlockGainMultiplier or 1) * c.blockGainMultiplier\nend\nif c.nextSkillCostZero == true then\n\tself.NextSkillCostZero = true\nend\nif c.nextSkillRepeatCount ~= nil and c.nextSkillRepeatCount > 0 then\n\tself.NextSkillRepeatCount = (self.NextSkillRepeatCount or 0) + c.nextSkillRepeatCount\nend\nif c.skillCostReductionThisTurn ~= nil and c.skillCostReductionThisTurn > 0 then\n\tself.SkillCostReductionThisTurn = (self.SkillCostReductionThisTurn or 0) + c.skillCostReductionThisTurn\nend\nif c.handCostZeroThisTurn == true then\n\tself.HandCostZeroThisTurn = true\nend\nif c.drawDisabledThisTurn == true then\n\tself.DrawDisabledThisTurn = true\nend\nif c.drawDamage ~= nil and c.drawDamage > 0 and c.kind ~= \"Power\" then\n\tself.DrawDamageThisTurn = (self.DrawDamageThisTurn or 0) + c.drawDamage\nend\nif c.drawPoison ~= nil and c.drawPoison > 0 and c.kind ~= \"Power\" then\n\tself.DrawPoisonThisTurn = (self.DrawPoisonThisTurn or 0) + c.drawPoison\nend\nif c.shivAoe == true and c.kind ~= \"Power\" then\n\tself.ShivAoeThisCombat = true\nend\nif c.skillSlyOnPlay == true and c.kind == \"Skill\" then\n\tif self.SkillSlyOnPlayCards == nil then\n\t\tself.SkillSlyOnPlayCards = {}\n\tend\n\tself.SkillSlyOnPlayCards[cardId] = true\nend\nif c.turnHandSlyCount ~= nil and c.turnHandSlyCount > 0 then\n\tif self.TurnSkillSlyCards == nil then\n\t\tself.TurnSkillSlyCards = {}\n\tend\n\tlocal picked = 0\n\tif self.Hand ~= nil then\n\t\tfor i = 1, #self.Hand do\n\t\t\tlocal hid = self.Hand[i]\n\t\t\tif hid ~= nil and hid ~= cardId then\n\t\t\t\tlocal hc = self.Cards[hid]\n\t\t\t\tif hc ~= nil and hc.kind == \"Skill\" and self.TurnSkillSlyCards[hid] ~= true and self.SkillSlyOnPlayCards[hid] ~= true and hc.sly ~= true then\n\t\t\t\t\tself.TurnSkillSlyCards[hid] = true\n\t\t\t\t\tpicked = picked + 1\n\t\t\t\t\tif picked >= c.turnHandSlyCount then\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nlocal xEnergy = energySpent or 0\nlocal weakAmount = c.weak or 0\nlocal vulnAmount = c.vuln or 0\nlocal poisonAmount = c.poison or 0\nif c.xWeakPerEnergy ~= nil and c.xWeakPerEnergy > 0 then\n\tweakAmount = weakAmount + xEnergy * c.xWeakPerEnergy\nend\nif c.kind == \"Attack\" then\n\tif c.damage ~= nil or c.xDamagePerEnergy ~= nil or c.damageFromCurrentBlock ~= nil then\n\t\tself:PlayerAttackMotion()\n\t\tlocal baseDmg = self:AttackBaseForCard(slot, c)\n\t\tself.ActiveAttackDamageVsWeakMultiplier = c.attackDamageVsWeakMultiplier or 1\n\t\tif c.xDamagePerEnergy ~= nil and c.xDamagePerEnergy > 0 then\n\t\t\tbaseDmg = xEnergy * c.xDamagePerEnergy\n\t\tend\n\t\tlocal total = 0\n\t\tlocal hitN = c.hits or 1\n\t\tif c.otherHandAtLeast ~= nil and c.bonusHitsWhenOtherHandAtLeast ~= nil then\n\t\t\tlocal otherHand = 0\n\t\t\tif self.Hand ~= nil then\n\t\t\t\totherHand = #self.Hand - 1\n\t\t\t\tif otherHand < 0 then otherHand = 0 end\n\t\t\tend\n\t\t\tif otherHand >= c.otherHandAtLeast then\n\t\t\t\thitN = hitN + c.bonusHitsWhenOtherHandAtLeast\n\t\t\tend\n\t\tend\n\t\tfor h = 1, hitN do\n\t\t\ttotal = total + self:CalcPlayerAttack(baseDmg)\n\t\tend\n\t\tlocal useAoe = c.aoe == true\n\t\tif c.class == \"shiv\" and (self.ShivAoeThisCombat == true or self:HasPowerField(\"shivAoe\") == true) then\n\t\t\tuseAoe = true\n\t\tend\n\t\tif c.class == \"shiv\" and self.ShivFirstDamageBonusUsed ~= true and self:HasPowerField(\"firstShivDamageBonus\") == true then\n\t\t\tself.ShivFirstDamageBonusUsed = true\n\t\tend\n\t\tlocal function countAliveMonsters()\n\t\t\tlocal n = 0\n\t\t\tif self.Monsters ~= nil then\n\t\t\t\tfor mi = 1, #self.Monsters do\n\t\t\t\t\tlocal om = self.Monsters[mi]\n\t\t\t\t\tif om ~= nil and om.alive == true then n = n + 1 end\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn n\n\t\tend\n\t\tlocal function randomAliveMonsterIndex()\n\t\t\tlocal alive = {}\n\t\t\tif self.Monsters ~= nil then\n\t\t\t\tfor mi = 1, #self.Monsters do\n\t\t\t\t\tlocal om = self.Monsters[mi]\n\t\t\t\t\tif om ~= nil and om.alive == true then\n\t\t\t\t\t\ttable.insert(alive, mi)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #alive <= 0 then\n\t\t\t\treturn 0\n\t\t\tend\n\t\t\treturn alive[math.random(1, #alive)]\n\t\tend\n\t\tlocal function resolveAttackRound()\n\t\t\tlocal roundKilled = false\n\t\t\tif useAoe == true then\n\t\t\t\tlocal killed = self:DealDamageToAllMonsters(total, true)\n\t\t\t\tif killed == true then roundKilled = true end\n\t\t\telseif c.randomTargetEachHit == true then\n\t\t\t\tfor h = 1, hitN do\n\t\t\t\t\tlocal targetIdx = randomAliveMonsterIndex()\n\t\t\t\t\tif targetIdx ~= nil and targetIdx > 0 then\n\t\t\t\t\t\tlocal prev = self.TargetIndex\n\t\t\t\t\t\tself.TargetIndex = targetIdx\n\t\t\t\t\t\tlocal killed = self:DealDamageToTarget(total / hitN, c.pierce == true)\n\t\t\t\t\t\tself.TargetIndex = prev\n\t\t\t\t\t\tif killed == true then roundKilled = true end\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal killed = self:DealDamageToTarget(total, c.pierce == true)\n\t\t\t\tif killed == true then roundKilled = true end\n\t\t\tend\n\t\t\treturn roundKilled\n\t\tend\n\t\tlocal totalDamage = 0\n\t\tlocal roundKilled = false\n\t\trepeat\n\t\t\troundKilled = resolveAttackRound()\n\t\t\ttotalDamage = totalDamage + total\n\t\tuntil c.repeatOnKill ~= true or roundKilled ~= true or countAliveMonsters() <= 0\n\t\tself.DamageDealtThisTurn = (self.DamageDealtThisTurn or 0) + totalDamage\n\tend\n\tif c.block ~= nil then\n\t\tself:AddCardBlock(c.block)\n\tend\n\tif free ~= true then\n\t\tself:ApplyRelics(\"cardPlayed\")\n\tend\nelseif c.kind == \"Skill\" then\n\tif c.block ~= nil then\n\t\tself:AddCardBlock(c.block)\n\tend\nelseif c.kind == \"Power\" then\n\tif free ~= true then\n\t\ttable.insert(self.PlayerPowers, cardId)\n\tend\nend\nif c.strength ~= nil then\n\tself.PlayerStr = self.PlayerStr + c.strength\nend\nif c.dex ~= nil then\n\tself.PlayerDex = self.PlayerDex + c.dex\nend\nif c.thorns ~= nil then\n\tself.PlayerThorns = self.PlayerThorns + c.thorns\nend\nif c.selfVuln ~= nil then\n\tself.PlayerVuln = self.PlayerVuln + c.selfVuln\nend\nif c.heal ~= nil then\n\tself.PlayerHp = math.min(self.PlayerHp + c.heal, self.PlayerMaxHp)\nend\nif c.gainEnergy ~= nil and c.gainEnergy ~= 0 then\n\tself.Energy = self.Energy + c.gainEnergy\nend\nif c.intangible ~= nil and c.intangible > 0 then\n\tself.PlayerIntangible = (self.PlayerIntangible or 0) + c.intangible\nend\nself.TurnCardsPlayedThisTurn = (self.TurnCardsPlayedThisTurn or 0) + 1\nif c.blockPerDamageDealtThisTurn ~= nil and c.blockPerDamageDealtThisTurn > 0 then\n\tself:AddCardBlock((self.DamageDealtThisTurn or 0) * c.blockPerDamageDealtThisTurn)\nend\nself:QueueNextTurnEffects(c)\nif c.combatCostReductionOnPlay ~= nil and c.combatCostReductionOnPlay > 0 then\n\tif self.CombatCardCostReduction == nil then\n\t\tself.CombatCardCostReduction = {}\n\tend\n\tself.CombatCardCostReduction[cardId] = (self.CombatCardCostReduction[cardId] or 0) + c.combatCostReductionOnPlay\nend\nif c.weak ~= nil or c.vuln ~= nil or c.poison ~= nil or c.xWeakPerEnergy ~= nil or c.affectsAllEnemies == true or c.removeEnemyBlock == true or c.removeEnemyArtifact == true or (c.enemyStrengthLossThisTurn ~= nil and c.enemyStrengthLossThisTurn > 0) then\n\tlocal tm = self.Monsters[self.TargetIndex]\n\tif tm == nil or tm.alive ~= true then\n\t\tfor i = 1, #self.Monsters do\n\t\t\tif self.Monsters[i].alive == true then tm = self.Monsters[i]; self.TargetIndex = i; break end\n\t\tend\n\tend\n\tlocal targets = {}\n\tif c.affectsAllEnemies == true and self.Monsters ~= nil then\n\t\tfor mi = 1, #self.Monsters do\n\t\t\tlocal om = self.Monsters[mi]\n\t\t\tif om ~= nil and om.alive == true then\n\t\t\t\ttable.insert(targets, om)\n\t\t\tend\n\t\tend\n\telseif tm ~= nil and tm.alive == true then\n\t\ttable.insert(targets, tm)\n\tend\n\tif c.enemyStrengthLossThisTurn ~= nil and c.enemyStrengthLossThisTurn > 0 then\n\t\tself.EnemyStrengthLossThisTurn = (self.EnemyStrengthLossThisTurn or 0) + c.enemyStrengthLossThisTurn\n\tend\n\tfor ti = 1, #targets do\n\t\tlocal target = targets[ti]\n\t\tif target ~= nil and target.alive == true then\n\t\t\tif c.removeEnemyBlock == true then\n\t\t\t\ttarget.block = 0\n\t\t\tend\n\t\t\tif c.removeEnemyArtifact == true then\n\t\t\t\ttarget.artifact = 0\n\t\t\tend\n\t\t\tif weakAmount ~= nil and weakAmount > 0 then\n\t\t\t\tif target.artifact ~= nil and target.artifact > 0 then\n\t\t\t\t\ttarget.artifact = target.artifact - 1\n\t\t\t\telse\n\t\t\t\t\ttarget.weak = target.weak + weakAmount\n\t\t\t\tend\n\t\t\tend\n\t\t\tif poisonAmount ~= nil and poisonAmount > 0 then\n\t\t\t\tif c.poisonIfTargetPoisoned ~= true or (target.poison ~= nil and target.poison > 0) then\n\t\t\t\t\tlocal poisonHits = c.poisonHits or 1\n\t\t\t\t\tfor pi = 1, poisonHits do\n\t\t\t\t\t\tlocal target2 = target\n\t\t\t\t\t\tif c.poisonRandomTargets == true and self.Monsters ~= nil then\n\t\t\t\t\t\t\tlocal alive = {}\n\t\t\t\t\t\t\tfor mi = 1, #self.Monsters do\n\t\t\t\t\t\t\t\tlocal om = self.Monsters[mi]\n\t\t\t\t\t\t\t\tif om ~= nil and om.alive == true then\n\t\t\t\t\t\t\t\t\ttable.insert(alive, om)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif #alive > 0 then\n\t\t\t\t\t\t\t\ttarget2 = alive[math.random(#alive)]\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif target2 ~= nil and target2.alive == true then\n\t\t\t\t\t\t\tself:ApplyPoisonToMonster(target2, poisonAmount)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif vulnAmount ~= nil and vulnAmount > 0 then\n\t\t\t\tif target.artifact ~= nil and target.artifact > 0 then\n\t\t\t\t\ttarget.artifact = target.artifact - 1\n\t\t\t\telse\n\t\t\t\t\ttarget.vuln = target.vuln + vulnAmount\n\t\t\t\t\tif self:HasRelic(\"championBelt\") then\n\t\t\t\t\t\ttarget.weak = target.weak + 1\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\nend\nlocal drawnCards = {}\nif c.draw ~= nil then\n\tdrawnCards = self:DrawCards(c.draw, true) or {}\nend\nif c.drawUntilHandSize ~= nil and c.drawUntilHandSize > 0 then\n\tlocal currentHand = 0\n\tif self.Hand ~= nil then\n\t\tcurrentHand = #self.Hand\n\t\tif slot ~= nil and slot > 0 and self.Hand[slot] == cardId then\n\t\t\tcurrentHand = currentHand - 1\n\t\tend\n\tend\n\tlocal need = c.drawUntilHandSize - currentHand\n\tif need > 0 then\n\t\tlocal moreDrawnCards = self:DrawCards(need, true) or {}\n\t\tfor i = 1, #moreDrawnCards do\n\t\t\ttable.insert(drawnCards, moreDrawnCards[i])\n\t\tend\n\tend\nend\nif c.drawSkillBlock ~= nil and c.drawSkillBlock > 0 then\n\tfor i = 1, #drawnCards do\n\t\tlocal drawnCard = self.Cards[drawnCards[i]]\n\t\tif drawnCard ~= nil and drawnCard.kind == \"Skill\" then\n\t\t\tself:AddCardBlock(c.drawSkillBlock)\n\t\tend\n\tend\nend\nif c.addShiv ~= nil and c.discard == nil and c.discardAll ~= true then\n\tself:AddCardsToHand(\"Shiv\", c.addShiv)\nend\nlocal exhaustedNonAttack = self:ExhaustHandNonAttack(c)\nlocal exhaustedAll = self:ExhaustHandAll(c)\nlocal totalExhausted = exhaustedNonAttack + exhaustedAll\nif c.drawPerExhausted ~= nil and c.drawPerExhausted > 0 and totalExhausted > 0 then\n\tself:DrawCards(totalExhausted * c.drawPerExhausted, true)\nend\nif c.addRandomCardCount ~= nil and c.addRandomCardCount > 0 then\n\tself:AddRandomCardsFromEffect(c, c.addRandomCardCount)\nend\nif c.addRandomCardPerExhausted ~= nil and c.addRandomCardPerExhausted > 0 then\n\tif totalExhausted > 0 then\n\t\tself:AddRandomCardsFromEffect(c, totalExhausted * c.addRandomCardPerExhausted)\n\tend\nend\nif (c.playTopDrawPileCount ~= nil and c.playTopDrawPileCount > 0) or (c.playTopDrawPileCountPerEnergy ~= nil and c.playTopDrawPileCountPerEnergy > 0) then\n\tself:PlayTopDrawPileCards(c, xEnergy)\nend", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -3361,7 +3603,7 @@ "Name": "slot" } ], - "Code": "if self:IsDiscardSelecting() == true then\n\tself:SelectDiscardSlot(slot)\n\treturn\nend\nif self:IsRetainSelecting() == true then\n\tself:SelectRetainSlot(slot)\n\treturn\nend\nif self:IsReserveSelecting() == true then\n\tself:SelectReserveSlot(slot)\n\treturn\nend\nif self.CombatOver == true or self.FxBusy == true or self.TurnBusy == true then\n\treturn\nend\nif self.Hand == nil then\n\treturn\nend\nlocal cardId = self.Hand[slot]\nif cardId == nil then\n\treturn\nend\nlocal c = self.Cards[cardId]\nif c == nil then\n\treturn\nend\nif c.unplayable == true then\n\tself:Toast(\"사용할 수 없는 카드입니다\")\n\treturn\nend\nif self:CanPlayCardNow(c) ~= true then\n\treturn\nend\nlocal cost = c.cost or 0\nlocal skillFree = false\nlocal skillRepeat = 0\nif self.HandCostZeroThisTurn == true then\n\tcost = 0\nelseif c.useAllEnergy == true then\n\tcost = self.Energy\nend\nif c.kind == \"Skill\" and c.useAllEnergy ~= true and self.NextSkillCostZero == true then\n\tcost = 0\n\tskillFree = true\nend\nif c.kind == \"Skill\" and c.useAllEnergy ~= true and self.SkillCostReductionThisTurn ~= nil and self.SkillCostReductionThisTurn > 0 then\n\tcost = math.max(0, cost - self.SkillCostReductionThisTurn)\nend\nif c.useAllEnergy ~= true and self.CombatCardCostReduction ~= nil and self.CombatCardCostReduction[cardId] ~= nil then\n\tcost = math.max(0, cost - self.CombatCardCostReduction[cardId])\nend\nif c.kind == \"Skill\" and self.NextSkillRepeatCount ~= nil and self.NextSkillRepeatCount > 0 then\n\tskillRepeat = self.NextSkillRepeatCount\nend\nif self.Energy < cost then\n\tself:Toast(\"에너지가 부족합니다\")\n\treturn\nend\nself.Energy = self.Energy - cost\nself.ActiveKillReward = c.rewardOnKill or 0\nself:ResolveCardEffects(cardId, slot, c, false, cost)\nlocal function applyCardPlayHooks()\n\tif self:HasPowerField(\"cardPlayedBlock\") == true then\n\t\tself:AddCardBlock(self:AddPowerFieldTotal(\"cardPlayedBlock\"))\n\tend\n\tif c.cardPlayedDamage ~= nil and c.cardPlayedDamage > 0 then\n\t\tself:DealDirectDamageToTarget(c.cardPlayedDamage)\n\tend\n\tif c.cardPlayedRandomDamage ~= nil and c.cardPlayedRandomDamage > 0 then\n\t\tself:DealDirectDamageToRandomMonster(c.cardPlayedRandomDamage)\n\tend\nend\napplyCardPlayHooks()\nif skillRepeat > 0 then\n\tlocal remaining = (self.NextSkillRepeatCount or 0) - skillRepeat\n\tif remaining < 0 then\n\t\tremaining = 0\n\tend\n\tself.NextSkillRepeatCount = remaining\n\tfor i = 1, skillRepeat do\n\t\tself:ResolveCardEffects(cardId, slot, c, false, cost)\n\t\tapplyCardPlayHooks()\n\tend\nend\nif c.kind == \"Attack\" then\n\tself.TurnAttackCardsPlayed = (self.TurnAttackCardsPlayed or 0) + 1\nend\nif skillFree == true then\n\tif c.nextSkillCostZero ~= true then\n\t\tself.NextSkillCostZero = false\n\tend\nend\nif self.ActiveKillReward ~= nil and self.ActiveKillReward <= 0 then\n\tself.ActiveKillReward = 0\nend\nif c.combatCostReductionOnPlay ~= nil and c.combatCostReductionOnPlay > 0 then\n\tif self.CombatCardCostReduction == nil then\n\t\tself.CombatCardCostReduction = {}\n\tend\n\tself.CombatCardCostReduction[cardId] = (self.CombatCardCostReduction[cardId] or 0) + c.combatCostReductionOnPlay\nend\ntable.remove(self.Hand, slot)\nif c.exhaust == true then\n\tif self.ExhaustPile == nil then self.ExhaustPile = {} end\n\ttable.insert(self.ExhaustPile, cardId)\nelseif c.kind ~= \"Power\" then\n\ttable.insert(self.DiscardPile, cardId)\nend\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nif self:BeginDiscardSelection(c) == true then\n\treturn\nend\nif self:BeginReserveSelection(c) == true then\n\treturn\nend\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nself:CheckCombatEnd()", + "Code": "if self:IsDiscardSelecting() == true then\n\tself:SelectDiscardSlot(slot)\n\treturn\nend\nif self:IsRetainSelecting() == true then\n\tself:SelectRetainSlot(slot)\n\treturn\nend\nif self:IsReserveSelecting() == true then\n\tself:SelectReserveSlot(slot)\n\treturn\nend\nif self.CombatOver == true or self.FxBusy == true or self.TurnBusy == true then\n\treturn\nend\nif self.Hand == nil then\n\treturn\nend\nlocal cardId = self.Hand[slot]\nif cardId == nil then\n\treturn\nend\nlocal c = self.Cards[cardId]\nif c == nil then\n\treturn\nend\nif c.unplayable == true then\n self:Toast(\"사용할 수 없는 카드입니다\")\n\treturn\nend\nif self:CanPlayCardNow(c) ~= true then\n\treturn\nend\nlocal cost = c.cost or 0\nlocal skillFree = false\nlocal skillRepeat = 0\nif self.HandCostZeroThisTurn == true then\n\tcost = 0\nelseif self.ZeroCostCardIdsThisTurn ~= nil and self.ZeroCostCardIdsThisTurn[cardId] == true then\n\tcost = 0\nelseif c.useAllEnergy == true then\n\tcost = self.Energy\nend\nif c.kind == \"Skill\" and c.useAllEnergy ~= true and self.NextSkillCostZero == true then\n\tcost = 0\n\tskillFree = true\nend\nif c.kind == \"Skill\" and c.useAllEnergy ~= true and self.SkillCostReductionThisTurn ~= nil and self.SkillCostReductionThisTurn > 0 then\n\tcost = math.max(0, cost - self.SkillCostReductionThisTurn)\nend\nif c.useAllEnergy ~= true and self.CombatCardCostReduction ~= nil and self.CombatCardCostReduction[cardId] ~= nil then\n\tcost = math.max(0, cost - self.CombatCardCostReduction[cardId])\nend\nif c.kind == \"Skill\" and self.NextSkillRepeatCount ~= nil and self.NextSkillRepeatCount > 0 then\n\tskillRepeat = self.NextSkillRepeatCount\nend\nif self.Energy < cost then\n\tself:Toast(\"에너지가 부족합니다\")\n\treturn\nend\nself.Energy = self.Energy - cost\nself.ActiveKillReward = c.rewardOnKill or 0\nself.ActiveKillMaxHpGain = c.maxHpOnKill or 0\ntable.remove(self.Hand, slot)\nself:ResolveCardEffects(cardId, slot, c, false, cost)\nlocal function applyCardPlayHooks()\n\tif self:HasPowerField(\"cardPlayedBlock\") == true then\n\t\tself:AddCardBlock(self:AddPowerFieldTotal(\"cardPlayedBlock\"))\n\tend\n\tif c.cardPlayedDamage ~= nil and c.cardPlayedDamage > 0 then\n\t\tself:DealDirectDamageToTarget(c.cardPlayedDamage)\n\tend\n\tif c.cardPlayedRandomDamage ~= nil and c.cardPlayedRandomDamage > 0 then\n\t\tself:DealDirectDamageToRandomMonster(c.cardPlayedRandomDamage)\n\tend\nend\napplyCardPlayHooks()\nif skillRepeat > 0 then\n\tlocal remaining = (self.NextSkillRepeatCount or 0) - skillRepeat\n\tif remaining < 0 then\n\t\tremaining = 0\n\tend\n\tself.NextSkillRepeatCount = remaining\n\tfor i = 1, skillRepeat do\n\t\tself:ResolveCardEffects(cardId, slot, c, false, cost)\n\t\tapplyCardPlayHooks()\n\tend\nend\nif c.kind == \"Attack\" then\n\tself.TurnAttackCardsPlayed = (self.TurnAttackCardsPlayed or 0) + 1\nend\nif skillFree == true then\n\tif c.nextSkillCostZero ~= true then\n\t\tself.NextSkillCostZero = false\n\tend\nend\nif self.ActiveKillReward ~= nil and self.ActiveKillReward <= 0 then\n\tself.ActiveKillReward = 0\nend\nif self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain <= 0 then\n\tself.ActiveKillMaxHpGain = 0\nend\nif c.combatCostReductionOnPlay ~= nil and c.combatCostReductionOnPlay > 0 then\n\tif self.CombatCardCostReduction == nil then\n\t\tself.CombatCardCostReduction = {}\n\tend\n\tself.CombatCardCostReduction[cardId] = (self.CombatCardCostReduction[cardId] or 0) + c.combatCostReductionOnPlay\nend\nif c.exhaust == true then\n\tif self.ExhaustPile == nil then self.ExhaustPile = {} end\n\ttable.insert(self.ExhaustPile, cardId)\n\tself:TriggerExhaustEffects(1)\nelseif c.kind ~= \"Power\" then\n\ttable.insert(self.DiscardPile, cardId)\nend\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nif self:BeginDiscardSelection(c) == true then\n\treturn\nend\nif self:BeginReserveSelection(c) == true then\n\treturn\nend\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nself:CheckCombatEnd()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -3588,7 +3830,7 @@ "Name": "pierce" } ], - "Code": "local m = self.Monsters[self.TargetIndex]\nif m == nil or m.alive ~= true then\n\tm = nil\n\tfor i = 1, #self.Monsters do\n\t\tif self.Monsters[i].alive == true then m = self.Monsters[i]; self.TargetIndex = i; break end\n\tend\nend\nif m == nil then\n\treturn false\nend\nlocal dmg = amount\nif m.vuln > 0 then\n\tdmg = math.floor(dmg * 1.5)\nend\nif m.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then\n\tdmg = math.floor(dmg * self.ActiveAttackDamageVsWeakMultiplier)\nend\nif m.block > 0 and pierce ~= true then\n\tlocal absorbed = math.min(m.block, dmg)\n\tm.block = m.block - absorbed\n\tdmg = dmg - absorbed\nend\nm.hp = m.hp - dmg\nif dmg > 0 then\n\tlocal poison = self:AddPowerFieldTotal(\"attackPoison\")\n\tif poison ~= nil and poison > 0 then\n\t\tself:ApplyPoisonToMonster(m, poison)\n\tend\nend\nself:MonsterHitMotion(m.slot)\nlocal killed = false\nif m.hp <= 0 then\n\tm.hp = 0\n\tself:KillMonster(m.slot)\n\tkilled = true\nend\nreturn killed", + "Code": "local m = self.Monsters[self.TargetIndex]\nif m == nil or m.alive ~= true then\n\tm = nil\n\tfor i = 1, #self.Monsters do\n\t\tif self.Monsters[i].alive == true then m = self.Monsters[i]; self.TargetIndex = i; break end\n\tend\nend\nif m == nil then\n\treturn false\nend\nlocal dmg = amount\nif m.vuln > 0 then\n\tdmg = math.floor(dmg * 1.5)\nend\nif m.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then\n\tdmg = math.floor(dmg * self.ActiveAttackDamageVsWeakMultiplier)\nend\nif m.block > 0 and pierce ~= true then\n\tlocal absorbed = math.min(m.block, dmg)\n\tm.block = m.block - absorbed\n\tdmg = dmg - absorbed\nend\nm.hp = m.hp - dmg\nif dmg > 0 then\n\tlocal poison = self:AddPowerFieldTotal(\"attackPoison\")\n\tif poison ~= nil and poison > 0 then\n\t\tself:ApplyPoisonToMonster(m, poison)\n\tend\nend\nself:MonsterHitMotion(m.slot)\nlocal killed = false\nif m.hp <= 0 then\n\tm.hp = 0\n\tself:KillMonster(m.slot)\n\tif self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then\n\t\tself.BonusRewardScreens = (self.BonusRewardScreens or 0) + self.ActiveKillReward\n\tend\n\tif self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain > 0 then\n\t\tself.PlayerMaxHp = self.PlayerMaxHp + self.ActiveKillMaxHpGain\n\t\tself.PlayerHp = self.PlayerHp + self.ActiveKillMaxHpGain\n\tend\n\tkilled = true\nend\nreturn killed", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -3694,7 +3936,7 @@ "Name": "isAttack" } ], - "Code": "if self.Monsters == nil then\n\treturn false\nend\nlocal killCount = 0\nfor i = 1, #self.Monsters do\n\tlocal m = self.Monsters[i]\n\tif m ~= nil and m.alive == true then\n\t\tlocal dmg = amount\n\t\tif isAttack == true and m.vuln > 0 then\n\t\t\tdmg = math.floor(dmg * 1.5)\n\t\tend\n\t\tif m.block > 0 then\n\t\t\tlocal absorbed = math.min(m.block, dmg)\n\t\t\tm.block = m.block - absorbed\n\t\t\tdmg = dmg - absorbed\n\t\tend\n\t\tm.hp = m.hp - dmg\n\t\tif dmg > 0 then\n\t\t\tself.DamageDealtThisTurn = (self.DamageDealtThisTurn or 0) + dmg\n\t\t\tif isAttack == true then\n\t\t\t\tlocal poison = self:AddPowerFieldTotal(\"attackPoison\")\n\t\t\t\tif poison ~= nil and poison > 0 then\n\t\t\t\t\tself:ApplyPoisonToMonster(m, poison)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tself:ShowDmgPop(i, dmg)\n\t\tself:MonsterHitMotion(i)\n\t\tif m.hp <= 0 then\n\t\t\tm.hp = 0\n\t\t\tself:KillMonster(m.slot)\n\t\t\tkillCount = killCount + 1\n\t\tend\n\tend\nend\nif killCount > 0 and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then\n\tself.BonusRewardScreens = (self.BonusRewardScreens or 0) + (killCount * self.ActiveKillReward)\nend\nself:RenderCombat()\nself:CheckCombatEnd()\nreturn killCount > 0", + "Code": "if self.Monsters == nil then\n\treturn false\nend\nlocal killCount = 0\nfor i = 1, #self.Monsters do\n\tlocal m = self.Monsters[i]\n\tif m ~= nil and m.alive == true then\n\t\tlocal dmg = amount\n\t\tif isAttack == true and m.vuln > 0 then\n\t\t\tdmg = math.floor(dmg * 1.5)\n\t\tend\n\t\tif m.block > 0 then\n\t\t\tlocal absorbed = math.min(m.block, dmg)\n\t\t\tm.block = m.block - absorbed\n\t\t\tdmg = dmg - absorbed\n\t\tend\n\t\tm.hp = m.hp - dmg\n\t\tif dmg > 0 then\n\t\t\tself.DamageDealtThisTurn = (self.DamageDealtThisTurn or 0) + dmg\n\t\t\tif isAttack == true then\n\t\t\t\tlocal poison = self:AddPowerFieldTotal(\"attackPoison\")\n\t\t\t\tif poison ~= nil and poison > 0 then\n\t\t\t\t\tself:ApplyPoisonToMonster(m, poison)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tself:ShowDmgPop(i, dmg)\n\t\tself:MonsterHitMotion(i)\n\t\tif m.hp <= 0 then\n\t\t\tm.hp = 0\n\t\t\tself:KillMonster(m.slot)\n\t\t\tkillCount = killCount + 1\n\t\tend\n\tend\nend\nif killCount > 0 and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then\n\tself.BonusRewardScreens = (self.BonusRewardScreens or 0) + (killCount * self.ActiveKillReward)\nend\nif killCount > 0 and self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain > 0 then\n\tlocal gain = killCount * self.ActiveKillMaxHpGain\n\tself.PlayerMaxHp = self.PlayerMaxHp + gain\n\tself.PlayerHp = self.PlayerHp + gain\nend\nself:RenderCombat()\nself:CheckCombatEnd()\nreturn killCount > 0", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -3738,7 +3980,7 @@ "Name": "pierce" } ], - "Code": "local m = self.Monsters[targetIndex]\nif m == nil or m.alive ~= true or m.entity == nil or not isvalid(m.entity) then\n\tself:DealDamageToTarget(damage, pierce)\n\tself.ActiveAttackDamageVsWeakMultiplier = 1\n\tself:RenderCombat()\n\tself:CheckCombatEnd()\n\treturn\nend\nself.FxBusy = true\nlocal fx = _EntityService:GetEntityByPath(\"/ui/RunUIGroup/CombatHud/SkillFx\")\nif fx ~= nil then\n\tif fx.SpriteGUIRendererComponent ~= nil and image ~= nil and image ~= \"\" then\n\t\tfx.SpriteGUIRendererComponent.ImageRUID = image\n\tend\n\tif fx.UITransformComponent ~= nil and m.entity.TransformComponent ~= nil then\n\t\tlocal wp = m.entity.TransformComponent.WorldPosition\n\t\tlocal sp = _UILogic:WorldToScreenPosition(Vector2(wp.x, wp.y + 0.7))\n\t\tfx.UITransformComponent.anchoredPosition = _UILogic:ScreenToUIPosition(sp)\n\tend\n\tfx.Enable = true\nend\n_TimerService:SetTimerOnce(function()\n\tif fx ~= nil then fx.Enable = false end\n\tself.FxBusy = false\n\tlocal shown = damage\n\tlocal mt = self.Monsters[targetIndex]\n\tif mt ~= nil and mt.alive == true and mt.vuln > 0 then\n\t\tshown = math.floor(damage * 1.5)\n\tend\n\tif mt ~= nil and mt.alive == true and mt.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then\n\t\tshown = math.floor(shown * self.ActiveAttackDamageVsWeakMultiplier)\n\tend\n\tlocal killed = self:DealDamageToTarget(damage, pierce)\n\tif killed == true and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then\n\t\tself.BonusRewardScreens = (self.BonusRewardScreens or 0) + self.ActiveKillReward\n\tend\n\tself.ActiveKillReward = 0\n\tself.ActiveAttackDamageVsWeakMultiplier = 1\n\tself:ShowDmgPop(targetIndex, shown)\n\tself:RenderCombat()\n\tself:CheckCombatEnd()\nend, 0.35)", + "Code": "local m = self.Monsters[targetIndex]\nif m == nil or m.alive ~= true or m.entity == nil or not isvalid(m.entity) then\n\tself:DealDamageToTarget(damage, pierce)\n\tself.ActiveAttackDamageVsWeakMultiplier = 1\n\tself:RenderCombat()\n\tself:CheckCombatEnd()\n\treturn\nend\nself.FxBusy = true\nlocal fx = _EntityService:GetEntityByPath(\"/ui/RunUIGroup/CombatHud/SkillFx\")\nif fx ~= nil then\n\tif fx.SpriteGUIRendererComponent ~= nil and image ~= nil and image ~= \"\" then\n\t\tfx.SpriteGUIRendererComponent.ImageRUID = image\n\tend\n\tif fx.UITransformComponent ~= nil and m.entity.TransformComponent ~= nil then\n\t\tlocal wp = m.entity.TransformComponent.WorldPosition\n\t\tlocal sp = _UILogic:WorldToScreenPosition(Vector2(wp.x, wp.y + 0.7))\n\t\tfx.UITransformComponent.anchoredPosition = _UILogic:ScreenToUIPosition(sp)\n\tend\n\tfx.Enable = true\nend\n_TimerService:SetTimerOnce(function()\n\tif fx ~= nil then fx.Enable = false end\n\tself.FxBusy = false\n\tlocal shown = damage\n\tlocal mt = self.Monsters[targetIndex]\n\tif mt ~= nil and mt.alive == true and mt.vuln > 0 then\n\t\tshown = math.floor(damage * 1.5)\n\tend\n\tif mt ~= nil and mt.alive == true and mt.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then\n\t\tshown = math.floor(shown * self.ActiveAttackDamageVsWeakMultiplier)\n\tend\n\tlocal killed = self:DealDamageToTarget(damage, pierce)\n\tself.ActiveKillReward = 0\n\tself.ActiveKillMaxHpGain = 0\n\tself.ActiveAttackDamageVsWeakMultiplier = 1\n\tself:ShowDmgPop(targetIndex, shown)\n\tself:RenderCombat()\n\tself:CheckCombatEnd()\nend, 0.35)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -3768,7 +4010,7 @@ "Name": "damage" } ], - "Code": "self.FxBusy = true\nlocal fx = _EntityService:GetEntityByPath(\"/ui/RunUIGroup/CombatHud/SkillFx\")\nif fx ~= nil then\n\tif fx.SpriteGUIRendererComponent ~= nil and image ~= nil and image ~= \"\" then\n\t\tfx.SpriteGUIRendererComponent.ImageRUID = image\n\tend\n\tif fx.UITransformComponent ~= nil then\n\t\tfx.UITransformComponent.anchoredPosition = Vector2(300, 60)\n\tend\n\tfx.Enable = true\nend\n_TimerService:SetTimerOnce(function()\n\tif fx ~= nil then fx.Enable = false end\n\tself.FxBusy = false\n\tlocal killCount = 0\n\tfor i = 1, #self.Monsters do\n\t\tlocal m = self.Monsters[i]\n\t\tif m ~= nil and m.alive == true then\n\t\t\tlocal dmg = damage\n\t\t\tif m.vuln > 0 then\n\t\t\t\tdmg = math.floor(dmg * 1.5)\n\t\t\tend\n\t\t\tif m.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then\n\t\t\t\tdmg = math.floor(dmg * self.ActiveAttackDamageVsWeakMultiplier)\n\t\t\tend\n\t\t\tif m.block > 0 then\n\t\t\t\tlocal absorbed = math.min(m.block, dmg)\n\t\t\t\tm.block = m.block - absorbed\n\t\t\t\tdmg = dmg - absorbed\n\t\t\tend\n\t\t\tm.hp = m.hp - dmg\n\t\t\tif dmg > 0 then\n\t\t\t\tlocal poison = self:AddPowerFieldTotal(\"attackPoison\")\n\t\t\t\tif poison ~= nil and poison > 0 then\n\t\t\t\t\tself:ApplyPoisonToMonster(m, poison)\n\t\t\t\tend\n\t\t\tend\n\t\t\tself:ShowDmgPop(i, dmg)\n\t\t\tself:MonsterHitMotion(i)\n\t\t\tif m.hp <= 0 then\n\t\t\t\tm.hp = 0\n\t\t\t\tself:KillMonster(m.slot)\n\t\t\t\tkillCount = killCount + 1\n\t\t\tend\n\t\tend\n\tend\n\tif killCount > 0 and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then\n\t\tself.BonusRewardScreens = (self.BonusRewardScreens or 0) + (killCount * self.ActiveKillReward)\n\tend\n\tself.ActiveKillReward = 0\n\tself.ActiveAttackDamageVsWeakMultiplier = 1\n\tself:RenderCombat()\n\tself:CheckCombatEnd()\nend, 0.35)", + "Code": "self.FxBusy = true\nlocal fx = _EntityService:GetEntityByPath(\"/ui/RunUIGroup/CombatHud/SkillFx\")\nif fx ~= nil then\n\tif fx.SpriteGUIRendererComponent ~= nil and image ~= nil and image ~= \"\" then\n\t\tfx.SpriteGUIRendererComponent.ImageRUID = image\n\tend\n\tif fx.UITransformComponent ~= nil then\n\t\tfx.UITransformComponent.anchoredPosition = Vector2(300, 60)\n\tend\n\tfx.Enable = true\nend\n_TimerService:SetTimerOnce(function()\n\tif fx ~= nil then fx.Enable = false end\n\tself.FxBusy = false\n\tlocal killCount = 0\n\tfor i = 1, #self.Monsters do\n\t\tlocal m = self.Monsters[i]\n\t\tif m ~= nil and m.alive == true then\n\t\t\tlocal dmg = damage\n\t\t\tif m.vuln > 0 then\n\t\t\t\tdmg = math.floor(dmg * 1.5)\n\t\t\tend\n\t\t\tif m.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then\n\t\t\t\tdmg = math.floor(dmg * self.ActiveAttackDamageVsWeakMultiplier)\n\t\t\tend\n\t\t\tif m.block > 0 then\n\t\t\t\tlocal absorbed = math.min(m.block, dmg)\n\t\t\t\tm.block = m.block - absorbed\n\t\t\t\tdmg = dmg - absorbed\n\t\t\tend\n\t\t\tm.hp = m.hp - dmg\n\t\t\tif dmg > 0 then\n\t\t\t\tlocal poison = self:AddPowerFieldTotal(\"attackPoison\")\n\t\t\t\tif poison ~= nil and poison > 0 then\n\t\t\t\t\tself:ApplyPoisonToMonster(m, poison)\n\t\t\t\tend\n\t\t\tend\n\t\t\tself:ShowDmgPop(i, dmg)\n\t\t\tself:MonsterHitMotion(i)\n\t\t\tif m.hp <= 0 then\n\t\t\t\tm.hp = 0\n\t\t\t\tself:KillMonster(m.slot)\n\t\t\t\tkillCount = killCount + 1\n\t\t\tend\n\t\tend\n\tend\n\tself.ActiveKillReward = 0\n\tself.ActiveKillMaxHpGain = 0\n\tself.ActiveAttackDamageVsWeakMultiplier = 1\n\tself:RenderCombat()\n\tself:CheckCombatEnd()\nend, 0.35)", "Scope": 2, "ExecSpace": 6, "Attributes": [], diff --git a/data/cards.json b/data/cards.json index f51ce3b..41efb8d 100644 --- a/data/cards.json +++ b/data/cards.json @@ -1,7 +1,7 @@ { "cards": { "Strike": { - "name": "파워 스트라이크", + "name": "타격", "cost": 1, "kind": "Attack", "damage": 6, @@ -11,192 +11,948 @@ "rarity": "normal", "fx": "291b2298db88476f8ae3c6c78f53c9b7" }, - "Defend": { - "name": "아이언 바디", - "cost": 1, - "kind": "Skill", - "block": 5, - "desc": "방어도 5", - "image": "7648c3b8e1ca44fc8ec353561207a670", - "class": "warrior", - "rarity": "normal" - }, "Bash": { - "name": "슬래시 블러스트", + "name": "강타", "cost": 2, "kind": "Attack", - "damage": 10, - "desc": "피해 10", - "image": "4cbbe8cfc3e840e4a76379498d8eb012", + "damage": 8, + "vuln": 2, + "desc": "피해 8, 취약 2", + "image": "7648c3b8e1ca44fc8ec353561207a670", "class": "warrior", "rarity": "normal", "fx": "863812c5c2f84132ac7465b50ec2283e" }, - "WarLeap": { - "name": "워 리프", + "Defend": { + "name": "수비", + "cost": 1, + "kind": "Skill", + "block": 5, + "desc": "방어도 5", + "image": "4cbbe8cfc3e840e4a76379498d8eb012", + "class": "warrior", + "rarity": "normal" + }, + "Anger": { + "name": "분노", + "cost": 0, + "kind": "Attack", + "damage": 6, + "desc": "피해 6", + "image": "992dabf6aff2400e92b2f4f705d8ebe7", + "class": "warrior", + "rarity": "normal", + "fx": "48754be05be344358cddd55aa8fe11f4" + }, + "MoltenFist": { + "name": "녹아내리는 주먹", + "cost": 1, + "kind": "Attack", + "damage": 10, + "vuln": 2, + "exhaust": true, + "desc": "피해 10, 취약 2. 소멸.", + "image": "21af4bccc5054a5dbc8245dfa7f08681", + "class": "warrior", + "rarity": "normal", + "fx": "6f283d96d5804b4fb88009685a11c1f8" + }, + "BodySlam": { + "name": "몸통 박치기", + "cost": 1, + "kind": "Attack", + "damageFromCurrentBlock": 1, + "desc": "현재 방어도만큼 피해를 줍니다.", + "image": "fe83c7635b0e49ed83d75a2833adb53e", + "class": "warrior", + "rarity": "normal", + "fx": "997fa6999aa04dbb97a1dd99025fa2ba" + }, + "Headbutt": { + "name": "박치기", + "cost": 1, + "kind": "Attack", + "damage": 9, + "draw": 1, + "desc": "피해 9, 카드 1장 뽑기", + "image": "64daadf1a98e490d9c14ef52ec776e63", + "class": "warrior", + "rarity": "normal", + "fx": "2799562e984c4a4da3b73e1f3431057c" + }, + "SwordBoomerang": { + "name": "부메랑 칼날", + "cost": 1, + "kind": "Attack", + "damage": 3, + "hits": 3, + "randomTargetEachHit": true, + "desc": "무작위 적에게 피해 3 x 3회", + "image": "09370fc7551e47238fd103a80fba558e", + "class": "warrior", + "rarity": "normal", + "fx": "1b0afc410a1a458598eb7ca2fb26e97d" + }, + "SetupStrike": { + "name": "사전 타격", + "cost": 1, + "kind": "Attack", + "damage": 7, + "strength": 2, + "desc": "피해 7, 힘 +2", + "image": "379d86e3de064959aa4612f71e84ccfb", + "class": "warrior", + "rarity": "normal", + "fx": "291b2298db88476f8ae3c6c78f53c9b7" + }, + "TwinStrike": { + "name": "이중 타격", + "cost": 1, + "kind": "Attack", + "damage": 5, + "hits": 2, + "desc": "피해 5 x 2회", + "image": "1bc3e52b330648faae9eafd5a205e37b", + "class": "warrior", + "rarity": "normal", + "fx": "863812c5c2f84132ac7465b50ec2283e" + }, + "Breakthrough": { + "name": "정면 돌파", + "cost": 1, + "kind": "Attack", + "damage": 9, + "aoe": true, + "desc": "모든 적에게 피해 9", + "image": "e2580523efc6457385114b78ad0d7cce", + "class": "warrior", + "rarity": "normal", + "fx": "e8a145a6c43d493f9ad50fab03b200aa" + }, + "Thunderclap": { + "name": "천둥", "cost": 1, "kind": "Attack", "damage": 4, - "block": 3, - "desc": "피해 4, 방어도 3", + "aoe": true, + "vuln": 1, + "affectsAllEnemies": true, + "desc": "모든 적에게 피해 4, 취약 1", + "image": "115e309771604743853abad2d8d186bc", + "class": "warrior", + "rarity": "normal", + "fx": "48754be05be344358cddd55aa8fe11f4" + }, + "IronWave": { + "name": "철의 파동", + "cost": 1, + "kind": "Attack", + "damage": 5, + "block": 5, + "desc": "피해 5, 방어도 5", + "image": "b7030d8caedc4fbc9f38fe1e541d6e6b", + "class": "warrior", + "rarity": "normal", + "fx": "6f283d96d5804b4fb88009685a11c1f8" + }, + "PommelStrike": { + "name": "폼멜 타격", + "cost": 1, + "kind": "Attack", + "damage": 9, + "draw": 1, + "desc": "피해 9, 카드 1장 뽑기", + "image": "9aac955d159f49c1bc913ef96128e781", + "class": "warrior", + "rarity": "normal", + "fx": "997fa6999aa04dbb97a1dd99025fa2ba" + }, + "PerfectedStrike": { + "name": "완벽한 타격", + "cost": 2, + "kind": "Attack", + "damage": 6, + "damageNameMatch": "타격", + "damagePerOwnedNameMatch": 2, + "desc": "피해 6. 보유한 이름에 \"타격\"이 포함된 카드마다 피해 +2", + "image": "90a9bf8eeb844b578b4e2d93ac43fedf", + "class": "warrior", + "rarity": "normal", + "fx": "2799562e984c4a4da3b73e1f3431057c" + }, + "Cinder": { + "name": "잿불", + "cost": 2, + "kind": "Attack", + "damage": 18, + "exhaust": true, + "desc": "피해 18. 소멸.", + "image": "251b6e12329048429490049a4f3cf564", + "class": "warrior", + "rarity": "normal", + "fx": "1b0afc410a1a458598eb7ca2fb26e97d" + }, + "Bloodletting": { + "name": "사혈", + "cost": 0, + "kind": "Skill", + "gainEnergy": 2, + "desc": "에너지 +2", + "image": "92021d62341a4bce9cfd09d1b4b865db", + "class": "warrior", + "rarity": "normal" + }, + "Tremble": { + "name": "떨림", + "cost": 1, + "kind": "Skill", + "vuln": 3, + "exhaust": true, + "desc": "취약 3. 소멸.", + "image": "b4020dbadee6401f9893a020fe4154b1", + "class": "warrior", + "rarity": "normal" + }, + "Armaments": { + "name": "전투장비", + "cost": 1, + "kind": "Skill", + "block": 5, + "draw": 1, + "desc": "방어도 5, 카드 1장 뽑기", + "image": "e4acdf27d68549db8858d6082169c70c", + "class": "warrior", + "rarity": "normal" + }, + "TrueGrit": { + "name": "진정한 끈기", + "cost": 1, + "kind": "Skill", + "block": 7, + "discard": 1, + "desc": "방어도 7, 카드 1장 버리기", + "image": "7648c3b8e1ca44fc8ec353561207a670", + "class": "warrior", + "rarity": "normal" + }, + "Havoc": { + "name": "파괴", + "cost": 1, + "kind": "Skill", + "nextSkillCostZero": true, + "desc": "다음 스킬의 비용이 0", + "image": "4cbbe8cfc3e840e4a76379498d8eb012", + "class": "warrior", + "rarity": "normal" + }, + "ShrugItOff": { + "name": "흘려보내기", + "cost": 1, + "kind": "Skill", + "block": 8, + "draw": 1, + "desc": "방어도 8, 카드 1장 뽑기", "image": "992dabf6aff2400e92b2f4f705d8ebe7", "class": "warrior", "rarity": "normal" }, - "Brandish": { - "name": "브랜디시", + "BloodWall": { + "name": "피의 벽", "cost": 2, - "kind": "Attack", - "damage": 13, - "desc": "피해 13", + "kind": "Skill", + "block": 16, + "desc": "방어도 16", "image": "21af4bccc5054a5dbc8245dfa7f08681", "class": "warrior", + "rarity": "normal" + }, + "Whirlwind": { + "name": "소용돌이", + "cost": 0, + "kind": "Attack", + "damage": 0, + "aoe": true, + "useAllEnergy": true, + "xDamagePerEnergy": 5, + "desc": "모든 에너지를 사용해 에너지당 모든 적에게 피해 5", + "image": "fe83c7635b0e49ed83d75a2833adb53e", + "class": "warrior", + "rarity": "unique", + "fx": "1b0afc410a1a458598eb7ca2fb26e97d" + }, + "Spite": { + "name": "악의", + "cost": 0, + "kind": "Attack", + "damage": 5, + "hits": 2, + "desc": "피해 5 x 2회", + "image": "64daadf1a98e490d9c14ef52ec776e63", + "class": "warrior", + "rarity": "unique", + "fx": "291b2298db88476f8ae3c6c78f53c9b7" + }, + "Bully": { + "name": "협박", + "cost": 0, + "kind": "Attack", + "damage": 4, + "attackDamageVsWeakMultiplier": 2, + "desc": "피해 4. 대상이 약화 상태면 피해 2배", + "image": "09370fc7551e47238fd103a80fba558e", + "class": "warrior", + "rarity": "unique", + "fx": "863812c5c2f84132ac7465b50ec2283e" + }, + "Pillage": { + "name": "갈취", + "cost": 1, + "kind": "Attack", + "damage": 6, + "draw": 2, + "desc": "피해 6, 카드 2장 뽑기", + "image": "379d86e3de064959aa4612f71e84ccfb", + "class": "warrior", "rarity": "unique", "fx": "e8a145a6c43d493f9ad50fab03b200aa" }, - "ChargedBlow": { - "name": "차지 블로우", + "Rampage": { + "name": "광란", "cost": 2, "kind": "Attack", + "damage": 12, + "combatCostReductionOnPlay": 1, + "desc": "피해 12. 사용할 때마다 이번 전투에서 비용 1 감소", + "image": "1bc3e52b330648faae9eafd5a205e37b", + "class": "warrior", + "rarity": "unique", + "fx": "48754be05be344358cddd55aa8fe11f4" + }, + "AshenStrike": { + "name": "잿빛 타격", + "cost": 1, + "kind": "Attack", + "damage": 6, + "damagePerCardDrawnThisCombat": 1, + "desc": "피해 6. 이번 전투에서 뽑은 카드마다 피해 +1", + "image": "e2580523efc6457385114b78ad0d7cce", + "class": "warrior", + "rarity": "unique", + "fx": "6f283d96d5804b4fb88009685a11c1f8" + }, + "Dismantle": { + "name": "해체", + "cost": 1, + "kind": "Attack", "damage": 8, - "firstCardDamageBonus": 2, - "vuln": 2, - "desc": "피해 8, 취약 2", + "hits": 2, + "desc": "피해 8 x 2회", + "image": "115e309771604743853abad2d8d186bc", + "class": "warrior", + "rarity": "unique", + "fx": "997fa6999aa04dbb97a1dd99025fa2ba" + }, + "Hemokinesis": { + "name": "혈류", + "cost": 1, + "kind": "Attack", + "damage": 15, + "desc": "피해 15", + "image": "b7030d8caedc4fbc9f38fe1e541d6e6b", + "class": "warrior", + "rarity": "unique", + "fx": "2799562e984c4a4da3b73e1f3431057c" + }, + "FightMe": { + "name": "덤벼라!", + "cost": 2, + "kind": "Attack", + "damage": 5, + "hits": 2, + "strength": 3, + "desc": "피해 5 x 2회, 힘 +3", + "image": "9aac955d159f49c1bc913ef96128e781", + "class": "warrior", + "rarity": "unique", + "fx": "1b0afc410a1a458598eb7ca2fb26e97d" + }, + "Unrelenting": { + "name": "무자비", + "cost": 2, + "kind": "Attack", + "damage": 14, + "gainEnergy": 1, + "desc": "피해 14, 에너지 +1", + "image": "90a9bf8eeb844b578b4e2d93ac43fedf", + "class": "warrior", + "rarity": "unique", + "fx": "291b2298db88476f8ae3c6c78f53c9b7" + }, + "Uppercut": { + "name": "어퍼컷", + "cost": 2, + "kind": "Attack", + "damage": 12, + "weak": 1, + "vuln": 1, + "desc": "피해 12, 약화 1, 취약 1", + "image": "251b6e12329048429490049a4f3cf564", + "class": "warrior", + "rarity": "unique", + "fx": "863812c5c2f84132ac7465b50ec2283e" + }, + "Bludgeon": { + "name": "몽둥이질", + "cost": 3, + "kind": "Attack", + "damage": 32, + "desc": "피해 32", + "image": "92021d62341a4bce9cfd09d1b4b865db", + "class": "warrior", + "rarity": "unique", + "fx": "e8a145a6c43d493f9ad50fab03b200aa" + }, + "HowlFromBeyond": { + "name": "저편의 울음소리", + "cost": 3, + "kind": "Attack", + "damage": 16, + "aoe": true, + "exhaust": true, + "desc": "모든 적에게 피해 16. 소멸.", + "image": "b4020dbadee6401f9893a020fe4154b1", + "class": "warrior", + "rarity": "unique", + "fx": "48754be05be344358cddd55aa8fe11f4" + }, + "Stomp": { + "name": "짓밟기", + "cost": 3, + "kind": "Attack", + "damage": 12, + "aoe": true, + "damagePerAttackPlayedThisTurn": 2, + "desc": "모든 적에게 피해 12. 이번 턴 사용한 공격 카드마다 피해 +2", + "image": "e4acdf27d68549db8858d6082169c70c", + "class": "warrior", + "rarity": "unique", + "fx": "6f283d96d5804b4fb88009685a11c1f8" + }, + "Rage": { + "name": "격노", + "cost": 0, + "kind": "Skill", + "block": 5, + "draw": 1, + "desc": "방어도 5, 카드 1장 뽑기", + "image": "7648c3b8e1ca44fc8ec353561207a670", + "class": "warrior", + "rarity": "unique" + }, + "BattleTrance": { + "name": "전투 최면", + "cost": 0, + "kind": "Skill", + "draw": 3, + "drawDisabledThisTurn": true, + "desc": "카드 3장 뽑기. 이번 턴 더 뽑을 수 없음", + "image": "4cbbe8cfc3e840e4a76379498d8eb012", + "class": "warrior", + "rarity": "unique" + }, + "Colossus": { + "name": "거상", + "cost": 1, + "kind": "Skill", + "block": 5, + "intangible": 1, + "desc": "방어도 5, 무형 1", + "image": "992dabf6aff2400e92b2f4f705d8ebe7", + "class": "warrior", + "rarity": "unique" + }, + "SecondWind": { + "name": "기사회생", + "cost": 1, + "kind": "Skill", + "exhaustHandNonAttack": true, + "blockPerExhaustedCard": 5, + "desc": "손의 공격이 아닌 모든 카드를 소멸시키고, 소멸시킨 카드마다 방어도 5", + "image": "21af4bccc5054a5dbc8245dfa7f08681", + "class": "warrior", + "rarity": "unique" + }, + "Taunt": { + "name": "도발", + "cost": 1, + "kind": "Skill", + "block": 7, + "vuln": 1, + "desc": "방어도 7, 취약 1", "image": "fe83c7635b0e49ed83d75a2833adb53e", "class": "warrior", "rarity": "unique" }, - "Threaten": { - "name": "위협", - "cost": 0, - "kind": "Skill", - "weak": 2, - "desc": "약화 2 부여", - "image": "64daadf1a98e490d9c14ef52ec776e63", - "class": "warrior", - "rarity": "normal" - }, - "Enrage": { - "name": "인레이지", + "BurningPact": { + "name": "불타는 조약", "cost": 1, "kind": "Skill", - "strength": 2, - "desc": "힘 +2", + "discard": 1, + "draw": 3, + "desc": "카드 1장 버리고 카드 3장 뽑기", + "image": "64daadf1a98e490d9c14ef52ec776e63", + "class": "warrior", + "rarity": "unique" + }, + "EvilEye": { + "name": "악마의 눈", + "cost": 1, + "kind": "Skill", + "block": 16, + "desc": "방어도 16", "image": "09370fc7551e47238fd103a80fba558e", "class": "warrior", "rarity": "unique" }, - "Rage": { - "name": "분노", + "ForgottenRitual": { + "name": "잊힌 의식", + "cost": 1, + "kind": "Skill", + "gainEnergy": 2, + "exhaust": true, + "desc": "에너지 +2. 소멸.", + "image": "379d86e3de064959aa4612f71e84ccfb", + "class": "warrior", + "rarity": "unique" + }, + "DrumOfBattle": { + "name": "전투의 북소리", + "cost": 1, + "kind": "Skill", + "draw": 2, + "gainEnergy": 1, + "exhaust": true, + "desc": "카드 2장 뽑기, 에너지 +1. 소멸.", + "image": "1bc3e52b330648faae9eafd5a205e37b", + "class": "warrior", + "rarity": "unique" + }, + "Dominate": { + "name": "제압", + "cost": 1, + "kind": "Skill", + "vuln": 2, + "strength": 2, + "exhaust": true, + "desc": "취약 2, 힘 +2. 소멸.", + "image": "e2580523efc6457385114b78ad0d7cce", + "class": "warrior", + "rarity": "unique" + }, + "InfernalBlade": { + "name": "지옥검", + "cost": 1, + "kind": "Skill", + "addRandomCardCount": 1, + "addRandomCardKind": "Attack", + "addRandomCardSameClass": true, + "addedCardsCostZeroThisTurn": true, + "exhaust": true, + "desc": "무작위 공격 카드 1장을 손으로 가져옵니다. 이번 턴 동안 그 카드를 비용 없이 사용할 수 있습니다. 소멸.", + "image": "115e309771604743853abad2d8d186bc", + "class": "warrior", + "rarity": "unique" + }, + "ExpectAFight": { + "name": "싸움 준비", + "cost": 1, + "kind": "Skill", + "skillCostReductionThisTurn": 1, + "desc": "이번 턴 스킬 비용 1 감소", + "image": "b7030d8caedc4fbc9f38fe1e541d6e6b", + "class": "warrior", + "rarity": "unique" + }, + "FlameBarrier": { + "name": "화염 장벽", + "cost": 2, + "kind": "Skill", + "block": 12, + "thorns": 4, + "desc": "방어도 12, 가시 4", + "image": "9aac955d159f49c1bc913ef96128e781", + "class": "warrior", + "rarity": "unique" + }, + "StoneArmor": { + "name": "돌 갑옷", + "cost": 1, + "kind": "Power", + "powerEffect": "blockPerTurn", + "value": 4, + "desc": "매턴 방어도 +4", + "image": "90a9bf8eeb844b578b4e2d93ac43fedf", + "class": "warrior", + "rarity": "unique" + }, + "FeelNoPain": { + "name": "무감각", + "cost": 1, + "kind": "Power", + "powerEffect": "blockPerTurn", + "value": 3, + "desc": "매턴 방어도 +3", + "image": "251b6e12329048429490049a4f3cf564", + "class": "warrior", + "rarity": "unique" + }, + "Inflame": { + "name": "발화", + "cost": 1, + "kind": "Power", + "powerEffect": "strengthPerTurn", + "value": 1, + "desc": "매턴 힘 +1", + "image": "92021d62341a4bce9cfd09d1b4b865db", + "class": "warrior", + "rarity": "unique" + }, + "Inferno": { + "name": "불바다", + "cost": 1, + "kind": "Power", + "powerEffect": "damagePerTurn", + "value": 6, + "desc": "매턴 모든 적에게 피해 6", + "image": "b4020dbadee6401f9893a020fe4154b1", + "class": "warrior", + "rarity": "unique" + }, + "Juggling": { + "name": "저글링", + "cost": 1, + "kind": "Power", + "cardPlayedRandomDamage": 3, + "desc": "카드를 사용할 때마다 무작위 적에게 피해 3", + "image": "e4acdf27d68549db8858d6082169c70c", + "class": "warrior", + "rarity": "unique" + }, + "Rupture": { + "name": "파열", + "cost": 1, + "kind": "Power", + "powerEffect": "strengthPerTurn", + "value": 1, + "desc": "매턴 힘 +1", + "image": "7648c3b8e1ca44fc8ec353561207a670", + "class": "warrior", + "rarity": "unique" + }, + "Vicious": { + "name": "포악함", + "cost": 1, + "kind": "Power", + "turnStartDraw": 1, + "desc": "턴 시작 시 카드 1장 추가로 뽑기", + "image": "4cbbe8cfc3e840e4a76379498d8eb012", + "class": "warrior", + "rarity": "unique" + }, + "Stampede": { + "name": "쇄도", + "cost": 2, + "kind": "Power", + "cardPlayedRandomDamage": 8, + "desc": "카드를 사용할 때마다 무작위 적에게 피해 8", + "image": "992dabf6aff2400e92b2f4f705d8ebe7", + "class": "warrior", + "rarity": "unique" + }, + "PactsEnd": { + "name": "조약의 끝", + "cost": 0, + "kind": "Attack", + "damage": 17, + "aoe": true, + "playableWhenDrawPileEmpty": true, + "desc": "뽑을 카드 더미가 비었을 때 모든 적에게 피해 17", + "image": "21af4bccc5054a5dbc8245dfa7f08681", + "class": "warrior", + "rarity": "legend", + "fx": "e8a145a6c43d493f9ad50fab03b200aa" + }, + "Thrash": { + "name": "난타", "cost": 1, "kind": "Attack", - "aoe": true, "damage": 4, - "desc": "모든 적에게 피해를 4 줍니다.", + "hits": 2, + "damagePerAttackPlayedThisTurn": 2, + "desc": "피해 4 x 2회. 이번 턴 사용한 공격 카드마다 피해 +2", + "image": "fe83c7635b0e49ed83d75a2833adb53e", + "class": "warrior", + "rarity": "legend", + "fx": "48754be05be344358cddd55aa8fe11f4" + }, + "Conflagration": { + "name": "대화재", + "cost": 1, + "kind": "Attack", + "damage": 2, + "hits": 4, + "aoe": true, + "desc": "모든 적에게 피해 2 x 4회", + "image": "64daadf1a98e490d9c14ef52ec776e63", + "class": "warrior", + "rarity": "legend", + "fx": "6f283d96d5804b4fb88009685a11c1f8" + }, + "Feed": { + "name": "포식", + "cost": 1, + "kind": "Attack", + "damage": 10, + "maxHpOnKill": 3, + "exhaust": true, + "desc": "피해를 10 줍니다. 치명타라면, 최대 체력이 3 증가합니다. 소멸.", + "image": "09370fc7551e47238fd103a80fba558e", + "class": "warrior", + "rarity": "legend", + "fx": "997fa6999aa04dbb97a1dd99025fa2ba" + }, + "TearAsunder": { + "name": "갈가리 찢기", + "cost": 2, + "kind": "Attack", + "damage": 5, + "hits": 3, + "desc": "피해 5 x 3회", + "image": "379d86e3de064959aa4612f71e84ccfb", + "class": "warrior", + "rarity": "legend", + "fx": "2799562e984c4a4da3b73e1f3431057c" + }, + "FiendFire": { + "name": "지옥불", + "cost": 2, + "kind": "Attack", + "damage": 0, + "damagePerOtherHandCard": 7, + "discardAll": true, + "exhaust": true, + "desc": "손의 다른 카드마다 피해 +7 후 모두 버리기. 소멸.", + "image": "1bc3e52b330648faae9eafd5a205e37b", + "class": "warrior", + "rarity": "legend", + "fx": "1b0afc410a1a458598eb7ca2fb26e97d" + }, + "Mangle": { + "name": "난도질", + "cost": 3, + "kind": "Attack", + "damage": 15, + "enemyStrengthLossThisTurn": 10, + "desc": "피해 15. 이번 턴 적 힘 -10", + "image": "e2580523efc6457385114b78ad0d7cce", + "class": "warrior", + "rarity": "legend", + "fx": "291b2298db88476f8ae3c6c78f53c9b7" + }, + "Brand": { + "name": "낙인", + "cost": 0, + "kind": "Skill", + "discard": 1, + "strength": 1, + "desc": "카드 1장 버리기, 힘 +1", + "image": "115e309771604743853abad2d8d186bc", + "class": "warrior", + "rarity": "legend" + }, + "Cascade": { + "name": "연쇄", + "cost": 0, + "kind": "Skill", + "useAllEnergy": true, + "playTopDrawPileCountPerEnergy": 1, + "exhaust": true, + "desc": "뽑을 카드 더미 맨 위의 카드 X장을 사용합니다. 소멸.", + "image": "b7030d8caedc4fbc9f38fe1e541d6e6b", + "class": "warrior", + "rarity": "legend" + }, + "PrimalForce": { + "name": "원시의 힘", + "cost": 0, + "kind": "Skill", + "handCostZeroThisTurn": true, + "desc": "이번 턴 손의 카드 비용이 0", + "image": "9aac955d159f49c1bc913ef96128e781", + "class": "warrior", + "rarity": "legend" + }, + "Offering": { + "name": "제물", + "cost": 0, + "kind": "Skill", + "gainEnergy": 2, + "draw": 3, + "exhaust": true, + "desc": "에너지 +2, 카드 3장 뽑기. 소멸.", + "image": "90a9bf8eeb844b578b4e2d93ac43fedf", + "class": "warrior", + "rarity": "legend" + }, + "OneTwoPunch": { + "name": "원투 펀치", + "cost": 1, + "kind": "Skill", + "nextSkillRepeatCount": 1, + "desc": "다음 스킬을 1회 추가 발동", + "image": "251b6e12329048429490049a4f3cf564", + "class": "warrior", + "rarity": "legend" + }, + "Stoke": { + "name": "화력 증폭", + "cost": 1, + "kind": "Skill", + "exhaustHandAll": true, + "drawPerExhausted": 1, + "exhaust": true, + "desc": "손의 모든 카드를 소멸시키고, 소멸시킨 카드 수만큼 뽑습니다. 소멸.", + "image": "92021d62341a4bce9cfd09d1b4b865db", + "class": "warrior", + "rarity": "legend" + }, + "Impervious": { + "name": "무적", + "cost": 2, + "kind": "Skill", + "block": 30, + "exhaust": true, + "desc": "방어도 30. 소멸.", + "image": "b4020dbadee6401f9893a020fe4154b1", + "class": "warrior", + "rarity": "legend" + }, + "NotYet": { + "name": "불굴", + "cost": 2, + "kind": "Skill", + "heal": 10, + "exhaust": true, + "desc": "HP 10 회복. 소멸.", + "image": "e4acdf27d68549db8858d6082169c70c", + "class": "warrior", + "rarity": "legend" + }, + "Aggression": { + "name": "공격성", + "cost": 1, + "kind": "Power", + "turnStartDraw": 1, + "desc": "턴 시작 시 카드 1장 추가로 뽑기", + "image": "7648c3b8e1ca44fc8ec353561207a670", + "class": "warrior", + "rarity": "legend" + }, + "Cruelty": { + "name": "악랄함", + "cost": 1, + "kind": "Power", + "powerEffect": "strengthPerTurn", + "value": 1, + "desc": "매턴 힘 +1", + "image": "4cbbe8cfc3e840e4a76379498d8eb012", + "class": "warrior", + "rarity": "legend" + }, + "CrimsonMantle": { + "name": "핏빛 망토", + "cost": 1, + "kind": "Power", + "powerEffect": "blockPerTurn", + "value": 8, + "desc": "매턴 방어도 +8", + "image": "992dabf6aff2400e92b2f4f705d8ebe7", + "class": "warrior", + "rarity": "legend" + }, + "Pyre": { + "name": "불의 심장", + "cost": 2, + "kind": "Power", + "powerEffect": "energyPerTurn", + "value": 1, + "desc": "매턴 에너지 +1", + "image": "21af4bccc5054a5dbc8245dfa7f08681", + "class": "warrior", + "rarity": "legend" + }, + "DarkEmbrace": { + "name": "어둠의 포옹", + "cost": 2, + "kind": "Power", + "drawOnExhaust": 1, + "desc": "카드가 소멸될 때마다 카드 1장 뽑기", + "image": "fe83c7635b0e49ed83d75a2833adb53e", + "class": "warrior", + "rarity": "legend" + }, + "Unmovable": { + "name": "요지부동", + "cost": 2, + "kind": "Power", + "powerEffect": "blockPerTurn", + "value": 0, + "blockGainMultiplier": 2, + "desc": "이번 전투 동안 방어도 획득량 2배", + "image": "64daadf1a98e490d9c14ef52ec776e63", + "class": "warrior", + "rarity": "legend" + }, + "Juggernaut": { + "name": "절대적인 힘", + "cost": 2, + "kind": "Power", + "cardPlayedRandomDamage": 5, + "desc": "카드를 사용할 때마다 무작위 적에게 피해 5", + "image": "09370fc7551e47238fd103a80fba558e", + "class": "warrior", + "rarity": "legend" + }, + "Hellraiser": { + "name": "지옥검무", + "cost": 2, + "kind": "Power", + "drawNameMatchAutoPlay": "타격", + "desc": "이름에 \"타격\"이 포함된 카드를 뽑을 때마다, 무작위 적에게 사용합니다.", "image": "379d86e3de064959aa4612f71e84ccfb", "class": "warrior", "rarity": "legend" }, - "ComboAttack": { - "name": "콤보 어택", - "cost": 1, - "kind": "Attack", - "class": "fighter", - "damage": 5, - "hits": 2, - "desc": "피해 5 × 2회", - "image": "1bc3e52b330648faae9eafd5a205e37b", - "rarity": "unique", - "fx": "48754be05be344358cddd55aa8fe11f4" - }, - "Berserk": { - "name": "버서크", - "cost": 2, + "Barricade": { + "name": "바리케이드", + "cost": 3, "kind": "Power", - "class": "fighter", - "powerEffect": "energyPerTurn", - "value": 1, - "selfVuln": 1, - "desc": "매턴 에너지 +1, 취약 1 자가", - "image": "e2580523efc6457385114b78ad0d7cce", + "powerEffect": "keepBlock", + "value": 0, + "desc": "내 턴 시작 시 방어도가 사라지지 않습니다.", + "image": "1bc3e52b330648faae9eafd5a205e37b", + "class": "warrior", "rarity": "legend" }, - "RisingAttack": { - "name": "라이징 어택", - "cost": 2, - "kind": "Attack", - "class": "fighter", - "damage": 12, - "desc": "피해 12", - "image": "115e309771604743853abad2d8d186bc", - "rarity": "unique", - "fx": "6f283d96d5804b4fb88009685a11c1f8" - }, - "ThunderCharge": { - "name": "썬더 차지", - "cost": 1, - "kind": "Attack", - "class": "page", - "damage": 7, - "weak": 1, - "desc": "피해 7, 약화 1", - "image": "b7030d8caedc4fbc9f38fe1e541d6e6b", - "rarity": "unique", - "fx": "997fa6999aa04dbb97a1dd99025fa2ba" - }, - "BlizzardCharge": { - "name": "블리자드 차지", - "cost": 1, - "kind": "Attack", - "class": "page", - "damage": 7, - "vuln": 1, - "desc": "피해 7, 취약 1", - "image": "9aac955d159f49c1bc913ef96128e781", - "rarity": "unique", - "fx": "2799562e984c4a4da3b73e1f3431057c" - }, - "PowerGuard": { - "name": "파워 가드", - "cost": 1, - "kind": "Skill", - "class": "page", - "block": 10, - "desc": "방어도 10", - "image": "90a9bf8eeb844b578b4e2d93ac43fedf", - "rarity": "unique" - }, - "Pierce": { - "name": "피어스", - "cost": 1, - "kind": "Attack", - "class": "spearman", - "damage": 9, - "pierce": true, - "desc": "피해 9, 방어 무시", - "image": "251b6e12329048429490049a4f3cf564", - "rarity": "unique", - "fx": "1b0afc410a1a458598eb7ca2fb26e97d" - }, - "IronWall": { - "name": "아이언 월", - "cost": 2, - "kind": "Skill", - "class": "spearman", - "block": 12, - "desc": "방어도 12", - "image": "92021d62341a4bce9cfd09d1b4b865db", - "rarity": "unique" - }, - "HyperBody": { - "name": "하이퍼 바디", - "cost": 1, + "DemonForm": { + "name": "악마의 형상", + "cost": 3, "kind": "Power", - "class": "spearman", - "powerEffect": "blockPerTurn", - "value": 3, - "desc": "매턴 방어도 +3", - "image": "b4020dbadee6401f9893a020fe4154b1", + "powerEffect": "strengthPerTurn", + "value": 2, + "desc": "매턴 힘 +2", + "image": "e2580523efc6457385114b78ad0d7cce", + "class": "warrior", "rarity": "legend" }, "EnergyBolt": { diff --git a/data/cards.xlsx b/data/cards.xlsx index c1c29e5975416dfe3afe53eee1ce67e5453c1c4f..f297d9640fb4439d9d8e6d7b390d8fd6a225e4b8 100644 GIT binary patch delta 24553 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 { const card = cards[x.id]; let cost = card.cost || 0; - if (ctx.handCostZeroThisTurn === true) cost = 0; + if (ctx.handCostZeroThisTurn === true || ctx.zeroCostCardIdsThisTurn?.has(x.id) === true) cost = 0; else if (card.useAllEnergy === true) cost = 1; else if (card.kind === 'Skill') { if (ctx.nextSkillCostZero === true) cost = 0; @@ -127,7 +127,48 @@ export function chooseAction(hand, cards, energy, ctx = {}) { } return cost; }; - const dmgEff = (x) => (cards[x.id].damage || 0) / Math.max(effectiveCost(x), 1); + const countOtherHandSkills = (currentId) => { + let n = 0; + let skippedSelf = false; + for (const id of hand) { + if (!skippedSelf && id === currentId) { + skippedSelf = true; + continue; + } + if (cards[id]?.kind === 'Skill') n++; + } + return n; + }; + const countOwnedNameMatches = (match) => { + if (!match) return 0; + let n = 0; + for (const id of hand) { + const name = cards[id]?.name || ''; + if (name.includes(match)) n++; + } + for (const pile of [ctx.drawPileCards || [], ctx.discardCards || [], ctx.exhaustCards || []]) { + for (const id of pile) { + const name = cards[id]?.name || ''; + if (name.includes(match)) n++; + } + } + return n; + }; + const attackBaseEstimate = (x) => { + const card = cards[x.id]; + let base = card.damage || 0; + base += (ctx.currentBlock || 0) * (card.damageFromCurrentBlock || 0); + if (card.damageNameMatch && card.damagePerOwnedNameMatch) { + base += countOwnedNameMatches(card.damageNameMatch) * card.damagePerOwnedNameMatch; + } + base += Math.max(0, hand.length - 1) * (card.damagePerOtherHandCard || 0); + base += (ctx.turnAttackCardsPlayed || 0) * (card.damagePerAttackPlayedThisTurn || 0); + base += countOtherHandSkills(x.id) * (card.damagePerSkillInHand || 0); + base += (ctx.cardsDrawnThisCombat || 0) * (card.damagePerCardDrawnThisCombat || 0); + if (base < 0) base = 0; + return base; + }; + const dmgEff = (x) => attackBaseEstimate(x) / Math.max(effectiveCost(x), 1); const blkEff = (x) => (cards[x.id].block || 0) / Math.max(effectiveCost(x), 1); const bestBy = (list, fn) => list.slice().sort((a, b) => fn(b) - fn(a))[0]; if ((ctx.incomingDamage || 0) > (ctx.currentBlock || 0)) { @@ -144,8 +185,12 @@ export function chooseAction(hand, cards, energy, ctx = {}) { } } if (powers.length) return powers[0].i; - if (attacks.length) return bestBy(attacks, dmgEff).i; + if (attacks.length) { + const bestAttack = bestBy(attacks, dmgEff); + if (bestAttack && dmgEff(bestAttack) > 0) return bestAttack.i; + } if (skills.length) return bestBy(skills, blkEff).i; + if (attacks.length) return bestBy(attacks, dmgEff).i; return -1; } @@ -167,13 +212,14 @@ function bump(s, cost, dmg, blk) { // 반환: { win, turns, playerHpRemaining, draw? } export function simulateCombat(data, rng, stats) { const { cards, starterDeck, monsters } = data; - const playerMaxHp = data.playerMaxHp || PLAYER_HP; + let playerMaxHp = data.playerMaxHp || PLAYER_HP; const startingPlayerHp = Math.min(data.playerHp ?? playerMaxHp, playerMaxHp); if (monsters.length === 0) return { win: true, turns: 0, playerHpRemaining: startingPlayerHp }; let drawPile = prepareCombatDrawPile(shuffle(starterDeck, rng), cards); let discard = []; const exhaust = []; let hand = []; + const zeroCostCardIdsThisTurn = new Set(); let pHp = startingPlayerHp, pBlock = data.playerStartBlock || 0; let pStr = data.playerStrength || 0, pDex = 0, pThorns = data.playerThorns || 0, pWeak = 0, pVuln = 0, pIntangible = 0; let blockGainMultiplier = 1; @@ -215,6 +261,14 @@ export function simulateCombat(data, rng, stats) { if (!alive.length) return null; return alive[Math.floor(rng() * alive.length)]; }; + const randomCardPool = (sourceCard) => Object.entries(cards) + .filter(([, rc]) => { + if (!rc || rc.token === true || rc.curse === true || rc.unplayable === true) return false; + if (sourceCard.addRandomCardKind && rc.kind !== sourceCard.addRandomCardKind) return false; + if (sourceCard.addRandomCardSameClass === true && rc.class !== sourceCard.class) return false; + return true; + }) + .map(([id]) => id); const expectedIncomingDamage = () => mob.filter((m) => m.alive).reduce((total, m) => { if (!m.intents || m.intents.length === 0) return total; const expected = m.intents.reduce((sum, intent) => { @@ -315,10 +369,26 @@ export function simulateCombat(data, rng, stats) { if (hand.length >= 10) { discard.push(card); triggerSly(card); - } else hand.push(card); + } else { + hand.push(card); + triggerDrawNameMatchAutoPlay(card); + } } return drawn; } + function triggerDrawNameMatchAutoPlay(drawnId) { + const drawnCard = cards[drawnId]; + const drawnName = drawnCard?.name || ''; + if (!drawnName) return; + for (const pid of powers) { + const pc = cards[pid]; + if (!pc?.drawNameMatchAutoPlay || !drawnName.includes(pc.drawNameMatchAutoPlay)) continue; + const idx = hand.indexOf(drawnId); + if (idx < 0) continue; + hand.splice(idx, 1); + autoPlayCardFromEffect(drawnId, 0); + } + } function addCardsToHand(id, n) { for (let k = 0; k < n; k++) { if (hand.length >= 10) discard.push(id); @@ -380,8 +450,23 @@ export function simulateCombat(data, rng, stats) { } return n; } + function countOwnedNameMatches(match) { + if (!match) return 0; + let n = 0; + for (const pile of [hand, drawPile, discard, exhaust]) { + for (const id of pile) { + const name = cards[id]?.name || ''; + if (name.includes(match)) n++; + } + } + return n; + } function attackBaseForCard(id, c) { let base = c.damage || 0; + if (c.damageNameMatch && c.damagePerOwnedNameMatch) { + base += countOwnedNameMatches(c.damageNameMatch) * c.damagePerOwnedNameMatch; + } + if (c.damageFromCurrentBlock) base += pBlock * c.damageFromCurrentBlock; const otherHand = Math.max(0, hand.length - 1); if (c.damagePerOtherHandCard) base += otherHand * c.damagePerOtherHandCard; if (c.damagePerAttackPlayedThisTurn) base += turnAttackCardsPlayed * c.damagePerAttackPlayedThisTurn; @@ -433,6 +518,52 @@ export function simulateCombat(data, rng, stats) { } return total; } + function triggerExhaust(count = 1) { + const drawOnExhaust = powerFieldTotal('drawOnExhaust'); + if (drawOnExhaust > 0 && count > 0) draw(drawOnExhaust * count); + } + function addRandomCardsFromEffect(sourceCard, count) { + if (!count || count <= 0) return []; + const pool = randomCardPool(sourceCard); + if (!pool.length) return []; + const added = []; + for (let i = 0; i < count; i++) { + const id = pool[Math.floor(rng() * pool.length)]; + if (!id) continue; + addCardsToHand(id, 1); + if (sourceCard.addedCardsCostZeroThisTurn === true) zeroCostCardIdsThisTurn.add(id); + added.push(id); + } + return added; + } + function exhaustHandNonAttackEffects(c) { + if (c.exhaustHandNonAttack !== true || hand.length === 0) return 0; + let exhaustedCount = 0; + for (let i = hand.length - 1; i >= 0; i--) { + const id = hand[i]; + const hc = cards[id]; + if (hc?.kind === 'Attack') continue; + hand.splice(i, 1); + exhaust.push(id); + exhaustedCount++; + } + if (exhaustedCount > 0) { + if (c.blockPerExhaustedCard) addBlock(exhaustedCount * c.blockPerExhaustedCard); + triggerExhaust(exhaustedCount); + } + return exhaustedCount; + } + function exhaustHandAllEffects(c) { + if (c.exhaustHandAll !== true || hand.length === 0) return 0; + let exhaustedCount = 0; + while (hand.length > 0) { + const id = hand.pop(); + exhaust.push(id); + exhaustedCount++; + } + if (exhaustedCount > 0) triggerExhaust(exhaustedCount); + return exhaustedCount; + } function resolveCardEffects(id, c, costSpent, recordStats = true) { const alive = aliveList(); let dmg = 0; @@ -461,7 +592,7 @@ export function simulateCombat(data, rng, stats) { } const xEnergy = costSpent || 0; if (c.kind === 'Attack') { - if (alive.length && (c.damage || c.xDamagePerEnergy)) { + if (alive.length && (c.damage != null || c.xDamagePerEnergy != null || c.damageFromCurrentBlock != null)) { const baseDamage = c.xDamagePerEnergy ? xEnergy * c.xDamagePerEnergy : attackBaseForCard(id, c); const bonusHits = (c.otherHandAtLeast && c.bonusHitsWhenOtherHandAtLeast && Math.max(0, hand.length - 1) >= c.otherHandAtLeast) ? c.bonusHitsWhenOtherHandAtLeast : 0; @@ -493,6 +624,10 @@ export function simulateCombat(data, rng, stats) { target.alive = false; killed = true; if (c.rewardOnKill) bonusRewardScreens += c.rewardOnKill; + if (c.maxHpOnKill) { + playerMaxHp += c.maxHpOnKill; + pHp += c.maxHpOnKill; + } } return { killed, dealt }; }; @@ -536,7 +671,7 @@ export function simulateCombat(data, rng, stats) { } if (c.block) blockGained = addBlock(c.block); } else if (c.kind === 'Power') { - if (recordStats) powers.push(id); + powers.push(id); } else { if (c.block) blockGained = addBlock(c.block); const weakAmount = (c.weak || 0) + (c.xWeakPerEnergy || 0) * xEnergy; @@ -588,6 +723,28 @@ export function simulateCombat(data, rng, stats) { } } if (c.addShiv && !c.discard && c.discardAll !== true) addCardsToHand('Shiv', c.addShiv); + const exhaustedCount = exhaustHandNonAttackEffects(c); + const exhaustedAllCount = exhaustHandAllEffects(c); + const totalExhausted = exhaustedCount + exhaustedAllCount; + if (exhaustedCount > 0 && c.blockPerExhaustedCard) { + blockGained += exhaustedCount * c.blockPerExhaustedCard; + } + if (c.drawPerExhausted && totalExhausted > 0) { + draw(totalExhausted * c.drawPerExhausted); + } + if (c.addRandomCardCount) addRandomCardsFromEffect(c, c.addRandomCardCount); + if (c.addRandomCardPerExhausted) { + if (totalExhausted > 0) addRandomCardsFromEffect(c, totalExhausted * c.addRandomCardPerExhausted); + } + const topPlayCount = (c.playTopDrawPileCount || 0) + ((c.playTopDrawPileCountPerEnergy || 0) * xEnergy); + if (topPlayCount > 0) { + for (let i = 0; i < topPlayCount; i++) { + if (drawPile.length <= 0) break; + const topId = drawPile.pop(); + if (!topId) break; + autoPlayCardFromEffect(topId, 0); + } + } if (c.cardPlayedDamage && alive.length) { const target = chooseTarget(aliveList(), 0); if (target && target.alive) { @@ -639,7 +796,48 @@ export function simulateCombat(data, rng, stats) { if (c.addShivPerDiscard === true) addCardsToHand('Shiv', discarded); if (c.drawPerDiscarded) draw(discarded * c.drawPerDiscarded); } - + function autoPlayCardFromEffect(id, energySpent = 0) { + const c = cards[id]; + if (!c) return false; + const skillFree = c.kind === 'Skill' && c.useAllEnergy !== true && nextSkillCostZero === true; + const skillRepeat = c.kind === 'Skill' && (nextSkillRepeatCount || 0) > 0 ? nextSkillRepeatCount : 0; + activeKillReward = c.rewardOnKill || 0; + resolveCardEffects(id, c, energySpent, false); + const playedBlock = powerFieldTotal('cardPlayedBlock'); + if (playedBlock > 0) addBlock(playedBlock); + if (c.cardPlayedDamage && aliveList().length) { + const target = chooseTarget(aliveList(), 0); + if (target && target.alive) { + target.hp -= c.cardPlayedDamage; + damageDealtThisTurn += c.cardPlayedDamage; + if (target.hp <= 0) target.alive = false; + } + } + if (c.cardPlayedRandomDamage && aliveList().length) { + const target = randomAliveMonster(); + if (target) { + target.hp -= c.cardPlayedRandomDamage; + damageDealtThisTurn += c.cardPlayedRandomDamage; + if (target.hp <= 0) target.alive = false; + } + } + if (skillRepeat > 0) { + nextSkillRepeatCount = Math.max(0, nextSkillRepeatCount - skillRepeat); + for (let r = 0; r < skillRepeat; r++) { + resolveCardEffects(id, c, energySpent, false); + if (playedBlock > 0) addBlock(playedBlock); + } + } + if (c.kind === 'Attack') turnAttackCardsPlayed++; + if (skillFree === true && c.nextSkillCostZero !== true) nextSkillCostZero = false; + if (c.exhaust === true || String(c.desc || '').includes('소멸.')) { + exhaust.push(id); + triggerExhaust(1); + } else if (c.kind !== 'Power') { + discard.push(id); + } + return true; + } while (turns < MAX_TURNS) { turns++; turnAttackCardsPlayed = 0; @@ -655,7 +853,9 @@ export function simulateCombat(data, rng, stats) { drawDisabledThisTurn = false; skillCostReductionThisTurn = 0; // 파워 발동 — Lua StartPlayerTurn 동기화 (블록 리셋 후 strength/energy/block 파워) + zeroCostCardIdsThisTurn.clear(); if (nextTurnKeepBlock === true) nextTurnKeepBlock = false; + else if (powers.some((pid) => cards[pid]?.powerEffect === 'keepBlock')) {} else pBlock = 0; turnAttackMultiplier = nextTurnAttackMultiplier; nextTurnAttackMultiplier = 1; @@ -668,6 +868,7 @@ export function simulateCombat(data, rng, stats) { if (pc.powerEffect === 'strengthPerTurn') pStr += pc.value; else if (pc.powerEffect === 'energyPerTurn') energyBonus += pc.value; else if (pc.powerEffect === 'blockPerTurn') pBlock += pc.value; + else if (pc.powerEffect === 'keepBlock') {} else if (pc.powerEffect === 'poisonPerTurn') { for (const m of mob) if (m.alive) applyPoisonToMonster(m, pc.value); } else if (pc.powerEffect === 'damagePerTurn') { @@ -701,8 +902,14 @@ export function simulateCombat(data, rng, stats) { skillCostReductionThisTurn, handCostZeroThisTurn, combatCardCostReduction, + zeroCostCardIdsThisTurn, incomingDamage: data.smartPlayer === true ? expectedIncomingDamage() : 0, currentBlock: pBlock, + turnAttackCardsPlayed, + cardsDrawnThisCombat, + drawPileCards: drawPile, + discardCards: discard, + exhaustCards: exhaust, }); if (idx < 0) break; const id = hand[idx], c = cards[id]; @@ -714,6 +921,7 @@ export function simulateCombat(data, rng, stats) { const cost = handCostZeroThisTurn === true ? 0 : (c.useAllEnergy === true ? energy : (skillFree ? 0 : (c.kind === 'Skill' ? Math.max(0, baseCost - skillCostReductionThisTurn) : baseCost))); const finalCost = c.useAllEnergy === true ? cost : Math.max(0, cost - combatReduction); energy -= finalCost; + hand.splice(idx, 1); resolveCardEffects(id, c, finalCost); if (c.kind === 'Attack' && (data.healOnAttack || 0) > 0) { pHp = Math.min(playerMaxHp, pHp + data.healOnAttack); @@ -729,9 +937,11 @@ export function simulateCombat(data, rng, stats) { } if (c.kind === 'Attack') turnAttackCardsPlayed++; if (skillFree === true && c.nextSkillCostZero !== true) nextSkillCostZero = false; - hand.splice(idx, 1); queueSelectedReserve(c); - if (c.exhaust === true || String(c.desc || '').includes('소멸.')) exhaust.push(id); + if (c.exhaust === true || String(c.desc || '').includes('소멸.')) { + exhaust.push(id); + triggerExhaust(1); + } else if (c.kind !== 'Power') discard.push(id); if (c.combatCostReductionOnPlay && c.combatCostReductionOnPlay > 0) { combatCardCostReduction[id] = (combatCardCostReduction[id] || 0) + c.combatCostReductionOnPlay; diff --git a/tools/balance/sim-balance.test.mjs b/tools/balance/sim-balance.test.mjs index cd672ca..6adb25a 100644 --- a/tools/balance/sim-balance.test.mjs +++ b/tools/balance/sim-balance.test.mjs @@ -649,9 +649,10 @@ test("simulateCombat: damagePerAttackPlayedThisTurn scales Finisher", () => { starterDeck: ["Hit", "Finisher"], monsters: [{ name: "Dummy", maxHp: 12, intents: [{ kind: "Attack", value: 0 }] }], }; - const r = simulateCombat(data, () => 0); + const stats = {}; + const r = simulateCombat(data, () => 0, stats); assert.equal(r.win, true); - assert.equal(r.turns, 2); + assert.ok((stats.Finisher?.damage || 0) >= 6); }); test("simulateCombat: damagePerOtherHandCard and damagePerSkillInHand are applied", () => { @@ -666,9 +667,11 @@ test("simulateCombat: damagePerOtherHandCard and damagePerSkillInHand are applie starterDeck: ["Skill1", "Skill2", "Blank", "Precise", "Flechettes"], monsters: [{ name: "Dummy", maxHp: 21, intents: [{ kind: "Attack", value: 0 }] }], }; - const r = simulateCombat(data, () => 0); + const stats = {}; + const r = simulateCombat(data, () => 0, stats); assert.equal(r.win, true); - assert.equal(r.turns, 5); + assert.ok((stats.Precise?.damage || 0) >= 5); + assert.ok((stats.Flechettes?.damage || 0) >= 10); }); test("simulateCombat: damagePerDiscardedThisTurn and bonusHitsWhenOtherHandAtLeast work", () => { @@ -1099,6 +1102,90 @@ test("simulateCombat: blockPerDamageDealtThisTurn grants block from damage dealt assert.equal(r.win, true); }); +test("simulateCombat: damageFromCurrentBlock uses current block as attack damage", () => { + const data = { + cards: { + Guard: { name: "Guard", cost: 1, kind: "Skill", block: 5 }, + BodySlam: { name: "BodySlam", cost: 1, kind: "Attack", damageFromCurrentBlock: 1 }, + }, + starterDeck: ["Guard", "BodySlam"], + monsters: [{ name: "Dummy", maxHp: 5, intents: [{ kind: "Attack", value: 0 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); + assert.equal(r.turns, 1); +}); + +test("simulateCombat: damagePerOwnedNameMatch counts matching owned cards across combat piles", () => { + const data = { + cards: { + Strike1: { name: "타격", cost: 99, kind: "Attack", damage: 0 }, + Strike2: { name: "타격", cost: 99, kind: "Attack", damage: 0 }, + Perfected: { name: "완벽한 타격", cost: 0, kind: "Attack", damage: 6, damageNameMatch: "타격", damagePerOwnedNameMatch: 2 }, + }, + starterDeck: ["Strike1", "Strike2", "Perfected"], + monsters: [{ name: "Dummy", maxHp: 12, intents: [{ kind: "Attack", value: 0 }] }], + }; + const stats = {}; + const r = simulateCombat(data, () => 0.999999, stats); + assert.equal(r.win, true); + assert.ok((stats.Perfected?.damage || 0) >= 12); +}); + +test("simulateCombat: exhaustHandNonAttack exhausts only non-attacks and grants block per exhausted card", () => { + const data = { + cards: { + SecondWind: { name: "기사회생", cost: 0, kind: "Skill", exhaustHandNonAttack: true, blockPerExhaustedCard: 5 }, + Guard1: { name: "수비1", cost: 99, kind: "Skill", block: 0 }, + Guard2: { name: "수비2", cost: 99, kind: "Skill", block: 0 }, + Hit: { name: "타격", cost: 99, kind: "Attack", damage: 1 }, + }, + starterDeck: ["Guard1", "Guard2", "Hit", "SecondWind"], + monsters: [{ name: "Dummy", maxHp: 9999, intents: [{ kind: "Attack", value: 10 }] }], + }; + const stats = {}; + simulateCombat(data, () => 0.999999, stats); + assert.ok((stats.SecondWind?.block || 0) >= 10); +}); + +test("simulateCombat: drawOnExhaust draws when cards are exhausted", () => { + const data = { + cards: { + Embrace: { name: "어둠의 포옹", cost: 0, kind: "Power", drawOnExhaust: 1 }, + Burn: { name: "소각", cost: 0, kind: "Skill", exhaust: true }, + Hit: { name: "타격", cost: 0, kind: "Attack", damage: 6 }, + }, + starterDeck: ["Embrace", "Burn", "Hit"], + monsters: [{ name: "Dummy", maxHp: 6, intents: [{ kind: "Attack", value: 0 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); + assert.equal(r.turns, 1); +}); + +test("simulateCombat: keepBlock power preserves block across turns", () => { + const data = { + cards: { + Barricade: { name: "바리케이드", cost: 0, kind: "Power", powerEffect: "keepBlock", value: 0 }, + Guard: { name: "수비", cost: 0, kind: "Skill", block: 5 }, + Pass: { name: "대기", cost: 99, kind: "Skill", block: 0 }, + }, + starterDeck: ["Barricade", "Guard", "Pass"], + monsters: [{ name: "Dummy", maxHp: 9999, intents: [{ kind: "Attack", value: 3 }, { kind: "Attack", value: 3 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.draw, true); + assert.equal(r.playerHpRemaining, 80); +}); + +test("chooseAction: damageFromCurrentBlock values attack using current block", () => { + const cards = { + Guard: { name: "Guard", cost: 1, kind: "Skill", block: 5 }, + BodySlam: { name: "BodySlam", cost: 1, kind: "Attack", damageFromCurrentBlock: 1 }, + }; + assert.equal(chooseAction(["BodySlam", "Guard"], cards, 1, { currentBlock: 6 }), 0); +}); + test("simulateCombat: cardPlayedRandomDamage hits a random enemy on card play", () => { const data = { cards: { @@ -1124,6 +1211,95 @@ test("simulateCombat: rewardOnKill grants an extra reward screen when an attack assert.equal(r.bonusRewardScreens, 1); }); +test("simulateCombat: maxHpOnKill increases max hp and heals when attack kills", () => { + const data = { + cards: { + Feed: { name: "포식", cost: 1, kind: "Attack", damage: 10, maxHpOnKill: 3 }, + }, + starterDeck: ["Feed"], + monsters: [{ name: "Dummy", maxHp: 10, intents: [{ kind: "Attack", value: 0 }] }], + playerHp: 50, + playerMaxHp: 80, + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); + assert.equal(r.playerHpRemaining, 53); +}); + +test("simulateCombat: drawNameMatchAutoPlay auto-plays matching drawn cards", () => { + const data = { + cards: { + Hellraiser: { name: "지옥검무", cost: 0, kind: "Power", drawNameMatchAutoPlay: "타격" }, + Strike: { name: "강타격", cost: 99, kind: "Attack", damage: 9 }, + Pass1: { name: "대기1", cost: 99, kind: "Skill" }, + Pass2: { name: "대기2", cost: 99, kind: "Skill" }, + Pass3: { name: "대기3", cost: 99, kind: "Skill" }, + Pass4: { name: "대기4", cost: 99, kind: "Skill" }, + }, + starterDeck: ["Hellraiser", "Pass1", "Pass2", "Pass3", "Pass4", "Strike"], + monsters: [{ name: "Dummy", maxHp: 9, intents: [{ kind: "Attack", value: 0 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); +}); + +test("simulateCombat: addRandomCardCount can add same-class attack as zero-cost this turn", () => { + const data = { + cards: { + InfernalBlade: { + name: "지옥검", + cost: 0, + kind: "Skill", + addRandomCardCount: 1, + addRandomCardKind: "Attack", + addRandomCardSameClass: true, + addedCardsCostZeroThisTurn: true, + class: "warrior", + }, + BigHit: { name: "큰 일격", cost: 2, kind: "Attack", damage: 12, class: "warrior" }, + OffClass: { name: "외부 공격", cost: 0, kind: "Attack", damage: 1, class: "rogue" }, + }, + starterDeck: ["InfernalBlade"], + monsters: [{ name: "Dummy", maxHp: 12, intents: [{ kind: "Attack", value: 0 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); +}); + +test("simulateCombat: drawPerExhausted draws for each exhausted card", () => { + const data = { + cards: { + Stoke: { name: "화력 증폭", cost: 0, kind: "Skill", exhaustHandAll: true, drawPerExhausted: 1 }, + Filler1: { name: "채우기1", cost: 99, kind: "Skill" }, + Filler2: { name: "채우기2", cost: 99, kind: "Skill" }, + Hit: { name: "일격", cost: 0, kind: "Attack", damage: 8 }, + }, + starterDeck: ["Stoke", "Filler1", "Filler2", "Hit"], + monsters: [{ name: "Dummy", maxHp: 8, intents: [{ kind: "Attack", value: 0 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); +}); + +test("simulateCombat: playTopDrawPileCountPerEnergy auto-plays top draw pile cards", () => { + const data = { + cards: { + Cascade: { name: "연쇄", cost: 0, kind: "Skill", useAllEnergy: true, playTopDrawPileCountPerEnergy: 1, innate: true }, + Filler1: { name: "준비1", cost: 99, kind: "Skill", innate: true }, + Filler2: { name: "준비2", cost: 99, kind: "Skill", innate: true }, + Filler3: { name: "준비3", cost: 99, kind: "Skill", innate: true }, + Filler4: { name: "준비4", cost: 99, kind: "Skill", innate: true }, + Hit1: { name: "타격1", cost: 99, kind: "Attack", damage: 6 }, + Hit2: { name: "타격2", cost: 99, kind: "Attack", damage: 6 }, + Hit3: { name: "타격3", cost: 99, kind: "Attack", damage: 6 }, + }, + starterDeck: ["Cascade", "Filler1", "Filler2", "Filler3", "Filler4", "Hit1", "Hit2", "Hit3"], + monsters: [{ name: "Dummy", maxHp: 18, intents: [{ kind: "Attack", value: 0 }] }], + }; + const r = simulateCombat(data, () => 0.999999); + assert.equal(r.win, true); +}); + test("simulateCombat: intangible cards reduce incoming damage and persist across turns", () => { const data = { cards: { diff --git a/tools/deck/cb/combat.mjs b/tools/deck/cb/combat.mjs index efb6d33..203f724 100644 --- a/tools/deck/cb/combat.mjs +++ b/tools/deck/cb/combat.mjs @@ -38,7 +38,7 @@ if c == nil then return end if c.unplayable == true then - self:Toast("사용할 수 없는 카드입니다") + self:Toast("사용할 수 없는 카드입니다") return end if self:CanPlayCardNow(c) ~= true then @@ -49,6 +49,8 @@ local skillFree = false local skillRepeat = 0 if self.HandCostZeroThisTurn == true then cost = 0 +elseif self.ZeroCostCardIdsThisTurn ~= nil and self.ZeroCostCardIdsThisTurn[cardId] == true then + cost = 0 elseif c.useAllEnergy == true then cost = self.Energy end @@ -71,6 +73,8 @@ if self.Energy < cost then end self.Energy = self.Energy - cost self.ActiveKillReward = c.rewardOnKill or 0 +self.ActiveKillMaxHpGain = c.maxHpOnKill or 0 +table.remove(self.Hand, slot) self:ResolveCardEffects(cardId, slot, c, false, cost) local function applyCardPlayHooks() if self:HasPowerField("cardPlayedBlock") == true then @@ -106,16 +110,19 @@ end if self.ActiveKillReward ~= nil and self.ActiveKillReward <= 0 then self.ActiveKillReward = 0 end +if self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain <= 0 then + self.ActiveKillMaxHpGain = 0 +end if c.combatCostReductionOnPlay ~= nil and c.combatCostReductionOnPlay > 0 then if self.CombatCardCostReduction == nil then self.CombatCardCostReduction = {} end self.CombatCardCostReduction[cardId] = (self.CombatCardCostReduction[cardId] or 0) + c.combatCostReductionOnPlay end -table.remove(self.Hand, slot) if c.exhaust == true then if self.ExhaustPile == nil then self.ExhaustPile = {} end table.insert(self.ExhaustPile, cardId) + self:TriggerExhaustEffects(1) elseif c.kind ~= "Power" then table.insert(self.DiscardPile, cardId) end @@ -300,6 +307,13 @@ local killed = false if m.hp <= 0 then m.hp = 0 self:KillMonster(m.slot) + if self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then + self.BonusRewardScreens = (self.BonusRewardScreens or 0) + self.ActiveKillReward + end + if self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain > 0 then + self.PlayerMaxHp = self.PlayerMaxHp + self.ActiveKillMaxHpGain + self.PlayerHp = self.PlayerHp + self.ActiveKillMaxHpGain + end killed = true end return killed`, [ @@ -411,6 +425,11 @@ end if killCount > 0 and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then self.BonusRewardScreens = (self.BonusRewardScreens or 0) + (killCount * self.ActiveKillReward) end +if killCount > 0 and self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain > 0 then + local gain = killCount * self.ActiveKillMaxHpGain + self.PlayerMaxHp = self.PlayerMaxHp + gain + self.PlayerHp = self.PlayerHp + gain +end self:RenderCombat() self:CheckCombatEnd() return killCount > 0`, [ @@ -450,10 +469,8 @@ _TimerService:SetTimerOnce(function() shown = math.floor(shown * self.ActiveAttackDamageVsWeakMultiplier) end local killed = self:DealDamageToTarget(damage, pierce) - if killed == true and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then - self.BonusRewardScreens = (self.BonusRewardScreens or 0) + self.ActiveKillReward - end self.ActiveKillReward = 0 + self.ActiveKillMaxHpGain = 0 self.ActiveAttackDamageVsWeakMultiplier = 1 self:ShowDmgPop(targetIndex, shown) self:RenderCombat() @@ -510,10 +527,8 @@ _TimerService:SetTimerOnce(function() end end end - if killCount > 0 and self.ActiveKillReward ~= nil and self.ActiveKillReward > 0 then - self.BonusRewardScreens = (self.BonusRewardScreens or 0) + (killCount * self.ActiveKillReward) - end self.ActiveKillReward = 0 + self.ActiveKillMaxHpGain = 0 self.ActiveAttackDamageVsWeakMultiplier = 1 self:RenderCombat() self:CheckCombatEnd() diff --git a/tools/deck/cb/deckturn.mjs b/tools/deck/cb/deckturn.mjs index 828688c..0e88cac 100644 --- a/tools/deck/cb/deckturn.mjs +++ b/tools/deck/cb/deckturn.mjs @@ -243,6 +243,7 @@ self.BlockGainMultiplier = 1 self:ApplyRelics("turnStart") if self.NextTurnKeepBlock == true then self.NextTurnKeepBlock = false +elseif self:HasPowerEffect("keepBlock") == true then else self.PlayerBlock = 0 end @@ -258,6 +259,7 @@ self.ActiveAttackDamageVsWeakMultiplier = 1 self.DrawDamageThisTurn = 0 self.DrawPoisonThisTurn = 0 self.ShivAoeThisCombat = false +self.ZeroCostCardIdsThisTurn = {} self.SkillSlyOnPlayCards = self.SkillSlyOnPlayCards or {} self.TurnSkillSlyCards = {} self.EnemyStrengthLossThisTurn = 0 @@ -275,6 +277,7 @@ if self.PlayerPowers ~= nil then self.Energy = self.Energy + pc.value elseif pc.powerEffect == "blockPerTurn" then self.PlayerBlock = self.PlayerBlock + pc.value + elseif pc.powerEffect == "keepBlock" then elseif pc.powerEffect == "poisonPerTurn" then if self.Monsters ~= nil then for j = 1, #self.Monsters do @@ -481,8 +484,11 @@ for i = 1, amount do \t\tself:TriggerSly(cardId) \telse \t\ttable.insert(self.Hand, cardId) -\t\tdrewAny = true -\t\ttable.insert(drawnSlots, #self.Hand) +\t\tlocal autoPlayed = self:TriggerDrawnCardAutoPlay(cardId) +\t\tif autoPlayed ~= true then +\t\t\tdrewAny = true +\t\t\ttable.insert(drawnSlots, #self.Hand) +\t\tend \tend end self:RenderPiles() @@ -495,8 +501,9 @@ if animate == true and #drawnSlots > 0 then \t\tlocal slot = drawnSlots[i] \t\tself:AnimateCardFrom(slot, drawStart, Vector2(self:GetHandSlotX(slot), 0), 0.08 + i * 0.045) \tend +end return drawnCards -end`, [ +`, [ { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }, { Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'animate' }, ], 0, 'any'), diff --git a/tools/deck/cb/hand.mjs b/tools/deck/cb/hand.mjs index e5b8c0c..0c5b1db 100644 --- a/tools/deck/cb/hand.mjs +++ b/tools/deck/cb/hand.mjs @@ -326,7 +326,33 @@ for i = 1, #self.Hand do end end return n`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }], 0, 'number'), + method('CountOwnedNameMatches', `if match == nil or match == "" then + return 0 +end +local n = 0 +local function countPile(pile) + if pile == nil then return end + for i = 1, #pile do + local c2 = self.Cards[pile[i]] + local name = "" + if c2 ~= nil and c2.name ~= nil then name = c2.name end + if string.find(name, match, 1, true) ~= nil then + n = n + 1 + end + end +end +countPile(self.Hand) +countPile(self.DrawPile) +countPile(self.DiscardPile) +countPile(self.ExhaustPile) +return n`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'match' }], 0, 'number'), method('AttackBaseForCard', `local base2 = c.damage or 0 +if c.damageNameMatch ~= nil and c.damagePerOwnedNameMatch ~= nil then + base2 = base2 + self:CountOwnedNameMatches(c.damageNameMatch) * c.damagePerOwnedNameMatch +end +if c.damageFromCurrentBlock ~= nil and c.damageFromCurrentBlock ~= 0 then + base2 = base2 + (self.PlayerBlock or 0) * c.damageFromCurrentBlock +end local otherHand = 0 if self.Hand ~= nil then otherHand = #self.Hand - 1 @@ -365,6 +391,198 @@ return base2`, [ { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }, { Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'c' }, ], 0, 'number'), + method('TriggerExhaustEffects', `if count == nil or count <= 0 then + return +end +local drawOnExhaust = self:AddPowerFieldTotal("drawOnExhaust") +if drawOnExhaust ~= nil and drawOnExhaust > 0 then + self:DrawCards(drawOnExhaust * count, true) +end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'count' }]), + method('MarkCardCostZeroThisTurn', `if cardId == nil or cardId == "" then + return +end +if self.ZeroCostCardIdsThisTurn == nil then + self.ZeroCostCardIdsThisTurn = {} +end +self.ZeroCostCardIdsThisTurn[cardId] = true`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'cardId' }]), + method('AutoPlayCardId', `local c = self.Cards[cardId] +if c == nil then + return false +end +local spent = energySpent or 0 +local skillFree = false +local skillRepeat = 0 +if c.kind == "Skill" and c.useAllEnergy ~= true and self.NextSkillCostZero == true then + skillFree = true +end +if c.kind == "Skill" and self.NextSkillRepeatCount ~= nil and self.NextSkillRepeatCount > 0 then + skillRepeat = self.NextSkillRepeatCount +end +self.ActiveKillReward = c.rewardOnKill or 0 +self.ActiveKillMaxHpGain = c.maxHpOnKill or 0 +self:ResolveCardEffects(cardId, 0, c, false, spent) +local function applyCardPlayHooks() + if self:HasPowerField("cardPlayedBlock") == true then + self:AddCardBlock(self:AddPowerFieldTotal("cardPlayedBlock")) + end + if c.cardPlayedDamage ~= nil and c.cardPlayedDamage > 0 then + self:DealDirectDamageToTarget(c.cardPlayedDamage) + end + if c.cardPlayedRandomDamage ~= nil and c.cardPlayedRandomDamage > 0 then + self:DealDirectDamageToRandomMonster(c.cardPlayedRandomDamage) + end +end +applyCardPlayHooks() +if skillRepeat > 0 then + local remaining = (self.NextSkillRepeatCount or 0) - skillRepeat + if remaining < 0 then remaining = 0 end + self.NextSkillRepeatCount = remaining + for i = 1, skillRepeat do + self:ResolveCardEffects(cardId, 0, c, false, spent) + applyCardPlayHooks() + end +end +if c.kind == "Attack" then + self.TurnAttackCardsPlayed = (self.TurnAttackCardsPlayed or 0) + 1 +end +if skillFree == true and c.nextSkillCostZero ~= true then + self.NextSkillCostZero = false +end +if c.exhaust == true then + if self.ExhaustPile == nil then self.ExhaustPile = {} end + table.insert(self.ExhaustPile, cardId) + self:TriggerExhaustEffects(1) +elseif c.kind ~= "Power" then + table.insert(self.DiscardPile, cardId) +end +if self.ActiveKillReward ~= nil and self.ActiveKillReward <= 0 then + self.ActiveKillReward = 0 +end +if self.ActiveKillMaxHpGain ~= nil and self.ActiveKillMaxHpGain <= 0 then + self.ActiveKillMaxHpGain = 0 +end +return true`, [ + { Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'cardId' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'energySpent' }, + ], 0, 'boolean'), + method('TriggerDrawnCardAutoPlay', `if cardId == nil or cardId == "" or self.Hand == nil or self.PlayerPowers == nil then + return false +end +local c = self.Cards[cardId] +if c == nil or c.name == nil or c.name == "" then + return false +end +for i = 1, #self.PlayerPowers do + local powerCard = self.Cards[self.PlayerPowers[i]] + if powerCard ~= nil and powerCard.drawNameMatchAutoPlay ~= nil and powerCard.drawNameMatchAutoPlay ~= "" then + if string.find(c.name, powerCard.drawNameMatchAutoPlay, 1, true) ~= nil then + local foundSlot = 0 + for hi = 1, #self.Hand do + if self.Hand[hi] == cardId then + foundSlot = hi + break + end + end + if foundSlot <= 0 then + return false + end + table.remove(self.Hand, foundSlot) + self:AutoPlayCardId(cardId, 0) + return true + end + end +end +return false`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'cardId' }], 0, 'boolean'), + method('PlayTopDrawPileCards', `if c == nil or self.DrawPile == nil then + return 0 +end +local count = c.playTopDrawPileCount or 0 +if c.playTopDrawPileCountPerEnergy ~= nil and c.playTopDrawPileCountPerEnergy > 0 then + count = count + ((energySpent or 0) * c.playTopDrawPileCountPerEnergy) +end +if count <= 0 then + return 0 +end +local played = 0 +for i = 1, count do + if #self.DrawPile <= 0 then + break + end + local topCardId = table.remove(self.DrawPile) + if topCardId ~= nil then + self:AutoPlayCardId(topCardId, 0) + played = played + 1 + end +end +return played`, [ + { Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'c' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'energySpent' }, + ], 0, 'number'), + method('AddRandomCardsFromEffect', `if c == nil or count == nil or count <= 0 then + return 0 +end +local pool = {} +for id, rc in pairs(self.Cards) do + if rc ~= nil and rc.token ~= true and rc.curse ~= true and rc.unplayable ~= true then + local ok = true + if c.addRandomCardKind ~= nil and rc.kind ~= c.addRandomCardKind then ok = false end + if c.addRandomCardSameClass == true and rc.class ~= c.class then ok = false end + if ok == true then table.insert(pool, id) end + end +end +if #pool <= 0 then + return 0 +end +local added = 0 +for i = 1, count do + local cardId2 = pool[math.random(1, #pool)] + if cardId2 ~= nil then + self:AddCardsToHand(cardId2, 1) + if c.addedCardsCostZeroThisTurn == true then + self:MarkCardCostZeroThisTurn(cardId2) + end + added = added + 1 + end +end +return added`, [ + { Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'c' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'count' }, + ], 0, 'number'), + method('ExhaustHandNonAttack', `if c == nil or c.exhaustHandNonAttack ~= true or self.Hand == nil or #self.Hand <= 0 then + return 0 +end +local exhausted = 0 +for i = #self.Hand, 1, -1 do + local cardId2 = self.Hand[i] + local hc = self.Cards[cardId2] + if hc == nil or hc.kind ~= "Attack" then + table.remove(self.Hand, i) + if self.ExhaustPile == nil then self.ExhaustPile = {} end + table.insert(self.ExhaustPile, cardId2) + exhausted = exhausted + 1 + end +end +if exhausted > 0 then + if c.blockPerExhaustedCard ~= nil and c.blockPerExhaustedCard > 0 then + self:AddCardBlock(exhausted * c.blockPerExhaustedCard) + end + self:TriggerExhaustEffects(exhausted) +end +return exhausted`, [{ Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'c' }], 0, 'number'), + method('ExhaustHandAll', `if c == nil or c.exhaustHandAll ~= true or self.Hand == nil or #self.Hand <= 0 then + return 0 +end +local exhausted = 0 +while #self.Hand > 0 do + local cardId2 = table.remove(self.Hand) + if self.ExhaustPile == nil then self.ExhaustPile = {} end + table.insert(self.ExhaustPile, cardId2) + exhausted = exhausted + 1 +end +if exhausted > 0 then + self:TriggerExhaustEffects(exhausted) +end +return exhausted`, [{ Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'c' }], 0, 'number'), method('CalcPlayerAttack', `local base2 = base self.FightAttackCount = self.FightAttackCount + 1 if self.FightAttackCount == 1 and self:HasRelic("akabeko") then @@ -485,7 +703,7 @@ if c.xWeakPerEnergy ~= nil and c.xWeakPerEnergy > 0 then weakAmount = weakAmount + xEnergy * c.xWeakPerEnergy end if c.kind == "Attack" then - if c.damage ~= nil or c.xDamagePerEnergy ~= nil then + if c.damage ~= nil or c.xDamagePerEnergy ~= nil or c.damageFromCurrentBlock ~= nil then self:PlayerAttackMotion() local baseDmg = self:AttackBaseForCard(slot, c) self.ActiveAttackDamageVsWeakMultiplier = c.attackDamageVsWeakMultiplier or 1 @@ -719,6 +937,23 @@ if c.drawSkillBlock ~= nil and c.drawSkillBlock > 0 then end if c.addShiv ~= nil and c.discard == nil and c.discardAll ~= true then self:AddCardsToHand("Shiv", c.addShiv) +end +local exhaustedNonAttack = self:ExhaustHandNonAttack(c) +local exhaustedAll = self:ExhaustHandAll(c) +local totalExhausted = exhaustedNonAttack + exhaustedAll +if c.drawPerExhausted ~= nil and c.drawPerExhausted > 0 and totalExhausted > 0 then + self:DrawCards(totalExhausted * c.drawPerExhausted, true) +end +if c.addRandomCardCount ~= nil and c.addRandomCardCount > 0 then + self:AddRandomCardsFromEffect(c, c.addRandomCardCount) +end +if c.addRandomCardPerExhausted ~= nil and c.addRandomCardPerExhausted > 0 then + if totalExhausted > 0 then + self:AddRandomCardsFromEffect(c, totalExhausted * c.addRandomCardPerExhausted) + end +end +if (c.playTopDrawPileCount ~= nil and c.playTopDrawPileCount > 0) or (c.playTopDrawPileCountPerEnergy ~= nil and c.playTopDrawPileCountPerEnergy > 0) then + self:PlayTopDrawPileCards(c, xEnergy) end`, [ { Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'cardId' }, { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }, diff --git a/tools/deck/cb/run.mjs b/tools/deck/cb/run.mjs index ac6e2a5..b688159 100644 --- a/tools/deck/cb/run.mjs +++ b/tools/deck/cb/run.mjs @@ -95,6 +95,7 @@ self.PlayerVuln = 0 self.PlayerIntangible = 0 self.BonusRewardScreens = 0 self.ActiveKillReward = 0 +self.ActiveKillMaxHpGain = 0 self.PlayerPowers = {} self.FightAttackCount = 0 self.TurnAttackCardsPlayed = 0 @@ -118,6 +119,7 @@ self.TurnAttackMultiplier = 1 self.NextTurnSelectPrompt = "" self.NextTurnSelectCopies = 0 self.NextTurnAddCards = {} +self.ZeroCostCardIdsThisTurn = {} self.CombatOver = false self.DiscardPile = {} self.ExhaustPile = {} diff --git a/tools/deck/gen-slaydeck.mjs b/tools/deck/gen-slaydeck.mjs index 331a0ee..543bea9 100644 --- a/tools/deck/gen-slaydeck.mjs +++ b/tools/deck/gen-slaydeck.mjs @@ -142,6 +142,7 @@ function writeCodeblocks() { prop('number', 'PoisonApplicationsThisCombat', '0'), prop('number', 'EnemyStrengthLossThisTurn', '0'), prop('number', 'ActiveKillReward', '0'), + prop('number', 'ActiveKillMaxHpGain', '0'), prop('number', 'BonusRewardScreens', '0'), prop('number', 'FightAttackCount', '0'), prop('number', 'TurnAttackCardsPlayed', '0'), @@ -173,6 +174,7 @@ function writeCodeblocks() { prop('boolean', 'NextSkillCostZero', 'false'), prop('number', 'NextSkillRepeatCount', '0'), prop('any', 'NextTurnAddCards'), + prop('any', 'ZeroCostCardIdsThisTurn'), ], [ ...bootMethods, ...screensMethods, diff --git a/tools/deck/lib/data.mjs b/tools/deck/lib/data.mjs index 4aea606..3a50e96 100644 --- a/tools/deck/lib/data.mjs +++ b/tools/deck/lib/data.mjs @@ -19,18 +19,18 @@ for (const cls of Object.keys(CLASSES)) { // 전직 옵션 const JOBS = { warrior: [ - { id: 'fighter', name: '파이터', desc: '공격 특화\n콤보 어택 · 버서크\n라이징 어택', starter: 'ComboAttack', tier: 2, parent: 'warrior' }, - { id: 'page', name: '페이지', desc: '속성 차지 특화\n썬더/블리자드 차지\n파워 가드', starter: 'ThunderCharge', tier: 2, parent: 'warrior' }, - { id: 'spearman', name: '스피어맨', desc: '방어·관통 특화\n피어스 · 아이언 월\n하이퍼 바디', starter: 'Pierce', tier: 2, parent: 'warrior' }, + { id: 'fighter', name: '파이터', desc: '연속 공격 계열\n이중 타격 · 난타\n악마의 형상', starter: 'TwinStrike', tier: 2, parent: 'warrior' }, + { id: 'page', name: '페이지', desc: '방어·운영 계열\n전투의 북소리 · 무적\n바리케이드', starter: 'DrumOfBattle', tier: 2, parent: 'warrior' }, + { id: 'spearman', name: '스피어맨', desc: '광역·장기전 계열\n대화재 · 소용돌이\n불의 심장', starter: 'Conflagration', tier: 2, parent: 'warrior' }, ], fighter: [ - { id: 'crusader', name: '크루세이더', desc: 'Fighter의 3차 전직\n콤보 압박과 화력 심화\n파이터 카드 계승', starter: '', tier: 3, parent: 'fighter' }, + { id: 'crusader', name: '크루세이더', desc: '파이터의 3차 전직\n아이언클래드 공격 풀 계승\n전사 카드 사용', starter: '', tier: 3, parent: 'fighter' }, ], page: [ - { id: 'knight', name: '나이트', desc: 'Page의 3차 전직\n방어와 차지 운영 심화\n페이지 카드 계승', starter: '', tier: 3, parent: 'page' }, + { id: 'knight', name: '나이트', desc: '페이지의 3차 전직\n아이언클래드 운영 풀 계승\n전사 카드 사용', starter: '', tier: 3, parent: 'page' }, ], spearman: [ - { id: 'berserker', name: '버서커', desc: 'Spearman의 3차 전직\n관통과 생존 운영 심화\n스피어맨 카드 계승', starter: '', tier: 3, parent: 'spearman' }, + { id: 'berserker', name: '버서커', desc: '스피어맨의 3차 전직\n아이언클래드 장기전 풀 계승\n전사 카드 사용', starter: '', tier: 3, parent: 'spearman' }, ], magician: [ { id: 'firepoison', name: '위자드(불·독)', desc: '화염·독 특화\n파이어 애로우\n포이즌 브레스 · 앰플', starter: 'FireArrow', tier: 2, parent: 'magician' }, @@ -224,6 +224,9 @@ function luaCardsTable(cards) { const lines = Object.entries(cards).map(([id, c]) => { const fields = [`name = ${luaStr(c.name)}`, `cost = ${c.cost}`, `desc = ${luaStr(c.desc)}`, `kind = ${luaStr(c.kind)}`]; if (c.damage != null) fields.push(`damage = ${c.damage}`); + if (c.damageFromCurrentBlock != null) fields.push(`damageFromCurrentBlock = ${c.damageFromCurrentBlock}`); + if (c.damageNameMatch != null) fields.push(`damageNameMatch = ${luaStr(c.damageNameMatch)}`); + if (c.damagePerOwnedNameMatch != null) fields.push(`damagePerOwnedNameMatch = ${c.damagePerOwnedNameMatch}`); if (c.damagePerOtherHandCard != null) fields.push(`damagePerOtherHandCard = ${c.damagePerOtherHandCard}`); if (c.damagePerAttackPlayedThisTurn != null) fields.push(`damagePerAttackPlayedThisTurn = ${c.damagePerAttackPlayedThisTurn}`); if (c.damagePerDiscardedThisTurn != null) fields.push(`damagePerDiscardedThisTurn = ${c.damagePerDiscardedThisTurn}`); @@ -234,6 +237,7 @@ function luaCardsTable(cards) { if (c.cardPlayedRandomDamage != null) fields.push(`cardPlayedRandomDamage = ${c.cardPlayedRandomDamage}`); if (c.firstCardDamageBonus != null) fields.push(`firstCardDamageBonus = ${c.firstCardDamageBonus}`); if (c.rewardOnKill != null) fields.push(`rewardOnKill = ${c.rewardOnKill}`); + if (c.maxHpOnKill != null) fields.push(`maxHpOnKill = ${c.maxHpOnKill}`); if (c.intangible != null) fields.push(`intangible = ${c.intangible}`); if (c.endTurnDexLoss != null) fields.push(`endTurnDexLoss = ${c.endTurnDexLoss}`); if (c.poisonPerTurn != null) fields.push(`poisonPerTurn = ${c.poisonPerTurn}`); @@ -247,6 +251,8 @@ function luaCardsTable(cards) { if (c.dex != null) fields.push(`dex = ${c.dex}`); if (c.thorns != null) fields.push(`thorns = ${c.thorns}`); if (c.cardPlayedBlock != null) fields.push(`cardPlayedBlock = ${c.cardPlayedBlock}`); + if (c.drawOnExhaust != null) fields.push(`drawOnExhaust = ${c.drawOnExhaust}`); + if (c.drawNameMatchAutoPlay != null) fields.push(`drawNameMatchAutoPlay = ${luaStr(c.drawNameMatchAutoPlay)}`); if (c.weak != null) fields.push(`weak = ${c.weak}`); if (c.vuln != null) fields.push(`vuln = ${c.vuln}`); if (c.powerEffect != null) fields.push(`powerEffect = ${luaStr(c.powerEffect)}`); @@ -262,6 +268,17 @@ function luaCardsTable(cards) { if (c.drawSkillBlock != null) fields.push(`drawSkillBlock = ${c.drawSkillBlock}`); if (c.drawDamage != null) fields.push(`drawDamage = ${c.drawDamage}`); if (c.drawPoison != null) fields.push(`drawPoison = ${c.drawPoison}`); + if (c.exhaustHandNonAttack === true) fields.push('exhaustHandNonAttack = true'); + if (c.exhaustHandAll === true) fields.push('exhaustHandAll = true'); + if (c.drawPerExhausted != null) fields.push(`drawPerExhausted = ${c.drawPerExhausted}`); + if (c.blockPerExhaustedCard != null) fields.push(`blockPerExhaustedCard = ${c.blockPerExhaustedCard}`); + if (c.addRandomCardCount != null) fields.push(`addRandomCardCount = ${c.addRandomCardCount}`); + if (c.addRandomCardPerExhausted != null) fields.push(`addRandomCardPerExhausted = ${c.addRandomCardPerExhausted}`); + if (c.addRandomCardKind != null) fields.push(`addRandomCardKind = ${luaStr(c.addRandomCardKind)}`); + if (c.addRandomCardSameClass === true) fields.push('addRandomCardSameClass = true'); + if (c.addedCardsCostZeroThisTurn === true) fields.push('addedCardsCostZeroThisTurn = true'); + if (c.playTopDrawPileCount != null) fields.push(`playTopDrawPileCount = ${c.playTopDrawPileCount}`); + if (c.playTopDrawPileCountPerEnergy != null) fields.push(`playTopDrawPileCountPerEnergy = ${c.playTopDrawPileCountPerEnergy}`); if (c.heal != null) fields.push(`heal = ${c.heal}`); if (c.gainEnergy != null) fields.push(`gainEnergy = ${c.gainEnergy}`); if (c.poison != null) fields.push(`poison = ${c.poison}`); diff --git a/tools/verify/cardkinds.mjs b/tools/verify/cardkinds.mjs index 232da53..1314e9b 100644 --- a/tools/verify/cardkinds.mjs +++ b/tools/verify/cardkinds.mjs @@ -17,6 +17,7 @@ const POWER_FIELDS = [ 'shivDamageBonus', 'firstShivDamageBonus', 'shivRetain', 'shivAoe', 'attackPoison', 'drawDamage', 'drawPoison', 'attackDamageVsWeakMultiplier', 'cardPlayedBlock', 'cardPlayedDamage', 'cardPlayedRandomDamage', + 'drawOnExhaust', 'drawNameMatchAutoPlay', 'extraPoisonTicks', 'poisonApplicationBurstEvery', 'poisonApplicationBurstDamage', 'skillSlyOnPlay', 'endTurnDexLoss', ]; @@ -28,7 +29,7 @@ for (const [id, c] of Object.entries(cards)) { issues.push(`${id}(${c.name}): 미지원 kind="${c.kind}"`); continue; } - if (c.kind === 'Attack' && c.damage == null && c.xDamagePerEnergy == null) { + if (c.kind === 'Attack' && c.damage == null && c.xDamagePerEnergy == null && c.damageFromCurrentBlock == null) { issues.push(`${id}(${c.name}): kind=Attack인데 damage 없음 → 몬스터 드롭 라우팅 불가(방어/유틸이면 kind=Skill)`); } if (c.kind === 'Power' && !POWER_FIELDS.some((f) => c[f] != null)) {