СТИХИИ (src/sim/element.h) Семь элементов, сопротивления свойством ВИДА, одна формула урона на пулю и на клинок. Зачем они в игре про бесконечный спуск: сила отряда растёт медленнее угрозы (закон масштаба, docs/20-gdd.md), и разрыв обязан закрываться знанием. Стихии — первый такой канал: верное оружие убивает втрое быстрее, и цифра эта не растёт от прокачки. Ручных действий не заводится: стихия — свойство оружия, а не кнопка. Всё решается тем, что отряд взял вниз. Стихии есть только у НАХОДИМОГО оружия. Карабин, пистолет и сабля остаются чистой кинетикой, потому что на них меряется приёмка. ИНСТРУМЕНТЫ БАЛАНСА (src/debug/tools.cpp) Вторая поверхность: `squad_proto --tool weapons|enemies|ttk|economy`. Отдельная от редакторской не по вкусу — редактор линкуется только с движком и правил боя не видит, а всё это считает урон. Инструменты делятся по ПРЕДМЕТУ: содержимое у редактора, баланс у игры. ЧТО НАШЛА ПРОВЕРКА Первая версия --tool ttk считала разброс по времени убийства и показывала уверенные 2.8x на каждой твари. Это была разница МОЩНОСТИ стволов: магнум лучше пистолета против всех, стихии ни при чём. С вынесенной за скобки мощностью оружия правда оказалась другой: 1.04-1.36x, то есть состав удара не значил почти ничего. Механика была декоративной ровно в том же смысле, в каком когда-то был вес. Чтобы разброс появился, у твари должны быть И уязвимость, И сопротивление среди тех стихий, которые вообще носит оружие: одной уязвимости мало, если ни один ствол не бьёт тем, что она держит. После правки содержимого все пять видов в коридоре 1.90-3.06x, и картина читается — дробовик жжёт бредущих, дуга бьёт плевков, лук разъедает громилу, карабин против громилы бесполезен. Коридор в инструменте 1.8-8.0, а не заявленные в документе 3-6: до тройки дотянут почти чистые стихийные сборки, которые приходят с аффиксами. Занижать цель в документе нельзя, поэтому в инструменте стоит достижимое. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
12 KiB
CLAUDE.md — оглавление
Этот файл — только навигация. Содержание живёт в docs/, по одному файлу на тему.
Читай нужный раздел, а не весь проект.
Документация
| Файл | О чём | Когда открывать |
|---|---|---|
| docs/00-overview.md | что это за прототип, границы задачи | первое знакомство |
| docs/01-build-and-run.md | сборка, запуск, управление, dev-режимы CLI | собрать и потыкать |
| docs/02-architecture.md | карта модулей, порядок шага симуляции, правила зависимостей | перед любой правкой кода |
| docs/03-rendering.md | софтверный фреймбуфер, изометрия, сортировка, спрайты | рендер, камера, спрайты |
| docs/04-world.md | тайлмап, планировка уровня, DDA-рейкаст, коллизии, мишени | карта, LOS, коллизии |
| docs/05-squad-ai.md | ядро: LaneClear, решатель огневых позиций, резерв линий, стрельба | поведение отряда |
| docs/06-debug-and-tuning.md | оверлей F1–F4, метрики, runtime-тюнинг, --set |
отладка и балансировка |
| docs/07-milestones.md | журнал вех M0–M6: что сделано и чем проверено | история и статус |
| docs/08-decisions.md | отклонения от спека и почему, с замерами | «почему тут не как в ТЗ» |
| docs/09-acceptance.md | критерии приёмки (спек 11) и их текущие цифры | приёмка |
| docs/10-atmosphere.md | хоррор-слой: свет, туман войны, трассеры, напряжение | картинка и атмосфера |
| docs/11-melee.md | ближний бой: сектор удара, три фазы, свой круг, дуга | клинки, классы оружия |
| docs/12-assets.md | ассеты: конвейер SpriteForge, манифесты, загрузчик, hot reload | добавить или пересобрать спрайт |
| docs/13-combat.md | бой: каталог оружия, твари, снаряжение, меню и HUD | оружие, враги, инвентарь, UI |
| docs/14-monsters.md | твари-ассеты: Blender-риг на пять морфологий, листы, проверки | нарисовать или пересобрать тварь |
| docs/15-engine-and-editor.md | движок и редактор: три цели сборки, каталог сущностей, формат комнат, генератор уровней | делать комнаты, менять генерацию, трогать границу движка |
| docs/16-descent.md | спуск: глубина как первичное понятие, бюджет опасности, лут, кривая сложности | менять сложность, добавлять тварей и лут |
| docs/17-extraction.md | экстракшен: эвакуация, профиль и схрон, чекпоинты, что теряется | правила забега, снаряжение между вылазками |
| docs/18-engine.md | Tile2D: границы движка, проекции 2D, формат проекта, второй проект | трогать движок, заводить проект, добавлять вид отображения |
| docs/19-agent.md | движок и ЛЛМ: инструменты --tool, скиллы, терминал в редакторе |
работать над проектом через claude/codex |
| docs/20-gdd.md | дизайн игры: акты, петли, рост отряда, закон масштаба, 200 часов | что и зачем строим дальше |
| docs/21-damage.md | урон: семь стихий, статусы, реакции, формулы, триггеры | боевая математика |
| docs/22-loot.md | добыча: редкости, аффиксы, артефакты, зачарования, материалы | предметы и экономика |
| docs/23-endgame.md | лейтгейм: Бездна, мутации, лидерборды, 262 ачивки | всё после сотого этажа |
Быстрые факты
- Исходный спек: SQUAD_PROTOTYPE_SPEC.md — источник истины по правилам.
- Сборка:
cmake -S . -B build && cmake --build build --config Release. Целей три:tile2d(библиотека),build/bin/squad_proto.exe(игра),build/bin/tile2d_editor.exe(редактор комнат). - Инструментов две группы, и делятся они по предмету:
squad_proto --tool— баланс (урон, сопротивления, экономика),tile2d_editor --tool— содержимое (комнаты, каталог, этажи). Редактор не линкуется сsim/и правил боя не видит, поэтому смешать их нельзя. - Содержимое щупают инструментами, а не глазами:
tile2d_editor --tool help. Правка делается файлами (комнаты и каталог — текст), последствия читаются командой:--tool validate,--tool floor,--tool map(19-agent.md). Код возврата 1 = поломка. - В редакторе снизу терминал (клавиша
`): те же инструменты, git, сборка и запросы кclaude/codexпрямо оттуда. Открытый проект уходит потомкам переменнойTILE2D_PROJECT. - Самопроверка:
squad_proto.exe --acceptпечатает PASS/FAIL по всем измеримым критериям. Содержимое проверяется отдельно:tile2d_editor.exe --check(комнаты и покрытие глубин),squad_proto.exe --descend 8(спуск, эвакуация, круговой прогон профиля). - Унести можно только то, что на ВЫЖИВШИХ. Павший теряет своё, вайп теряет всё, достигнутая глубина не теряется никогда (17-extraction.md).
- Закон масштаба: угроза растёт квадратично, сила отряда — линейно с затуханием, разрыв закрывается ЗНАНИЕМ (стихии, реакции, порядок целей). Числа не должны спасать — иначе хоррор кончается на сороковом этаже (20-gdd.md).
- Ни одного чистого улучшения. Артефакт без цены становится обязательным, а обязательный предмет — это вырезанный слот (22-loot.md).
- Глубина — первичное понятие. Вся кривая сложности живёт в одной функции
DescribeFloor(engine/progression.h); размазывать её по генератору, каталогу и рендеру нельзя (16-descent.md). - Редактор линкуется только с движком. Обращение из
editor/кsim/,ai/илиui/— ошибка сборки, и так задумано (15-engine-and-editor.md). Редактор принадлежит движку: он открывает любой проект (--project <имя>) и ни одной игры по имени не знает. - Тексты НА ЭКРАНЕ — латиницей: встроенный шрифт raylib кириллицы не знает и рисует её вопросами. Комментарии и вывод в консоль остаются русскими.
- Числа игры — в src/tuning.h, размеры движка — в engine/config.h. Магических констант по коду быть не должно.
src/ai/не знает про рендер, изометрию и ввод. Это правило не нарушать.- Правило «не бить своих» одно на все классы оружия: у ствола это отрезок, у клинка — сектор. Ослаблять его нельзя нигде.
RenderGameпринимаетconst Game&— эффекты физически не могут влиять на симуляцию.- Приёмка меряется в ПЕСОЧНИЦЕ:
Game::combatModeвыключен, в мире мишени, на бойцах нет снаряжения. Ломать это нельзя — иначе--acceptмеряет другое.
Ассеты
Спрайты собирает внешний CLI SpriteForge (C:\Users\uuu\Documents\spriteforge).
Полный порядок работы — в docs/12-assets.md, здесь только запреты:
- игра хранит манифесты
assets/manifests/, исходникиassets/sources/и сгенерированныйgenerated/spriteforge_assets.h; собранное лежит вbuild/sprites/и в git не попадает; - не открывать
build/sprites/*.sfa,.sfcache/, сгенерированные PNG и contact sheet: проверка только текстом —sf list,sf describe,sf ascii,sf validate,sf stats; - строковых ID ассетов в C++ нет — только константы
SF_ASSET_*; - не править репозиторий SpriteForge ради одной игровой сущности.
Agent sprite production
For ANY request to create, change, replace, or add game art, follow .claude/commands/sprite.md
(the /sprite workflow) automatically even when the user did not type the slash command.
Never satisfy an art request with a one-off procedural runtime drawing.
When asked to create an agent, armor, or weapon sprite, use /agent-sprite and
assets/agents/catalog.yaml; do not draw a one-off procedural humanoid. Agent art is
an aligned paper-doll: body, armor and held weapon are separate 70x90, eight-direction
layers sharing one rig and pivot. Run tools/build_agent_assets.ps1 after ingestion.
Start the game with --sf-agents (or --sf) to see the generated layers. Blender is
installed at C:\Program Files\Blender Foundation\Blender 5.2\blender.exe.
Monster sprite production
Enemies do NOT go through the agent paper-doll. They have their own Blender-first
pipeline: assets/monsters/catalog.yaml, tools/blender/monster_rig.py,
tools/monster_assets.py (monster-init, monster-render, monster-render-all,
validate, sync). Five kinds, five distinct morphologies — never one humanoid
recoloured five times. Asset ids are <kind>_<animation>; renaming them breaks
tools/asset_coverage.py. Full rules in docs/14-monsters.md.