squad-proto/CMakeLists.txt
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

113 lines
6.0 KiB
CMake
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.

cmake_minimum_required(VERSION 3.16)
project(squad_proto CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# ---------------------------------------------------------------------------
# raylib: системная, иначе выкачиваем 6.0 через FetchContent
# ---------------------------------------------------------------------------
find_package(raylib 6 QUIET)
if(NOT raylib_FOUND)
include(FetchContent)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_GAMES OFF CACHE BOOL "" FORCE)
set(CUSTOMIZE_BUILD OFF CACHE BOOL "" FORCE)
FetchContent_Declare(
raylib
URL https://github.com/raysan5/raylib/archive/refs/tags/6.0.tar.gz
DOWNLOAD_EXTRACT_TIMESTAMP TRUE # CMP0135: иначе CMake ругается на таймстемпы
)
FetchContent_MakeAvailable(raylib)
endif()
# ---------------------------------------------------------------------------
# SpriteForge: загрузчик .sfa — это один сторонний заголовок sfa.h из соседнего
# репозитория. Копий в игре нет; собранные ассеты и generated/ — отдельно.
# ---------------------------------------------------------------------------
set(SPRITEFORGE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../spriteforge" CACHE PATH
"Каталог репозитория SpriteForge (нужен только его include/sfa.h)")
find_path(SPRITEFORGE_INCLUDE_DIR
NAMES sfa.h
HINTS "${SPRITEFORGE_DIR}/include"
NO_DEFAULT_PATH)
if(NOT SPRITEFORGE_INCLUDE_DIR)
message(FATAL_ERROR
"sfa.h не найден в ${SPRITEFORGE_DIR}/include.\n"
"Задать путь: cmake -S . -B build -DSPRITEFORGE_DIR=<путь к репозиторию spriteforge>")
endif()
# ---------------------------------------------------------------------------
# Tile2D — движок; всё остальное стоит на нём.
#
# tile2d — engine/: софтверный фреймбуфер, проекции 2D, тайлмап,
# тайлсет с темами, формат комнат, генератор уровней,
# каталог сущностей, формат проекта. Про правила боя,
# оружие и отряд не знает ничего.
# tile2d_editor — editor/: редактор комнат. Инструмент ДВИЖКА: открывает
# любой проект, а не один конкретный.
# squad_proto — src/: игра «Descent», один из проектов движка.
#
# Граница проведена ЛИНКОВКОЙ, а не договорённостью: ни движок, ни редактор не
# видят ни одного символа из sim/ и ai/, поэтому «редактор полез в правила
# игры» — ошибка сборки, а не то, что надо заметить на ревью.
#
# Раньше состав движка задавался списком файлов: каталоги src/render и src/world
# делили обе цели, и без списка граница расползлась бы при первом новом .cpp.
# Теперь у движка СВОЙ каталог, и решение «это движок» принимается тем, куда
# положен файл. Список стал бы вторым источником истины о том же самом.
# ---------------------------------------------------------------------------
file(GLOB ENGINE_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/engine/*.cpp")
file(GLOB EDITOR_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/editor/*.cpp")
file(GLOB_RECURSE GAME_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
add_library(tile2d STATIC ${ENGINE_SOURCES})
target_include_directories(tile2d PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}" # engine/..., editor/...
"${CMAKE_CURRENT_SOURCE_DIR}/generated" # spriteforge_assets.h, `sf codegen`
"${SPRITEFORGE_INCLUDE_DIR}")
target_link_libraries(tile2d PUBLIC raylib)
add_executable(squad_proto ${GAME_SOURCES})
target_include_directories(squad_proto PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src")
target_link_libraries(squad_proto PRIVATE tile2d)
add_executable(tile2d_editor ${EDITOR_SOURCES})
target_link_libraries(tile2d_editor PRIVATE tile2d)
# Пример. Он здесь не «для демонстрации»: это ВТОРОЙ потребитель движка помимо
# игры, и только он ловит случай, когда что-то общее незаметно уехало в src/.
# Игра и редактор такого не заметят — редактор не рисует мир, а игра сама и есть
# то место, куда уезжает.
file(GLOB SAMPLE_WALK_SOURCES CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/samples/walk/*.cpp")
add_executable(tile2d_walk ${SAMPLE_WALK_SOURCES})
target_link_libraries(tile2d_walk PRIVATE tile2d)
foreach(target tile2d squad_proto tile2d_editor tile2d_walk)
if(MSVC)
target_compile_options(${target} PRIVATE /W4 /utf-8 /permissive-)
else()
target_compile_options(${target} PRIVATE -Wall -Wextra)
endif()
endforeach()
if(WIN32)
target_link_libraries(tile2d PUBLIC winmm)
endif()
# Единый каталог для бинарников при любом генераторе (VS/Ninja/Makefiles)
foreach(target squad_proto tile2d_editor tile2d_walk)
set_target_properties(${target} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/bin"
RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_BINARY_DIR}/bin")
endforeach()