From 8296775e219a70d303b2c4b702e52ccfc349f173 Mon Sep 17 00:00:00 2001 From: gahusb Date: Sun, 14 Jun 2026 00:57:24 +0900 Subject: [PATCH] =?UTF-8?q?feat(cards):=20=EC=8B=A4=EC=A0=9C=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B4=ED=94=8C=20=EC=8A=A4=ED=82=AC=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=A0=81=EC=9A=A9=20+=20=ED=94=BC=EA=B2=A9=20?= =?UTF-8?q?=EC=9D=B4=ED=8E=99=ED=8A=B8(fx)=20=EB=B6=84=EB=A6=AC=20(P14-5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카드 아트(image)를 경로 검증된 실제 스킬 아이콘 RUID로 교체(28종) · mapleImgFullPath의 /icon 경로 확인으로 스킬 아이콘 보장(기존엔 이펙트 프레임·맵 오브젝트가 섞여 있었음) - 피격 이펙트(fx) 필드 신설(18종) — 스킬 effect/hit 프레임 RUID · PlayCard가 PlayAttackFx/PlayAoeFx에 c.fx or c.image 전달(이펙트 분리, 없으면 폴백) · luaCardsTable fx 직렬화. MSW asset 메타데이터 경로 검증으로 수급(워크플로 6에이전트) - 아이콘 미발견 카드는 기존 RUID 유지. sim 35/35 통과. 산출물 재생성 Co-Authored-By: Claude Opus 4.8 (1M context) --- RootDesk/MyDesk/SlayDeckController.codeblock | 4 +- data/cards.json | 109 ++++++++++++------- tools/deck/gen-slaydeck.mjs | 5 +- 3 files changed, 73 insertions(+), 45 deletions(-) diff --git a/RootDesk/MyDesk/SlayDeckController.codeblock b/RootDesk/MyDesk/SlayDeckController.codeblock index 1c6729e..b03b08c 100644 --- a/RootDesk/MyDesk/SlayDeckController.codeblock +++ b/RootDesk/MyDesk/SlayDeckController.codeblock @@ -957,7 +957,7 @@ "Name": null }, "Arguments": [], - "Code": "self:ShowState(\"combat\")\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/Result\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/PotionMenu\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/TooltipBox\", false)\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerPanel/Name\", self:JobLabel())\nself.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.PlayerStr = 0\nself.PlayerWeak = 0\nself.PlayerVuln = 0\nself.PlayerPowers = {}\nself.FightAttackCount = 0\nself.FirstHpLossDone = false\nself.ClayBlockNext = 0\nself.CombatOver = false\nself.DiscardPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"파워 스트라이크\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", image = \"a71b116807904ef2b38e1dc013e2f9a2\" },\n\tDefend = { name = \"아이언 바디\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"1ae9b6741c5947a8b528a0f515b50e3e\" },\n\tBash = { name = \"슬래시 블러스트\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10, class = \"warrior\", rarity = \"normal\", image = \"d5bc2953fcab4cfe9062af81c35aff86\" },\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\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tChargedBlow = { name = \"차지 블로우\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, 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 = \"매 턴 시작 시 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tComboAttack = { name = \"콤보 어택\", cost = 1, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"fighter\", rarity = \"unique\", hits = 2, image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBerserk = { name = \"버서크\", cost = 2, desc = \"매턴 에너지 +1, 취약 1 자가\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"fighter\", rarity = \"legend\", selfVuln = 1, image = \"cef30ea340c74e768bcee4e2cbe0577a\" },\n\tRisingAttack = { name = \"라이징 어택\", cost = 2, desc = \"피해 12\", kind = \"Attack\", damage = 12, class = \"fighter\", rarity = \"unique\", image = \"3a3d4b8bb5bd4137847caf883e4bf38e\" },\n\tThunderCharge = { name = \"썬더 차지\", cost = 1, desc = \"피해 7, 약화 1\", kind = \"Attack\", damage = 7, weak = 1, class = \"page\", rarity = \"unique\", image = \"f1b7e3041909411eb67af884b446e1e1\" },\n\tBlizzardCharge = { name = \"블리자드 차지\", cost = 1, desc = \"피해 7, 취약 1\", kind = \"Attack\", damage = 7, vuln = 1, class = \"page\", rarity = \"unique\", image = \"7915c70952ad432f99519ad79bf929a4\" },\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, image = \"e312e535a2bc4fed82d36f9c6027c9db\" },\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\", image = \"a1ee3069fce14498b92998542679ae40\" },\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, image = \"d6e7c04c436f42f19e9806ac5b4401ae\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", draw = 1, image = \"80c98c8e032b4f6c8371a24b4e1d8f14\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"16f79f571a964430bf1953edc9a14c73\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", image = \"78b9be4e711c440f84fc21e51e812bae\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"b4e8bd7508b54d208e4f2ad7414f8c0a\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"9859f3ab41b945f797d56cd83f95b25f\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, 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 = \"b2a7274d868241c78aa5780f2beecddf\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"b4127c181e2942e38821d4a9a1f14596\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"d45553db4a414011b67486dfa8a12fe5\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", image = \"0265e103b4904f178b1c2bdcd54d5975\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"thief\", rarity = \"normal\", hits = 2 },\n\tDoubleStab = { name = \"더블 스탭\", cost = 2, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"normal\", hits = 2 },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"방어도 6\", kind = \"Skill\", block = 6, class = \"thief\", rarity = \"normal\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"thief\", rarity = \"normal\", draw = 1 },\n\tDrain = { name = \"드레인\", cost = 1, desc = \"피해 5, HP 3 회복\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"unique\", heal = 3 },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 2, desc = \"피해 8 × 2회\", kind = \"Attack\", damage = 8, class = \"assassin\", rarity = \"unique\", hits = 2 },\n\tShadowStar = { name = \"쉐도우 스타\", cost = 1, desc = \"피해 6, 약화 1\", kind = \"Attack\", damage = 6, weak = 1, class = \"assassin\", rarity = \"unique\" },\n\tClawMastery = { name = \"클로 마스터리\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"assassin\", rarity = \"legend\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해 3 × 3회\", kind = \"Attack\", damage = 3, class = \"bandit\", rarity = \"unique\", hits = 3 },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"방어도 4, 드로 1\", kind = \"Skill\", block = 4, class = \"bandit\", rarity = \"unique\", draw = 1 },\n\tMesoGuard = { name = \"메소 가드\", cost = 1, desc = \"매 턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"bandit\", rarity = \"legend\" },\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}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()", + "Code": "self:ShowState(\"combat\")\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/Result\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/PotionMenu\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/TooltipBox\", false)\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerPanel/Name\", self:JobLabel())\nself.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.PlayerStr = 0\nself.PlayerWeak = 0\nself.PlayerVuln = 0\nself.PlayerPowers = {}\nself.FightAttackCount = 0\nself.FirstHpLossDone = false\nself.ClayBlockNext = 0\nself.CombatOver = false\nself.DiscardPile = {}\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, 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 = \"매 턴 시작 시 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", 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\", draw = 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\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"thief\", rarity = \"normal\", hits = 2, fx = \"aa499663a278414b914b8fb9b8382879\", image = \"0539ba559f8c413dac95c52992b436d9\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 2, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"normal\", hits = 2, fx = \"a82d0aae7f5e4db6a19078537afbe80c\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"방어도 6\", kind = \"Skill\", block = 6, class = \"thief\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"thief\", rarity = \"normal\", draw = 1, image = \"e65317856a914b8686f55e3351c3a24c\" },\n\tDrain = { name = \"드레인\", cost = 1, desc = \"피해 5, HP 3 회복\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"unique\", heal = 3 },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 2, desc = \"피해 8 × 2회\", kind = \"Attack\", damage = 8, class = \"assassin\", rarity = \"unique\", hits = 2, fx = \"23232336918d43f49fab19b888920f0c\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStar = { name = \"쉐도우 스타\", cost = 1, desc = \"피해 6, 약화 1\", kind = \"Attack\", damage = 6, weak = 1, class = \"assassin\", rarity = \"unique\", fx = \"ab45ee74d258419096e1e132af68aeca\", image = \"2d394e08d95841028d3dc95fca200756\" },\n\tClawMastery = { name = \"클로 마스터리\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"assassin\", rarity = \"legend\", image = \"aa09741ae1e145a28d1e1c19aeb9e83c\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해 3 × 3회\", kind = \"Attack\", damage = 3, class = \"bandit\", rarity = \"unique\", hits = 3, fx = \"a82d0aae7f5e4db6a19078537afbe80c\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"방어도 4, 드로 1\", kind = \"Skill\", block = 4, class = \"bandit\", rarity = \"unique\", draw = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMesoGuard = { name = \"메소 가드\", cost = 1, desc = \"매 턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"bandit\", rarity = \"legend\" },\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}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1536,7 +1536,7 @@ "Name": "slot" } ], - "Code": "if 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.Energy < c.cost then\n\tself:Toast(\"에너지가 부족합니다\")\n\treturn\nend\nself.Energy = self.Energy - c.cost\nif c.kind == \"Attack\" then\n\tif c.damage ~= nil then\n\t\tself:PlayerAttackMotion()\n\t\tlocal total = 0\n\t\tlocal hitN = c.hits or 1\n\t\tfor h = 1, hitN do\n\t\t\ttotal = total + self:CalcPlayerAttack(c.damage)\n\t\tend\n\t\tif c.aoe == true then\n\t\t\tself:PlayAoeFx(c.image, total)\n\t\telse\n\t\t\tself:PlayAttackFx(self.TargetIndex, c.image, total, c.pierce == true)\n\t\tend\n\tend\n\tif c.block ~= nil then\n\t\tself.PlayerBlock = self.PlayerBlock + c.block\n\tend\n\tself:ApplyRelics(\"cardPlayed\")\nelseif c.kind == \"Skill\" then\n\tif c.block ~= nil then\n\t\tself.PlayerBlock = self.PlayerBlock + c.block\n\tend\nelseif c.kind == \"Power\" then\n\tif c.powerEffect ~= nil 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.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.weak ~= nil or c.vuln ~= nil or c.poison ~= nil then\n\tlocal tm = self.Monsters[self.TargetIndex]\n\tif tm ~= nil and tm.alive == true then\n\t\tif c.weak ~= nil then tm.weak = tm.weak + c.weak end\n\t\tif c.poison ~= nil then tm.poison = (tm.poison or 0) + c.poison end\n\t\tif c.vuln ~= nil then\n\t\t\ttm.vuln = tm.vuln + c.vuln\n\t\t\tif self:HasRelic(\"championBelt\") then\n\t\t\t\ttm.weak = tm.weak + 1\n\t\t\tend\n\t\tend\n\tend\nend\ntable.remove(self.Hand, slot)\nif c.kind ~= \"Power\" then\n\ttable.insert(self.DiscardPile, cardId)\nend\nif c.draw ~= nil then\n\tself:DrawCards(c.draw)\nend\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nself:CheckCombatEnd()", + "Code": "if 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.Energy < c.cost then\n\tself:Toast(\"에너지가 부족합니다\")\n\treturn\nend\nself.Energy = self.Energy - c.cost\nif c.kind == \"Attack\" then\n\tif c.damage ~= nil then\n\t\tself:PlayerAttackMotion()\n\t\tlocal total = 0\n\t\tlocal hitN = c.hits or 1\n\t\tfor h = 1, hitN do\n\t\t\ttotal = total + self:CalcPlayerAttack(c.damage)\n\t\tend\n\t\tif c.aoe == true then\n\t\t\tself:PlayAoeFx(c.fx or c.image, total)\n\t\telse\n\t\t\tself:PlayAttackFx(self.TargetIndex, c.fx or c.image, total, c.pierce == true)\n\t\tend\n\tend\n\tif c.block ~= nil then\n\t\tself.PlayerBlock = self.PlayerBlock + c.block\n\tend\n\tself:ApplyRelics(\"cardPlayed\")\nelseif c.kind == \"Skill\" then\n\tif c.block ~= nil then\n\t\tself.PlayerBlock = self.PlayerBlock + c.block\n\tend\nelseif c.kind == \"Power\" then\n\tif c.powerEffect ~= nil 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.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.weak ~= nil or c.vuln ~= nil or c.poison ~= nil then\n\tlocal tm = self.Monsters[self.TargetIndex]\n\tif tm ~= nil and tm.alive == true then\n\t\tif c.weak ~= nil then tm.weak = tm.weak + c.weak end\n\t\tif c.poison ~= nil then tm.poison = (tm.poison or 0) + c.poison end\n\t\tif c.vuln ~= nil then\n\t\t\ttm.vuln = tm.vuln + c.vuln\n\t\t\tif self:HasRelic(\"championBelt\") then\n\t\t\t\ttm.weak = tm.weak + 1\n\t\t\tend\n\t\tend\n\tend\nend\ntable.remove(self.Hand, slot)\nif c.kind ~= \"Power\" then\n\ttable.insert(self.DiscardPile, cardId)\nend\nif c.draw ~= nil then\n\tself:DrawCards(c.draw)\nend\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nself:CheckCombatEnd()", "Scope": 2, "ExecSpace": 6, "Attributes": [], diff --git a/data/cards.json b/data/cards.json index 69a8d65..bccf2be 100644 --- a/data/cards.json +++ b/data/cards.json @@ -6,9 +6,10 @@ "kind": "Attack", "damage": 6, "desc": "피해 6", - "image": "a71b116807904ef2b38e1dc013e2f9a2", + "image": "e4acdf27d68549db8858d6082169c70c", "class": "warrior", - "rarity": "normal" + "rarity": "normal", + "fx": "291b2298db88476f8ae3c6c78f53c9b7" }, "Defend": { "name": "아이언 바디", @@ -16,7 +17,7 @@ "kind": "Skill", "block": 5, "desc": "방어도 5", - "image": "1ae9b6741c5947a8b528a0f515b50e3e", + "image": "7648c3b8e1ca44fc8ec353561207a670", "class": "warrior", "rarity": "normal" }, @@ -26,9 +27,10 @@ "kind": "Attack", "damage": 10, "desc": "피해 10", - "image": "d5bc2953fcab4cfe9062af81c35aff86", + "image": "4cbbe8cfc3e840e4a76379498d8eb012", "class": "warrior", - "rarity": "normal" + "rarity": "normal", + "fx": "863812c5c2f84132ac7465b50ec2283e" }, "WarLeap": { "name": "워 리프", @@ -49,7 +51,8 @@ "desc": "피해 13", "image": "21af4bccc5054a5dbc8245dfa7f08681", "class": "warrior", - "rarity": "unique" + "rarity": "unique", + "fx": "e8a145a6c43d493f9ad50fab03b200aa" }, "ChargedBlow": { "name": "차지 블로우", @@ -102,7 +105,8 @@ "hits": 2, "desc": "피해 5 × 2회", "image": "1bc3e52b330648faae9eafd5a205e37b", - "rarity": "unique" + "rarity": "unique", + "fx": "48754be05be344358cddd55aa8fe11f4" }, "Berserk": { "name": "버서크", @@ -113,7 +117,7 @@ "value": 1, "selfVuln": 1, "desc": "매턴 에너지 +1, 취약 1 자가", - "image": "cef30ea340c74e768bcee4e2cbe0577a", + "image": "e2580523efc6457385114b78ad0d7cce", "rarity": "legend" }, "RisingAttack": { @@ -123,8 +127,9 @@ "class": "fighter", "damage": 12, "desc": "피해 12", - "image": "3a3d4b8bb5bd4137847caf883e4bf38e", - "rarity": "unique" + "image": "115e309771604743853abad2d8d186bc", + "rarity": "unique", + "fx": "6f283d96d5804b4fb88009685a11c1f8" }, "ThunderCharge": { "name": "썬더 차지", @@ -134,8 +139,9 @@ "damage": 7, "weak": 1, "desc": "피해 7, 약화 1", - "image": "f1b7e3041909411eb67af884b446e1e1", - "rarity": "unique" + "image": "b7030d8caedc4fbc9f38fe1e541d6e6b", + "rarity": "unique", + "fx": "997fa6999aa04dbb97a1dd99025fa2ba" }, "BlizzardCharge": { "name": "블리자드 차지", @@ -145,8 +151,9 @@ "damage": 7, "vuln": 1, "desc": "피해 7, 취약 1", - "image": "7915c70952ad432f99519ad79bf929a4", - "rarity": "unique" + "image": "9aac955d159f49c1bc913ef96128e781", + "rarity": "unique", + "fx": "2799562e984c4a4da3b73e1f3431057c" }, "PowerGuard": { "name": "파워 가드", @@ -166,8 +173,9 @@ "damage": 9, "pierce": true, "desc": "피해 9, 방어 무시", - "image": "e312e535a2bc4fed82d36f9c6027c9db", - "rarity": "unique" + "image": "251b6e12329048429490049a4f3cf564", + "rarity": "unique", + "fx": "1b0afc410a1a458598eb7ca2fb26e97d" }, "IronWall": { "name": "아이언 월", @@ -197,8 +205,9 @@ "class": "magician", "damage": 6, "desc": "피해 6", - "image": "a1ee3069fce14498b92998542679ae40", - "rarity": "normal" + "image": "e84880eaf89442128d3af2be5c80a74f", + "rarity": "normal", + "fx": "1d5877e1120a42d0907f204c959888b1" }, "MagicGuard": { "name": "매직 가드", @@ -218,8 +227,9 @@ "damage": 3, "hits": 2, "desc": "피해 3 × 2회", - "image": "d6e7c04c436f42f19e9806ac5b4401ae", - "rarity": "normal" + "image": "f3fcac2d460041b288cc1973caaaf30f", + "rarity": "normal", + "fx": "ba4ac7c8f24845b68b7e689b7effcc93" }, "Teleport": { "name": "텔레포트", @@ -229,7 +239,7 @@ "block": 3, "draw": 1, "desc": "방어도 3, 드로 1", - "image": "80c98c8e032b4f6c8371a24b4e1d8f14", + "image": "7f70a9dc7e304433bb8121dd9c4df98b", "rarity": "normal" }, "Slow": { @@ -239,7 +249,7 @@ "class": "magician", "weak": 2, "desc": "약화 2 부여", - "image": "16f79f571a964430bf1953edc9a14c73", + "image": "7224cd3f9b7e497d9dd65f32a50865e4", "rarity": "normal" }, "FireArrow": { @@ -249,8 +259,9 @@ "class": "firepoison", "damage": 8, "desc": "피해 8", - "image": "78b9be4e711c440f84fc21e51e812bae", - "rarity": "unique" + "image": "6fa15fd3a0004b409ea516c11a67e533", + "rarity": "unique", + "fx": "4a937e208875468eb63d891806fba3cd" }, "PoisonBreath": { "name": "포이즌 브레스", @@ -259,7 +270,7 @@ "class": "firepoison", "poison": 4, "desc": "독 4 부여", - "image": "b4e8bd7508b54d208e4f2ad7414f8c0a", + "image": "07200f3c74854022baa7ebbefdc4ad8c", "rarity": "unique" }, "ElementAmp": { @@ -270,7 +281,7 @@ "powerEffect": "strengthPerTurn", "value": 1, "desc": "매 턴 힘 +1", - "image": "9859f3ab41b945f797d56cd83f95b25f", + "image": "06865473977849bebe79062dbd608944", "rarity": "legend" }, "ThunderBolt": { @@ -282,7 +293,8 @@ "aoe": true, "desc": "모든 적에게 피해 6", "image": "c6685d33cb2641f09d11cfa2d5cc820c", - "rarity": "legend" + "rarity": "legend", + "fx": "7d52f5e389bd4d44a30cf7cc54538f8f" }, "ColdBeam": { "name": "콜드 빔", @@ -302,7 +314,7 @@ "class": "icelightning", "block": 8, "desc": "방어도 8", - "image": "b2a7274d868241c78aa5780f2beecddf", + "image": "bef20873a68a4651a91d74be457c2cfc", "rarity": "unique" }, "Heal": { @@ -312,7 +324,7 @@ "class": "cleric", "heal": 10, "desc": "HP 10 회복", - "image": "b4127c181e2942e38821d4a9a1f14596", + "image": "8b935b7d7066493cb462834bbe287c74", "rarity": "unique" }, "Bless": { @@ -323,7 +335,7 @@ "strength": 1, "block": 5, "desc": "힘 +1, 방어도 5", - "image": "d45553db4a414011b67486dfa8a12fe5", + "image": "607fc5457c1c44a0993a5c2fe3fb0c68", "rarity": "unique" }, "HolyArrow": { @@ -333,8 +345,9 @@ "class": "cleric", "damage": 8, "desc": "피해 8", - "image": "0265e103b4904f178b1c2bdcd54d5975", - "rarity": "unique" + "image": "a80127195bf7471f9545b70e491f4719", + "rarity": "unique", + "fx": "4faa7b78e09643cf86339b8b7cf2abac" }, "LuckySeven": { "name": "럭키 세븐", @@ -344,7 +357,9 @@ "damage": 3, "hits": 2, "desc": "피해 3 × 2회", - "rarity": "normal" + "rarity": "normal", + "image": "0539ba559f8c413dac95c52992b436d9", + "fx": "aa499663a278414b914b8fb9b8382879" }, "DoubleStab": { "name": "더블 스탭", @@ -354,7 +369,9 @@ "damage": 5, "hits": 2, "desc": "피해 5 × 2회", - "rarity": "normal" + "rarity": "normal", + "image": "92a5020c978c46bdabab910598118b86", + "fx": "a82d0aae7f5e4db6a19078537afbe80c" }, "DarkSight": { "name": "다크 사이트", @@ -363,7 +380,8 @@ "class": "thief", "block": 6, "desc": "방어도 6", - "rarity": "normal" + "rarity": "normal", + "image": "0946f69d84464df29b24b94c744c868d" }, "Haste": { "name": "헤이스트", @@ -373,7 +391,8 @@ "block": 3, "draw": 1, "desc": "방어도 3, 드로 1", - "rarity": "normal" + "rarity": "normal", + "image": "e65317856a914b8686f55e3351c3a24c" }, "Drain": { "name": "드레인", @@ -393,7 +412,9 @@ "damage": 8, "hits": 2, "desc": "피해 8 × 2회", - "rarity": "unique" + "rarity": "unique", + "image": "1b0f2dc8abd0434990eee1befefcbe0d", + "fx": "23232336918d43f49fab19b888920f0c" }, "ShadowStar": { "name": "쉐도우 스타", @@ -403,7 +424,9 @@ "damage": 6, "weak": 1, "desc": "피해 6, 약화 1", - "rarity": "unique" + "rarity": "unique", + "image": "2d394e08d95841028d3dc95fca200756", + "fx": "ab45ee74d258419096e1e132af68aeca" }, "ClawMastery": { "name": "클로 마스터리", @@ -413,7 +436,8 @@ "powerEffect": "strengthPerTurn", "value": 1, "desc": "매 턴 힘 +1", - "rarity": "legend" + "rarity": "legend", + "image": "aa09741ae1e145a28d1e1c19aeb9e83c" }, "SavageBlow": { "name": "새비지 블로우", @@ -423,7 +447,9 @@ "damage": 3, "hits": 3, "desc": "피해 3 × 3회", - "rarity": "unique" + "rarity": "unique", + "image": "92a5020c978c46bdabab910598118b86", + "fx": "a82d0aae7f5e4db6a19078537afbe80c" }, "Steal": { "name": "스틸", @@ -433,7 +459,8 @@ "block": 4, "draw": 1, "desc": "방어도 4, 드로 1", - "rarity": "unique" + "rarity": "unique", + "image": "c1e19219745e44c39ae6ac2f77e347d9" }, "MesoGuard": { "name": "메소 가드", diff --git a/tools/deck/gen-slaydeck.mjs b/tools/deck/gen-slaydeck.mjs index 1a19028..4f60c28 100644 --- a/tools/deck/gen-slaydeck.mjs +++ b/tools/deck/gen-slaydeck.mjs @@ -141,6 +141,7 @@ function luaCardsTable(cards) { if (c.unplayable === true) fields.push('unplayable = true'); if (c.curse === true) fields.push('curse = true'); if (c.endTurnDamage != null) fields.push(`endTurnDamage = ${c.endTurnDamage}`); + if (c.fx != null) fields.push(`fx = ${luaStr(c.fx)}`); if (c.image != null) fields.push(`image = ${luaStr(c.image)}`); return `\t${id} = { ${fields.join(', ')} },`; }); @@ -3369,9 +3370,9 @@ if c.kind == "Attack" then total = total + self:CalcPlayerAttack(c.damage) end if c.aoe == true then - self:PlayAoeFx(c.image, total) + self:PlayAoeFx(c.fx or c.image, total) else - self:PlayAttackFx(self.TargetIndex, c.image, total, c.pierce == true) + self:PlayAttackFx(self.TargetIndex, c.fx or c.image, total, c.pierce == true) end end if c.block ~= nil then