Lua는 Prepared(예비)에서 AddCardBlock으로 실제 방어를 부여하는데, JS
시뮬은 blockGained(통계 카운터)만 증가시키고 addBlock을 호출하지 않아
플레이어가 실제 방어를 못 받았다(시뮬이 방어를 과소집계).
JS도 다른 블록 출처처럼 addBlock 경유로 변경(Lua 동기화). 또한
Prepared 데이터는 discard:1 + blockPerDamageDealtThisTurn뿐(draw 없음)
인데 설명이 "1장 뽑고 1장 버립니다"로 부정확해, 실제 동작(1장 버리고
이번 턴 피해만큼 방어)에 맞게 보강. RED-GREEN 테스트 추가. 88개.
산출물 재생성 포함.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UUvHKjrt8jqLzDeCsRRGmj
메이커 저작(964cf7c)에서 map01에 수작업 배치한 몬스터
octopus·kapa_drake·junior_neki·junior_bugi(combat) / dile·mano(elite)의
EnemyId가 enemies.json에 미등록 상태였다. 전투 시 BuildMonsters가
self.Enemies[id]=nil → fallback {maxHp=10, intents={{Attack,5}}}(단일 intent)
으로 떨어져, EnemyActStep의 math.random(1,#intents)가 random(1,1)이 되어
항상 "공격 5"만 반복 → 행동 랜덤화 불가·이름 raw id·HP 10 고정.
수정: 6종을 기존 티어 밸런스(combat HP15~24/elite HP65~80, 다중 intent)에
맞춰 enemies.json에 등록하고 SlayDeckController.codeblock 재생성(산출물).
맵은 이미 해당 id를 참조하므로 맵 재생성 불필요(수작업 배치 유지).
검증: 전 맵 EnemyId 매핑 OK 33/MISSING 0, JS 미러 테스트 41/41.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- data/characters.json 신설(전사/법사/도적 초상화 RUID 단일 소스), 생성기 로드·검증
- CharacterSelectHud: 단색 박스 → 카드 전체 캐릭터 이미지(Art 풀블리드 258×318)
+ 하단 이름 배너(NameBanner), Portrait/Desc 제거
- RenderCharacterSelect: 선택 시 카드 테두리 금색(Art 6px 인셋 뒤로)
- BackButton 추가 + BindMenuButtons 바인딩 → ShowLobby(로비 복귀), prop CharBackHandler
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 도적 시작 직업을 선택 화면에서 활성화하고 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장 및 한글화 잔여 영어/깨짐 없음 확인
- relics.json goldIdol 설명 "골드"→"메소" (유일하게 남았던 표면 잔존 정정)
- CombatHud TopBar·ShopHud 메소 금액 옆에 금색 코인 아이콘 스프라이트 추가
(공식 RUID 흰박스 리스크 회피 위해 색상 채움 스프라이트 사용)
- 내부 식별자 self.Gold 등은 산출물 id 안정성 위해 유지. 산출물 재생성
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 정적 map.json·luaMapNodesTable·luaStartArray 제거
- GenerateMap: 경로 4개 걷기·행별 가중 타입·elite 연속 금지 (JS 미러 동기화)
- Depth/VisitedNodes prop, PickNode treasure 분기·층 갱신, 보스 클리어 시 새 맵
- TopBar '막 F/3 · D층', 메소 표기 시작
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 물약: 빨간 포션·화염병·전사의 물약·수호의 물약·마나 엘릭서·저주의 병
- 유물 19종 전체 icon RUID 부여, relicPool 18종으로 확장
- 장인의 벨트(물약 슬롯 5칸) 포함 — StS 효과 × 메이플 장비 외형
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- PositionMonsterSlot: 고정 좌표 대신 _UILogic:WorldToScreenPosition→ScreenToUIPosition 으로
각 몬스터 월드 위치 위(HEAD_OFFSET_Y)에 슬롯을 띄움 → 몬스터를 옮겨도 자동 추종
- 미사용 고정좌표 시스템 제거: SlotPos/ActiveSlotPos prop·StartRun 주입·SLOTS 로드·
luaSlotGroup·upsertUi 단언·data/monster-slots.json
- map01 엘리트(머쉬맘 x3·변형된 달팽이 x5)·보스(킹 슬라임 x4) 월드 위치를 우측으로 이동
메이커 검증: combat/elite/boss 각 노드에서 해당 그룹만 등장, HP바가 각 몬스터 머리 위에 표시.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- ReviveMonsterEntity/KillMonster의 StateComponent:ChangeState 제거
(client 실행공간에서 LEA-3022 InvalidExecSpace 발생) → SetVisible 기반 표시/숨김으로 대체
- monster-slots.json 좌표를 맵 우측 몬스터 무리 위로 조정
- 메이커 플레이테스트로 전체 전투 루프(등록·타겟·공격·적턴·처치·승리·보상) 무에러 확인
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
맵 로드 시 플레이어 CameraComponent를 data/camera.json 값(현재 map01: zoom100·screenOffset0.5/0.655·confine)으로 설정.
- data/camera.json: 카메라 framing 단일 설정
- tools/gen-camera.mjs: MapCamera.codeblock 생성 + 11맵 루트에 script.MapCamera 부착(idempotent)
- 새 CameraComponent 미생성(엔진 소유) — 기존 플레이어 카메라 속성만 런타임 설정
- OnBeginPlay(client, ExecSpace 6) + LocalPlayer 카메라 재시도 타이머
- 메이커 Play 검증: zoom 60 테스트로 적용 입증, 100으로 복원. idempotent·결정적
- 참고: 맵 루트 client 스크립트는 ExecSpace 6 필요(1은 미발동)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>