# ProjectRR — нативный просмотрщик персонажей

Тестовый проект: персонажи и анимации, извлечённые из игры **ProjectR** и
**полностью переведённые в нативный Godot** (`Skeleton2D` + взвешенные `Polygon2D` +
`AnimationPlayer`). **Spine в рантайме не используется** — проект работает на обычном Godot.

## Требования к движку

Запуск/редактирование проекта — **обычный Godot 4.7.1 mono** (модуль Spine не нужен):

```
D:\Godot_v4.7.1\Godot_v4.7.1-stable_mono_win64.exe
```

Все персонажи уже нативные, поэтому Spine-сборка для игры не нужна. Офлайн-инструменты
пересборки (`tools/bake_anim.gd`, `tools/build_tscn.gd`, `tools/convert_all.gd`) требуют
отдельную **spine-godot 4.2**-сборку — но только если понадобится перегенерировать `.tscn`.

## Запуск

1. Открыть проект обычным Godot 4.6.1 mono.
2. Нажать ▶ (F5). Главная сцена — `scenes/MainMenu.tscn` (меню).

## Меню и сцены

Главное меню (`scenes/MainMenu.tscn`) ведёт на три сцены (назад в меню — `Esc`):

1. **Подземелье** (`scenes/Dungeon.tscn`) — разрез убежища à la Fallout Shelter: сетка 6×5
   комнат. ЛКМ/WASD — панорама, колесо — зум, `R` — сброс.
2. **Просмотр спрайтов** (`scenes/SpriteViewer.tscn`) — галерея вытащенных изображений
   (UI, фоны, эффекты, нарезанные спрайты). `A/D` — картинка, `W/S` — категория, колесо — зум.
3. **Нативные анимации** (`scenes/NativeViewer.tscn`) — браузер всех 38 персонажей нативно:
   `Q/E` — персонаж, `W/S` — состояние (скелет), `A/D` — анимация. Внизу — **кастомизация
   цвета** (Кожа / Волосы / Глаза + Сброс): части красятся шейдером `assets/recolor.gdshader`
   (замена оттенка с сохранением светотени) по имени слота.

Все **189 скелетов** (38 персонажей × их состояния) сконвертированы в нативные
`characters/<char>/<state>_native.tscn`.

## Управление

**Персонажи:**

| Клавиша | Действие |
|---|---|
| `Q` / `E` | предыдущий / следующий персонаж |
| `W` / `S` (↑ / ↓) | предыдущее / следующее состояние |
| `A` / `D` (← / →) | предыдущая / следующая анимация |
| колесо мыши | зум |
| `Пробел` | перезапустить анимацию |
| `R` | сбросить вид |

**Текстуры (галерея):**

| Клавиша | Действие |
|---|---|
| `A` / `D` (← / →) | предыдущая / следующая картинка |
| `W` / `S` (↑ / ↓) | предыдущая / следующая категория (папка) |
| колесо мыши | зум · `R` — сброс |

## Структура

```
characters/          — персонажи
  <name>/*_native.tscn — НАТИВНЫЕ сцены (Skeleton2D + Polygon2D + AnimationPlayer) — то, что играется
  <name>/spine/      — исходники Spine (.skel.bytes/.atlas.txt/.png). PNG нужны нативным сценам
                       как текстуры; .skel/.atlas — только для пересборки (можно удалить)
assets/              — прочее 2D-искусство (из AssetRipper-экспорта)
  fonts/             — шрифты игры (.ttf/.otf)
  ui/                — UI-скин: button/toggle/slider/window/textfield/scrollbar, Maininterface_*, Button_*
  backgrounds/       — фоны, дороги, лес, замок, небо
  fx/                — текстуры эффектов (Cartoon FX / cfxr)
  cursors/ icons/ misc/ — курсоры, иконки, логотип
  atlas/             — большие упакованные листы SpriteAtlas (UI/Room, 4096²) — сырые
  ui_sliced/         — 286 отдельных UI-спрайтов, нарезанных из атласа по Unity-разметке
  room_sliced/       — 15 спрайтов комнат из атласа
scenes/MainMenu.tscn — главное меню (главная сцена)
scenes/Dungeon.tscn / SpriteViewer.tscn / NativeViewer.tscn — три сцены из меню
src/MainMenu.cs      — меню (кнопки, тема из игрового арта)
src/NativeBrowser.cs — браузер всех нативных персонажей (сканирует *_native.tscn)
src/TextureGallery.cs — галерея текстур
src/RoomMap.cs       — карта убежища (сетка комнат, панорама/зум)
tools/convert_all.gd — ПАКЕТНАЯ конвертация всех скелетов в *_native.tscn
tools/bake_anim.gd   — запекатель анимаций одного скелета (Spine → кости, JSON)
tools/build_tscn.gd  — сборка одной .tscn из геометрии + запечённых анимаций
tools/spineconv/     — офлайн-экспортёр геометрии Spine → JSON (см. его README)
tools/rig/geom/*.json — выгруженная геометрия всех скелетов (для пересборки)
tools/slice_atlas.gd — нарезчик спрайтов из атласа (по tools/sprite_layout.json)
tools/sprite_layout.json — разметка спрайтов (имя, атлас, rect, 9-slice border)
```

## Как всё переведено в натив (Вариант B)

Все 189 скелетов конвертированы в нативный Godot. Пайплайн (нужна spine-godot 4.2-сборка):

1. **`tools/spineconv/`** (через `spine-csharp`) — выгружает геометрию рига каждого скелета
   в `tools/rig/geom/*.json` (кости + меши с вершинами/UV/треугольниками/весами).
   Batch: `spineconv --batch <characters> tools/rig/geom`.
2. **`tools/convert_all.gd`** — один прогон: по каждой геометрии запекает анимации из
   Spine-рантайма (локальные трансформы костей + draw order покадрово) и **сохраняет**
   `characters/<char>/<state>_native.tscn` (`Skeleton2D` + взвешенные `Polygon2D` +
   `AnimationPlayer`).

Готовые `.tscn` + атлас-PNG работают в **обычном Godot без модуля Spine** и редактируются
в редакторе (кости, веса, ключи, draw order через `z_index`).

Пересобрать всё: `godot-4.2-... --headless --path . --script res://tools/convert_all.gd`.

## Перенарезать спрайты из атласа

Разметка `tools/sprite_layout.json` получена из AssetRipper `Sprite/*.json`
(PathID→атлас: 129=UI, 49/128=Room; координаты Unity снизу-вверх → нарезка делает flip по Y).
Повторная нарезка:

```
godot-4.2-4.6.1-stable-mono.exe --headless --path . --script res://tools/slice_atlas.gd
```

Не переносилось (движковый/Unity-мусор): водяные знаки и сплэши Unity, lookup-текстуры
пост-обработки (BayerMatrix, AreaTex, SearchTex, Falloff*, LDR_LLL1_* дизеринг),
TMP-атласы шрифтов, редакторные UI-иконки, White1px/none.

## Примечания

- В игре **каждое состояние персонажа — отдельный скелет**, поэтому смена состояния
  инстанцирует другую `.tscn`.
- Среди анимаций встречаются рабочие огрызки аниматора (`dd`, `dfdfa`, `test` и т.п.) —
  показываются все как есть.
- Анимации с **деформацией мешей** конвертер не переносит (только кости); у elf1 их нет,
  у некоторых персонажей отдельные части могут быть чуть «жёстче» оригинала.
- Контент игры 18+.
