# 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 комнат + объекты (фонари/свет). Карта стартует пустой; персонажи создаются **спавнером** (панель внизу: кнопки типов `+ Раб/Монстр/Ребёнок/Игрок` для случайного, или выпадающий список конкретного персонажа + «Заспавнить») и **стоят в idle**, пока их не перетащат. - **Типы персонажей** (Игрок/Раб/Монстр/Ребёнок) + генерация имён. - **Тематические комнаты со слотами по типу**: Дойка = 2 раба + 4 ребёнка, Логово = 1 раб + 1 монстр. Перетаскивание в подходящий слот меняет скелет на состояние комнаты и играет одиночную/групповую анимацию. Над комнатами — окна с именами. - **ЛКМ** — выбрать/тащить (в комнату или на пол — там персонаж просто стоит). **ПКМ** — убрать персонажа в **инвентарь** (панель справа; клик — вернуть). - `WASD`/ЛКМ-фон — панорама, колесо — зум, `R` — сброс, `Esc` — меню. 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//_native.tscn`. ## Управление **Персонажи:** | Клавиша | Действие | |---|---| | `Q` / `E` | предыдущий / следующий персонаж | | `W` / `S` (↑ / ↓) | предыдущее / следующее состояние | | `A` / `D` (← / →) | предыдущая / следующая анимация | | колесо мыши | зум | | `Пробел` | перезапустить анимацию | | `R` | сбросить вид | **Текстуры (галерея):** | Клавиша | Действие | |---|---| | `A` / `D` (← / →) | предыдущая / следующая картинка | | `W` / `S` (↑ / ↓) | предыдущая / следующая категория (папка) | | колесо мыши | зум · `R` — сброс | ## Структура ``` characters/ — персонажи /*_native.tscn — НАТИВНЫЕ сцены (Skeleton2D + Polygon2D + AnimationPlayer) — то, что играется /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 tools/rig/geom`. 2. **`tools/convert_all.gd`** — один прогон: по каждой геометрии запекает анимации из Spine-рантайма (локальные трансформы костей + draw order покадрово) и **сохраняет** `characters//_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+.