# Передача Original Raw III · 3.1.0 в [Claude](https://claude.ai/)

Перенести выбранное третье направление в существующую игру, сохранив её правила и данные. Визуальная цель — максимальная близость к первой версии: маленький, простой, немного неказистый герой, плоские полки, много неба, функциональные падения и разрушения. Не добавлять полировку второго направления и не возвращать пиксельный рисунок автоматически.

## Начало работы

1. Прочитать [готовое первое сообщение](../CLAUDE_PROMPT.md), [правила рисунка](STYLE_LOCK.md), [матрицу экранов](SCREEN_MATRIX.md) и [результат проверки](QA.md).
2. В корне распакованной папки выполнить `python3 verify_package.py`, затем `python3 preview.py`. Сервер сам выбирает свободный порт и печатает адрес. Для фиксированного порта: `python3 preview.py --port 8879`.
3. Открыть [борд](../index.html), [интерактивные экраны](../screens.html?screen=menu), [каталог PNG](../assets.html) и [сравнение версий](../versions.html).
4. Сохранить существующий проект игры в отдельной открываемой версии. Изучить его реальный стек, игровой цикл, сохранения, экономику и серверные контракты до переноса.

Для просмотра нужны только Python 3 и браузер. Пакет самодостаточен, без соседних папок. Ссылки на прежние онлайн-борды и источники гор справочные; текущий рисунок работает локально без них. Архив первой игры — `reference/original-game.html`; открываемый изолированный образец — [original-preview.html](../reference/original-preview.html), где сетевые обращения запрещены, а старые emoji заменены текстом. Архив не является новым runtime.

## Состав и источник истины

В комплекте 28 экранов/демонстраций, 30 вещей, 4 температурные формы, 13 гор × 2 освещения и 134 PNG. Отдельная сцена событий показывает прыжок, разрушение полки, камнепад, ледопад и срыв. Состав игровых состояний и справочных страниц разделён в [SCREEN_MATRIX.md](SCREEN_MATRIX.md).

| Файл | Назначение |
| --- | --- |
| `tokens.js` | Стабильные игровые ID, цены, высоты, лагеря и исходные физические константы. |
| `original-tokens.js` | Визуальные параметры Raw: системные шрифты, цвета, сглаживание, область касания от 50 логических px. |
| `asset-manifest.js` | Начальный реестр известных ID; старые пути в нём заменяются текущими raw-рендерерами до загрузки изображений. |
| `draw-ui.js`, `draw-hero.js`, `draw-objects.js` | Совместимые API и базовые помощники. Загружаются перед raw-слоем. |
| `raw-art.js` | Каноническая геометрия героя, одежды, предметов и значков — 108 нефоновых ID. |
| `raw-mountains.js` | 13 силуэтов, 26 дневных/ночных фонов, палитры и редкая погода. |
| `raw-ui.js` | Панели, кнопки и переключатели выбранного простого рисунка. |
| `screens.js` | Композиции экранов; возвращает области действий и описание поля имени. |
| `app.js` | Изолированная интерактивная лаборатория, тестовый кошелёк, рейтинги и упрощённая симуляция. |
| `board.js`, `effects.js` | Борд, примерка, атлас гор и отдельные демонстрации событий. |
| `assets-raw-v3-1-final/manifest.json` | Единственный текущий каталог 134 PNG: размеры, привязки и SHA-256. |
| `assets.html`, `versions.html` | Просмотр материалов и сравнение с прежними версиями. |
| `preview.py`, `verify_package.py` | Переносимый локальный сервер и проверка состава перед передачей. |
| `export-art.cjs`, `render-review.cjs` | Повторный экспорт геометрии и экранов в новую папку. |
| `tests/` | Воспроизводимые локальные проверки пакета. Их область и результат описаны в QA. |

Порядок скриптов такой же, как в `screens.html`:

```text
asset-manifest → tokens → original-tokens
→ draw-ui → draw-hero → draw-objects
→ raw-art → raw-mountains → raw-ui → screens → app
```

`asset-manifest.js` содержит исторические пути и метаданные начального реестра. Это bootstrap, а не инструкция искать пропавшую папку `assets/`. `raw-art.js` заменяет 108 нефоновых записей, `raw-mountains.js` создаёт 26 фонов. К моменту загрузки `app.js` все 134 `src` — локальные `data:image/png` из текущей геометрии. Не загружать изображения и не рисовать игру до выполнения обоих raw-файлов. Не подключать чужой рендерер после них: он может перезаписать выбранную геометрию.

## Координаты и API

