Go to file
z.kirill e3294cffd4 Личинки, парирование и инструмент --wall (M30)
--WALL. Новый прогон отвечает на вопрос, появившийся вместе с чекпоинтами
через пятьдесят этажей: растёт ли достижимая глубина от вылазки к вылазке.
Отряд из одного, трёх и пяти, одетый по глубине, ставится в скопление
тварей и живёт полторы минуты без управления. Первая стена: одиночка D7,
трое D30, пятеро D30 - петля работает.

И он же нашёл настоящую ошибку: PlaceSquad воскрешал ВСЕ пять слотов, в
том числе незанятые. Строка писалась, когда отряд всегда был впятером;
после появления ростера одиночка выходил на этаж с четырьмя невидимыми
телохранителями. Из-за них прежний замер "одиночка выжил на первом этаже,
100 -> 41" был боем впятером.

ЛИЧИНКИ. С исправленным замером выяснилось, что одиночка с ножом
проигрывает двум бредущим: 210 здоровья против ножа это девять секунд
работы под ответным уроном. Первые этажи населены личинками (55 здоровья,
7 урона, медленные), бредущий уехал на третий этаж, бегун на четвёртый.
Новый ВИД, а не ослабленный бредущий с множителем: глубина в этой игре
меняет, кто выходит, а не числа у одного и того же.

ПАРИРОВАНИЕ. Отдельная характеристика клинка, и чем оружие легче, тем она
выше: нож 34%, сабля 20%, тесак 8%. Не выведена из веса намеренно - её
двигает аффикс PARRY, и лёгкий тесак обязан быть возможен как находка.

Отбить можно, только если удары СОПРИКОСНУЛИСЬ: боец сам должен быть в
замахе или в ударе. Иначе клинок стал бы щитом, работающим, пока стоишь.

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

Плевок отбивается тоже: летит назад и несёт урон бойца, а не твари. Это
его удар, просто по летящей цели.

Проверка меряет размен целиком, включая обратную половину правила:
"стоя столбом не отбивает". Без неё условие про соприкосновение
существовало бы только в комментарии.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 05:04:35 +03:00
.claude/commands Документация: границы движка, работа через модель, дизайн игры до лейтгейма 2026-08-13 21:07:45 +03:00
.vscode Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00
assets Конвейер ассетов: манифесты, риги, каталоги, инструменты 2026-08-13 21:06:09 +03:00
docs Личинки, парирование и инструмент --wall (M30) 2026-08-16 05:04:35 +03:00
editor Tile2D: движок отдельным продуктом, игра — проектом в нём (M11-M20) 2026-08-13 21:07:19 +03:00
engine Правки по игре: начало, ставка, наёмники (M29) 2026-08-16 04:09:26 +03:00
generated Конвейер ассетов: манифесты, риги, каталоги, инструменты 2026-08-13 21:06:09 +03:00
lib Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00
projects Личинки, парирование и инструмент --wall (M30) 2026-08-16 05:04:35 +03:00
samples/walk Tile2D: движок отдельным продуктом, игра — проектом в нём (M11-M20) 2026-08-13 21:07:19 +03:00
src Личинки, парирование и инструмент --wall (M30) 2026-08-16 05:04:35 +03:00
tools Конвейер ассетов: манифесты, риги, каталоги, инструменты 2026-08-13 21:06:09 +03:00
.gitattributes Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00
.gitignore Игнорировать проверочные сборки build-* 2026-08-15 05:26:44 +03:00
CLAUDE.md Правки по игре: начало, ставка, наёмники (M29) 2026-08-16 04:09:26 +03:00
CMakeLists.txt Tile2D: движок отдельным продуктом, игра — проектом в нём (M11-M20) 2026-08-13 21:07:19 +03:00
main.code-workspace Tile2D: движок отдельным продуктом, игра — проектом в нём (M11-M20) 2026-08-13 21:07:19 +03:00
Makefile Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00
preview.jpg Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00
README.md Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00
SQUAD_PROTOTYPE_SPEC.md Прототип боевого ядра: отряд, хоррор-слой, ближний бой 2026-08-03 13:00:49 +03:00

Squad prototype — тактический отряд с авто-огнём

Технический прототип боевого ядра 2D-изометрического sci-fi horror roguelite. Отряд из 5 агентов сам расставляется так, чтобы стрелять и не задевать своих. Двое из пяти работают клинком: у ближнего боя то же правило в угловой форме — свой в секторе замаха, значит удара не будет.

боевой кадр с оверлеем

C++17 · raylib 6.0 · CMake · софтверный рендер (вся сцена — ручная запись пикселей в свой фреймбуфер 480×270, апскейл ×3).

Быстрый старт

cmake -S . -B build                                  # разово, тянет raylib 6.0
cmake --build build --config Release --parallel
build/bin/squad_proto.exe

В VS Code — просто F5.

WASD двигает якорь отряда, Space — ручное прицеливание, 1/2/3 — строй, F1..F4 — оверлей. Стрельба всегда автоматическая. Полный список — в документации.

Самопроверка

build/bin/squad_proto.exe --accept        # критерии приёмки, PASS/FAIL
build/bin/squad_proto.exe --headless 300  # прогон без окна + метрики

Симуляция детерминирована и не зависит от рендера, поэтому критерии проверяются цифрами: FRIENDLY_HITS = 0 за 3 минуты боя смешанным отрядом, FIRE UPTIME 100 % в стоячем бою, расхождение веером за 0.18 с, 81 взмах клинком без единого задетого своего, шаг симуляции 2 мкс при бюджете кадра 16.6 мс.

Документация

Оглавление — CLAUDE.md. Модульная документация в docs/:

  • 00-overview — что это и чего тут нет
  • 01-build-and-run — сборка, управление, dev-режимы
  • 02-architecture — модули, порядок шага, правила зависимостей
  • 03-rendering — фреймбуфер, изометрия, спрайты
  • 04-world — карта, рейкаст, коллизии, мишени
  • 05-squad-aiядро: линии огня, решатель, резервирование
  • 06-debug-and-tuning — оверлей, метрики, тюнинг
  • 07-milestones — журнал вех
  • 08-decisions — отклонения от спека и почему
  • 09-acceptance — критерии приёмки и цифры
  • 10-atmosphere — свет, туман войны, трассеры, напряжение
  • 11-meleeближний бой: сектор удара, три фазы, свой круг

Исходное ТЗ: SQUAD_PROTOTYPE_SPEC.md.


Проект вырос из шаблона Raylib-CPP Starter Template for VS Code; от шаблона остался только Makefile, который больше не используется — сборка через CMake.