feat(bandit): 사일런트 도적 덱 추가
- 도적 시작 직업을 선택 화면에서 활성화하고 bandit 스타터 덱으로 런을 시작하도록 생성기를 연결 - Slay the Spire 사일런트 카드 75장을 bandit 카드 풀에 추가하고 카드명/설명을 한글화 - 현재 전투 엔진이 지원하는 피해, 방어도, 드로우, 독, 약화, 취약, 광역, 다단히트, 회복, 파워 효과로 카드 효과를 매핑 - 도적 스타터 덱을 타격 5장, 수비 5장, 무력화, 생존자로 구성 - bandit 및 도적 전직 계열(shiv, poisoner, trickster)을 카드 프레임 매핑에 연결 - ui/DefaultGroup.ui와 SlayDeckController.codeblock을 생성기로 재생성 검증: - node --check tools/deck/gen-slaydeck.mjs - node --test tools/balance/sim-balance.test.mjs tools/map/rogue-map.test.mjs - 도적 카드 75장 및 한글화 잔여 영어/깨짐 없음 확인
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -6,7 +6,8 @@
|
||||
},
|
||||
"classToFrame": {
|
||||
"warrior": "warrior", "fighter": "warrior", "page": "warrior", "spearman": "warrior",
|
||||
"magician": "magician", "firepoison": "magician", "icelightning": "magician", "cleric": "magician"
|
||||
"magician": "magician", "firepoison": "magician", "icelightning": "magician", "cleric": "magician",
|
||||
"bandit": "bandit", "shiv": "bandit", "poisoner": "bandit", "trickster": "bandit"
|
||||
},
|
||||
"rewardWeights": { "normal": 70, "unique": 25, "legend": 5 }
|
||||
}
|
||||
|
||||
738
data/cards.json
738
data/cards.json
@@ -335,6 +335,730 @@
|
||||
"desc": "피해 8",
|
||||
"image": "0265e103b4904f178b1c2bdcd54d5975",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"SilentStrike": {
|
||||
"name": "타격",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 6,
|
||||
"desc": "피해 6."
|
||||
},
|
||||
"SilentDefend": {
|
||||
"name": "수비",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"block": 5,
|
||||
"desc": "방어도 5."
|
||||
},
|
||||
"Neutralize": {
|
||||
"name": "무력화",
|
||||
"cost": 0,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 3,
|
||||
"weak": 1,
|
||||
"desc": "피해 3. 약화 1 부여."
|
||||
},
|
||||
"Survivor": {
|
||||
"name": "생존자",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"block": 8,
|
||||
"draw": 1,
|
||||
"desc": "방어도 8. 카드 1장 드로우."
|
||||
},
|
||||
"Acrobatics": {
|
||||
"name": "곡예",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"draw": 3,
|
||||
"desc": "카드 3장 드로우."
|
||||
},
|
||||
"Backflip": {
|
||||
"name": "백플립",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"block": 5,
|
||||
"draw": 2,
|
||||
"desc": "방어도 5. 카드 2장 드로우."
|
||||
},
|
||||
"Bane": {
|
||||
"name": "파멸",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 7,
|
||||
"hits": 2,
|
||||
"desc": "피해 7을 2회."
|
||||
},
|
||||
"BladeDance": {
|
||||
"name": "칼날 춤",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 4,
|
||||
"hits": 3,
|
||||
"desc": "시브식 공격: 피해 4를 3회."
|
||||
},
|
||||
"CloakAndDagger": {
|
||||
"name": "망토와 단검",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"block": 6,
|
||||
"damage": 4,
|
||||
"desc": "방어도 6. 피해 4."
|
||||
},
|
||||
"DaggerSpray": {
|
||||
"name": "단검 분사",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 4,
|
||||
"hits": 2,
|
||||
"aoe": true,
|
||||
"desc": "모든 적에게 피해 4를 2회."
|
||||
},
|
||||
"DaggerThrow": {
|
||||
"name": "단검 투척",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 9,
|
||||
"draw": 1,
|
||||
"desc": "피해 9. 카드 1장 드로우."
|
||||
},
|
||||
"DeadlyPoison": {
|
||||
"name": "맹독",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"poison": 5,
|
||||
"desc": "독 5 부여."
|
||||
},
|
||||
"Deflect": {
|
||||
"name": "흘리기",
|
||||
"cost": 0,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"block": 4,
|
||||
"desc": "방어도 4."
|
||||
},
|
||||
"DodgeAndRoll": {
|
||||
"name": "회피와 구르기",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"block": 8,
|
||||
"desc": "방어도 8."
|
||||
},
|
||||
"FlyingKnee": {
|
||||
"name": "날아차기",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 8,
|
||||
"desc": "피해 8."
|
||||
},
|
||||
"Outmaneuver": {
|
||||
"name": "책략",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"powerEffect": "energyPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 에너지 +1."
|
||||
},
|
||||
"PiercingWail": {
|
||||
"name": "꿰뚫는 비명",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"weak": 3,
|
||||
"desc": "약화 3 부여."
|
||||
},
|
||||
"PoisonedStab": {
|
||||
"name": "독 찌르기",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 6,
|
||||
"poison": 3,
|
||||
"desc": "피해 6. 독 3 부여."
|
||||
},
|
||||
"Prepared": {
|
||||
"name": "준비",
|
||||
"cost": 0,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"draw": 1,
|
||||
"desc": "카드 1장 드로우."
|
||||
},
|
||||
"QuickSlash": {
|
||||
"name": "빠른 베기",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 8,
|
||||
"draw": 1,
|
||||
"desc": "피해 8. 카드 1장 드로우."
|
||||
},
|
||||
"Slice": {
|
||||
"name": "얇게 베기",
|
||||
"cost": 0,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 6,
|
||||
"desc": "피해 6."
|
||||
},
|
||||
"SneakyStrike": {
|
||||
"name": "기습 타격",
|
||||
"cost": 2,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 12,
|
||||
"desc": "피해 12."
|
||||
},
|
||||
"SuckerPunch": {
|
||||
"name": "불시의 일격",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "normal",
|
||||
"damage": 7,
|
||||
"weak": 1,
|
||||
"desc": "피해 7. 약화 1 부여."
|
||||
},
|
||||
"Accuracy": {
|
||||
"name": "정확도",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 1,
|
||||
"desc": "시브 지원: 매 턴 힘 +1."
|
||||
},
|
||||
"AllOutAttack": {
|
||||
"name": "총공격",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 10,
|
||||
"aoe": true,
|
||||
"desc": "모든 적에게 피해 10."
|
||||
},
|
||||
"Backstab": {
|
||||
"name": "등 찌르기",
|
||||
"cost": 0,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 11,
|
||||
"desc": "피해 11."
|
||||
},
|
||||
"Blur": {
|
||||
"name": "잔상",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"block": 8,
|
||||
"desc": "방어도 8."
|
||||
},
|
||||
"BouncingFlask": {
|
||||
"name": "튕기는 플라스크",
|
||||
"cost": 2,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"poison": 9,
|
||||
"desc": "독 9 부여."
|
||||
},
|
||||
"CalculatedGamble": {
|
||||
"name": "계산된 도박",
|
||||
"cost": 0,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"draw": 3,
|
||||
"desc": "카드 3장 드로우."
|
||||
},
|
||||
"Caltrops": {
|
||||
"name": "마름쇠",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "blockPerTurn",
|
||||
"value": 3,
|
||||
"desc": "매 턴 방어도 +3."
|
||||
},
|
||||
"Catalyst": {
|
||||
"name": "촉매",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"poison": 8,
|
||||
"desc": "독 8 부여."
|
||||
},
|
||||
"Choke": {
|
||||
"name": "목 조르기",
|
||||
"cost": 2,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 12,
|
||||
"vuln": 2,
|
||||
"desc": "피해 12. 취약 2 부여."
|
||||
},
|
||||
"Concentrate": {
|
||||
"name": "집중",
|
||||
"cost": 0,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "energyPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 에너지 +1."
|
||||
},
|
||||
"CripplingCloud": {
|
||||
"name": "불구름",
|
||||
"cost": 2,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"poison": 4,
|
||||
"weak": 2,
|
||||
"desc": "독 4와 약화 2 부여."
|
||||
},
|
||||
"Dash": {
|
||||
"name": "질주",
|
||||
"cost": 2,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"block": 10,
|
||||
"damage": 10,
|
||||
"desc": "방어도 10. 피해 10."
|
||||
},
|
||||
"Distraction": {
|
||||
"name": "교란",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"draw": 1,
|
||||
"desc": "카드 1장 드로우."
|
||||
},
|
||||
"EndlessAgony": {
|
||||
"name": "끝없는 고통",
|
||||
"cost": 0,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 4,
|
||||
"hits": 2,
|
||||
"desc": "피해 4를 2회."
|
||||
},
|
||||
"EscapePlan": {
|
||||
"name": "탈출 계획",
|
||||
"cost": 0,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"block": 3,
|
||||
"draw": 1,
|
||||
"desc": "카드 1장 드로우. 방어도 3."
|
||||
},
|
||||
"Eviscerate": {
|
||||
"name": "절개",
|
||||
"cost": 3,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 7,
|
||||
"hits": 3,
|
||||
"desc": "피해 7을 3회."
|
||||
},
|
||||
"Expertise": {
|
||||
"name": "전문가",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"draw": 3,
|
||||
"desc": "카드 3장 드로우."
|
||||
},
|
||||
"Finisher": {
|
||||
"name": "마무리",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 6,
|
||||
"hits": 2,
|
||||
"desc": "피해 6을 2회."
|
||||
},
|
||||
"Flechettes": {
|
||||
"name": "플레셰트",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 4,
|
||||
"hits": 3,
|
||||
"desc": "피해 4를 3회."
|
||||
},
|
||||
"Footwork": {
|
||||
"name": "발놀림",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "blockPerTurn",
|
||||
"value": 2,
|
||||
"desc": "매 턴 방어도 +2."
|
||||
},
|
||||
"HeelHook": {
|
||||
"name": "발뒤꿈치 걸기",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 5,
|
||||
"draw": 1,
|
||||
"desc": "피해 5. 카드 1장 드로우."
|
||||
},
|
||||
"InfiniteBlades": {
|
||||
"name": "무한의 칼날",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 1,
|
||||
"desc": "시브 지원: 매 턴 힘 +1."
|
||||
},
|
||||
"LegSweep": {
|
||||
"name": "다리 걸기",
|
||||
"cost": 2,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"block": 11,
|
||||
"weak": 2,
|
||||
"desc": "방어도 11. 약화 2 부여."
|
||||
},
|
||||
"MasterfulStab": {
|
||||
"name": "달인의 찌르기",
|
||||
"cost": 0,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 12,
|
||||
"desc": "피해 12."
|
||||
},
|
||||
"NoxiousFumes": {
|
||||
"name": "유독 가스",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 1,
|
||||
"desc": "독 강화: 매 턴 힘 +1."
|
||||
},
|
||||
"Predator": {
|
||||
"name": "포식자",
|
||||
"cost": 2,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 15,
|
||||
"draw": 2,
|
||||
"desc": "피해 15. 카드 2장 드로우."
|
||||
},
|
||||
"Reflex": {
|
||||
"name": "반사 신경",
|
||||
"cost": 0,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"draw": 2,
|
||||
"desc": "카드 2장 드로우."
|
||||
},
|
||||
"RiddleWithHoles": {
|
||||
"name": "벌집 만들기",
|
||||
"cost": 2,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 3,
|
||||
"hits": 5,
|
||||
"desc": "피해 3을 5회."
|
||||
},
|
||||
"Setup": {
|
||||
"name": "설치",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"draw": 1,
|
||||
"desc": "카드 1장 드로우."
|
||||
},
|
||||
"Skewer": {
|
||||
"name": "꿰뚫기",
|
||||
"cost": 2,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"damage": 7,
|
||||
"hits": 3,
|
||||
"desc": "피해 7을 3회."
|
||||
},
|
||||
"Tactician": {
|
||||
"name": "전술가",
|
||||
"cost": 0,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "energyPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 에너지 +1."
|
||||
},
|
||||
"Terror": {
|
||||
"name": "공포",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"vuln": 5,
|
||||
"desc": "취약 5 부여."
|
||||
},
|
||||
"WellLaidPlans": {
|
||||
"name": "치밀한 계획",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "unique",
|
||||
"powerEffect": "blockPerTurn",
|
||||
"value": 2,
|
||||
"desc": "매 턴 방어도 +2."
|
||||
},
|
||||
"AThousandCuts": {
|
||||
"name": "천 개의 상처",
|
||||
"cost": 2,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 힘 +1."
|
||||
},
|
||||
"Adrenaline": {
|
||||
"name": "아드레날린",
|
||||
"cost": 0,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"draw": 2,
|
||||
"strength": 1,
|
||||
"desc": "힘 +1. 카드 2장 드로우."
|
||||
},
|
||||
"AfterImage": {
|
||||
"name": "잔상 효과",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "blockPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 방어도 +1."
|
||||
},
|
||||
"Alchemize": {
|
||||
"name": "연금술",
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"heal": 8,
|
||||
"desc": "HP 8 회복."
|
||||
},
|
||||
"BulletTime": {
|
||||
"name": "불릿 타임",
|
||||
"cost": 2,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "energyPerTurn",
|
||||
"value": 2,
|
||||
"desc": "매 턴 에너지 +2."
|
||||
},
|
||||
"Burst": {
|
||||
"name": "폭발",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 힘 +1."
|
||||
},
|
||||
"CorpseExplosion": {
|
||||
"name": "시체 폭발",
|
||||
"cost": 2,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"poison": 6,
|
||||
"vuln": 2,
|
||||
"desc": "독 6과 취약 2 부여."
|
||||
},
|
||||
"DieDieDie": {
|
||||
"name": "죽어 죽어 죽어",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"damage": 13,
|
||||
"aoe": true,
|
||||
"desc": "모든 적에게 피해 13."
|
||||
},
|
||||
"Doppelganger": {
|
||||
"name": "도플갱어",
|
||||
"cost": 2,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"draw": 3,
|
||||
"desc": "카드 3장 드로우."
|
||||
},
|
||||
"Envenom": {
|
||||
"name": "맹독 바르기",
|
||||
"cost": 2,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 1,
|
||||
"desc": "독 지원: 매 턴 힘 +1."
|
||||
},
|
||||
"GlassKnife": {
|
||||
"name": "유리 칼",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"damage": 8,
|
||||
"hits": 2,
|
||||
"desc": "피해 8을 2회."
|
||||
},
|
||||
"GrandFinale": {
|
||||
"name": "대단원",
|
||||
"cost": 0,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"damage": 50,
|
||||
"aoe": true,
|
||||
"desc": "모든 적에게 피해 50."
|
||||
},
|
||||
"Malaise": {
|
||||
"name": "불쾌감",
|
||||
"cost": 2,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"weak": 3,
|
||||
"desc": "약화 3 부여."
|
||||
},
|
||||
"Nightmare": {
|
||||
"name": "악몽",
|
||||
"cost": 3,
|
||||
"kind": "Skill",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"draw": 3,
|
||||
"desc": "카드 3장 드로우."
|
||||
},
|
||||
"PhantasmalKiller": {
|
||||
"name": "환영 살인마",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "strengthPerTurn",
|
||||
"value": 2,
|
||||
"desc": "매 턴 힘 +2."
|
||||
},
|
||||
"StormOfSteel": {
|
||||
"name": "강철 폭풍",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"damage": 4,
|
||||
"hits": 5,
|
||||
"desc": "피해 4를 5회."
|
||||
},
|
||||
"ToolsOfTheTrade": {
|
||||
"name": "거래의 도구",
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "energyPerTurn",
|
||||
"value": 1,
|
||||
"desc": "매 턴 에너지 +1."
|
||||
},
|
||||
"Unload": {
|
||||
"name": "난사",
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"damage": 14,
|
||||
"desc": "피해 14."
|
||||
},
|
||||
"WraithForm": {
|
||||
"name": "망령화",
|
||||
"cost": 3,
|
||||
"kind": "Power",
|
||||
"class": "bandit",
|
||||
"rarity": "legend",
|
||||
"powerEffect": "blockPerTurn",
|
||||
"value": 8,
|
||||
"desc": "매 턴 방어도 +8."
|
||||
}
|
||||
},
|
||||
"starterDecks": {
|
||||
@@ -361,6 +1085,20 @@
|
||||
"MagicGuard",
|
||||
"MagicGuard",
|
||||
"MagicClaw"
|
||||
],
|
||||
"bandit": [
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"Neutralize",
|
||||
"Survivor"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { readFileSync, writeFileSync } from 'node:fs';
|
||||
import { readFileSync, writeFileSync } from 'node:fs';
|
||||
|
||||
const CARDS = JSON.parse(readFileSync('data/cards.json', 'utf8'));
|
||||
const ENEMIES = JSON.parse(readFileSync('data/enemies.json', 'utf8'));
|
||||
@@ -6,6 +6,7 @@ const ENEMIES = JSON.parse(readFileSync('data/enemies.json', 'utf8'));
|
||||
// 검증 (fail-fast): 잘못된 데이터면 생성 중단
|
||||
const CLASSES = {
|
||||
warrior: { label: '전사', maxHp: 80 },
|
||||
bandit: { label: '도적', maxHp: 70 },
|
||||
magician: { label: '마법사', maxHp: 70 },
|
||||
};
|
||||
for (const cls of Object.keys(CLASSES)) {
|
||||
@@ -26,6 +27,11 @@ const JOBS = {
|
||||
{ id: 'icelightning', name: '위자드(썬·콜)', desc: '광역·빙결 특화\n썬더 볼트(전체)\n콜드 빔 · 칠링 스텝', starter: 'ThunderBolt' },
|
||||
{ id: 'cleric', name: '클레릭', desc: '회복·축복 특화\n힐 · 블레스\n홀리 애로우', starter: 'Heal' },
|
||||
],
|
||||
bandit: [
|
||||
{ id: 'shiv', name: 'Shiv', desc: 'Many small attacks\nBlade Dance\nAccuracy · After Image', starter: 'BladeDance' },
|
||||
{ id: 'poisoner', name: 'Poison', desc: 'Poison scaling\nDeadly Poison\nCatalyst · Noxious Fumes', starter: 'DeadlyPoison' },
|
||||
{ id: 'trickster', name: 'Trickster', desc: 'Draw and tempo\nAcrobatics\nAdrenaline · Tools', starter: 'Acrobatics' },
|
||||
],
|
||||
};
|
||||
for (const [cls, jobs] of Object.entries(JOBS)) {
|
||||
for (const j of jobs) {
|
||||
@@ -2242,7 +2248,7 @@ function upsertUi() {
|
||||
}));
|
||||
const classCards = [
|
||||
{ key: 'Warrior', label: '\uC804\uC0AC', desc: '\uAC15\uD55C \uACF5\uACA9\uACFC \uBC29\uC5B4', x: -360, enabled: true, tint: { r: 0.74, g: 0.32, b: 0.28, a: 1 } },
|
||||
{ key: 'Thief', label: '\uB3C4\uC801', desc: '\uCD94\uD6C4 \uC5F4\uB9BC', x: 0, enabled: false, tint: { r: 0.18, g: 0.19, b: 0.21, a: 1 } },
|
||||
{ key: 'Thief', label: '\uB3C4\uC801', desc: 'Silent deck', x: 0, enabled: true, tint: { r: 0.26, g: 0.5, b: 0.34, a: 1 } },
|
||||
{ key: 'Mage', label: '\uB9C8\uBC95\uC0AC', desc: '\uB9C8\uBC95 \uC6D0\uAC70\uB9AC \uB51C\uB7EC', x: 360, enabled: true, tint: { r: 0.3, g: 0.4, b: 0.75, a: 1 } },
|
||||
];
|
||||
for (let i = 0; i < classCards.length; i++) {
|
||||
@@ -2432,6 +2438,7 @@ function writeCodeblocks() {
|
||||
prop('any', 'EndTurnHandler'),
|
||||
prop('any', 'NewGameHandler'),
|
||||
prop('any', 'WarriorSelectHandler'),
|
||||
prop('any', 'ThiefSelectHandler'),
|
||||
prop('any', 'MageSelectHandler'),
|
||||
prop('any', 'AscMinusHandler'),
|
||||
prop('any', 'AscPlusHandler'),
|
||||
@@ -2602,6 +2609,14 @@ if warrior ~= nil and warrior.ButtonComponent ~= nil then
|
||||
end
|
||||
self.WarriorSelectHandler = warrior:ConnectEvent(ButtonClickEvent, function() self:SelectClass("warrior") end)
|
||||
end
|
||||
local thief = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/ThiefButton")
|
||||
if thief ~= nil and thief.ButtonComponent ~= nil then
|
||||
if self.ThiefSelectHandler ~= nil then
|
||||
thief:DisconnectEvent(ButtonClickEvent, self.ThiefSelectHandler)
|
||||
self.ThiefSelectHandler = nil
|
||||
end
|
||||
self.ThiefSelectHandler = thief:ConnectEvent(ButtonClickEvent, function() self:SelectClass("bandit") end)
|
||||
end
|
||||
local mage = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/MageButton")
|
||||
if mage ~= nil and mage.ButtonComponent ~= nil then
|
||||
if self.MageSelectHandler ~= nil then
|
||||
@@ -2657,14 +2672,24 @@ if mage ~= nil and mage.SpriteGUIRendererComponent ~= nil then
|
||||
mage.SpriteGUIRendererComponent.Color = Color(0.16, 0.2, 0.26, 1)
|
||||
end
|
||||
end
|
||||
local thief = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/ThiefButton")
|
||||
if thief ~= nil and thief.SpriteGUIRendererComponent ~= nil then
|
||||
if self.SelectedClass == "bandit" then
|
||||
thief.SpriteGUIRendererComponent.Color = Color(0.28, 0.36, 0.46, 1)
|
||||
else
|
||||
thief.SpriteGUIRendererComponent.Color = Color(0.16, 0.2, 0.26, 1)
|
||||
end
|
||||
end
|
||||
if self.SelectedClass == "warrior" then
|
||||
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "전사 선택됨")
|
||||
elseif self.SelectedClass == "bandit" then
|
||||
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "도적 선택됨")
|
||||
elseif self.SelectedClass == "magician" then
|
||||
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "마법사 선택됨")
|
||||
else
|
||||
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "직업을 선택하고 시작하세요")
|
||||
end`),
|
||||
method('StartNewGame', `if self.SelectedClass ~= "warrior" and self.SelectedClass ~= "magician" then
|
||||
method('StartNewGame', `if self.SelectedClass ~= "warrior" and self.SelectedClass ~= "bandit" and self.SelectedClass ~= "magician" then
|
||||
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "직업을 먼저 선택하세요")
|
||||
return
|
||||
end
|
||||
@@ -2679,6 +2704,9 @@ end`, [
|
||||
method('StartRun', `if self.SelectedClass == "magician" then
|
||||
self.PlayerMaxHp = ${CLASSES.magician.maxHp}
|
||||
self.RunDeck = { ${CARDS.starterDecks.magician.map(luaStr).join(', ')} }
|
||||
elseif self.SelectedClass == "bandit" then
|
||||
self.PlayerMaxHp = ${CLASSES.bandit.maxHp}
|
||||
self.RunDeck = { ${CARDS.starterDecks.bandit.map(luaStr).join(', ')} }
|
||||
else
|
||||
self.PlayerMaxHp = ${CLASSES.warrior.maxHp}
|
||||
self.RunDeck = { ${CARDS.starterDecks.warrior.map(luaStr).join(', ')} }
|
||||
@@ -3745,6 +3773,8 @@ self:SetEntityEnabled("/ui/DefaultGroup/JobSelectHud", true)`),
|
||||
end
|
||||
if self.SelectedClass == "warrior" then
|
||||
return "전사"
|
||||
elseif self.SelectedClass == "bandit" then
|
||||
return "도적"
|
||||
elseif self.SelectedClass == "magician" then
|
||||
return "마법사"
|
||||
end
|
||||
|
||||
@@ -234993,9 +234993,9 @@
|
||||
"PreserveSprite": 0,
|
||||
"StartFrameIndex": 0,
|
||||
"Color": {
|
||||
"r": 0.11,
|
||||
"g": 0.12,
|
||||
"b": 0.14,
|
||||
"r": 0.16,
|
||||
"g": 0.2,
|
||||
"b": 0.26,
|
||||
"a": 1
|
||||
},
|
||||
"DropShadow": false,
|
||||
@@ -235025,7 +235025,7 @@
|
||||
"a": 1
|
||||
},
|
||||
"OutlineWidth": 3,
|
||||
"RaycastTarget": false,
|
||||
"RaycastTarget": true,
|
||||
"Type": 1,
|
||||
"Enable": true
|
||||
},
|
||||
@@ -235074,7 +235074,7 @@
|
||||
"KeyCode": 0,
|
||||
"OverrideSorting": false,
|
||||
"Transition": 1,
|
||||
"Enable": false
|
||||
"Enable": true
|
||||
}
|
||||
],
|
||||
"@version": 1
|
||||
@@ -235232,9 +235232,9 @@
|
||||
"DropShadowDistance": 32,
|
||||
"Font": 0,
|
||||
"FontColor": {
|
||||
"r": 0.55,
|
||||
"g": 0.58,
|
||||
"b": 0.62,
|
||||
"r": 0.94,
|
||||
"g": 0.74,
|
||||
"b": 0.26,
|
||||
"a": 1
|
||||
},
|
||||
"FontSize": 34,
|
||||
@@ -235369,9 +235369,9 @@
|
||||
"PreserveSprite": 0,
|
||||
"StartFrameIndex": 0,
|
||||
"Color": {
|
||||
"r": 0.18,
|
||||
"g": 0.19,
|
||||
"b": 0.21,
|
||||
"r": 0.26,
|
||||
"g": 0.5,
|
||||
"b": 0.34,
|
||||
"a": 1
|
||||
},
|
||||
"DropShadow": false,
|
||||
@@ -235561,9 +235561,9 @@
|
||||
"DropShadowDistance": 32,
|
||||
"Font": 0,
|
||||
"FontColor": {
|
||||
"r": 0.52,
|
||||
"g": 0.55,
|
||||
"b": 0.59,
|
||||
"r": 0.86,
|
||||
"g": 0.9,
|
||||
"b": 0.94,
|
||||
"a": 1
|
||||
},
|
||||
"FontSize": 20,
|
||||
@@ -235589,7 +235589,7 @@
|
||||
"bottom": 0
|
||||
},
|
||||
"SizeFit": false,
|
||||
"Text": "추후 열림",
|
||||
"Text": "Silent deck",
|
||||
"UseOutLine": true,
|
||||
"Enable": true
|
||||
}
|
||||
@@ -235597,288 +235597,6 @@
|
||||
"@version": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0e000097-0000-4000-8000-00000e000097",
|
||||
"path": "/ui/DefaultGroup/CharacterSelectHud/ThiefButton/LockBody",
|
||||
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent",
|
||||
"jsonString": {
|
||||
"name": "LockBody",
|
||||
"path": "/ui/DefaultGroup/CharacterSelectHud/ThiefButton/LockBody",
|
||||
"nameEditable": true,
|
||||
"enable": true,
|
||||
"visible": true,
|
||||
"localize": true,
|
||||
"displayOrder": 3,
|
||||
"pathConstraints": "/////",
|
||||
"revision": 1,
|
||||
"origin": {
|
||||
"type": "Model",
|
||||
"entry_id": "UISprite",
|
||||
"sub_entity_id": null,
|
||||
"root_entity_id": null,
|
||||
"replaced_model_id": null
|
||||
},
|
||||
"modelId": "uisprite",
|
||||
"@components": [
|
||||
{
|
||||
"@type": "MOD.Core.UITransformComponent",
|
||||
"ActivePlatform": 255,
|
||||
"AlignmentOption": 0,
|
||||
"AnchorsMax": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"AnchorsMin": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"MobileOnly": false,
|
||||
"OffsetMax": {
|
||||
"x": 38,
|
||||
"y": 33
|
||||
},
|
||||
"OffsetMin": {
|
||||
"x": -38,
|
||||
"y": -25
|
||||
},
|
||||
"Pivot": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"RectSize": {
|
||||
"x": 76,
|
||||
"y": 58
|
||||
},
|
||||
"UIMode": 1,
|
||||
"UIScale": {
|
||||
"x": 1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"UIVersion": 2,
|
||||
"anchoredPosition": {
|
||||
"x": 0,
|
||||
"y": 4
|
||||
},
|
||||
"Position": {
|
||||
"x": 0,
|
||||
"y": 4,
|
||||
"z": 0
|
||||
},
|
||||
"QuaternionRotation": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0,
|
||||
"w": 1
|
||||
},
|
||||
"Scale": {
|
||||
"x": 1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"Enable": true
|
||||
},
|
||||
{
|
||||
"@type": "MOD.Core.SpriteGUIRendererComponent",
|
||||
"AnimClipPlayType": 0,
|
||||
"EndFrameIndex": 2147483647,
|
||||
"ImageRUID": {
|
||||
"DataId": ""
|
||||
},
|
||||
"LocalPosition": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"LocalScale": {
|
||||
"x": 1,
|
||||
"y": 1
|
||||
},
|
||||
"OverrideSorting": false,
|
||||
"PlayRate": 1,
|
||||
"PreserveSprite": 0,
|
||||
"StartFrameIndex": 0,
|
||||
"Color": {
|
||||
"r": 0.78,
|
||||
"g": 0.69,
|
||||
"b": 0.42,
|
||||
"a": 1
|
||||
},
|
||||
"DropShadow": false,
|
||||
"DropShadowAngle": 30,
|
||||
"DropShadowColor": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0,
|
||||
"a": 0.72
|
||||
},
|
||||
"DropShadowDistance": 32,
|
||||
"FillAmount": 1,
|
||||
"FillCenter": true,
|
||||
"FillClockWise": true,
|
||||
"FillMethod": 0,
|
||||
"FillOrigin": 0,
|
||||
"FlipX": false,
|
||||
"FlipY": false,
|
||||
"FrameColumn": 1,
|
||||
"FrameRate": 0,
|
||||
"FrameRow": 1,
|
||||
"Outline": false,
|
||||
"OutlineColor": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0,
|
||||
"a": 1
|
||||
},
|
||||
"OutlineWidth": 3,
|
||||
"RaycastTarget": false,
|
||||
"Type": 1,
|
||||
"Enable": true
|
||||
}
|
||||
],
|
||||
"@version": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0e0000a1-0000-4000-8000-00000e0000a1",
|
||||
"path": "/ui/DefaultGroup/CharacterSelectHud/ThiefButton/LockShackle",
|
||||
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent",
|
||||
"jsonString": {
|
||||
"name": "LockShackle",
|
||||
"path": "/ui/DefaultGroup/CharacterSelectHud/ThiefButton/LockShackle",
|
||||
"nameEditable": true,
|
||||
"enable": true,
|
||||
"visible": true,
|
||||
"localize": true,
|
||||
"displayOrder": 4,
|
||||
"pathConstraints": "/////",
|
||||
"revision": 1,
|
||||
"origin": {
|
||||
"type": "Model",
|
||||
"entry_id": "UISprite",
|
||||
"sub_entity_id": null,
|
||||
"root_entity_id": null,
|
||||
"replaced_model_id": null
|
||||
},
|
||||
"modelId": "uisprite",
|
||||
"@components": [
|
||||
{
|
||||
"@type": "MOD.Core.UITransformComponent",
|
||||
"ActivePlatform": 255,
|
||||
"AlignmentOption": 0,
|
||||
"AnchorsMax": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"AnchorsMin": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"MobileOnly": false,
|
||||
"OffsetMax": {
|
||||
"x": 27,
|
||||
"y": 69
|
||||
},
|
||||
"OffsetMin": {
|
||||
"x": -27,
|
||||
"y": 27
|
||||
},
|
||||
"Pivot": {
|
||||
"x": 0.5,
|
||||
"y": 0.5
|
||||
},
|
||||
"RectSize": {
|
||||
"x": 54,
|
||||
"y": 42
|
||||
},
|
||||
"UIMode": 1,
|
||||
"UIScale": {
|
||||
"x": 1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"UIVersion": 2,
|
||||
"anchoredPosition": {
|
||||
"x": 0,
|
||||
"y": 48
|
||||
},
|
||||
"Position": {
|
||||
"x": 0,
|
||||
"y": 48,
|
||||
"z": 0
|
||||
},
|
||||
"QuaternionRotation": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 0,
|
||||
"w": 1
|
||||
},
|
||||
"Scale": {
|
||||
"x": 1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"Enable": true
|
||||
},
|
||||
{
|
||||
"@type": "MOD.Core.SpriteGUIRendererComponent",
|
||||
"AnimClipPlayType": 0,
|
||||
"EndFrameIndex": 2147483647,
|
||||
"ImageRUID": {
|
||||
"DataId": ""
|
||||
},
|
||||
"LocalPosition": {
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"LocalScale": {
|
||||
"x": 1,
|
||||
"y": 1
|
||||
},
|
||||
"OverrideSorting": false,
|
||||
"PlayRate": 1,
|
||||
"PreserveSprite": 0,
|
||||
"StartFrameIndex": 0,
|
||||
"Color": {
|
||||
"r": 0.78,
|
||||
"g": 0.69,
|
||||
"b": 0.42,
|
||||
"a": 1
|
||||
},
|
||||
"DropShadow": false,
|
||||
"DropShadowAngle": 30,
|
||||
"DropShadowColor": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0,
|
||||
"a": 0.72
|
||||
},
|
||||
"DropShadowDistance": 32,
|
||||
"FillAmount": 1,
|
||||
"FillCenter": true,
|
||||
"FillClockWise": true,
|
||||
"FillMethod": 0,
|
||||
"FillOrigin": 0,
|
||||
"FlipX": false,
|
||||
"FlipY": false,
|
||||
"FrameColumn": 1,
|
||||
"FrameRate": 0,
|
||||
"FrameRow": 1,
|
||||
"Outline": false,
|
||||
"OutlineColor": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0,
|
||||
"a": 1
|
||||
},
|
||||
"OutlineWidth": 3,
|
||||
"RaycastTarget": false,
|
||||
"Type": 1,
|
||||
"Enable": true
|
||||
}
|
||||
],
|
||||
"@version": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0e000070-0000-4000-8000-00000e000070",
|
||||
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton",
|
||||
|
||||
Reference in New Issue
Block a user