squad-proto/src/render/sprites.h

32 lines
1.5 KiB
C
Raw Normal View History

Прототип боевого ядра: отряд, хоррор-слой, ближний бой Тактический отряд с автоматическим огнём в изометрии, собственный софтверный растеризатор (raylib только окно, ввод и финальный блит). Ядро (спек, раздел 6): - LaneClear: проверка линии огня по своим, стенам и дальности; - решатель огневых позиций с гистерезисом и коммитом; - резервирование линий огня и расступание из чужих секторов; - пули-снаряды, дружественный урон физически возможен. Хоррор-слой (render-only): свет и туман войны с памятью карты, светящиеся трассеры, кровь, виньетка, зерно, напряжение. Ближний бой: сектор удара, три фазы, связка из трёх ударов, своя дисциплина «не бить сквозь своего». Проверка: squad_proto.exe --accept прогоняет критерии приёмки раздела 11 плюс блок M7 по ближнему бою — все PASS, FRIENDLY_HITS = 0 за 3 минуты боя. Сборка: cmake -S . -B build && cmake --build build --config Release raylib 6.0 подтягивается через FetchContent. Документация — CLAUDE.md как оглавление, содержание в docs/. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:00:49 +07:00
#pragma once
// -----------------------------------------------------------------------------
// Процедурная генерация всех спрайтов при старте. Файлов с ассетами нет.
// -----------------------------------------------------------------------------
#include "render/framebuffer.h"
#include "tuning.h"
struct SpriteSet
{
Sprite floorA; // шахматка пола, вариант 1
Sprite floorB; // вариант 2
Sprite wall; // блок 32x32
Sprite agent[NUM_AGENTS]; // стрелок: по цвету на агента
Sprite melee[NUM_AGENTS]; // тот же цвет, но силуэт с клинком
Sprite target;
// Спрайта пули нет: снаряд рисуется светящимся трассером (render/fx.cpp).
Sprite pistol[NUM_AGENTS]; // тот же цвет, но силуэт с коротким стволом
void Generate();
// Какой ромб пола лежит на тайле. Одно место на весь рендер: запечённая
// кровь копирует ИМЕННО его, иначе шахматка поедет (render/blood.h).
const Sprite& FloorTile(int tx, int ty) const
{
return ((tx + ty) & 1) ? floorA : floorB;
}
};
// Затемнить/осветлить цвет (множитель по RGB, альфа сохраняется).
uint32_t ShadeColor(uint32_t c, float k);