docs(harness): RULES/CLAUDE/settings를 현재 저장소 상태와 동기화 #63
@@ -2,17 +2,19 @@
|
|||||||
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"deny": [
|
"deny": [
|
||||||
"Read(./ui/DefaultGroup.ui)",
|
"Read(./ui/*.ui)",
|
||||||
"Read(./map/*.map)",
|
"Read(./map/*.map)",
|
||||||
"Read(./RootDesk/MyDesk/SlayDeckController.codeblock)",
|
"Read(./RootDesk/MyDesk/*.codeblock)",
|
||||||
"Edit(./ui/DefaultGroup.ui)",
|
"Edit(./ui/*.ui)",
|
||||||
"Edit(./map/*.map)",
|
"Edit(./map/*.map)",
|
||||||
"Edit(./RootDesk/MyDesk/SlayDeckController.codeblock)",
|
"Edit(./RootDesk/MyDesk/*.codeblock)",
|
||||||
"Edit(./Global/common.gamelogic)",
|
"Edit(./Global/common.gamelogic)",
|
||||||
"Write(./ui/DefaultGroup.ui)",
|
"Edit(./Global/SectorConfig.config)",
|
||||||
|
"Write(./ui/*.ui)",
|
||||||
"Write(./map/*.map)",
|
"Write(./map/*.map)",
|
||||||
"Write(./RootDesk/MyDesk/SlayDeckController.codeblock)",
|
"Write(./RootDesk/MyDesk/*.codeblock)",
|
||||||
"Write(./Global/common.gamelogic)"
|
"Write(./Global/common.gamelogic)",
|
||||||
|
"Write(./Global/SectorConfig.config)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# SlayMaple — CLAUDE.md
|
# SlayMaple — CLAUDE.md
|
||||||
|
|
||||||
MapleStory Worlds 기반 Slay the Spire 풍 덱빌더. 게임 전체가 데이터(`data/*.json`) + 생성기(`tools/`) 단일 소스이고, `ui/DefaultGroup.ui`(8.3MB)·codeblock·map 파일은 **생성 산출물**이다.
|
MapleStory Worlds 기반 Slay the Spire 풍 덱빌더. 게임 전체가 데이터(`data/*.json`) + 생성기(`tools/`) 단일 소스이고, `ui/DefaultGroup.ui`(~7.1MB)·codeblock·map 파일은 **생성 산출물**이다.
|
||||||
|
|
||||||
@RULES.md
|
@RULES.md
|
||||||
|
|
||||||
|
|||||||
26
RULES.md
26
RULES.md
@@ -11,13 +11,29 @@ Claude Code는 `CLAUDE.md`가 이 파일을 임포트하므로 자동 적용된
|
|||||||
|
|
||||||
| 산출물 (절대 Read/Edit 금지) | 크기 | 단일 소스 (여기만 편집) | 재생성 명령 |
|
| 산출물 (절대 Read/Edit 금지) | 크기 | 단일 소스 (여기만 편집) | 재생성 명령 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `ui/DefaultGroup.ui` | **8.3MB** | `data/*.json` + `tools/deck/gen-slaydeck.mjs` | `node tools/deck/gen-slaydeck.mjs` |
|
| `ui/DefaultGroup.ui` | **~7.1MB** | `data/*.json` + `tools/deck/gen-slaydeck.mjs` | `node tools/deck/gen-slaydeck.mjs` |
|
||||||
| `RootDesk/MyDesk/SlayDeckController.codeblock` | 132KB | 〃 | 〃 |
|
| `RootDesk/MyDesk/SlayDeckController.codeblock` | ~270KB | 〃 | 〃 |
|
||||||
| `Global/common.gamelogic` | 1KB | 〃 | 〃 |
|
| `Global/common.gamelogic` | ~1KB | 〃 | 〃 |
|
||||||
| `map/map01.map`~`map11.map` | 각 ~200KB | `tools/map/`·`tools/monster/`·`tools/camera/` | 해당 생성기 |
|
| `map/map01.map`~`map05.map`, `map/lobby.map` | 각 ~210KB | `tools/map/`·`tools/monster/`·`tools/camera/`·`tools/player/` (↓ 보조 생성기) | 해당 생성기 |
|
||||||
|
| `RootDesk/MyDesk/CombatMonster.codeblock` | ~2KB | `tools/monster/gen-combat-monster.mjs` | `node tools/monster/gen-combat-monster.mjs` |
|
||||||
|
| `RootDesk/MyDesk/PlayerLock.codeblock` | ~2KB | `tools/player/gen-player-lock.mjs` | `node tools/player/gen-player-lock.mjs` |
|
||||||
|
| `RootDesk/MyDesk/MapCamera.codeblock` | ~2KB | `tools/camera/gen-camera.mjs` (값: `data/camera.json`) | `node tools/camera/gen-camera.mjs` |
|
||||||
|
| `RootDesk/MyDesk/LobbyNpc.codeblock`·`LobbyMobility.codeblock` | 각 ~2-3KB | `tools/player/gen-lobby-npc.mjs` | `node tools/player/gen-lobby-npc.mjs` |
|
||||||
|
| `Global/SectorConfig.config` | ~1KB | `tools/map/gen-maps.mjs`·`gen-lobby-map.mjs` (패치) | 해당 생성기 |
|
||||||
|
|
||||||
- `.claude/settings.json`의 permissions.deny가 위 파일의 Read/Edit/Write 도구 사용을 차단한다 (이 저장소를 열면 자동 적용).
|
- `.claude/settings.json`의 permissions.deny가 위 파일의 Read/Edit/Write 도구 사용을 차단한다 (이 저장소를 열면 자동 적용). deny는 **glob** — `ui/*.ui`·`map/*.map`·`RootDesk/MyDesk/*.codeblock`·`Global/common.gamelogic`·`Global/SectorConfig.config`. 따라서 **메이커 저작 codeblock/UI**(`Monster`·`MonsterAttack`·`PlayerAttack`·`PlayerHit`·`UIPopup`·`UIToast`.codeblock, `ui/PopupGroup.ui`·`ui/ToastGroup.ui`)**도** Read/Edit 금지 — 이들은 생성기가 없으니 **메이커에서** 편집한다(텍스트 도구로 X). codeblock은 한 줄짜리 JSON이라 Read 시 토큰 폭발.
|
||||||
- 게임 로직·UI 수정 = **`tools/deck/gen-slaydeck.mjs`(생성기 JS) 또는 `data/*.json`(데이터)을 수정** → 재생성 → 산출물은 통째로 커밋.
|
- 게임 로직·UI 수정 = **`tools/deck/gen-slaydeck.mjs`(생성기 JS) 또는 `data/*.json`(데이터)을 수정** → 재생성 → 산출물은 통째로 커밋.
|
||||||
|
- **보조 생성기**(각자 자기 산출물의 단일 소스 — 위 표의 메인 `gen-slaydeck.mjs` 외):
|
||||||
|
- `tools/camera/gen-camera.mjs` → `MapCamera.codeblock` + map01~05 카메라 부착 (값 `data/camera.json`)
|
||||||
|
- `tools/map/gen-maps.mjs` → `map02~05` + `Global/SectorConfig.config` (map01 템플릿 클론)
|
||||||
|
- `tools/map/gen-lobby-map.mjs` → `map/lobby.map` + `SectorConfig.config`
|
||||||
|
- `tools/map/gen-map-encounters.mjs` → map01~05 노드 타입별 몬스터 그룹 재구성
|
||||||
|
- `tools/monster/gen-combat-monster.mjs` → `CombatMonster.codeblock` + map01~05 부착
|
||||||
|
- `tools/monster/freeze-turn-monsters.mjs` → 몬스터 `.model`·맵 AI 컴포넌트 제거
|
||||||
|
- `tools/player/gen-player-lock.mjs` → `PlayerLock.codeblock` + map01~05 부착
|
||||||
|
- `tools/player/gen-lobby-npc.mjs` → `LobbyNpc.codeblock`·`LobbyMobility.codeblock`
|
||||||
|
- `tools/player/freeze-turn-player.mjs` → `Global/DefaultPlayer.model` 이동 0 고정
|
||||||
|
- `tools/deck/gen-cardhand.mjs` → `DefaultGroup.ui` 카드핸드 보조 패처
|
||||||
|
|
||||||
## 2. 산출물 검증은 카운트로, 내용 출력 금지
|
## 2. 산출물 검증은 카운트로, 내용 출력 금지
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -95,6 +95,9 @@ for (const t of ['combat', 'elite', 'boss', 'shop', 'rest', 'treasure']) {
|
|||||||
}
|
}
|
||||||
if (!/^[0-9a-f]{32}$/.test(NODEICONS.background || '')) throw new Error('[gen-slaydeck] nodeicons.json background RUID 누락/형식오류');
|
if (!/^[0-9a-f]{32}$/.test(NODEICONS.background || '')) throw new Error('[gen-slaydeck] nodeicons.json background RUID 누락/형식오류');
|
||||||
|
|
||||||
|
// 전투 카메라 고정값(StS2: 플레이어 좌·몬스터 우). KickCombatCamera가 StartCombat에서 재confine에 사용.
|
||||||
|
const CAM = JSON.parse(readFileSync('data/camera.json', 'utf8'));
|
||||||
|
|
||||||
const RELICS = JSON.parse(readFileSync('data/relics.json', 'utf8'));
|
const RELICS = JSON.parse(readFileSync('data/relics.json', 'utf8'));
|
||||||
if (!RELICS.relics[RELICS.startingRelic]) throw new Error(`[gen-slaydeck] startingRelic 없음: ${RELICS.startingRelic}`);
|
if (!RELICS.relics[RELICS.startingRelic]) throw new Error(`[gen-slaydeck] startingRelic 없음: ${RELICS.startingRelic}`);
|
||||||
for (const id of RELICS.relicPool) {
|
for (const id of RELICS.relicPool) {
|
||||||
@@ -3437,7 +3440,25 @@ self:ApplySoulUnlocks()
|
|||||||
self:RenderPotions()
|
self:RenderPotions()
|
||||||
self:TeleportToActMap()
|
self:TeleportToActMap()
|
||||||
self:ShowMap()`),
|
self:ShowMap()`),
|
||||||
|
method('KickCombatCamera', `local cam = nil
|
||||||
|
local lp = _UserService.LocalPlayer
|
||||||
|
if lp ~= nil then cam = lp.CameraComponent end
|
||||||
|
if cam == nil then cam = _CameraService:GetCurrentCameraComponent() end
|
||||||
|
if cam ~= nil then cam.ConfineCameraArea = false end
|
||||||
|
_TimerService:SetTimerOnce(function()
|
||||||
|
local cc = nil
|
||||||
|
local lp2 = _UserService.LocalPlayer
|
||||||
|
if lp2 ~= nil then cc = lp2.CameraComponent end
|
||||||
|
if cc == nil then cc = _CameraService:GetCurrentCameraComponent() end
|
||||||
|
if cc ~= nil then
|
||||||
|
cc.ZoomRatio = ${CAM.zoomRatio}
|
||||||
|
cc.CameraOffset = Vector2(${CAM.cameraOffsetX}, ${CAM.cameraOffsetY})
|
||||||
|
cc.ScreenOffset = Vector2(${CAM.screenOffsetX}, ${CAM.screenOffsetY})
|
||||||
|
cc.ConfineCameraArea = true
|
||||||
|
end
|
||||||
|
end, 0.2)`),
|
||||||
method('StartCombat', `self:ShowState("combat")
|
method('StartCombat', `self:ShowState("combat")
|
||||||
|
self:KickCombatCamera()
|
||||||
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/Result", false)
|
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/Result", false)
|
||||||
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/PotionMenu", false)
|
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/PotionMenu", false)
|
||||||
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/TooltipBox", false)
|
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/TooltipBox", false)
|
||||||
|
|||||||
Reference in New Issue
Block a user