Логический игровой кадр — **420×840**. Типичный экспорт — 840×1680. Точка героя — стопы, стандартная высота **52 логических px**. Камеру применять последовательно к предметам и герою; не смешивать координаты мира и экрана. Safe area верх/низ, масштаб и touch адаптировать к целевому приложению, сохранив композицию.

| API | Контракт |
| --- | --- |
| `D.hero.draw(ctx, state, assets, options)` | `state.x`, `state.feetY`, `state.facing` ±1, `state.pose`, `state.vx/vy/airborne`; `state.equipment` или `options.equipment` с `helmet/suit/pants/pack`. `options.height` по умолчанию 52. |
| `D.objects.platform(ctx, assets, spec)` | `spec.x` — центр, `spec.y` — верх для контакта; `width/height/type`; `breakProgress` от 0 до 1. Рисунок разрушения сам не меняет коллизию. |
| `D.objects.rope(ctx, assets, tier, x, y, height)` | `x` — ось, `y` — верх, `height` — длина. Возвращает `{x,top,bottom,width}`. Бухта `object-rope` — отдельный значок инвентаря. |
| `D.objects.ropePreview(time)` | Справочное движение для героя высотой 68 px. Возвращает верёвку и `actor`, включая мировую точку хвата `ropeGrip` на фазе подъёма. Не production-физика. |
| `D.originalMountains.render(ctx, options)` | Полный фон 420×840; `options.peak`, `theme: dawn/night`, `cameraY`, `dim`. Имя API сохранено для совместимости, источник — `raw-mountains.js`. |
| `D.objects.background(ctx, assets, state, options)` | Обёртка фона, выбирающая также контекст погоды. `D.objects.snow` рисует редкую погоду соответствующей горы. |
| `D.objects.asset(ctx, assets, id, x, y, w, h, options)` | Элемент каталога; `fit: contain`, `alpha`. Нефоновые элементы рисуются геометрией; для фонового растрового fallback нужны загруженные изображения. |
| `D.objects.life(ctx, assets, x, y, w, h, full)` | Заполненное или пустое сердце. Заполненная жизнь не требует несуществующего `icon-life`; в каталоге есть `icon-life-empty`. |
| `D.screens.render(ctx, id, state, assets, simulation, time)` | Рисует композицию и возвращает `{hits,input,route}`. `hits` содержат action/payload/label, координаты, размер и disabled; `input` описывает нативное поле имени. |

Пример вызова героя в Canvas-движке после загрузки рендереров:

```js
D.hero.draw(ctx, {
  x: player.x,
  feetY: player.feetY - cameraY,
  facing: player.facing,
  vx: player.vx,
  vy: player.vy,
  airborne: player.airborne,
  equipment: equipped
}, assets, {height: 52, gear: thermalForm});
```

Это пример адаптера отрисовки, не замена обновления физики. В другом движке нужно воспроизвести ту же геометрию, масштаб и порядок слоёв средствами этого движка.

## Герой, одежда и PNG

Термослой задаётся `options.gear` или `state.suit`: `default/red`, `blue`, `purple`, `highalt`. Выбранная магазинная одежда — отдельный `equipment.suit`. Не смешивать эти два значения. Явные `effectiveTier` и `naturalTier` принимают числа 0–3: первый управляет видом утепления, второй сохраняет естественное высотное состояние. Кислород включается при `naturalTier:3` либо явном кислородном бонусе `packOverride:'oxygen'`. `heldAxe:true` показывает ледоруб в руке.

Цельные костюмы `pink`, `spider`, `ev` задают собственные ноги; выбранные штаны сохраняются в данных и возвращаются после снятия комбинезона. Сам цельный костюм кислород не включает. Кислородный баллон заменяет рюкзак, а `pack:none` скрывает обычный рюкзак. Точка `actor.ropeGrip` передаётся в координатах той же сцены, что `x/feetY`; рендерер учитывает поворот и масштаб.

PNG `hero-*` — **одиночные справочные изображения**, даже если сохранённый ID содержит `jump`, `smooth` или `16`. Их размер 288×384; точка стоп нормализована `{x:0.5,y:0.9375}`, то есть `(144,360)` в этом PNG. `frameCount:1`, `role:hero-reference`. Живая анимация процедурная. PNG одежды — каталожные кадры; их нельзя просто складывать поверх готового полного героя. Это вернёт старые ноги, каску и рюкзак под новыми.

