squad-proto/engine/config.h
z.kirill 7d6266aaf3 Tile2D: движок отдельным продуктом, игра — проектом в нём (M11-M20)
Десять вех одним состоянием: разделять их пофайлово нечем, потому что
src/game.cpp менялся почти в каждой. Собирается начисто без предупреждений,
все проверки проходят.

ДВИЖОК (engine/, цель tile2d)

  Каталог свой, и решение «это движок» принимается тем, куда положен файл.
  Компилятор нашёл три зависимости движка от игры, и все сняты: размеры кадра
  и карты уехали в engine/config.h, потолок населения этажа стал своим
  (MAX_LEVEL_SPAWNS против игровой MAX_TARGETS), запасная точка старта стала
  центром карты вместо позиции отряда.

  engine/projection.*  единственное место, где движок знает про изометрию;
                       видов сразу два — абстракция с одной реализацией ничем
                       не проверена и обычно оказывается неправильной
  engine/project.*     манифест проекта: пути, вид, кривая глубины
  engine/app.*         окно, кадр, fixed timestep — вместо двух копий цикла
  engine/tilemap_draw  движок научился показывать свою карту

РЕДАКТОР (editor/, цель tile2d_editor)

  Открывает любой проект и ни одной игры по имени не знает.
  --tool  одиннадцать безоконных команд: комнаты, каталог, кривая, сборка
          этажа, ASCII-карта, проверка набора. Правку делают файлами,
          последствия читают командой (docs/19-agent.md)
  терминал снизу: те же инструменты, git, сборка и запросы к claude/codex,
          открытый проект уходит потомкам через TILE2D_PROJECT

ПРИМЕР (samples/walk, цель tile2d_walk)

  Второй потребитель движка. Игра и редактор самостоятельность движка
  проверить не могут: редактор мира не рисует, а игра — то место, куда общий
  код и уезжает незаметно.

ИГРА (src/)

  Экстракшен: вес и два порога переноски, конечный боезапас, расходники
  применяются сами, общая сумка отряда, трата опыта на улучшения.

  Каждое из правил проверяется прогоном, а не глазами, и проверки поймали:
  вес дважды не связывал ничего (мерил по бинтам прогона, а не по добыче);
  боец с клинком не тратил найденные патроны при запасном стволе в сумке;
  массив виджетов экрана переполнился и молча съел хвост схрона; проверка
  улучшений сама ломала забег, вызывая NewRun посреди спуска.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 21:07:19 +03:00

52 lines
3.4 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
// -----------------------------------------------------------------------------
// Tile2D — размеры, которые нельзя поменять, не пересобрав движок.
//
// Это НЕ настройки проекта. Настройки живут в project.txt и читаются в рантайме
// (engine/project.h); сюда попадает только то, от чего зависят размеры массивов
// и что поэтому обязано быть известно компилятору.
//
// Раньше эти числа лежали в src/tuning.h — то есть движок собирался только
// вместе с игрой и знал её имя. Теперь наоборот: tuning.h включает этот файл,
// а движок про игру не знает ничего.
// -----------------------------------------------------------------------------
// --- кадр --------------------------------------------------------------------
// Внутреннее разрешение софтверного фреймбуфера. Апскейл до окна — ЦЕЛЫМ
// множителем, поэтому окно кратно кадру.
constexpr int INTERNAL_W = 480;
constexpr int INTERNAL_H = 270;
constexpr int WINDOW_SCALE = 3;
constexpr int WINDOW_W = INTERNAL_W * WINDOW_SCALE;
constexpr int WINDOW_H = INTERNAL_H * WINDOW_SCALE;
// --- геометрия тайла ---------------------------------------------------------
// Размер тайла в ИЗОМЕТРИИ: ромб 32x16 (наклон 2:1) и стена 32x32.
//
// Проекция может взять другой размер (engine/projection.h): вид сверху рисует
// квадрат 32x32. Эти константы — размер по умолчанию и верхняя оценка для
// отсечения по краю кадра, а не единственно возможный тайл.
constexpr int TILE_W = 32;
constexpr int TILE_H = 16;
constexpr int TILE_HALF_W = TILE_W / 2;
constexpr int TILE_HALF_H = TILE_H / 2;
constexpr int WALL_H = 32;
// Самый большой тайл, который может выдать любая проекция. По нему считается
// запас отсечения: спрайт, торчащий в кадр краем, обязан дорисоваться.
constexpr int TILE_MAX_W = 32;
constexpr int TILE_MAX_H = 32;
// --- шаг симуляции -----------------------------------------------------------
// Fixed timestep: шаг постоянный, кадр интерполируется. MAX_STEPS_PER_FRAME —
// защита от спирали смерти (долгий кадр не должен догоняться вечно).
constexpr float FIXED_DT = 1.0f / 60.0f;
constexpr int MAX_STEPS_PER_FRAME = 5;
// --- карта -------------------------------------------------------------------
// Тайлмап — плоский массив фиксированного размера, поэтому размер карты
// компилтаймовый. Проект меньше этого предела занимает часть карты; больше —
// не соберётся, и это честнее, чем молча обрезать уровень.
constexpr int MAP_W = 48;
constexpr int MAP_H = 48;