Merge pull request 'feat(bandit): 사일런트 도적 덱 추가' (#53) from codex/bandit-silent-deck into main

This commit was merged in pull request #53.
This commit is contained in:
2026-06-14 17:53:02 +09:00
5 changed files with 1770 additions and 66 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,14 +1,41 @@
{
"frames": {
"warrior": { "normal": "4bb57ef88ef449fdaf958f6cf37fe44b", "unique": "4f71c124c8bc4e13b5e9fad392995f68", "legend": "6d741a60c60743cb98ee740a1e2dbfed" },
"magician": { "normal": "d788d09f6f50467ebc67f01dec45f9e2", "unique": "f5def2e8022b4e59a17d3c16414034fe", "legend": "cff71f2e472041ce80c6fbd296f42e2d" },
"bandit": { "normal": "9487b06867bc46269ed1d855420f457f", "unique": "b3081fb2fb1445fa90b12b01481a78ef", "legend": "c357d2daf31a489d95b8fa47e50dd879" }
"warrior": {
"normal": "4bb57ef88ef449fdaf958f6cf37fe44b",
"unique": "4f71c124c8bc4e13b5e9fad392995f68",
"legend": "6d741a60c60743cb98ee740a1e2dbfed"
},
"magician": {
"normal": "d788d09f6f50467ebc67f01dec45f9e2",
"unique": "f5def2e8022b4e59a17d3c16414034fe",
"legend": "cff71f2e472041ce80c6fbd296f42e2d"
},
"bandit": {
"normal": "9487b06867bc46269ed1d855420f457f",
"unique": "b3081fb2fb1445fa90b12b01481a78ef",
"legend": "c357d2daf31a489d95b8fa47e50dd879"
}
},
"classToFrame": {
"warrior": "warrior", "fighter": "warrior", "page": "warrior", "spearman": "warrior",
"magician": "magician", "firepoison": "magician", "icelightning": "magician", "cleric": "magician",
"thief": "bandit", "assassin": "bandit", "bandit": "bandit",
"curse": "bandit"
"warrior": "warrior",
"fighter": "warrior",
"page": "warrior",
"spearman": "warrior",
"magician": "magician",
"firepoison": "magician",
"icelightning": "magician",
"cleric": "magician",
"thief": "bandit",
"assassin": "bandit",
"bandit": "bandit",
"curse": "bandit",
"shiv": "bandit",
"poisoner": "bandit",
"trickster": "bandit"
},
"rewardWeights": { "normal": 70, "unique": 25, "legend": 5 }
"rewardWeights": {
"normal": 70,
"unique": 25,
"legend": 5
}
}

View File

@@ -492,6 +492,730 @@
"unplayable": true,
"curse": true,
"endTurnDamage": 2
},
"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": {
@@ -530,6 +1254,20 @@
"DarkSight",
"DarkSight",
"DoubleStab"
],
"bandit": [
"SilentStrike",
"SilentStrike",
"SilentStrike",
"SilentStrike",
"SilentStrike",
"SilentDefend",
"SilentDefend",
"SilentDefend",
"SilentDefend",
"SilentDefend",
"Neutralize",
"Survivor"
]
}
}

View File