Группы магазина: 10 касок, 7 костюмов, 6 штанов, 7 рюкзаков. Сохранить ID, цены, пороги хардкора, награды, лагеря и игровые высоты. `spider` получил собственный рисунок узла верёвки, но его ID не менялся. Упрощённые горы — художественные виды, а не карты реальных маршрутов; источники форм сохранены в `reference/WEST_SOURCES.md` и `reference/EAST_SOURCES.md`.

## Поведение лаборатории и реальной игры

Лаборатория показывает обычный режим, хардкор с одной жизнью, программу «Семь вершин», покупку/надевание, подтверждение, ввод имени и состояния рейтинга. Повторное подтверждение не списывает тестовый баланс второй раз; переключение программы выбирает видимую гору. Демонстрационный путь новых «Семи вершин» начинается с Карстенса после четырёх пройденных гор из intro, затем идёт Винсон, Килиманджаро и `seven-win`. Это отображение состояния для проверки дизайна; реальный прогресс должен приходить из игры.

`app.js` не содержит полного игрового runtime. Кошелёк, владение вещами, имя, рейтинг и сохранённый забег — изолированные данные памяти страницы. Нет реального звука, API рейтинга, покупок, долговременного сохранения и восстановления чекпоинта: `recover` создаёт новую справочную симуляцию. Боковой инспектор, автопилот, переключение кошелька, фильтры борда и экспорт — инструменты разработчика, не интерфейс игрока.

Прыжок использует упрощённые платформы. Камни, лёд и разрушение в `effects.js` — отдельная сцена рисунка без production-коллизий. Перенос через края и удержание произвольной половины экрана из оригинала остаются в реальной игре; лаборатория показывает стрелки/A–D, нижние кнопки и ограничивает позицию краями.

Режим «Мягко» — темп показа 0,78× и сглаживание камеры 150 мс; исходный темп доступен отдельно. Не заменять этими параметрами реальные игровые правила без решения пользователя. Скрытие страницы и reduced motion ставят демонстрацию на паузу. Области Canvas-действий дублируются DOM-кнопками; поле имени является настоящим input. На целевом runtime нужны его собственные доступные контролы и проверка touch/клавиатуры/экранного диктора.

## Порядок интеграции и приёмка

1. Герой, одна полка и выбранная гора в реальном забеге: сравнить масштаб, стопы, камеру и свободное небо с бордом.
2. Все вещи и термослои в обе стороны, рюкзак/кислород, `pack:none`, верёвка, ледоруб, опасности и лагеря. Сохранить физику и коллизии игры.
3. Игровые экраны и состояния из [матрицы](SCREEN_MATRIX.md): связать `hits` с реальным состоянием, покупками, сохранениями и маршрутизацией.
4. Проверить обычный режим, хардкор, «Семь вершин», повторную покупку, отказ/нехватку средств, сетевые ошибки, восстановление, имя и рейтинг.
5. На целевом приложении проверить RU/EN, safe areas, узкий экран, touch, паузу при уходе в фон, reduced motion, память и производительность. Сравнить кадры с живым бордом и [финальным экспортом экранов](../evidence/ready-v3-1/final-screens/screens-1.png).

Не копировать лабораторный `app.js` поверх исходного игрового цикла. Расхождения с реальным проектом фиксировать явно, не заменять неизвестное правило догадкой. Проверка Canvas и браузерного пакета не подтверждает работу нативной сборки. Этот комплект не является поданной или одобренной сборкой и не обещает одобрение магазина приложений.

## Экспорт и следующие обновления

Новая итерация создаётся рядом с открываемой прежней. Источник стиля — эти исходники и PNG, а не название модели генерации. В лаборатории «Сохранить кадр» экспортирует текущее состояние; «Все экраны» — набор справочных PNG; запись WebM — только демонстрация прыжка и зависит от поддержки браузером.

Повторный экспорт исходной геометрии требует Node.js и [@napi-rs/canvas](https://github.com/Brooooooklyn/canvas) `0.1.100`. Можно использовать установленный в проекте пакет либо `CANVAS_MODULE` с путём к существующему модулю. Ничего устанавливать для просмотра борда не требуется.

```bash
node export-art.cjs ./new-assets-revision
node render-review.cjs ./new-screen-review
node tests/visual-check.cjs
```

Папка результата должна быть новой; скрипты не перезаписывают её. Сглаживание и шрифты Node могут незначительно отличаться от браузера, поэтому точный экранный образец — живой борд и его PNG-экспорт. Подробности исправлений: [CHANGELOG.md](CHANGELOG.md), [визуальная проверка](VISUAL_FIXES_3_1_0.md), [проверка взаимодействий](INTERACTION_FIXES_3_1_0.md).
