feat(cards): 실제 메이플 스킬 아이콘 적용 + 피격 이펙트(fx) 분리 (P14-5)

- 카드 아트(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) <noreply@anthropic.com>
This commit is contained in:
2026-06-14 00:57:24 +09:00
parent d546d62755
commit 8296775e21
3 changed files with 73 additions and 45 deletions

File diff suppressed because one or more lines are too long

View File

@@ -6,9 +6,10 @@
"kind": "Attack", "kind": "Attack",
"damage": 6, "damage": 6,
"desc": "피해 6", "desc": "피해 6",
"image": "a71b116807904ef2b38e1dc013e2f9a2", "image": "e4acdf27d68549db8858d6082169c70c",
"class": "warrior", "class": "warrior",
"rarity": "normal" "rarity": "normal",
"fx": "291b2298db88476f8ae3c6c78f53c9b7"
}, },
"Defend": { "Defend": {
"name": "아이언 바디", "name": "아이언 바디",
@@ -16,7 +17,7 @@
"kind": "Skill", "kind": "Skill",
"block": 5, "block": 5,
"desc": "방어도 5", "desc": "방어도 5",
"image": "1ae9b6741c5947a8b528a0f515b50e3e", "image": "7648c3b8e1ca44fc8ec353561207a670",
"class": "warrior", "class": "warrior",
"rarity": "normal" "rarity": "normal"
}, },
@@ -26,9 +27,10 @@
"kind": "Attack", "kind": "Attack",
"damage": 10, "damage": 10,
"desc": "피해 10", "desc": "피해 10",
"image": "d5bc2953fcab4cfe9062af81c35aff86", "image": "4cbbe8cfc3e840e4a76379498d8eb012",
"class": "warrior", "class": "warrior",
"rarity": "normal" "rarity": "normal",
"fx": "863812c5c2f84132ac7465b50ec2283e"
}, },
"WarLeap": { "WarLeap": {
"name": "워 리프", "name": "워 리프",
@@ -49,7 +51,8 @@
"desc": "피해 13", "desc": "피해 13",
"image": "21af4bccc5054a5dbc8245dfa7f08681", "image": "21af4bccc5054a5dbc8245dfa7f08681",
"class": "warrior", "class": "warrior",
"rarity": "unique" "rarity": "unique",
"fx": "e8a145a6c43d493f9ad50fab03b200aa"
}, },
"ChargedBlow": { "ChargedBlow": {
"name": "차지 블로우", "name": "차지 블로우",
@@ -102,7 +105,8 @@
"hits": 2, "hits": 2,
"desc": "피해 5 × 2회", "desc": "피해 5 × 2회",
"image": "1bc3e52b330648faae9eafd5a205e37b", "image": "1bc3e52b330648faae9eafd5a205e37b",
"rarity": "unique" "rarity": "unique",
"fx": "48754be05be344358cddd55aa8fe11f4"
}, },
"Berserk": { "Berserk": {
"name": "버서크", "name": "버서크",
@@ -113,7 +117,7 @@
"value": 1, "value": 1,
"selfVuln": 1, "selfVuln": 1,
"desc": "매턴 에너지 +1, 취약 1 자가", "desc": "매턴 에너지 +1, 취약 1 자가",
"image": "cef30ea340c74e768bcee4e2cbe0577a", "image": "e2580523efc6457385114b78ad0d7cce",
"rarity": "legend" "rarity": "legend"
}, },
"RisingAttack": { "RisingAttack": {
@@ -123,8 +127,9 @@
"class": "fighter", "class": "fighter",
"damage": 12, "damage": 12,
"desc": "피해 12", "desc": "피해 12",
"image": "3a3d4b8bb5bd4137847caf883e4bf38e", "image": "115e309771604743853abad2d8d186bc",
"rarity": "unique" "rarity": "unique",
"fx": "6f283d96d5804b4fb88009685a11c1f8"
}, },
"ThunderCharge": { "ThunderCharge": {
"name": "썬더 차지", "name": "썬더 차지",
@@ -134,8 +139,9 @@
"damage": 7, "damage": 7,
"weak": 1, "weak": 1,
"desc": "피해 7, 약화 1", "desc": "피해 7, 약화 1",
"image": "f1b7e3041909411eb67af884b446e1e1", "image": "b7030d8caedc4fbc9f38fe1e541d6e6b",
"rarity": "unique" "rarity": "unique",
"fx": "997fa6999aa04dbb97a1dd99025fa2ba"
}, },
"BlizzardCharge": { "BlizzardCharge": {
"name": "블리자드 차지", "name": "블리자드 차지",
@@ -145,8 +151,9 @@
"damage": 7, "damage": 7,
"vuln": 1, "vuln": 1,
"desc": "피해 7, 취약 1", "desc": "피해 7, 취약 1",
"image": "7915c70952ad432f99519ad79bf929a4", "image": "9aac955d159f49c1bc913ef96128e781",
"rarity": "unique" "rarity": "unique",
"fx": "2799562e984c4a4da3b73e1f3431057c"
}, },
"PowerGuard": { "PowerGuard": {
"name": "파워 가드", "name": "파워 가드",
@@ -166,8 +173,9 @@
"damage": 9, "damage": 9,
"pierce": true, "pierce": true,
"desc": "피해 9, 방어 무시", "desc": "피해 9, 방어 무시",
"image": "e312e535a2bc4fed82d36f9c6027c9db", "image": "251b6e12329048429490049a4f3cf564",
"rarity": "unique" "rarity": "unique",
"fx": "1b0afc410a1a458598eb7ca2fb26e97d"
}, },
"IronWall": { "IronWall": {
"name": "아이언 월", "name": "아이언 월",
@@ -197,8 +205,9 @@
"class": "magician", "class": "magician",
"damage": 6, "damage": 6,
"desc": "피해 6", "desc": "피해 6",
"image": "a1ee3069fce14498b92998542679ae40", "image": "e84880eaf89442128d3af2be5c80a74f",
"rarity": "normal" "rarity": "normal",
"fx": "1d5877e1120a42d0907f204c959888b1"
}, },
"MagicGuard": { "MagicGuard": {
"name": "매직 가드", "name": "매직 가드",
@@ -218,8 +227,9 @@
"damage": 3, "damage": 3,
"hits": 2, "hits": 2,
"desc": "피해 3 × 2회", "desc": "피해 3 × 2회",
"image": "d6e7c04c436f42f19e9806ac5b4401ae", "image": "f3fcac2d460041b288cc1973caaaf30f",
"rarity": "normal" "rarity": "normal",
"fx": "ba4ac7c8f24845b68b7e689b7effcc93"
}, },
"Teleport": { "Teleport": {
"name": "텔레포트", "name": "텔레포트",
@@ -229,7 +239,7 @@
"block": 3, "block": 3,
"draw": 1, "draw": 1,
"desc": "방어도 3, 드로 1", "desc": "방어도 3, 드로 1",
"image": "80c98c8e032b4f6c8371a24b4e1d8f14", "image": "7f70a9dc7e304433bb8121dd9c4df98b",
"rarity": "normal" "rarity": "normal"
}, },
"Slow": { "Slow": {
@@ -239,7 +249,7 @@
"class": "magician", "class": "magician",
"weak": 2, "weak": 2,
"desc": "약화 2 부여", "desc": "약화 2 부여",
"image": "16f79f571a964430bf1953edc9a14c73", "image": "7224cd3f9b7e497d9dd65f32a50865e4",
"rarity": "normal" "rarity": "normal"
}, },
"FireArrow": { "FireArrow": {
@@ -249,8 +259,9 @@
"class": "firepoison", "class": "firepoison",
"damage": 8, "damage": 8,
"desc": "피해 8", "desc": "피해 8",
"image": "78b9be4e711c440f84fc21e51e812bae", "image": "6fa15fd3a0004b409ea516c11a67e533",
"rarity": "unique" "rarity": "unique",
"fx": "4a937e208875468eb63d891806fba3cd"
}, },
"PoisonBreath": { "PoisonBreath": {
"name": "포이즌 브레스", "name": "포이즌 브레스",
@@ -259,7 +270,7 @@
"class": "firepoison", "class": "firepoison",
"poison": 4, "poison": 4,
"desc": "독 4 부여", "desc": "독 4 부여",
"image": "b4e8bd7508b54d208e4f2ad7414f8c0a", "image": "07200f3c74854022baa7ebbefdc4ad8c",
"rarity": "unique" "rarity": "unique"
}, },
"ElementAmp": { "ElementAmp": {
@@ -270,7 +281,7 @@
"powerEffect": "strengthPerTurn", "powerEffect": "strengthPerTurn",
"value": 1, "value": 1,
"desc": "매 턴 힘 +1", "desc": "매 턴 힘 +1",
"image": "9859f3ab41b945f797d56cd83f95b25f", "image": "06865473977849bebe79062dbd608944",
"rarity": "legend" "rarity": "legend"
}, },
"ThunderBolt": { "ThunderBolt": {
@@ -282,7 +293,8 @@
"aoe": true, "aoe": true,
"desc": "모든 적에게 피해 6", "desc": "모든 적에게 피해 6",
"image": "c6685d33cb2641f09d11cfa2d5cc820c", "image": "c6685d33cb2641f09d11cfa2d5cc820c",
"rarity": "legend" "rarity": "legend",
"fx": "7d52f5e389bd4d44a30cf7cc54538f8f"
}, },
"ColdBeam": { "ColdBeam": {
"name": "콜드 빔", "name": "콜드 빔",
@@ -302,7 +314,7 @@
"class": "icelightning", "class": "icelightning",
"block": 8, "block": 8,
"desc": "방어도 8", "desc": "방어도 8",
"image": "b2a7274d868241c78aa5780f2beecddf", "image": "bef20873a68a4651a91d74be457c2cfc",
"rarity": "unique" "rarity": "unique"
}, },
"Heal": { "Heal": {
@@ -312,7 +324,7 @@
"class": "cleric", "class": "cleric",
"heal": 10, "heal": 10,
"desc": "HP 10 회복", "desc": "HP 10 회복",
"image": "b4127c181e2942e38821d4a9a1f14596", "image": "8b935b7d7066493cb462834bbe287c74",
"rarity": "unique" "rarity": "unique"
}, },
"Bless": { "Bless": {
@@ -323,7 +335,7 @@
"strength": 1, "strength": 1,
"block": 5, "block": 5,
"desc": "힘 +1, 방어도 5", "desc": "힘 +1, 방어도 5",
"image": "d45553db4a414011b67486dfa8a12fe5", "image": "607fc5457c1c44a0993a5c2fe3fb0c68",
"rarity": "unique" "rarity": "unique"
}, },
"HolyArrow": { "HolyArrow": {
@@ -333,8 +345,9 @@
"class": "cleric", "class": "cleric",
"damage": 8, "damage": 8,
"desc": "피해 8", "desc": "피해 8",
"image": "0265e103b4904f178b1c2bdcd54d5975", "image": "a80127195bf7471f9545b70e491f4719",
"rarity": "unique" "rarity": "unique",
"fx": "4faa7b78e09643cf86339b8b7cf2abac"
}, },
"LuckySeven": { "LuckySeven": {
"name": "럭키 세븐", "name": "럭키 세븐",
@@ -344,7 +357,9 @@
"damage": 3, "damage": 3,
"hits": 2, "hits": 2,
"desc": "피해 3 × 2회", "desc": "피해 3 × 2회",
"rarity": "normal" "rarity": "normal",
"image": "0539ba559f8c413dac95c52992b436d9",
"fx": "aa499663a278414b914b8fb9b8382879"
}, },
"DoubleStab": { "DoubleStab": {
"name": "더블 스탭", "name": "더블 스탭",
@@ -354,7 +369,9 @@
"damage": 5, "damage": 5,
"hits": 2, "hits": 2,
"desc": "피해 5 × 2회", "desc": "피해 5 × 2회",
"rarity": "normal" "rarity": "normal",
"image": "92a5020c978c46bdabab910598118b86",
"fx": "a82d0aae7f5e4db6a19078537afbe80c"
}, },
"DarkSight": { "DarkSight": {
"name": "다크 사이트", "name": "다크 사이트",
@@ -363,7 +380,8 @@
"class": "thief", "class": "thief",
"block": 6, "block": 6,
"desc": "방어도 6", "desc": "방어도 6",
"rarity": "normal" "rarity": "normal",
"image": "0946f69d84464df29b24b94c744c868d"
}, },
"Haste": { "Haste": {
"name": "헤이스트", "name": "헤이스트",
@@ -373,7 +391,8 @@
"block": 3, "block": 3,
"draw": 1, "draw": 1,
"desc": "방어도 3, 드로 1", "desc": "방어도 3, 드로 1",
"rarity": "normal" "rarity": "normal",
"image": "e65317856a914b8686f55e3351c3a24c"
}, },
"Drain": { "Drain": {
"name": "드레인", "name": "드레인",
@@ -393,7 +412,9 @@
"damage": 8, "damage": 8,
"hits": 2, "hits": 2,
"desc": "피해 8 × 2회", "desc": "피해 8 × 2회",
"rarity": "unique" "rarity": "unique",
"image": "1b0f2dc8abd0434990eee1befefcbe0d",
"fx": "23232336918d43f49fab19b888920f0c"
}, },
"ShadowStar": { "ShadowStar": {
"name": "쉐도우 스타", "name": "쉐도우 스타",
@@ -403,7 +424,9 @@
"damage": 6, "damage": 6,
"weak": 1, "weak": 1,
"desc": "피해 6, 약화 1", "desc": "피해 6, 약화 1",
"rarity": "unique" "rarity": "unique",
"image": "2d394e08d95841028d3dc95fca200756",
"fx": "ab45ee74d258419096e1e132af68aeca"
}, },
"ClawMastery": { "ClawMastery": {
"name": "클로 마스터리", "name": "클로 마스터리",
@@ -413,7 +436,8 @@
"powerEffect": "strengthPerTurn", "powerEffect": "strengthPerTurn",
"value": 1, "value": 1,
"desc": "매 턴 힘 +1", "desc": "매 턴 힘 +1",
"rarity": "legend" "rarity": "legend",
"image": "aa09741ae1e145a28d1e1c19aeb9e83c"
}, },
"SavageBlow": { "SavageBlow": {
"name": "새비지 블로우", "name": "새비지 블로우",
@@ -423,7 +447,9 @@
"damage": 3, "damage": 3,
"hits": 3, "hits": 3,
"desc": "피해 3 × 3회", "desc": "피해 3 × 3회",
"rarity": "unique" "rarity": "unique",
"image": "92a5020c978c46bdabab910598118b86",
"fx": "a82d0aae7f5e4db6a19078537afbe80c"
}, },
"Steal": { "Steal": {
"name": "스틸", "name": "스틸",
@@ -433,7 +459,8 @@
"block": 4, "block": 4,
"draw": 1, "draw": 1,
"desc": "방어도 4, 드로 1", "desc": "방어도 4, 드로 1",
"rarity": "unique" "rarity": "unique",
"image": "c1e19219745e44c39ae6ac2f77e347d9"
}, },
"MesoGuard": { "MesoGuard": {
"name": "메소 가드", "name": "메소 가드",

View File

@@ -141,6 +141,7 @@ function luaCardsTable(cards) {
if (c.unplayable === true) fields.push('unplayable = true'); if (c.unplayable === true) fields.push('unplayable = true');
if (c.curse === true) fields.push('curse = true'); if (c.curse === true) fields.push('curse = true');
if (c.endTurnDamage != null) fields.push(`endTurnDamage = ${c.endTurnDamage}`); 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)}`); if (c.image != null) fields.push(`image = ${luaStr(c.image)}`);
return `\t${id} = { ${fields.join(', ')} },`; return `\t${id} = { ${fields.join(', ')} },`;
}); });
@@ -3369,9 +3370,9 @@ if c.kind == "Attack" then
total = total + self:CalcPlayerAttack(c.damage) total = total + self:CalcPlayerAttack(c.damage)
end end
if c.aoe == true then if c.aoe == true then
self:PlayAoeFx(c.image, total) self:PlayAoeFx(c.fx or c.image, total)
else 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
end end
if c.block ~= nil then if c.block ~= nil then