@@ -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 },
thief: { label: '도적', maxHp: 75 },
};
@@ -27,6 +28,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' },
],
thief: [
{ id: 'assassin', name: '어쌔신', desc: '표창·치명타 특화\n크리티컬 스로우\n쉐도우 스타 · 클로', starter: 'CriticalThrow' },
{ id: 'bandit', name: '시프', desc: '단검 연타 특화\n새비지 블로우\n스틸 · 메소 가드', starter: 'SavageBlow' },
@@ -1506,12 +1512,13 @@ function upsertUi() {
path: cardPath,
modelId: 'uisprite',
entryId: 'UISprite',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent',
displayOrder: i,
components: [
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: CARD_W, y: CARD_H }, pos: { x: rewardXs[i - 1], y: 0 } }),
sprite({ dataId: CARDFRAMES.frames.warrior.normal, color: WHITE, type: 0, raycast: true }),
button(),
{ '@type': 'MOD.Core.UITouchReceiveComponent', Enable: true },
],
}));
const rewardLayout = cardFaceLayout(CARD_W);
@@ -1727,12 +1734,13 @@ function upsertUi() {
path: cardPath,
modelId: 'uisprite',
entryId: 'UISprite',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent',
displayOrder: i,
components: [
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: CARD_W, y: CARD_H }, pos: { x: shopXs[i - 1], y: 20 } }),
sprite({ dataId: CARDFRAMES.frames.warrior.normal, color: WHITE, type: 0, raycast: true }),
button(),
{ '@type': 'MOD.Core.UITouchReceiveComponent', Enable: true },
],
}));
const shopLayout = cardFaceLayout(CARD_W);
@@ -2311,9 +2319,10 @@ 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: '\uBE60\uB978 \uB2E8\uAC80 \uC5F0\uD0C0', x: 0, enabled: true, tint: { r: 0.5, g: 0.32, b: 0.6, 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 } },
{ key: 'Warrior', label: '\uC804\uC0AC', desc: '\uAC15\uD55C \uACF5\uACA9\uACFC \uBC29\uC5B4', x: -540, enabled: true, tint: { r: 0.74, g: 0.32, b: 0.28, a: 1 } },
{ key: 'Thief', label: '\uB3C4\uC801', desc: '\uBE60\uB978 \uB2E8\uAC80 \uC5F0\uD0C0', x: -180, enabled: true, tint: { r: 0.5, g: 0.32, b: 0.6, a: 1 } },
{ key: 'Bandit', label: '\uC0AC\uC77C\uB7F0\uD2B8', desc: '\uB3C5\u00B7\uB2E8\uAC80\u00B7\uB4DC\uB85C\uC6B0', x: 180, 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: 540, enabled: true, tint: { r: 0.3, g: 0.4, b: 0.75, a: 1 } },
];
for (let i = 0; i < classCards.length; i++) {
const cls = classCards[i];
@@ -2698,11 +2707,13 @@ function writeCodeblocks() {
prop('number', 'MaxEnergy', '3'),
prop('number', 'Turn', '0'),
prop('number', 'TweenEventId', '0'),
prop('number', 'CardHoverTweenId', '0'),
prop('any', 'EndTurnHandler'),
prop('any', 'NewGameHandler'),
prop('any', 'WarriorSelectHandler'),
prop('any', 'MageSelectHandler'),
prop('any', 'ThiefSelectHandler'),
prop('any', 'BanditSelectHandler'),
prop('any', 'MageSelectHandler'),
prop('any', 'AscMinusHandler'),
prop('any', 'AscPlusHandler'),
prop('any', 'JobOpts'),
@@ -2899,14 +2910,6 @@ if warrior ~= nil and warrior.ButtonComponent ~= nil then
end
self.WarriorSelectHandler = warrior:ConnectEvent(ButtonClickEvent, function() self:SelectClass("warrior") end)
end
local mage = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/MageButton")
if mage ~= nil and mage.ButtonComponent ~= nil then
if self.MageSelectHandler ~= nil then
mage:DisconnectEvent(ButtonClickEvent, self.MageSelectHandler)
self.MageSelectHandler = nil
end
self.MageSelectHandler = mage:ConnectEvent(ButtonClickEvent, function() self:SelectClass("magician") end)
end
local thief = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/ThiefButton")
if thief ~= nil and thief.ButtonComponent ~= nil then
if self.ThiefSelectHandler ~= nil then
@@ -2915,6 +2918,22 @@ if thief ~= nil and thief.ButtonComponent ~= nil then
end
self.ThiefSelectHandler = thief:ConnectEvent(ButtonClickEvent, function() self:SelectClass("thief") end)
end
local bandit = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/BanditButton")
if bandit ~= nil and bandit.ButtonComponent ~= nil then
if self.BanditSelectHandler ~= nil then
bandit:DisconnectEvent(ButtonClickEvent, self.BanditSelectHandler)
self.BanditSelectHandler = nil
end
self.BanditSelectHandler = bandit: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
mage:DisconnectEvent(ButtonClickEvent, self.MageSelectHandler)
self.MageSelectHandler = nil
end
self.MageSelectHandler = mage:ConnectEvent(ButtonClickEvent, function() self:SelectClass("magician") end)
end
local start = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/StartButton")
if start ~= nil and start.ButtonComponent ~= nil then
if self.StartGameHandler ~= nil then
@@ -3155,8 +3174,18 @@ if thief ~= nil and thief.SpriteGUIRendererComponent ~= nil then
thief.SpriteGUIRendererComponent.Color = Color(0.16, 0.2, 0.26, 1)
end
end
local bandit = _EntityService:GetEntityByPath("/ui/DefaultGroup/CharacterSelectHud/BanditButton")
if bandit ~= nil and bandit.SpriteGUIRendererComponent ~= nil then
if self.SelectedClass == "bandit" then
bandit.SpriteGUIRendererComponent.Color = Color(0.28, 0.36, 0.46, 1)
else
bandit.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", "마법사 선택됨")
elseif self.SelectedClass == "thief" then
@@ -3164,7 +3193,7 @@ elseif self.SelectedClass == "thief" then
else
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "직업을 선택하고 시작하세요")
end`),
method('StartNewGame', `if self.SelectedClass ~= "warrior" and self.SelectedClass ~= "magician" and self.SelectedClass ~= "thief" then
method('StartNewGame', `if self.SelectedClass ~= "warrior" and self.SelectedClass ~= "bandit" and self.SelectedClass ~= "magician" and self.SelectedClass ~= "thief" then
self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "직업을 먼저 선택하세요")
return
end
@@ -3178,7 +3207,10 @@ end`, [
]),
method('StartRun', `if self.SelectedClass == "magician" then
self.PlayerMaxHp = ${CLASSES.magician.maxHp}
self.RunDeck = { ${CARDS.starterDecks.magician.map(luaStr).join(', ')} }
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(', ')} }
elseif self.SelectedClass == "thief" then
self.PlayerMaxHp = ${CLASSES.thief.maxHp}
self.RunDeck = { ${CARDS.starterDecks.thief.map(luaStr).join(', ')} }
@@ -3407,6 +3439,9 @@ end
for i = 1, 10 do
local cardEntity = _EntityService:GetEntityByPath("/ui/DefaultGroup/CardHand/Card" .. tostring(i))
if cardEntity ~= nil and cardEntity.UITouchReceiveComponent ~= nil then
local cardPath = "/ui/DefaultGroup/CardHand/Card" .. tostring(i)
cardEntity:ConnectEvent(UITouchEnterEvent, function() self:SetCardHover(cardPath, true) end)
cardEntity:ConnectEvent(UITouchExitEvent, function() self:SetCardHover(cardPath, false) end)
cardEntity:ConnectEvent(UITouchBeginDragEvent, function(ev) self:OnCardDragBegin(i) end)
cardEntity:ConnectEvent(UITouchDragEvent, function(ev) self:OnCardDrag(i, ev.TouchPoint) end)
cardEntity:ConnectEvent(UITouchEndDragEvent, function(ev) self:OnCardDragEnd(i, ev.TouchPoint) end)
@@ -3418,6 +3453,11 @@ for i = 1, 3 do
local rc = _EntityService:GetEntityByPath("/ui/DefaultGroup/RewardHud/Reward" .. tostring(i))
if rc ~= nil and rc.ButtonComponent ~= nil then
rc:ConnectEvent(ButtonClickEvent, function() self:PickReward(i) end)
if rc.UITouchReceiveComponent ~= nil then
local cardPath = "/ui/DefaultGroup/RewardHud/Reward" .. tostring(i)
rc:ConnectEvent(UITouchEnterEvent, function() self:SetCardHover(cardPath, true) end)
rc:ConnectEvent(UITouchExitEvent, function() self:SetCardHover(cardPath, false) end)
end
end
end
local skip = _EntityService:GetEntityByPath("/ui/DefaultGroup/RewardHud/Skip")
@@ -3442,6 +3482,11 @@ for i = 1, 3 do
local sc = _EntityService:GetEntityByPath("/ui/DefaultGroup/ShopHud/Card" .. tostring(i))
if sc ~= nil and sc.ButtonComponent ~= nil then
sc:ConnectEvent(ButtonClickEvent, function() self:BuyCard(i) end)
if sc.UITouchReceiveComponent ~= nil then
local cardPath = "/ui/DefaultGroup/ShopHud/Card" .. tostring(i)
sc:ConnectEvent(UITouchEnterEvent, function() self:SetCardHover(cardPath, true) end)
sc:ConnectEvent(UITouchExitEvent, function() self:SetCardHover(cardPath, false) end)
end
end
end
local shopLeave = _EntityService:GetEntityByPath("/ui/DefaultGroup/ShopHud/Leave")
@@ -3582,7 +3627,8 @@ if self.PlayerVuln > 0 then self.PlayerVuln = self.PlayerVuln - 1 end
self:RenderHand(false)
self:RenderPiles()
self:EnemyTurn()`),
method('DrawCards', `for i = 1, amount do
method('DrawCards', `local drawnSlots = {}
for i = 1, amount do
\tif #self.DrawPile <= 0 then
\t\tself:RecycleDiscardIntoDraw()
\tend
@@ -3594,9 +3640,23 @@ self:EnemyTurn()`),
\t\ttable.insert(self.DiscardPile, cardId)
\telse
\t\ttable.insert(self.Hand, cardId)
\t\tif #self.Hand <= 5 then
\t\t\ttable.insert(drawnSlots, #self.Hand)
\t\tend
\tend
end
self:RenderPiles()`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }]),
self:RenderPiles()
if animate == true and #drawnSlots > 0 then
\tself:RenderHand(false)
\tlocal drawStart = Vector2(-590, 8)
\tfor i = 1, #drawnSlots do
\t\tlocal slot = drawnSlots[i]
\t\tself:AnimateCardFrom(slot, drawStart, Vector2((slot - 3) * 200, 0), 0.08 + i * 0.045)
\tend
end`, [
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' },
{ Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'animate' },
]),
method('RecycleDiscardIntoDraw', `if self.DiscardPile == nil or #self.DiscardPile <= 0 then
\treturn
end
@@ -3754,6 +3814,9 @@ if c == nil then
end
local e = _EntityService:GetEntityByPath(base)
if e ~= nil and e.SpriteGUIRendererComponent ~= nil then
if e.UITransformComponent ~= nil then
e.UITransformComponent.UIScale = Vector3(1, 1, 1)
end
local frames = self.CardFrames[self.ClassToFrame[c.class] or "warrior"]
local ruid = nil
if frames ~= nil then
@@ -3781,6 +3844,87 @@ end`, [
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'base' },
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'cardId' },
]),
method('SetCardHover', `local prefix = ""
local count = 0
local xs = {}
local baseY = 0
local hoverIndex = 0
local push = 110
if string.find(path, "/ui/DefaultGroup/CardHand/Card") == 1 then
if self.DragSlot ~= nil and self.DragSlot > 0 then
return
end
prefix = "/ui/DefaultGroup/CardHand/Card"
count = 5
xs = { ${CARD_XS.join(', ')} }
baseY = 0
hoverIndex = tonumber(string.match(path, "Card(%d+)")) or 0
elseif string.find(path, "/ui/DefaultGroup/RewardHud/Reward") == 1 then
prefix = "/ui/DefaultGroup/RewardHud/Reward"
count = 3
xs = { -300, 0, 300 }
baseY = 0
hoverIndex = tonumber(string.match(path, "Reward(%d+)")) or 0
elseif string.find(path, "/ui/DefaultGroup/ShopHud/Card") == 1 then
prefix = "/ui/DefaultGroup/ShopHud/Card"
count = 3
xs = { -300, 0, 300 }
baseY = 20
hoverIndex = tonumber(string.match(path, "Card(%d+)")) or 0
end
if count <= 0 then
return
end
if self.CardHoverTweenId ~= nil and self.CardHoverTweenId ~= 0 then
_TimerService:ClearTimer(self.CardHoverTweenId)
self.CardHoverTweenId = 0
end
local items = {}
for i = 1, count do
local e = _EntityService:GetEntityByPath(prefix .. tostring(i))
if e ~= nil and e.UITransformComponent ~= nil then
local tr = e.UITransformComponent
local tx = xs[i]
local ty = baseY
local sc = 1
if hover == true and hoverIndex > 0 then
if i == hoverIndex and e.Enable == true then
sc = 1.5
elseif i < hoverIndex then
tx = tx - push
elseif i > hoverIndex then
tx = tx + push
end
end
table.insert(items, { tr = tr, sx = tr.anchoredPosition.x, sy = tr.anchoredPosition.y, ss = tr.UIScale.x, tx = tx, ty = ty, ts = sc })
end
end
local elapsed = 0
local duration = 0.12
local eventId = 0
eventId = _TimerService:SetTimerRepeat(function()
elapsed = elapsed + 1 / 60
local t = math.min(elapsed / duration, 1)
local eased = _TweenLogic:Ease(0, 1, 1, EaseType.SineEaseOut, t)
for i = 1, #items do
local it = items[i]
local x = it.sx + (it.tx - it.sx) * eased
local y = it.sy + (it.ty - it.sy) * eased
local s = it.ss + (it.ts - it.ss) * eased
it.tr.anchoredPosition = Vector2(x, y)
it.tr.UIScale = Vector3(s, s, 1)
end
if t >= 1 then
_TimerService:ClearTimer(eventId)
if self.CardHoverTweenId == eventId then
self.CardHoverTweenId = 0
end
end
end, 1 / 60)
self.CardHoverTweenId = eventId`, [
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'path' },
{ Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'hover' },
]),
method('ApplyCardVisual', `self:ApplyCardFace("/ui/DefaultGroup/CardHand/Card" .. tostring(slot), cardId)`, [
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' },
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'cardId' },
@@ -3910,7 +4054,7 @@ if c.kind ~= "Power" then
table.insert(self.DiscardPile, cardId)
end
if c.draw ~= nil then
self:DrawCards(c.draw)
self:DrawCards(c.draw, true)
end
self:RenderHand(false)
self:RenderPiles()
@@ -3922,6 +4066,18 @@ end
if self.Hand == nil or self.Hand[slot] == nil then
return
end
if self.CardHoverTweenId ~= nil and self.CardHoverTweenId ~= 0 then
_TimerService:ClearTimer(self.CardHoverTweenId)
self.CardHoverTweenId = 0
end
local cardXs = { ${CARD_XS.join(', ')} }
for i = 1, 5 do
local e = _EntityService:GetEntityByPath("/ui/DefaultGroup/CardHand/Card" .. tostring(i))
if e ~= nil and e.UITransformComponent ~= nil then
e.UITransformComponent.UIScale = Vector3(1, 1, 1)
e.UITransformComponent.anchoredPosition = Vector2(cardXs[i], 0)
end
end
self.DragSlot = slot`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
method('OnCardDrag', `if self.DragSlot ~= slot then
return
@@ -3942,6 +4098,7 @@ local cardXs = { ${CARD_XS.join(', ')} }
local e = _EntityService:GetEntityByPath("/ui/DefaultGroup/CardHand/Card" .. tostring(slot))
if e ~= nil and e.UITransformComponent ~= nil then
e.UITransformComponent.anchoredPosition = Vector2(cardXs[slot], 0)
e.UITransformComponent.UIScale = Vector3(1, 1, 1)
end
self:ResolveCardDrop(slot, touchPoint)`, [
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' },
@@ -4327,6 +4484,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 "마법사"
elseif self.SelectedClass == "thief" then

View File

@@ -27394,7 +27394,7 @@
{
"id": "0e700002-0000-4000-8000-00000e700002",
"path": "/ui/DefaultGroup/RewardHud/Reward1",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent",
"jsonString": {
"name": "Reward1",
"path": "/ui/DefaultGroup/RewardHud/Reward1",
@@ -27574,6 +27574,10 @@
"OverrideSorting": false,
"Transition": 1,
"Enable": true
},
{
"@type": "MOD.Core.UITouchReceiveComponent",
"Enable": true
}
],
"@version": 1
@@ -28287,7 +28291,7 @@
{
"id": "0e700009-0000-4000-8000-00000e700009",
"path": "/ui/DefaultGroup/RewardHud/Reward2",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent",
"jsonString": {
"name": "Reward2",
"path": "/ui/DefaultGroup/RewardHud/Reward2",
@@ -28467,6 +28471,10 @@
"OverrideSorting": false,
"Transition": 1,
"Enable": true
},
{
"@type": "MOD.Core.UITouchReceiveComponent",
"Enable": true
}
],
"@version": 1
@@ -29180,7 +29188,7 @@
{
"id": "0e700010-0000-4000-8000-00000e700010",
"path": "/ui/DefaultGroup/RewardHud/Reward3",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent",
"jsonString": {
"name": "Reward3",
"path": "/ui/DefaultGroup/RewardHud/Reward3",
@@ -29360,6 +29368,10 @@
"OverrideSorting": false,
"Transition": 1,
"Enable": true
},
{
"@type": "MOD.Core.UITouchReceiveComponent",
"Enable": true
}
],
"@version": 1
@@ -63537,7 +63549,7 @@
{
"id": "0e800003-0000-4000-8000-00000e800003",
"path": "/ui/DefaultGroup/ShopHud/Card1",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent",
"jsonString": {
"name": "Card1",
"path": "/ui/DefaultGroup/ShopHud/Card1",
@@ -63717,6 +63729,10 @@
"OverrideSorting": false,
"Transition": 1,
"Enable": true
},
{
"@type": "MOD.Core.UITouchReceiveComponent",
"Enable": true
}
],
"@version": 1
@@ -64618,7 +64634,7 @@
{
"id": "0e80000b-0000-4000-8000-00000e80000b",
"path": "/ui/DefaultGroup/ShopHud/Card2",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent",
"jsonString": {
"name": "Card2",
"path": "/ui/DefaultGroup/ShopHud/Card2",
@@ -64798,6 +64814,10 @@
"OverrideSorting": false,
"Transition": 1,
"Enable": true
},
{
"@type": "MOD.Core.UITouchReceiveComponent",
"Enable": true
}
],
"@version": 1
@@ -65699,7 +65719,7 @@
{
"id": "0e800013-0000-4000-8000-00000e800013",
"path": "/ui/DefaultGroup/ShopHud/Card3",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.UITouchReceiveComponent",
"jsonString": {
"name": "Card3",
"path": "/ui/DefaultGroup/ShopHud/Card3",
@@ -65879,6 +65899,10 @@
"OverrideSorting": false,
"Transition": 1,
"Enable": true
},
{
"@type": "MOD.Core.UITouchReceiveComponent",
"Enable": true
}
],
"@version": 1
@@ -233257,11 +233281,11 @@
},
"MobileOnly": false,
"OffsetMax": {
"x": -225,
"x": -405,
"y": 205
},
"OffsetMin": {
"x": -495,
"x": -675,
"y": -125
},
"Pivot": {
@@ -233280,11 +233304,11 @@
},
"UIVersion": 2,
"anchoredPosition": {
"x": -360,
"x": -540,
"y": 40
},
"Position": {
"x": -360,
"x": -540,
"y": 40,
"z": 0
},
@@ -233962,11 +233986,11 @@
},
"MobileOnly": false,
"OffsetMax": {
"x": 135,
"x": -45,
"y": 205
},
"OffsetMin": {
"x": -135,
"x": -315,
"y": -125
},
"Pivot": {
@@ -233985,11 +234009,11 @@
},
"UIVersion": 2,
"anchoredPosition": {
"x": 0,
"x": -180,
"y": 40
},
"Position": {
"x": 0,
"x": -180,
"y": 40,
"z": 0
},
@@ -234632,11 +234656,11 @@
},
{
"id": "0e000070-0000-4000-8000-00000e000070",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"jsonString": {
"name": "MageButton",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton",
"name": "BanditButton",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton",
"nameEditable": true,
"enable": true,
"visible": true,
@@ -234667,11 +234691,11 @@
},
"MobileOnly": false,
"OffsetMax": {
"x": 495,
"x": 315,
"y": 205
},
"OffsetMin": {
"x": 225,
"x": 45,
"y": -125
},
"Pivot": {
@@ -234690,11 +234714,11 @@
},
"UIVersion": 2,
"anchoredPosition": {
"x": 360,
"x": 180,
"y": 40
},
"Position": {
"x": 360,
"x": 180,
"y": 40,
"z": 0
},
@@ -234820,6 +234844,711 @@
},
{
"id": "0e00007a-0000-4000-8000-00000e00007a",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton/Name",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent",
"jsonString": {
"name": "Name",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton/Name",
"nameEditable": true,
"enable": true,
"visible": true,
"localize": true,
"displayOrder": 0,
"pathConstraints": "/////",
"revision": 1,
"origin": {
"type": "Model",
"entry_id": "UIText",
"sub_entity_id": null,
"root_entity_id": null,
"replaced_model_id": null
},
"modelId": "uitext",
"@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": 115,
"y": 135
},
"OffsetMin": {
"x": -115,
"y": 81
},
"Pivot": {
"x": 0.5,
"y": 0.5
},
"RectSize": {
"x": 230,
"y": 54
},
"UIMode": 1,
"UIScale": {
"x": 1,
"y": 1,
"z": 1
},
"UIVersion": 2,
"anchoredPosition": {
"x": 0,
"y": 108
},
"Position": {
"x": 0,
"y": 108,
"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,
"g": 0,
"b": 0,
"a": 0
},
"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
},
{
"@type": "MOD.Core.TextComponent",
"Alignment": 4,
"Bold": true,
"DropShadow": false,
"DropShadowAngle": 30,
"DropShadowColor": {
"r": 0,
"g": 0,
"b": 0,
"a": 0.72
},
"DropShadowDistance": 32,
"Font": 0,
"FontColor": {
"r": 0.94,
"g": 0.74,
"b": 0.26,
"a": 1
},
"FontSize": 34,
"MaxSize": 34,
"MinSize": 8,
"OutlineColor": {
"r": 0.08,
"g": 0.08,
"b": 0.08,
"a": 1
},
"OutlineDistance": {
"x": 1,
"y": -1
},
"OutlineWidth": 1,
"Overflow": 0,
"OverrideSorting": false,
"Padding": {
"left": 0,
"right": 0,
"top": 0,
"bottom": 0
},
"SizeFit": false,
"Text": "사일런트",
"UseOutLine": true,
"Enable": true
}
],
"@version": 1
}
},
{
"id": "0e000084-0000-4000-8000-00000e000084",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton/Portrait",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent",
"jsonString": {
"name": "Portrait",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton/Portrait",
"nameEditable": true,
"enable": true,
"visible": true,
"localize": true,
"displayOrder": 1,
"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": 71,
"y": 79
},
"OffsetMin": {
"x": -71,
"y": -63
},
"Pivot": {
"x": 0.5,
"y": 0.5
},
"RectSize": {
"x": 142,
"y": 142
},
"UIMode": 1,
"UIScale": {
"x": 1,
"y": 1,
"z": 1
},
"UIVersion": 2,
"anchoredPosition": {
"x": 0,
"y": 8
},
"Position": {
"x": 0,
"y": 8,
"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.26,
"g": 0.5,
"b": 0.34,
"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": "0e00008e-0000-4000-8000-00000e00008e",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton/Desc",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent",
"jsonString": {
"name": "Desc",
"path": "/ui/DefaultGroup/CharacterSelectHud/BanditButton/Desc",
"nameEditable": true,
"enable": true,
"visible": true,
"localize": true,
"displayOrder": 2,
"pathConstraints": "/////",
"revision": 1,
"origin": {
"type": "Model",
"entry_id": "UIText",
"sub_entity_id": null,
"root_entity_id": null,
"replaced_model_id": null
},
"modelId": "uitext",
"@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": 115,
"y": -80
},
"OffsetMin": {
"x": -115,
"y": -130
},
"Pivot": {
"x": 0.5,
"y": 0.5
},
"RectSize": {
"x": 230,
"y": 50
},
"UIMode": 1,
"UIScale": {
"x": 1,
"y": 1,
"z": 1
},
"UIVersion": 2,
"anchoredPosition": {
"x": 0,
"y": -105
},
"Position": {
"x": 0,
"y": -105,
"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,
"g": 0,
"b": 0,
"a": 0
},
"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
},
{
"@type": "MOD.Core.TextComponent",
"Alignment": 4,
"Bold": false,
"DropShadow": false,
"DropShadowAngle": 30,
"DropShadowColor": {
"r": 0,
"g": 0,
"b": 0,
"a": 0.72
},
"DropShadowDistance": 32,
"Font": 0,
"FontColor": {
"r": 0.86,
"g": 0.9,
"b": 0.94,
"a": 1
},
"FontSize": 20,
"MaxSize": 20,
"MinSize": 8,
"OutlineColor": {
"r": 0.08,
"g": 0.08,
"b": 0.08,
"a": 1
},
"OutlineDistance": {
"x": 1,
"y": -1
},
"OutlineWidth": 1,
"Overflow": 0,
"OverrideSorting": false,
"Padding": {
"left": 0,
"right": 0,
"top": 0,
"bottom": 0
},
"SizeFit": false,
"Text": "독·단검·드로우",
"UseOutLine": true,
"Enable": true
}
],
"@version": 1
}
},
{
"id": "0e000071-0000-4000-8000-00000e000071",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent",
"jsonString": {
"name": "MageButton",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton",
"nameEditable": true,
"enable": true,
"visible": true,
"localize": true,
"displayOrder": 13,
"pathConstraints": "////",
"revision": 1,
"origin": {
"type": "Model",
"entry_id": "UIButton",
"sub_entity_id": null,
"root_entity_id": null,
"replaced_model_id": null
},
"modelId": "uibutton",
"@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": 675,
"y": 205
},
"OffsetMin": {
"x": 405,
"y": -125
},
"Pivot": {
"x": 0.5,
"y": 0.5
},
"RectSize": {
"x": 270,
"y": 330
},
"UIMode": 1,
"UIScale": {
"x": 1,
"y": 1,
"z": 1
},
"UIVersion": 2,
"anchoredPosition": {
"x": 540,
"y": 40
},
"Position": {
"x": 540,
"y": 40,
"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.16,
"g": 0.2,
"b": 0.26,
"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": true,
"Type": 1,
"Enable": true
},
{
"@type": "MOD.Core.ButtonComponent",
"Colors": {
"NormalColor": {
"r": 1,
"g": 1,
"b": 1,
"a": 1
},
"HighlightedColor": {
"r": 0.9607843,
"g": 0.9607843,
"b": 0.9607843,
"a": 1
},
"PressedColor": {
"r": 0.784313738,
"g": 0.784313738,
"b": 0.784313738,
"a": 1
},
"SelectedColor": {
"r": 0.9607843,
"g": 0.9607843,
"b": 0.9607843,
"a": 1
},
"DisabledColor": {
"r": 0.784313738,
"g": 0.784313738,
"b": 0.784313738,
"a": 0.5019608
},
"ColorMultiplier": 1,
"FadeDuration": 0.1
},
"ImageRUIDs": {
"HighlightedSprite": null,
"PressedSprite": null,
"SelectedSprite": null,
"DisabledSprite": null
},
"KeyCode": 0,
"OverrideSorting": false,
"Transition": 1,
"Enable": true
}
],
"@version": 1
}
},
{
"id": "0e00007b-0000-4000-8000-00000e00007b",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton/Name",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent",
"jsonString": {
@@ -235007,7 +235736,7 @@
}
},
{
"id": "0e000084-0000-4000-8000-00000e000084",
"id": "0e000085-0000-4000-8000-00000e000085",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton/Portrait",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent",
"jsonString": {
@@ -235148,7 +235877,7 @@
}
},
{
"id": "0e00008e-0000-4000-8000-00000e00008e",
"id": "0e00008f-0000-4000-8000-00000e00008f",
"path": "/ui/DefaultGroup/CharacterSelectHud/MageButton/Desc",
"componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent",
"jsonString": {