- Комнаты Спальня/Логово/Дойка со слотами - Перетаскивание в комнату: персонаж занимает слот, скелет меняется на состояние комнаты (milk/birth/...), играет одиночную (1) или групповую (2+) анимацию - Клетка сброса берётся по центру тела (фикс съезда на строку ниже) - Панель показывает назначение/слот/режим анимации Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
138 lines
9.5 KiB
Markdown
138 lines
9.5 KiB
Markdown
# 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
|
||
комнат, **тёмная шахта** (колонка тёмных комнат друг над другом = скрытая лестница;
|
||
персонаж заходит и проходит по ней на другой этаж, анимация — боевой `walk_0`),
|
||
**объекты** (фонари/свет) и **несколько персонажей** на этажах.
|
||
ЛКМ по персонажу — выбрать/тащить, ЛКМ по фону/WASD — панорама, колесо — зум, `R` — сброс.
|
||
**Тематические комнаты** (Спальня/Логово/Дойка) имеют слоты: при перетаскивании
|
||
персонажа в такую комнату он занимает слот, **меняет скелет на состояние комнаты**
|
||
и играет анимацию — **одиночную** (1 в комнате) или **групповую** (2+).
|
||
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+.
|