From 7880f275bd022df771f700341c668339e0aa030d Mon Sep 17 00:00:00 2001 From: "z.kirill" Date: Mon, 3 Aug 2026 13:00:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=82=D0=BE=D1=82=D0=B8?= =?UTF-8?q?=D0=BF=20=D0=B1=D0=BE=D0=B5=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=8F?= =?UTF-8?q?=D0=B4=D1=80=D0=B0:=20=D0=BE=D1=82=D1=80=D1=8F=D0=B4,=20=D1=85?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=BE=D1=80-=D1=81=D0=BB=D0=BE=D0=B9,=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D0=B6=D0=BD=D0=B8=D0=B9=20=D0=B1=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Тактический отряд с автоматическим огнём в изометрии, собственный софтверный растеризатор (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 --- .gitattributes | 3 + .gitignore | 24 ++ .vscode/.gitkeep | 0 .vscode/c_cpp_properties.json | 62 ++++ .vscode/launch.json | 40 +++ .vscode/settings.json | 11 + .vscode/tasks.json | 48 +++ CLAUDE.md | 32 ++ CMakeLists.txt | 53 +++ Makefile | 421 ++++++++++++++++++++++++ README.md | 60 ++++ SQUAD_PROTOTYPE_SPEC.md | 313 ++++++++++++++++++ docs/00-overview.md | 57 ++++ docs/01-build-and-run.md | 112 +++++++ docs/02-architecture.md | 103 ++++++ docs/03-rendering.md | 102 ++++++ docs/04-world.md | 80 +++++ docs/05-squad-ai.md | 254 ++++++++++++++ docs/06-debug-and-tuning.md | 150 +++++++++ docs/07-milestones.md | 54 +++ docs/08-decisions.md | 327 ++++++++++++++++++ docs/09-acceptance.md | 107 ++++++ docs/10-atmosphere.md | 200 +++++++++++ docs/11-melee.md | 222 +++++++++++++ docs/combat.png | Bin 0 -> 303441 bytes lib/libgcc_s_dw2-1.dll | Bin 0 -> 120334 bytes lib/libstdc++-6.dll | Bin 0 -> 1558030 bytes main.code-workspace | 58 ++++ preview.jpg | Bin 0 -> 79658 bytes src/ai/firing_solver.cpp | 342 +++++++++++++++++++ src/ai/firing_solver.h | 68 ++++ src/ai/lane_registry.cpp | 55 ++++ src/ai/lane_registry.h | 51 +++ src/ai/melee.cpp | 192 +++++++++++ src/ai/melee.h | 37 +++ src/core/hash.h | 36 ++ src/core/input.h | 17 + src/core/math.h | 107 ++++++ src/debug/harness.cpp | 603 ++++++++++++++++++++++++++++++++++ src/debug/harness.h | 26 ++ src/debug/metrics.cpp | 103 ++++++ src/debug/metrics.h | 78 +++++ src/debug/overlay.cpp | 307 +++++++++++++++++ src/debug/overlay.h | 20 ++ src/ecs/ecs.h | 231 +++++++++++++ src/game.cpp | 557 +++++++++++++++++++++++++++++++ src/game.h | 83 +++++ src/main.cpp | 181 ++++++++++ src/render/atmos.cpp | 83 +++++ src/render/atmos.h | 32 ++ src/render/blood.cpp | 233 +++++++++++++ src/render/blood.h | 56 ++++ src/render/framebuffer.cpp | 332 +++++++++++++++++++ src/render/framebuffer.h | 192 +++++++++++ src/render/fx.cpp | 283 ++++++++++++++++ src/render/fx.h | 75 +++++ src/render/iso.h | 93 ++++++ src/render/lighting.cpp | 282 ++++++++++++++++ src/render/lighting.h | 81 +++++ src/render/noise.h | 13 + src/render/post.cpp | 279 ++++++++++++++++ src/render/post.h | 67 ++++ src/render/scene.cpp | 101 ++++++ src/render/scene.h | 46 +++ src/render/sprites.cpp | 202 ++++++++++++ src/render/sprites.h | 31 ++ src/render/view.cpp | 181 ++++++++++ src/render/view.h | 52 +++ src/sim/agent.cpp | 173 ++++++++++ src/sim/agent.h | 119 +++++++ src/sim/bullet.cpp | 135 ++++++++ src/sim/bullet.h | 54 +++ src/sim/events.h | 55 ++++ src/sim/loadout.h | 177 ++++++++++ src/sim/squad.cpp | 291 ++++++++++++++++ src/sim/squad.h | 93 ++++++ src/sim/target.cpp | 96 ++++++ src/sim/target.h | 52 +++ src/sim/weapon_defs.h | 207 ++++++++++++ src/tuning.h | 459 ++++++++++++++++++++++++++ src/world/tilemap.cpp | 205 ++++++++++++ src/world/tilemap.h | 42 +++ 82 files changed, 10859 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .vscode/.gitkeep create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 CLAUDE.md create mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 README.md create mode 100644 SQUAD_PROTOTYPE_SPEC.md create mode 100644 docs/00-overview.md create mode 100644 docs/01-build-and-run.md create mode 100644 docs/02-architecture.md create mode 100644 docs/03-rendering.md create mode 100644 docs/04-world.md create mode 100644 docs/05-squad-ai.md create mode 100644 docs/06-debug-and-tuning.md create mode 100644 docs/07-milestones.md create mode 100644 docs/08-decisions.md create mode 100644 docs/09-acceptance.md create mode 100644 docs/10-atmosphere.md create mode 100644 docs/11-melee.md create mode 100644 docs/combat.png create mode 100644 lib/libgcc_s_dw2-1.dll create mode 100644 lib/libstdc++-6.dll create mode 100644 main.code-workspace create mode 100644 preview.jpg create mode 100644 src/ai/firing_solver.cpp create mode 100644 src/ai/firing_solver.h create mode 100644 src/ai/lane_registry.cpp create mode 100644 src/ai/lane_registry.h create mode 100644 src/ai/melee.cpp create mode 100644 src/ai/melee.h create mode 100644 src/core/hash.h create mode 100644 src/core/input.h create mode 100644 src/core/math.h create mode 100644 src/debug/harness.cpp create mode 100644 src/debug/harness.h create mode 100644 src/debug/metrics.cpp create mode 100644 src/debug/metrics.h create mode 100644 src/debug/overlay.cpp create mode 100644 src/debug/overlay.h create mode 100644 src/ecs/ecs.h create mode 100644 src/game.cpp create mode 100644 src/game.h create mode 100644 src/main.cpp create mode 100644 src/render/atmos.cpp create mode 100644 src/render/atmos.h create mode 100644 src/render/blood.cpp create mode 100644 src/render/blood.h create mode 100644 src/render/framebuffer.cpp create mode 100644 src/render/framebuffer.h create mode 100644 src/render/fx.cpp create mode 100644 src/render/fx.h create mode 100644 src/render/iso.h create mode 100644 src/render/lighting.cpp create mode 100644 src/render/lighting.h create mode 100644 src/render/noise.h create mode 100644 src/render/post.cpp create mode 100644 src/render/post.h create mode 100644 src/render/scene.cpp create mode 100644 src/render/scene.h create mode 100644 src/render/sprites.cpp create mode 100644 src/render/sprites.h create mode 100644 src/render/view.cpp create mode 100644 src/render/view.h create mode 100644 src/sim/agent.cpp create mode 100644 src/sim/agent.h create mode 100644 src/sim/bullet.cpp create mode 100644 src/sim/bullet.h create mode 100644 src/sim/events.h create mode 100644 src/sim/loadout.h create mode 100644 src/sim/squad.cpp create mode 100644 src/sim/squad.h create mode 100644 src/sim/target.cpp create mode 100644 src/sim/target.h create mode 100644 src/sim/weapon_defs.h create mode 100644 src/tuning.h create mode 100644 src/world/tilemap.cpp create mode 100644 src/world/tilemap.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7e64f2c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# Auto detect text files and perform LF normalization +* text=auto +Makefile linguist-generated=true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6767c2e --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# --- сборка ------------------------------------------------------------------ +# build/ содержит и объектники, и выкачанный исходник raylib (~200 МБ). +# Всё воспроизводится одной командой: cmake -S . -B build +build/ +out/ +cmake-build-*/ + +*.exe +*.pdb +*.ilk +*.obj +*.dsym +main + +# --- артефакты dev-режимов --------------------------------------------------- +# squad_proto.exe --shot кладёт скриншот в рабочий каталог, то есть в корень. +# Это отладочные снимки; те, что нужны документации, лежат в docs/. +/*.png + +# --- среда ------------------------------------------------------------------- +.vs/ +.cache/ +compile_commands.json +CMakeUserPresets.json diff --git a/.vscode/.gitkeep b/.vscode/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..a0c13b3 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,62 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "C:/raylib/raylib/src/**", + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE", + "GRAPHICS_API_OPENGL_33", + "PLATFORM_DESKTOP" + ], + "compilerPath": "C:/raylib/w64devkit/bin/gcc.exe", + "cStandard": "c99", + "cppStandard": "c++14", + "intelliSenseMode": "gcc-x64", + "configurationProvider": "ms-vscode.makefile-tools" + }, + { + "name": "Mac", + "includePath": [ + "${workspaceFolder}/**", + "/opt/homebrew/include" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE", + "GRAPHICS_API_OPENGL_33", + "PLATFORM_DESKTOP" + ], + "macFrameworkPath": [ + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "c11", + "cppStandard": "c++14", + "intelliSenseMode": "clang-x64" + }, + { + "name": "Linux", + "includePath": [ + "/home/linuxbrew/.linuxbrew/include", + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE", + "GRAPHICS_API_OPENGL_33", + "PLATFORM_DESKTOP" + ], + "cStandard": "c11", + "cppStandard": "c++14", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4b8f3f2 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,40 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run (Release)", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceFolder}/build/bin/squad_proto.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "console": "integratedTerminal", + "preLaunchTask": "build release" + }, + { + "name": "Debug", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceFolder}/build/bin/squad_proto.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "console": "integratedTerminal", + "preLaunchTask": "build debug" + }, + { + "name": "Acceptance (--accept)", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceFolder}/build/bin/squad_proto.exe", + "args": ["--accept"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "preLaunchTask": "build release" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e98318a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/*.o": true, + "**/*.exe": true, + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..455d733 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,48 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "cmake configure", + "type": "shell", + "command": "cmake", + "args": ["-S", ".", "-B", "build"], + "problemMatcher": [], + "detail": "Разовая конфигурация; raylib 6.0 подтягивается через FetchContent" + }, + { + "label": "build release", + "type": "shell", + "command": "cmake", + "args": ["--build", "build", "--config", "Release", "--parallel"], + "group": { "kind": "build", "isDefault": true }, + "problemMatcher": ["$msCompile"], + "detail": "Основная сборка -> build/bin/squad_proto.exe" + }, + { + "label": "build debug", + "type": "shell", + "command": "cmake", + "args": ["--build", "build", "--config", "Debug", "--parallel"], + "group": "build", + "problemMatcher": ["$msCompile"] + }, + { + "label": "accept", + "type": "shell", + "command": "${workspaceFolder}/build/bin/squad_proto.exe", + "args": ["--accept"], + "dependsOn": "build release", + "problemMatcher": [], + "detail": "Прогнать критерии приёмки из спека (раздел 11)" + }, + { + "label": "headless 180s", + "type": "shell", + "command": "${workspaceFolder}/build/bin/squad_proto.exe", + "args": ["--headless", "180"], + "dependsOn": "build release", + "problemMatcher": [], + "detail": "Прогон без окна с метриками" + } + ] +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e49a9b8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,32 @@ +# CLAUDE.md — оглавление + +Этот файл — **только навигация**. Содержание живёт в `docs/`, по одному файлу на тему. +Читай нужный раздел, а не весь проект. + +## Документация + +| Файл | О чём | Когда открывать | +|---|---|---| +| [docs/00-overview.md](docs/00-overview.md) | что это за прототип, границы задачи | первое знакомство | +| [docs/01-build-and-run.md](docs/01-build-and-run.md) | сборка, запуск, управление, dev-режимы CLI | собрать и потыкать | +| [docs/02-architecture.md](docs/02-architecture.md) | карта модулей, порядок шага симуляции, правила зависимостей | перед любой правкой кода | +| [docs/03-rendering.md](docs/03-rendering.md) | софтверный фреймбуфер, изометрия, сортировка, спрайты | рендер, камера, спрайты | +| [docs/04-world.md](docs/04-world.md) | тайлмап, планировка уровня, DDA-рейкаст, коллизии, мишени | карта, LOS, коллизии | +| [docs/05-squad-ai.md](docs/05-squad-ai.md) | **ядро**: LaneClear, решатель огневых позиций, резерв линий, стрельба | поведение отряда | +| [docs/06-debug-and-tuning.md](docs/06-debug-and-tuning.md) | оверлей F1–F4, метрики, runtime-тюнинг, `--set` | отладка и балансировка | +| [docs/07-milestones.md](docs/07-milestones.md) | журнал вех M0–M6: что сделано и чем проверено | история и статус | +| [docs/08-decisions.md](docs/08-decisions.md) | отклонения от спека и почему, с замерами | «почему тут не как в ТЗ» | +| [docs/09-acceptance.md](docs/09-acceptance.md) | критерии приёмки (спек 11) и их текущие цифры | приёмка | +| [docs/10-atmosphere.md](docs/10-atmosphere.md) | **хоррор-слой**: свет, туман войны, трассеры, напряжение | картинка и атмосфера | +| [docs/11-melee.md](docs/11-melee.md) | **ближний бой**: сектор удара, три фазы, свой круг, дуга | клинки, классы оружия | + +## Быстрые факты + +- Исходный спек: [SQUAD_PROTOTYPE_SPEC.md](SQUAD_PROTOTYPE_SPEC.md) — источник истины по правилам. +- Сборка: `cmake -S . -B build && cmake --build build --config Release` → `build/bin/squad_proto.exe`. +- Самопроверка: `squad_proto.exe --accept` печатает PASS/FAIL по всем измеримым критериям. +- Все числа — в [src/tuning.h](src/tuning.h). Магических констант по коду быть не должно. +- `src/ai/` не знает про рендер, изометрию и ввод. Это правило не нарушать. +- Правило «не бить своих» одно на все классы оружия: у ствола это отрезок, + у клинка — сектор. Ослаблять его нельзя нигде. +- `RenderGame` принимает `const Game&` — эффекты физически не могут влиять на симуляцию. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..401b6e9 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,53 @@ +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() + +# --------------------------------------------------------------------------- +# Исходники +# --------------------------------------------------------------------------- +file(GLOB_RECURSE SQUAD_SOURCES CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") + +add_executable(squad_proto ${SQUAD_SOURCES}) + +target_include_directories(squad_proto PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src") +target_link_libraries(squad_proto PRIVATE raylib) + +if(MSVC) + target_compile_options(squad_proto PRIVATE /W4 /utf-8 /permissive-) +else() + target_compile_options(squad_proto PRIVATE -Wall -Wextra) +endif() + +if(WIN32) + target_link_libraries(squad_proto PRIVATE winmm) +endif() + +# Единый каталог для бинарника при любом генераторе (VS/Ninja/Makefiles) +set_target_properties(squad_proto 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") diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7c104a1 --- /dev/null +++ b/Makefile @@ -0,0 +1,421 @@ +#************************************************************************************************** +# +# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5 +# +# Copyright (c) 2013-2019 Ramon Santamaria (@raysan5) +# +# This software is provided "as-is", without any express or implied warranty. In no event +# will the authors be held liable for any damages arising from the use of this software. +# +# Permission is granted to anyone to use this software for any purpose, including commercial +# applications, and to alter it and redistribute it freely, subject to the following restrictions: +# +# 1. The origin of this software must not be misrepresented; you must not claim that you +# wrote the original software. If you use this software in a product, an acknowledgment +# in the product documentation would be appreciated but is not required. +# +# 2. Altered source versions must be plainly marked as such, and must not be misrepresented +# as being the original software. +# +# 3. This notice may not be removed or altered from any source distribution. +# +#************************************************************************************************** + +.PHONY: all clean + +# Define required raylib variables +PROJECT_NAME ?= game +RAYLIB_VERSION ?= 5.0.0 +RAYLIB_PATH ?= ..\.. + +# Define compiler path on Windows +COMPILER_PATH ?= C:/raylib/w64devkit/bin + +# Define default options +# One of PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB +PLATFORM ?= PLATFORM_DESKTOP + +# Locations of your newly installed library and associated headers. See ../src/Makefile +# On Linux, if you have installed raylib but cannot compile the examples, check that +# the *_INSTALL_PATH values here are the same as those in src/Makefile or point to known locations. +# To enable system-wide compile-time and runtime linking to libraylib.so, run ../src/$ sudo make install RAYLIB_LIBTYPE_SHARED. +# To enable compile-time linking to a special version of libraylib.so, change these variables here. +# To enable runtime linking to a special version of libraylib.so, see EXAMPLE_RUNTIME_PATH below. +# If there is a libraylib in both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, at runtime, +# the library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over the one at RAYLIB_INSTALL_PATH. +# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths. +DESTDIR ?= /usr/local +RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib +# RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files. +RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include + +# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll) +RAYLIB_LIBTYPE ?= STATIC + +# Build mode for project: DEBUG or RELEASE +BUILD_MODE ?= RELEASE + +# Use external GLFW library instead of rglfw module +# TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3 +USE_EXTERNAL_GLFW ?= FALSE + +# Use Wayland display server protocol on Linux desktop +# by default it uses X11 windowing system +USE_WAYLAND_DISPLAY ?= FALSE + +# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + # No uname.exe on MinGW!, but OS=Windows_NT on Windows! + # ifeq ($(UNAME),Msys) -> Windows + ifeq ($(OS),Windows_NT) + PLATFORM_OS=WINDOWS + export PATH := $(COMPILER_PATH):$(PATH) + else + UNAMEOS=$(shell uname) + ifeq ($(UNAMEOS),Linux) + PLATFORM_OS=LINUX + endif + ifeq ($(UNAMEOS),FreeBSD) + PLATFORM_OS=BSD + endif + ifeq ($(UNAMEOS),OpenBSD) + PLATFORM_OS=BSD + endif + ifeq ($(UNAMEOS),NetBSD) + PLATFORM_OS=BSD + endif + ifeq ($(UNAMEOS),DragonFly) + PLATFORM_OS=BSD + endif + ifeq ($(UNAMEOS),Darwin) + PLATFORM_OS=OSX + endif + endif +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + UNAMEOS=$(shell uname) + ifeq ($(UNAMEOS),Linux) + PLATFORM_OS=LINUX + endif +endif + +# RAYLIB_PATH adjustment for different platforms. +# If using GNU make, we can get the full path to the top of the tree. Windows? BSD? +# Required for ldconfig or other tools that do not perform path expansion. +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),LINUX) + RAYLIB_PREFIX ?= .. + RAYLIB_PATH = $(realpath $(RAYLIB_PREFIX)) + endif +endif +# Default path for raylib on Raspberry Pi, if installed in different path, update it! +# This is not currently used by src/Makefile. Not sure of its origin or usage. Refer to wiki. +# TODO: update install: target in src/Makefile for RPI, consider relation to LINUX. +ifeq ($(PLATFORM),PLATFORM_RPI) + RAYLIB_PATH ?= /home/pi/raylib +endif + +ifeq ($(PLATFORM),PLATFORM_WEB) + # Emscripten required variables + EMSDK_PATH ?= C:/emsdk + EMSCRIPTEN_VERSION ?= 1.38.31 + CLANG_VERSION = e$(EMSCRIPTEN_VERSION)_64bit + PYTHON_VERSION = 2.7.13.1_64bit\python-2.7.13.amd64 + NODE_VERSION = 8.9.1_64bit + export PATH = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH) + EMSCRIPTEN = $(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION) +endif + +# Define raylib release directory for compiled library. +# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version +RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src + +# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries +# into each example binary compiled with RAYLIB_LIBTYPE=SHARED. It defaults to RAYLIB_RELEASE_PATH +# so that these examples link at runtime with your version of libraylib.so in ../release/libs/linux +# without formal installation from ../src/Makefile. It aids portability and is useful if you have +# multiple versions of raylib, have raylib installed to a non-standard location, or want to +# bundle libraylib.so with your game. Change it to your liking. +# NOTE: If, at runtime, there is a libraylib.so at both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, +# The library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over RAYLIB_INSTALL_PATH, +# Implemented for LINUX below with CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH) +# To see the result, run readelf -d core/core_basic_window; looking at the RPATH or RUNPATH attribute. +# To see which libraries a built example is linking to, ldd core/core_basic_window; +# Look for libraylib.so.1 => $(RAYLIB_INSTALL_PATH)/libraylib.so.1 or similar listing. +EXAMPLE_RUNTIME_PATH ?= $(RAYLIB_RELEASE_PATH) + +# Define default C compiler: gcc +# NOTE: define g++ compiler if using C++ +CC = g++ + +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),OSX) + # OSX default compiler + CC = clang++ + endif + ifeq ($(PLATFORM_OS),BSD) + # FreeBSD, OpenBSD, NetBSD, DragonFly default compiler + CC = clang + endif +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + ifeq ($(USE_RPI_CROSS_COMPILER),TRUE) + # Define RPI cross-compiler + #CC = armv6j-hardfloat-linux-gnueabi-gcc + CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc + endif +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + # HTML5 emscripten compiler + # WARNING: To compile to HTML5, code must be redesigned + # to use emscripten.h and emscripten_set_main_loop() + CC = emcc +endif + +# Define default make program: Mingw32-make +MAKE = mingw32-make + +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),LINUX) + MAKE = make + endif + ifeq ($(PLATFORM_OS),OSX) + MAKE = make + endif +endif + +# Define compiler flags: +# -O0 defines optimization level (no optimization, better for debugging) +# -O1 defines optimization level +# -g include debug information on compilation +# -s strip unnecessary data from build -> do not use in debug builds +# -Wall turns on most, but not all, compiler warnings +# -std=c99 defines C language mode (standard C from 1999 revision) +# -std=gnu99 defines C language mode (GNU C from 1999 revision) +# -Wno-missing-braces ignore invalid warning (GCC bug 53119) +# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec +CFLAGS += -Wall -std=c++14 -D_DEFAULT_SOURCE -Wno-missing-braces + +ifeq ($(BUILD_MODE),DEBUG) + CFLAGS += -g -O0 +else + CFLAGS += -s -O1 +endif + +# Additional flags for compiler (if desired) +#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),WINDOWS) + # resource file contains windows executable icon and properties + # -Wl,--subsystem,windows hides the console window + CFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data + endif + ifeq ($(PLATFORM_OS),LINUX) + ifeq ($(RAYLIB_LIBTYPE),STATIC) + CFLAGS += -D_DEFAULT_SOURCE + endif + ifeq ($(RAYLIB_LIBTYPE),SHARED) + # Explicitly enable runtime link to libraylib.so + CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH) + endif + endif +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + CFLAGS += -std=gnu99 +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + # -Os # size optimization + # -O2 # optimization level 2, if used, also set --memory-init-file 0 + # -s USE_GLFW=3 # Use glfw3 library (context/input management) + # -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing -> WARNING: Audio buffers could FAIL! + # -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB) + # -s USE_PTHREADS=1 # multithreading support + # -s WASM=0 # disable Web Assembly, emitted by default + # -s EMTERPRETIFY=1 # enable emscripten code interpreter (very slow) + # -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter + # -s FORCE_FILESYSTEM=1 # force filesystem to load/save files data + # -s ASSERTIONS=1 # enable runtime checks for common memory allocation errors (-O1 and above turn it off) + # --profiling # include information for code profiling + # --memory-init-file 0 # to avoid an external memory initialization code file (.mem) + # --preload-file resources # specify a resources folder for data compilation + CFLAGS += -Os -s USE_GLFW=3 -s TOTAL_MEMORY=16777216 --preload-file resources + ifeq ($(BUILD_MODE), DEBUG) + CFLAGS += -s ASSERTIONS=1 --profiling + endif + + # Define a custom shell .html and output extension + CFLAGS += --shell-file $(RAYLIB_PATH)/src/shell.html + EXT = .html +endif + +# Define include paths for required headers +# NOTE: Several external required libraries (stb and others) +INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external +ifneq ($(wildcard /opt/homebrew/include/.*),) + INCLUDE_PATHS += -I/opt/homebrew/include +endif + +# Define additional directories containing required header files +ifeq ($(PLATFORM),PLATFORM_RPI) + # RPI required libraries + INCLUDE_PATHS += -I/opt/vc/include + INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux + INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads +endif +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),BSD) + # Consider -L$(RAYLIB_H_INSTALL_PATH) + INCLUDE_PATHS += -I/usr/local/include + endif + ifeq ($(PLATFORM_OS),LINUX) + # Reset everything. + # Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include + INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external + endif +endif + +# Define library paths containing required libs. +LDFLAGS = -L. + +ifneq ($(wildcard $(RAYLIB_RELEASE_PATH)/.*),) + LDFLAGS += -L$(RAYLIB_RELEASE_PATH) +endif +ifneq ($(wildcard $(RAYLIB_PATH)/src/.*),) + LDFLAGS += -L$(RAYLIB_PATH)/src +endif +ifneq ($(wildcard /opt/homebrew/lib/.*),) + LDFLAGS += -L/opt/homebrew/lib +endif + +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),BSD) + # Consider -L$(RAYLIB_INSTALL_PATH) + LDFLAGS += -L. -Lsrc -L/usr/local/lib + endif + ifeq ($(PLATFORM_OS),LINUX) + # Reset everything. + # Precedence: immediately local, installed version, raysan5 provided libs + LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH) + endif +endif + +ifeq ($(PLATFORM),PLATFORM_RPI) + LDFLAGS += -L/opt/vc/lib +endif + +# Define any libraries required on linking +# if you want to link libraries (libname.so or libname.a), use the -lname +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),WINDOWS) + # Libraries for Windows desktop compilation + # NOTE: WinMM library required to set high-res timer resolution + LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm + # Required for physac examples + #LDLIBS += -static -lpthread + endif + ifeq ($(PLATFORM_OS),LINUX) + # Libraries for Debian GNU/Linux desktop compiling + # NOTE: Required packages: libegl1-mesa-dev + LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt + + # On X11 requires also below libraries + LDLIBS += -lX11 + # NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them + #LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor + + # On Wayland windowing system, additional libraries requires + ifeq ($(USE_WAYLAND_DISPLAY),TRUE) + LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon + endif + # Explicit link to libc + ifeq ($(RAYLIB_LIBTYPE),SHARED) + LDLIBS += -lc + endif + endif + ifeq ($(PLATFORM_OS),OSX) + # Libraries for OSX 10.9 desktop compiling + # NOTE: Required packages: libopenal-dev libegl1-mesa-dev + LDLIBS = -lraylib -framework OpenGL -framework OpenAL -framework Cocoa -framework IOKit + endif + ifeq ($(PLATFORM_OS),BSD) + # Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling + # NOTE: Required packages: mesa-libs + LDLIBS = -lraylib -lGL -lpthread -lm + + # On XWindow requires also below libraries + LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor + endif + ifeq ($(USE_EXTERNAL_GLFW),TRUE) + # NOTE: It could require additional packages installed: libglfw3-dev + LDLIBS += -lglfw + endif +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + # Libraries for Raspberry Pi compiling + # NOTE: Required packages: libasound2-dev (ALSA) + LDLIBS = -lraylib -lbrcmGLESv2 -lbrcmEGL -lpthread -lrt -lm -lbcm_host -ldl +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + # Libraries for web (HTML5) compiling + LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.bc +endif + +# Define a recursive wildcard function +rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) + +# Define all source files required +SRC_DIR = src +OBJ_DIR = obj + +# Define all object files from source files +SRC = $(call rwildcard, *.c, *.h) +#OBJS = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) +OBJS ?= main.c + +# For Android platform we call a custom Makefile.Android +ifeq ($(PLATFORM),PLATFORM_ANDROID) + MAKEFILE_PARAMS = -f Makefile.Android + export PROJECT_NAME + export SRC_DIR +else + MAKEFILE_PARAMS = $(PROJECT_NAME) +endif + +# Default target entry +# NOTE: We call this Makefile target or Makefile.Android target +all: + $(MAKE) $(MAKEFILE_PARAMS) + +# Project target defined by PROJECT_NAME +$(PROJECT_NAME): $(OBJS) + $(CC) -o $(PROJECT_NAME)$(EXT) $(OBJS) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM) + +# Compile source files +# NOTE: This pattern will compile every module defined on $(OBJS) +#%.o: %.c +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c + $(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM) + +# Clean everything +clean: +ifeq ($(PLATFORM),PLATFORM_DESKTOP) + ifeq ($(PLATFORM_OS),WINDOWS) + del *.o *.exe /s + endif + ifeq ($(PLATFORM_OS),LINUX) + find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -fv + endif + ifeq ($(PLATFORM_OS),OSX) + find . -type f -perm +ugo+x -delete + rm -f *.o + endif +endif +ifeq ($(PLATFORM),PLATFORM_RPI) + find . -type f -executable -delete + rm -fv *.o +endif +ifeq ($(PLATFORM),PLATFORM_WEB) + del *.o *.html *.js +endif + @echo Cleaning done + diff --git a/README.md b/README.md new file mode 100644 index 0000000..391606b --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# Squad prototype — тактический отряд с авто-огнём + +Технический прототип боевого ядра 2D-изометрического sci-fi horror roguelite. +Отряд из 5 агентов сам расставляется так, чтобы стрелять и **не задевать своих**. +Двое из пяти работают клинком: у ближнего боя то же правило в угловой форме — +свой в секторе замаха, значит удара не будет. + +![боевой кадр с оверлеем](docs/combat.png) + +C++17 · raylib 6.0 · CMake · **софтверный рендер** (вся сцена — ручная запись +пикселей в свой фреймбуфер 480×270, апскейл ×3). + +## Быстрый старт + +```bash +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` — оверлей. Стрельба всегда автоматическая. Полный список — в документации. + +## Самопроверка + +```bash +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](CLAUDE.md). Модульная документация в [docs/](docs/): + +- [00-overview](docs/00-overview.md) — что это и чего тут нет +- [01-build-and-run](docs/01-build-and-run.md) — сборка, управление, dev-режимы +- [02-architecture](docs/02-architecture.md) — модули, порядок шага, правила зависимостей +- [03-rendering](docs/03-rendering.md) — фреймбуфер, изометрия, спрайты +- [04-world](docs/04-world.md) — карта, рейкаст, коллизии, мишени +- [05-squad-ai](docs/05-squad-ai.md) — **ядро**: линии огня, решатель, резервирование +- [06-debug-and-tuning](docs/06-debug-and-tuning.md) — оверлей, метрики, тюнинг +- [07-milestones](docs/07-milestones.md) — журнал вех +- [08-decisions](docs/08-decisions.md) — отклонения от спека и почему +- [09-acceptance](docs/09-acceptance.md) — критерии приёмки и цифры +- [10-atmosphere](docs/10-atmosphere.md) — свет, туман войны, трассеры, напряжение +- [11-melee](docs/11-melee.md) — **ближний бой**: сектор удара, три фазы, свой круг + +Исходное ТЗ: [SQUAD_PROTOTYPE_SPEC.md](SQUAD_PROTOTYPE_SPEC.md). + +--- + +Проект вырос из шаблона [Raylib-CPP Starter Template for VS Code](https://youtu.be/acvgbKRaxDI); +от шаблона остался только `Makefile`, который больше не используется — сборка через CMake. diff --git a/SQUAD_PROTOTYPE_SPEC.md b/SQUAD_PROTOTYPE_SPEC.md new file mode 100644 index 0000000..affce52 --- /dev/null +++ b/SQUAD_PROTOTYPE_SPEC.md @@ -0,0 +1,313 @@ +# Прототип: тактический отряд с авто-огнём (изометрия, software rendering) + +Ты делаешь **технический прототип боевого ядра** для 2D-изометрического sci-fi horror roguelite / incremental ARPG. +Цель прототипа — **только одно**: доказать, что отряд из 5 агентов ведёт себя как «умная текучая сущность», которая сама расставляется так, чтобы стрелять и не задевать своих. + +Всё остальное (лут, прогрессия, враги-ИИ, уровни) — вне рамок. Не добавляй. + +--- + +## 1. Технические ограничения + +- **C++17**, **raylib 5.x**, **CMake** (raylib через `FetchContent`, если не найден в системе). +- Никаких других зависимостей. Никакого ECS-фреймворка, никакой физдвижка. +- **Software rendering.** Вся отрисовка сцены — ручная запись пикселей в собственный фреймбуфер (`uint32_t*`, RGBA8). Ни одного вызова raylib-примитивов для игровой сцены. + - Из raylib используются только: окно, ввод, таймер, `UpdateTexture` + `DrawTexturePro` для финального блита фреймбуфера на экран (фильтрация `TEXTURE_FILTER_POINT`). + - Исключение: **debug-оверлей** можно рисовать через `DrawText`/`DrawLine` поверх уже отмасштабированного кадра. Это dev-only, отключается по F1. +- **Внутреннее разрешение 480×270**, окно 1440×810 (целочисленный ×3 апскейл). Разрешение и множитель — константы. +- **Fixed timestep симуляции 60 Гц**, накопитель времени, рендер с интерполяцией позиций. Симуляция детерминирована. +- Однопоточно. Читаемость важнее производительности, но 5 агентов + 12 мишеней + 200 пуль должны идти в 60 fps без проблем. + +--- + +## 2. Ассеты + +**Никаких файлов.** Все спрайты генерируются процедурно в код при старте (пишешь пиксели в буфер): + +- `tile_floor` — ромб 32×16, 2 варианта оттенка (шахматка), тёмно-серый металл. +- `tile_wall` — блок 32×32 (ромб + вертикальные грани), заметно светлее пола. +- `agent` — 10×14, капсула с обводкой, 5 цветовых вариантов (по одному на агента). +- `target` — 12×16, тускло-красная капсула с обводкой. +- `bullet` — 2×2 точка. + +Спрайты хранятся как `Sprite { int w, h; std::vector px; }` с альфа-тестом (0 = прозрачно), без блендинга. + +--- + +## 3. Координаты и рендер + +**Критично: вся симуляция — в декартовом мире (top-down), изометрия существует только в рендерере.** +Никакой iso-математики в логике, ИИ или коллизиях. + +- Мир в тайлах, `float` координаты. Тайл = 1.0 юнит. +- Проекция: `sx = (wx - wy) * 16`, `sy = (wx + wy) * 8` (тайл 32×16), плюс смещение камеры. +- Камера следует за якорем отряда со сглаживанием, округляется до целых пикселей (чтобы не дрожало). +- Сортировка по глубине: все видимые сущности и стены в один список, сортировка по `(wx + wy)`, потом блит. +- Пол рисуется первым сплошным проходом по видимой области карты. + +--- + +## 4. Уровень + +Один захардкоженный тайлмап ~48×48, генерируется в коде: + +- открытая арена в центре; +- **колонны/огрызки стен по всей карте** — они обязаны быть, без них не проверить LOS и обход; +- пара узких проходов (шириной 2 тайла) — там правило «не стрелять сквозь своих» упирается в геометрию, это важный тест-кейс; +- по периметру — сплошная стена. + +Тайл: `EMPTY` (проходим, прозрачен) / `WALL` (непроходим, блокирует LOS и пули). + +**Мишени:** 12 штук, статичные, разбросаны кучками (по 1, по 3, по 5). У мишени есть HP (например, 500) и она **респавнится через 3 сек** после смерти на том же месте — прототип должен работать бесконечно. Мишени не атакуют и не двигаются (на этом этапе это шум). + +--- + +## 5. Управление (только клавиатура) + +| Клавиша | Действие | +|---|---| +| `WASD` | движение якоря отряда (в **экранных** осях, не мировых — иначе неинтуитивно) | +| `Shift` (удерж.) | медленный шаг | +| `Space` | переключить режим ручного прицеливания | +| `←/→` | в ручном режиме — поворот вектора прицела | +| `Tab` | сменить назначенную цель | +| `1/2/3` | пресет строя: клин / линия / кольцо | +| `F1` | debug-оверлей вкл/выкл | +| `F2` | показ линий огня | +| `F3` | показ кандидатов позиций и их оценок | +| `F4` | метрики | +| `R` | сброс уровня | +| `Esc` | выход | + +Стрельба **всегда автоматическая**. Игрок не нажимает «огонь» никогда, ни в одном режиме. + +--- + +## 6. ЯДРО: поведение отряда + +Это главная часть задания. Ниже — точная спецификация, реализуй её как **чистые, тестируемые функции**, отдельно от рендера. + +### 6.1 Сущности + +```cpp +struct Agent { + Vec2 pos, vel; + float facing; // радианы, куда смотрит ствол + float bodyRadius = 0.28f; + int slotIndex; // место в строю + AgentState state; + int currentTargetId; // -1 = нет + Vec2 postPos; // куда агент решил встать (огневая позиция) + float commitTimer; // блокировка перерешивания + float solveTimer; // стаггер решателя + Weapon weapon; +}; + +struct Weapon { + float range = 9.0f; + float fireInterval = 0.35f; + float cooldown; + float laneHalfWidth = 0.10f; // «толщина» траектории пули + float damage = 12.0f; +}; +``` + +### 6.2 Состояния отряда + +- `ADVANCING` — есть ввод движения. +- `HOLDING` — ввода нет дольше `0.15 сек`. + +### 6.3 Проверка линии огня (сердце всей механики) + +``` +bool LaneClear(shooter, targetPos, allAgents, tilemap): + seg = Segment(shooter.muzzle(), targetPos) + + // 1. свои + for each ally in allAgents, ally != shooter: + d = DistancePointToSegment(ally.pos, seg) + if d < ally.bodyRadius + shooter.weapon.laneHalfWidth + SAFETY_MARGIN: + return false + + // 2. геометрия + if TileRaycastBlocked(seg, tilemap): + return false + + // 3. дистанция + if seg.length() > shooter.weapon.range: + return false + + return true +``` + +`SAFETY_MARGIN = 0.15f` (тюнится). `muzzle()` — точка в `0.3` юнита от центра агента по `facing`. + +Рейкаст по тайлам — Amanatides & Woo (DDA), без выделений памяти. + +### 6.4 Логика в состоянии `ADVANCING` + +- Каждый агент движется к своему **слоту строя** относительно якоря, строй ориентирован по направлению движения. +- Стрельба **оппортунистическая**: стреляет только тот, у кого прямо сейчас `LaneClear` до какой-либо цели в радиусе. Остальные просто бегут. +- Приоритет цели у бегущего: ближайшая, до которой линия чиста. +- **Никакого перестроения ради огня** в этом состоянии — отряд едет туда, куда сказал игрок. +- Работает уклонение от чужих линий (см. 6.6) — агент, влезший в чужой сектор обстрела, смещается. + +### 6.5 Логика в состоянии `HOLDING` — решатель огневых позиций + +Запускается **не каждый кадр**: у каждого агента свой `solveTimer` (интервал `0.25 сек`), фазы сдвинуты так, чтобы за кадр решал максимум 1 агент. + +Условие запуска: у агента **нет** валидной линии огня ни к одной живой цели в радиусе. + +**Кандидаты позиций:** +- текущая позиция (для сравнения); +- 3 кольца радиусами `0.8 / 1.6 / 2.4` юнита × 12 направлений = 36 точек. + +Отбрасываются кандидаты: в стене, ближе `0.55` юнита к другому агенту, вне карты. + +**Оценка кандидата:** + +``` +score = 0 +if LaneClearFrom(candidate, bestTarget): score += 100 +score += 25 * (число целей, простреливаемых из candidate) / totalTargets +score -= 35 * (число союзников, чью текущую валидную линию перекрывает candidate) +score -= 9 * distance(candidate, agent.pos) +score -= 14 * max(0, distance(candidate, anchor) - COHESION_RADIUS) +if distance(candidate, ближайшая цель) < MIN_ENGAGE_DIST: score -= 60 +``` + +**Коммит с гистерезисом (обязательно, иначе будет дёрганье):** + +``` +if bestScore > currentPositionScore + HYSTERESIS(15.0): + agent.postPos = bestCandidate + agent.commitTimer = 0.6f // не перерешивать это время +``` + +`COHESION_RADIUS = 3.5`, `MIN_ENGAGE_DIST = 2.0`. + +Пока `commitTimer > 0` — агент идёт к `postPos` и не пересчитывает. + +### 6.6 Резервирование линий и расступание («текучесть») + +Каждый кадр собирается список **активных линий огня** — сегментов от стреляющих агентов к их целям. + +Любой агент, чьё тело попадает в чужую активную линию (`dist < bodyRadius + laneHalfWidth + SAFETY_MARGIN`), получает **steering-импульс перпендикулярно линии**, в сторону ближайшего края. Сила импульса растёт при приближении к оси. + +Это работает в **обоих** состояниях отряда и даёт главное ощущение: отряд сам «расплывается», освобождая сектора обстрела, без единой явной команды. + +### 6.7 Движение агента (слои, складываются в таком порядке) + +1. `seek` к целевой точке (слот строя или `postPos`); +2. `separation` от союзников (радиус `0.7`); +3. `laneAvoidance` (6.6) — **вес выше, чем у separation**; +4. `wallAvoidance` + скольжение вдоль стен при коллизии; +5. клампинг по максимальной скорости, интеграция, разрешение коллизий с тайлами (circle-vs-AABB, push-out). + +Скорость: `3.2` юнита/сек, `1.6` на Shift. + +### 6.8 Ручное прицеливание (`Space`) + +- Игрок вращает вектор прицела стрелками. +- **Назначенная цель** — ближайшая мишень в конусе ±20° от вектора прицела. `Tab` циклит между целями в конусе. +- Все агенты приоритезируют назначенную цель. +- **Правила 6.3–6.6 не меняются вообще.** Агент без чистой линии до назначенной цели: + - в `HOLDING` — перестраивается через решатель, целью решателя становится назначенная цель; + - в `ADVANCING` — не стреляет по ней; стреляет по вторичным целям, только если включён флаг `freeFireSecondary` (по умолчанию `true`). +- Ручной режим **никогда** не позволяет стрелять сквозь своих. Никаких исключений. + +### 6.9 Пули + +Настоящие снаряды, не хитскан: скорость `22` юнита/сек, коллизия с тайлами и со **всеми** капсулами, включая союзников. + +**`friendlyFire = true` всегда.** Дружественный урон должен быть физически возможен — иначе прототип ничего не доказывает. Счётчик попаданий по своим — главная метрика корректности. + +--- + +## 7. Debug-оверлей + +По `F1`, поверх кадра: + +- состояние отряда (`ADVANCING` / `HOLDING`), режим прицеливания; +- над каждым агентом: индекс, состояние, id цели; +- `F2`: линии огня — **зелёная** (чистая, стреляет), **жёлтая** (цель есть, линия перекрыта своим), **красная** (перекрыта стеной); +- `F3`: кандидаты последнего решателя точками, цвет = оценка (синий низкая → белый высокая), выбранный кандидат обведён; +- якорь отряда, радиус когезии, слоты строя; +- `F4`, метрики: + - **`FRIENDLY_HITS`** — накопительный счётчик попаданий по своим; + - **`FIRE UPTIME`** — % времени, когда агент имел валидную линию (за последние 10 сек, по каждому агенту и среднее); + - **`SETTLE TIME`** — время от перехода в `HOLDING` до момента, когда ≥4 агентов получили линию огня; + - fps, время симуляции на кадр. + +--- + +## 8. Тюнинг + +Все числа выше — в **одной структуре** `Tuning` в `tuning.h`, ни одного магического числа по коду. +Плюс runtime-подкрутка: `[` / `]` выбирают параметр, `-` / `=` меняют значение, текущее значение видно в оверлее. Это нужно, чтобы я сам почувствовал баланс. + +--- + +## 9. Структура проекта + +``` +CMakeLists.txt +src/ + main.cpp — окно, главный цикл, fixed timestep + tuning.h — все константы + core/math.h — Vec2, сегменты, DistPointSegment, углы + render/framebuffer.h/.cpp — фреймбуфер, clear, blit, линия, круг, блит на экран + render/sprites.h/.cpp — процедурная генерация спрайтов + render/iso.h — проекция мир↔экран, сортировка глубины + world/tilemap.h/.cpp — карта, DDA-рейкаст, коллизии + sim/agent.h/.cpp — агент, движение, steering + sim/squad.h/.cpp — якорь, строй, состояния отряда + sim/target.h/.cpp + sim/bullet.h/.cpp + ai/firing_solver.h/.cpp — LaneClear, оценка кандидатов, коммит + ai/lane_registry.h/.cpp — активные линии, расступание + debug/overlay.h/.cpp + debug/metrics.h/.cpp +``` + +`ai/` не должен знать ничего о рендере и об изометрии. Вообще. + +--- + +## 10. Порядок работы + +Делай по вехам, **после каждой — собери и запусти**, убедись что работает, потом иди дальше. Не пиши всё сразу. + +- **M0** — окно, фреймбуфер, апскейл, изометрическая сетка на экране. +- **M1** — тайлмап, стены, камера, сортировка по глубине. +- **M2** — 5 агентов, движение якоря, строй, separation, коллизии со стенами. +- **M3** — мишени, DDA-рейкаст, `LaneClear`, авто-огонь, пули, дружественный урон, счётчик `FRIENDLY_HITS`. +- **M4** — решатель огневых позиций, гистерезис, коммит, расступание из чужих линий. **Ключевая веха.** +- **M5** — ручное прицеливание, назначенная цель, `Tab`. +- **M6** — полный debug-оверлей, метрики, runtime-тюнинг. + +--- + +## 11. Критерии приёмки + +Прототип готов, когда **все** пункты выполняются: + +1. Отряд стоит в куче, игрок останавливается → **за ≤1.5 сек** минимум 4 из 5 агентов имеют чистую линию огня. Видно, как они расходятся веером. +2. **`FRIENDLY_HITS` = 0** за 3 минуты непрерывного боя во всех режимах, включая узкие проходы. +3. При движении отряда стреляют только те, у кого чистая линия; остальные не палят в спину союзникам. Визуально это заметно — часть агентов молчит. +4. Агент, оказавшийся на чужой линии огня, **сам отходит вбок** в течение ~0.3 сек. +5. Нет дёрганья: агент не переключает `postPos` чаще чем раз в `0.6` сек, позиции не осциллируют между двумя точками. +6. В узком проходе (2 тайла) отряд **самостоятельно вытягивается в колонну**, стреляет передний, задние подтягиваются и не стреляют. +7. В ручном режиме те же правила: агент без линии до назначенной цели перестраивается (стоя) либо молчит (в движении), но **никогда** не стреляет сквозь своего. +8. `FIRE UPTIME` в стоячем бою на открытой арене ≥ 80%. +9. Стабильные 60 fps. +10. Вся сцена нарисована собственным софтверным растеризатором; в игровой отрисовке нет raylib-примитивов. + +--- + +## 12. Чего не делать + +- Не добавлять врагов с ИИ, атаками, лут, UI, меню, звук, партиклы, освещение, туман войны. +- Не подключать сторонние библиотеки. +- Не писать ECS, не абстрагировать преждевременно. Простые структуры и вектора. +- Не «улучшать» правила стрельбы по своему усмотрению — раздел 6 реализуется как написано. Если считаешь, что где-то ошибка — сначала скажи, потом делай. diff --git a/docs/00-overview.md b/docs/00-overview.md new file mode 100644 index 0000000..ed913cb --- /dev/null +++ b/docs/00-overview.md @@ -0,0 +1,57 @@ +# 00 — Что это + +Технический прототип **боевого ядра** 2D-изометрического sci-fi horror roguelite. +Доказывает ровно одну вещь: + +> отряд из 5 агентов ведёт себя как «умная текучая сущность», которая сама +> расставляется так, чтобы атаковать и не задевать своих. + +Всё остальное — вне рамок и намеренно не сделано. + +## Что есть + +- 5 агентов, один диск отряда (якорь), три пресета строя (клин / линия / кольцо). +- Полностью **автоматическая** атака: игрок не нажимает «огонь» никогда. +- Проверка линии огня по своим, по стенам и по дальности (спек 6.3). +- Решатель огневых позиций с гистерезисом и коммитом (спек 6.5). +- Резервирование линий огня и расступание из чужих секторов (спек 6.6). +- Настоящие пули-снаряды, дружественный урон физически возможен (спек 6.9). +- Ручное прицеливание с назначенной целью и `Tab` (спек 6.8). +- **Ближний бой**: второй класс оружия с сектором замаха вместо линии огня, + тремя фазами удара и своим, большим кругом вокруг диска + ([11-melee.md](11-melee.md)). В спеке его нет. +- Хоррор-слой: свет, туман войны, трассеры, напряжение + ([10-atmosphere.md](10-atmosphere.md)). В спеке его тоже нет. +- Debug-оверлей, метрики корректности, runtime-тюнинг. + +## Чего нет и не будет + +Врагов с ИИ, лута, прогрессии, UI, меню, звука, ECS, сторонних библиотек. +Мишени статичны и не атакуют — это шум для задачи. + +Свет, туман войны и эффекты в исходных рамках тоже стояли в этом списке, но +появились вместе с хоррор-слоем. Правило, по которому их пустили: они живут +только в `render/`, `RenderGame` принимает `const Game&`, и на симуляцию повлиять +физически не могут. Ближний бой — единственное добавление, которое **меняет** +правила, поэтому он проверяется собственными критериями приёмки (M7.1–M7.3). + +## Технические рамки + +| | | +|---|---| +| Язык | C++17, без зависимостей кроме raylib | +| Библиотека | raylib 6.0 (через CMake FetchContent, если нет системной) | +| Рендер сцены | **собственный софтверный растеризатор**, ручная запись пикселей | +| raylib используется для | окно, ввод, таймер, `UpdateTexture` + `DrawTexturePro`, debug-текст | +| Разрешение | внутреннее 480×270, окно 1440×810 (целочисленный ×3) | +| Симуляция | fixed timestep 60 Гц, детерминированная, рендер с интерполяцией | +| Потоки | один | + +Ни одного raylib-примитива в отрисовке игровой сцены. Единственное исключение — +debug-оверлей поверх уже отмасштабированного кадра, он dev-only и снимается по `F1`. + +## Куда дальше + +- Собрать и запустить — [01-build-and-run.md](01-build-and-run.md). +- Понять устройство кода — [02-architecture.md](02-architecture.md). +- Понять **главное** (поведение отряда) — [05-squad-ai.md](05-squad-ai.md). diff --git a/docs/01-build-and-run.md b/docs/01-build-and-run.md new file mode 100644 index 0000000..49ebc08 --- /dev/null +++ b/docs/01-build-and-run.md @@ -0,0 +1,112 @@ +# 01 — Сборка, запуск, управление + +## Требования + +- CMake 3.16+ +- Компилятор с C++17. Проверено на MSVC 14.44 (Visual Studio 2022, x64). +- Интернет при **первой** конфигурации: raylib 6.0 качается через `FetchContent`. + Если в системе уже стоит raylib 6.x, `find_package(raylib 6)` возьмёт её и ничего не качает. + +## Сборка + +```bash +cmake -S . -B build # разово; тянет и собирает raylib (~1-2 мин) +cmake --build build --config Release --parallel +``` + +Бинарник: `build/bin/squad_proto.exe` (при любом генераторе, включая multi-config). + +Debug-сборка (`--config Debug`) кладёт бинарник туда же и идёт в 60 fps, так что +проверять правки стоит именно в ней: MSVC включает проверки итераторов и ловит +выходы за границы, которых в Release не видно. + +В VS Code: `F5` — конфигурация **Run (Release)** из `.vscode/launch.json`, +сборка идёт задачей `build release`. Есть также задачи `accept` и `headless 180s`. + +> `Makefile` в корне остался от исходного шаблона raylib-vscode и **не используется** — +> он ссылается на `C:/raylib/w64devkit`. Актуальная сборка только через CMake. + +### Если CMake ругается на генератор + +``` +CMake Error: Error: generator : Visual Studio 17 2022 +Does not match the generator used previously: Visual Studio 18 2026 +``` + +Каталог `build/` привязан к конкретному генератору, и на машине с несколькими +Visual Studio его легко получить несогласованным: обычный `cmd.exe` и +Developer Command Prompt выбирают разные версии по умолчанию. Лечится сносом +каталога — он целиком производный, в нём нет ничего своего: + +```bash +rmdir /s /q build # cmd +rm -rf build # bash +cmake -S . -B build +``` + +Чтобы зафиксировать версию явно, передай генератор при первой конфигурации: + +```bash +cmake -S . -B build -G "Visual Studio 17 2022" -A x64 +``` + +Дальше `cmake -S . -B build` без `-G` будет переиспользовать генератор из кэша. +`build/` намеренно в `.gitignore` — в репозитории его быть не должно. + +## Управление + +| Клавиша | Действие | +|---|---| +| `WASD` | движение диска (якоря отряда) в **экранных** осях | +| `Shift` (удерж.) | рывок (базовый шаг намеренно медленный) | +| `Space` | переключить режим ручного прицеливания | +| `←` / `→` | в ручном режиме — поворот вектора прицела | +| `Tab` | сменить назначенную цель (внутри конуса прицела) | +| `1` / `2` / `3` | строй: клин / линия / кольцо | +| `F1` | оверлей вкл/выкл | +| `F2` | линии огня | +| `F3` | кандидаты решателя и их оценки | +| `F4` | метрики | +| `F5` | выключить хоррор-слой (свет/туман/пост) | +| `F6` | показать диски обзора | +| `[` / `]` | выбрать параметр тюнинга | +| `-` / `=` | изменить выбранный параметр | +| `R` | сброс уровня | +| `Esc` | выход | + +Стрельба **всегда автоматическая**, клавиши огня нет ни в одном режиме. +Ближний бой тоже: бойцы с клинком сами доходят до цели и бьют, пока она внутри +их круга ([11-melee.md](11-melee.md)). + +Диск намеренно быстрее бойцов и держится к ним на поводке: команда читается +мгновенно, а средняя скорость похода всё равно определяется ногами отряда. + +## Dev-режимы командной строки + +Симуляция детерминирована и не зависит от рендера, поэтому её можно гонять без окна. + +| Аргумент | Что делает | +|---|---| +| `--accept` | прогоняет сценарии критериев приёмки (спек 11) и печатает PASS/FAIL | +| `--headless <сек>` | прогон по маршруту без окна + метрики каждые 10 с | +| `--probe` | к `--headless`: подробности по каждому агенту на стоянках | +| `--no-solver` | отключить решатель огневых позиций (A/B сравнение) | +| `--no-laneavoid` | отключить расступание из чужих линий (A/B сравнение) | +| `--melee N` | сколько слотов строя держат клинок (по умолчанию 2, `0` = все стрелки) | +| `--set имя=значение` | подкрутить любой параметр из `TUNABLES` без пересборки | +| `--shot [кадров] [файл]` | снять скриншот через N кадров и выйти | +| `--clean` | стартовать без оверлея — чистый кадр для скриншотов | + +Примеры: + +```bash +squad_proto.exe --accept +squad_proto.exe --headless 300 +squad_proto.exe --headless 300 --no-solver --no-laneavoid # каким прототип был бы без ядра +squad_proto.exe --headless 300 --melee 0 # чистый отряд стрелков +squad_proto.exe --headless 300 --set safetyMargin=0.25 --set laneReserve=2.0 +squad_proto.exe --clean --shot 220 melee.png # кадр без отладки +``` + +Код прогонов — [src/debug/harness.cpp](../src/debug/harness.cpp), маршрут и сценарии описаны там же. +Что означают цифры в выводе — [06-debug-and-tuning.md](06-debug-and-tuning.md). diff --git a/docs/02-architecture.md b/docs/02-architecture.md new file mode 100644 index 0000000..42ab24e --- /dev/null +++ b/docs/02-architecture.md @@ -0,0 +1,103 @@ +# 02 — Архитектура + +## Карта модулей + +``` +src/ + main.cpp окно, ввод, главный цикл, fixed timestep. Игровой логики нет + game.h/.cpp склейка: карта + отряд + мишени + пули + метрики, порядок шага + tuning.h ВСЕ числа прототипа + таблица runtime-подкрутки + core/ + math.h Vec2, отрезки, DistancePointToSegment, углы. Header-only + input.h InputState — ввод, влияющий на симуляцию + render/ + view.h/.cpp ВСЁ render-only состояние + RenderGame(const Game&, ...) + framebuffer.h/.cpp софтверный буфер RGBA8, блит (в т.ч. со светом), аддитивные примитивы + sprites.h/.cpp процедурная генерация всех спрайтов при старте + iso.h проекция мир↔экран, камера, ключ сортировки по глубине + scene.h/.cpp проход по полу + общий список сущностей и стен с сортировкой + lighting.h/.cpp свет и туман войны (см. docs/10-atmosphere.md) + fx.h/.cpp трассеры, вспышки дула, искры попаданий + post.h/.cpp напряжение (Dread) и слитый пост-проход + noise.h единственное место render-only псевдослучайности + world/ + tilemap.h/.cpp карта, генерация уровня, DDA-рейкаст, circle-vs-AABB + sim/ + loadout.h класс оружия, параметры ствола и клинка, фазы удара + agent.h/.cpp агент, слои движения (seek/separation/targetPush/wallAvoid) + squad.h/.cpp якорь и поводок, строй, ADVANCING/HOLDING, сборка слоёв + target.h/.cpp мишени, респавн, отдача от удара и возврат на место + bullet.h/.cpp снаряды, коллизии с тайлами и капсулами + events.h кольцевой журнал боевых событий: единственный канал к эффектам + ai/ + firing_solver.h/.cpp LaneClear, выбор цели, решатель огневых позиций + lane_registry.h/.cpp активные линии огня и секторы клинков, импульс расступания + melee.h/.cpp цель ближнего боя, подход вплотную, чистота сектора + debug/ + overlay.h/.cpp оверлей F1–F4 поверх кадра (единственное место с raylib-примитивами) + metrics.h/.cpp FRIENDLY_HITS, FIRE UPTIME, SETTLE TIME, журнал попаданий по своим + harness.h/.cpp прогоны --headless и --accept +``` + +Против структуры из спека добавлены: `game.h/.cpp`, `core/input.h`, +`render/scene.h/.cpp`, `debug/harness.h/.cpp`, хоррор-слой +(`render/view`, `lighting`, `fx`, `post`, `noise`, `sim/events.h`) и ближний бой +(`sim/loadout.h`, `ai/melee.h/.cpp`). Зачем — [08-decisions.md](08-decisions.md), +[10-atmosphere.md](10-atmosphere.md) и [11-melee.md](11-melee.md). + +## Правила зависимостей + +1. **`RenderGame` принимает `Game` по константной ссылке.** Поэтому свет, трассеры и + тряска камеры физически не могут изменить симуляцию — это проверяет компилятор, + а не внимательность. Всё render-only состояние живёт в `View`, которое + headless-прогоны не создают вообще. +2. **`ai/` не знает ничего** про рендер, изометрию и ввод. Только `core/`, `sim/`, `world/`. +3. **`sim/` и `world/` работают в декартовом мире** (top-down), тайл = 1.0 юнита. + Изометрия существует только в `render/` и в оверлее. +4. Ввод в экранных осях переводится в мировое направление ровно в одном месте — + `Game::Step` через `iso::ScreenDirToWorld`. Дальше по симуляции экранных осей нет. +5. `tuning.h` не зависит ни от чего; его включают все. + +## Порядок одного шага симуляции + +`Game::Step(dt)` — фиксированный порядок, важен именно он: + +| # | Что | Почему здесь | +|---|---|---| +| 1 | пресет строя из ввода | до всего остального | +| 2 | мишени: респавн, отдача, возврат на место | состояние мира на начало шага | +| 3 | якорь + поводок + состояние отряда (`ADVANCING`/`HOLDING`) | движение зависит от состояния | +| 4 | **движение агентов** (слои 6.7) | реестр линий берётся с прошлого шага, задержка 1/60 с | +| 5 | ручное прицеливание, назначенная цель | до выбора целей | +| 6 | **оценка линий огня** и **выбор цели клинка** по новым позициям | целеуказание, `hasLane`, `melee.inReach` | +| 7 | пересборка реестра: линии огня + секторы клинков | для расступания и оценки кандидатов | +| 8 | решатель огневых позиций / подход клинка вплотную | решатель — только в `HOLDING` и только без линии | +| 9 | доворот ствола (у клинка на замахе ось зафиксирована) | визуальная часть | +| 10 | **атака**: огонь, затем взмах | позиции те же, что в п.6 | +| 11 | пули | коллизии со стенами и капсулами | +| 12 | метрики | снимок конца шага | + +Ключевое: пункты 6 и 10 разделены только доворотом ствола, позиции между ними +не меняются. Поэтому отрезок, который проверил `LaneClear`, и отрезок, по которому +полетела пуля, — это буквально один и тот же отрезок. Для клинка то же самое +верно про сектор: проверенный в п.6/8 и рассечённый в п.10 — один и тот же. + +## Детерминизм + +- Фиксированный шаг 1/60, накопитель времени, максимум 5 шагов за кадр. +- Ни одного вызова RNG в симуляции. Уровень и расстановка мишеней захардкожены. +- Вырожденные случаи разрешаются по индексу слота, а не случайно + (например, расталкивание двух агентов, стоящих в одной точке). +- Камера обновляется в рендере по реальному времени кадра и на симуляцию не влияет. + +Поэтому `--headless` воспроизводит один и тот же прогон и годится как тест. + +## Рендер и симуляция + +`RenderGame(const Game&, View&, ...)` не может изменить симуляцию — это гарантирует +подпись. Позиции агентов и пуль интерполируются `Lerp(prevPos, pos, alpha)`, камера +сглаживается по `frameDt` и округляется до целого пикселя, чтобы картинка не дрожала. + +Единственный канал в обратную сторону — кольцевой журнал `sim/events.h`: симуляция +пишет в него боевые события, эффекты читают. Правила его не читают, в headless +передаётся `nullptr`. Подробности — [10-atmosphere.md](10-atmosphere.md). diff --git a/docs/03-rendering.md b/docs/03-rendering.md new file mode 100644 index 0000000..256e12f --- /dev/null +++ b/docs/03-rendering.md @@ -0,0 +1,102 @@ +# 03 — Рендер: софтверный буфер, изометрия, спрайты + +## Фреймбуфер + +[src/render/framebuffer.h](../src/render/framebuffer.h) — `std::vector` 480×270. + +Формат — RGBA8, в памяти байты идут `R,G,B,A`, значит little-endian `uint32` это +`A<<24 | B<<16 | G<<8 | R`. Помощник `RGBA(r,g,b,a)` собирает цвет правильно. + +Примитивы: `Clear`, `Put`, `Blit`, `BlitTinted`, `FillRect`, `Line` (Брезенхем), +`CircleOutline` (средняя точка), `CircleFilled`. Всё пишет пиксели руками. + +Спрайты пишутся **альфа-тестом**: пиксель с `alpha == 0` не пишется, полупрозрачности +нет. Для эффектов есть **аддитивное** смешивание с насыщением (`AddSat`, `AddBeam`, +`AddGlowDisc`) и умножение (`ScaleColor8`, `BlitMul`), а для света — `BlitShaded`, +пропускающий цвет через световую рампу. Подробности — [10-atmosphere.md](10-atmosphere.md). + +`Blit` обрезает спрайт по границам буфера ДО циклов и **выходит при пустом +диапазоне**: иначе адрес строки вычисляется за концом вектора. Цикл при этом не +выполняется, разыменования нет, но индекс уже невалиден — Debug-сборка ловит это +как `vector subscript out of range`, Release молча считает мусорный адрес. + +Вывод на экран — `ScreenBlitter`: `UpdateTexture` + `DrawTexturePro` с +`TEXTURE_FILTER_POINT`. Это единственное место рендера, знающее про raylib; +`Texture2D` спрятан за `void*`, чтобы `raylib.h` не протёк в заголовок. + +## Изометрия + +[src/render/iso.h](../src/render/iso.h). Тайл 32×16: + +``` +sx = (wx - wy) * 16 +sy = (wx + wy) * 8 +``` + +Обратная проекция: `wx = sx/32 + sy/16`, `wy = sy/16 - sx/32`. + +`ScreenDirToWorld` переводит направление ввода из экранных осей в мировые — +именно это делает `WASD` интуитивным. Больше изометрия нигде не используется. + +**Камера** следует за интерполированным якорем экспоненциальным сглаживанием +(`1 - exp(-smooth*dt)`), смещение округляется до целых пикселей — иначе +при ×3 апскейле картинка дрожит. + +## Сортировка по глубине + +Ключ — `wx + wy`. Пол рисуется первым сплошным проходом и в сортировке не участвует. +Все стены и все сущности попадают в **один** список `Scene::items` и сортируются +`std::stable_sort` (стабильная — чтобы порядок был детерминирован при равных ключах). + +Отсечение — по экранным координатам с запасом на высоту спрайта стены. + +## Точка привязки спрайта + +У `Sprite` есть поля `ax, ay` — точка внутри спрайта, которая совмещается с +экранной проекцией мировой позиции. Так блит не зависит от размера спрайта: + +| Спрайт | Размер | Привязка | Смысл | +|---|---|---|---| +| пол | 32×16 | (16, 8) | центр ромба = центр тайла | +| стена | 32×32 | (16, 24) | низ блока садится на ромб пола | +| агент (стрелок) | 10×14 | (5, 12) | «ноги» на земле | +| агент (клинок) | 12×15 | (6, 13) | шире в плечах, класс читается силуэтом | +| мишень | 12×16 | (6, 14) | то же | + +У пули спрайта нет: снаряд рисуется светящимся трассером, см. [10-atmosphere.md](10-atmosphere.md). + +## Процедурные спрайты + +[src/render/sprites.cpp](../src/render/sprites.cpp), файлов с ассетами нет. + +- **Пол** — ромб 32×16, два оттенка тёмно-серого металла по шахматке `(x+y)&1`, + затемнённый рант по краю и редкие светлые крапины для фактуры. +- **Стена** — верхняя грань (тот же ромб) + вертикальные грани: для каждого столбца + ищется нижняя кромка ромба и вниз заливается на высоту тайла. Левая грань темнее + правой. Обводка по силуэту — пиксели, у которых есть прозрачный 4-сосед. +- **Агент** — капсула: пиксель внутри, если расстояние до вертикального отрезка + меньше радиуса; внешний пиксель кольца — обводка, слева-сверху блик. + 5 различимых цветов, по одному на агента. +- **Агент с клинком** — та же капсула, крупнее, плюс стальная вертикаль с бликом + и гардой у правого края. Цвет уже занят номером агента, поэтому класс обязан + читаться формой. Сам взмах рисуется не спрайтом, а аддитивной дугой + ([11-melee.md](11-melee.md)). +- **Мишень** — та же капсула, тускло-красная, 12×16. В темноте тело не видно — + виден только тлеющий красный «глаз», нарисованный аддитивно поверх сцены. + +Порядок отрисовки кадра: + +``` +Clear(чёрный) → свет → пол (BlitShaded) → список (стены, мишени, агенты) +→ сортировка → блит → глаза мишеней → трассеры, вспышки и дуги клинков +(аддитивно) → ОДИН пост-проход → Present → оверлей (raylib, dev-only) +``` + +Три инварианта, нарушение любого ломает картинку молча: + +1. альфа фреймбуфера всегда 255; +2. ступень 0 световой рампы совпадает с цветом `Clear` — только поэтому полностью + тёмные тайлы можно не рисовать; +3. стена никогда не темнее самого яркого соседа-пола — иначе сквозь пропущенный + тёмный блок проступит освещённый пол тайла (tx−1, ty−1), который рисуется + раньше по глубине. diff --git a/docs/04-world.md b/docs/04-world.md new file mode 100644 index 0000000..c8315c5 --- /dev/null +++ b/docs/04-world.md @@ -0,0 +1,80 @@ +# 04 — Мир: карта, рейкаст, коллизии, мишени + +## Тайлмап + +[src/world/tilemap.h](../src/world/tilemap.h). Сетка 48×48, тайл `EMPTY` или `WALL`. +Тайл = 1.0 юнита, координаты сущностей — `float`. + +**Вне карты считается стеной.** Это убирает граничные проверки из рейкаста и коллизий. + +## Планировка уровня + +Генерируется кодом, без RNG, полностью детерминированно (`Tilemap::Generate`). + +``` + y 0..1 сплошная рамка (2 тайла по всему периметру) + y 2..12 северная комната: кучка из 3 мишеней + колонны + y 13..15 стена-разделитель на всю ширину + проход A: x=10..11 проход B: x=30..31 (оба шириной 2 тайла) + y 16..45 центральная арена: кучка из 5 мишеней, колонны, огрызки стен, блок 2x2 + x 12..14 западная стена-разделитель (y 20..44), проход: y=30..31 + x 38..40 восточная стена-разделитель (y 18..40), проход: y=27..28 +``` + +Отряд стартует в `(24, 26)` — открытая арена, кучка из 5 мишеней в радиусе оружия. + +Колонны и огрызки стен раскиданы по всей карте намеренно: без них не проверить +ни LOS, ни обход. Три прохода шириной 2 тайла — это тест-кейс, где правило +«не стрелять сквозь своих» упирается в геометрию. + +Северная кучка мишеней стоит **напротив прохода B** (`x=29.5/31.5`), так что из +коридора до неё есть чистая линия. Без этого проверить критерий «в узком проходе +отряд вытягивается в колонну, стреляет передний» было бы не на чем. + +Кучка обязана быть **в пределах дальности от середины прохода** (`y≈14`), иначе +тест-кейс проверяет пустоту. При укорочении дальности до 7.2 её пришлось +подтянуть на два тайла к югу (`y` 5.5–8.5 → 7.5–10.5): ближняя мишень теперь в +~6.5 юнита. Меняешь `weaponRange` — пересчитывай и эти координаты. + +## DDA-рейкаст + +`Tilemap::RaycastBlocked(a, b, tHit)` — Amanatides & Woo, без аллокаций. +Возвращает, пересекает ли отрезок стену, и опционально параметр входа в стену `[0..1]`. + +Используется в трёх местах: +- `LaneClear` — пункт «геометрия» (спек 6.3); +- пуля — поиск столкновения со стеной за шаг; +- оценка кандидатов решателя — там же, через `LaneClear`. + +## Коллизии + +`ResolveCircle(pos, r)` — circle vs AABB тайла: для каждой стены в охватывающем +прямоугольнике ищется ближайшая точка AABB и круг выталкивается по нормали. +Три итерации — из-за углов, где выталкивание одной стеной загоняет в другую. +Вырожденный случай (центр внутри тайла) выталкивается по ближайшей грани. + +**Скольжение вдоль стен** делается в `IntegrateAgent`: после выталкивания из +скорости вычитается только нормальная составляющая, касательная остаётся. +Плюс к этому `WallAvoidForce` даёт касательную силу обхода — см. +[05-squad-ai.md](05-squad-ai.md), слой 4. + +`CircleHitsWall(pos, r)` — быстрая проверка «в стене ли», для отбраковки кандидатов. + +## Мишени + +[src/sim/target.h](../src/sim/target.h). 12 штук, не атакуют и сами никуда не идут. + +- Расстановка кучками: 5 (арена) + 3 (север) + 3 (запад) + 1 (восток). +- HP 500, урон пули 12 → 42 попадания. Урон клинка 130 → 4 удара. +- Умерла → респавн через 3 с на том же месте. Прототип работает бесконечно. + +Мёртвая мишень не рисуется, не выбирается целью и не участвует в оценке покрытия. + +**Отдача.** Удар в ближнем бою отбрасывает мишень (`meleeKnockback`), импульс +гасится (`targetKnockDamp`), и мишень возвращается на своё место `home` +(`targetReturnRate`). Без отдачи попадание в упор визуально не отличается от +промаха. Возврат обязателен: расстановка захардкожена, и уползание мишеней +поломало бы все замеры разом — респавн дополнительно ставит `pos = home`. + +**Тело.** Мишень расталкивает агентов (`TargetPushForce`, `wTargetPush`): до +ближнего боя агент мог стоять внутри мишени, и удар не читался вообще. diff --git a/docs/05-squad-ai.md b/docs/05-squad-ai.md new file mode 100644 index 0000000..a7b8c66 --- /dev/null +++ b/docs/05-squad-ai.md @@ -0,0 +1,254 @@ +# 05 — Ядро: поведение отряда + +Главный файл проекта. Всё здесь — чистые функции над состоянием мира, +без рендера и изометрии: [src/ai/firing_solver.cpp](../src/ai/firing_solver.cpp), +[src/ai/lane_registry.cpp](../src/ai/lane_registry.cpp), [src/sim/squad.cpp](../src/sim/squad.cpp). + +Этот файл описывает поведение **стрелка**. Боец ближнего боя живёт по тем же +правилам в угловой форме — [11-melee.md](11-melee.md). + +## Состояния отряда + +- `ADVANCING` — есть ввод движения. +- `HOLDING` — ввода нет дольше `holdDelay` (0.15 с). + +Состояние общее для отряда, копируется в каждого агента. При смене состояния +сбрасываются `commitTimer`, а при входе в `HOLDING` каждому агенту ставится +`postPos = его текущая позиция`: отряд встал там, где встал, дальше его +расставляет решатель. + +## 1. Проверка линии огня — `LaneClearFrom` + +Сердце всей механики. Порядок проверок ровно как в спеке 6.3: + +``` +muzzle = from + normalize(target - from) * muzzleOffset // 0.3 юнита + +1. свои: для каждого союзника (кроме стрелка) + если DistancePointToSegment(ally.pos, muzzle, target) + < ally.bodyRadius + laneHalfWidth + safetyMargin -> нет линии +2. геометрия: если DDA-рейкаст muzzle->target упёрся в стену -> нет линии +3. дистанция: если |muzzle - target| > weaponRange -> нет линии +``` + +Порог по умолчанию: `0.28 + 0.10 + 0.15 = 0.53` юнита. + +Функция принимает **произвольную точку** `from`, а не только позицию агента — +поэтому ей же оценивается «а если я встану вот сюда» в решателе. + +Дуло считается в сторону цели, а не по текущему `facing`. Это важно: пуля +вылетает из той же точки и в том же направлении, что проверялось. + +## 2. Выбор цели + +`EvaluateAgentLane` — один проход на агента за шаг: + +- **Авто-режим**: ближайшая живая мишень в радиусе, до которой линия чиста. +- **Ручной режим** (спек 6.8): сначала назначенная цель. Если до неё линии нет: + - в `HOLDING` агент молчит и перестраивается решателем (цель решателя = назначенная); + - в `ADVANCING` стреляет по вторичным целям, только если `freeFireSecondary` (по умолчанию да). + +Побочно заполняются флаги для оверлея: `targetBlockedByAlly`, `targetBlockedByWall`, +и `laneIntent` — «цель есть, мешает только свой» (см. пункт 4). + +## 3. Решатель огневых позиций (`HOLDING`) + +`SolveFiringPosition`. Запускается **не каждый кадр**: у каждого агента свой +`solveTimer` с интервалом 0.25 с, фазы разведены при старте так, что за кадр +решает максимум один агент. + +Условия запуска: состояние `HOLDING`, `commitTimer == 0`, и у агента **нет** +линии к приоритетной цели. + +**Кандидаты**: текущая позиция (индекс 0, для сравнения) + 3 кольца +радиусами 0.8 / 1.6 / 2.4 × 12 направлений = 37 точек. + +**Отбраковка**: вне карты, в стене, ближе 0.55 юнита к другому агенту. +Текущая позиция не отбраковывается никогда — она база сравнения. + +**Оценка** (`ScoreCandidate`, все веса в `tuning.h`): + +``` ++100 если из кандидата чиста линия до основной цели ++25 * (простреливаемых целей / всего живых целей) +-35 * (число союзников, чью текущую линию перекрывает кандидат) +- 9 * расстояние(кандидат, текущая позиция) +-24 * max(0, расстояние(кандидат, якорь) - cohesionRadius 2.1) +-60 если ближайшая цель ближе minEngageDist 1.6 +``` + +**Жёсткая граница**: кандидат дальше `cohesionRadius + postLeash` (2.1 + 1.0) от +якоря отбраковывается совсем. Одной цены не хватает — линия огня стоит 100 очков, +и за неё решатель готов уйти сколько угодно далеко. Замер: без жёсткой границы +стрелок отходил от диска на 3.65 юнита, с ней — на 2.81, а `FIRE UPTIME` на +маршруте вырос, а не упал (отряд плотнее — линий больше). + +**Коммит с гистерезисом** — без него агент дёргается: + +``` +если bestScore > currentScore + 15: + postPos = лучший кандидат + commitTimer = 0.6 // это время не перерешивать +``` + +Пока `commitTimer > 0`, агент просто идёт к `postPos`. + +Если целей в досягаемости нет вообще, решателю не над чем работать — тогда +`postPos` = слот строя, чтобы отставший агент возвращался к отряду +(случай, которого нет в спеке, см. [08-decisions.md](08-decisions.md)). + +## 4. Резервирование линий и расступание + +[src/ai/lane_registry.cpp](../src/ai/lane_registry.cpp). Каждый шаг собирается список +активных линий — отрезков «дуло → цель». В реестр попадают: + +- агенты с чистой линией (реально стреляющие); +- **агенты, чью линию перекрыл только свой** (`laneIntent`). + +Второй пункт — важное уточнение против буквального текста спека. Если +регистрировать только реально стреляющих, то стоит кому-то влезть в линию — +у стрелка линия пропадает, отрезок исчезает из реестра, и **перекрывшего ничто +не выталкивает**. Сектор обстрела не освобождается никогда. Подробно и с цифрами — +[08-decisions.md](08-decisions.md). + +Импульс: агент, попавший в чужую линию, получает силу **перпендикулярно** линии +в сторону ближайшего края; сила растёт при приближении к оси +(`(1 - d/threshold) * laneAvoidStrength`, с насыщением до 1). + +Порог резерва шире, чем порог «тело в линии» из 6.3, в `laneReserveScale` раз +(по умолчанию 1.8). Причина — там же в 08-decisions: резерв должен отжимать +агента **до** того, как он влез под уже летящую пулю. + +Работает в обоих состояниях отряда. Это и даёт главное ощущение: отряд +«расплывается» сам, без единой явной команды. + +## 5. Движение агента — слои + +`Squad::UpdateMovement`, порядок из спека 6.7: + +| # | Слой | Вес | Файл | +|---|---|---|---| +| 1 | `seek` к цели (слот строя или `postPos`), с торможением у цели | `wSeek` 1.0 | `agent.cpp` | +| 2 | `separation` от союзников, радиус 0.7 | `wSeparation` 1.0 | `agent.cpp` | +| 3 | `laneAvoidance` — расступание из чужих линий и секторов | `wLaneAvoid` **2.4** | `lane_registry.cpp` | +| 3′ | `targetPush` — мишень тоже тело, а не пустое место | `wTargetPush` 1.0 | `agent.cpp` | +| 4 | `wallAvoidance` + касательное скольжение | `wWallAvoid` 1.2 | `agent.cpp` | +| 5 | клампинг скорости, интеграция, разрешение коллизий | — | `agent.cpp` | + +Вес расступания намеренно выше веса separation — так требует спек. + +Слой 3′ добавлен вместе с ближним боем: без него боец стоял **внутри** того, +кого рубит. Стрелков он тоже касается — они перестали проходить сквозь мишени. + +Боец ближнего боя в активном окне удара весь этот стек пропускает: он едет по +оси удара со своей скоростью и своим ускорением, остаются только стены. + +Слой 4 не только отталкивает от стены, но и добавляет **касательную** составляющую +в сторону цели, когда стена стоит между агентом и целью. Без этого seek и +отталкивание уравновешиваются, и агент залипает в «тени» препятствия — это +реально ловилось в прогонах (агент оставался в комнате, когда отряд ушёл). + +Скорость 1.75 юнита/с, 2.7 на `Shift`. Скорость подтягивается к желаемой с +ограничением `steerAccel`, чтобы резкие развороты не телепортировали агента. + +## 5a. Диск и поводок + +Якорь («диск», за которым идёт камера) движется **быстрее** бойцов: 3.3 против +1.75, на `Shift` 4.8 против 2.7. Это отвечает за отзывчивость: старт и разворот +читаются мгновенно, а не через полсекунды инерции пятерых. + +Само по себе это ломало бы отряд — диск просто уезжал бы вперёд, слоты строя за +ним, и агенты вечно бежали бы в хвосте. Поэтому есть **поводок**, и он +**упругий**, а не жёсткий: + +| Параметр | Смысл | +|---|---| +| `anchorLeash` (2.4) | мягкая граница: до неё диск идёт свободно | +| `anchorLeashMax` (3.6) | жёсткий предел: страховка, дальше не пускает вообще | +| `leashDrag` (0.75) | между границами диск тяжелеет; на упоре остаётся 25 % скорости | + +Жёсткий поводок здесь не годился принципиально: он мгновенно упирается, +дистанция намертво встаёт в одно значение, и по ней уже нельзя отличить +«подправил направление» от «тяну отряд вперёд изо всех сил». Упругий поводок +делает дистанцию непрерывной величиной — а из неё считается **натяжение** +(`urgency`), которое разгоняет отряд, растягивает строй и на верхней трети шкалы +(`sprintAt`) прекращает огонь вовсе. + +Итог: «быстро» — это отзывчивость на старте и на развороте, а средняя скорость +похода всё равно определяется ногами отряда. Порядок важен: сдвиг → сопротивление +→ жёсткий предел → `ResolveCircle` по стенам. + +### Равновесие поводка, или почему отряд идёт с боем + +Диск быстрее отряда, поэтому при зажатом направлении дистанция растёт, пока +сопротивление поводка не сравняет скорости. Это равновесие — рабочий режим игры, +и считать его надо явно: + +``` +pull = (dist - anchorLeash*urgeStartFrac) / (anchorLeashMax - anchorLeash*urgeStartFrac) +speed = lerp(moveSpeed, moveSpeedFast, urgency) отряд +anchor = anchorSpeed * max(0.08, 1 - leashDrag*over) диск +``` + +На текущих числах равновесие садится на `dist ≈ 3.4`, то есть `urgency ≈ 0.55` +и скорость отряда ≈ 2.8 юнита/с — **ниже порога `sprintAt` (0.85)**. Значит, +удерживая направление, игрок ведёт отряд быстрым шагом, и отряд при этом +**продолжает работать по целям**: и стрелки, и клинки. + +Спринт остаётся отдельным решением: либо `Shift` (прямой приказ), либо +ситуация, когда курсор реально уехал. И только в спринте огонь прекращается. + +Раньше порог стоял на 0.62, равновесие было выше него, и любое удержание клавиши +означало вечный бег без стрельбы. Это и ощущалось как «милишники не работают». + +## 6. Строй + +Три пресета, локальные координаты (`x` = вперёд, `y` = вправо), множатся на +`formationSpacing` и поворачиваются по направлению движения отряда: + +- **клин**: вершина впереди, двое по бокам, двое сзади шире; +- **линия**: пятеро в ряд поперёк движения; +- **кольцо**: пятеро по окружности радиуса 1.5 × spacing. + +В `HOLDING` слоты не используются — агент идёт к `postPos` от решателя. + +Первые `meleeCount` слотов держат клинок (по умолчанию 2). В клине это остриё и +левое крыло — те, кто и так упирается в противника первым. Боец ближнего боя +идёт к `postPos` в **обоих** состояниях отряда: иначе клинок был бы полезен +только на стоянке, а нужен он как раз в движении. + +## 7. Огонь + +`Game::FireWeapons`. Выстрел происходит, только если выполнено **всё**: + +1. есть цель и чистая линия (`hasLane`); +2. истёк `cooldown` (0.35 с); +3. ствол доведён до цели (±5°) — иначе выстрел выглядел бы враньём; +4. `LaneClearFrom` подтверждает линию по позициям этого шага (повторно, «никаких исключений»); +5. `AllyInterceptsShot` — за время полёта пули свой не окажется на её пути. + +Пункт 5 — добавление к спеку, вынужденное тем, что 6.3 проверяет линию в момент +выстрела, а 6.9 делает пулю настоящим снарядом с временем полёта до 0.4 с. +Обоснование и замеры — [08-decisions.md](08-decisions.md). + +## 8. Пули + +`friendlyFire = true` всегда: пуля сталкивается со стенами, мишенями и **со всеми +капсулами, включая союзников** (кроме самого стрелка). За шаг ищется самое раннее +столкновение вдоль пройденного отрезка, чтобы стена перед союзником срабатывала первой. + +Пуля живёт ровно столько, чтобы пройти **проверенный** отрезок (дуло → цель, плюс +радиус мишени). Дальше она не летит: за целью пространство никто не проверял, и +если цель успела умереть от чужой пули, снаряд ушёл бы в непроверенную зону. + +Счётчик попаданий по своим и журнал событий (время, стрелок, жертва, место, +состояние жертвы) — в [06-debug-and-tuning.md](06-debug-and-tuning.md). + +## 9. Ручное прицеливание + +`Space` включает режим, `←`/`→` крутят вектор прицела от якоря, `Tab` циклит +цели в конусе ±20°, отсортированные по дальности от якоря. Все агенты +приоритезируют назначенную цель. + +Правила 1–8 при этом **не меняются вообще**. Ручной режим никогда не позволяет +стрелять сквозь своих — тот же `LaneClearFrom` на том же спуске. diff --git a/docs/06-debug-and-tuning.md b/docs/06-debug-and-tuning.md new file mode 100644 index 0000000..c5659ec --- /dev/null +++ b/docs/06-debug-and-tuning.md @@ -0,0 +1,150 @@ +# 06 — Оверлей, метрики, тюнинг + +## Оверлей + +[src/debug/overlay.cpp](../src/debug/overlay.cpp). Рисуется примитивами raylib **поверх** +уже отмасштабированного кадра. Это единственное исключение из «вся сцена софтверная», +и оно dev-only: `F1` его убирает. + +| Клавиша | Что показывает | +|---|---| +| `F1` | оверлей целиком | +| `F2` | линии огня | +| `F3` | кандидаты последнего прогона решателя | +| `F4` | метрики | +| `F5` | выключить хоррор-слой целиком (свет, туман, пост) | +| `F6` | показать диски обзора | + +Всегда (при включённом `F1`): якорь отряда, **два** круга когезии (синий — +стрелков, оранжевый — клинков), слоты строя, подпись над каждым агентом +`индекс, класс (R/M), состояние (A/H), id цели` и у клинка фаза удара +(`wind` / `HIT` / `rec`), выбранная огневая позиция `postPos` кружком. + +**Сектор клинка**: кольцо досягаемости и две границы дуги, цвет по фазе — +жёлто-оранжевый на замахе, белый на ударе, серый на восстановлении. В покое цвет +говорит, почему не бьём: жёлтый — свой в дуге, синий — просто ждёт. + +**Цвета линий огня (`F2`)**: + +| Цвет | Значение | +|---|---| +| зелёный | линия чиста, агент стреляет | +| жёлтый | цель есть, линию перекрыл свой | +| красный | линию перекрыла стена | + +**Кандидаты (`F3`)**: точками, цвет по оценке (синий низкая → белый высокая), +отбракованные — тусклым красным, выбранный обведён белым кругом. +Показывается последний прогон решателя, поэтому у агентов, у которых линия есть, +там пусто — решатель для них не запускался, так и задумано. + +В ручном режиме дополнительно рисуется вектор прицела, границы конуса ±20° +и обводка назначенной цели. + +## Метрики (`F4`) + +[src/debug/metrics.h](../src/debug/metrics.h). + +| Метрика | Как считается | Смысл | +|---|---|---| +| **FRIENDLY_HITS** | накопительный счётчик попаданий пуль по своим | главная метрика корректности, должна быть 0 | +| **FIRE UPTIME** | доля шагов с валидной линией за окно 10 с; среднее — **только по стрелкам** | насколько отряд «в деле» | +| **MELEE reach** | доля шагов с целью в зоне удара, среднее по клинкам | то же самое для ближнего боя | +| `swings / hits / aborted` | взмахов начато, попаданий лезвием, взмахов оборвано своим в дуге | `aborted` — видимая цена скученности, не баг | +| **SETTLE TIME** | от перехода в `HOLDING` до момента, когда ≥4 агента «в бою» | как быстро расходится веером | +| fps, `sim ms/frame` | время симуляции за кадр | бюджет 16.6 мс | + +«В бою» для стрелка — валидная линия, для клинка — выбранная цель. Смешивать +доли времени двух разных занятий в одно среднее бессмысленно, поэтому +`FIRE UPTIME` и `MELEE reach` считаются раздельно: у клинка линии огня не бывает +по определению, и его ноль занижал бы метрику стрельбы. + +Реализация `FIRE UPTIME` — кольцевой буфер на 600 сэмплов на агента с +инкрементальными счётчиками, пересчёт O(1) за шаг. + +**Журнал попаданий по своим**: каждое попадание пишется в `Metrics::hitLog` +(время, стрелок, жертва, координаты, состояние жертвы). Без него `FRIENDLY_HITS != 0` +нечем объяснить — именно журнал показал, что жертва всегда была `ADVANCING`, +и вывел на настоящую причину (см. [08-decisions.md](08-decisions.md)). + +### Как читать цифры + +- `FIRE UPTIME` считает «нет живой цели в радиусе» как простой. Поэтому на + переходах между комнатами и после зачистки кучки метрика честно падает — это не + дефект ИИ. Критерий приёмки 11.8 относится к **стоячему бою рядом с мишенями**. +- `SETTLE TIME` по той же причине растёт, если отряд остановился там, где стрелять + не по чему. Сценарий `--accept` меряет его в правильной обстановке. + +## Runtime-тюнинг + +Все числа живут в [src/tuning.h](../src/tuning.h) в структуре `Tuning`. +Магических констант по коду нет — если нужно новое число, оно добавляется туда. + +Часть параметров вынесена в таблицу `TUNABLES` и крутится на ходу: + +- `[` / `]` — выбрать параметр, текущее имя и значение видно в оверлее; +- `-` / `=` — изменить с шагом параметра (с зажатием работает автоповтор). + +Те же параметры можно задать из командной строки без пересборки: + +```bash +squad_proto.exe --headless 300 --set safetyMargin=0.25 --set laneReserve=2.0 +``` + +Список параметров смотри прямо в `TUNABLES` — там имя, поле, шаг и границы. + +Самые содержательные для ощущения: + +| Параметр | На что влияет | +|---|---| +| `safetyMargin` | запас к «телу в линии»; шире → реже стреляют, но безопаснее | +| `laneReserve` | во сколько раз резерв линии шире порога блокировки; отвечает за «текучесть» | +| `wLaneAvoid` | насколько нагло агент выдавливается из чужого сектора | +| `hysteresis` | насколько лучше должна быть новая позиция, чтобы агент переехал | +| `commitTime` | сколько держится решение; меньше → живее и дёрганее | +| `sDistCost` / `sCohesionCost` | готовность отбегать далеко ради выстрела | +| `postLeash` | жёсткая граница огневой позиции от диска; ниже — отряд плотнее | +| `anchorSpeed` / `anchorLeash` | отзывчивость диска и насколько он может оторваться от отряда | + +Ближний бой (подробности — [11-melee.md](11-melee.md)): + +| Параметр | На что влияет | +|---|---| +| `meleeReach` / `meleeArc` | размер сектора удара; шире → чаще задевает нескольких, но и своих | +| `meleeWindup` / `meleeStrike` / `meleeRecover` | ритм удара: читаемость замаха против скорострельности | +| `meleeInterval` / `meleeDamage` | DPS клинка | +| `meleeLunge` / `meleeKnock` | вес удара: рывок бойца и отдача мишени | +| `meleeCohesion` | СВОЙ, больший круг клинка вокруг диска | +| `meleeAllyMargin` / `meleePredict` | строгость дисциплины сектора; выше → меньше оборванных взмахов и меньше взмахов вообще | +| `meleeReserve` | насколько широко клинок отжимает своих со своей дуги | +| `meleeShake` | отдача камеры на попадание лезвием | + +Хоррор-часть (подробности — [10-atmosphere.md](10-atmosphere.md)): + +| Параметр | На что влияет | +|---|---| +| `sightRadius` / `sightCone` | как далеко и как широко видит отряд | +| `sightPersonal` | круговой ореол вокруг агента, спасает от клаустрофобии | +| `fogMemory` | насколько тускло помнится уже увиденное | +| `fogReveal` | при каком свете показывается тело мишени | +| `lightGamma` / `lightGain` | форма затухания света; **перепекают таблицу рампы** | +| `flashPower` | насколько вспышка выстрела освещает окружение | +| `fxIntensity` / `tracerLength` | яркость и длина трассеров | +| `grainTense` / `vigDepthTense` | зерно и виньетка на пике напряжения | +| `dreadRadius` | с какой дистанции мишень начинает пугать | +| `shakePerShot` | отдача камеры | + +`F5` — аварийный тумблер: мгновенно возвращает прежний кадр без света и тумана. +Полезен, когда непонятно, баг это или просто темно. + +## Dev-тумблеры ядра + +`--no-solver` и `--no-laneavoid` выключают решатель и расступание. Это A/B-проверка +ценности ядра, цифры за 60 с на одном маршруте: + +| Конфигурация | FRIENDLY_HITS | FIRE UPTIME | +|---|---|---| +| ядро выключено | 1 | 13.6 % | +| ядро включено | 0 | 88 % (на стоянке у мишеней) | + +`sim`/`render` в оверлее показывают время шага симуляции и время кадра рендера +раздельно: 2 мкс против 1.4–3.5 мс при бюджете 16.6 мс. diff --git a/docs/07-milestones.md b/docs/07-milestones.md new file mode 100644 index 0000000..41b98c8 --- /dev/null +++ b/docs/07-milestones.md @@ -0,0 +1,54 @@ +# 07 — Журнал вех + +Порядок из раздела 10 спека: после каждой вехи сборка и запуск, потом следующая. + +| Веха | Что сделано | Чем проверено | +|---|---|---| +| **M0** | CMake + raylib через FetchContent, фреймбуфер 480×270, ×3 апскейл, fixed timestep, изометрическая сетка | сборка MSVC x64, окно открывается, текстура 480×270 RGBA8 создаётся | +| **M1** | тайлмап 48×48, генерация уровня, процедурные спрайты пола и стен, камера за якорем, сортировка по глубине | скриншот: ромбы пола шахматкой, кубы стен перекрывают друг друга правильно | +| **M2** | 5 агентов, движение якоря в экранных осях, три строя, separation, коллизии со стенами | скриншот: пятеро в клину, цвета различимы, стены не проходятся | +| **M3** | мишени с респавном, DDA-рейкаст, `LaneClear`, авто-огонь, пули-снаряды, дружественный урон, `FRIENDLY_HITS` | `--headless 60 --no-solver --no-laneavoid`: 1 попадание по своим, uptime 13.6 % — то есть проблема, которую должно решать ядро, воспроизводится | +| **M4** | решатель огневых позиций, гистерезис и коммит, реестр линий и расступание | то же 60 с с включённым ядром: 0 попаданий, uptime 88 % на стоянке у мишеней | +| **M5** | ручное прицеливание, конус ±20°, назначенная цель, `Tab` | сценарий `11.7` в `--accept`: 0 попаданий по своим при активной назначенной цели | +| **M6** | оверлей F1–F4, метрики, журнал попаданий по своим, runtime-тюнинг `[ ] - =`, `--set` | скриншот боевого кадра: зелёные линии у всех пятерых, FRIENDLY_HITS 0, uptime 99 % | +| **M7** | ближний бой: классы оружия, сектор удара, три фазы, свой больший круг, дуга; отзывчивый диск на поводке | `--accept`: M7.1–M7.3 PASS, 81 взмах / 81 попадание / 23 убийства за 30 с, FRIENDLY_HITS 0; все критерии спека 11 по-прежнему PASS | + +## Что находилось по ходу и чинилось + +Прогоны без окна оказались полезнее, чем разглядывание кадра: три дефекта, +которые на глаз не видны, нашлись именно так. + +1. **Отставшие агенты.** `--probe` показал агента на `y=12`, когда отряд стоял на + `y=26`. Причина — залипание в «тени» стены (локальный минимум seek против + отталкивания) плюс отсутствие правила «идти к отряду, когда стрелять не по чему». + Починено касательным обходом стен и возвратом в слот строя (A5, A6). +2. **Резерв линии, который исчезает, когда нужен.** Линии регистрировались только у + реально стреляющих. Стоит кому-то влезть в линию — стрелок теряет линию, отрезок + пропадает из реестра, и перекрывшего ничто не выталкивает (A3). +3. **Пуля, летящая за цель.** Последнее упорное попадание по своим + (`t=94.49`, воспроизводилось при любых настройках) — снаряд проходил место + умершей мишени и находил своего за ней (A1). +4. **Выход за границы в блиттере спрайтов.** `Framebuffer::Blit` вычислял адрес + строки спрайта до внутреннего цикла. Если спрайт срезан левым краем экрана + больше, чем на свою ширину (`sx0 >= s.w`), индекс уезжал за конец `px`: + цикл пустой, разыменования нет, но индекс уже невалиден. Release это молча + глотал, Debug валился с `vector subscript out of range`. Починено ранним + выходом при пустом диапазоне обрезки. + + Вывод на будущее: **проверять в Debug-сборке**. В Release такие ошибки + не проявляются — там нет проверок итераторов MSVC. +5. **Критерий 11.6 мерил не то, что означал.** Тест требовал, чтобы в коридоре + огонь вёл передний, и считал ВСЕ выстрелы. Диагностика показала, что + «нарушения» — это хвостовой агент, стреляющий **назад**, в оставленную позади + комнату: к правилу «не стрелять сквозь своего» это отношения не имеет, впереди + по такой линии никого нет по построению. Теперь считаются только выстрелы по + ходу движения, и результат стал строже: 5/0 вместо 12/4. +6. **Двое с клинками на одной мишени.** Взмахи обрывались друг об друга, урона + почти не было. Починено ценой цели: 37 взмахов / 31 попадание → 74 / 75. + +Подробности и замеры по каждому — [08-decisions.md](08-decisions.md). + +## Текущий статус + +Все измеримые критерии раздела 11 проходят: `squad_proto.exe --accept` → +«все проверяемые критерии PASS». Цифры — [09-acceptance.md](09-acceptance.md). diff --git a/docs/08-decisions.md b/docs/08-decisions.md new file mode 100644 index 0000000..2342ee2 --- /dev/null +++ b/docs/08-decisions.md @@ -0,0 +1,327 @@ +# 08 — Решения и отклонения от спека + +Спек в разделе 12 требует: раздел 6 реализуется как написано, а если считаешь, +что где-то ошибка — сначала скажи, потом делай. Здесь перечислено **всё**, что +отличается от буквы спека, с причиной и замерами. + +Отклонения разделены на две группы: содержательные (меняют поведение) и +структурные (не меняют). + +--- + +## A. Содержательные + +### A1. Пуля не летит дальше проверенного отрезка + +**Спек**: 6.9 — снаряд со скоростью 22 юнита/с. +**Сделано**: время жизни пули = длина отрезка «дуло → цель» / скорость, +а не `дальность оружия / скорость`. + +**Почему**. `LaneClear` проверяет отрезок до цели. Если цель успевает умереть от +чужой пули, снаряд летит **дальше** — в пространство, которое никто не проверял. +Ровно так возникало последнее упорное попадание по своим: агент стоял внутри +кучки мишеней, пуля прошла место умершей мишени насквозь и нашла его. + +**Замер**: до фикса — 1 попадание за 300 с, стабильно воспроизводимое +(`t=94.49, #1 -> #2 @ (30.6,21.7)`); после — 0 за 300 с. + +### A2. Спуск учитывает время полёта пули (`AllyInterceptsShot`) + +**Спек**: 6.3 проверяет линию в момент выстрела. +**Сделано**: дополнительно проверяется сближение пули и союзника как двух +движущихся точек на всём времени полёта, с радиусом безопасности, растущим со +временем (`shotPredictSlack` — запас на то, что союзник может и повернуть). + +**Почему**. 6.3 даёт мгновенный снимок, а 6.9 делает пулю реальным снарядом: +до 0.4 с полёта, за которые союзник проходит больше метра. Союзник, честно +чистый в момент нажатия, спокойно входит в коридор уже после выстрела. +Реактивное расступание (6.6) этот случай не закрывает по определению — оно +срабатывает, только когда тело уже в линии. + +Само правило 6.3 при этом **не ослаблено**: это дополнительное условие спуска, +а не замена. `LaneClear` продолжает использоваться и в целеуказании, и в оценке +кандидатов, и в реестре линий — в том виде, как написано в спеке. + +**Замер**: журнал попаданий показывал, что жертва **всегда** была `ADVANCING` — +то есть именно вбегала под летящую пулю. + +### A3. В реестр линий попадают линии, перекрытые своим + +**Спек**: 6.6 — «список активных линий огня — сегментов от **стреляющих** агентов». +**Сделано**: линия регистрируется и тогда, когда у агента есть цель в радиусе, +стена не мешает, а мешает **только свой** (`Agent::laneIntent`). + +**Почему**. При буквальном прочтении механика самоотменяется: стоит кому-то +влезть в линию — стрелок теряет линию, перестаёт быть «стреляющим», отрезок +исчезает из реестра, и перекрывшего **ничто не выталкивает**. Сектор обстрела не +освобождается никогда, а обещание 6.6 («отряд сам расплывается, освобождая +сектора обстрела») и критерий 11.4 становятся недостижимыми. + +**Замер**: `FIRE UPTIME` на маршруте вырос с 33 % до 49 %, худший uptime на +стоянке — с 38 % до 51 %. + +### A4. Резерв линии шире порога блокировки (`laneReserveScale = 1.8`) + +**Спек**: 6.6 — импульс, если `dist < bodyRadius + laneHalfWidth + SAFETY_MARGIN`. +**Сделано**: импульс расступания начинается на `laneReserveScale` шире этого +порога. Сам порог блокировки в 6.3 не тронут. + +**Почему**. Раздел называется «**Резервирование** линий». Если отжимать агента +ровно с той границы, за которой он уже блокирует выстрел, — это не резерв, а +реакция постфактум: агент успевает войти в сектор, где летит пуля. + +**Замер** (300 с, с A1 и A2): + +| `laneReserve` | FRIENDLY_HITS | худший uptime на стоянке | +|---|---|---| +| 1.0 (буква спека) | 1 | 42.5 % | +| 1.4 | 0 | 50.0 % | +| **1.8** (принято) | 0 | 50.4 % | + +### A5. Касательная составляющая обхода стен (`wallSlide`) + +**Спек**: 6.7, слой 4 — «wallAvoidance + скольжение вдоль стен при коллизии». +**Сделано**: помимо скольжения при коллизии, `WallAvoidForce` добавляет +касательную силу в сторону цели, когда стена стоит между агентом и целью. + +**Почему**. Чисто отталкивающее избегание даёт классический локальный минимум: +seek тянет вперёд, отталкивание держит — агент залипает в «тени» препятствия. +В прогонах это ловилось буквально: агент оставался в северной комнате +(`y=12`), когда отряд уже стоял на арене (`y=26`). + +### A6. Агент без целей в радиусе возвращается в строй + +**Спек**: случай не описан. 6.5 запускает решатель, когда линии нет, но не +говорит, что делать, если стрелять вообще не по чему. +**Сделано**: если решатель не нашёл ни одной цели в пределах +`weaponRange + ring3`, `postPos` = слот строя. + +**Почему**. Иначе отставший агент стоит на месте вечно: в `HOLDING` он идёт +только к `postPos`, а `postPos` равен его же позиции. + +### A7. Дуло считается в сторону цели, а не по `facing` + +**Спек**: 6.3 — «`muzzle()` — точка в 0.3 юнита от центра агента по `facing`». +**Сделано**: для проверки линии и для спавна пули дуло считается по направлению +на цель; выстрел разрешён только когда ствол доведён до цели с точностью ±5° +(`aimToleranceDeg`). + +**Почему**. `facing` доворачивается плавно и на шаг отстаёт от направления на +цель. Если проверять линию по одному направлению, а стрелять по другому, пуля +летит не по проверенному отрезку — то есть гарантия «не сквозь своих» перестаёт +быть гарантией. Сейчас проверенный отрезок и траектория пули — буквально один и +тот же отрезок. + +### A8. Пуля не бьёт собственного стрелка + +**Спек**: 6.9 — «коллизия со **всеми** капсулами, включая союзников». +**Сделано**: стрелок исключён из коллизий своей пули. + +**Почему**. Дуло вынесено на 0.3 юнита при радиусе тела 0.28 — пуля стартует +почти вплотную к своему же телу. Самопопадание было бы вырожденным шумом в +`FRIENDLY_HITS`, главной метрике корректности. Все **остальные** капсулы, +включая союзников, проверяются как написано. + +### A9. Северная кучка мишеней стоит напротив прохода + +**Спек**: 4 — 12 мишеней кучками, конкретные места на усмотрение реализации. +**Сделано**: кучка из 3 мишеней в северной комнате поставлена напротив прохода +`x=30..31`, так что из коридора до неё есть чистая линия. + +**Почему**. Спек называет узкий проход важным тест-кейсом, а критерий 11.6 +требует, чтобы в проходе отряд вытягивался в колонну и стрелял только передний. +Без цели, простреливаемой сквозь проход, проверять нечего. + +### A10. Вторичные цели в `HOLDING` при ручном прицеливании + +**Спек**: 6.8 — флаг `freeFireSecondary` описан только для `ADVANCING`. +**Сделано**: буквально — в `HOLDING` агент без линии до назначенной цели молчит +и перестраивается решателем, по вторичным целям не стреляет. + +**Почему**. Иначе агент нашёл бы вторичную цель, получил бы `hasLane`, и решатель +для него никогда бы не запустился — то есть требование «в `HOLDING` +перестраивается через решатель» не выполнялось бы. + +### A11. Туман войны и освещение вопреки разделу 12 + +**Спек**: 12 — «не добавлять освещение, туман войны». +**Сделано**: добавлено и то, и другое. + +**Почему**. Заказчик изменил требования: прототип разворачивается в хоррор, где +ограниченный обзор и темнота — не украшение, а основа подачи. Правила стрельбы +(раздел 6) при этом не тронуты ни одной строкой, критерии приёмки остались +зелёными. Устройство слоя — [10-atmosphere.md](10-atmosphere.md). + +### A12. Конус зрения не влияет на ИИ + +**Сделано**: у агента есть конус обзора для КАРТИНКИ, но выбор целей и стрельба +по-прежнему работают по LOS и дальности оружия. + +**Почему**. Если завязать целеуказание на видимость, меняются все критерии +приёмки, а отряд начинает «слепнуть» от поворота ствола — при том что `LaneClear` +и так требует чистой линии, то есть отсутствия стены. Чтобы стрельба в темноту +не выглядела абсурдом, мишень показывается, если освещена **или** если по ней уже +работает кто-то из отряда. + +### A13. Shift — рывок, а не медленный шаг + +**Спек**: 5 — «Shift (удерж.) — медленный шаг». +**Сделано**: базовая скорость снижена с 3.2 до 2.0, а Shift даёт рывок 3.2. + +**Почему**. Заказчик просил «менее казуальное управление, помедленнее». Медленный +шаг при уже медленной базе — мёртвая клавиша. Инверсия сохраняет обе скорости из +спека (2.0 и 3.2), но делает осторожность режимом по умолчанию, а спешку — +осознанным решением игрока. Побочный эффект: проверка спуска на время полёта пули +обязана считать по МАКСИМАЛЬНОЙ скорости (`MaxAgentSpeed()`), иначе рывок союзника +не учитывается и возвращаются попадания по своим. + +### A14. Дальность оружия 9.0 -> 7.2 + +**Сделано**: минус 20 % по требованию заказчика; вместе с ней отмасштабированы +`minEngageDist` (2.0 → 1.6) и кольца решателя (0.8/1.6/2.4 → 0.7/1.4/2.1), +а старт отряда сдвинут в (26.5, 26.5) ближе к кучке мишеней. + +**Замер**: без сдвига старта и масштабирования колец сокращение дальности само по +себе давало 1 попадание по своим за 300 с и просадку uptime — агенты сбивались в +кучу у цели. С пакетом целиком: 0 попаданий, uptime в стоячем бою 100 %. + +### A15. `candMinAlly` 0.55 -> 0.60 + +Порог «кандидат слишком близко к союзнику» был **меньше диаметра тела** +(2 × 0.28 = 0.56), то есть допускал позиции, где агенты физически пересекаются. + +### A16. Клинок союзникам урона не наносит вообще + +**Спек**: ближнего боя не описывает. +**Сделано**: сектор удара повторяет правило 6.3 в угловой форме — свой в +секторе — не бить. Но урон применяется **только к мишеням**: даже влезший под +лезвие союзник не получает ничего, взмах просто обрывается. + +**Почему**. Соблазн был сделать «сильную» версию: клинок бьёт всех, а от +попаданий по своим спасает дисциплина сектора. Но у клинка нет времени полёта, +за которое можно передумать: союзник входит в дугу за 1/60 с уже после того, как +взмах начат, и в этот момент отменять нечего. «Сильная» версия означала бы +`FRIENDLY_HITS > 0` в любой плотной свалке, то есть провал главного критерия +прототипа ради механики, которой в спеке нет. + +Обрыв взмаха даёт то же самое ощущение (боец отдёргивает клинок, серая вспышка, +`MELEE_ABORT` в метриках) и при этом не может сломать критерий 11.2. + +**Замер**: 81 взмах за 30 с в плотной свалке, `FRIENDLY_HITS = 0`, +16 взмахов оборвано. + +### A17. Старт замаха смотрит на союзника вперёд + +**Сделано**: `MeleeArcClear` проверяет союзника в двух точках — где он сейчас и +где будет через `windup + strike`. Ровно та же поправка, что A2 для пули. + +**Почему**. Взмах живёт 0.30 с, за которые союзник проходит полметра. Проверять +только текущее положение — значит начинать удары, которые всё равно придётся +обрывать. + +**Замер** (сценарий M7, 30 с): без поправки и без резерва дуги — 21 оборванный +взмах из 77; с поправкой и резервом — 16 из 81, попаданий 81 против 81, убийств +23 против 23. То есть взмахов стало больше при том же результате. + +### A18. Резерв в реестре линий получил явную полуширину + +**Сделано**: у `FireLane` появилось поле `reserve`. Линия огня по-прежнему берёт +ширину из правила 6.3, клинок задаёт свою — долю бокового размаха сектора +(`meleeReserveFrac` 0.55). + +**Почему**. Клинок резервирует отрезок вдоль оси удара, а поражает сектор ±50°. +Союзник, отжатый строго перпендикулярно оси, попадал ровно во фланг дуги — то +есть механизм расступания работал против себя. + +**Замер**: `meleeReserve` 0 → 0.55 дало 16 оборванных взмахов вместо 21 при +большем числе взмахов, а худший `FIRE UPTIME` на стоянке маршрута — 23.3 % +вместо 0 % (стрелки перестали стоять в дугах и молчать). + +### A19. Жёсткая граница огневой позиции (`postLeash`) + +**Спек**: 6.5 — цена за удаление от якоря. +**Сделано**: дополнительно кандидат дальше `cohesionRadius + postLeash` от якоря +отбраковывается совсем. + +**Почему**. Цена — мягкая: линия огня стоит 100 очков, а уход на 1.5 юнита за +круг — 36. Решатель всегда выбирал линию, и отряд расползался. + +**Замер**: максимум удаления стрелка от диска 3.65 → 2.81 юнита. При этом +`FIRE UPTIME` на 180-секундном маршруте не упал, а вырос: на стоянках у мишеней +82.9 / 93.2 / 90.7 / 86.0 % — плотный отряд перекрывает друг другу линии реже, +чем расползшийся. + +### A20. Мишени — тела, и они получают отдачу + +**Сделано**: слой движения `TargetPushForce` (мишень расталкивает агентов) и +импульс от удара с возвратом на исходное место (`Target::home`). + +**Почему**. Без расталкивания боец стоит **внутри** того, кого рубит, и удар не +читается вообще. Без отдачи попадание в упор визуально не отличается от промаха. +Возврат на `home` обязателен: расстановка уровня захардкожена, и уползание мишеней +поломало бы все замеры разом. Респавн дополнительно ставит `pos = home`. + +### A21. Критерий 11.6 считает только выстрелы вперёд + +**Было**: тест требовал, чтобы в коридоре передний агент стрелял минимум вдвое +чаще хвостовых, и считал ВСЕ выстрелы внутри прохода. + +**Стало**: считаются только выстрелы **по ходу движения**. Выстрелы назад +выводятся в отчёт отдельно. + +**Почему**. Диагностика `DIAG` показала, что почти все «нарушения» — это +хвостовой агент, стреляющий назад, в оставленную позади комнату, по совершенно +другой цели. Впереди по такой линии никого из отряда нет по построению, и к +правилу «не стрелять сквозь своего» это отношения не имеет. Порог ловил не +поведение, а геометрию расстановки мишеней. + +**Замер**: на прежней базе тюнинга новый счёт даёт 4/0 (было 12/4), на текущей — +5/0. То есть критерий стал строже, а не мягче: вперёд хвост не стреляет вообще. + +--- + +## B. Структурные (поведение не меняют) + +### B1. Дополнительные файлы + +Спек перечисляет структуру проекта; добавлены четыре файла: + +| Файл | Зачем | +|---|---| +| `game.h/.cpp` | склейка подсистем и порядок шага. Без него это переехало бы в `main.cpp`, а спек требует, чтобы там были только окно и цикл | +| `render/scene.h/.cpp` | проход по полу и список сортировки; отдельно от `iso.h`, который остаётся чистой математикой | +| `core/input.h` | `InputState` нужен и `main.cpp`, и симуляции, и headless-прогонам | +| `debug/harness.h/.cpp` | прогоны `--headless` / `--accept` | +| `sim/loadout.h` | класс оружия и его параметры; сюда приедут разные пушки и апгрейды | +| `ai/melee.h/.cpp` | ближний бой; зеркало `firing_solver` для угловой геометрии | + +### B2. У `Sprite` есть точка привязки + +Спек: `Sprite { int w, h; std::vector px; }`. Добавлены поля `ax, ay` — +точка внутри спрайта, совмещаемая с проекцией мировой позиции. Иначе смещения +пришлось бы размазывать по коду отрисовки для каждого типа спрайта. + +### B3. Параметры оружия синхронизируются из `Tuning` каждый шаг + +`Agent::weapon` существует как в спеке, но перед движением поля копируются из +`g_tune` (`SyncLoadoutFromTuning`). Без этого runtime-подкрутка (раздел 8 спека) +не влияла бы на уже созданных агентов. Состояние ближнего боя — фаза, таймеры, +цель — при этом не трогается: копируются только параметры. + +### B4. Dev-инструменты + +`--headless`, `--accept`, `--probe`, `--set`, `--shot`, тумблеры `--no-solver` / +`--no-laneavoid`. В спеке их нет; они не влияют на игровую сборку и нужны, чтобы +критерии приёмки из раздела 11 проверялись цифрами, а не на глаз. + +--- + +## Что осталось честно неидеальным + +- `FIRE UPTIME` считает «нет живой цели в радиусе» простоем. На маршруте между + комнатами это даёт низкие значения, которые к качеству ИИ отношения не имеют. +- `SETTLE TIME` по той же причине растёт, если отряд остановился там, где стрелять + не по чему; в общем прогоне попадаются значения до 5.7 с. В обстановке, к + которой относится критерий 11.1 (мишени в радиусе), — 0.02 с. +- Пути агентов чисто локальные, без поиска пути. Отряд проходит узкие коридоры, + но лабиринт с тупиками не осилит — это вне рамок прототипа. diff --git a/docs/09-acceptance.md b/docs/09-acceptance.md new file mode 100644 index 0000000..b7d7096 --- /dev/null +++ b/docs/09-acceptance.md @@ -0,0 +1,107 @@ +# 09 — Критерии приёмки + +Раздел 11 спека. Воспроизвести: `build/bin/squad_proto.exe --accept`. +Сценарии — [src/debug/harness.cpp](../src/debug/harness.cpp), `RunAccept()`. + +## Автоматическая проверка + +Критерии 1, 6, 7, 8 описывают **правила стрельбы** и меряются на отряде из пяти +стрелков — так, как их формулировал спек. Ближний бой проверяется отдельным +блоком M7 и, главное, трёхминутным прогоном 11.2, где состав отряда обычный, +боевой (2 клинка + 3 ствола). + +| # | Критерий | Статус | Цифры последнего прогона | +|---|---|---|---| +| 1 | ≥4 из 5 агентов имеют линию за ≤1.5 с после остановки | **PASS** | settle = 0.32 с, линий 5/5 | +| 2 | `FRIENDLY_HITS` = 0 за 3 минуты боя во всех режимах | **PASS** | 0 попаданий, смешанный отряд | +| 4 | агент с чужой линии огня уходит за ~0.3 с | **PASS** | максимум 0.35 с на арене (0.98 с по всем сценариям) | +| 5 | нет дёрганья: `postPos` не чаще раза в 0.6 с | **PASS** | 36 коммитов, 0 нарушений, минимальный интервал 0.75 с | +| 6 | в проходе 2 тайла — колонна, огонь не идёт сквозь своих | **PASS** | до 5 агентов в створе, поперёк 3.09 / вдоль 6.08 тайла, вперёд передний/хвост 77/9, сквозь союзника 0 выстрелов из 247 | +| 7 | ручной режим никогда не стреляет сквозь своих | **PASS** | 0 попаданий по своим за 30 с, назначенная цель 96 % времени | +| 8 | `FIRE UPTIME` в стоячем бою на арене ≥ 80 % | **PASS** | 100 % | +| 9 | стабильные 60 fps | **PASS** | симуляция 2.5 мкс + рендер 4.1 мс при бюджете 16.6 мс, fps 60 | + +Ближний бой ([11-melee.md](11-melee.md)), сценарий 30 с у кучки мишеней: + +| # | Критерий | Статус | Цифры | +|---|---|---|---| +| M7.1 | клинок доходит до цели и наносит урон | **PASS** | 55 взмахов, 52 попадания, 16 убийств, 14 оборвано своими; связка `slash 21 / backhand 19 / spin 15` | +| M7.2 | ближний бой не задевает своих | **PASS** | `FRIENDLY_HITS = 0` при 55 взмахах | +| M7.3 | у каждого класса свой круг вокруг диска | **PASS** | стрелки не дальше 3.49 от диска, клинки — 5.61 (лимиты 3.70 / 6.80) | +| M7.4 | лезвие не достаёт за пределы своей дуги | **PASS** | превышение сектора 0.0° (лимит 12°) | + +M7.4 появился после починки геометрии удара: угловой допуск `asin(r/dist)` +вырождался на контактной дистанции в 90°, и боец рубил за спину — те самые +«удары на 360 градусов». Теперь проверка идёт по отрезку лезвия, а критерий +замеряет превышение разрешённого сектора и не даёт багу вернуться +([11-melee.md](11-melee.md)). + +M7.2 держится не тюнингом, а конструкцией: урон применяется только к мишеням, а +влезший под лезвие союзник обрывает взмах ([08-decisions.md](08-decisions.md), A16). + +Прогон 300 с (`--headless 300`), смешанный отряд: `FRIENDLY_HITS = 0`, +1471 выстрел, 142 взмаха / 146 попаданий лезвием, **63 убийства**. +Тот же маршрут чистым отрядом стрелков (`--melee 0`): 2100 выстрелов, +45 убийств. Клинки заметно поднимают урон отряда, не ломая главного правила. + +`FIRE UPTIME` на стоянках маршрута: 82.9 / 93.2 / 90.7 / 86.0 % там, где есть +мишени, и 23.3 % на стоянке, где стрелять не по чему. + +Тест 11.6 переписан ещё раз, и на этот раз по существу — с подсчёта «кто стрелял» +на проверку инварианта. + +Причина была в другом месте, чем казалось. Сценарий тащил курсор непрерывно, +курсор обгонял отряд, натяжение поводка упиралось в упор, включался спринт — а в +спринте отряд по замыслу не стреляет вовсе. Тест показывал «0 выстрелов вперёд» и +падал, проверяя пустой коридор. После поднятия `sprintAt` до 0.85 удержание +направления спринт больше не включает, и отряд идёт через проход **с боем** — +как и должен. + +Область замера тоже была неверной: проход глубиной три тайла, а бойцов пятеро, +и колонна физически длиннее самого прохода — внутрь него целиком она не +помещается никогда. Меряется теперь створ прохода с подходами по обе стороны, +на всей проводке, а не только на стоянке. + +Заодно выброшен критерий «передний стреляет чаще заднего». В проходе шириной два +тайла у заднего есть законные диагональные линии мимо переднего, и требовать их +отсутствия — значит требовать от отряда быть глупее, чем он есть. «Задние не +стреляют» — это следствие правила «не сквозь своего», а не отдельное правило. +Поэтому проверяется сам инвариант: берётся отрезок **реально сделанного** +выстрела и независимой геометрией проверяется, не задел ли он тело союзника. + +Результат: 0 из 247 выстрелов прошли сквозь своего, колонна 6.08 тайла вдоль +против 3.09 поперёк, и передний всё равно ведёт огонь с перевесом 77 против 9 — +теперь это наблюдение, а не условие прохождения. + +## Проверяется глазами / по коду + +| # | Критерий | Как подтверждено | +|---|---|---| +| 3 | в движении стреляют только те, у кого чистая линия | по построению: спуск требует `hasLane`; в оверлее `F2` видно, что часть агентов идёт с жёлтой линией и молчит | +| 10 | вся сцена нарисована своим растеризатором | в `render/` нет ни одного raylib-примитива; raylib вызывается только в `ScreenBlitter` (`UpdateTexture` + `DrawTexturePro`) и в `debug/overlay.cpp`, который dev-only и снимается по `F1` | + +Скриншот боевого кадра ([docs/combat.png](combat.png)): отряд в пятне света, +у каждого своя зелёная линия, ни одна не проходит через своего, трассеры в полёте, +дальние мишени видны только тлеющими глазами. `FRIENDLY_HITS 0`. + +## Оговорки, которые стоит знать + +- Критерий 1 и метрика `SETTLE TIME` осмысленны только когда в радиусе есть живые + мишени. В общем маршруте попадаются значения до 5.7 с — это остановки там, где + стрелять не по чему, а не медленное расхождение. +- Критерий 8 меряется в стоячем бою рядом с кучкой. При остановке на краю + дальности честные значения ниже: часть агентов физически не достаёт цель. + После сокращения дальности до 7.2 худшая стоянка маршрута даёт ~30 % — это + остановка там, где кучка уже вне радиуса, а не деградация решателя. +- `FRIENDLY_HITS = 0` достигается связкой из четырёх вещей: резерв линий, включая + перекрытые своим; резерв шире порога блокировки; учёт времени полёта на спуске; + пуля не летит дальше проверенного отрезка. Отключение любой из них возвращает + попадания по своим — цифры в [08-decisions.md](08-decisions.md). +- `FIRE UPTIME` усредняется только по стрелкам, `MELEE reach` — только по клинкам. + Смешивать доли времени двух разных занятий в одно среднее бессмысленно. +- «Макс. время в чужой линии» на смешанном отряде доходит до 3.9 с против 1.3 с + на чистых стрелках. Это боец с клинком, который стоит вплотную к мишени и тем + самым перекрывает стрелку линию: расступиться он не может, не бросив свою + работу. Правило при этом не нарушается — стрелок просто не стреляет и + перерешивает позицию. Критерий 11.4 меряется на открытой арене чистым отрядом + стрелков, где такой ситуации нет по построению. diff --git a/docs/10-atmosphere.md b/docs/10-atmosphere.md new file mode 100644 index 0000000..6e638f7 --- /dev/null +++ b/docs/10-atmosphere.md @@ -0,0 +1,200 @@ +# 10 — Хоррор-слой: свет, туман войны, трассеры, напряжение + +Весь этот слой — **render-only**. Симуляция о нём не знает: `RenderGame` принимает +`const Game&`, поэтому ни свет, ни трассеры, ни тряска камеры физически не могут +изменить состояние симуляции. Headless-прогоны (`--accept`, `--headless`) `View` +не создают вообще, и цифры приёмки остаются цифрами симуляции. + +> Раздел 12 исходного спека запрещал освещение и туман войны. Заказчик изменил +> требования — теперь это ядро подачи. Правила стрельбы (раздел 6) не тронуты. + +## Порядок кадра + +``` +Clear(чёрный) ступень 0 рампы == цвет очистки + -> свет и туман (Lighting::Update) + -> пол: BlitShaded, тёмные тайлы пропускаются + -> список сортировки: стены, мишени, агенты — тоже BlitShaded + -> глаза мишеней (аддитивно) + -> трассеры, вспышки дула, искры (аддитивно) + -> ОДИН слитый пост-проход: виньетка, зерно, сердцебиение + -> Present + -> debug-оверлей (raylib, dev-only, F1) +``` + +## Почему свет вплавлен в блит, а не сделан пост-проходом + +Соблазн очевидный: пройти по 129600 пикселям, для каждого получить мировую точку +через `iso::ScreenToWorld` и умножить на освещённость. Так делать нельзя. + +Спрайт стены имеет привязку `ay = TILE_HALF_H + TILE_H = 24`, то есть верхняя +грань поднята на 16 px над ромбом своего тайла. Обратная проекция этого пикселя +даёт `ScreenToWorld(0, -16) = (-1, -1)` — **ровно соседний тайл на северо-запад**. +Пост-проход осветил бы крыши стен чужой видимостью: чёрные крыши на освещённых +стенах и светящийся ореол на тайл северо-западнее каждой стены. Чинится это +только буфером высот на пиксель, то есть честным depth-буфером, которого в +проекте нет и заводить его ради этого не стоит. + +Поэтому свет модулирует цвет **на этапе блита спрайта**: спрайт целиком светится +от своего тайла, и артефакт исчезает конструктивно, без единой проверки. + +## Модель света + +Одна скалярная величина на точку мира плюс **рампа** — таблица +`g_shadeLut[32][3][256]`, переводящая уровень в цвет (подход COLORMAP из Doom). +Цветокоррекция зашита в таблицу: в полумраке картинка уходит в холодный синий, +на свету нейтральна, во вспышке выбивается в тёплый пересвет. На пиксель +остаются три выборки из таблицы и ноль умножений. + +``` +tile = min(1, max(память, видимость * sightBrightness) + вспышки) +``` + +| Состояние | Значение | Как выглядит | +|---|---|---| +| никогда не видели | 0 | чистый чёрный, тайл вообще не рисуется | +| видели раньше | `fogMemoryLevel` | тускло и холодно, сущностей нет | +| видно сейчас | `sightBrightness` | нормальная яркость | +| вспышка выстрела | выше | тёплый пересвет | + +Диапазон выше `sightBrightness` намеренно зарезервирован под динамический свет: +выстрел всегда «выбивает» кадр вверх и в тепло. + +### Билинейка без швов + +Узловая сетка 49×49 (`corner`), узел = среднее смежных тайлов. Патч света на +тайл раскладывается в координатах спрайта без перекрёстного члена: + +``` +Bu = c10-c00, Bv = c01-c00, K = c00-c10-c01+c11 +a = c00 - (Bu-Bv)/2 - K/4 b = (Bu-Bv+K)/TILE_W c = (Bu+Bv)/TILE_H +e = -K/(TILE_W*TILE_W) f = K/(TILE_H*TILE_H) +L(px,py) = a + b*px + c*py + e*px^2 + f*py^2 +``` + +Это **точная** билинейка по четырём вершинам ромба: подстановка (16,0), (32,8), +(0,8), (16,16) даёт ровно c00, c10, c01, c11. Значит на общем ребре двух соседних +тайлов значения совпадают и швов нет. По строке считается прямыми разностями — +во внутреннем цикле два сложения на пиксель. + +Блочность добивают четыре вещи: узловая сетка, точная билинейка, временное +сглаживание (`fogFadeRate`) и упорядоченный дизеринг Байера 4×4 — 32 ступени +рампы выглядят как ~200, полос не видно. + +## Видимость + +Для каждого агента перебираются тайлы в квадрате радиуса обзора; для каждого — +затухание по дальности × max(конус взгляда, круговой «личный» ореол), затем +проверка LOS уже существующим `Tilemap::RaycastBlocked`. Рейкаст делается +последним: дальность и конус отсекают большинство тайлов даром. + +Стену нельзя проверить лучом до её центра — DDA считает вход в саму стену +перекрытием. Поэтому стены освещаются отдельным проходом: берут максимум от +соседей-нестен, `WALL_LIGHT_PASSES = 3` раза с затуханием. Без этого разделитель +`y=13..15` толщиной три тайла остаётся чёрным изнутри, и его южная грань висит +в пустоте. + +**Инвариант:** стена никогда не темнее самого яркого соседа-пола. Иначе тёмная +стена будет пропущена как «ступень 0», и сквозь её силуэт проступит освещённый +пол тайла (tx−1, ty−1), который рисуется раньше по глубине. + +### Конус зрения и ИИ + +Конус — **чисто игроцкая условность**. ИИ по-прежнему работает по LOS и дальности +оружия, `LaneClearFrom` не изменён. Если завязать выбор целей на видимость, +поменяются все критерии приёмки, а отряд начнёт «слепнуть» из-за поворота ствола. +Чтобы стрельба в темноту не выглядела абсурдом, мишень показывается, если она +освещена **или** если по ней уже работает кто-то из отряда. + +## Трассеры + +Физика пули не тронута: снаряд летит ровно по проверенному отрезку, правило +«не стрелять сквозь своих» и `FRIENDLY_HITS = 0` не задеты. Менялся только вид. + +- **штрих** от `pos` назад по вектору движения на `tracerLength`, но не дальше + точки вылета — `AddBeam` рисует ядро с градиентом цвета и боковым ореолом; +- **вспышка у дула** — `AddGlowDisc` + короткий язык пламени, `muzzleTime`; +- **искра попадания** — своя для стены, цели, убийства; +- **пурпурная искра** = попадание по своему. Это не украшение, а индикатор: + в норме её не должно появиться ни разу. + +Всё аддитивно (`AddSat`), поэтому светится и поверх темноты — трассер сам себе +источник света. + +## Дуга клинка + +`DrawMeleeArcs` в [src/render/fx.cpp](../src/render/fx.cpp). В отличие от +трассеров, дуга читается **прямо из состояния агентов**, а не из журнала событий: +фаза удара живёт десятые доли секунды и попадает в каждый кадр, а привязка к +живой позиции важнее — боец в момент удара едет вперёд рывком. + +- **замах** — холодная стальная дуга уводится назад за край сектора и + разгорается. Это телеграф, и он обязан быть виден; +- **удар** — серп из четырёх концентрических дуг: внешний край раскалён, + внутренние тускнеют к рукояти. Одна линия на 480×270 читается палкой, четыре — + взмахом. Хвост — доля пройденной дуги, а не вся: серп, а не кольцо; +- **восстановление** — серп стоит на месте и быстро гаснет. + +В изометрии круг — эллипс, поэтому дуга набирается сэмплами **мировых** точек +(`AddWorldArc`), а не экранной окружностью. + +Через журнал идут только дискретные события: `MELEE_SWING` (вспышка света), +`MELEE_HIT` (оранжевая искра, сильная отдача камеры — удар всегда в упор), +`MELEE_ABORT` (тусклая серая вспышка: свой влез под лезвие). Клинок дульной +вспышки не даёт, но искры от удара освещают не хуже — иначе весь ближний бой +шёл бы в кромешной темноте. + +Подробности механики — [11-melee.md](11-melee.md). + +## Канал «симуляция → эффекты» + +`sim/events.h`: кольцевой журнал `CombatEventLog`. Симуляция только пишет, +правила не читают, в headless передаётся `nullptr`. + +Почему журнал, а не флаг `Agent::fired`: за один кадр рендера проходит **до +`MAX_STEPS_PER_FRAME` шагов симуляции**. Флаг, выставленный на шаге 1 и затёртый +на шаге 2, эффект не увидит. По той же причине `Dread` считает дельты +накопительных счётчиков метрик, а не смотрит на флаги. + +## Напряжение (Dread) + +Складывается из близости мишени, близости **невидимой** мишени (страшнее всего), +толпы и того, сколько агентов вообще заняты боем. «Занят» — это линия огня у +стрелка или цель в зоне удара у клинка: боец, достающий врага, беспомощным не +выглядит и напряжение снимает так же. Сглаживание асимметричное: страх набегает +быстро (`dreadAttack`), отпускает медленно (`dreadRelease`). + +Кормит: глубину виньетки, амплитуду зерна, частоту сердцебиения, отдачу камеры. +Отдача добавляется к `scene.ox/oy` сразу после `scene.Begin` — только там она +согласована и с полом, и со списком сортировки, и с оверлеем. + +## Пост-проход + +Один слитый цикл по 129600 пикселям: виньетка (статическое поле + таблица кадра), +зерно с амплитудой обратно яркости (в тенях шумит, на свету чисто), давление +сердцебиения. Света на входе **нет** — он уже вплавлен на блите. + +Границы: индекс таблицы насыщения равен `128 + канал + шум`, поэтому амплитуда +зерна зажата 127 — иначе в Release пошли бы случайные яркие точки, которые +легко принять за художественный замысел. + +## Псевдослучайность + +`render/noise.h` — единственное место. Чистые хеш-функции без состояния: +значение зависит только от координаты и номера кадра. Общего генератора нет, +синхронизировать нечего, детерминизм симуляции не задет. + +## Цена + +Замер на Intel Iris Xe, Release: **1.4–3.5 мс** на кадр при бюджете 16.6 мс, +то есть 8–21 %. Верхняя граница — когда память карты уже разведана и освещённых +тайлов много; fps при этом держится 60. Симуляция — 1.9 мкс. Ни одна из оптимизаций (предзатенённые +спрайты, пересчёт видимости через кадр, уменьшение числа ступеней рампы) не нужна. + +Самое дорогое — не пост-проход, а `BlitShaded` сцены. Пропуск полностью тёмных +тайлов это частично компенсирует: в тумане рисуется заметно меньше половины карты. + +## Аварийные тумблеры + +`F5` — выключить весь хоррор-слой (свет, туман, пост) и вернуть прежний кадр. +`F6` — показать диски обзора. Полезно, когда непонятно, баг это или темнота. diff --git a/docs/11-melee.md b/docs/11-melee.md new file mode 100644 index 0000000..993405a --- /dev/null +++ b/docs/11-melee.md @@ -0,0 +1,222 @@ +# 11 — Ближний бой + +Второй класс оружия. Файлы: [src/sim/loadout.h](../src/sim/loadout.h) (типы и +профили), [src/ai/melee.cpp](../src/ai/melee.cpp) (цель, подход, дисциплина +сектора), `Game::UpdateMelee` в [src/game.cpp](../src/game.cpp) (машина +состояний и урон), [src/render/fx.cpp](../src/render/fx.cpp) (дуга). + +## Главная мысль + +Ближний бой — это **то же правило, что и стрельба, в угловой форме**. Ничего +нового в этику отряда он не приносит: + +| | стрелок | боец ближнего боя | +|---|---|---| +| зона поражения | отрезок «дуло → цель» | сектор `reach` × `arcDeg` вокруг оси удара | +| правило безопасности | свой в отрезке → не стрелять | свой в секторе → не бить | +| проверка вперёд | `AllyInterceptsShot` (успеет ли влезть за время полёта) | экстраполяция союзника на `windup + strike` | +| срыв в последний момент | пуля уже летит, срывать нечего | взмах **обрывается** | +| резерв в реестре линий (6.6) | отрезок до цели | ось удара с явной полушириной | +| свой круг вокруг диска | `cohesionRadius` | `meleeCohesionRadius`, заметно больший | +| выбор позиции | решатель огневых позиций | подход вплотную к цели | + +Из этого следует главное свойство: **клинок физически не может поднять +`FRIENDLY_HITS`**. Союзникам он урона не наносит вообще, а правило сектора +существует не ради урона, а ради того, чтобы отряд выглядел как отряд. + +## Состав отряда + +`Squad::meleeCount` (по умолчанию `DEFAULT_MELEE_COUNT` = 2) — сколько **первых +слотов строя** держат клинок. В клине это остриё и левое крыло, то есть те, кто +и так упирается в противника первым. Ставится до `Squad::Init`; из командной +строки — `--melee N`. + +## Три фазы удара + +``` +IDLE ──цель в reach, корпус довёрнут, сектор чист──> WINDUP ──> STRIKE ──> RECOVER ──> IDLE + 0.17 с 0.13 с 0.24 с + интервал между НАЧАЛАМИ замахов: 0.60 с +``` + +- **WINDUP** — замах. Ось удара уже зафиксирована и больше не доворачивается: + доворот на этой фазе — это самонаведение, только клинком. Скорость ×0.20, + ноги вкопаны. Игрок обязан успевать читать замах, иначе удар выглядит не + ударом, а случайным списанием HP. +- **STRIKE** — активное окно. Лезвие метёт сектор от одного края к другому, + сторона захода чередуется от взмаха к взмаху. Здесь же **рывок**: seek, + separation и расступание молчат, боец едет по оси удара со своей скоростью + и своим ускорением. Стены — единственное, что его останавливает. +- **RECOVER** — боец открыт и медленный (×0.55). + +## Связка ударов + +Чередование «влево-вправо» — это не связка, а метроном: два удара, между которыми +нет разницы ни на глаз, ни по последствиям. Связка обязана иметь **форму**. + +Таблица — `MELEE_COMBO` в [src/tuning.h](../src/tuning.h), множители к базовым +характеристикам клинка: + +| # | Удар | Сектор | Урон | Отброс | Замах | Пауза | Смысл | +|---|---|---|---|---|---|---|---| +| 1 | `slash` | ×1.00 | ×1.00 | ×1.00 | ×1.00 | ×1.00 | косой заход, с него всё начинается | +| 2 | `backhand` | ×0.85 | ×1.00 | ×0.85 | ×0.55 | ×0.50 | возврат с обратной стороны, быстро и почти без паузы | +| 3 | `spin` | ×1.70 | ×1.75 | ×2.30 | ×1.50 | ×1.35 | раскрутка: широкая, тяжёлая, с долгой расплатой | + +Серия держится `meleeComboWindow` (1.1 с) после удара. Не продолжил вовремя — +начинаешь с первого. Итог по времени: три удара за 1.71 с вместо трёх за 1.80 с, +но суммарный урон выше в 1.25 раза — связка выгоднее ровного метронома, если её +успевают довести. + +Раскрутку в тесноте **просто не дадут начать**: её сектор проверяется той же +дисциплиной, что и обычный удар, а он шире почти вдвое. Это не ограничение, а +цена: широкий замах требует места. В замере связки: `slash 21 / backhand 19 / +spin 15` — финиш доходит реже, и это видно в цифрах, а не на словах. + +Параметры взмаха **запекаются на старте замаха** (`MeleeWeapon::BakeSwing`). +Причина техническая и важная: базовые поля переписываются со снаряжения каждый +шаг (`SyncLoadout`), и без запекания удар менял бы ширину и урон прямо в полёте. + +## Удар на ходу + +Бой на ходу — нормальный режим, а не исключение. Ограничение ровно одно: в +**спринте** боец не гоняется за целями (`Squad::GoalFor` возвращает слот строя), +но если цель сама оказалась под рукой — бьёт. Отдельного запрета «на бегу не +драться» нет. + +При этом на текущих числах поводка удержание направления спринт и не включает: +отряд идёт быстрым шагом и работает (см. [05-squad-ai.md](05-squad-ai.md), +равновесие поводка). + +## Урон идёт по пройденной полосе, а не по факту удара + +Каждый шаг считаются два угла лезвия: где оно было в начале шага и где стало в +конце. Цель получает урон, если полоса шириной `meleeBladeDeg` прошла через неё +**за этот шаг** (`BladeSweepHits`). Проверяется и «стоит на цели прямо сейчас», +и «проскочило насквозь за 1/60 с» — за шаг дуга проходит заметный угол. + +### Почему это точная геометрия, а не угловой допуск + +Лезвие — **отрезок** от бойца длиной `reach`, повернувшийся за шаг. Проверка +работает с ним напрямую: попало ли направление на цель в заметённую полосу, а +если нет — не задел ли цель край отрезка в крайних положениях. + +Раньше здесь стоял угловой допуск `asin(r / dist)`. Он корректно описывает +угловой размер тела, но как **допуск к сектору** вырождается: при `dist -> r` +`asin` даёт 90°, сектор разрастается в полуплоскость, и боец рубит за спину. +В фазе рывка он как раз проезжает вплотную — отсюда и брались удары «на 360 +градусов». Отрезок такого не допускает: для цели позади ближайшая точка лезвия — +рукоять, а до неё ровно `dist`, что больше радиуса цели. + +Инвариант закреплён критерием **M7.4**: замеряется, на сколько градусов +попадание вышло за разрешённый сектор ЭТОГО взмаха. Норма — ноль. + +Смысл: то, что видно на экране, и то, что получило урон, — одна и та же дуга. +Разовый расчёт «в начале взмаха по всему сектору» дал бы попадания раньше, чем +лезвие туда доедет, и это чувствуется. + +Одна мишень получает урон **один раз за взмах** (`hitMask`), но один взмах может +задеть несколько — мишени стоят кучками, и это ровно то, ради чего клинок нужен. +Сквозь стену не рубит: перед уроном идёт `RaycastBlocked`. + +## Дисциплина сектора + +Проверяется дважды, как и у ствола: + +1. **на старте замаха** — сектор `reach` × `arcDeg` обязан быть чист. Союзник + проверяется в двух точках: где он сейчас и где будет через `windup + strike` + (`meleeStartPredict`). Без этого треть взмахов начиналась впустую; +2. **каждый шаг активного окна** — если свой всё-таки влез под лезвие, взмах + **обрывается**: серая вспышка, `MELEE_ABORT`, сразу в `RECOVER`. + +Оборванные взмахи считаются метрикой (`meleeAborts`) и видны в оверлее. Это не +баг, а видимая цена скученности: примерно каждый пятый взмах в плотной свалке. + +Угловой размер тела союзника считается честно (`asin(r / dist)`), поэтому +вплотную союзник перекрывает почти весь сектор — так и должно быть. + +## Свой, больший круг + +Стрелок держится в `cohesionRadius` (2.1) от диска, и решатель **жёстко** +отбраковывает огневые позиции дальше `cohesionRadius + postLeash`. Боец ближнего +боя берёт цель, только если она внутри `meleeCohesionRadius` (5.6) от диска и не +дальше `meleeSeekRadius` от него самого. Нет такой цели — возвращается в слот +строя. + +Поэтому классы живут в двух разных кругах вокруг одного диска: стрелки кучкой, +клинки — на вылазке, но на поводке. Замеряется критерием M7.3. + +Двое с клинками не вцепляются в одну мишень: цена цели растёт на +`meleeClaimPenalty` за каждого своего, уже её выбравшего. Ближняя цель всё ещё +выигрывает, но не любой ценой — вдвоём на одну это оборванные взмахи друг об +друга и вдвое меньше урона (замер: 37 взмахов / 31 попадание против 74 / 75). + +## Мишени получают отдачу + +Удар отбрасывает мишень (`meleeKnockback`), импульс гасится и мишень возвращается +на своё место (`home`). Без отдачи попадание в упор ничем не отличается от +промаха. Расстановка уровня захардкожена, поэтому «уползание» мишеней исключено +конструктивно: возврат идёт всегда, а респавн ставит `pos = home`. + +Отдельно появился слой движения `TargetPushForce`: мишень — тело, а не пустое +место. Без него боец стоял **внутри** того, кого рубит. + +## Взаимодействие со стрельбой + +- Боец ближнего боя — обычный союзник для `LaneClearFrom`. Стрелки сквозь него + не стреляют, и решатель разводит их так, чтобы работать мимо него. +- Пока идёт замах или удар, боец **не расступается** из чужих линий. Смысла нет: + стрелок всё равно не выстрелит (правило 6.3 запрещает), а удар сорвётся. + Расступается он до и после. +- Рывок учтён в `AllyInterceptsShot` отдельной экстраполяцией: на замахе боец + почти неподвижен и через мгновение выстреливает по уже известной оси, о чём + его текущая скорость ничего не говорит. Проверяются обе точки — где он есть и + куда прыгнет. Именно поэтому `MaxAgentSpeed()` намеренно **не** включает + скорость рывка: она бы раздула запас для всех выстрелов сразу. + +## Как это выглядит + +[src/render/fx.cpp](../src/render/fx.cpp), `DrawMeleeArcs`. Дуга читается прямо +из состояния агентов, а не из журнала событий: фаза живёт десятые доли секунды, +её видно в каждом кадре, и привязка к живой позиции важнее — боец в момент удара +едет вперёд. + +- **WINDUP** — холодная стальная дуга уводится назад за край сектора и + разгорается. Это телеграф. +- **STRIKE** — серп из четырёх концентрических дуг: внешний край раскалён, + внутренние тускнеют к рукояти. Одна линия на 480×270 читается палкой, четыре — + взмахом. Хвост — доля пройденной дуги (`bladeTrailFrac`), а не вся: серп, а не + кольцо. На голове — раскалённая радиальная черта и точка. +- **RECOVER** — серп стоит на месте и быстро гаснет. + +В изометрии круг — эллипс, поэтому дуга рисуется сэмплами мировых точек, а не +экранной окружностью. + +События `MELEE_SWING` / `MELEE_HIT` / `MELEE_ABORT` идут по тому же каналу +`sim/events.h`, что и выстрелы: искры, вспышки света и тряска камеры (`meleeShake` +заметно сильнее, чем на выстрел — удар всегда в упор). + +Класс читается силуэтом: у бойца капсула шире и со стальным клинком. Цвет занят +номером агента, поэтому классом он быть не может. + +## Метрики + +`FIRE UPTIME` усредняется **только по стрелкам**: линии огня у клинка не бывает +по определению, и его ноль занижал бы метрику стрельбы. Отдельно считается +`MELEE reach` — доля времени в зоне удара. Для `SETTLE TIME` «в бою» = стрелок +при линии **или** клинок при цели. + +Критерии M7.1–M7.3 в `--accept` — [09-acceptance.md](09-acceptance.md). + +## Куда приедут пушки и апгрейды + +[src/sim/loadout.h](../src/sim/loadout.h). Сейчас профиль ровно один на класс и +целиком копируется из `tuning.h` каждый шаг (`SyncLoadoutFromTuning`) — так +работает runtime-подкрутка. Когда профилей станет несколько, здесь встанет +таблица и модификаторы поверх неё, а весь остальной код продолжит читать +`Agent::weapon` / `Agent::melee` и не заметит разницы. + +Что уже вынесено в параметры и годится под модификаторы: досягаемость, ширина +сектора и ширина лезвия, длительности всех трёх фаз, интервал, урон, отбрасывание, +скорость и ускорение рывка, множители скорости на замахе и восстановлении, +радиус своего круга. diff --git a/docs/combat.png b/docs/combat.png new file mode 100644 index 0000000000000000000000000000000000000000..886426fa07c81e43de4730777083f57ecd4b5db1 GIT binary patch literal 303441 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�o`%bA)xp=5DSISKjQtId&~mOa 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 bD9>;o{blcfaEEGo!aHxOzY!N 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 NC3xE=anSyPe*mPcw`KqU literal 0 HcmV?d00001 diff --git a/lib/libgcc_s_dw2-1.dll b/lib/libgcc_s_dw2-1.dll new file mode 100644 index 0000000000000000000000000000000000000000..1b79afc7a18dfda55c1673348d81f90b606bc47a GIT binary patch literal 120334 zcmeFa4}4YCneTl92h5S^4jOIHV~Nvkn~WKU+-5qYW~Qme4sFwx*4Uwyv9y;mbSBqQ zJyF_bG0<#zrEMD1XDlk;odZ`qyB7-}Svwe=drYpQiYA;C7uRKg_x;@x}QG5|wknUI=Nd`9auPvm(=HT{ipkiO-X4 zRF=lh@FFc-3;s1krgU9)gRR(HLcwCn&*pml$@OM6{AsOiSUHvJGRoi2we943QyMP& z!i_hoW~p%6JGxx?`qv(r)pgkyZNG+=&@`g{SB$=0*9W)Sc+(tS$3uFJ0c zRI^}L>!*}@8t;bF)JwD&{EAhtBB;0VH1%%yV#}BRJ5|I(co~tXJ$g#LD+K2MkN=V{ z#@9#P$lhOHpPl$OMUmvg@t)3AB1Grf_vrH1pT0WzVrfUC>!!O}Z|FF$gqrE?xBPW- ze^JfwZ$(GXb6go(!MYRJ7{)}T6K9nt$Xh+;Wl|}jFZ|& zTWU|{lD&OqQDlvPB_A%m_PWn?mqZqKu6#G?Nb*>bll}=ev+tFf)g0}Z5$*U30ne3p zCf*&X>v2*WCrIt-EUmgFcI#)YeCgL@_#iT2|GIw}u^2L(mIMJdAj1A@i+M|A~4~Po>M}~)oZQ9oK|Bj5s8n3V^EnRgzaEo;@Ak`-O{%eaOel_(}C2Ffg zxMVM;z}C|+{C5cUO(B0n4n)=Zz#GHExw94*{=4R{y~jR%wYSdeLsHV)z4P4mUtiz) zrF)GWbS0)`|Lv1S5wFcHRAenmK$U}QkZ$q?}mq|hh&YZ zd1?JPfd;u@gwV@E&%f!JvpD-v;CEg*j2ztbuEMs@e8%*Vd~K}vNNZ2-+kw0kR%r;q zC+;oG{;q9_JU)_WO}&*UaIApIM+^%*M`h?ko@QIxo#qsgsA=PI)Q07oDP3K5R4*)7TbQ&Uld zx+S?M7t>x912OZ!Kl@c7fF2t*UgJGyRM=?wV(5Ebg;h+%`$n%v?M&`eay$OQwPiny zBB!Foxs-WvcNncI_SPwM+LXtVC6j~(1BE?aqh_BzJc`NdZZ zF9Z89PVJUm^Xuz>JN@ckU!UtbS>C+ok}sCut4d%P3n6a3S16HF;zixz^GYn9y*-OR z+1cb4|Al7I8_rwc>za&3{zO-kd2_BRLx#84d$gl?cwV&UlhaK;txDdi!Hmy9zB&BA z8del{%ydh=4bCr`+_Ir(oL|gzONzF2mQA{rIuu7?MX|SGXy;IWy4SfY%aE89_hE&pY$tgwqM(q zz0QCz?MqDiW{{wV(e3y3?WKJ#wliq2)?IzicuGqEet-WbPVGN)V)C_p#|(h0Yq|^t z=$wI+)iL(A^Vi6b-0IYH)or^W=KNEav#KlERU~pOK27}_Z2g;0TR)_e5mtWIh;=<9 z_9^*dHH4d*Ja$H6cJkP`#N_0$XyWgZ$HqFT1t5W0NVH%-ZoOY>n;XCQ{tB+0jc#1# z8g(e4b*l9D2GuOyYDKo$lAwJZfe7L&DI~vS)_csX6Z%5Lg6UqJiNLoYB{a_?5 zqnEpL4T3(L`}N|*_ePQ2j?(n@#3fj^Ig68B(H|;nczeF2HJ5z2q$kklo|ELC*|xmn zqSBktt=EPV7pDgkCBtRkH|bna>nrHP^mm|G<77=9F2A;?W-vF#>*>6*sG}^cTIubr z2Xnn6^t-omuhE+`f@yvIIAs`OEfLK@63Rf0`QwDuVr00>S@@k#%Y=|L<;_NT8Poiz zGNIV^$k5L8c4y&D`FbJ$1W&Spz;{N^O!v;8Sl8{`)1BJxq(2!{CSz%L?j_qo?nRW^ zM!Gr@@NI*)b8Mqqer~fHPamD{)NSx~OxoRcR`TJfM7l0BsqY_-WUp#2iWmR|{drrf zHUu3mH63QJv7;~;1RY`w3wkT>XtO<59h`I`Jq)sdZ#x%z74nDfpPaPkA70A#U2S>< z-C_tUbokSW+9BF-f?d$ z#briFPmo!+zxBM!8{Oj8FMG#^kdJC>GH;4_2bArke}tG(^bD;f)}>ySwk4#udEM!k zzB=C9QnlMVlpg$QwCcnpA5|@>Ia<^=af>(LZO9y(TzAk(`_N3h_BIyCuh&oA;-MFS zS?)dJ^#e6dYMu8au*O$yG<32wiW{uXdSXQO`= zI*@*8{>5}sj6i)jmUYqz6@oX?;$1?y|KBYZs&KWFzJ^rtcf(G)DX7PI)>RESUcJ%> z0eVm~AX77SD#=T~nOgWt@e($jjXm$iEEh)*Ce`btAEK63gHXH|8~z94Dp3uUVQ~H> zUSH<5$=-lOD3jwx5Yh&MBqN-^ZCP$#01+vO)^r_l)^=k-)7$Td%@L=uJ8u@DrI}xt z`pS%rqiR>t);zqLE=#EVP7VRmpX4`6t1@qE&35O(E=mCy z;78h+P@B1UvB8b{1?^=@i^KK-IwSV5B9Dh@qVaiKw`DK6hJRJv-qy_iF_*lTe+%~M zw@5kJXwlY79R7W&tB8M@YL z>>5Bq&m5Vr`u}3qKmPjq0(>CVt~~s%5PoZHSN}jZH+JzK4uAH^@Jk0qZ*v6vR;eZ@F45c4>(sH;J(p&!aMA38JRD)<($;df#@Yz z>9x2nO)Ig9)uc;Fmys@)jr8i>?A~P{kZ`AC;F|$I1K!R&+EbKxz%**a`U?Ry#_Dok zZ-6p+2$ukOIrohKql#RXY1s||ZFHw^%K>g0*;7e1bJYlDaBbi^lWQZ_CMSJ0Mztel ziNtu)U0tEF6v|-Pg*n> zn>srciIm$;eRbs(3%WPA#G9s>yuq7RoP4;&Okn7*UF5zPN9bMtD*3DK-#EYo#od(t zUhYcGo$|^|sq)IXQ;pJrO#jndRZ>1s<_=_bX9lwa8|7zzWW!+AxvSgxXm>@X_0MYNAv~zlO2qnT=Hec~oM`Z#VDT;%-p6UMYqud3WP@lW zg(S7QvHB>4=OyZafPFr=}r-yhH;pk^l^R%dX?U0(wj^=S60|lZajUD z8R%7y$c2WtX}3Qxt_1_}RPVsX{w6xw#BcTPo`H?Kdk1>`%Ww{A2K}?pfq^YG+x<_G zcG5TV3)NGbxCWRV0J8)l0J?i&%ohI!%Cz2c(hiMNgHC!KBoVK^Bw!EsKR2*hc5oeUuOh_-h81OEg(1xW z(^pn~K?3!Dj;T?i8b&0(Hr`1+sZov4eALLGIaGOo8u|I+DG0i8U=x}U-a%&N4D|Fr zYsOUG`p$t(>g_KXxs$#^-?(nI8{z5&l12tp>bGs(HNZ68Pu>G@?Rfamgiir|F}vuW*pEoD8B_1{}U=N9LM_s8c15N|EKCjW|E_DX>y0eJ@+K1$%12D* z&y2ACNWyANril(4lex~COlg>t?&22&%Mpr>e^=!ZlWC}f*_0ZtR8fJ+9FTEIj7NPR z#Yj9V{dwFN%q=pGo5YZ)-|guwce`&a=kz(cMsEckk{@-fS9s zd5yH`(VC;DD&ub{36$|y+~)mzR%#?=U4Nvur;%(~*T167#`~P~PSuAD%b=YY`##hh z44<(!=P6_J^lNR4liI;Of)`jT?9iu1r5Yu=`4PWwRH|}R>Vi?JlERc|UNBqcrRNI6 z@p^vgH{eaF$vabdW_lXT$_n2ydh}Q}GD5AljPVo7(i~B2ewo^Kjo8Ppozq$-yZ9%v zi|Ie(7bDt_5$#9VibE?J)_Rwzb?N9@rC}}S8}GxIIO)ISS1>24c1o$jLHpy$F5p<9 z#U0pWY;K{171YdIEgUcZ&qiA`C*>E6+~0jNT~?2jZuD22T>8-wTWN&cTI3O_a#ELQ z6n5U;Oe$-l)F#~%wFbTp9#;&yRs{t#go_o2JwQ6bz zV6Ed`;i*c<)LuJ(%aL@_&-1${D}X0iNI~0UstoW;1%vH+?j>~kkK~^@axW0483+9~ z$vjLJLI(^6b~MJ`Yb?Ca2Ekz)~5b3E-)L z6{tq2vZ5X?;meH2#21|OeW;x5cVx6Kh7ItJH~ara9c#Y>AFw32MrC;itMgu7XrImp z11Eg}zo8YwMLEe`l=*Se#kP)d7s0t?#D@I~>g%Ncm0yiBD-NWT7x;_2$Qa?W$Z`7N zHsRO(dbEwokFD4L2~ggmttl^n>!ecZ*4Q8atG4Z%lKD}*#h-!jTft9IJ_`QTBNnjN zpZ2DBpQ)0p|CE}GLosd?-&4GK!Het%DiqSL%My2yE^FO+x~y;$TnIcgP@d9lvpb7A zIwC^ubaEG}Udo-X%OY22LAGvi;gfm_*66m$ zL{=(HWW`2DX48kZV4LZun(|qoQ%WDx$yWfVOsHgc-$~Y!GD7D=Z2YO%ZiE3|lDp zD=azKSSEKqxl3)XLCy|IK_CMef6-s4TWXBryW^R#003JgP0%MG-PPIA|sIP)CugGU^#ZSx$jk zB_-92%ZxzG5P4R(D`=BFaF0PlBbO{JF;p+$48Y9z1F>j!=K)N-5~>s~Q^O{AF6gw- z%wV1}py{}Ry5-arzSQkfT}!!;0fu<&C}p4jxT#{~(h3653=xl^TlZN2MouBM833y` zt|g*_Q1S@dwGm}q;%-$pi`++bS?jLkk}XaF9W3F|Jg=IAIfy|ELRSg|Z7IdMM!5=F zIe*2@T`6~iT5d_w(gI^30?l5>U0r`t6zIu6L<-r6T<;-j&)gnCD$t0%wG} zcV#Je!o<6}+`F=jO{0&-7d$K*WP*Ma8e7qZk|MH;+*hb-1bT^kP`690bs-=aP_+_- zC3U4BTP7-#j%P3afvIbV*oFea&{QZzhWT~`fD5$xn1Czpxx{@+x3UO}+}CaI&Faf! zsb9`l(9cMpP4p?o{rvm1J6WN145)$P5|mbapn~afk-Jx^MWLo=l~VtU+-G&$g!Qm0 z)e@G8tId0if|BgL7Mx+3Wg^0oo?J}3C3fTi z15&OiAB;M{*)YHo-{6T<1`=mRQYPh89a6F`59C@wjP^L zMr3`;NRMtW;jf*vhN6EQ2AI@kGXEqJDQW;@0#<3fnZ1+QtfXl81E49nhdHyfA9*Wd zF%)TY8y7rHK|9QDqO%6>Be4zCn$+gCPnTG$KE#%*7f*Jv|1 z?MCBgk5b1*dNjP%ywLc2bn&k5nPCLFIQwnu;tV=5qR?z6+t(RC6rBmhq>J^Y-#636 zi`D1pbg@3rMVYkUql+^}bWxpZ2CokU&`4gWi@(0bjL$#}CGWJls2T>q@6pBC0tjUp zEqgK|{wa!RI)gKSdkZbR&|+pdHKK*jMM2|#krw{+9}F$_in<{!oYal#@i=llpZthb z6;jibN**ubwn?{v0(P!J*B*j7hF<7afd(42gSb*#$kRsCdNuXBQHj~4W|$PSpwVSf zJJt;-*)=#Xb(;-oOu*~MVCKvEzmD{Y!AWI0xZB{jMaw`qv*?*L8BAX~8KyJGR0g)&* zMN$f923;5`hXhg=@-^fUEpm%hTaH>=;6bl2Xo`I5hFbFMN>r=KotKT~zF=$i8>JA+W{+fkQ{(`x3Qw^+gr;<0x9b9=z>}htDPL<{M~$t}KauPs zVhkX=;bzm7+S5pw%FX(3Vy(5Z(6C>Hp=lE=YbQ=?Fy{kLUQNq5+WdjWwmxY4yQpbv zOe_6bqx*aMjRbA)v~A^0NgZdR%QBm9iSxrZ*->A3!bs@sh&g#B0=6TQ^;{#)hr79* zp7V73_5c7~WuMJN+wW|xMu#F8w)tzinsK!O3;0vgfu+EyoACUyq!-8SR7@)CS z8Tk>eP|A`~4c?NB|EQSL>BwkWS~3Q_3dm^2nJ1$m+#(z8u@(_B1_+3Z0RpE8EGk6jWAH3l-z*Dau;GpV3YZ)3xTZZ}c zA6SNIy2Uay=?WDaQAuX4i#+wc$RYv`52S={+B_OW0VFIa$sq3P3fl(wyA7tZ~8%c_Zg zhC#2uvYxbR^{+Y(Uycs(-<2V**wqZKXSEJ3j=$yp^ zn+LOIXV3XY1DQ_x{VF=}8;xb~MdzQpICq$0HvMC=_vA*>a(8uV;cH_O=bPP^G2uR$ z*~`|UE3<26Q^5|wxcTf^4UB8!m%|S_O!kyH_mul`e*U4AIiiu9X||lq29()(YdR@i zZ?~jO*_48Nx8T0K;J(D%vz?_DqfgC63!cw#()+bR@>H<7HR^O-l;^kD-Z>1Bd;5FX z1l`!b&X9Ub|4X|M`HN}DR@*~%gQe>?P$<&>G+TW-WtXYg%CV&UalGd!bJ8#ItFt9e z$NM0kc2%`8m@{QZ_ytwYcPMW%z?}4Z_%*}G9~po(>2kF_z@SF&Guq8PIP}ieck5i# z*Gt%Fv1cqE%~iA>w)gBbhUch?!@JW1+X%poyE6lZiJV{Cyn7=Xj+=Jx8|dB5J`tlf z+rmK)Y~pUr#pf*EwL9z+dE+47NXil;cLApe^KEh^g{iz`%9r5;O+YO}*gR3|?PfG^ zHjlIgPC-fp{C8$!C%s0yPHa?vJu%Q*)5VDhbFk}|BV`=+(q^6NIqBc>i#&4fQU@SJ zYT0zC^JqZoP5BLKdjJGtU)EZy9n`PCGbDEIGIKKJDs2{~<^$1Rz-{YZ0X^kN+G)7h z%?>}32H_7FqHluS94*-GLv$ToaMBO+J3>O=oMXujJnH{7{Rj*H87gRRP5-XuG=>gT zm+=?pPunQPqbSa%A6FSP|1kTZGY+yDTy?%i zCyzM3S?H1czsPY=`un0^C@moOVac5W6;Kl-F6lPigoJ8jFK^E zM{7wqK%KNPgF{HN-?IOrNXZxE>Z(BtHd$LBMq~%JsFl3Q4ABcQh5G^t0j|6-BZEhtwCbF16 z>rhJ0LIKkLrDzuts9NKw&UVfF$#w1;#g z%Fq?cEJsA+UR-)o%&oRo?gm=+J)bjRbg!L>8;cF{M(J!=nlUU=w-$L36sS7tB!pCt zq>f~eGKEr2*%fR`cH?!UfS)hmNVTYKv_>#>h(~P%&`Nx{pxNxadCJ}@P&!Y^rUMbF zQaV#v5xOZ3$rz&5&MGOx;BVGm>*Fkz)zYd z{G|2O0e)sPE65M=HhY8~YEIMFV&QRhC!MHLtIWKL)2*$4RKz< z5M@bZ%w$=`9%E5Lo_l3(_7%IQB}Fk1?Jz-Pt#X3VhHaNvvlkc`%j6aixGzK?I1nhb z4BOS6j^OC1(ugFr&jhqZTOsM)Vpw2N16a0uaF*p32Sb#DdIlsXpTbh?A%mfQN%mc% zfTtE%X_y5Kbf`^agj9_IsdTm_l!jRV4W&W(r$|FDTVDZ1LTSiPK6VBR&TUC(1AD9^ zDw1O;2t|NeoW1Q@GkRg7(eKr12_`kD-vnmUs3Wu7PBE?QQ3=g?vLTu{tm!w!SQvnd zu9{1-RsT8o?fdK~{Qgb^TxtXlG<6t6dyVy(XC^P$2afHWVuWs-65~>Si6Z%O5qiM2 zCDum^nd|91Pcly=2UVAJwV{Vdj4984rIj86EeiyWY$MP!c^$_fmGzjoM0vIWC~>qN z23ckJ9IuO5k~BkNV`s7#G7QmoE!KtB)*OVUQ|wUpLH)ptW?%S>HJl4+gUM+IY@}v* zjRr->^FV19*%iuWMpIDT)qOw+>(A83^o9~WLoTK~7u7pLlQqm!V)+XI2@1^XYxbgx&43<;;|S}{}zlukqjH! zP-J)`yPNmLbRINdkqm)+H^U+$+11(e*ry9o4{;9r<7x;Euz+V^FQ-Pl;x^Bme+%}Ft8OhbyR(X=M=OF^q$(CumW zGNWWPT&U4 zg>{iS?NJ`jSWorwBk+L|70^~A0FV|$du^_|QLkq3!2uH6u~7}%X)xk=wx+?*#K^p8 zXx~Dj^+{#GNhoG?K=!f4oHUjklPi-2-DTP5Qdcrf?o&3moLrq@mwb~e3L=x$hM>?D zmp%Ku=KesU+c4!bS@MNv7X$0Bvw&^(WHB|3T+F0HJAujq8@Vvfjt*Xx(?vXc+4TnQ z-Re1@V?c&cBr71KAng@~5Hb);Lp=y?CDKsNYQCWyQs_4y;qkVW@1~j2Bn(KY?zxuf z3M(1SG?L{eX`Oc+3XccrVz6uHo?c6`U;Pwdtl(;*p2og6&07$x1d=r0@YJq>jf!d_KfX!rIX!us>ntz!~h;zDY4MoFVz3WWt zmt5zu7v(s%B>K{i7BO?V>e(hOC9AU+$WOAoq_wFQoN2P01dySQ7o4xK%nbV_*GNx( zIGo0%19Do;}mQg-{_=f_E3f&}h&3t%9z_5>p-5t}jysxsk0YMD}c2*5hv z_bK^i4!Cr7WUZp0QDuN#9Ij`l36tRPy&&3=Ghwd~(7ct=NHp6^0m(IZAc8^y?F>kv zQ~a_i2Cb;LYkhtZL(4O*S+tyZ{1em(TG@^`m7cQ7Ee|UnH7TV@JS31Y`O&aYLTeWR z#m*9ff7x3tP|*U(zpML?ppBD$Clerew1JWi&o)4&CUB^ryLM`VmUtsSuT8wkQz|Gv ziC7mZbS7v4!2)908OXpJy_$n3;A>cDiPZ+N426V-7VAO_O69vdbz%1tMFYWH>U?y_ zsI!0?D0YDtAg;BR@k#;O$i1{U%Ka<}BAt*d$$n-8T537a@PdQ&GhHmS=Z+<7YD38~ zZW-)KBL20;zg5en*#W+mBIKQ@AKqcE0(ttE~YE>>A&X+mYubQmg2xXhMd z<(1{fa}5$kBLmwYR*lFeJ?CdYGfq9;qv}E_tj98uTO+t4#Pk9r?>Wkj-zp6riN$|u zr>O)bvrmud@D$EW)@Hmc5uCLwVKoNEJO&`4Az*}{89p*J?j=ulA=Jh!(8fga+}{@B zZ=`{2BZ)ex#wsRguKukU1}?3baQcuq?8>pg76dux3S==O0#WPia*LaIVgg#( zzp-sn4s9@*jSMYPGZ?PL^gx20NGPjNnWky(UEQB%Ii^s#owW1IF|E*y2-2)l&FH(4 z_hSOf+BF2%a6s;6z(2d@umfQA1zBXKrI889EI&zRTE3TrrkwN)2G}&Re6u9iq9Z$a zwdrXuJwucxuu=PI&~S-GMtc9OZsnyhG?Hdc#>|j>)3un~$Fl7A&oj`ss{Q}%wV0tz zJXQg%gV{p$p|i)`)&E@C}(=R*t)k=uEI zv8<3^ou42dRb@LdW`8W7A#kAbv4V=gaOGEpO-97z(Fa;&t!Xo)5wm8~Up@V48WhoI zh-Bo?MJlBdMl3)p`{(LysqvF2ZlZ~J-axeqvJG>r?J+E)F}a3Ec4&(7SCaLj1|Y*R zvSi4%&HjB0GiLEG95!zyMwEe5}+vtiWx45Q=~I~#2- zxJTEpfQXnEDAsID#GD7WCl62VykgiiQeD--i*kpyCyxy$F5*q2RbF>ZS5UEW%y7Z^ zwKX3A7B91WaZLp`xxt~WxjuXH$NuuV*MV`1*+JEb!ofo~{wc?s+T8KZ>PB~b`=cdu zAait}#f=WeT`uE0qP$hExB$K??|%BNtB<4S_F%}o&vszk68ht;QR&<4kCzGO-{<}| z`YRdTALF~5{y3NL|IGOGCcuh;1A7kLeC{sZy&U&{%J4__>-TcjF#8>{%$rpyAKE!0 z4SFB3PGOB|-#fbfF50hptM-g^RC|APd)^L{-SMXFc~e&fG(Mj}=%tBKDn`WJ^Es$= z)>7yg2t^svP_~DF9M|(vwqo>fPqpi9>_2N6wRo>xVL3vZe7J(+40^w;fzKc-`_K9j zRY&#m`=KwV$x|)7D(v*||GK8DX1iXxtivdkh7B!dJfOdVre-Xs?FAgAMIN&~ZwJQo zL>Uh+Bb~)q#LYkR4q~`YjOv$h7j2lhGdCg6U$MNL@JRT+*@3;MZ&tNo($1h}|G4`s z#pvax@8vcZs^{Ws9^@d@uz6*u9GEHSey#9Jt{YzP^1CqM zMsFXl6&F?AOYMpU ztc4~=ZaUY?@bsk~joMuNQz5T6otEX1mXM7Mq5rI|)8Jo#lEEM7@?fGh+i3~_(q=6E zXFW`7n-`1)`-B_7JabZgGnW3dHWbu1W3lhUj^obNq6JeRZLw4a2vZqXJzC-IVm^uT zw(0Vr0Tsi};bdQglA%GBP~Ml`{?)UF`iJl*&8x?~K5spiHa*xnz3%0ks=fU+M~8;s z=?1ze_73xo{4;|0GKb8{%U^o9b;24JD3O}&Lr1*zj5tfvbwCq@+}gU_&2i_!Bgvza zTiv?c4QJH!US99s{9|)4F86~ui))V7^ya=ZVsFi~;T`f$R2}54`x(8>Ken^)1uw^a z4jPqshdRpKzUNdFdxC=y*`WlPecmHOFVywjP|?AX`%vEtb?a}8*7YSOdOmLCT}-{oM;GH5)cw9?&fXY+rJtMXoB)e z_BKO`&wD*}2XDHRSKw}d8aq(M?LaLVML_#1@(>?7E`{!Ag)|&8unrQED21X!hMGHa ztMc^5Unr{^x{2>2c!zU8oWuL5*Yj#=8kIxeA?LQAgMA(Di*x%Atyq+KhyD4W9>!;8 zy5*L}^8HJzc6tL)cN>(A_hr3-*n0MDj-c3j1hiBoP(4Gs)LY;8JZ~l6=Ix~3@z}w> z=OBEU*EckqvUT1zh(ErywC<4`OD+ZOh4SC^>hV`6Z30rcvr6viZa^IGdx_609Ds8N z{k_;4&%YFOC%vJ8`AvDgghnak4_hX{5r2#+0e8!v7G9nG(pS$N+M^P~p(i3kyYQOz zk%=fQ5Pi3Q)j`_(kaZ=8c9Px0m`c23>7%Xx0H2HN`fj=kj=}w!VR6jst2yeO5DmNy z>EXQiQxrAK98B(r4DBX4-J9fnh1d97uFhEuFZ23vlUP|49yOms zKcaOz5;3p8X4wC8M$M;qxYJ7u3+<7$@5B!n{}iNfDjz!OYJG3ro|{U6JERxQ=g0rM zLK8fsZw_EMUZvWr-qzfc-l4jFr0ZZ<-FYyZe06f`1$=1Wwq?i@Hsf{^3)v9X@cjEL zD5%=cmr&%RZ1axwWyMLxuUJepmN9#~#h!2ML)P=9OHg4wbq``4eD6fx^Ra$2{%zh7 zjbAPVA2*SO=rIV^TL0!Uq3Z z5h=6>dMs8pn++alG) zz6q?-apqVsl$LvkjYT#X8=jT(F^5-?Je)FUUutNBJw^tLTi;7Z(l!F zE(!#TQ%3ekd;7fT>u%f0b3oU|@Y>O(1hS&of6!^PGP=%fDVN9_#}NRmh(cDYuSoDc z9owIx5mAO?ThB7B`2t7+bEbato$|dUegB5I#QL!?Vwg$NxHnw!3r(cK=tM}x^CAXR zDX*$Z>T5WBZ^wQQtD_-m5PdyjzCvdPXV41aA54xdYCVHSu&f90W-jiy(zcqHM{xJS zyTxo}YWeDSKQinwg)Db+xPZ4k?S40zMhs3t{ zufM{OD(ECLhFbG?oyr6|u0kfjf!wMBd9pPmPjnzrw;xzb@_j1&ZW*D^A>dOmQ6-uE z<;kbpllyLsZCu#wI+Qnf+L&+jrfWi)=1o_Ks>GWPTdKo_@Tl?B8(j%N?YlLAGQ~it zwNR!OLJ2SzkE#Mtbtm0PLfG$%z*3u^Kxhu=+8j5zn14e zmluyzDK=F~M>0xHMn%x3p&@8PxWX7l&2I}{T!HLxI$U8|qMCbku`hWeqS;T1DL{wF zpVh5mmn+R)Gcn?}0uHMe`&B0?)jPL#&SxXURAdlo_0H{yE6MHXZDU=*zA77S+$+q2G2l!DQO6_37U;$eeLc>X|ItwxZAHl5a`Ar0hD~Pwg_&dHI!oS>e0p-#HXKfuuU~+k zm+7=S9i5y27#ip-`9{ZAO1#8^lB6H48)!Z3e-lMY;{b5#lWu?cFJf%7_4#yFZNLm5kp%@@$W9DQ1g6JQ(x(yR-4i`#{qq`*bg zjzPNstaDa1x}RX3Z(oYJQ1K4?yo8Gv8600;VLKxb#{g^n<%}Hs@0`n<{cPXZwaE8(=T{ocz9?y3F(V6&rRkel&#$vaNEjL#|_bK*<^P# z^Zex4I`4+p>-wD37sSmmxo1&-37{DF0%GnwXemgPpmT0Bi=vm2r{oKhQ5n}s>BYXu z-+j)x^Unx;(b8aaJm?H((u%10KB09()< z6nUGR4`*tI`FvL>x0Fq&{|0sIHr#qNZ68*5KC$7q zuq;xw4jFRwWwI+KAjBoNd9QZVe%Gu0Ub3gCE_ch3-=IU0D#BC#zfeA!n=OnZ;N}&j zd2Wv9)^PJ{h;Arq{v^HHLorTb6Z+Jhlm3J~bn7A+m9d?%!%pfWkT8Jv7<*@dbTpL* z@SXs09^U(DJz`@%C4RiAjrpct8x7!nyhw4J_lT3~LiRe_*dVl9Wz%@Vhb`OAl3&ye zCcC1szPe0eLPu$E+xjYna+#|=eVeX+jUihWsjrrh??QOhnt@e!Mt{)}U+l&IDcN0A zxAB%EYeYP?smkW~p5prG9i$@|20jGYdI*qH_(CNIjaWS;fOS{bgy3)qlxm}cDZXBv zoR3EZ2CfP@U}iyb18c~X)DB!48544eR4~~5vjPn$ZCx7cplwT%v4iwg8RHXpdO91j z#(|*IgY8_L)ue$c+4lC&xrBqDuhO~NXZDX}k~uKedm{7nMc&R#ZftCGX5U3jcj3aPmRAEhJXW4~b7GK%m!MSQ`s!Q~HTTvI^-D8oy z)jQ1X{>d@E)%L#S;}e%Ts}t^Z_$?I`a~3=wDVek2jY!lJxz29(Gv1(I{9d$dtGUwQe&S2(?c%$ z^;#p|luw88PoYDAj)ziUxv_dc8!bvk=MwKZtsDdtvEtyrsOO21lk4VO5-D*~dZ2I4 zUua-e+@TD$#O}@{hf%wdFl*hkytrRKYcw^IDUvJAt)$J|f|N>yZl(7`AcsNkeu933 z^_`QxAL_`WbbhkP+gdQ&rbSaD-xFYY>>%Hn#Nu3T=ivHSHg=5sX(Gi6&9is~PXiW6 zfy=@4GHv3Ci9XXyeJClx3wcJl9D%2io`<<2ydrmH4}ODo*NhPP-@@#T=6Zouy0WA)1Jb;|zjN4%#oF~s)QZAg@KRDUzLZ+(R-*5+j%H1_Th{K0w&+K>bi z+t*ogM@RHqUewsS{kI%}+|~D+$%4-!=FZkK=l_De8_&_25qd#IkJE3@a^%r}mna!J zVjxrffbhZ_tN+GtD!99}3F3=^iF;m`6{+l~zNhbi?%2T~2F{F@E2`_cbq^nKhXd_2 zc|d-Kso{LQA4*jBy+DZ2Tf0<+{=#EsC2So~d0ajYXg#{GQZ&_i2ctdFpBmpHJ*^}X znP87WbCFzgk)-pU0LW+5M*JZsBK0w9!l|^WWER@tP*PghJwu;^3Gr?~Fl(G-$*|AH z2@GCju46K5O`kFqFlUOl(^?VI75-7)+O(KR<=!(SJ&CdaDPyo|dh|9nr9RDdLUv?(1icdcTA|!czZlgjg7_ zx8Q2Jw&ie8m>n(c3uY8E;&lN}oV58Kjck%J9o8^Ci`&vpR5#KpYlMC3BSQplonW$^ zbT=7+>IIhQbVkYctqKnm8Y#oN^qJV3n%>{40M68=dHsvFu*~~CU|g_1c2+mL*VXhg z<|P?JX-#lU4JTwI&psElxCO(bc*%35Yh&SiC=!4XzZ_f#CJzk2sf>ueEk>Bn$C-GB zb$`_X9MCdVBJaAW6D5fJ;C4CG?bf2sQFH;Qq24a&Y&K+vUPTm~pdod@nvAy;w{8 zPMRYbQ*50x(2)h3q>ZWoHuBM0Osl(tnNnkBM|7~JSDqtyOuH0ZCJjy6HEClgQDz-v z7d*i#XbPT=5pL?zrU9xMJ%8;p0d?l>?pV60otvryMAKQL^*zJf;>Px9Mb{mL zCJE>#740*oxb~Oc;f~rQ{$*P-n(T>MyA|(yA@+uM|j*->J*gn$Oz9tXMu1g!e-$C+eoh9GIDmQc_(wutgn3;|y z9|?w6-S-STH?6O;tZ8W7V+Ytm_<>*tqoXO|h;4l@8F2LGuhFY3`!m^dk_U_UjIA+a zat212K9T9|G)zCv%JQ6IE0Biiy)gY~$aJRq_{7I1?wWWwB!q0`=tXXx$8rDP;Bh$7 zHu(2*7AzDn{~o>8&n#vp;0S0z^J!EGA9?>d$-_m-eMOp6{VT|0On;!G5m@)oPuzop z*kjkR=Rs*W=u=7;E9AZUaXGR&ghFEq7jzjd1wzxgC0iN^DhIn(l4rEZaqioHeOC z0kPQD&a&Sr3pp`r7${7J&>F$E*hYY}k06{)#x~GQ3g$m60l?af?sP=> zCV5k?kIeFD6fp%6k(yK+CQ40HG zxu1c;8f{%N${#f@kdyv6M?wR)XItR*Xg%n^k9??It5w|}bD!JktxG=dB;R1hzQD9G zGxVr7W5^G2^R}kDI%iCFKHUFZLXn*%rJ2{pILY5pvV*n482ACJvt*;zGt)PkP*Q%@t6i>1Z+SG?6-;{dX40GYIy=J+ zt$PiLsi7SPCcLUFPIjA_@_641Q{EFV838rUNr)4gF)C>5teS}-&wKq1fi|-28#RY5 zWV-;IAwoMfq1$WjG1NtU6&CY@8$MX+R)U3fc|$^RBEN**_}#8vV%`1yYXK0?lP zoJsd~erB?_!TIn2&(3GE7j~8vN#*uUuIfe%TtcYMou7gxf1tuupI+fM|6vMOdWyaw zV(44K>RY-Ok(*tpZ-0zsGs239xL!8`OQdhnEM|ngNUE_)&yNdqK4GS~lK;RwRCko! zZ5F{DiMx%U?pLakQzeJJ=@QiH)?FBZ7E{MYG-+Mc&oP|lm9zY(kP&ZdNK^kV6wj=) z(p6ZtU`^ydB%TLecGW@l9NY_A+{#Hi17WqZ@hCsLA@oi1zE`d9Fz@iJpm+xr^r|G+ zX@r^KOd7Z`fy)?efq;7n4eOe)L+3A;Tx_7Q}44GBg?}}$Owc>>$^a( zf?Lh#!EJkZOaGPJ`;Rl|aLqDJPQNUO@D7F)EF?nwD2|80Nev3q>{o#-3YlsJhXUU> z)L2+t;iN7Dw#?AqLU7>!m-$*ZS2`($V2z)ZzMGk|?hPlsSl1pWy--)*Nw;$ihAQHP z@e?}}_$f+_G#Gakeu>E zIX2LYKQ!9*upvd)r`jL?X|g-9xd5yMUzYjw759J6yB4+ux{|a8bJoUS<&2J`7={h|FjHrg5BB2T1O+7@8EVFScoU0_D{7E)Hi&pyO zG~#z?Sr(El8H*4#c7v*p)HAKt9yKY#)nd&kEa4xjzv7k$2?!KCho0Y=a7m}1gD zBkk*R$5Q$4s}NPcOIK9CQ-#GU1X{$@pGQ{iK31DD)zXkDesj)D%_jco-&vUW>5KM2 zn?0|w7LwuG9n{4>9>^MPuTm*{NP{Q5D1SvcEA1hT;C&oTOp9!!Q+SL*X$0pst|tbw z%~`!430p?44rlnK%u7Eav5>wdfG6-b94A>z-gGnqZqe3smsy$ zIWqZ9YCE^yVNPQ>t9vDnv}f<^q6M3^YUd~i=jpq(aNMth7HwwVjFT9ofXX3Z`rue4 zy>u=p>OxTQG@1Hm8fQ9=0O)NSm7MDiUU6XG4P?)O$n9}fZ(<;zZ;qI(G$Ug^)R@94 zW`!G=U#&G6Lp{MrA-kT5WG z_9XL+Sql$%M;K#Z+o{MgRXaJy2FO&$HNA3NYyX=;@d%j48F_W`nB&~>>nL-oo36g= z*ViMwmDsXs{^ARWG0C@#@daqD@{$|I{6;oBw<;emE~rhdl)er) znd7!RAVFtt@<2(|VQ%6aKc^-8lG@f-;kE;GXlG~hT_qhC$mxl9T=9C}GuA1}#(KQ? zFO&PDb^BYNMvzq3)am@R6p5IYx75Vpa%Zt#YP^eLFx_92JTcsQkjY>QymJ-%9n-n; z?3bY=%AY{^%{Pv{Ozb$5neU{Yqm?4Ssh=9OAE`NNjugBCh81=_B8{Hn9qdFR*(#JS-HO>n>f zDR6%?5plZ|1bNnK7$0Ox-k9D(tc{=!hNt!2Yd}j*zG28i;zB6n{$CgD&pot#O$lWW z;S}U+4{c|g6na;PYMt@>qd zd6Uakgu2`6JM3w=CGIcCCYmi^T0mc=Wnb{#o^owB&oB1ovfV5LWwx7Zwud)HvbwZQHNf zV1&ulGx531^Cey;lPk;kWgIj-kl9;ec6OC*-KN+frXqdwRyZ=XwsY~eWS%a`94I4K zNn*5w10aep>a_AjPHo*z1coeTB`rVZ^Uz3Y#bRYpNPuIl+fG8*bi|i~F2~=8UNFyc zHF7r_kUNUj^Oz4~Rp->02G}N+Y^Gkvk`>FyE?UPnqez3cHy{Z*zf-6L+b;B}9@@6fq>TpQsVQ zSa*GNu@-tV%KxUSmX!gSY6j_QDs-;oP{o)h#uKM-Rf4ysxPQnPCJ zq{s4Ti8euGN@F3KP33uDar^(ETZ08thq^&PD%VHvL-g1W@eYio8{Fo^xp)o}6{c!q z?JwU%ASkmByl6lEa!BAL&mRZt?Eant{tS(caTqt1b4xHv(o1F&4@tH0iU)W#7Aj7B zbz=9#P2K?{WCo$7C!pSZ+zqNhPWJ8!mU!H-Tv#n>;uFsRvEx zl41licyMmo%@;Z888$tWbfa_oM@Wt6r%2z%pqoL2m_xF9O%a4>3Xqz~h-Xa9vQ(fm zqxuv!60n%ZSvv-qv@eHJlWGy&-_A5PfpI;QF>ZoVJ6{&Axg3NaGP2Aisv$RJ1 zen3AmB$b@(*nRR`VtuB!m{8u>EkyP{ero1Cw(t;@D2z55D~C>#wUt&e73}!`O6ZyK-*dmbCaF)KMKBaU}VEO+55qfiQdsMt;B1( zuSA|pck5xfB={}F$!? zm__Pm*jUT*1-cWm--RHV{bikY;_}|`j_@P$y6`;FJpS9OH4O1S`M zGX_+rwzK)ykq*vIHl-CEuj{|%ussTMm{HdzPec>v+Ve2NHbRV@tky$jKh~mdqthzI zw(4T%>Zbf${j}!lWoTD}A1>D%f9fUE!5&bewW`&_x=!B@|<;aET zQR>%lhq@bEZ_nznH)d(t4g#8Br+Qn%>D6DVg{QUq2oUu!l2eNOA0w@KeRUo@ifi5Z zp$hTapCG9Wq^v?x=HI2xhuMwYHNv|IOAV{I$RFS$cfm>B%P0&h4fB{Km92l=s-pf$ zi%E*p`p2y(2WWG=!%0mPdCZZIM_`j-^x0&Ez&&NBpl2x{s$=*|4sGd z&h3v`T}*h7`L)P(o_^MC9rQa{znl7+*iLxIhV~5Y9O7u;oCV#(xB6dJskPralEum0 zYgp1VcZe?9mfE2`DLsE{vv@AS3Yq^W)brLSUvQGc2-4)jR?#8{J`@gIXqC=g#QA0Fo&cT%sy%FeZhH&CY5JJA{cX3g+~_j9D0 zlMO@O7TkZG5RCZWhZ88wG^||0N&khY&5T8AKGx5s>PfXZ>5EDEuCnC%RnWLpt8C~+QqnI}9uubO2feiEE9$RIWx?dVvtNCH{a;|*Xhs{8iEo`hSek4gBg z_p0dT6mMf^HM?)W^fDc7zl=hazMPbg!)Um2pM9N$=00OgRPIixI*f-YW#HV0_R}i8 z)JpZ@|0A8t+F-;~+)>&wP0@VL>vB++&1qtbJ*|G=kAtAgHEm_*OE5&-mI^>{9lP}feA@JC^UF`VBI0-j#sRjw}Xz8{x=Hh zW->S5elK_aAc|7(`Vq1m*sp+a%)8Lx;^55NHSmv;$@7r z6AhrvN+WPQ9ZQo;@@Xe|9Fgx=?cgdxW2tr6l_!D1_5WNvJ@?6NP{_0P1tsn_LJdXLx|bi;?G1-g6Xv8XsF;!qRgrOD$JoCPYs?g z)+enc!GZ4|tQ7)*!hx-z+;BomVXMjH>RSnhO*q5cN{k5RecapXtlsHu&SXoaa+#O3 zgS-`|wVvbK=;%~uwH~>z<=jcOlw<8ooAwc{neG%`Q!Tc?7CSP5XcT|diL1>CQFB@# zG5d0YmAohLa%M8;u1strmS~E(LEJ0xUgJ#S#oeuEV|r={jaECUrO3Yty7JWg$CD4Y zn4p0CjdxLCq1vZ+bNj454WgG76VOfmD*3BTd?O4%CvIh?pZ_1pP4wKGM2p(qfSwhMC)B7brUc((qTQvwM0b)&DR*H3i-N5|^N` z+k|I8yoYK*|C_0iyD#*AiT6yv?cz^Sz}nWcYX<#RY6Ruth=>p2Emyi@TP-8Hi?_Dw z*~MDJKyf2+j^Tt!`wGWHFJ7y)is^i6GjfqK>kz`4mSOAx{FRVBhJ;t=N6p6_S9ST9 zQScV>8w6j1C9f4vBdKzNZPYas;{*#6f+~Sgmi!{U&gz56ZrtnBQ+qs02zE>$J({5q zV&!b{ILd2;_j&zNQtPDek?{^E(RnCNJDx-N?=;Yc+I zRPr~4KPii|s<)^&*G_5Mo0TG)wHgc)g$7cHX?i6&b{vW6z&O7Hx=GIXo5G*#q~=Hn z2_>`JkXladKc;bq!#K@x88EpS#W6oA=C6w}QG;oZG&ry0M!d=lyh_qb5FU zwR78aGF#8A)9UfIM(&wCs_U{h|3W!8JyDlU{Fv%81xA|R%pU*mEYBx%NHZ(K{O;2V zb1Au2kk2_;khP%HcXC6fTL1b#N1k__BF{hiz49y`hVuNAljM2EA12T5e{*?;T8KX` zP2$@~_0352c_9JJe3V3foPXZ-lM!+5ph9BO zja4U!vuDIPciV_8e?b*vH$RDRehJ7{mOn;jD9az@K9J>K=4E*~)!$F`K$dkW*e_gZ z_X~sPyX|`;@iej;U4j>1uC)7w!A2o3;vnakEiC2sb#5`w*V&yy>k?|4Fz^vEw;cEM zCkIh&;?WhDJWP9~vsz_=W62&YmVGu(zdrlW5^Ng&Dvm~|z@K+kZ{ecN&gx*J@V5qUHVPAMNKq-9gmh7w z-ze-{`+gz9!|Y%h(-HMD1K^O(%G!{$GRtXaHVd^&NWjw+CG75CMGY$E~GOXPV#4CTiI|5Bt~(?(>>cLmv@D6Zspt6Y6Il0Hk`a{FgnFMHM)5tBhzM6 zFfwg61tZgDQ#i7;-V9|PI}3+mCWn#vo&CuHb|~4OT#cR)O0DVNU5oq5s*rP-XU z=?b;Od+gFSb67KOR`z9tmw0gGSS;(L<(QaF%7-KsYM?5i{`fviR^k`Ut`VI;Xj1p#gb@>`@ENjTw-YdC7uAQJAl#{I)A0L_l8dCh_ey5vc+LyJQKzsYcOwa;v> z9(6vv6Qz&)e-C)dTfn~!MW0pI?cAQzc2xokgWb_~WyKs`?$9n7G-Bi*5`JJ@bbrAn zT&XtU_L%q<@3KJs6fkSzRd7;92s$*|Z0uAZO9VG;-00xY(>w^OmtF9dwV`M5iS_1^ z*;H{!KMfE?V5X4I(oPx;kolyv+oN|E%pH1$_j@+8YedVjxWLIL%)xC8wRyQhMbQzx zO@M(`1U8*TP%XPUc$k{6ppvo2MLQ;LW}y$1dhbxp(W1v_r8m`15N2WF9;3evR(>DkbRu4=Xyy~d#^ zmly@eOexwu@#Tpd*`IlmhEs)T(W?`8PCQQk^)-V<*@-*YsTm?Q*U%>j3aGdF1w<4U zkP8qkhICsgH@%Ugh6H~Nrp=sbCJF~WEd~N7%fRQ2iMzmtN2d^A#yAD~ffJOdrwcYE zsIq(F@rnDPx;=dYnvE1R(4eVk%fu(3qIvLYTG2shIADSoKSEg5Pp567?u+^vsog-O z#AV6~c0Vh zg_j})>A@g+Km<&txFGx<1Q_flD6$}v2?Fh0>~1*WPtDR>yglr%azuUG%dt1M>3EB& zxntXYaFj)5PJVte&na!&&ykKkxG#$v>j7jtHw>n{bGg~Hf62M?N{mww@W8&C@&HJ% zY2RcXX^f*^BO3u9$4CVm0ew*!E}}Z$;O3-Fd%a=Z0$cD%q=A0I2U@ggA1p*i?cJ+; zvv==pRq&99bL`k+>zS-Hhy}mX?%1spy{sMu_e%)-1o3k{->4~$y$bV8V~6mv&os_9 zD6)C_B-Aqxf8Wn+GyH&lWFqYL8t`=PLOe3|QE#uYGh;A;YRa?=5_5FJM!I5K-)#Q0 zb0@@(d+e_*U5(9rfap^gU%+iqJntrv9}h#Oe?EAIyA};{J5(@wZ;UwT1=KQAK&hsH zPRtKeK-srDt|;*u?cUhN*2BpI+Ip1lQtn?w$ZRp|H@iPZ@Nc^5XE1qWa_83@Fo1Cs zBi{Mt|HGpa#_kSmWAI6D z8@`HK;Mel9E7=gc{*ChIS-afW8u#bHSRKslm zDp*D~{BGRt|G2G3-CpbCoOwuF)fvOUShOP87QrN#c8=+WPy!oki*hEAM|!J zK!Janv#f`xL&>fRjrWJ_W2N4Y)egnMnTL10Dlc z=}WKmk6R_wKi@v4k=8%HB)CwtZyz&L(%8q!49wctCP%RWWCW`yi>hx60M_25bP@ZOl^r*Eqm+Z^Ud8)05-uzWl*S!JbD(iIq;j`U9=&?f^}?Si zQK~uf*}l1r!u#;K2PqwS*n@Kbo7o0}&mNp!1c|!G7OQW@N~M>^aOJM^Zq~Pjp8+Z% zMzd5@^l>I@?sjk-8`gm$_a!1p0T&<96(^iXF+)Eo`_(G!S6Wx?U~1S6F9+#67!b8a zsg1DM(Z-In8k-rMwak4b1I3WcS2@=jq&|Ti&ZnQ)qssF3s8VkpO|#`FdSqqtAjYlV z%Oc{5Dwyz-Gt2_rdy%(_Ppo*OnH#4W{F1@NZQB_!@XpOM{`x;4! zD`-0D+NfWC*cMe4*rHzQYl|9XY*89O-xkF>YN6`!J|_fVzxuw6#n&Slqby$n>=jIV zpD|iy6L6{Rg&L6GTVqsth24F=M`2H#)K6uMYM`oMewp>xT5kf=$mlO9IEp^_YA1EI zMnwYAyEqkuYY)Y~$Wzoi-@Z0enPr@wNDhieWxje-v(TU5C`kFrG{2>kfpk*Cl~$5` zy9#0wd|>QZeuoa%6+;rdzxFd|Jp`g*D$N_T)`YyfctvEv)i_7J+-s9D#$16`HW^3jPoMt+_$Q#M?Bz;yNA2z`W$?+GS&`n){o!_zn8-LJ9YC-%#;Q)jx+CTo_8Pe@w zBRXvS!DbVGP+r+n0ngYz@dryy{J~1TG||lpep3*3O$@?>>X9EfB7zA#=&^yjaGo(! zC^}NR2{;I(Mk&Iec8)eyRuXtnNBLorJJD?A*6G?~_+6c;dyeu#)w_6@Ht&!z543!R zS&4U!4P;n{#<9w2k^G!$yXis+bKlUcWnp8&&W$QQfOij`tbSOr^M~idiaFdGX8U5q zCDC26%5XrAPm1FTJX$p>qQ;Aj6to;1ohl-b=LaEd^BWUTT#h$cb zXLu*W{(b+HF~)#2su;hGpQB~%2j%+^2kFl3+xUPXCF+ld;tMdK!A!B+1T?lL+C~Be z5uc2%LE#+q!mo;y70 zl@Qwci|rVGd!slG3${*|5}c3J1P?;}0{5MExDby2#K5a_OBoxXQ3wD7+dgP?vC6Qq z3%`oy&l)USo{9QsbQgmx7-(RQ++lV1$?PxD<$C&inH zy6=JF)vJWgU`G&bvtlSKKNER?UVczQL%U5hnPH`YLD6Z^DP0Crql{!QfZpBEjMiQx zzZM#CWF)_%1ONt6wuqkDays~tnZcw)+XOSuW*QfTiVq<9n!ti%xhXzS+fHCXq&kpn zl>4sToxjWN604mLoyauEqp;O&yi3cY+5<{sD~)j9Io1iP&$-n ze!$d89kPfH)JPBFI!h>)%46<<>GQS`GH@?-%|RAluV^2H@z`023Sk2>f^-UGDDKRM z{~%X!M*wa}!5qQ_?s8WZ?@K(NfT}+8m@085u97z3cHLsPKVv$p1_=Su1hj7*Qk<0* zz-9=<-htXsL-m2*QivpDc4L|DMhPzMq8u7`#=sd@&=U1gWJ1lE_nzbt7& z14iSO$jBE&W2dRZcae^En}PB!162cgId~a7t3@V0;5V7mmgOq_yfO(^Q+HBkC8yd zRMEUMtY4tfyuzQBt9FQLzk$$ktF|H1%rfsH4Gds)(e1T8$YM|%P%WEBqOACEfIwLw z%Yy)c<@o@CrF{YfZkTHV1X8_m6_V0On#fWj1ls6;bMKwyeE@ht^S(&YPll7IC7(|# zW-)zzIVSZfc+k-1%31tk{P1fnfaRKbqT$l0<`r>lSU*EkO&G#QJAHr7Fz4w%eJ}MR z_W z;}1d*BGFps4MMee&c+TK;R zjD8YQCm{CY?cIX}6U44~4%%oWq%j2HQ(MTYtNdv=5SF`gZVZ%l1qP#N9gg0G5Z7TF zuw0c7X9l?}vO%x8OijrXT7Jy(2BS^M<8!dYD~H(RyST2cEdh->F@(wFv5Ly+#BrRYlj{*YS)Kwq4*`$GVj zKbgz~68o1>qP1aOGV{JJ72@@wKUa`jmcQGkRj+5Gsf^2S7DLc!wTVdaM~Ob%)4w`* zXC}5tbaZTb%zQ;DnjcPf`B93-m?%ZF-^amnY)thhV#cv!NUwEVfpS@OtOy-!c%U7@MI~1#ZD6rEmMrhEK065Inl4y znCMrGce?Zz-sm|W{R(g^C~QT)fIJP90M2SUZx`Fw@I>$!^LYgL18Yz zWaL?gPiv;k<=8XL73Kz4`JYC)FZ2GwJP8Q8)ABBm3kLX9=!U4OV%yU4ybwhIM0f*; zufAy8V!3<3hW|4m!jXr2!~aE#B`S}hwkB-+4XBiYm4X5S7E7B_sj%XxHa;8zaGKE@ zsRLKba;Xr21kkFy#t#8_G;MWSJl1d&PuNOX?>!9g$QFvq2t8WBa-uinAF@Wjcz?iz z5@XnzgGhh4OwrL<`51rPqw*n*mtZoG_`|@Z5MY#gF5vfh4lO?K4TnOTI9Zj9mRUP` zo^V0FM>e9LAHG9jbyPkhpI5mMsRg$eBKrB0P{VbkHh8aD?dMz*xepXF)-Ypg(0V4% zZ-h0$%DL6(K80U>BKDPeKU7J5khPx(G(eUxh#IJKQuo6-sB9Jul>qZ0Y*i#HO@X1P z*NQjtm*x9raf%=`-^OXYE9=@-)I+m4ul;n50JV z>6cUn1(2{x3$OXy=QalOhxp-ZGhZ9Y?t(9FY`3ApN(TAS`9u(bLh=B?!jeWzhEA;o zt14>V5tRZ&rL0DZpQ~L*ls>&E5oyu0=#<^mNXv|pKUG82N)jDj&D)Hcx6xPg z`YK*IXd2zIG-2L4qG1i7Dklra`_K=q!^Pj4znYy|q$ z*)sOL!w0i4@Lm^G@^b5`%)Aq5ti;FTwSfPy@F>Bt3g(ttYmB&5EABJPY3LTn1TKTj zuh5M$6~LQvu3FEQdjCx`oF#eP$RXOMR^`_|@7Nc;YoEXHLXh^CH-}yOsFPLdJ{x1Xp>(s;;wHee<;)N)xcyQVNTG-z`Hp!X>#1<;mJ!b%V7 zw59=CL?J))@lnLysFlq=jeV|5rR z!nZtGHu!y~M_coAl{IGRa0XDTOxy?ut}oYPZ>QC%-?HKs5T6F2jG;N`t?*7&tIcS& zTeL?q=$;_&?FVsu6)51w;U22+F7{t*Dh7QS1oi7P zg1aS*vlua?Qb=yX!Zld|u-jt5;Xe+iesx(*@|N0|aZyma%)5s9oBwhT^geGK_xE2U z-);^(J3usK9BWrVV)3o|bWlqp(aQ>6Euadwi~s~$-XR+YGlahcRA6~hFa;evUrWt zawe~}nE?&Yra3nypZ9lIj;U1BvfsYLK&>=4yp`ip%LBROSET1K#TCuQWZ>(+V(g|w zKH^u&uPXMhR=b(%R--7))KZ)sO7HlU#m>P|?T5DqMapzx1_LGCyr5+2e8`j%PhmQx zjNa_=_8{ktrZKrLzq+fX>)Ml(a=Sd}C|3;SUov0(WJmL$5}hUcZK2xNxesKL`K=`3gQ@**00^Spy6@eH*D zBU<2t2T6tL=1r%4`!M49r*b?Od+l#I#V_Ds$wTg*r~Z{3?lWvHd|tkF)vuvR$3=`5 zveC7Jv)|f3D5`x9C40kd^-{8T)IJyAZLNJ-S9_7mIP(1Zbi>2-k5y1$^?qKJBVl%E zLx9D^`0;$!>C3#=k?zG=($p^%#+svo%Z%(;uXuAUG$yY=+Qq2UyX|{lp(_*Hwc~s{ z<7PnRb#uph@8NnC#U_?`M0N1cV9ku#+<#BE@m4&MPCJb9SJ8Zq8O4M2^1b6n2t~zA zHsi;}DE#IzQ=@KR7TfWQ(H0JoHsePW8zO(%@mm?IGEG9YW5%yM`}efPybq7x?&8;q zyJDlv=&^bI`Ifb@p?-*yT>JFadHXedHR9EhAEZxMt0p% z@v{M9%=j7D$f;{H!{B-OvCxRv@sRX2g`qZwUH^jY*hyY_N|1ms8+C%5BD|42S%GMs z3Aurk0lKYomaP-zO};m>dVO;FMea-TJ#P6m-;xLL2-wUG8A}idL$FLI&L_GyaTS4fh%rOuVk-LE=doGboB`7^qB~*x$tTm<=K1YTh1W7 zO8W5_il5`D%$4}Jd@1b-J+42oEsq%%!Pa%A4UMUocW_)iV||B?w|m?W{T<*s{_52m zrH9_+u2*c=f)MeuigzpY&5X+C+AgR`tffh6>D_E{+ij2BJft<&e^ZNDkW_bDJ^*=X z65;nnfY>>i#)VDH%~28v=`IJFEtSS#snILEBPp&7J^ichHPS0o1$qTC(5~j{eJr!z zac3+Bqc*bY2o?*@!ldpC+_ya>rL zfbKoO>Qf3 zRjZtL@a%dHg*=I)xT**=iF?DL_S~@cPN#S?cwN^11~;*zYz)xTslWYohy91C?+N3+ z(2p4A>EZuY{?y1Rh68a)VrOag!j!?KDA-dPaH`_n26@D#3@XLmv{=+-=OgT@#Nef% zlKXG?l{$Y@nPF9r)1@BM(cIm>zVZp78LGs;A8q*6YNEjU{OYyh9Z7Z{_2*YR`tqwy z@lR!7N9pjtyAAi&+rwP_pkxPf-?Qy8yah$$8ahNjo~(ysy=(|y>K&mU(m@QHh@=Q` zEnT`4n^nxBpE)BS+N+8wi*GTU5EPQ5P-FE0_Z7?5AiDGd^y_764eoM~K`Q-vcO5&$ zo*A}Lv~)4!>D}39Py_xp1s7DNJL#L;^@v_AZ%`fqj9m88G>z9t@fJ=d8T7-q&k?T&g};qYE2A}|@m0W)90b&?|1ZF6TlSy4ZoZLzkCCJxeX$|y)VC9 zx1ibQm&T{*u>8_l_VQyV2`+R8xX^VY9tbvKR38bO_{HoEuwW?pnbAsAM z3OhzL+ye$0RPH;RtmI*Po*&SS$&TIueGPyN=zY94KbYnIV3z#UE$K6uR^Aveo}(B( zGiED3JZ8IjWyh--@XXShjvmKoQX{aC3^`d>_QyVF#LosjweLKRr~|l%vr=F`D;Vy+ zC!ciI3YqT}%-bdx!`N5bcMNIYdVD6GV8P%lX|6nbItl8S66pRC#j7>Z%BRC9&vq8S z#{R(M8#foPW;UDyVux1d!izX< zX)8$bN!}p@Ik(F%+z3KuJpgM(5PG;CL8zYGp+F#m7eLW~_h{}KxN3WCqXxI`ahKLt zA7Hi<4_6caY!m*$4)-d*54=StQy;e8T)fJ}?_u=Mp^(YyjEg9PO>_QQjK z?UgYw;1is?xqbT(1y(Pw>A`i<)NCpks?+5U<5Ui7?oR5hC%Unmqa6@yBqF06 zwq?_PA#GC)BAIZr>3`Nwhxm(@-6__!i{VAQxLYENZQjskk(c zT3Zcjt#c0;19{={yx~I^TX>wi^)gAxDt9*z5NK-Mz@ZP zZHl_9&y^9wJe0^?Gz}(9W)t^P`a((cb z`_~L}FNe7svt60Qaksn=bDt%cGaj0+Wvt|pnY`(0p803#-wc*A3C3xYjrFCiIj^*B zB95{EGF71Zs+sz2xgqBLX!LIk<7lv|Jabh6DJu{mD&6ghx{glj4f(LfzJk!gnF_<& zb58qP!-`*P-|o1(HHOWa-)7f!0%ax$YoLE6V8$m}kX}=>78qYe70qr`OFY8Vix%2& zbnd$1-Km~}-?hc7NUCi2oa7tP>58oN4kb^YcXj2Jklz<*6IA4? zLL&R=8+>AApFMf>ie7C3e^iyBSnM!*YZyd}ihBD6{!l^j z3+$e=#EXs@{lG?dx2mmKD=Z3W9yD`o3*|0jI)yw*8m;ixl>~TwIgdX*mV&MII?R~a z@oHpDuO|OBaOoLF7s=_GoLIQ3%zRZxe~$4-vUZ*)PKE+Z;J$s5D8rJ5%Fh`` z$kdN`e7uJ*k4YSJSEEP$JvRpbi*>e-Imuk|#S5deri2+NQQ45s-h25ywmgl- z#`-SmfKcPLc|JErx;HD#Q-q724=XUB$won*N zbYXI}Hq5uIprp)21*o6-;It^V3a&Qz<=i}y9YeZ8PDi$HJ+63pu@qfqS7MA*uK=#( zibh`_r^aU~fx|q_sjk*)`IsrRVFQQrY#Y*^J-#@b+_H}qP-qZ!xT|9Kk&LJKUA(IY zR{YDkmL75b!9yx4t@)g?7GDci|Ww#`t?jPz8)uLw!}iF1%lTPms|%snVPU z{u*UuN?3dBX&;O|RNcx$%D~A-m+J%ri!L1`61t>Tb0f*gA-=WKvWzG1E&c@ZRvyh` zU$Ss+RvCix5Z3>tq4*glT%Lw>WbShYt_H$2Yct_}p3eGppU%t*C$~At55msGPVeiy zGRbPz5|~l+(jZ=PbyfS8(DDV3uNY7X}+OV7ISKKU|WO*Nr{s=~C z4BGrxd~N<{qs@oxvteMJyp+p0|8cZA3S&SenUejU^lic)12m`QIqZ4{IelOmhhPY}V<|D3IBXk&5*tT~iG6owN7= z1iZ|c?U2$c+?@&)w(~?bj~2h6r9<%!UN>e+p9Ab6_Z28GM0K)G)aAgX;#HZ+BB~8` zi%0D0(h9*bp0wS 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 G_J07AU&e<3 literal 0 HcmV?d00001 diff --git a/lib/libstdc++-6.dll b/lib/libstdc++-6.dll new file mode 100644 index 0000000000000000000000000000000000000000..21f9ea6ea5e561cd8e64bc2cc632ec04166c8f39 GIT binary patch literal 1558030 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%0AA;=*|simZ$|EkS_)-RzCVM+cvYLh`9BY$z} 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 z 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

Np58Ap(kL8jZn?p^Bvxpz=Ob>5w?v zfO8t3GslTdp3jVzwuKJjA>nvwpd&OYK3p!pxGYB~T8squn4r?>rA_i}y*%!IBL`n` z&hwH`G}k7ShTvtPTKtBy>a+Y;$FEoN8@e*?K9%$ntU1|IMx%t4q57s!bc5*615pvv z0@1Y7ba04sGP{5S+pki7Y{22=6qMKCJ9KU$0nwBvm);{~DM8(9F&4_yxvYC{pf`tV z!TYvQ7mmKB+s-mar!b%oQ)k?JU#MqssJA=R146BBvJLIKBA%QhBy;q!z&}!ik6o6k zwobQQvOba3arfV)Zq@M_HPyF-YUzm-B5radg{NE@-?RiV8OWfyEfi@9MfE-wmi&j8 z#ocT0+4E0qwhTFIgYBaG5WYe`>EbuVKI%W}pO<12xIX?Xw7T z9N|BAGp0@Z6y`sb-|^8tkc)M0YM=3Mr`pFvd*mAX@%K^Cit#tnb6WzJ`x<}me?QjD zP+Q%XrdRRoSsj1lg1P`*aFH2~8iVs2e;>r0P4IuPxcqhcr5HjsH}Jl=`}e3f^*veR zZ_L6|Cz$HvEn|%#4>Mn^Rw>sGjOCw=@%N%V_O`hFTFj9kAH8&X4dXY`YdL5O9dmbf zX~x{&R6+)3&3?z+b?f8G^Ex@^#!w84cCPa?<{kx(-I)8zj4?MxnptB%`!RR_P0!Al zo5#8PZi%~pO!@}mtT*P4DP!(_F@VOi^rW9O(PhEPh}#=t2d-5}mId!iBhlFs%Mn4n z3mI?Ut{rbCzharY6}wihdeKJbt+@Cm=;?cR-NXS{v8<#>DaDs{ZQ zk;dEYe#hH2{k2~lVMZePVtk*#)r;HxNo99=$i^=a=b8=25Q3O z@xnGI;XSWBz?e4Ug*&r5ILN27(+d1X@@#+De!OrPa@md-V!&luQ@vT2^)(6iUm%k+ z#`RXm+uMEVk}>Npz!@skKEG2ilkM~0zA(9cobwaz10?5h#wWl7-ACf?h15RJy(q_gb*`ZHnI4LJ{!_)6 zHtkcG|BQXbNBcZzKi=L9TvJqM$A73$A+HMarcvu$7y3bQSAAuG}E*04+c-+IR{~0r(lYlK_hYo+Z0fF=lUN!n;%VQwnBMPIZ)OFK6oqy)mZqEd`V1RJTC+h!5K_ z$D(}@&My_rq?|uY)2A-x)j)TomyS!Z9|KtF^QP6IDx|Ihr&7Z~lMdSeL3Vs*F7AFB z@6O*?wygbfk#(FA^Ri>ei`^kMUf`KT=5*9(W6Za0tK^$_cKOy+CB*uCr?f%FYMc6A zudT1Hy{Mn1Ht4x9?mkbpm(1}thAOr=&7tTGUQ+%(k?EzpuKLV;MQ~ZhHx1e~6BUwI z#k*2>rRe0Ule80miMu!AvzPnD>fE)VN~}bDrcKnPLtn9fk%Ena69x$ zG3j~i2Ru%t7_a8omj*9YA{0Giv*j^~=jE3Wk2fehIF|lg0bP;B!kS0b9kL$H3Xf!L z{j0*HIg5#HJ^GPf67|@q@ZfqJR9Gy}Vqsm6#uv$X-3N2dirBVCCH$B2earx$N%Qwp$@a=!Q&Y61+*r|d2wTEZjx+|pX9BGt**wNmhJJD zTs%}qUzXJ#x_*ksJG=io?(OFi^8)l!$a#sr2~akD6XSH@Ii=VaHcy=W$cfqDm~=;S zQ5>#^-(O00w$#&|e4dO&p0xQD!z*ujzR~{}?;w13WFXEQf6i08p#-^nP~H?_acWD`_pYR83)alk(Y=STL$Wo~H9!%+9{U_q9;HPL9R zjJf}0+&hE(_X=imJfR-wVxM#AM;>PYb#~$kCXclW%nePTU!5S#;F28U9(8bKFX!-p z%nhBdV6vPA=7tX6i#a=u&l(iWq(0U0vVI=}#SyZr=!W9vhN7^a&yo%|uxvKDl74Nj z#AN$z;6=8-9XU9`x98dAyYr<9_oGzb+x_tE(biWN*J9v7x~OQ5yC?BZIhfqJp@E#a zq2}PS^kfkrbi69?8}Zr&UVN6Wj+XN{iKmL68`_KUcd_$L6=xwgG=%xa)zDWmFII%y zP|Jei=Z5xTjlkK;4UP0c2NaX;Wj|1JL+R_sG7|+RACE${Vw}Rcp@$S6981+H<2-Uh zG32;5P(6O6@JPni>9h{8(0c6Wdi+k|!SyIoZfGC!s^XddYz`hp$_?$sSXShQDw

    H|_y8qnJ_@C@@F}nVa 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 L&bNvie=PntLNl>a literal 0 HcmV?d00001 diff --git a/src/ai/firing_solver.cpp b/src/ai/firing_solver.cpp new file mode 100644 index 0000000..7dcc410 --- /dev/null +++ b/src/ai/firing_solver.cpp @@ -0,0 +1,342 @@ +#include "ai/firing_solver.h" + +namespace +{ + +constexpr float BIG_F = 1e18f; + +// Дуло: muzzleOffset юнита от точки from в сторону цели. +inline Vec2 MuzzleAt(const Agent& shooter, Vec2 from, Vec2 targetPos) +{ + return from + Normalized(targetPos - from) * shooter.gun.def.muzzleOffset; +} + +// Полураствор конуса выстрела, выраженный как тангенс: боковое отклонение +// пули на расстоянии L от дула равно tan * L. +inline float SpreadTan(const Agent& shooter) +{ + return std::tan(std::min(shooter.SpreadRad(), 1.2f)); +} + +// Свободен ли конус «дуло -> цель» от своих. +// +// Раньше проверялся отрезок: пуля летела ровно по нему, и этого хватало. +// Теперь у выстрела есть разброс, и проверять надо ровно ту область, куда +// пуля может уйти, — конус. Ослабления правила 6.3 тут нет, наоборот: зона +// проверки стала шире отрезка ровно настолько, насколько шире стал выстрел. +// Расширение растёт вдоль линии (у дула конус нулевой), поэтому союзник, +// стоящий вплотную к стрелку сбоку, лишнего запрета не создаёт. +bool ConeClearOfAllies(const Agent& shooter, Vec2 muzzle, int shooterIndex, Vec2 targetPos, + const SolverContext& ctx) +{ + const float half = shooter.gun.def.laneHalfWidth + g_tune.safetyMargin; + const float segLen = Distance(muzzle, targetPos); + const float k = SpreadTan(shooter) * segLen; + + for (int i = 0; i < ctx.agentCount; ++i) + { + if (i == shooterIndex) continue; + const Agent& ally = ctx.agents[i]; + float t = 0.0f; + const float d = DistancePointToSegment(ally.pos, muzzle, targetPos, &t); + if (d < ally.bodyRadius + half + k * t) return false; + } + return true; +} + +// Почему линии нет: свой или стена (для F2-оверлея). +void ClassifyBlock(Vec2 from, int shooterIndex, Vec2 targetPos, const SolverContext& ctx, + bool& byAlly, bool& byWall) +{ + const Agent& shooter = ctx.agents[shooterIndex]; + const Vec2 muzzle = MuzzleAt(shooter, from, targetPos); + + byAlly = !ConeClearOfAllies(shooter, muzzle, shooterIndex, targetPos, ctx); + byWall = ctx.map->RaycastBlocked(muzzle, targetPos); +} + +// Куда союзник МОЖЕТ уехать за время t. Обычно это линейная экстраполяция +// скорости, но боец ближнего боя на замахе стоит почти неподвижно и через +// мгновение выстреливает рывком по УЖЕ ИЗВЕСТНОЙ оси удара — скорость об этом +// ещё ничего не говорит. Поэтому для него проверяются обе точки: где он есть +// и куда он прыгнет. Иначе выстрел «мимо стоящего» находит его в полёте. +int PredictAllyPositions(const Agent& ally, float t, Vec2 out[2]) +{ + out[0] = ally.pos + ally.vel * t; + if (!ally.IsMelee() || !ally.melee.Committed()) return 1; + + out[1] = ally.pos + FromAngle(ally.melee.dir) * (g_tune.meleeLungeSpeed * t); + return 2; +} + +} // namespace + +// ----------------------------------------------------------------------------- +// 6.3 LaneClear +// ----------------------------------------------------------------------------- +bool LaneClearFrom(Vec2 from, int shooterIndex, Vec2 targetPos, const SolverContext& ctx) +{ + const Agent& shooter = ctx.agents[shooterIndex]; + const Vec2 muzzle = MuzzleAt(shooter, from, targetPos); + + // 1. свои — по конусу разброса, а не по осевому отрезку + if (!ConeClearOfAllies(shooter, muzzle, shooterIndex, targetPos, ctx)) return false; + + // 2. геометрия + if (ctx.map->RaycastBlocked(muzzle, targetPos)) return false; + + // 3. дистанция — своя у каждого ствола + if (Distance(muzzle, targetPos) > shooter.gun.def.range) return false; + + return true; +} + +bool AllyInterceptsShot(Vec2 muzzle, Vec2 targetPos, int shooterIndex, const SolverContext& ctx) +{ + const Agent& shooter = ctx.agents[shooterIndex]; + const Vec2 dir = Normalized(targetPos - muzzle); + const float speed = std::max(0.001f, shooter.gun.def.bulletSpeed); + const float tImpact = Distance(muzzle, targetPos) / speed; + // Пуля летит внутри конуса, поэтому её «толщина» растёт с пройденным путём. + const float spreadK = SpreadTan(shooter); + + // Идём по времени полёта: где будет пуля и где будет союзник. + // Радиус безопасности растёт со временем — союзник может и повернуть, + // а линейная экстраполяция скорости это не ловит. + constexpr int SAMPLES = 6; + for (int k = 0; k <= SAMPLES; ++k) + { + const float t = tImpact * (float(k) / float(SAMPLES)); + const Vec2 bulletPos = muzzle + dir * (speed * t); + + for (int i = 0; i < ctx.agentCount; ++i) + { + if (i == shooterIndex) continue; + const Agent& ally = ctx.agents[i]; + const float r = ally.bodyRadius + shooter.gun.def.bulletRadius + g_tune.safetyMargin + + g_tune.shotPredictSlack * MaxAgentSpeed() * t + + spreadK * speed * t; + + Vec2 predicted[2]; + const int n = PredictAllyPositions(ally, t, predicted); + for (int q = 0; q < n; ++q) + if (DistanceSq(bulletPos, predicted[q]) < r * r) return true; + } + } + return false; +} + +int NearestAliveTarget(Vec2 from, const SolverContext& ctx, float searchRadius) +{ + const std::vector& targets = *ctx.targets; + int best = -1; + float bestD = searchRadius; + + for (int i = 0; i < int(targets.size()); ++i) + { + if (!targets[i].alive) continue; + const float d = Distance(from, targets[i].pos); + if (d < bestD) + { + bestD = d; + best = i; + } + } + return best; +} + +// ----------------------------------------------------------------------------- +// Выбор цели: 6.4 (ближайшая с чистой линией) + 6.8 (приоритет назначенной). +// ----------------------------------------------------------------------------- +void EvaluateAgentLane(Agent& a, int index, const SolverContext& ctx) +{ + const std::vector& targets = *ctx.targets; + + a.hasLane = false; + a.priorityLane = false; + a.laneIntent = false; + a.currentTargetId = -1; + a.targetBlockedByAlly = false; + a.targetBlockedByWall = false; + + // --- ручной режим: сначала назначенная цель --- + if (ctx.assignedTargetId >= 0 && ctx.assignedTargetId < int(targets.size()) && + targets[ctx.assignedTargetId].alive) + { + const Vec2 tp = targets[ctx.assignedTargetId].pos; + a.laneEnd = tp; + + if (LaneClearFrom(a.pos, index, tp, ctx)) + { + a.currentTargetId = ctx.assignedTargetId; + a.hasLane = true; + a.priorityLane = true; + return; + } + ClassifyBlock(a.pos, index, tp, ctx, a.targetBlockedByAlly, a.targetBlockedByWall); + a.laneIntent = a.targetBlockedByAlly && !a.targetBlockedByWall && + Distance(a.pos, tp) <= a.gun.def.range + a.gun.def.muzzleOffset; + + // Вторичные цели — только в движении и только при включённом флаге (6.8). + if (!(a.state == AgentState::ADVANCING && g_tune.freeFireSecondary)) return; + } + + // --- авто: ближайшая цель, до которой линия чиста --- + int best = -1; + float bestD = BIG_F; + for (int i = 0; i < int(targets.size()); ++i) + { + if (!targets[i].alive) continue; + const float d = Distance(a.pos, targets[i].pos); + if (d >= bestD || d > a.gun.def.range + a.gun.def.muzzleOffset) continue; + if (!LaneClearFrom(a.pos, index, targets[i].pos, ctx)) continue; + best = i; + bestD = d; + } + + if (best >= 0) + { + a.currentTargetId = best; + a.hasLane = true; + a.priorityLane = (ctx.assignedTargetId < 0); + a.laneEnd = targets[best].pos; + return; + } + + // Линии нет — для оверлея показываем ближайшую цель и причину. + if (ctx.assignedTargetId < 0) + { + const int nearest = NearestAliveTarget(a.pos, ctx, a.gun.def.range); + if (nearest >= 0) + { + a.laneEnd = targets[nearest].pos; + ClassifyBlock(a.pos, index, targets[nearest].pos, ctx, + a.targetBlockedByAlly, a.targetBlockedByWall); + // Линию перекрыл только свой -> намерение стрелять остаётся, и линия + // всё равно резервируется (6.6), иначе перекрывшего ничто не сдвинет. + a.laneIntent = a.targetBlockedByAlly && !a.targetBlockedByWall; + } + } +} + +// ----------------------------------------------------------------------------- +// 6.5 Оценка кандидата +// ----------------------------------------------------------------------------- +float ScoreCandidate(Vec2 cand, const Agent& a, int index, const SolverContext& ctx, + int bestTargetId) +{ + const std::vector& targets = *ctx.targets; + float score = 0.0f; + + if (bestTargetId >= 0 && targets[bestTargetId].alive && + LaneClearFrom(cand, index, targets[bestTargetId].pos, ctx)) + score += g_tune.sLaneClear; + + int shootable = 0; + int total = 0; + float nearestDist = BIG_F; + for (int i = 0; i < int(targets.size()); ++i) + { + if (!targets[i].alive) continue; + ++total; + nearestDist = std::min(nearestDist, Distance(cand, targets[i].pos)); + if (LaneClearFrom(cand, index, targets[i].pos, ctx)) ++shootable; + } + if (total > 0) score += g_tune.sCoverage * float(shootable) / float(total); + + if (ctx.lanes) + score -= g_tune.sBlockAlly * float(ctx.lanes->CountBlocked(index, cand, a.bodyRadius)); + + score -= g_tune.sDistCost * Distance(cand, a.pos); + score -= g_tune.sCohesionCost * + std::max(0.0f, Distance(cand, ctx.anchor) - g_tune.cohesionRadius); + + if (nearestDist < g_tune.minEngageDist) score -= g_tune.sTooClose; + + return score; +} + +// ----------------------------------------------------------------------------- +// 6.5 Решатель: 3 кольца x 12 направлений + текущая позиция, коммит с гистерезисом +// ----------------------------------------------------------------------------- +bool SolveFiringPosition(Agent& a, int index, const SolverContext& ctx, SolveResult& out) +{ + const std::vector& targets = *ctx.targets; + + out.count = 0; + out.bestIndex = -1; + out.committed = false; + + // Цель решателя: назначенная (ручной режим) либо ближайшая достижимая. + int bestTargetId = -1; + if (ctx.assignedTargetId >= 0 && ctx.assignedTargetId < int(targets.size()) && + targets[ctx.assignedTargetId].alive) + bestTargetId = ctx.assignedTargetId; + else + bestTargetId = NearestAliveTarget(a.pos, ctx, a.gun.def.range + g_tune.ring3); + + out.bestTargetId = bestTargetId; + if (bestTargetId < 0) return false; // стрелять не по чему — стоим + + const float rings[SOLVER_RINGS] = {g_tune.ring1, g_tune.ring2, g_tune.ring3}; + + auto push = [&](Vec2 p, bool forceValid) { + if (out.count >= SOLVER_CANDIDATES) return; + const int i = out.count++; + out.candidates[i] = p; + out.valid[i] = true; + out.scores[i] = 0.0f; + + if (!forceValid) + { + // Отбраковка: вне карты / в стене / за поводком от диска / + // слишком близко к другому агенту. + if (p.x < 1.0f || p.y < 1.0f || p.x > float(MAP_W) - 1.0f || p.y > float(MAP_H) - 1.0f) + out.valid[i] = false; + else if (Distance(p, ctx.anchor) > g_tune.cohesionRadius + g_tune.postLeash) + out.valid[i] = false; + else if (ctx.map->CircleHitsWall(p, a.bodyRadius)) + out.valid[i] = false; + else + { + for (int k = 0; k < ctx.agentCount; ++k) + { + if (k == index) continue; + if (Distance(p, ctx.agents[k].pos) < g_tune.candMinAlly) + { + out.valid[i] = false; + break; + } + } + } + } + if (out.valid[i]) out.scores[i] = ScoreCandidate(p, a, index, ctx, bestTargetId); + }; + + push(a.pos, true); // индекс 0 — текущая позиция, для сравнения + out.currentScore = out.scores[0]; + + for (int r = 0; r < SOLVER_RINGS; ++r) + for (int k = 0; k < SOLVER_DIRS; ++k) + push(a.pos + FromAngle(float(k) * (TWO_PI_F / float(SOLVER_DIRS))) * rings[r], false); + + out.bestScore = out.currentScore; + for (int i = 1; i < out.count; ++i) + { + if (!out.valid[i]) continue; + if (out.scores[i] > out.bestScore) + { + out.bestScore = out.scores[i]; + out.bestIndex = i; + } + } + + // Коммит с гистерезисом — иначе агент дёргается между двумя точками. + if (out.bestIndex > 0 && out.bestScore > out.currentScore + g_tune.hysteresis) + { + a.postPos = out.candidates[out.bestIndex]; + a.commitTimer = g_tune.commitTime; + out.committed = true; + } + return true; +} diff --git a/src/ai/firing_solver.h b/src/ai/firing_solver.h new file mode 100644 index 0000000..f6d92fd --- /dev/null +++ b/src/ai/firing_solver.h @@ -0,0 +1,68 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Ядро прототипа (спек 6.3–6.5): проверка линии огня, выбор цели, +// решатель огневых позиций с гистерезисом. +// +// Всё здесь — чистые функции над состоянием мира. Модуль ai/ НЕ знает +// ни про рендер, ни про изометрию, ни про ввод. +// ----------------------------------------------------------------------------- +#include + +#include "ai/lane_registry.h" +#include "sim/agent.h" +#include "sim/target.h" +#include "world/tilemap.h" + +struct SolverContext +{ + const Tilemap* map = nullptr; + const Agent* agents = nullptr; + int agentCount = 0; + const std::vector* targets = nullptr; + const LaneRegistry* lanes = nullptr; + + Vec2 anchor{}; + int assignedTargetId = -1; // ручной режим (6.8); -1 = авто +}; + +// --- 6.3 --------------------------------------------------------------------- +// Линия от дула стрелка (в точке from, ствол смотрит на цель) до targetPos. +// Порядок проверок как в спеке: свои -> геометрия -> дистанция. +bool LaneClearFrom(Vec2 from, int shooterIndex, Vec2 targetPos, const SolverContext& ctx); + +// Успеет ли союзник влезть под пулю за время её полёта. +// +// 6.3 проверяет линию в МОМЕНТ выстрела, а 6.9 делает пулю настоящим снарядом: +// до 0.4 с полёта, за которые союзник проходит больше метра. Реактивного +// расступания (6.6) тут не хватает — союзник может быть чист в момент нажатия +// и войти в коридор уже потом. Поэтому спуск дополнительно проверяет +// сближение пули и союзника как двух равномерно движущихся точек. +// Само правило 6.3 не ослабляется: см. docs/08-decisions.md. +bool AllyInterceptsShot(Vec2 muzzle, Vec2 targetPos, int shooterIndex, const SolverContext& ctx); + +// --- выбор цели (6.4 / 6.8) -------------------------------------------------- +// Заполняет currentTargetId, hasLane, priorityLane и диагностику для оверлея. +void EvaluateAgentLane(Agent& a, int index, const SolverContext& ctx); + +// Ближайшая живая мишень в радиусе searchRadius (или -1). +int NearestAliveTarget(Vec2 from, const SolverContext& ctx, float searchRadius); + +// --- 6.5 --------------------------------------------------------------------- +struct SolveResult +{ + Vec2 candidates[SOLVER_CANDIDATES]{}; + float scores[SOLVER_CANDIDATES]{}; + bool valid[SOLVER_CANDIDATES]{}; + int count = 0; + int bestIndex = -1; + float bestScore = 0.0f; + float currentScore = 0.0f; + bool committed = false; + int bestTargetId = -1; +}; + +float ScoreCandidate(Vec2 cand, const Agent& a, int index, const SolverContext& ctx, + int bestTargetId); + +// true, если решатель отработал (нашёл bestTarget и оценил кандидатов). +bool SolveFiringPosition(Agent& a, int index, const SolverContext& ctx, SolveResult& out); diff --git a/src/ai/lane_registry.cpp b/src/ai/lane_registry.cpp new file mode 100644 index 0000000..d65b14c --- /dev/null +++ b/src/ai/lane_registry.cpp @@ -0,0 +1,55 @@ +#include "ai/lane_registry.h" + +void LaneRegistry::Add(int shooter, Vec2 from, Vec2 to, float reserve) +{ + if (count >= NUM_AGENTS) return; + lanes[count++] = FireLane{from, to, shooter, reserve}; +} + +Vec2 LaneRegistry::AvoidanceForce(int agentIndex, Vec2 pos, float bodyRadius, float maxSpeed) const +{ + // Резерв шире, чем «тело уже в линии»: агент должен отходить ЗАРАНЕЕ, + // иначе он успевает влезть под пулю, которая уже летит. + const float wide = BlockRadius(bodyRadius) * g_tune.laneReserveScale; + Vec2 force{}; + + for (int i = 0; i < count; ++i) + { + const FireLane& lane = lanes[i]; + if (lane.shooter == agentIndex) continue; + + const float threshold = (lane.reserve > 0.0f) ? (bodyRadius + lane.reserve) : wide; + const float d = DistancePointToSegment(pos, lane.from, lane.to); + if (d >= threshold) continue; + + const Vec2 axis = Normalized(lane.to - lane.from); + if (LengthSq(axis) < 0.5f) continue; + + // В сторону ближайшего края линии. + const Vec2 n = Perp(axis); + const float side = Dot(pos - lane.from, n); + Vec2 away = (side >= 0.0f) ? n : Vec2{-n.x, -n.y}; + if (std::fabs(side) < 1e-4f) // ровно на оси — разводим детерминированно + away = (agentIndex & 1) ? n : Vec2{-n.x, -n.y}; + + // Чем ближе к оси, тем сильнее; laneAvoidStrength делает отклик резче. + const float strength = Clampf((1.0f - d / threshold) * g_tune.laneAvoidStrength, 0.0f, 1.0f); + force += away * (maxSpeed * strength); + } + return force; +} + +int LaneRegistry::CountBlocked(int exceptShooter, Vec2 pos, float bodyRadius, + bool shootingOnly) const +{ + const float narrow = BlockRadius(bodyRadius); + int n = 0; + for (int i = 0; i < count; ++i) + { + if (lanes[i].shooter == exceptShooter) continue; + if (shootingOnly && lanes[i].reserve > 0.0f) continue; // это сектор клинка + const float threshold = (lanes[i].reserve > 0.0f) ? (bodyRadius + lanes[i].reserve) : narrow; + if (DistancePointToSegment(pos, lanes[i].from, lanes[i].to) < threshold) ++n; + } + return n; +} diff --git a/src/ai/lane_registry.h b/src/ai/lane_registry.h new file mode 100644 index 0000000..a5bf90b --- /dev/null +++ b/src/ai/lane_registry.h @@ -0,0 +1,51 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Реестр активных линий огня (спек 6.6). +// +// Каждый шаг собираются отрезки «дуло стреляющего -> его цель». Любой агент, +// чьё тело попало в чужую линию, получает импульс ПЕРПЕНДИКУЛЯРНО линии в +// сторону ближайшего края. Работает в обоих состояниях отряда. +// +// Модуль ai/ не знает ни про рендер, ни про изометрию. +// ----------------------------------------------------------------------------- +#include "core/math.h" +#include "tuning.h" + +struct FireLane +{ + Vec2 from{}; // дуло + Vec2 to{}; // цель + int shooter = -1; // индекс агента-стрелка + // Абсолютная полуширина резерва. 0 = обычная линия огня, ширина берётся + // из правила 6.3. Клинок задаёт свою: его сектор шире отрезка, и союзник, + // отжатый строго вбок от оси, оказался бы ровно во фланге дуги. + float reserve = 0.0f; +}; + +struct LaneRegistry +{ + FireLane lanes[NUM_AGENTS]; + int count = 0; + + void Clear() { count = 0; } + void Add(int shooter, Vec2 from, Vec2 to, float reserve = 0.0f); + + // Порог, при котором тело считается «в линии». + static float BlockRadius(float bodyRadius) + { + return bodyRadius + g_tune.laneHalfWidth + g_tune.safetyMargin; + } + + // Импульс расступания для агента agentIndex (свои линии игнорируются). + Vec2 AvoidanceForce(int agentIndex, Vec2 pos, float bodyRadius, float maxSpeed) const; + + // Сколько чужих линий перекрывает точка pos (для оценки кандидата, 6.5). + // + // shootingOnly отсекает резервы клинков. Нужно ровно одному потребителю — + // критерию 11.4 «агент уходит с чужой ЛИНИИ ОГНЯ за ~0.3 с»: сектор клинка + // резервируется заведомо шире опасной зоны, и мерить по нему то же время + // означало бы мерить другую величину. Решателю, наоборот, нужны оба: + // стоять на дороге у топора так же плохо, как и под пулей. + int CountBlocked(int exceptShooter, Vec2 pos, float bodyRadius, + bool shootingOnly = false) const; +}; diff --git a/src/ai/melee.cpp b/src/ai/melee.cpp new file mode 100644 index 0000000..a8ee748 --- /dev/null +++ b/src/ai/melee.cpp @@ -0,0 +1,192 @@ +#include "ai/melee.h" + +namespace +{ + +constexpr float BIG_F = 1e18f; + +// Угловой полуразмер тела радиуса r, видимого с расстояния dist. +// Вплотную союзник перекрывает почти весь сектор — так и должно быть. +float AngularHalfSize(float dist, float r) +{ + return std::asin(Clampf(r / std::max(dist, r), 0.0f, 1.0f)); +} + +// Годится ли мишень как цель ближнего боя: жива, внутри СВОЕГО круга бойца, +// не дальше meleeSeekRadius от него самого и видна (за стену не бегаем — +// путей в прототипе нет, а обход угла даёт слой wallAvoidance). +bool MeleeCandidate(const Agent& a, const SolverContext& ctx, int id) +{ + const Target& t = (*ctx.targets)[id]; + if (!t.alive) return false; + if (Distance(t.pos, ctx.anchor) > g_tune.meleeCohesionRadius) return false; + if (Distance(t.pos, a.pos) > g_tune.meleeSeekRadius) return false; + if (ctx.map->RaycastBlocked(a.pos, t.pos)) return false; + return true; +} + +} // namespace + +void EvaluateMeleeTarget(Agent& a, int index, const SolverContext& ctx) +{ + const std::vector& targets = *ctx.targets; + + // Линии огня у бойца нет и быть не может — обнуляем всю стрелковую часть, + // иначе он попадёт и в реестр линий, и в FIRE UPTIME. + a.hasLane = false; + a.priorityLane = false; + a.laneIntent = false; + a.targetBlockedByAlly = false; + a.targetBlockedByWall = false; + + MeleeWeapon& m = a.melee; + + // Пока идёт замах или удар, цель не переназначается: ось уже зафиксирована. + if (m.Committed() && m.targetId >= 0 && targets[m.targetId].alive) + { + a.currentTargetId = m.targetId; + a.laneEnd = targets[m.targetId].pos; + m.inReach = Distance(a.pos, targets[m.targetId].pos) <= + m.reach + targets[m.targetId].radius; + return; + } + + m.targetId = -1; + m.inReach = false; + + // Назначенная игроком цель приоритетна и здесь (6.8), но только если она + // проходит те же условия — иначе боец убежал бы через всю карту. + int best = -1; + if (ctx.assignedTargetId >= 0 && ctx.assignedTargetId < int(targets.size()) && + MeleeCandidate(a, ctx, ctx.assignedTargetId)) + { + best = ctx.assignedTargetId; + } + else + { + float bestCost = BIG_F; + for (int i = 0; i < int(targets.size()); ++i) + { + if (!MeleeCandidate(a, ctx, i)) continue; + + // Цена = дистанция + штраф за каждого своего, уже вцепившегося + // в эту мишень. Ближняя цель всё ещё выигрывает, но не любой ценой: + // вдвоём на одну — это оборванные взмахи друг об друга и ноль урона. + float cost = Distance(a.pos, targets[i].pos); + for (int k = 0; k < ctx.agentCount; ++k) + { + if (k == index) continue; + if (ctx.agents[k].IsMelee() && ctx.agents[k].melee.targetId == i) + cost += g_tune.meleeClaimPenalty; + } + if (cost >= bestCost) continue; + best = i; + bestCost = cost; + } + } + + m.targetId = best; + a.currentTargetId = best; + if (best < 0) return; + + a.laneEnd = targets[best].pos; + m.inReach = Distance(a.pos, targets[best].pos) <= m.reach + targets[best].radius; + m.arcBlockedByAlly = m.inReach && !MeleeArcClear(a, index, AngleOf(targets[best].pos - a.pos), ctx); +} + +Vec2 MeleeGoal(const Agent& a, const SolverContext& ctx, Vec2 fallbackSlot) +{ + const MeleeWeapon& m = a.melee; + if (m.targetId < 0) return fallbackSlot; + + const Target& t = (*ctx.targets)[m.targetId]; + + // Встаём вплотную, но не внутрь: reach считается от центра тела, поэтому + // с такой дистанции удар достаёт с запасом. + const float stand = t.radius + a.bodyRadius + g_tune.meleeGap; + const Vec2 away = Normalized(a.pos - t.pos, FromAngle(a.facing + PI_F)); + return t.pos + away * stand; +} + +bool MeleeArcClear(const Agent& a, int index, float axisAngle, const SolverContext& ctx) +{ + const MeleeWeapon& m = a.melee; + const float half = m.HalfArc(); + const float reach = m.reach + g_tune.meleeAllyMargin; + + // Взмах живёт windup + strike секунд, и всё это время союзник продолжает + // идти. Проверять только текущее положение — значит начинать удары, которые + // всё равно придётся обрывать. Это ровно та же поправка, что и + // AllyInterceptsShot для пули: правило не ослабляется, оно смотрит вперёд. + const float horizon = (m.windup + m.strike) * g_tune.meleeStartPredict; + + for (int i = 0; i < ctx.agentCount; ++i) + { + if (i == index) continue; + const Agent& ally = ctx.agents[i]; + + const Vec2 probe[2] = {ally.pos, ally.pos + ally.vel * horizon}; + for (const Vec2& q : probe) + { + const Vec2 d = q - a.pos; + const float dist = Length(d); + if (dist > reach + ally.bodyRadius) continue; + if (dist < 1e-4f) return false; // стоим в одной точке — бить нельзя + + const float pad = AngularHalfSize(dist, ally.bodyRadius + g_tune.meleeAllyMargin); + if (std::fabs(AngleDiff(axisAngle, AngleOf(d))) <= half + pad) return false; + } + } + return true; +} + +bool BladeSweepHits(Vec2 from, float angPrev, float angCur, float bladeHalf, float reach, + Vec2 p, float pRadius) +{ + const Vec2 d = p - from; + const float dist = Length(d); + if (dist > reach + pRadius) return false; + + // Тела перекрываются — попадает любой взмах, и это честно: цель обнимает + // рукоять. Случай редкий, отсечён отдельно, чтобы ниже не делить на ноль. + if (dist <= pRadius) return true; + + // Дальше — ТОЧНАЯ геометрия: лезвие это ОТРЕЗОК от бойца длиной reach, + // повернувшийся за шаг с angPrev на angCur. + // + // Раньше здесь стоял угловой допуск asin(r/dist), и он вырождался: на + // контактной дистанции (dist -> pRadius) asin даёт 90 градусов, «сектор» + // разрастался в полуплоскость, и боец рубил за спину. В фазе рывка он как + // раз проезжает вплотную — отсюда и брались удары «на 360 градусов». + // Отрезок такого не допускает: для цели позади ближайшая точка лезвия — + // рукоять, а до неё ровно dist, что больше pRadius. + const float ang = AngleOf(d); + const float sweep = AngleDiff(angPrev, angCur); // короткая дельта за шаг + const float rel = AngleDiff(angPrev, ang); // где цель относительно старта + + // Направление на цель попало в заметённую за шаг полосу — значит лезвие + // прошло через неё (дистанцию уже проверили сверху). + const float lo = std::min(0.0f, sweep) - bladeHalf; + const float hi = std::max(0.0f, sweep) + bladeHalf; + if (rel >= lo && rel <= hi) return true; + + // Иначе цель могла быть задета краем: проверяем оба крайних положения. + const float ends[2] = {angPrev, angCur}; + for (float a : ends) + if (DistancePointToSegment(p, from, from + FromAngle(a) * reach) <= pRadius) return true; + + return false; +} + +Vec2 MeleeStrikeEnd(const Agent& a, const SolverContext& ctx) +{ + const MeleeWeapon& m = a.melee; + // На замахе и ударе ось уже зафиксирована, до него — направление на цель. + float axis = m.dir; + if (!m.Committed()) + { + if (m.targetId < 0) return a.pos; + axis = AngleOf((*ctx.targets)[m.targetId].pos - a.pos); + } + return a.pos + FromAngle(axis) * m.reach; +} diff --git a/src/ai/melee.h b/src/ai/melee.h new file mode 100644 index 0000000..5af788d --- /dev/null +++ b/src/ai/melee.h @@ -0,0 +1,37 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Ближний бой: выбор цели, точка подхода, дисциплина сектора. +// +// Это ровно тот же контракт, что и у стрельбы (ai/firing_solver.h), только +// геометрия угловая, а не линейная: +// +// стрелок боец ближнего боя +// ---------------------------- -------------------------------------------- +// отрезок дуло -> цель сектор reach x arcDeg вокруг оси удара +// свой в отрезке -> не стрелять свой в секторе -> не бить +// решатель огневых позиций подход вплотную к цели +// cohesionRadius (свой круг) meleeCohesionRadius (СВОЙ, больший круг) +// +// Модуль ai/ по-прежнему не знает ни про рендер, ни про изометрию, ни про ввод. +// ----------------------------------------------------------------------------- +#include "ai/firing_solver.h" + +// Выбор цели ближнего боя. Заполняет melee.targetId / melee.inReach и +// currentTargetId (чтобы разворот ствола, оверлей и рендер работали как есть). +// hasLane у бойца всегда false: стрелять ему нечем. +void EvaluateMeleeTarget(Agent& a, int index, const SolverContext& ctx); + +// Куда идти бойцу. Есть цель — вплотную к ней, нет — обратно в слот строя. +Vec2 MeleeGoal(const Agent& a, const SolverContext& ctx, Vec2 fallbackSlot); + +// В секторе замаха нет своих. Аналог LaneClearFrom для клинка. +bool MeleeArcClear(const Agent& a, int index, float axisAngle, const SolverContext& ctx); + +// Прошло ли лезвие через круг (p, pRadius) за шаг, на котором его угол +// сместился с angPrev на angCur. bladeHalf — половина ширины самой полосы. +bool BladeSweepHits(Vec2 from, float angPrev, float angCur, float bladeHalf, float reach, + Vec2 p, float pRadius); + +// Конец отрезка, который боец резервирует в реестре линий (6.6): ось удара +// длиной reach. Свои расступаются с траектории клинка так же, как с линии огня. +Vec2 MeleeStrikeEnd(const Agent& a, const SolverContext& ctx); diff --git a/src/core/hash.h b/src/core/hash.h new file mode 100644 index 0000000..36726ae --- /dev/null +++ b/src/core/hash.h @@ -0,0 +1,36 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Чистые хеш-функции без состояния. Значение зависит ТОЛЬКО от аргументов. +// +// Это не генератор случайных чисел: общего состояния нет, «посеять» нечего, +// последовательность вызовов ни на что не влияет. Поэтому такой хеш можно +// звать и из симуляции, не ломая детерминизм: --headless по-прежнему выдаёт +// один и тот же прогон, а разброс выстрела воспроизводится по номеру выстрела +// и индексу стрелка (см. sim/loadout.h и docs/08-decisions.md). +// +// Рендер использует те же функции через render/noise.h. +// ----------------------------------------------------------------------------- +#include + +inline uint32_t HashU32(uint32_t x) +{ + x ^= x >> 16; + x *= 0x7FEB352Du; + x ^= x >> 15; + x *= 0x846CA68Bu; + x ^= x >> 16; + return x; +} + +inline uint32_t Hash2(uint32_t x, uint32_t y) { return HashU32(x * 0x27D4EB2Du ^ (y + 0x165667B1u)); } + +inline uint32_t Hash3(uint32_t x, uint32_t y, uint32_t z) +{ + return HashU32(Hash2(x, y) ^ (z * 0x9E3779B9u)); +} + +// [0, 1) +inline float Hash01(uint32_t h) { return float(h & 0x00FFFFFFu) * (1.0f / 16777216.0f); } + +// [-1, 1) +inline float HashSigned(uint32_t h) { return Hash01(h) * 2.0f - 1.0f; } diff --git a/src/core/input.h b/src/core/input.h new file mode 100644 index 0000000..681483a --- /dev/null +++ b/src/core/input.h @@ -0,0 +1,17 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Ввод, который влияет на симуляцию. Собирается в main.cpp из raylib, +// в headless-прогонах заполняется скриптом. Отладочные клавиши (F1..F4, тюнинг) +// сюда не попадают — они не влияют на симуляцию. +// ----------------------------------------------------------------------------- +#include "core/math.h" + +struct InputState +{ + Vec2 moveScreen{}; // WASD в ЭКРАННЫХ осях, -1..1 + bool sprint = false; // Shift — рывок + bool toggleAimMode = false; // Space (фронт нажатия) + float aimTurn = 0.0f; // стрелки влево/вправо, -1..1 + bool cycleTarget = false; // Tab (фронт нажатия) + int setFormation = -1; // 1/2/3 -> 0/1/2, иначе -1 +}; diff --git a/src/core/math.h b/src/core/math.h new file mode 100644 index 0000000..10417f9 --- /dev/null +++ b/src/core/math.h @@ -0,0 +1,107 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Базовая математика прототипа. Только декартов мир (top-down), никакой изометрии. +// Header-only: всё inline, никаких аллокаций. +// ----------------------------------------------------------------------------- +#include +#include + +constexpr float PI_F = 3.14159265358979323846f; +constexpr float TWO_PI_F = 6.28318530717958647692f; +constexpr float DEG2RAD_F = PI_F / 180.0f; + +struct Vec2 +{ + float x = 0.0f; + float y = 0.0f; +}; + +inline Vec2 operator+(Vec2 a, Vec2 b) { return {a.x + b.x, a.y + b.y}; } +inline Vec2 operator-(Vec2 a, Vec2 b) { return {a.x - b.x, a.y - b.y}; } +inline Vec2 operator*(Vec2 a, float s) { return {a.x * s, a.y * s}; } +inline Vec2 operator*(float s, Vec2 a) { return {a.x * s, a.y * s}; } +inline Vec2 operator/(Vec2 a, float s) { return {a.x / s, a.y / s}; } +inline Vec2 operator-(Vec2 a) { return {-a.x, -a.y}; } +inline Vec2& operator+=(Vec2& a, Vec2 b) { a.x += b.x; a.y += b.y; return a; } +inline Vec2& operator-=(Vec2& a, Vec2 b) { a.x -= b.x; a.y -= b.y; return a; } +inline Vec2& operator*=(Vec2& a, float s) { a.x *= s; a.y *= s; return a; } + +inline float Dot(Vec2 a, Vec2 b) { return a.x * b.x + a.y * b.y; } +inline float Cross(Vec2 a, Vec2 b) { return a.x * b.y - a.y * b.x; } +inline float LengthSq(Vec2 a) { return a.x * a.x + a.y * a.y; } +inline float Length(Vec2 a) { return std::sqrt(LengthSq(a)); } +inline float DistanceSq(Vec2 a, Vec2 b) { return LengthSq(b - a); } +inline float Distance(Vec2 a, Vec2 b) { return Length(b - a); } + +// Перпендикуляр (поворот на +90°). +inline Vec2 Perp(Vec2 a) { return {-a.y, a.x}; } + +inline Vec2 Normalized(Vec2 a, Vec2 fallback = {0.0f, 0.0f}) +{ + const float len = Length(a); + return (len > 1e-6f) ? Vec2{a.x / len, a.y / len} : fallback; +} + +// Ограничить длину вектора сверху. +inline Vec2 ClampLength(Vec2 a, float maxLen) +{ + const float len = Length(a); + if (len > maxLen && len > 1e-6f) return a * (maxLen / len); + return a; +} + +inline float Clampf(float v, float lo, float hi) { return v < lo ? lo : (v > hi ? hi : v); } +inline float Lerpf(float a, float b, float t) { return a + (b - a) * t; } +inline Vec2 Lerp(Vec2 a, Vec2 b, float t) { return {Lerpf(a.x, b.x, t), Lerpf(a.y, b.y, t)}; } + +// --- углы ------------------------------------------------------------------- + +inline float AngleOf(Vec2 v) { return std::atan2(v.y, v.x); } +inline Vec2 FromAngle(float a) { return {std::cos(a), std::sin(a)}; } + +// Приводит угол к (-pi, pi]. +inline float WrapPi(float a) +{ + while (a > PI_F) a -= TWO_PI_F; + while (a <= -PI_F) a += TWO_PI_F; + return a; +} + +// Кратчайшая разница углов to-from в (-pi, pi]. +inline float AngleDiff(float from, float to) { return WrapPi(to - from); } + +inline float RotateToward(float cur, float target, float maxDelta) +{ + const float d = AngleDiff(cur, target); + if (std::fabs(d) <= maxDelta) return WrapPi(target); + return WrapPi(cur + (d > 0.0f ? maxDelta : -maxDelta)); +} + +// --- сегменты --------------------------------------------------------------- + +struct Segment +{ + Vec2 a; + Vec2 b; +}; + +// Ближайшая точка отрезка ab к p; outT (если нужен) — параметр вдоль отрезка [0..1]. +inline Vec2 ClosestPointOnSegment(Vec2 p, Vec2 a, Vec2 b, float* outT = nullptr) +{ + const Vec2 ab = b - a; + const float lenSq = LengthSq(ab); + float t = 0.0f; + if (lenSq > 1e-12f) t = Clampf(Dot(p - a, ab) / lenSq, 0.0f, 1.0f); + if (outT) *outT = t; + return a + ab * t; +} + +inline float DistancePointToSegment(Vec2 p, Vec2 a, Vec2 b, float* outT = nullptr) +{ + return Distance(p, ClosestPointOnSegment(p, a, b, outT)); +} + +inline float DistancePointToSegment(Vec2 p, const Segment& s, float* outT = nullptr) +{ + return DistancePointToSegment(p, s.a, s.b, outT); +} diff --git a/src/debug/harness.cpp b/src/debug/harness.cpp new file mode 100644 index 0000000..5f85b47 --- /dev/null +++ b/src/debug/harness.cpp @@ -0,0 +1,603 @@ +#include "debug/harness.h" + +#include +#include +#include + +#include "game.h" + +// Перевод экранных осей ввода в мировые — единственное место, +// где симуляционный слой касается изометрии (см. docs/02-architecture.md). +#include "render/iso.h" + +namespace +{ + +// Мини-форматтер для строк вердикта (raylib в этот модуль не тащим). +const char* Fmt(const char* fmt, ...) +{ + static char buf[4][256]; + static int slot = 0; + slot = (slot + 1) % 4; + + va_list args; + va_start(args, fmt); + vsnprintf(buf[slot], sizeof(buf[slot]), fmt, args); + va_end(args); + return buf[slot]; +} + +// --- маршрут для --headless --------------------------------------------------- +struct Waypoint +{ + float x, y; + float hold; // сколько стоять по прибытии, сек + int formation; // -1 = не менять +}; + +const Waypoint kRoute[] = { + {24.0f, 26.0f, 8.0f, 0}, // стоячий бой на арене у кучки из 5 + {31.0f, 20.0f, 6.0f, -1}, // вплотную к кучке + {31.0f, 16.5f, 0.0f, 1}, // ко входу в северный коридор (2 тайла) + {31.0f, 11.5f, 2.0f, -1}, // сквозь коридор + {24.5f, 7.5f, 8.0f, 0}, // бой в северной комнате + {31.0f, 11.5f, 0.0f, -1}, + {31.0f, 17.5f, 2.0f, -1}, // обратно на арену + {20.0f, 29.0f, 4.0f, 2}, + {16.0f, 31.0f, 0.0f, 1}, // ко входу в западный коридор + {11.0f, 31.0f, 2.0f, -1}, // сквозь него + { 8.5f, 38.5f, 8.0f, 0}, // бой в западной комнате + {11.0f, 31.0f, 0.0f, -1}, + {17.0f, 31.0f, 2.0f, -1}, + {24.0f, 26.0f, 6.0f, 0}, +}; +constexpr int kRouteCount = int(sizeof(kRoute) / sizeof(kRoute[0])); +constexpr float kArriveDist = 0.7f; +constexpr float kWaypointTimeout = 20.0f; + +// Мировое направление -> экранные оси: ровно то, что делает игрок клавишами. +Vec2 MoveInputToward(const Game& g, Vec2 goal) +{ + return Normalized(iso::WorldToScreen(Normalized(goal - g.squad.anchor))); +} + +// ----------------------------------------------------------------------------- +// Наблюдатель: собирает то, что нельзя увидеть в одном кадре. +// * сколько агент непрерывно торчит в чужой линии огня (критерий 11.4); +// * как часто меняется postPos (критерий 11.5 — «нет дёрганья»). +// ----------------------------------------------------------------------------- +struct Watcher +{ + float residence[NUM_AGENTS] = {}; // текущее время внутри чужой линии + float maxResidence = 0.0f; + + // «Дёрганье» = решатель перекоммитил postPos раньше, чем истёк commitTime. + // Коммит виден по скачку commitTimer вверх. Смена состояния отряда сбрасывает + // отсчёт: это новая обстановка, а не дрожание. + float prevCommitTimer[NUM_AGENTS] = {}; + float sinceCommit[NUM_AGENTS] = {}; + bool hadCommit[NUM_AGENTS] = {}; + float minCommitInterval = 1e9f; + int commits = 0; + int jitterViolations = 0; + AgentState prevState = AgentState::HOLDING; + + // Граница сценария. Накопленные максимумы и счётчики остаются (они про весь + // прогон), а вот «когда был прошлый коммит» — нет: следующий сценарий это + // другой Game с другим отрядом, и мерить между ними интервал бессмысленно. + // Без этого первый же коммит нового сценария выглядел дёрганьем. + void BeginScenario() + { + for (int i = 0; i < NUM_AGENTS; ++i) + { + hadCommit[i] = false; + sinceCommit[i] = 0.0f; + prevCommitTimer[i] = 0.0f; + residence[i] = 0.0f; + } + prevState = AgentState::HOLDING; + } + + void Observe(const Game& g, float dt) + { + const bool stateChanged = (g.squad.state != prevState); + prevState = g.squad.state; + + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = g.squad.agents[i]; + + // Только линии огня: 11.4 про них, сектор клинка резервируется + // заведомо шире опасной зоны (см. ai/lane_registry.h). + const bool inside = g.lanes.CountBlocked(i, a.pos, a.bodyRadius, true) > 0; + residence[i] = inside ? residence[i] + dt : 0.0f; + maxResidence = std::max(maxResidence, residence[i]); + + if (stateChanged) hadCommit[i] = false; + + sinceCommit[i] += dt; + if (a.commitTimer > prevCommitTimer[i] + 1e-4f) // произошёл коммит + { + ++commits; + if (hadCommit[i]) + { + minCommitInterval = std::min(minCommitInterval, sinceCommit[i]); + if (sinceCommit[i] < g_tune.commitTime - FIXED_DT) + { + ++jitterViolations; + std::printf(" JITTER #%d dt=%.3f state=%s melee=%d prio=%d lane=%d " + "post(%.2f,%.2f) t=%.2f\n", + i, double(sinceCommit[i]), + g.squad.state == AgentState::ADVANCING ? "ADV" : "HOLD", + int(a.IsMelee()), int(a.priorityLane), int(a.hasLane), + double(a.postPos.x), double(a.postPos.y), + double(g.simTime)); + } + } + hadCommit[i] = true; + sinceCommit[i] = 0.0f; + } + prevCommitTimer[i] = a.commitTimer; + } + } +}; + +int CountLanes(const Game& g) +{ + int n = 0; + for (int i = 0; i < NUM_AGENTS; ++i) + if (g.squad.agents[i].hasLane) ++n; + return n; +} + +void PrintVerdict(const char* name, bool pass, const char* detail) +{ + std::printf("[%s] %-52s %s\n", pass ? "PASS" : "FAIL", name, detail); +} + +} // namespace + +// ----------------------------------------------------------------------------- +// --headless: маршрут + метрики +// ----------------------------------------------------------------------------- +int RunHeadless(const HarnessOptions& opt) +{ + Game game; + game.enableSolver = opt.solver; + game.enableLaneAvoid = opt.laneAvoid; + game.squad.meleeCount = opt.meleeCount; // до Init: состав раздаётся там + game.squad.pistolCount = opt.pistolCount; + game.Init(); + + Watcher watch; + const int totalSteps = int(opt.seconds / FIXED_DT); + int wp = 0; + bool holding = false; + float phaseClock = 0.0f; + int lastFormation = -1; + double simSeconds = 0.0; + float nextReport = 10.0f; + float worstSettle = -1.0f; + float worstHoldUptime = 1e9f; + + std::printf("headless: %.0f s, solver=%d laneAvoid=%d melee=%d/%d\n", double(opt.seconds), + int(opt.solver), int(opt.laneAvoid), game.squad.meleeCount, NUM_AGENTS); + std::printf(" t friendly shots kills uptime%% settle lanes\n"); + + for (int step = 0; step < totalSteps; ++step) + { + const Waypoint& p = kRoute[wp]; + const float distToGoal = Distance(game.squad.anchor, {p.x, p.y}); + + InputState in; + if (!holding) in.moveScreen = MoveInputToward(game, {p.x, p.y}); + if (p.formation >= 0 && p.formation != lastFormation) + { + in.setFormation = p.formation; + lastFormation = p.formation; + } + game.in = in; + + const auto t0 = std::chrono::steady_clock::now(); + game.Step(FIXED_DT); + simSeconds += std::chrono::duration(std::chrono::steady_clock::now() - t0).count(); + watch.Observe(game, FIXED_DT); + + phaseClock += FIXED_DT; + if (!holding) + { + if (distToGoal < kArriveDist || phaseClock > kWaypointTimeout) + { + holding = true; + phaseClock = 0.0f; + } + } + else if (phaseClock >= p.hold) + { + if (p.hold >= 4.0f) + { + std::printf(" hold @ (%.0f,%.0f) %.0fs -> lanes %d/%d uptime %.1f%% settle %.2f\n", + double(p.x), double(p.y), double(p.hold), CountLanes(game), NUM_AGENTS, + double(game.metrics.uptimeAvg), double(game.metrics.lastSettle)); + worstHoldUptime = std::min(worstHoldUptime, game.metrics.uptimeAvg); + + if (opt.probe) + { + const SolverContext ctx = game.MakeContext(); + std::printf(" живых мишеней %d/%d\n", CountAliveTargets(game.targets), + NUM_TARGETS); + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = game.squad.agents[i]; + const int nearest = NearestAliveTarget(a.pos, ctx, 1e9f); + const float d = + (nearest >= 0) ? Distance(a.pos, game.targets[nearest].pos) : -1.0f; + std::printf(" #%d pos(%.1f,%.1f) lane=%d t=%d ally=%d wall=%d " + "nearest=%.1f post(%.1f,%.1f) uptime=%.0f%%\n", + i, double(a.pos.x), double(a.pos.y), int(a.hasLane), + a.currentTargetId, int(a.targetBlockedByAlly), + int(a.targetBlockedByWall), double(d), double(a.postPos.x), + double(a.postPos.y), double(game.metrics.uptimePct[i])); + } + } + } + holding = false; + phaseClock = 0.0f; + wp = (wp + 1) % kRouteCount; + } + + worstSettle = std::max(worstSettle, game.metrics.lastSettle); + + if (game.simTime >= nextReport) + { + nextReport += 10.0f; + std::printf("%6.1f %8d %6d %6d %7.1f %6.2f %d/%d\n", double(game.simTime), + game.metrics.friendlyHits, game.metrics.shotsFired, + game.metrics.targetsKilled, double(game.metrics.uptimeAvg), + double(game.metrics.lastSettle), CountLanes(game), NUM_AGENTS); + } + } + + const double avgUs = (totalSteps > 0) ? (simSeconds * 1e6 / totalSteps) : 0.0; + std::printf("---\nFRIENDLY_HITS = %d\nshots = %d kills = %d\n", game.metrics.friendlyHits, + game.metrics.shotsFired, game.metrics.targetsKilled); + std::printf("FIRE UPTIME avg = %.1f%% (по агентам:", double(game.metrics.uptimeAvg)); + for (int i = 0; i < NUM_AGENTS; ++i) std::printf(" %.0f", double(game.metrics.uptimePct[i])); + std::printf(")\nхудший uptime на стоянке = %.1f%%\n", double(worstHoldUptime)); + std::printf("SETTLE last = %.2f s, worst = %.2f s\n", double(game.metrics.lastSettle), + double(worstSettle)); + if (game.squad.meleeCount > 0) + std::printf("MELEE: в зоне удара %.1f%% времени, взмахов %d, попаданий %d, оборвано %d\n", + double(game.metrics.meleeUptimeAvg), game.metrics.meleeSwings, + game.metrics.meleeHits, game.metrics.meleeAborts); + std::printf("макс. время в чужой линии = %.2f s, дёрганий postPos = %d\n", + double(watch.maxResidence), watch.jitterViolations); + std::printf("шаг симуляции в среднем = %.1f us (бюджет кадра 16666 us)\n", avgUs); + + for (int i = 0; i < game.metrics.hitLogCount; ++i) + { + const FriendlyHitEvent& e = game.metrics.hitLog[i]; + std::printf(" friendly hit t=%.2f #%d -> #%d @ (%.1f,%.1f), жертва %s\n", double(e.time), + e.shooter, e.victim, double(e.pos.x), double(e.pos.y), + e.victimAdvancing ? "ADVANCING" : "HOLDING"); + } + return game.metrics.friendlyHits == 0 ? 0 : 1; +} + +// ----------------------------------------------------------------------------- +// --accept: сценарии из раздела 11 +// ----------------------------------------------------------------------------- +int RunAccept() +{ + bool allPass = true; + Watcher watch; // общий: коммиты postPos по всем сценариям + Watcher arenaWatch; // открытая арена: там и меряется критерий 11.4 + + // Критерии 11.1 / 11.6 / 11.7 / 11.8 описывают ПРАВИЛА СТРЕЛЬБЫ и меряются + // на отряде из пяти стрелков — так же, как их формулировал спек. Клинок + // проверяется отдельно (блок M7 ниже) и в трёхминутном прогоне 11.2, где + // состав отряда обычный, боевой. + const int kSpecSquadMelee = 0; + const int kSpecSquadPistol = 0; + + // === 11.1 + 11.8: отряд в куче на открытой арене, игрок останавливается ==== + { + Game game; + game.squad.meleeCount = kSpecSquadMelee; + game.squad.pistolCount = kSpecSquadPistol; + game.Init(); + watch.BeginScenario(); // интервалы коммитов меряются внутри сценария + game.PlaceSquad({28.0f, 23.5f}, true); // кучка из 5 мишеней в радиусе + + // 0.4 с движения, чтобы отряд был в ADVANCING, потом игрок отпускает клавиши + for (int i = 0; i < int(0.4f / FIXED_DT); ++i) + { + game.in = InputState{}; + game.in.moveScreen = {0.0f, 1.0f}; + game.Step(FIXED_DT); + } + + float clock = 0.0f; + float settle4 = -1.0f; + for (int i = 0; i < int(25.0f / FIXED_DT); ++i) + { + game.in = InputState{}; + game.Step(FIXED_DT); + watch.Observe(game, FIXED_DT); + arenaWatch.Observe(game, FIXED_DT); + clock += FIXED_DT; + if (settle4 < 0.0f && CountLanes(game) >= 4) settle4 = clock; + } + + const bool p1 = (settle4 >= 0.0f && settle4 <= 1.5f); + const bool p8 = (game.metrics.uptimeAvg >= 80.0f); + allPass = allPass && p1 && p8; + PrintVerdict("11.1 >=4/5 линий за <=1.5 с после остановки", p1, + Fmt("settle=%.2f с, линий сейчас %d/5", double(settle4), + CountLanes(game))); + PrintVerdict("11.8 FIRE UPTIME в стоячем бою >= 80%", p8, + Fmt("uptime=%.1f%%", double(game.metrics.uptimeAvg))); + } + + // === 11.6: узкий проход в 2 тайла ========================================= + // Коридор: стена y=13..15, проём x=30..31 -> движение вдоль -y, поперёк = x. + { + Game game; + game.squad.meleeCount = kSpecSquadMelee; + game.squad.pistolCount = kSpecSquadPistol; + game.Init(); + watch.BeginScenario(); // интервалы коммитов меряются внутри сценария + game.PlaceSquad({31.0f, 19.0f}, false); + Watcher corridorWatch; + + double lateralSum = 0.0; // усреднённый разброс поперёк/вдоль движения + double longitudinalSum = 0.0; + int maxInside = 0; + // Считаются только выстрелы ВПЕРЁД, по ходу движения: именно там между + // стрелком и целью может оказаться свой. Выстрел назад, в оставленную + // позади комнату, к правилу «не стрелять сквозь своего» отношения не + // имеет — впереди по такой линии никого из отряда нет по построению. + int rearShotsInside = 0; // вперёд стреляет НЕ передний — вот это важно + int frontShotsInside = 0; + int backwardShots = 0; // для отчёта: сколько огня ушло назад + int throughAllyShots = 0; // выстрелов, прошедших через тело союзника + int samples = 0; + + // Две фазы: сначала входим в проход, потом ВСТАЁМ и меряем. + // + // Мерить на ходу нельзя: пока игрок тянет курсор, тот всегда обгоняет + // отряд (anchorSpeed 3.3 против moveSpeed 1.75), натяжение поводка + // упирается в упор и включается спринт, а в спринте отряд по замыслу не + // стреляет вовсе (Game::FireWeapons). Критерий 11.6 проверял бы пустоту. + // Боевая ситуация в проходе — это именно «вошли и работаем»: тогда + // передний держит линию, а задние упираются в его спину. + // Меряем ВСЮ проводку через горловину, а не только стоянку в ней. + // Проход глубиной три тайла, а бойцов пятеро — колонна физически длиннее + // самого прохода и целиком внутрь него не помещается никогда. Поэтому + // область замера это горловина ПЛЮС подходы с обеих сторон: именно на + // этом отрезке видно, вытянулся отряд в нитку или пошёл шеренгой. + // + // Порог входа в шеренгу узкий по построению: сам проём шириной два тайла. + const int totalSteps = int(26.0f / FIXED_DT); + const int advanceSteps = int(16.0f / FIXED_DT); + + for (int i = 0; i < totalSteps; ++i) + { + game.in = InputState{}; + // Ведём отряд сквозь проход и оставляем работать по северной кучке. + if (i < advanceSteps) game.in.moveScreen = MoveInputToward(game, {31.0f, 9.0f}); + game.Step(FIXED_DT); + watch.Observe(game, FIXED_DT); + corridorWatch.Observe(game, FIXED_DT); + + // Кто сейчас в створе прохода (горловина + подходы). + int inside[NUM_AGENTS]; + int insideCount = 0; + for (int k = 0; k < NUM_AGENTS; ++k) + { + const Vec2 p = game.squad.agents[k].pos; + if (p.y > 9.0f && p.y < 19.0f && p.x > 28.0f && p.x < 34.0f) + inside[insideCount++] = k; + } + if (insideCount < 2) continue; + + ++samples; + maxInside = std::max(maxInside, insideCount); + + float xMin = 1e9f, xMax = -1e9f, yMin = 1e9f, yMax = -1e9f; + float frontY = 1e9f; + for (int n = 0; n < insideCount; ++n) + { + const Vec2 p = game.squad.agents[inside[n]].pos; + xMin = std::min(xMin, p.x); xMax = std::max(xMax, p.x); + yMin = std::min(yMin, p.y); yMax = std::max(yMax, p.y); + frontY = std::min(frontY, p.y); + } + // Колонна = вытянуты вдоль движения сильнее, чем поперёк. + lateralSum += double(xMax - xMin); + longitudinalSum += double(yMax - yMin); + + for (int n = 0; n < insideCount; ++n) + { + const Agent& a = game.squad.agents[inside[n]]; + if (!a.fired) continue; + const Vec2 tp = (a.currentTargetId >= 0) ? game.targets[a.currentTargetId].pos : Vec2{}; + + // НАСТОЯЩАЯ проверка правила, независимая от реализации: берём + // отрезок реально сделанного выстрела и заново, своей геометрией, + // смотрим, не задевает ли он тело союзника. Порог физический + // (тело + полуширина трассы), без запаса safetyMargin: выстрел + // впритирку, но мимо тела, правило не нарушает. + const Vec2 muzzle = a.MuzzleTowards(tp); + for (int k = 0; k < NUM_AGENTS; ++k) + { + if (k == inside[n]) continue; + const Agent& ally = game.squad.agents[k]; + if (DistancePointToSegment(ally.pos, muzzle, tp) < + ally.bodyRadius + g_tune.laneHalfWidth) + ++throughAllyShots; + } + + // Разбивка ниже — только для отчёта. Задний, стреляющий ПОД УГЛОМ + // мимо переднего, ничего не нарушает: проход шириной 2 тайла даёт + // законные диагональные линии, и это подтверждается проверкой выше. + const bool forward = Dot(tp - a.pos, game.squad.forward) > 0.0f; + const bool rear = a.pos.y > frontY + 0.5f; + if (!forward) { ++backwardShots; continue; } + if (rear) ++rearShotsInside; + else ++frontShotsInside; + } + } + + const double lateralAvg = (samples > 0) ? lateralSum / samples : 0.0; + const double longAvg = (samples > 0) ? longitudinalSum / samples : 0.0; + + // Что здесь проверяется на самом деле. + // + // «Задние не стреляют» — это СЛЕДСТВИЕ правила «не стрелять сквозь + // своего», а не отдельное правило. В проходе шириной 2 тайла у заднего + // бойца есть законные диагональные линии мимо переднего, и считать их + // нарушением — значит требовать от отряда быть глупее, чем он есть. + // Поэтому считаем не «кто стрелял», а инвариант: НИ ОДИН выстрел в + // проходе не прошёл через тело союзника (перепроверено своей геометрией + // по факту выстрела) и ни одного попадания по своим. + // + // Плюс форма: отряд обязан вытянуться в колонну, а не идти шеренгой. + // Пороги с запасом: строгое неравенство на маленьких числах — монетка, + // а не тест. + const bool column = longAvg > lateralAvg * 1.5; + const bool clean = (throughAllyShots == 0) && (game.metrics.friendlyHits == 0); + const bool enough = (frontShotsInside + rearShotsInside) >= 4; + const bool p6 = (samples > 0) && (maxInside >= 2) && column && clean && enough; + allPass = allPass && p6; + PrintVerdict("11.6 в проходе колонна, огонь не идёт сквозь своих", p6, + Fmt("до %d агентов в проходе, поперёк %.2f / вдоль %.2f тайла, " + "выстрелов вперёд передний/хвост %d/%d (назад %d), " + "сквозь своего %d, FRIENDLY_HITS=%d", + maxInside, lateralAvg, longAvg, frontShotsInside, rearShotsInside, + backwardShots, throughAllyShots, game.metrics.friendlyHits)); + } + + // === 11.7: ручной режим, назначенная цель ================================= + { + Game game; + game.squad.meleeCount = kSpecSquadMelee; + game.squad.pistolCount = kSpecSquadPistol; + game.Init(); + watch.BeginScenario(); // интервалы коммитов меряются внутри сценария + game.PlaceSquad({28.0f, 23.5f}, true); + + // Включаем ручной режим и наводим вектор прицела на кучку. + InputState toggle; + toggle.toggleAimMode = true; + game.in = toggle; + game.Step(FIXED_DT); + + int stepsWithAssigned = 0; + for (int i = 0; i < int(30.0f / FIXED_DT); ++i) + { + game.in = InputState{}; + // Медленно крутим прицел — Tab каждые 5 секунд. + game.in.aimTurn = (i < int(3.0f / FIXED_DT)) ? 1.0f : 0.0f; + game.in.cycleTarget = (i % int(5.0f / FIXED_DT)) == 0; + game.Step(FIXED_DT); + watch.Observe(game, FIXED_DT); + if (game.aim.assignedTargetId >= 0) ++stepsWithAssigned; + } + + const bool p7 = (game.metrics.friendlyHits == 0) && (stepsWithAssigned > 0); + allPass = allPass && p7; + PrintVerdict("11.7 ручной режим не стреляет сквозь своих", p7, + Fmt("FRIENDLY_HITS=%d, назначенная цель была %.0f%% времени", + game.metrics.friendlyHits, + 100.0 * double(stepsWithAssigned) / (30.0 / FIXED_DT))); + } + + // === M7: ближний бой ====================================================== + // Смешанный отряд у кучки из пяти мишеней. Проверяется ровно то, что + // требовалось от механики: клинок доходит и бьёт, никого из своих при этом + // не задевает, и каждый класс живёт в СВОЁМ круге вокруг диска. + { + Game game; + game.Init(); // состав по умолчанию: 2 клинка + watch.BeginScenario(); // интервалы коммитов меряются внутри сценария + game.PlaceSquad({28.0f, 23.5f}, true); + + float maxMeleeFromAnchor = 0.0f; + float maxRangedFromAnchor = 0.0f; + + for (int i = 0; i < int(30.0f / FIXED_DT); ++i) + { + game.in = InputState{}; + game.Step(FIXED_DT); + watch.Observe(game, FIXED_DT); + + for (int k = 0; k < NUM_AGENTS; ++k) + { + const Agent& a = game.squad.agents[k]; + const float d = Distance(a.pos, game.squad.anchor); + if (a.IsMelee()) maxMeleeFromAnchor = std::max(maxMeleeFromAnchor, d); + else maxRangedFromAnchor = std::max(maxRangedFromAnchor, d); + } + } + + const Metrics& m = game.metrics; + // Порог круга с запасом на инерцию: цель может быть у самой границы, + // и боец имеет право дотянуться до неё, а не тормозить по линейке. + const float meleeLimit = g_tune.meleeCohesionRadius + 1.2f; + const float rangedLimit = g_tune.cohesionRadius + 1.6f; + + const bool pM1 = (m.meleeHits > 0) && (m.meleeSwings > 0); + const bool pM2 = (m.friendlyHits == 0); + const bool pM3 = (maxMeleeFromAnchor <= meleeLimit) && + (maxRangedFromAnchor <= rangedLimit) && + (maxRangedFromAnchor < maxMeleeFromAnchor); + allPass = allPass && pM1 && pM2 && pM3; + + PrintVerdict("M7.1 клинок доходит до цели и наносит урон", pM1, + Fmt("взмахов %d, попаданий %d, оборвано своими %d, убито %d; " + "связка %s=%d %s=%d %s=%d", + m.meleeSwings, m.meleeHits, m.meleeAborts, m.targetsKilled, + MELEE_COMBO[0].name, m.meleeComboSwings[0], MELEE_COMBO[1].name, + m.meleeComboSwings[1], MELEE_COMBO[2].name, m.meleeComboSwings[2])); + const bool pM4 = m.meleeMaxHitExcessDeg <= 12.0f; + allPass = allPass && pM4; + PrintVerdict("M7.4 лезвие не достаёт за пределы своей дуги", pM4, + Fmt("максимум за сектором %.1f град (лимит 12)", + double(m.meleeMaxHitExcessDeg))); + PrintVerdict("M7.2 ближний бой не задевает своих", pM2, + Fmt("FRIENDLY_HITS=%d при %d взмахах", m.friendlyHits, m.meleeSwings)); + PrintVerdict("M7.3 у каждого класса свой круг вокруг диска", pM3, + Fmt("стрелки до %.2f (лимит %.2f), клинки до %.2f (лимит %.2f)", + double(maxRangedFromAnchor), double(rangedLimit), + double(maxMeleeFromAnchor), double(meleeLimit))); + } + + // === 11.2: три минуты непрерывного боя во всех режимах ===================== + { + HarnessOptions opt; + opt.seconds = 180.0f; // состав боевой: смешанный отряд, как в игре + std::printf("--- прогон 180 с по маршруту (критерий 11.2) ---\n"); + const int rc = RunHeadless(opt); + const bool p2 = (rc == 0); + allPass = allPass && p2; + PrintVerdict("11.2 FRIENDLY_HITS = 0 за 3 минуты", p2, p2 ? "0 попаданий" : "см. журнал"); + } + + // === 11.4 + 11.5 ========================================================== + // 11.4 меряется на открытой арене: в проходе 2 тайла разойтись физически + // некуда, и это ровно тот геометрический тест-кейс, о котором говорит спек. + const bool p4 = arenaWatch.maxResidence <= 0.4f; + const bool p5 = watch.jitterViolations == 0; + allPass = allPass && p4 && p5; + PrintVerdict("11.4 агент уходит с чужой линии за ~0.3 с", p4, + Fmt("на арене максимум %.2f с (по всем сценариям %.2f с)", + double(arenaWatch.maxResidence), double(watch.maxResidence))); + PrintVerdict("11.5 нет дёрганья postPos чаще commitTime", p5, + Fmt("коммитов %d, нарушений %d, минимальный интервал %.2f с", watch.commits, + watch.jitterViolations, + double(watch.minCommitInterval > 1e8f ? 0.0f : watch.minCommitInterval))); + + std::printf("\nИТОГ: %s\n", allPass ? "все проверяемые критерии PASS" : "есть FAIL"); + return allPass ? 0 : 1; +} diff --git a/src/debug/harness.h b/src/debug/harness.h new file mode 100644 index 0000000..b49a06c --- /dev/null +++ b/src/debug/harness.h @@ -0,0 +1,26 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Прогоны симуляции без окна. Симуляция детерминирована и ничего не знает про +// рендер, поэтому критерии приёмки (спек 11) можно мерить численно, а не на глаз. +// +// --headless <сек> маршрут по путевым точкам + метрики +// --accept сценарии из раздела 11 с вердиктом PASS/FAIL +// ----------------------------------------------------------------------------- +#include "tuning.h" + +struct HarnessOptions +{ + float seconds = 60.0f; + bool solver = true; // --no-solver + bool laneAvoid = true; // --no-laneavoid + bool probe = false; // --probe: подробности по агентам на стоянках + // --melee N: сколько слотов держат клинок. Критерии стрельбы из спека 11 + // меряются на чистом отряде стрелков — иначе меняется смысл самих метрик. + int meleeCount = DEFAULT_MELEE_COUNT; + // --pistol N: сколько ПОСЛЕДНИХ слотов носят пистолет вместо карабина. + // В сценариях спека тоже 0: дальность и разброс там должны быть штатными. + int pistolCount = DEFAULT_PISTOL_COUNT; +}; + +int RunHeadless(const HarnessOptions& opt); +int RunAccept(); diff --git a/src/debug/metrics.cpp b/src/debug/metrics.cpp new file mode 100644 index 0000000..284166b --- /dev/null +++ b/src/debug/metrics.cpp @@ -0,0 +1,103 @@ +#include "debug/metrics.h" + +void Metrics::LogFriendlyHit(int shooter, int victim, Vec2 pos, bool victimAdvancing) +{ + ++friendlyHits; + if (hitLogCount < HIT_LOG_MAX) + hitLog[hitLogCount++] = FriendlyHitEvent{clock, shooter, victim, pos, victimAdvancing}; +} + +void Metrics::Reset() +{ + friendlyHits = 0; + hitLogCount = 0; + clock = 0.0f; + targetsKilled = 0; + shotsFired = 0; + meleeSwings = 0; + meleeHits = 0; + meleeAborts = 0; + for (int& v : meleeComboSwings) v = 0; + meleeMaxHitExcessDeg = 0.0f; + reloads = 0; + + for (int i = 0; i < NUM_AGENTS; ++i) + { + laneCount[i] = 0; + uptimePct[i] = 0.0f; + for (int k = 0; k < UPTIME_SAMPLES; ++k) ring[i][k] = 0; + } + ringPos = 0; + ringFill = 0; + uptimeAvg = 0.0f; + meleeUptimeAvg = 0.0f; + + settleArmed = true; // старт — отряд уже стоит, замеряем первое расхождение + settleClock = 0.0f; + lastSettle = -1.0f; + prevState = AgentState::HOLDING; + simMs = 0.0f; + renderMs = 0.0f; +} + +void Metrics::Sample(const Squad& squad, float dt) +{ + clock += dt; + + // --- FIRE UPTIME (скользящее окно) --- + const int window = std::min(UPTIME_SAMPLES, + std::max(1, int(g_tune.uptimeWindow / FIXED_DT))); + if (ringPos >= window) ringPos = 0; + + // «В бою» для стрелка — валидная линия огня, для клинка — цель в зоне удара. + // Считаются они одинаково, а усредняются раздельно: смешивать доли времени + // двух разных занятий в одно число бессмысленно. + int readyNow = 0; + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + const bool engaged = a.IsMelee() ? a.melee.inReach : a.hasLane; + const unsigned char v = engaged ? 1u : 0u; + + laneCount[i] -= ring[i][ringPos]; + ring[i][ringPos] = v; + laneCount[i] += v; + + // Для SETTLE TIME клинку достаточно ИМЕТЬ цель: он к ней ещё идёт, + // но отряд уже разобрал обстановку, а именно это метрика и меряет. + if (a.IsMelee() ? (a.melee.targetId >= 0) : a.hasLane) ++readyNow; + } + ringPos = (ringPos + 1) % window; + ringFill = std::min(ringFill + 1, window); + + float rangedSum = 0.0f; + float meleeSum = 0.0f; + for (int i = 0; i < NUM_AGENTS; ++i) + { + uptimePct[i] = (ringFill > 0) ? (100.0f * float(laneCount[i]) / float(ringFill)) : 0.0f; + if (squad.agents[i].IsMelee()) meleeSum += uptimePct[i]; + else rangedSum += uptimePct[i]; + } + const int ranged = squad.RangedCount(); + uptimeAvg = (ranged > 0) ? rangedSum / float(ranged) : 0.0f; + meleeUptimeAvg = (squad.meleeCount > 0) ? meleeSum / float(squad.meleeCount) : 0.0f; + + // --- SETTLE TIME --- + if (squad.state == AgentState::HOLDING && prevState == AgentState::ADVANCING) + { + settleArmed = true; + settleClock = 0.0f; + } + if (squad.state == AgentState::ADVANCING) settleArmed = false; + + if (settleArmed) + { + settleClock += dt; + if (float(readyNow) >= g_tune.settleQuorum) + { + lastSettle = settleClock; + settleArmed = false; + } + } + prevState = squad.state; +} diff --git a/src/debug/metrics.h b/src/debug/metrics.h new file mode 100644 index 0000000..34109a7 --- /dev/null +++ b/src/debug/metrics.h @@ -0,0 +1,78 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Метрики корректности (спек 7): +// FRIENDLY_HITS — накопительный счётчик попаданий по своим (главная метрика); +// FIRE UPTIME — доля времени с валидной линией за последние 10 сек; +// SETTLE TIME — от перехода в HOLDING до момента, когда >=4 агента в бою. +// +// С появлением ближнего боя два уточнения, иначе цифры врут: +// * FIRE UPTIME усредняется ТОЛЬКО по стрелкам. У бойца с клинком линии огня +// не бывает по определению, и его ноль занижал бы метрику стрельбы; +// * «в бою» (для SETTLE TIME) = стрелок при линии ИЛИ клинок при цели. +// Отдельно считается MELEE UPTIME — доля времени в зоне удара. +// ----------------------------------------------------------------------------- +#include "sim/squad.h" + +constexpr int UPTIME_SAMPLES = 600; // 10 сек при 60 Гц + +// Журнал попаданий по своим: без него FRIENDLY_HITS != 0 нечем объяснить. +struct FriendlyHitEvent +{ + float time = 0.0f; + int shooter = -1; + int victim = -1; + Vec2 pos{}; + bool victimAdvancing = false; +}; + +constexpr int HIT_LOG_MAX = 16; + +struct Metrics +{ + int friendlyHits = 0; + int targetsKilled = 0; + int shotsFired = 0; + + // ближний бой + int meleeSwings = 0; // взмахов начато + int meleeHits = 0; // попаданий лезвием + int meleeAborts = 0; // взмахов оборвано из-за своего в дуге + // Сколько взмахов пришлось на каждый удар связки. Если серия не + // прокручивается, здесь будет ноль во всех ячейках кроме первой. + int meleeComboSwings[MELEE_COMBO_STEPS] = {}; + // На сколько градусов попадание лезвия вышло за РАЗРЕШЁННЫЙ сектор этого + // взмаха (полусектор + полуширина полосы). Должно быть ~0: если лезвие + // достаёт за спину, здесь вырастет десятки градусов. Ровно этим и выглядел + // баг «бьёт на 360». + float meleeMaxHitExcessDeg = 0.0f; + int reloads = 0; // сколько раз стрелки уходили в перезарядку + + FriendlyHitEvent hitLog[HIT_LOG_MAX]; + int hitLogCount = 0; + float clock = 0.0f; // время симуляции, для журнала + + void LogFriendlyHit(int shooter, int victim, Vec2 pos, bool victimAdvancing); + + // FIRE UPTIME: кольцевой буфер + инкрементальные счётчики + unsigned char ring[NUM_AGENTS][UPTIME_SAMPLES] = {}; + int ringPos = 0; + int ringFill = 0; + int laneCount[NUM_AGENTS] = {}; + float uptimePct[NUM_AGENTS] = {}; + float uptimeAvg = 0.0f; // только по стрелкам + float meleeUptimeAvg = 0.0f; // только по клинкам: доля времени в зоне удара + + // SETTLE TIME + bool settleArmed = false; + float settleClock = 0.0f; + float lastSettle = -1.0f; + + // производительность (заполняется главным циклом) + float simMs = 0.0f; + float renderMs = 0.0f; + + AgentState prevState = AgentState::HOLDING; + + void Reset(); + void Sample(const Squad& squad, float dt); +}; diff --git a/src/debug/overlay.cpp b/src/debug/overlay.cpp new file mode 100644 index 0000000..abfb341 --- /dev/null +++ b/src/debug/overlay.cpp @@ -0,0 +1,307 @@ +#include "debug/overlay.h" + +#include + +#include "game.h" +#include "render/view.h" + +namespace +{ + +// Мир -> координаты окна (кадр уже растянут в WINDOW_SCALE раз). +inline Vector2 ToWindow(const View& v, Vec2 world) +{ + const Vec2 s = iso::WorldToScreen(world); + return Vector2{(s.x + float(v.scene.ox)) * float(WINDOW_SCALE), + (s.y + float(v.scene.oy)) * float(WINDOW_SCALE)}; +} + +void Ring(const View& g, Vec2 center, float radiusWorld, Color c, int segments = 48) +{ + Vector2 prev{}; + for (int i = 0; i <= segments; ++i) + { + const float a = float(i) * (TWO_PI_F / float(segments)); + const Vector2 p = ToWindow(g, center + FromAngle(a) * radiusWorld); + if (i > 0) DrawLineV(prev, p, c); + prev = p; + } +} + +const char* StateName(AgentState s) +{ + return (s == AgentState::ADVANCING) ? "ADVANCING" : "HOLDING"; +} + +const char* MeleePhase(MeleeState s) +{ + switch (s) + { + case MeleeState::WINDUP: return "wind"; + case MeleeState::STRIKE: return "HIT"; + case MeleeState::RECOVER: return "rec"; + default: return "-"; + } +} + +Color ScaleAlpha(Color c, float k) +{ + c.a = (unsigned char)Clampf(float(c.a) * k, 0.0f, 255.0f); + return c; +} + +} // namespace + +void Overlay::HandleKeys() +{ + if (IsKeyPressed(KEY_F1)) show = !show; + if (IsKeyPressed(KEY_F2)) showLanes = !showLanes; + if (IsKeyPressed(KEY_F3)) showCandidates = !showCandidates; + if (IsKeyPressed(KEY_F4)) showMetrics = !showMetrics; + + if (IsKeyPressed(KEY_LEFT_BRACKET)) tuneIndex = (tuneIndex + TUNABLE_COUNT - 1) % TUNABLE_COUNT; + if (IsKeyPressed(KEY_RIGHT_BRACKET)) tuneIndex = (tuneIndex + 1) % TUNABLE_COUNT; + + const TunableParam& p = TUNABLES[tuneIndex]; + float& value = g_tune.*(p.member); + if (IsKeyPressed(KEY_MINUS) || IsKeyPressedRepeat(KEY_MINUS)) + value = Clampf(value - p.step, p.minV, p.maxV); + if (IsKeyPressed(KEY_EQUAL) || IsKeyPressedRepeat(KEY_EQUAL)) + value = Clampf(value + p.step, p.minV, p.maxV); +} + +void Overlay::Draw(const Game& game, const View& view) const +{ + if (!show) return; + + const Squad& squad = game.squad; + + // --- якорь, круги когезии, слоты строя --- + Ring(view, squad.anchor, g_tune.cohesionRadius, Color{60, 90, 120, 160}); + // Свой, больший круг бойцов ближнего боя — их отпускают дальше. + if (squad.meleeCount > 0) + Ring(view, squad.anchor, g_tune.meleeCohesionRadius, Color{150, 100, 60, 110}); + // Поводок курсора, обе границы упругой модели: сплошной круг — мягкая + // граница (дальше курсор тяжелеет), тусклый внешний — жёсткий предел. + // По зазору между ними видно натяжение, то есть скоро ли отряд побежит. + Ring(view, squad.Centroid(), g_tune.anchorLeash, + squad.sprinting ? Color{255, 160, 70, 130} : Color{70, 110, 150, 110}); + Ring(view, squad.Centroid(), std::max(g_tune.anchorLeash + 0.2f, g_tune.anchorLeashMax), + Color{90, 70, 110, 70}); + DrawCircleV(ToWindow(view, squad.anchor), 4.0f, + squad.sprinting ? Color{255, 190, 120, 230} : Color{120, 200, 255, 220}); + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Vector2 p = ToWindow(view, squad.SlotWorld(i)); + DrawCircleLinesV(p, 5.0f, Color{80, 120, 160, 140}); + } + + // --- сектор ближнего боя --- + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + if (!a.IsMelee()) continue; + + const MeleeWeapon& m = a.melee; + Color c; + switch (m.state) + { + case MeleeState::WINDUP: c = Color{255, 200, 80, 220}; break; // замах + case MeleeState::STRIKE: c = Color{255, 255, 255, 240}; break; // удар + case MeleeState::RECOVER: c = Color{120, 120, 140, 160}; break; + default: + // В покое цвет говорит, почему не бьём: жёлтый — свой в дуге. + c = m.arcBlockedByAlly ? Color{240, 210, 60, 180} + : Color{90, 150, 200, 110}; + break; + } + + Ring(view, a.pos, m.reach, ScaleAlpha(c, 0.55f), 24); + + const float axis = m.Committed() ? m.dir : a.facing; + const float half = m.HalfArc(); + for (int s = -1; s <= 1; s += 2) + { + const Vec2 e = a.pos + FromAngle(axis + half * float(s)) * m.reach; + DrawLineV(ToWindow(view, a.pos), ToWindow(view, e), c); + } + if (m.state == MeleeState::STRIKE) + { + const Vec2 blade = a.pos + FromAngle(m.BladeAngleAt(m.Progress())) * m.reach; + DrawLineEx(ToWindow(view, a.pos), ToWindow(view, blade), 2.0f, c); + } + } + + // --- линии огня (F2) --- + if (showLanes) + { + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + if (a.currentTargetId < 0 && !a.targetBlockedByAlly && !a.targetBlockedByWall) continue; + + Color c; + if (a.hasLane) c = Color{60, 230, 90, 220}; // чистая, стреляет + else if (a.targetBlockedByWall) c = Color{230, 70, 60, 200}; // перекрыта стеной + else c = Color{240, 210, 60, 200}; // перекрыта своим + + const Vec2 end = a.laneEnd; + DrawLineEx(ToWindow(view, a.MuzzleTowards(end)), ToWindow(view, end), 2.0f, c); + } + } + + // --- кандидаты решателя (F3) --- + if (showCandidates) + { + for (int i = 0; i < NUM_AGENTS; ++i) + { + if (!game.lastSolveValid[i]) continue; + const SolveResult& r = game.lastSolve[i]; + + float lo = 1e9f, hi = -1e9f; + for (int k = 0; k < r.count; ++k) + { + if (!r.valid[k]) continue; + lo = std::min(lo, r.scores[k]); + hi = std::max(hi, r.scores[k]); + } + const float span = std::max(1e-3f, hi - lo); + + for (int k = 0; k < r.count; ++k) + { + const Vector2 p = ToWindow(view, r.candidates[k]); + if (!r.valid[k]) + { + DrawCircleV(p, 2.0f, Color{80, 40, 40, 140}); // отбракован + continue; + } + const float t = (r.scores[k] - lo) / span; // синий -> белый + const unsigned char v = (unsigned char)(60 + 195 * t); + DrawCircleV(p, 3.0f, Color{v, v, 255, 200}); + } + if (r.bestIndex > 0) + DrawCircleLinesV(ToWindow(view, r.candidates[r.bestIndex]), 8.0f, + Color{255, 255, 255, 230}); + } + } + + // --- диски обзора (F6) --- + if (view.showSight) + { + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + Ring(view, a.pos, g_tune.sightRadius, Color{60, 130, 90, 70}); + Ring(view, a.pos, g_tune.sightPersonalRadius, Color{90, 170, 120, 110}); + + // Границы конуса взгляда. + const float half = g_tune.sightConeDeg * 0.5f * DEG2RAD_F; + for (int sgn = -1; sgn <= 1; sgn += 2) + { + const Vec2 e = a.pos + FromAngle(a.facing + half * float(sgn)) * g_tune.sightRadius; + DrawLineV(ToWindow(view, a.pos), ToWindow(view, e), Color{90, 200, 140, 110}); + } + } + } + + // --- подписи над агентами --- + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + const Vector2 p = ToWindow(view, a.pos); + if (a.IsMelee()) + DrawText(TextFormat("%dM %c t%d %s", i, a.state == AgentState::ADVANCING ? 'A' : 'H', + a.currentTargetId, MeleePhase(a.melee.state)), + int(p.x) - 18, int(p.y) - 62, 12, Color{255, 210, 170, 210}); + else + { + // Патроны и перезарядка — то, чего не видно по силуэту, но от чего + // напрямую зависит, почему стрелок с чистой линией молчит. + const char* tag = (a.gunId == FirearmId::PISTOL) ? "P" : "R"; + const Color col = a.gun.Reloading() ? Color{255, 170, 90, 230} + : Color{220, 220, 220, 210}; + if (a.gun.Reloading()) + DrawText(TextFormat("%d%s %c t%d RELOAD %.1f", i, tag, + a.state == AgentState::ADVANCING ? 'A' : 'H', + a.currentTargetId, double(a.gun.reloadTimer)), + int(p.x) - 18, int(p.y) - 62, 12, col); + else + DrawText(TextFormat("%d%s %c t%d %d/%d", i, tag, + a.state == AgentState::ADVANCING ? 'A' : 'H', + a.currentTargetId, a.gun.ammo, a.gun.def.magazine), + int(p.x) - 18, int(p.y) - 62, 12, col); + } + + // выбранная огневая позиция + if (a.state == AgentState::HOLDING || a.IsMelee()) + DrawCircleLinesV(ToWindow(view, a.postPos), 4.0f, Color{160, 160, 255, 140}); + } + + // --- назначенная цель / вектор прицела (6.8) --- + if (game.aim.manual) + { + const Vec2 from = squad.anchor; + const Vec2 to = from + FromAngle(game.aim.dir) * g_tune.weaponRange; + DrawLineEx(ToWindow(view, from), ToWindow(view, to), 1.0f, Color{255, 255, 255, 90}); + + const float cone = g_tune.aimConeDeg * DEG2RAD_F; + for (int s = -1; s <= 1; s += 2) + { + const Vec2 e = from + FromAngle(game.aim.dir + cone * float(s)) * g_tune.weaponRange; + DrawLineEx(ToWindow(view, from), ToWindow(view, e), 1.0f, Color{255, 255, 255, 50}); + } + if (game.aim.assignedTargetId >= 0) + DrawCircleLinesV(ToWindow(view, game.targets[game.aim.assignedTargetId].pos), 12.0f, + Color{255, 120, 120, 230}); + } + + // --- текстовая панель --- + int y = 8; + auto line = [&](const char* text, Color c = RAYWHITE) { + DrawText(text, 8, y, 18, c); + y += 20; + }; + + line(TextFormat("%s %s aim:%s fps %d", StateName(squad.state), + FormationName(squad.formation), game.aim.manual ? "MANUAL" : "AUTO", GetFPS())); + + // Натяжение поводка: главная новая величина управления. Видно, почему отряд + // ускорился и почему перестал стрелять. + line(TextFormat("PULL %.2f %s speed %.2f form %.2fx%.2f", double(squad.urgency), + squad.sprinting ? "SPRINT" : " ", double(squad.MoveSpeed()), + double(squad.formSpacing), double(squad.formStretch)), + squad.sprinting ? Color{255, 180, 90, 255} : Color{170, 200, 230, 255}); + + if (showMetrics) + { + const Metrics& m = game.metrics; + line(TextFormat("FRIENDLY_HITS %d", m.friendlyHits), + m.friendlyHits == 0 ? Color{120, 240, 120, 255} : Color{255, 90, 90, 255}); + line(TextFormat("FIRE UPTIME %.0f%% [%.0f %.0f %.0f %.0f %.0f]", double(m.uptimeAvg), + double(m.uptimePct[0]), double(m.uptimePct[1]), double(m.uptimePct[2]), + double(m.uptimePct[3]), double(m.uptimePct[4]))); + line(TextFormat("SETTLE %.2f s shots %d kills %d reloads %d", double(m.lastSettle), + m.shotsFired, m.targetsKilled, m.reloads)); + if (squad.meleeCount > 0) + line(TextFormat("MELEE reach %.0f%% swings %d hits %d aborted %d", + double(m.meleeUptimeAvg), m.meleeSwings, m.meleeHits, m.meleeAborts), + m.meleeAborts == 0 ? Color{255, 200, 150, 255} : Color{240, 210, 60, 255}); + line(TextFormat("sim %.2f render %.2f ms/frame", double(m.simMs), double(m.renderMs)), + Color{180, 180, 180, 255}); + // Кровь: сколько тайлов пола уже запечено. Растёт и не убывает — это + // и есть «декали навсегда», и видно, во что они обходятся по памяти. + // Только ASCII: у встроенного шрифта raylib нет кириллицы, она вылезает + // вопросительными знаками. Весь оверлей по этой причине на латинице. + line(TextFormat("BLOOD %d splats, %d tiles baked (limit %d)", view.blood.splats, + int(view.blood.stained.size()), BLOOD_TILE_BUDGET), + Color{200, 130, 130, 255}); + } + + const TunableParam& p = TUNABLES[tuneIndex]; + line(TextFormat("[ %s ] = %.3f ( [ ] select, - = adjust )", p.name, + double(g_tune.*(p.member))), + Color{255, 210, 120, 255}); + + DrawText("F1 overlay F2 lanes F3 cand F4 metrics F5 horror F6 sight R reset Esc", 8, + WINDOW_H - 24, 16, Color{160, 160, 160, 200}); +} diff --git a/src/debug/overlay.h b/src/debug/overlay.h new file mode 100644 index 0000000..33319f7 --- /dev/null +++ b/src/debug/overlay.h @@ -0,0 +1,20 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Debug-оверлей (спек 7). Рисуется примитивами raylib ПОВЕРХ уже +// отмасштабированного кадра — это единственное исключение из правила +// «вся сцена софтверная», и оно dev-only (F1 выключает). +// ----------------------------------------------------------------------------- +struct Game; +struct View; + +struct Overlay +{ + bool show = true; // F1 + bool showLanes = true; // F2 + bool showCandidates = false; // F3 + bool showMetrics = true; // F4 + int tuneIndex = 0; // [ / ] + + void HandleKeys(); + void Draw(const Game& game, const View& view) const; +}; diff --git a/src/ecs/ecs.h b/src/ecs/ecs.h new file mode 100644 index 0000000..4b54bb6 --- /dev/null +++ b/src/ecs/ecs.h @@ -0,0 +1,231 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Минимальная ECS: сущность — это идентификатор, данные лежат в типизированных +// плотных пулах, системы — свободные функции над пулами. +// +// Зачем она здесь, если прототип и без неё работал: +// * оружие стало отдельной СУЩНОСТЬЮ со своим набором статов (пистолет, +// карабин, клинок). Боец ссылается на неё, а не носит числа в себе — +// значит ствол можно подменить, не трогая ни бойца, ни правила боя; +// * мишени, пули и бойцы перестали быть тремя разными контейнерами в Game +// и стали тремя пулами одного мира. Добавить четвёртый вид сущности — +// это новый компонент, а не новое поле в Game и новый цикл в Step. +// +// Чего здесь НЕТ и почему: +// * архетипов и запросов вида View. Сущностей в прототипе десятки, +// а не десятки тысяч; выигрыш от архетипов ушёл бы в сложность, а цена +// промаха кеша на 5 агентах равна нулю; +// * реакции на изменение компонентов, планировщика систем, рефлексии. +// +// Гранулярность компонентов сознательно КРУПНАЯ (Agent, Target, Bullet целиком, +// а не Position+Velocity+Body по отдельности). Причина в docs/12-ecs.md: +// правила боя из спека читают состояние агента целиком и в одном порядке, +// и дробление их только запутало бы, не дав ни строчки полезного обобщения. +// +// Детерминизм: удаление — swap-remove, порядок пулов зависит только от истории +// вызовов. Одинаковая последовательность операций даёт одинаковый мир, поэтому +// --headless по-прежнему воспроизводим. +// ----------------------------------------------------------------------------- +#include +#include +#include + +namespace ecs +{ + +// Идентификатор: младшие 24 бита — индекс слота, старшие 8 — поколение. +// Поколение отличает «ту же ячейку, но уже другую сущность» от живой ссылки. +using Entity = uint32_t; + +constexpr Entity NO_ENTITY = 0xFFFFFFFFu; +constexpr uint32_t ENTITY_INDEX_BITS = 24; +constexpr uint32_t ENTITY_INDEX_MASK = (1u << ENTITY_INDEX_BITS) - 1u; + +inline uint32_t IndexOf(Entity e) { return e & ENTITY_INDEX_MASK; } +inline uint32_t GenOf(Entity e) { return e >> ENTITY_INDEX_BITS; } +inline Entity MakeEntity(uint32_t index, uint32_t gen) +{ + return (index & ENTITY_INDEX_MASK) | (gen << ENTITY_INDEX_BITS); +} + +// --- пулы -------------------------------------------------------------------- + +struct IPool +{ + virtual ~IPool() = default; + virtual void Remove(Entity e) = 0; + virtual void Clear() = 0; +}; + +// Плотный массив компонентов + разрежённая таблица «индекс сущности -> место». +// data остаётся сплошным, поэтому его можно отдавать наружу как обычный массив +// (именно так SolverContext получает Agent* и ничего не знает про ECS). +template +struct Pool final : IPool +{ + std::vector data; + std::vector owner; // кому принадлежит data[i] + std::vector sparse; // индекс сущности -> позиция в data, -1 = нет + + bool Has(Entity e) const + { + const uint32_t i = IndexOf(e); + return i < sparse.size() && sparse[i] >= 0; + } + + T* Find(Entity e) + { + const uint32_t i = IndexOf(e); + if (i >= sparse.size() || sparse[i] < 0) return nullptr; + return &data[size_t(sparse[i])]; + } + + const T* Find(Entity e) const + { + const uint32_t i = IndexOf(e); + if (i >= sparse.size() || sparse[i] < 0) return nullptr; + return &data[size_t(sparse[i])]; + } + + T& Add(Entity e, const T& value) + { + const uint32_t i = IndexOf(e); + if (i >= sparse.size()) sparse.resize(size_t(i) + 1, -1); + if (sparse[i] >= 0) + { + data[size_t(sparse[i])] = value; + return data[size_t(sparse[i])]; + } + sparse[i] = int32_t(data.size()); + data.push_back(value); + owner.push_back(e); + return data.back(); + } + + void Remove(Entity e) override + { + const uint32_t i = IndexOf(e); + if (i >= sparse.size() || sparse[i] < 0) return; + + const size_t slot = size_t(sparse[i]); + const size_t last = data.size() - 1; + if (slot != last) + { + data[slot] = data[last]; + owner[slot] = owner[last]; + sparse[IndexOf(owner[slot])] = int32_t(slot); + } + data.pop_back(); + owner.pop_back(); + sparse[i] = -1; + } + + void Clear() override + { + data.clear(); + owner.clear(); + for (int32_t& s : sparse) s = -1; + } + + int Count() const { return int(data.size()); } +}; + +// --- идентификаторы типов ---------------------------------------------------- + +inline uint32_t NextTypeId() +{ + static uint32_t next = 0; + return next++; +} + +template +inline uint32_t TypeId() +{ + static const uint32_t id = NextTypeId(); + return id; +} + +// --- мир --------------------------------------------------------------------- + +struct World +{ + // Создание/уничтожение сущностей. + Entity Create() + { + if (!freeSlots.empty()) + { + const uint32_t i = freeSlots.back(); + freeSlots.pop_back(); + alive[i] = 1; + return MakeEntity(i, generation[i]); + } + const uint32_t i = uint32_t(alive.size()); + alive.push_back(1); + generation.push_back(0); + return MakeEntity(i, 0); + } + + bool Alive(Entity e) const + { + const uint32_t i = IndexOf(e); + return i < alive.size() && alive[i] != 0 && generation[i] == GenOf(e); + } + + void Destroy(Entity e) + { + if (!Alive(e)) return; + const uint32_t i = IndexOf(e); + for (auto& p : pools) + if (p) p->Remove(e); + alive[i] = 0; + generation[i] = uint8_t((generation[i] + 1u) & 0xFFu); + freeSlots.push_back(i); + } + + // Пул компонента. Создаётся при первом обращении и живёт до смерти мира: + // Clear() чистит СОДЕРЖИМОЕ, но не сами пулы, поэтому ссылки на data + // (например Game::targets) переживают Reset уровня. + template + Pool& Store() + { + const uint32_t id = TypeId(); + if (id >= pools.size()) pools.resize(size_t(id) + 1); + if (!pools[id]) pools[id] = std::make_unique>(); + return *static_cast*>(pools[id].get()); + } + + template + const Pool& Store() const + { + return const_cast(this)->Store(); + } + + template + T& Add(Entity e, const T& value) { return Store().Add(e, value); } + + template + T* Get(Entity e) { return Store().Find(e); } + + template + const T* Get(Entity e) const { return Store().Find(e); } + + template + std::vector& All() { return Store().data; } + + void Clear() + { + for (auto& p : pools) + if (p) p->Clear(); + alive.clear(); + generation.clear(); + freeSlots.clear(); + } + +private: + std::vector alive; + std::vector generation; + std::vector freeSlots; + std::vector> pools; +}; + +} // namespace ecs diff --git a/src/game.cpp b/src/game.cpp new file mode 100644 index 0000000..ec263ef --- /dev/null +++ b/src/game.cpp @@ -0,0 +1,557 @@ +#include "game.h" + +// Перевод экранных осей ввода в мировые — единственное место, +// где симуляционный слой касается изометрии (см. docs/02-architecture.md). +#include "render/iso.h" + +namespace +{ + +// Снять с мира все пули разом. Пуля — сущность, поэтому просто очистить вектор +// нельзя: остались бы живые идентификаторы без компонентов. +void ClearBullets(ecs::World& world) +{ + std::vector& bullets = world.All(); + while (!bullets.empty()) world.Destroy(bullets.back().self); +} + +} // namespace + +Game::Game() + : targets(world.Store().data), + bullets(world.Store().data) +{ +} + +void Game::Init() +{ + sprites.Generate(); + Reset(); +} + +void Game::Reset() +{ + map.Generate(); + world.Clear(); // бойцы, оружие, мишени, пули — всё разом + squad.Init(world, {SQUAD_START_X, SQUAD_START_Y}); + SpawnTargets(world); + lanes.Clear(); + metrics.Reset(); + events.Clear(); + aim = AimState{}; + for (bool& v : lastSolveValid) v = false; + simTime = 0.0f; +} + +void Game::PlaceSquad(Vec2 at, bool clumped) +{ + squad.anchor = at; + squad.anchorPrev = at; + squad.anchorVel = {}; + squad.state = AgentState::HOLDING; + squad.idleTimer = g_tune.holdDelay; + squad.holdElapsed = 0.0f; + squad.urgency = 0.0f; + squad.sprinting = false; + squad.formSpacing = 1.0f; + squad.formStretch = 1.0f; + + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = squad.agents[i]; + a.pos = clumped ? at : squad.SlotWorld(i); + map.ResolveCircle(a.pos, a.bodyRadius); + a.prevPos = a.pos; + a.postPos = a.pos; + a.vel = {}; + a.commitTimer = 0.0f; + a.state = AgentState::HOLDING; + a.currentTargetId = -1; + a.hasLane = false; + + // Недорубленный взмах пережил бы расстановку и уехал в следующий + // сценарий приёмки. Параметры при этом не трогаем — они из tuning. + a.melee.state = MeleeState::IDLE; + a.melee.phase = 0.0f; + a.melee.cooldown = 0.0f; + a.melee.targetId = -1; + a.melee.inReach = false; + a.melee.arcBlockedByAlly = false; + a.melee.hitMask = 0; + a.melee.comboStep = 0; // связка тоже не должна переезжать в новый сценарий + a.melee.comboTimer = 0.0f; + + // Магазин тоже относится к расстановке: недозаряженный ствол переехал бы + // в следующий сценарий приёмки вместе с бойцом. + a.gun.ammo = a.gun.def.magazine; + a.gun.reloadTimer = 0.0f; + a.gun.cooldown = 0.0f; + a.gun.recoilDeg = 0.0f; + a.gun.shotSeq = 0; + } + + ClearBullets(world); + lanes.Clear(); + metrics.Reset(); + events.Clear(); + simTime = 0.0f; +} + +SolverContext Game::MakeContext() const +{ + SolverContext ctx; + ctx.map = ↦ + ctx.agents = squad.agents.data(); + ctx.agentCount = NUM_AGENTS; + ctx.targets = &targets; + ctx.lanes = &lanes; + ctx.anchor = squad.anchor; + ctx.assignedTargetId = aim.manual ? aim.assignedTargetId : -1; + return ctx; +} + +void Game::Step(float dt) +{ + if (in.setFormation >= 0 && in.setFormation < int(Formation::COUNT)) + squad.formation = Formation(in.setFormation); + + // --- 0. статы снаряжения: с сущностей-оружия на бойцов --------------------- + // Одна система в начале шага. Всё остальное дальше читает уже готовые числа + // и не лазает в ECS: ai/ про мир сущностей не знает вообще. + for (int i = 0; i < NUM_AGENTS; ++i) SyncLoadout(world, squad.agents[i]); + + UpdateTargets(targets, dt); + + // --- 1. якорь и состояние отряда ----------------------------------------- + // Экранные оси ввода -> мировое направление. Дальше изометрии нет нигде. + const Vec2 moveWorld = iso::ScreenDirToWorld(in.moveScreen); + squad.UpdateAnchorAndState(moveWorld, in.sprint, map, dt); + + // --- 2. движение (реестр линий — с предыдущего шага, задержка 1/60 с) ----- + squad.UpdateMovement(map, enableLaneAvoid ? &lanes : nullptr, targets, dt); + + // --- 3. ручное прицеливание (6.8) ---------------------------------------- + UpdateAim(dt); + + // --- 4. цели по НОВЫМ позициям: линии огня у стрелков, сектор у клинков --- + SolverContext ctx = MakeContext(); + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = squad.agents[i]; + if (a.IsMelee()) EvaluateMeleeTarget(a, i, ctx); + else EvaluateAgentLane(a, i, ctx); + } + + // --- 5. реестр активных линий (6.6) -------------------------------------- + lanes.Clear(); + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + + if (a.IsMelee()) + { + // Траектория клинка резервируется тем же механизмом, что и линия + // огня: свои расступаются с дороги замаха, а не выясняют это телом. + // Резерв задаётся явно и шире отрезка — по боковому размаху сектора, + // иначе союзника отжимает ровно во фланг дуги. + if (a.melee.targetId >= 0 && (a.melee.inReach || a.melee.Committed())) + { + const float flank = a.melee.reach * std::sin(a.melee.HalfArc()); + lanes.Add(i, a.pos, MeleeStrikeEnd(a, ctx), flank * g_tune.meleeReserveFrac); + } + continue; + } + + if (a.hasLane && a.currentTargetId >= 0) + { + lanes.Add(i, a.MuzzleTowards(targets[a.currentTargetId].pos), + targets[a.currentTargetId].pos); + } + else if (a.laneIntent) + { + // Линия перекрыта своим: резервируем её, чтобы перекрывшего отжало + // в сторону. Без этого сектор обстрела никогда не освободится. + lanes.Add(i, a.MuzzleTowards(a.laneEnd), a.laneEnd); + } + } + + // --- 6. решатель огневых позиций (6.5) / подход клинка -------------------- + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = squad.agents[i]; + a.commitTimer = std::max(0.0f, a.commitTimer - dt); + + if (a.IsMelee()) + { + // Решателю здесь делать нечего: у клинка одна огневая позиция — + // вплотную к цели. Нет цели в своём круге — назад в строй. + a.postPos = MeleeGoal(a, ctx, squad.SlotWorld(i)); + lastSolveValid[i] = false; + continue; + } + + a.solveTimer -= dt; + if (a.solveTimer > 0.0f) continue; + a.solveTimer += g_tune.solveInterval; + + if (!enableSolver) continue; + if (a.state != AgentState::HOLDING) continue; + if (a.commitTimer > 0.0f) continue; + if (a.priorityLane) continue; // линия к приоритетной цели уже есть + + lastSolveValid[i] = SolveFiringPosition(a, i, ctx, lastSolve[i]); + + // Решателю не по чему работать (ни одной цели в досягаемости) — случай, + // который спек не описывает. Возвращаемся в свой слот строя, иначе агент, + // отставший от отряда, остаётся стоять на месте навсегда. + if (!lastSolveValid[i]) a.postPos = squad.SlotWorld(i); + } + + // --- 7. доворот ствола / клинка ------------------------------------------- + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = squad.agents[i]; + // На замахе и ударе ось зафиксирована: доворачивать её задним числом — + // это стрельба с самонаведением, только клинком. + if (a.IsMelee() && a.melee.Committed()) + { + a.facing = a.melee.dir; + continue; + } + if (a.currentTargetId >= 0) AimAt(a, targets[a.currentTargetId].pos, dt); + else AimAlongMotion(a, dt); + } + + // --- 8. атака: огонь и клинок --------------------------------------------- + FireWeapons(ctx, dt); + UpdateMelee(ctx, dt); + + // --- 9. пули --------------------------------------------------------------- + UpdateBullets(world, map, squad.agents.data(), NUM_AGENTS, targets, dt, metrics, &events); + + // --- 10. метрики ----------------------------------------------------------- + metrics.Sample(squad, dt); + + simTime += dt; +} + +void Game::UpdateAim(float dt) +{ + if (in.toggleAimMode) + { + aim.manual = !aim.manual; + if (aim.manual) + { + // Стартуем от текущего направления отряда. + aim.dir = AngleOf(squad.forward); + aim.assignedTargetId = -1; + } + else + { + aim.assignedTargetId = -1; + } + } + + if (!aim.manual) + { + aim.assignedTargetId = -1; + return; + } + + aim.dir = WrapPi(aim.dir + in.aimTurn * g_tune.aimTurnRateDeg * DEG2RAD_F * dt); + + // Назначенная цель — ближайшая мишень в конусе +-aimConeDeg от вектора прицела. + const float cone = g_tune.aimConeDeg * DEG2RAD_F; + + // Собираем кандидатов в конусе, отсортированных по дальности от якоря. + int inCone[NUM_TARGETS]; + int coneCount = 0; + for (int i = 0; i < int(targets.size()); ++i) + { + if (!targets[i].alive) continue; + const Vec2 d = targets[i].pos - squad.anchor; + if (std::fabs(AngleDiff(aim.dir, AngleOf(d))) > cone) continue; + inCone[coneCount++] = i; + } + for (int i = 1; i < coneCount; ++i) // вставками, список крошечный + { + const int v = inCone[i]; + int j = i - 1; + while (j >= 0 && + DistanceSq(targets[inCone[j]].pos, squad.anchor) > DistanceSq(targets[v].pos, squad.anchor)) + { + inCone[j + 1] = inCone[j]; + --j; + } + inCone[j + 1] = v; + } + + if (coneCount == 0) + { + aim.assignedTargetId = -1; + return; + } + + int current = -1; + for (int i = 0; i < coneCount; ++i) + if (inCone[i] == aim.assignedTargetId) current = i; + + if (current < 0) aim.assignedTargetId = inCone[0]; + else if (in.cycleTarget) aim.assignedTargetId = inCone[(current + 1) % coneCount]; +} + +// ----------------------------------------------------------------------------- +// Огонь: перезарядка, увод ствола, спуск. +// +// Про разброс. Раньше пуля летела РОВНО по проверенному отрезку, и это было +// главным аргументом за «FRIENDLY_HITS = 0 без исключений». Теперь у выстрела +// есть конус, и аргумент остался тем же — просто проверяется не отрезок, а весь +// конус (ai/firing_solver.cpp, ConeClearOfAllies). Пуля физически не может уйти +// туда, где не проверяли: угол отклонения берётся из ТОЙ ЖЕ величины SpreadRad, +// по которой считалась ширина проверки. +// +// Разброс не случаен в смысле генератора: это чистый хеш от (стрелок, номер +// выстрела). Прогон воспроизводим, --headless по-прежнему годится как тест. +// ----------------------------------------------------------------------------- +void Game::FireWeapons(const SolverContext& ctx, float dt) +{ + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = squad.agents[i]; + a.fired = false; + if (a.IsMelee()) continue; + + Firearm& g = a.gun; + g.cooldown = std::max(0.0f, g.cooldown - dt); + // Увод ствола оседает сам: очередь «раскрывается», пауза её собирает. + g.recoilDeg = std::max(0.0f, g.recoilDeg - g.def.recoilDecay * dt); + + // --- перезарядка ------------------------------------------------------ + if (g.Reloading()) + { + g.reloadTimer -= dt; + if (g.reloadTimer <= 0.0f) + { + g.reloadTimer = 0.0f; + g.ammo = g.def.magazine; + events.Push(CombatEventKind::RELOAD_DONE, i, a.pos, FromAngle(a.facing)); + } + continue; + } + if (g.Empty()) + { + g.reloadTimer = g.def.reloadTime; + events.Push(CombatEventKind::RELOAD_START, i, a.pos, FromAngle(a.facing)); + ++metrics.reloads; + continue; + } + + // Бег с курсором на вытянутом поводке — это приказ идти, а не драться. + if (squad.sprinting) continue; + + if (!a.hasLane || a.currentTargetId < 0) continue; + if (g.cooldown > 0.0f) continue; + + const Vec2 tp = targets[a.currentTargetId].pos; + + // Ствол должен быть доведён до цели — иначе выстрел выглядит враньём. + if (std::fabs(AngleDiff(a.facing, AngleOf(tp - a.pos))) > + g_tune.aimToleranceDeg * DEG2RAD_F) + continue; + + // Повторная проверка конуса по позициям этого шага: «никаких исключений». + if (!LaneClearFrom(a.pos, i, tp, ctx)) continue; + + const Vec2 muzzle = a.MuzzleTowards(tp); + + // И проверка на время полёта пули — свой не должен успеть влезть. + if (AllyInterceptsShot(muzzle, tp, i, ctx)) continue; + + // Отклонение внутри уже проверенного конуса. + const float spread = a.SpreadRad(); + const float axis = AngleOf(Normalized(tp - muzzle, FromAngle(a.facing))); + const Vec2 dir = FromAngle(axis + g.ShotOffset(i, spread)); + + SpawnBullet(world, g.def, muzzle, dir, Distance(muzzle, tp), i); + events.Push(CombatEventKind::SHOT, i, muzzle, dir); + + g.cooldown = g.def.fireInterval; + g.ammo = std::max(0, g.ammo - 1); + ++g.shotSeq; + g.recoilDeg = std::min(g.def.spreadRecoilMax, g.recoilDeg + g.def.spreadRecoilDeg); + a.fired = true; + ++metrics.shotsFired; + } +} + +// ----------------------------------------------------------------------------- +// Ближний бой: замах -> удар -> восстановление. +// +// Правило то же, что и у стрельбы, только в угловой форме: свой в секторе — +// не бьём. Оно проверяется дважды, как и у ствола: +// 1) на старте замаха — сектор reach x arcDeg обязан быть чист; +// 2) каждый шаг активного окна — если свой всё-таки влез под лезвие, +// взмах ОБРЫВАЕТСЯ. Урон союзнику не наносится ни при каком раскладе, +// поэтому FRIENDLY_HITS клинок физически поднять не может. +// +// Урон идёт не «по факту начала удара», а по реально пройденной за шаг полосе +// лезвия: то, что видно на экране, и то, что получило урон, — одна и та же дуга. +// ----------------------------------------------------------------------------- +void Game::UpdateMelee(const SolverContext& ctx, float dt) +{ + const float bladeHalf = g_tune.meleeBladeDeg * 0.5f * DEG2RAD_F; + + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = squad.agents[i]; + if (!a.IsMelee()) continue; + + MeleeWeapon& m = a.melee; + m.cooldown = std::max(0.0f, m.cooldown - dt); + a.fired = false; + + switch (m.state) + { + case MeleeState::IDLE: + { + // Связка живёт своим окном: не продолжил вовремя — начинаешь + // серию сначала. + m.comboTimer = std::max(0.0f, m.comboTimer - dt); + if (m.comboTimer <= 0.0f) m.comboStep = 0; + + // На бегу боец не гоняется за целями (за него это решает + // Squad::GoalFor — он идёт в слот), но если цель сама оказалась + // под рукой, клинок работает. Бой на ходу — это нормально. + if (m.targetId < 0 || !m.inReach) break; + if (m.cooldown > 0.0f) break; + if (m.arcBlockedByAlly) break; // посчитано в EvaluateMeleeTarget + + const Vec2 tp = targets[m.targetId].pos; + const float axis = AngleOf(tp - a.pos); + // Корпус должен быть довёрнут — иначе удар выглядит враньём + // ровно так же, как выстрел мимо ствола. + if (std::fabs(AngleDiff(a.facing, axis)) > + g_tune.meleeAimToleranceDeg * DEG2RAD_F) + break; + + const MeleeComboStep& cs = m.NextComboStep(); + m.BakeSwing(cs); // ширина, урон и тайминги — на весь взмах + + m.state = MeleeState::WINDUP; + m.phase = m.curWindup; + m.dir = axis; + if (cs.flipSide) m.sweepSign = -m.sweepSign; + m.hitMask = 0; + // Интервал считается от НАЧАЛА замаха; внутри связки он короче. + m.cooldown = m.interval * cs.intervalMul; + break; + } + + case MeleeState::WINDUP: + { + m.phase -= dt; + if (m.phase > 0.0f) break; + m.state = MeleeState::STRIKE; + m.phase = m.curStrike; + events.Push(CombatEventKind::MELEE_SWING, i, a.pos, FromAngle(m.dir)); + ++metrics.meleeSwings; + if (m.comboStep >= 0 && m.comboStep < MELEE_COMBO_STEPS) + ++metrics.meleeComboSwings[m.comboStep]; + break; + } + + case MeleeState::STRIKE: + { + const float p0 = m.Progress(); + m.phase -= dt; + const float p1 = m.Progress(); + + const float ang0 = m.BladeAngleAt(p0); + const float ang1 = m.BladeAngleAt(p1); + + // 1. свой под лезвием -> взмах оборван + bool aborted = false; + for (int k = 0; k < ctx.agentCount; ++k) + { + if (k == i) continue; + const Agent& ally = ctx.agents[k]; + if (!BladeSweepHits(a.pos, ang0, ang1, bladeHalf, + m.reach + g_tune.meleeAllyMargin, ally.pos, + ally.bodyRadius + g_tune.meleeAllyMargin)) + continue; + aborted = true; + break; + } + if (aborted) + { + events.Push(CombatEventKind::MELEE_ABORT, i, a.pos, FromAngle(ang1)); + ++metrics.meleeAborts; + m.state = MeleeState::RECOVER; + m.phase = m.curRecover; + break; + } + + // 2. мишени, по одной за взмах + for (int t = 0; t < int(targets.size()); ++t) + { + Target& tg = targets[t]; + if (!tg.alive) continue; + if (m.hitMask & (1u << t)) continue; + if (!BladeSweepHits(a.pos, ang0, ang1, bladeHalf, m.reach, tg.pos, tg.radius)) + continue; + if (map.RaycastBlocked(a.pos, tg.pos)) continue; // сквозь стену не рубим + + m.hitMask |= (1u << t); + a.fired = true; + + const Vec2 dir = Normalized(tg.pos - a.pos, FromAngle(m.dir)); + const Vec2 contact = tg.pos - dir * tg.radius; + + tg.hp -= m.curDamage; + KnockTarget(tg, dir, m.curKnock); + events.Push(CombatEventKind::MELEE_HIT, i, contact, dir); + ++metrics.meleeHits; + + // Инвариант сектора: попадание обязано лежать внутри дуги + // ЭТОГО взмаха. Замеряется превышение — оно должно быть ~0. + const float off = std::fabs(AngleDiff(m.dir, AngleOf(tg.pos - a.pos))); + const float allowed = m.curHalfArc + bladeHalf; + metrics.meleeMaxHitExcessDeg = + std::max(metrics.meleeMaxHitExcessDeg, + std::max(0.0f, off - allowed) / DEG2RAD_F); + + if (tg.hp <= 0.0f) + { + tg.alive = false; + tg.respawnTimer = g_tune.targetRespawn; + ++metrics.targetsKilled; + events.Push(CombatEventKind::HIT_KILL, i, tg.pos, dir); + } + } + + if (m.phase <= 0.0f) + { + m.state = MeleeState::RECOVER; + m.phase = m.curRecover; + } + break; + } + + case MeleeState::RECOVER: + { + m.phase -= dt; + if (m.phase <= 0.0f) + { + m.state = MeleeState::IDLE; + m.phase = 0.0f; + // Удар доведён до конца — связка продвигается. Окно открыто: + // успел ударить снова, пока оно не истекло, — пойдёт + // следующий удар серии, не успел — начнёшь сначала. + m.comboStep = (m.comboStep + 1) % MELEE_COMBO_STEPS; + m.comboTimer = g_tune.meleeComboWindow; + } + break; + } + } + } +} diff --git a/src/game.h b/src/game.h new file mode 100644 index 0000000..0c39d68 --- /dev/null +++ b/src/game.h @@ -0,0 +1,83 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Контейнер состояния прототипа: карта, мир ECS, отряд, мишени, пули, метрики. +// main.cpp занимается только окном и fixed timestep, вся склейка — здесь. +// Ввод приходит снаружи структурой InputState (нужно и для headless-прогонов). +// +// Мишени, пули, бойцы и оружие — сущности одного мира ecs::World. targets и +// bullets ниже — это ССЫЛКИ на плотные массивы соответствующих пулов, а не +// отдельные контейнеры: правила ходят по ним как по обычным векторам и про ECS +// ничего не знают (docs/12-ecs.md). +// ----------------------------------------------------------------------------- +#include + +#include "ai/firing_solver.h" +#include "ai/lane_registry.h" +#include "ai/melee.h" +#include "core/input.h" +#include "core/math.h" +#include "debug/metrics.h" +#include "ecs/ecs.h" +#include "render/sprites.h" +#include "sim/events.h" +#include "sim/bullet.h" +#include "sim/squad.h" +#include "sim/target.h" +#include "world/tilemap.h" + +// Ручное прицеливание (спек 6.8). +struct AimState +{ + bool manual = false; + float dir = 0.0f; // радианы, куда смотрит вектор прицела + int assignedTargetId = -1; +}; + +struct Game +{ + Tilemap map; + SpriteSet sprites; + + ecs::World world; + + Squad squad; + LaneRegistry lanes; + std::vector& targets; // пул ECS + std::vector& bullets; // пул ECS + Metrics metrics; + AimState aim; + // Единственный канал в сторону эффектов. Правила его не читают. + CombatEventLog events; + + // Последний прогон решателя по каждому агенту — только для F3-оверлея. + SolveResult lastSolve[NUM_AGENTS]; + bool lastSolveValid[NUM_AGENTS] = {}; + + // Dev-тумблеры для A/B проверки ядра (по умолчанию включено). + bool enableSolver = true; + bool enableLaneAvoid = true; + + InputState in{}; + float simTime = 0.0f; + + Game(); + + void Init(); // одноразовая инициализация (спрайты + Reset) + void Reset(); // R: перегенерировать уровень и расставить отряд + + // Поставить отряд в заданную точку. clumped = все пятеро в одной куче — + // это исходная позиция сценария из критерия приёмки 11.1. + void PlaceSquad(Vec2 at, bool clumped); + + void Step(float dt); // ровно один шаг фиксированной симуляции + + SolverContext MakeContext() const; + +private: + void UpdateAim(float dt); + // Перезарядка, увод ствола, спуск. Разброс выстрела считается здесь же и + // ровно тот, который проверил LaneClear. + void FireWeapons(const SolverContext& ctx, float dt); + // Машина состояний клинка: замах -> удар -> восстановление, урон по дуге. + void UpdateMelee(const SolverContext& ctx, float dt); +}; diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..8391a07 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,181 @@ +// ----------------------------------------------------------------------------- +// Точка входа: окно, ввод, главный цикл, fixed timestep 60 Гц. +// Ничего игрового здесь нет — только сбор ввода и вызовы Game::Step/Render. +// +// Dev-режимы (подробнее в docs/01-build-and-run.md): +// --shot [кадров] [файл] снять скриншот и выйти +// --clean стартовать без оверлея (чистый кадр) +// --headless <сек> прогон без окна + метрики +// --accept сценарии критериев приёмки (спек 11) +// --probe подробности по агентам на стоянках +// --no-solver / --no-laneavoid отключить части ядра для A/B сравнения +// --melee N сколько слотов держат клинок (0 = все стрелки) +// --pistol N сколько ПОСЛЕДНИХ слотов носят пистолет +// --set имя=значение подкрутить параметр из TUNABLES +// ----------------------------------------------------------------------------- +#include + +#include +#include +#include +#include + +#include "debug/harness.h" +#include "debug/overlay.h" +#include "game.h" +#include "render/framebuffer.h" +#include "render/view.h" +#include "tuning.h" + +namespace +{ + +InputState SampleInput() +{ + InputState in; + if (IsKeyDown(KEY_A)) in.moveScreen.x -= 1.0f; + if (IsKeyDown(KEY_D)) in.moveScreen.x += 1.0f; + if (IsKeyDown(KEY_W)) in.moveScreen.y -= 1.0f; + if (IsKeyDown(KEY_S)) in.moveScreen.y += 1.0f; + in.sprint = IsKeyDown(KEY_LEFT_SHIFT) || IsKeyDown(KEY_RIGHT_SHIFT); + + in.toggleAimMode = IsKeyPressed(KEY_SPACE); + in.cycleTarget = IsKeyPressed(KEY_TAB); + if (IsKeyDown(KEY_LEFT)) in.aimTurn -= 1.0f; + if (IsKeyDown(KEY_RIGHT)) in.aimTurn += 1.0f; + + if (IsKeyPressed(KEY_ONE)) in.setFormation = 0; + if (IsKeyPressed(KEY_TWO)) in.setFormation = 1; + if (IsKeyPressed(KEY_THREE)) in.setFormation = 2; + return in; +} + +// --set имя=значение — подкрутка любого параметра из TUNABLES без пересборки. +void ApplyTuningOverride(const char* arg) +{ + const char* eq = std::strchr(arg, '='); + if (!eq) return; + + const size_t nameLen = size_t(eq - arg); + for (int k = 0; k < TUNABLE_COUNT; ++k) + { + if (std::strlen(TUNABLES[k].name) != nameLen) continue; + if (std::strncmp(arg, TUNABLES[k].name, nameLen) != 0) continue; + g_tune.*(TUNABLES[k].member) = float(std::atof(eq + 1)); + std::printf("set %s = %s\n", TUNABLES[k].name, eq + 1); + return; + } + std::printf("неизвестный параметр: %s\n", arg); +} + +} // namespace + +int main(int argc, char** argv) +{ + int shotFrame = -1; + const char* shotFile = "shot.png"; + bool accept = false; + bool clean = false; // --clean: стартовать без оверлея (для скриншотов) + HarnessOptions harness; + harness.seconds = 0.0f; + + for (int i = 1; i < argc; ++i) + { + if (std::strcmp(argv[i], "--shot") == 0) + { + shotFrame = (i + 1 < argc) ? TextToInteger(argv[i + 1]) : 90; + if (i + 2 < argc) shotFile = argv[i + 2]; + } + else if (std::strcmp(argv[i], "--headless") == 0 && i + 1 < argc) + harness.seconds = float(std::atof(argv[++i])); + else if (std::strcmp(argv[i], "--set") == 0 && i + 1 < argc) + ApplyTuningOverride(argv[++i]); + else if (std::strcmp(argv[i], "--melee") == 0 && i + 1 < argc) + harness.meleeCount = TextToInteger(argv[++i]); + else if (std::strcmp(argv[i], "--pistol") == 0 && i + 1 < argc) + harness.pistolCount = TextToInteger(argv[++i]); + else if (std::strcmp(argv[i], "--clean") == 0) clean = true; + else if (std::strcmp(argv[i], "--accept") == 0) accept = true; + else if (std::strcmp(argv[i], "--probe") == 0) harness.probe = true; + else if (std::strcmp(argv[i], "--no-solver") == 0) harness.solver = false; + else if (std::strcmp(argv[i], "--no-laneavoid") == 0) harness.laneAvoid = false; + } + + if (accept) return RunAccept(); + if (harness.seconds > 0.0f) return RunHeadless(harness); + + SetConfigFlags(FLAG_VSYNC_HINT); + InitWindow(WINDOW_W, WINDOW_H, "Squad prototype"); + SetExitKey(KEY_ESCAPE); + + Framebuffer fb; + fb.Init(INTERNAL_W, INTERNAL_H); + + ScreenBlitter screen; + screen.Init(INTERNAL_W, INTERNAL_H); + + Game game; + game.enableSolver = harness.solver; + game.enableLaneAvoid = harness.laneAvoid; + game.squad.meleeCount = harness.meleeCount; // до Init: состав раздаётся там + game.squad.pistolCount = harness.pistolCount; + game.Init(); + + // View большой (поля света на всю карту + виньетка на кадр) — на куче. + static View view; + view.Init(); + view.Reset(game); + + Overlay overlay; + if (clean) { overlay.show = false; overlay.showLanes = false; } + double accumulator = 0.0; + + while (!WindowShouldClose()) + { + overlay.HandleKeys(); + if (IsKeyPressed(KEY_R)) { game.Reset(); view.Reset(game); } + if (IsKeyPressed(KEY_F5)) view.horrorEnabled = !view.horrorEnabled; + if (IsKeyPressed(KEY_F6)) view.showSight = !view.showSight; + + game.in = SampleInput(); + + const float frameDt = GetFrameTime(); + accumulator += double(frameDt); + + // --- fixed timestep 60 Гц, рендер с интерполяцией --------------------- + int steps = 0; + const auto t0 = std::chrono::steady_clock::now(); + while (accumulator >= FIXED_DT && steps < MAX_STEPS_PER_FRAME) + { + game.Step(FIXED_DT); + accumulator -= FIXED_DT; + ++steps; + } + game.metrics.simMs = float( + std::chrono::duration(std::chrono::steady_clock::now() - t0).count()); + if (accumulator > FIXED_DT * MAX_STEPS_PER_FRAME) accumulator = 0.0; + + const float alpha = float(accumulator / FIXED_DT); + + const auto tr0 = std::chrono::steady_clock::now(); + RenderGame(game, view, fb, alpha, frameDt); + game.metrics.renderMs = float( + std::chrono::duration(std::chrono::steady_clock::now() - tr0).count()); + + BeginDrawing(); + ClearBackground(BLACK); + screen.Present(fb, WINDOW_W, WINDOW_H); + overlay.Draw(game, view); + EndDrawing(); + + if (shotFrame >= 0 && --shotFrame <= 0) + { + TakeScreenshot(shotFile); + break; + } + } + + screen.Shutdown(); + CloseWindow(); + return 0; +} diff --git a/src/render/atmos.cpp b/src/render/atmos.cpp new file mode 100644 index 0000000..79034f9 --- /dev/null +++ b/src/render/atmos.cpp @@ -0,0 +1,83 @@ +#include "render/atmos.h" + +#include "render/iso.h" +#include "render/noise.h" + +namespace +{ + +// Мировой квадрат вокруг камеры, гарантированно покрывающий кадр 480x270. +// В изометрии |wx-wy| <= 15 по ширине и |wx+wy| <= 17 по высоте, так что 19 +// тайлов в каждую сторону — с запасом на подъём пылинки по экрану. +constexpr int ASH_REACH = 19; + +// Больше трёх пылинок на тайл — это уже не воздух, а снегопад. +constexpr int ASH_PER_CELL = 3; + +constexpr uint32_t COL_ASH = FXC(198, 186, 166); // тёплый серый: пепел, не снег + +} // namespace + +void Atmosphere::DrawAsh(Framebuffer& fb, Vec2 camPos, int ox, int oy, const Lighting& light) const +{ + const float density = g_tune.ashDensity; + const float bright = g_tune.ashBrightness; + if (density <= 0.0f || bright <= 0.0f) return; + + const int cx = int(std::floor(camPos.x)); + const int cy = int(std::floor(camPos.y)); + const float drift = g_tune.ashSpeed; + + for (int gy = cy - ASH_REACH; gy <= cy + ASH_REACH; ++gy) + { + for (int gx = cx - ASH_REACH; gx <= cx + ASH_REACH; ++gx) + { + for (int k = 0; k < ASH_PER_CELL; ++k) + { + // Дробная плотность: последней пылинке в ячейке «положено» + // столько, сколько осталось от density. + const float quota = density - float(k); + if (quota <= 0.0f) break; + + const uint32_t h = Hash3(uint32_t(gx + 4096), uint32_t(gy + 4096), + uint32_t(k) * 977u + 13u); + if (quota < 1.0f && Hash01(h) > quota) continue; + + const Vec2 base{float(gx) + Hash01(Hash2(h, 1u)), + float(gy) + Hash01(Hash2(h, 2u))}; + + // Дрейф — замкнутая петля, а не бесконечный снос: иначе пылинку + // пришлось бы «заворачивать», и она телепортировалась бы на глазах. + const float ph = Hash01(Hash2(h, 3u)) * TWO_PI_F; + const float rate = 0.20f + 0.45f * Hash01(Hash2(h, 4u)); + const float amp = 0.30f + 0.30f * Hash01(Hash2(h, 5u)); + const float t = time * drift * rate; + const Vec2 p{base.x + std::cos(t * TWO_PI_F + ph) * amp, + base.y + std::sin(t * TWO_PI_F * 0.73f + ph * 1.7f) * amp}; + + const float lit = light.LightAt(p); + if (lit < 0.05f) continue; + + // Высота: часть взвеси стелется по полу, часть висит на уровне + // головы. Медленное покачивание вверх-вниз добавляет объёма. + const float liftFrac = 0.15f + 0.95f * Hash01(Hash2(h, 6u)); + const float bob = std::sin(t * TWO_PI_F * 1.31f + ph) * 2.5f; + const int lift = int(g_tune.ashLiftPx * liftFrac + bob); + + const Vec2 s = iso::WorldToScreen(p); + const int sx = int(std::lround(s.x)) + ox; + const int sy = int(std::lround(s.y)) + oy - lift; + if (unsigned(sx) >= unsigned(fb.w) || unsigned(sy) >= unsigned(fb.h)) continue; + + // Мерцание: пылинка поворачивается к свету то одним боком, то другим. + const float twinkle = 0.45f + 0.55f * (0.5f + 0.5f * std::sin(t * 9.0f + ph * 3.0f)); + const float amount = lit * bright * twinkle * (0.35f + 0.65f * Hash01(Hash2(h, 8u))); + const uint32_t col = ScaleColor8(COL_ASH, uint32_t(Clampf(amount, 0.0f, 1.0f) * 256.0f)); + + // Крупные хлопья редки и получают ореол — глазу есть за что зацепиться. + if ((h & 15u) == 0u) fb.AddGlowDisc(sx, sy, 1, col); + else fb.AddPx(sx, sy, col); + } + } + } +} diff --git a/src/render/atmos.h b/src/render/atmos.h new file mode 100644 index 0000000..62bc3ad --- /dev/null +++ b/src/render/atmos.h @@ -0,0 +1,32 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Воздух: висящая пыль (пепел) и низовая дымка. +// +// Разделение сознательное, потому что это две разные вещи: +// * ПЕПЕЛ — частицы в МИРЕ. Он парит между камерой и полом, двигается вместе +// со сценой при движении камеры и подчиняется свету: в темноте пылинок не +// видно, в луче они вспыхивают. Рисуется здесь; +// * ДЫМКА — свойство КАДРА, а не мира: мягкое подсвечивание объёма клубами. +// Она живёт в слитом пост-проходе (render/post.cpp), потому что там уже +// есть проход по пикселям и второй заводить незачем. +// +// Ни у того, ни у другого нет состояния, которое надо синхронизировать: +// положение пылинки — чистая функция от её ячейки мира и времени. Поэтому +// «частиц» нет как объектов, аллокаций ноль, и число пылинок можно менять +// ручкой в оверлее прямо на ходу. +// ----------------------------------------------------------------------------- +#include "core/math.h" +#include "render/framebuffer.h" +#include "render/lighting.h" + +struct Atmosphere +{ + float time = 0.0f; + + void Reset() { time = 0.0f; } + void Update(float frameDt) { time += frameDt; } + + // Взвесь поверх геометрии и до пост-прохода: пыль светится аддитивно, + // но общую цветокоррекцию кадра проходит вместе со всем остальным. + void DrawAsh(Framebuffer& fb, Vec2 camPos, int ox, int oy, const Lighting& light) const; +}; diff --git a/src/render/blood.cpp b/src/render/blood.cpp new file mode 100644 index 0000000..f45ac11 --- /dev/null +++ b/src/render/blood.cpp @@ -0,0 +1,233 @@ +#include "render/blood.h" + +#include "render/iso.h" +#include "render/noise.h" + +namespace +{ + +// Максимум капель в одном пятне. Больше — это уже не брызги, а забор. +constexpr int MAX_DROPS = 16; + +// Одна капля пятна: круг с рваным краем, при желании вытянутый вдоль удара. +struct Blob +{ + Vec2 c{}; + float r = 0.0f; + float strength = 1.0f; + float elong = 1.0f; // вытяжение вдоль dir; 1 = ровный круг + uint32_t seed = 0; +}; + +// Множитель цвета по каналам с насыщением. Кровь именно УМНОЖАЕТ пол, а не +// закрашивает его: фактура плитки должна просвечивать, иначе получается наклейка. +inline uint32_t MulColor(uint32_t c, float kr, float kg, float kb) +{ + const float r = Clampf(float(c & 0xFFu) * kr, 0.0f, 255.0f); + const float g = Clampf(float((c >> 8) & 0xFFu) * kg, 0.0f, 255.0f); + const float b = Clampf(float((c >> 16) & 0xFFu) * kb, 0.0f, 255.0f); + return RGBA(uint8_t(r), uint8_t(g), uint8_t(b), AlphaOf(c)); +} + +inline uint32_t MixColor(uint32_t a, uint32_t b, float t) +{ + const float k = Clampf(t, 0.0f, 1.0f); + return RGBA(uint8_t(Lerpf(float(a & 0xFFu), float(b & 0xFFu), k)), + uint8_t(Lerpf(float((a >> 8) & 0xFFu), float((b >> 8) & 0xFFu), k)), + uint8_t(Lerpf(float((a >> 16) & 0xFFu), float((b >> 16) & 0xFFu), k)), + AlphaOf(a)); +} + +// Рваный край: радиус зависит от угла, между лепестками — гладкая интерполяция. +// Идеальный круг читается как штамп, а не как лужа. +float EdgeWobble(uint32_t seed, float ang) +{ + constexpr int LOBES = 12; + const float t = (ang + PI_F) / TWO_PI_F * float(LOBES); + const int i0 = int(t) % LOBES; + const int i1 = (i0 + 1) % LOBES; + float f = t - std::floor(t); + f = f * f * (3.0f - 2.0f * f); + const float w0 = Hash01(Hash3(seed, uint32_t(i0), 0x5Bu)); + const float w1 = Hash01(Hash3(seed, uint32_t(i1), 0x5Bu)); + return 0.72f + 0.44f * Lerpf(w0, w1, f); +} + +} // namespace + +void BloodField::Reset() +{ + slotOf.assign(size_t(MAP_W) * size_t(MAP_H), -1); + stained.clear(); + eventCursor = 0; + splats = 0; +} + +void BloodField::Ingest(const CombatEventLog& log, const SpriteSet& sprites, const Tilemap& map) +{ + uint32_t from = eventCursor; + if (log.head > from + COMBAT_EVENT_CAP) from = log.head - COMBAT_EVENT_CAP; + + for (uint32_t i = from; i < log.head; ++i) + { + const CombatEvent& e = log.buf[i % COMBAT_EVENT_CAP]; + + float radius = 0.0f; + switch (e.kind) + { + case CombatEventKind::HIT_TARGET: radius = g_tune.bloodRadiusHit; break; + case CombatEventKind::HIT_ALLY: radius = g_tune.bloodRadiusHit; break; + case CombatEventKind::MELEE_HIT: radius = g_tune.bloodRadiusMelee; break; + case CombatEventKind::HIT_KILL: radius = g_tune.bloodRadiusKill; break; + default: continue; + } + // Зерно от номера события: два попадания в одну точку дадут разные пятна. + Splat(sprites, map, e.pos, e.dir, radius, Hash2(i, uint32_t(e.owner + 1))); + } + eventCursor = log.head; +} + +void BloodField::Splat(const SpriteSet& sprites, const Tilemap& map, Vec2 world, Vec2 dir, + float radius, uint32_t seed) +{ + if (g_tune.bloodAmount <= 0.0f) return; + radius *= g_tune.bloodAmount; + if (radius < 0.02f) return; + if (slotOf.empty()) Reset(); + + const Vec2 d = Normalized(dir, Vec2{1.0f, 0.0f}); + const Vec2 side = Perp(d); + + // --- набор капель --------------------------------------------------------- + Blob blobs[1 + MAX_DROPS]; + int n = 0; + + Blob main_; + main_.c = world; + main_.r = radius; + main_.strength = 1.0f; + main_.elong = 1.35f; // лужа вытянута по удару, а не идеально кругла + main_.seed = seed; + blobs[n++] = main_; + + const int drops = std::min(MAX_DROPS, std::max(0, int(g_tune.bloodDrops))); + for (int k = 0; k < drops; ++k) + { + const uint32_t h = Hash3(seed, uint32_t(k), 0x11u); + const float along = radius * (1.05f + 2.4f * (float(k) + 1.0f) / float(drops)) * + (0.55f + 0.9f * Hash01(h)); + const float lateral = radius * 1.15f * HashSigned(Hash2(h, 7u)) * + (0.3f + 0.7f * float(k) / float(drops)); + const float rr = radius * (0.34f - 0.20f * float(k) / float(drops)) * + (0.45f + 0.9f * Hash01(Hash2(h, 13u))); + if (rr < 0.02f) continue; + + Blob b; + b.c = world + d * along + side * lateral; + b.r = rr; + b.strength = 0.86f; + b.elong = 1.0f; + b.seed = h; + blobs[n++] = b; + } + + // --- границы в мире -> диапазон тайлов ------------------------------------ + float minX = world.x, maxX = world.x, minY = world.y, maxY = world.y; + for (int i = 0; i < n; ++i) + { + const float r = blobs[i].r * 1.5f; + minX = std::min(minX, blobs[i].c.x - r); + maxX = std::max(maxX, blobs[i].c.x + r); + minY = std::min(minY, blobs[i].c.y - r); + maxY = std::max(maxY, blobs[i].c.y + r); + } + + const int tx0 = int(std::floor(minX)); + const int tx1 = int(std::floor(maxX)); + const int ty0 = int(std::floor(minY)); + const int ty1 = int(std::floor(maxY)); + + const uint32_t coreCol = RGBA(52, 8, 10); + const uint32_t rimCol = RGBA(104, 22, 16); + const float opacity = Clampf(g_tune.bloodOpacity, 0.0f, 1.0f); + + bool painted = false; + + for (int ty = ty0; ty <= ty1; ++ty) + { + for (int tx = tx0; tx <= tx1; ++tx) + { + if (!Tilemap::InBounds(tx, ty)) continue; + if (map.IsWall(tx, ty)) continue; // под стеной пола не видно + + const size_t key = size_t(ty) * MAP_W + tx; + int32_t slot = slotOf[key]; + if (slot < 0) + { + // Бюджет выбран: на чистый тайл больше не тратимся, но уже + // запачканные продолжают собирать кровь. + if (int(stained.size()) >= BLOOD_TILE_BUDGET) continue; + slot = int32_t(stained.size()); + stained.push_back(sprites.FloorTile(tx, ty)); + slotOf[key] = slot; + } + + Sprite& s = stained[size_t(slot)]; + const Vec2 center{float(tx) + 0.5f, float(ty) + 0.5f}; + + for (int py = 0; py < s.h; ++py) + { + for (int px = 0; px < s.w; ++px) + { + const uint32_t base = s.Get(px, py); + if (AlphaOf(base) == 0) continue; // вне ромба + + // Пиксель ромба -> точка мира. Проекция линейна, поэтому + // обратный переход точен и швов между тайлами не будет. + const Vec2 p = center + iso::ScreenToWorld( + Vec2{float(px - s.ax), float(py - s.ay)}); + + float cover = 0.0f; + for (int i = 0; i < n && cover < 1.0f; ++i) + { + const Blob& b = blobs[i]; + Vec2 dv = p - b.c; + if (b.elong != 1.0f) + dv = Vec2{Dot(dv, d) / b.elong, Dot(dv, side)}; + + const float dist = Length(dv); + const float r = b.r * EdgeWobble(b.seed, AngleOf(dv)); + if (dist >= r) continue; + + const float inner = r * 0.68f; + const float a = (dist <= inner) + ? 1.0f + : 1.0f - (dist - inner) / std::max(1e-4f, r - inner); + cover = std::max(cover, b.strength * a); + } + if (cover <= 0.02f) continue; + + // Кромка светлее и рыжее середины — так лужа читается объёмной. + const uint32_t tint = MixColor(rimCol, coreCol, Clampf(cover * 1.3f, 0.0f, 1.0f)); + // Крапчатость: свернувшаяся кровь неоднородна. + const float mott = 0.84f + 0.26f * Hash01(Hash3(uint32_t(tx * 64 + px), + uint32_t(ty * 64 + py), seed)); + // Плотность держится почти по всему пятну и падает только + // у самого края: лужа с ровным градиентом выглядит подтёком. + const float a = Clampf(cover * 1.5f, 0.0f, 1.0f) * opacity * mott; + + // Делители подобраны так, чтобы серый пол ушёл в тёмно-красное, + // а кромка — в заметно более светлое и рыжее. + const uint32_t stainedPx = + MulColor(base, Lerpf(1.0f, float(tint & 0xFFu) / 55.0f, a), + Lerpf(1.0f, float((tint >> 8) & 0xFFu) / 110.0f, a), + Lerpf(1.0f, float((tint >> 16) & 0xFFu) / 150.0f, a)); + s.Set(px, py, stainedPx); + painted = true; + } + } + } + } + + if (painted) ++splats; +} diff --git a/src/render/blood.h b/src/render/blood.h new file mode 100644 index 0000000..49eed46 --- /dev/null +++ b/src/render/blood.h @@ -0,0 +1,56 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Кровь: вечные декали, ЗАПЕЧЁННЫЕ в поверхность. +// +// Почему не список пятен, которые дорисовываются каждый кадр: их число растёт +// без предела, и через минуту боя кадр начинает стоить столько же, сколько вся +// остальная сцена. Обычное лекарство — выбрасывать старые декали, но задача +// прямо противоположная: пятна должны остаться навсегда. +// +// Решение — запекание. Пол рисуется поштучно спрайтами-ромбами. При попадании +// мы один раз делаем КОПИЮ ромба того тайла, куда пришлось попадание, и рисуем +// кровь прямо в её пиксели. Дальше этот тайл рисуется ровно так же, как раньше, +// просто другим спрайтом. Стоимость кадра не меняется НИ НА ЧТО, сколько бы +// крови ни накопилось: цена платится один раз, в момент попадания. +// +// Свет и туман войны продолжают работать: запечённая кровь проходит через ту же +// световую рампу, что и пол, потому что она и есть пол. +// +// Потолок памяти — BLOOD_TILE_BUDGET тайлов (по 2 КБ). Когда он выбран, новые +// пятна ложатся только на уже запачканные тайлы: это видно как «кровь копится +// там, где дрались», а не как исчезающие декали. +// ----------------------------------------------------------------------------- +#include +#include + +#include "core/math.h" +#include "render/framebuffer.h" +#include "render/sprites.h" +#include "sim/events.h" +#include "world/tilemap.h" + +struct BloodField +{ + std::vector slotOf; // тайл -> индекс в stained, -1 = чистый + std::vector stained; // запечённые копии ромбов пола + uint32_t eventCursor = 0; + int splats = 0; // сколько пятен легло за прогон (для оверлея) + + void Reset(); + + // Чем рисовать пол этого тайла: запечённой копией или ничем (значит базовым). + const Sprite* At(int tx, int ty) const + { + if (!Tilemap::InBounds(tx, ty)) return nullptr; + if (slotOf.empty()) return nullptr; + const int32_t s = slotOf[size_t(ty) * MAP_W + tx]; + return (s >= 0) ? &stained[size_t(s)] : nullptr; + } + + // Забрать из журнала боя всё, что кровоточит. + void Ingest(const CombatEventLog& log, const SpriteSet& sprites, const Tilemap& map); + + // Одно пятно: основная лужа + брызги по направлению удара. + void Splat(const SpriteSet& sprites, const Tilemap& map, Vec2 world, Vec2 dir, float radius, + uint32_t seed); +}; diff --git a/src/render/framebuffer.cpp b/src/render/framebuffer.cpp new file mode 100644 index 0000000..b4902e4 --- /dev/null +++ b/src/render/framebuffer.cpp @@ -0,0 +1,332 @@ +#include "render/framebuffer.h" + +#include + +#include +#include + +// ----------------------------------------------------------------------------- +// Световая рампа +// ----------------------------------------------------------------------------- +uint8_t g_shadeLut[RAMP_LEVELS][3][256]; + +const uint8_t BAYER4[4][4] = { + { 0, 8, 2, 10}, + {12, 4, 14, 6}, + { 3, 11, 1, 9}, + {15, 7, 13, 5}, +}; + +namespace +{ + +// Цвет полумрака и цвет пересвета. Между ними рампа плавно интерполирует. +constexpr float COLD[3] = {0.60f, 0.74f, 1.00f}; // холодный синий в тенях +constexpr float WARM[3] = {1.00f, 0.92f, 0.76f}; // тёплый пересвет во вспышке + +inline float Smooth01(float t) { return t * t * (3.0f - 2.0f * t); } + +struct ShadeRampInit +{ + ShadeRampInit() { BuildShadeRamp(1.35f, 1.10f); } +}; +ShadeRampInit g_rampInit; + +} // namespace + +void BuildShadeRamp(float gamma, float maxGain) +{ + for (int lvl = 0; lvl < RAMP_LEVELS; ++lvl) + { + // Ступень 0 — чистый чёрный: она обязана совпадать с цветом Clear, + // иначе невидимые тайлы нельзя пропускать при отрисовке. + if (lvl == 0) + { + for (int ch = 0; ch < 3; ++ch) + for (int v = 0; v < 256; ++v) g_shadeLut[lvl][ch][v] = 0; + continue; + } + + const float t = float(lvl) / float(RAMP_LEVELS - 1); + const float gain = std::pow(t, gamma) * maxGain; + const float mix = Smooth01(t); + + for (int ch = 0; ch < 3; ++ch) + { + const float tint = COLD[ch] + (WARM[ch] - COLD[ch]) * mix; + const float k = gain * tint; + for (int v = 0; v < 256; ++v) + { + const float out = float(v) * k; + g_shadeLut[lvl][ch][v] = uint8_t(out < 0.0f ? 0.0f : (out > 255.0f ? 255.0f : out)); + } + } + } +} + +// ----------------------------------------------------------------------------- + +void Framebuffer::Init(int width, int height) +{ + w = width; + h = height; + px.assign(size_t(w) * size_t(h), 0u); +} + +void Framebuffer::Clear(uint32_t color) +{ + std::fill(px.begin(), px.end(), color); +} + +namespace +{ +// Общая обрезка спрайта по буферу. false — рисовать нечего. +inline bool ClipSprite(const Sprite& s, int x, int y, int fbW, int fbH, int& dstX0, int& dstY0, + int& sx0, int& sy0, int& sx1, int& sy1) +{ + dstX0 = x - s.ax; + dstY0 = y - s.ay; + sx0 = std::max(0, -dstX0); + sy0 = std::max(0, -dstY0); + sx1 = std::min(s.w, fbW - dstX0); + sy1 = std::min(s.h, fbH - dstY0); + // Пустой диапазон -> выходим ДО вычисления адресов: иначе индекс уезжает + // за границы vector (Debug ловит это как "vector subscript out of range"). + return sx0 < sx1 && sy0 < sy1; +} +} // namespace + +void Framebuffer::Blit(const Sprite& s, int x, int y) +{ + int dstX0, dstY0, sx0, sy0, sx1, sy1; + if (!ClipSprite(s, x, y, w, h, dstX0, dstY0, sx0, sy0, sx1, sy1)) return; + + for (int sy = sy0; sy < sy1; ++sy) + { + const uint32_t* src = s.px.data() + size_t(sy) * s.w + sx0; + uint32_t* dst = px.data() + size_t(dstY0 + sy) * w + (dstX0 + sx0); + for (int sx = sx0; sx < sx1; ++sx, ++src, ++dst) + { + const uint32_t c = *src; + if (AlphaOf(c) != 0) *dst = c; // альфа-тест, без блендинга + } + } +} + +void Framebuffer::BlitTinted(const Sprite& s, int x, int y, uint32_t tint) +{ + int dstX0, dstY0, sx0, sy0, sx1, sy1; + if (!ClipSprite(s, x, y, w, h, dstX0, dstY0, sx0, sy0, sx1, sy1)) return; + + for (int sy = sy0; sy < sy1; ++sy) + for (int sx = sx0; sx < sx1; ++sx) + if (AlphaOf(s.px[size_t(sy) * s.w + sx]) != 0) + px[size_t(dstY0 + sy) * w + (dstX0 + sx)] = tint; +} + +void Framebuffer::BlitShaded(const Sprite& s, int x, int y, const ShadeQuad& q) +{ + int dstX0, dstY0, sx0, sy0, sx1, sy1; + if (!ClipSprite(s, x, y, w, h, dstX0, dstY0, sx0, sy0, sx1, sy1)) return; + + constexpr float MAX_LVL = float(RAMP_LEVELS - 1); + + for (int sy = sy0; sy < sy1; ++sy) + { + const float py = float(sy < q.clampRow ? sy : q.clampRow); + const float rowBase = q.a + q.c * py + q.f * py * py; + + // Прямые разности по строке: во внутреннем цикле два сложения. + const float fx0 = float(sx0); + float lit = rowBase + q.b * fx0 + q.e * fx0 * fx0; + float dl = q.b + q.e * (2.0f * fx0 + 1.0f); + const float ddl = 2.0f * q.e; + + const uint8_t* bayerRow = BAYER4[(dstY0 + sy) & 3]; + const uint32_t* src = s.px.data() + size_t(sy) * s.w + sx0; + uint32_t* dst = px.data() + size_t(dstY0 + sy) * w + (dstX0 + sx0); + + for (int sx = sx0; sx < sx1; ++sx, ++src, ++dst) + { + const uint32_t c = *src; + if (AlphaOf(c) != 0) + { + const float dither = (float(bayerRow[(dstX0 + sx) & 3]) + 0.5f) * (1.0f / 16.0f); + int lvl = int(lit * MAX_LVL + dither); + if (lvl < 0) lvl = 0; + else if (lvl >= RAMP_LEVELS) lvl = RAMP_LEVELS - 1; + if (lvl != 0) *dst = ShadePixel(c, lvl); + } + lit += dl; + dl += ddl; + } + } +} + +void Framebuffer::BlitMul(const Sprite& mask, int x, int y, uint32_t k256) +{ + int dstX0, dstY0, sx0, sy0, sx1, sy1; + if (!ClipSprite(mask, x, y, w, h, dstX0, dstY0, sx0, sy0, sx1, sy1)) return; + + for (int sy = sy0; sy < sy1; ++sy) + for (int sx = sx0; sx < sx1; ++sx) + if (AlphaOf(mask.px[size_t(sy) * mask.w + sx]) != 0) + { + uint32_t& d = px[size_t(dstY0 + sy) * w + (dstX0 + sx)]; + d = ScaleColor8(d, k256); + } +} + +void Framebuffer::FillRect(int x, int y, int rw, int rh, uint32_t c) +{ + const int x0 = std::max(0, x); + const int y0 = std::max(0, y); + const int x1 = std::min(w, x + rw); + const int y1 = std::min(h, y + rh); + for (int yy = y0; yy < y1; ++yy) + for (int xx = x0; xx < x1; ++xx) + px[size_t(yy) * w + xx] = c; +} + +void Framebuffer::Line(int x0, int y0, int x1, int y1, uint32_t c) +{ + // Брезенхем. Put сам отсекает по границам. + int dx = std::abs(x1 - x0); + int dy = -std::abs(y1 - y0); + const int sx = (x0 < x1) ? 1 : -1; + const int sy = (y0 < y1) ? 1 : -1; + int err = dx + dy; + + for (;;) + { + Put(x0, y0, c); + if (x0 == x1 && y0 == y1) break; + const int e2 = 2 * err; + if (e2 >= dy) { err += dy; x0 += sx; } + if (e2 <= dx) { err += dx; y0 += sy; } + } +} + +void Framebuffer::CircleOutline(int cx, int cy, int r, uint32_t c) +{ + int x = r; + int y = 0; + int err = 1 - r; + while (x >= y) + { + Put(cx + x, cy + y, c); Put(cx + y, cy + x, c); + Put(cx - y, cy + x, c); Put(cx - x, cy + y, c); + Put(cx - x, cy - y, c); Put(cx - y, cy - x, c); + Put(cx + y, cy - x, c); Put(cx + x, cy - y, c); + ++y; + if (err < 0) err += 2 * y + 1; + else { --x; err += 2 * (y - x) + 1; } + } +} + +void Framebuffer::CircleFilled(int cx, int cy, int r, uint32_t c) +{ + const int r2 = r * r; + for (int y = -r; y <= r; ++y) + for (int x = -r; x <= r; ++x) + if (x * x + y * y <= r2) Put(cx + x, cy + y, c); +} + +// ----------------------------------------------------------------------------- +// Аддитивные примитивы +// ----------------------------------------------------------------------------- + +void Framebuffer::AddBeam(float x0, float y0, float x1, float y1, uint32_t headCol, + uint32_t tailCol, int halo) +{ + // Отсечение по расширенному прямоугольнику кадра: длинный закадровый штрих + // не должен крутить тысячи холостых итераций. + const float pad = float(halo) + 2.0f; + if ((x0 < -pad && x1 < -pad) || (x0 > float(w) + pad && x1 > float(w) + pad)) return; + if ((y0 < -pad && y1 < -pad) || (y0 > float(h) + pad && y1 > float(h) + pad)) return; + + const float dx = x1 - x0; + const float dy = y1 - y0; + const float len = std::sqrt(dx * dx + dy * dy); + const int steps = int(len) + 1; + if (steps > 4 * (w + h)) return; // защита от вырожденных значений + + const float inv = 1.0f / float(steps); + for (int i = 0; i <= steps; ++i) + { + const float t = float(i) * inv; // 0 = хвост, 1 = голова + const float px_ = x0 + dx * t; + const float py_ = y0 + dy * t; + + // Цвет плывёт от хвоста к голове; хвост дополнительно гаснет. + const uint32_t core = AddSat(ScaleColor8(tailCol, uint32_t((1.0f - t) * 256.0f)), + ScaleColor8(headCol, uint32_t(t * 256.0f))); + const int ix = int(px_); + const int iy = int(py_); + AddPx(ix, iy, core); + + // Боковой ореол: та же линия вполсилы на соседних пикселях. + if (halo > 0) + { + const uint32_t glow = ScaleColor8(core, 96); + AddPx(ix + 1, iy, glow); + AddPx(ix - 1, iy, glow); + AddPx(ix, iy + 1, glow); + AddPx(ix, iy - 1, glow); + } + } +} + +void Framebuffer::AddGlowDisc(int cx, int cy, int radius, uint32_t color) +{ + if (radius <= 0) return; + if (cx + radius < 0 || cx - radius >= w || cy + radius < 0 || cy - radius >= h) return; + + const float inv = 1.0f / float(radius); + for (int y = -radius; y <= radius; ++y) + { + for (int x = -radius; x <= radius; ++x) + { + const float d = std::sqrt(float(x * x + y * y)) * inv; + if (d >= 1.0f) continue; + const float k = (1.0f - d) * (1.0f - d); // квадратичное затухание + AddPx(cx + x, cy + y, ScaleColor8(color, uint32_t(k * 256.0f))); + } + } +} + +// ----------------------------------------------------------------------------- + +void ScreenBlitter::Init(int width, int height) +{ + Image img = GenImageColor(width, height, BLANK); + ImageFormat(&img, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8); + + Texture2D* t = new Texture2D(LoadTextureFromImage(img)); + UnloadImage(img); + SetTextureFilter(*t, TEXTURE_FILTER_POINT); + tex = t; + texW = width; + texH = height; +} + +void ScreenBlitter::Shutdown() +{ + if (!tex) return; + Texture2D* t = static_cast(tex); + UnloadTexture(*t); + delete t; + tex = nullptr; +} + +void ScreenBlitter::Present(const Framebuffer& fb, int windowW, int windowH) const +{ + if (!tex) return; + if (fb.w != texW || fb.h != texH) return; // размер разошёлся — не грузим мусор + Texture2D* t = static_cast(tex); + UpdateTexture(*t, fb.px.data()); + + const Rectangle src = {0.0f, 0.0f, float(fb.w), float(fb.h)}; + const Rectangle dst = {0.0f, 0.0f, float(windowW), float(windowH)}; + DrawTexturePro(*t, src, dst, {0.0f, 0.0f}, 0.0f, WHITE); +} diff --git a/src/render/framebuffer.h b/src/render/framebuffer.h new file mode 100644 index 0000000..b6348c4 --- /dev/null +++ b/src/render/framebuffer.h @@ -0,0 +1,192 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Софтверный фреймбуфер: RGBA8, ручная запись пикселей. +// Ни один игровой пиксель не рисуется примитивами raylib. +// raylib используется только в ScreenBlitter — финальный блит на экран. +// +// Инварианты (нарушение любого ломает картинку молча): +// * альфа фреймбуфера всегда 255; +// * ступень 0 световой рампы даёт чистый чёрный и совпадает с цветом Clear; +// * спрайты пишутся с альфа-тестом, эффекты — аддитивно. +// ----------------------------------------------------------------------------- +#include +#include +#include + +// В памяти байты идут R,G,B,A (PIXELFORMAT_UNCOMPRESSED_R8G8B8A8), +// значит little-endian uint32 = A<<24 | B<<16 | G<<8 | R. +constexpr uint32_t RGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255) +{ + return uint32_t(r) | (uint32_t(g) << 8) | (uint32_t(b) << 16) | (uint32_t(a) << 24); +} + +constexpr uint8_t AlphaOf(uint32_t c) { return uint8_t(c >> 24); } + +// Цвет для аддитивных эффектов: альфа 0, чтобы такой цвет нельзя было случайно +// использовать как непрозрачный пиксель спрайта. +constexpr uint32_t FXC(uint8_t r, uint8_t g, uint8_t b) { return RGBA(r, g, b, 0); } + +// Сложение цветов с насыщением по каждому каналу. +inline uint32_t AddSat(uint32_t a, uint32_t b) +{ + uint32_t r = (a & 0xFFu) + (b & 0xFFu); + uint32_t g = ((a >> 8) & 0xFFu) + ((b >> 8) & 0xFFu); + uint32_t bl = ((a >> 16) & 0xFFu) + ((b >> 16) & 0xFFu); + if (r > 255u) r = 255u; + if (g > 255u) g = 255u; + if (bl > 255u) bl = 255u; + return 0xFF000000u | r | (g << 8) | (bl << 16); +} + +// Умножение цвета на коэффициент в формате 8.8 (256 == x1.0). +inline uint32_t ScaleColor8(uint32_t c, uint32_t k256) +{ + uint32_t r = ((c & 0xFFu) * k256) >> 8; + uint32_t g = (((c >> 8) & 0xFFu) * k256) >> 8; + uint32_t bl = (((c >> 16) & 0xFFu) * k256) >> 8; + if (r > 255u) r = 255u; + if (g > 255u) g = 255u; + if (bl > 255u) bl = 255u; + return 0xFF000000u | r | (g << 8) | (bl << 16); +} + +// ----------------------------------------------------------------------------- +// Световая рампа (по мотивам COLORMAP из Doom). +// +// Свет — одна скалярная величина на точку мира. Таблица переводит её в цвет: +// в полумраке картинка уходит в холодный синий, на свету нейтральна, во вспышке +// выбивается в тёплый пересвет. На пиксель остаются три выборки из таблицы +// и ноль умножений. +// ----------------------------------------------------------------------------- +constexpr int RAMP_LEVELS = 32; + +extern uint8_t g_shadeLut[RAMP_LEVELS][3][256]; + +// Перепечь таблицу. Вызывать при изменении гаммы/усиления, иначе ручки молчат. +void BuildShadeRamp(float gamma, float maxGain); + +// Упорядоченный дизеринг: 32 ступени рампы выглядят как ~200, полос не видно. +extern const uint8_t BAYER4[4][4]; + +inline uint32_t ShadePixel(uint32_t c, int lvl) +{ + const uint8_t* lr = g_shadeLut[lvl][0]; + const uint8_t* lg = g_shadeLut[lvl][1]; + const uint8_t* lb = g_shadeLut[lvl][2]; + return 0xFF000000u | uint32_t(lr[c & 0xFFu]) | (uint32_t(lg[(c >> 8) & 0xFFu]) << 8) | + (uint32_t(lb[(c >> 16) & 0xFFu]) << 16); +} + +// Билинейный патч света по спрайту: L(px,py) = a + b*px + c*py + e*px^2 + f*py^2. +// Такая форма — это ТОЧНАЯ билинейка по четырём углам ромба тайла, записанная +// в координатах спрайта; поэтому на общем ребре соседних тайлов значения +// совпадают и швов нет. +struct ShadeQuad +{ + float a = 1.0f; + float b = 0.0f; + float c = 0.0f; + float e = 0.0f; + float f = 0.0f; + // Строки ниже clampRow светятся как clampRow: вертикальные грани стены + // берут свет нижней кромки своей крыши, а не экстраполяцию квадратичного + // члена на 32 строки вниз. + int clampRow = 1 << 24; + + static ShadeQuad Flat(float level) + { + ShadeQuad q; + q.a = level; + return q; + } +}; + +// Спрайт с альфа-тестом: px[i] с alpha==0 не пишется. Блендинга нет. +// (ax, ay) — точка привязки внутри спрайта: она совмещается с экранной +// проекцией мировой позиции сущности. +struct Sprite +{ + int w = 0; + int h = 0; + int ax = 0; + int ay = 0; + std::vector px; + + void Init(int width, int height, uint32_t fill = 0) + { + w = width; + h = height; + px.assign(size_t(w) * size_t(h), fill); + } + void Set(int x, int y, uint32_t c) + { + if (unsigned(x) < unsigned(w) && unsigned(y) < unsigned(h)) px[size_t(y) * w + x] = c; + } + uint32_t Get(int x, int y) const + { + if (unsigned(x) < unsigned(w) && unsigned(y) < unsigned(h)) return px[size_t(y) * w + x]; + return 0; + } +}; + +struct Framebuffer +{ + int w = 0; + int h = 0; + std::vector px; + + void Init(int width, int height); + void Clear(uint32_t color); + + inline void Put(int x, int y, uint32_t c) + { + if (unsigned(x) < unsigned(w) && unsigned(y) < unsigned(h)) px[size_t(y) * w + x] = c; + } + + // Блит с альфа-тестом; (x, y) — куда попадёт точка привязки спрайта. + void Blit(const Sprite& s, int x, int y); + // Тот же блит, но каждый непрозрачный пиксель заменяется на tint (для силуэтов). + void BlitTinted(const Sprite& s, int x, int y, uint32_t tint); + // Блит со светом: цвет каждого пикселя проходит через рампу. + void BlitShaded(const Sprite& s, int x, int y, const ShadeQuad& q); + // Умножение фона под маской спрайта (контактные тени, лужи). + void BlitMul(const Sprite& mask, int x, int y, uint32_t k256); + + void FillRect(int x, int y, int rw, int rh, uint32_t c); + void Line(int x0, int y0, int x1, int y1, uint32_t c); + void CircleOutline(int cx, int cy, int r, uint32_t c); + void CircleFilled(int cx, int cy, int r, uint32_t c); + + // --- аддитивные примитивы для эффектов --- + + inline void AddPx(int x, int y, uint32_t c) + { + if (unsigned(x) < unsigned(w) && unsigned(y) < unsigned(h)) + { + uint32_t& d = px[size_t(y) * w + x]; + d = AddSat(d, c); + } + } + + // Светящийся штрих: яркое ядро + боковой ореол, цвет плывёт от head к tail. + void AddBeam(float x0, float y0, float x1, float y1, uint32_t headCol, uint32_t tailCol, + int halo); + // Мягкое пятно света (вспышка у дула, искра попадания). + void AddGlowDisc(int cx, int cy, int radius, uint32_t color); +}; + +// ----------------------------------------------------------------------------- +// Финальный вывод: UpdateTexture + DrawTexturePro, фильтрация POINT. +// Единственное место рендера, знающее про raylib. +// ----------------------------------------------------------------------------- +struct ScreenBlitter +{ + void Init(int width, int height); + void Shutdown(); + void Present(const Framebuffer& fb, int windowW, int windowH) const; + +private: + void* tex = nullptr; // Texture2D на куче — чтобы не тащить raylib.h в заголовок + int texW = 0; + int texH = 0; +}; diff --git a/src/render/fx.cpp b/src/render/fx.cpp new file mode 100644 index 0000000..cf1ff4b --- /dev/null +++ b/src/render/fx.cpp @@ -0,0 +1,283 @@ +#include "render/fx.h" + +#include "render/sprites.h" + +namespace +{ + +// Цвета эффектов: аддитивные, поэтому альфа 0 (см. FXC). +constexpr uint32_t COL_TRACER_TAIL = FXC(120, 70, 20); +constexpr uint32_t COL_MUZZLE = FXC(255, 225, 150); +constexpr uint32_t COL_SPARK_WALL = FXC(255, 190, 90); +constexpr uint32_t COL_SPARK_FLESH = FXC(220, 40, 40); +constexpr uint32_t COL_SPARK_KILL = FXC(255, 120, 60); +// Пурпурная искра — не украшение, а индикатор: попадание по своему. +// В норме её не должно появиться НИ РАЗУ (критерий приёмки 11.2). +constexpr uint32_t COL_SPARK_ALLY = FXC(255, 60, 255); +// Ближний бой: холодная сталь на замахе, раскалённый след на ударе. +constexpr uint32_t COL_BLADE_COLD = FXC(70, 110, 165); +constexpr uint32_t COL_BLADE_EDGE = FXC(255, 250, 235); +constexpr uint32_t COL_BLADE_TAIL = FXC(120, 165, 235); +constexpr uint32_t COL_SPARK_MELEE = FXC(255, 165, 95); +// Оборванный взмах — тусклая серая вспышка: свой влез под лезвие. +constexpr uint32_t COL_SPARK_ABORT = FXC(150, 150, 170); + +inline Vec2 ToScreen(Vec2 world, int ox, int oy, int liftPx) +{ + const Vec2 s = iso::WorldToScreen(world); + return Vec2{s.x + float(ox), s.y + float(oy) - float(liftPx)}; +} + +// Смешать два аддитивных цвета. +inline uint32_t MixFx(uint32_t a, uint32_t b, float t) +{ + const uint32_t k = uint32_t(Clampf(t, 0.0f, 1.0f) * 256.0f); + return AddSat(ScaleColor8(a, 256u - k), ScaleColor8(b, k)); +} + +// Дуга в мировых координатах, спроецированная по точкам: в изометрии круг — +// это эллипс, и рисовать его надо сэмплами, а не экранной окружностью. +// Цвет плывёт от хвоста (colFrom) к голове (colTo) — так читается направление. +void AddWorldArc(Framebuffer& fb, Vec2 center, float radius, float angFrom, float angTo, + int ox, int oy, int lift, uint32_t colFrom, uint32_t colTo, int halo) +{ + constexpr int SEG = 12; + Vec2 prev = ToScreen(center + FromAngle(angFrom) * radius, ox, oy, lift); + + for (int k = 1; k <= SEG; ++k) + { + const float t = float(k) / float(SEG); + const Vec2 cur = ToScreen(center + FromAngle(angFrom + (angTo - angFrom) * t) * radius, + ox, oy, lift); + fb.AddBeam(prev.x, prev.y, cur.x, cur.y, MixFx(colFrom, colTo, t), + MixFx(colFrom, colTo, t - 1.0f / float(SEG)), halo); + prev = cur; + } +} + +} // namespace + +void FxSystem::Reset() +{ + flashCount = 0; + sparkCount = 0; + eventCursor = 0; + shotShake = 0.0f; +} + +void FxSystem::Ingest(const CombatEventLog& log, const Agent* agents, int agentCount) +{ + uint32_t from = eventCursor; + if (log.head > from + COMBAT_EVENT_CAP) from = log.head - COMBAT_EVENT_CAP; + + for (uint32_t i = from; i < log.head; ++i) + { + const CombatEvent& e = log.buf[i % COMBAT_EVENT_CAP]; + + if (e.kind == CombatEventKind::SHOT) + { + // Вид выстрела — свойство ствола, а не события: журнал носит только + // «кто, откуда, куда», а как это выглядит, знает оружие стрелка. + const bool known = (e.owner >= 0 && e.owner < agentCount); + const FirearmDef def = known ? agents[e.owner].gun.def : FirearmDef{}; + + shotShake += def.shakePerShot; + + if (flashCount < FX_FLASH_MAX) + { + FxFlash f; + f.pos = e.pos; + f.dir = e.dir; + f.life = def.muzzleTime; + f.maxLife = def.muzzleTime; + f.radiusPx = def.muzzleRadiusPx; + f.flamePx = def.muzzleFlamePx; + f.color = FXC(def.muzzleR, def.muzzleG, def.muzzleB); + f.owner = e.owner; + flashes[flashCount++] = f; + } + continue; + } + + uint32_t col = 0; + float power = 1.0f; + switch (e.kind) + { + case CombatEventKind::HIT_WALL: col = COL_SPARK_WALL; power = 1.0f; break; + case CombatEventKind::HIT_TARGET: col = COL_SPARK_FLESH; power = 0.8f; break; + case CombatEventKind::HIT_KILL: col = COL_SPARK_KILL; power = 1.8f; break; + case CombatEventKind::HIT_ALLY: col = COL_SPARK_ALLY; power = 2.5f; break; + // Удар клинком — самое громкое событие в кадре: он всегда в упор. + case CombatEventKind::MELEE_HIT: col = COL_SPARK_MELEE; power = 2.2f; break; + case CombatEventKind::MELEE_ABORT: col = COL_SPARK_ABORT; power = 0.7f; break; + default: continue; + } + if (sparkCount < FX_SPARK_MAX) + sparks[sparkCount++] = FxSpark{e.pos, e.dir, g_tune.sparkTime, power, col}; + } + eventCursor = log.head; +} + +void FxSystem::Update(float frameDt) +{ + for (int i = 0; i < flashCount;) + { + flashes[i].life -= frameDt; + if (flashes[i].life <= 0.0f) flashes[i] = flashes[--flashCount]; + else ++i; + } + for (int i = 0; i < sparkCount;) + { + sparks[i].life -= frameDt; + if (sparks[i].life <= 0.0f) sparks[i] = sparks[--sparkCount]; + else ++i; + } +} + +void FxSystem::Draw(Framebuffer& fb, const std::vector& bullets, int ox, int oy, + float alpha) const +{ + const int lift = int(g_tune.bulletLiftPx); + const uint32_t inten = uint32_t(Clampf(g_tune.fxIntensity, 0.0f, 4.0f) * 256.0f); + + // --- трассеры ------------------------------------------------------------ + // Длина и цвет штриха приехали вместе со снарядом: у пистолета трассер + // короче и теплее, чем у карабина, и это видно без единой подписи. + for (const Bullet& b : bullets) + { + // Голова — интерполированная позиция кадра, хвост — на tracerLength + // назад по вектору движения, но не дальше точки вылета. + const Vec2 head = Lerp(b.prevPos, b.pos, alpha); + const Vec2 dir = Normalized(b.vel); + const float flown = Distance(b.origin, head); + const float tailLen = std::min(b.tracerLength, flown); + const Vec2 tail = head - dir * tailLen; + + const Vec2 hs = ToScreen(head, ox, oy, lift); + const Vec2 ts = ToScreen(tail, ox, oy, lift); + + const uint32_t headCol = ScaleColor8(FXC(b.tracerR, b.tracerG, b.tracerB), inten); + fb.AddBeam(ts.x, ts.y, hs.x, hs.y, headCol, ScaleColor8(COL_TRACER_TAIL, inten), 1); + // Само тело пули — яркая точка на голове штриха. + fb.AddGlowDisc(int(hs.x), int(hs.y), 2, headCol); + } + + // --- вспышки у дула ------------------------------------------------------ + for (int i = 0; i < flashCount; ++i) + { + const FxFlash& f = flashes[i]; + const float t = Clampf(f.life / std::max(0.001f, f.maxLife), 0.0f, 1.0f); + const float amp = t * t; + + const Vec2 s = ToScreen(f.pos, ox, oy, lift); + const uint32_t c = ScaleColor8(f.color ? f.color : COL_MUZZLE, + uint32_t(amp * float(inten))); + + fb.AddGlowDisc(int(s.x), int(s.y), int(f.radiusPx * amp) + 1, c); + // Короткий язык пламени по направлению выстрела. + const Vec2 tip = ToScreen(f.pos + f.dir * f.flamePx, ox, oy, lift); + fb.AddBeam(s.x, s.y, tip.x, tip.y, c, ScaleColor8(c, 128), 1); + } + + // --- искры попаданий ------------------------------------------------------ + for (int i = 0; i < sparkCount; ++i) + { + const FxSpark& sp = sparks[i]; + const float t = Clampf(sp.life / std::max(0.001f, g_tune.sparkTime), 0.0f, 1.0f); + const float amp = t * t * sp.power; + + const Vec2 s = ToScreen(sp.pos, ox, oy, lift); + const uint32_t c = ScaleColor8(sp.color, uint32_t(amp * float(inten))); + fb.AddGlowDisc(int(s.x), int(s.y), int(g_tune.sparkRadiusPx * amp) + 1, c); + + // Разлёт осколков назад от направления удара — детерминированно по индексу. + const int shards = 4; + for (int k = 0; k < shards; ++k) + { + const float ang = AngleOf(sp.dir) + PI_F + (float(k) - 1.5f) * 0.5f; + const float len = (1.0f - t) * 0.45f; + const Vec2 e = ToScreen(sp.pos + FromAngle(ang) * len, ox, oy, lift); + fb.AddBeam(s.x, s.y, e.x, e.y, c, 0u, 0); + } + } +} + +void DrawMeleeArcs(Framebuffer& fb, const Agent* agents, int count, int ox, int oy, float alpha) +{ + const int lift = int(g_tune.bladeLiftPx); + const uint32_t inten = uint32_t(Clampf(g_tune.fxIntensity, 0.0f, 4.0f) * 256.0f); + + for (int i = 0; i < count; ++i) + { + const Agent& a = agents[i]; + if (!a.IsMelee()) continue; + + const MeleeWeapon& m = a.melee; + if (m.state == MeleeState::IDLE) continue; + + const Vec2 p = Lerp(a.prevPos, a.pos, alpha); + const float half = m.HalfArc(); + const float start = WrapPi(m.dir - m.sweepSign * half); // откуда заходит лезвие + + if (m.state == MeleeState::WINDUP) + { + // Телеграф: клинок уводится НАЗАД за край сектора и разгорается. + // Игрок обязан успеть прочитать замах — иначе удар бьёт «из ниоткуда» + // и ощущается не как удар, а как случайное списание HP. + const float t = m.Progress(); + const float back = WrapPi(start - m.sweepSign * (0.4f * half * t)); + const uint32_t c = ScaleColor8(COL_BLADE_COLD, uint32_t(inten * (0.2f + 0.8f * t))); + + const Vec2 near_ = ToScreen(p + FromAngle(back) * (m.reach * 0.40f), ox, oy, lift); + const Vec2 far_ = ToScreen(p + FromAngle(back) * (m.reach * 0.95f), ox, oy, lift); + + AddWorldArc(fb, p, m.reach * 0.9f, start, back, ox, oy, lift, 0u, c, 0); + fb.AddBeam(near_.x, near_.y, far_.x, far_.y, c, ScaleColor8(c, 64), 0); + fb.AddGlowDisc(int(far_.x), int(far_.y), 1 + int(2.0f * t), c); + continue; + } + + // STRIKE и RECOVER рисуются одним серпом: в ударе он растёт до текущего + // угла лезвия, после удара — стоит на месте и гаснет. + float prog = 1.0f; + float fade = 1.0f; + if (m.state == MeleeState::STRIKE) + { + prog = m.Progress(); + } + else + { + // Затухание быстрое: след клинка не должен висеть до следующего замаха. + fade = 1.0f - Clampf(m.Progress() * 2.2f, 0.0f, 1.0f); + if (fade <= 0.0f) continue; + } + + const float bladeAng = m.BladeAngleAt(prog); + // Хвост — не весь пройденный путь, а его доля: серп, а не кольцо. + const float tailProg = std::max(0.0f, prog - g_tune.bladeTrailFrac); + const float tailAng = m.BladeAngleAt(tailProg); + + const uint32_t k = uint32_t(inten * fade); + + // Серп набирается слоями концентрических дуг: внешний край раскалён, + // внутренние тускнеют к рукояти. На 480x270 одна линия читается палкой, + // а четыре — взмахом. + constexpr int LAYERS = 4; + for (int l = 0; l < LAYERS; ++l) + { + const float f = float(l) / float(LAYERS - 1); + const float rr = m.reach * Lerpf(0.42f, 1.02f, f); + const uint32_t hot = ScaleColor8(COL_BLADE_EDGE, uint32_t(k * (0.25f + 0.75f * f))); + const uint32_t cold = ScaleColor8(COL_BLADE_TAIL, uint32_t(k * 0.18f * (0.4f + f))); + AddWorldArc(fb, p, rr, tailAng, bladeAng, ox, oy, lift, cold, hot, + (l == LAYERS - 1) ? 1 : 0); + } + + // Само лезвие: раскалённая радиальная черта на голове серпа. + const Vec2 inner = ToScreen(p + FromAngle(bladeAng) * (m.reach * 0.38f), ox, oy, lift); + const Vec2 tip = ToScreen(p + FromAngle(bladeAng) * (m.reach * 1.04f), ox, oy, lift); + const uint32_t edge = ScaleColor8(COL_BLADE_EDGE, k); + fb.AddBeam(inner.x, inner.y, tip.x, tip.y, edge, ScaleColor8(COL_BLADE_TAIL, k / 2u), 1); + fb.AddGlowDisc(int(tip.x), int(tip.y), 3, edge); + } +} diff --git a/src/render/fx.h b/src/render/fx.h new file mode 100644 index 0000000..8d2a40b --- /dev/null +++ b/src/render/fx.h @@ -0,0 +1,75 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Визуал стрельбы: трассеры, вспышки у дула, искры попаданий. +// Render-only. Физику пули не трогает вообще — снаряд по-прежнему летит ровно +// по проверенному отрезку, правило «не стрелять сквозь своих» не задето. +// +// Из чего состоит трассер (как это выглядит в CS2, перенесённое на 480x270): +// * вытянутый штрих вдоль вектора движения, а не точка; +// * яркое ядро + тусклый боковой ореол, затухание к хвосту; +// * короткая вспышка у дула в момент выстрела; +// * искра в точке попадания, разная для стены и для цели. +// ----------------------------------------------------------------------------- +#include "core/math.h" +#include "render/framebuffer.h" +#include "render/iso.h" +#include "sim/agent.h" +#include "sim/bullet.h" +#include "sim/events.h" + +constexpr int FX_FLASH_MAX = 32; +constexpr int FX_SPARK_MAX = 64; + +struct FxFlash // вспышка у дула +{ + Vec2 pos{}; + Vec2 dir{}; + float life = 0.0f; + float maxLife = 0.07f; // всё, что описывает вид выстрела, приезжает + float radiusPx = 5.0f; // с оружия стрелявшего: у пистолета вспышка мельче + float flamePx = 0.35f; + uint32_t color = 0; + int owner = 0; +}; + +struct FxSpark // искра попадания +{ + Vec2 pos{}; + Vec2 dir{}; + float life = 0.0f; + float power = 1.0f; + uint32_t color = 0; +}; + +struct FxSystem +{ + FxFlash flashes[FX_FLASH_MAX]; + int flashCount = 0; + FxSpark sparks[FX_SPARK_MAX]; + int sparkCount = 0; + uint32_t eventCursor = 0; + + // Отдача камеры за кадр: считается здесь, потому что только здесь известно, + // из ЧЕГО стреляли. Потребитель (Dread) забирает и обнуляет. + float shotShake = 0.0f; + + void Reset(); + // agents нужны ровно для одного: взять визуал выстрела с оружия стрелка. + void Ingest(const CombatEventLog& log, const Agent* agents, int agentCount); + void Update(float frameDt); + + // Рисуется ПОСЛЕ сортированной сцены и ДО пост-прохода: эффекты светятся + // поверх геометрии, но подчиняются общей цветокоррекции кадра. + void Draw(Framebuffer& fb, const std::vector& bullets, int ox, int oy, float alpha) const; +}; + +// Дуга замаха и удара. Читается ПРЯМО из состояния агентов, а не из журнала: +// фаза живёт десятые доли секунды, её видно в каждом кадре, и привязка к живой +// позиции бойца важнее — он в момент удара едет вперёд рывком. +// +// Что рисуется: +// WINDUP — холодная тонкая дуга у дальнего края сектора, разгорается; +// STRIKE — раскалённый серп от начала взмаха до текущего угла лезвия; +// RECOVER — то, что осталось от серпа, гаснет. +void DrawMeleeArcs(Framebuffer& fb, const Agent* agents, int count, int ox, int oy, float alpha); + diff --git a/src/render/iso.h b/src/render/iso.h new file mode 100644 index 0000000..4591360 --- /dev/null +++ b/src/render/iso.h @@ -0,0 +1,93 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Изометрия существует ТОЛЬКО здесь и в рендере. Симуляция, ИИ и коллизии +// работают в декартовом мире (top-down) и об этом файле не знают. +// +// sx = (wx - wy) * 16 +// sy = (wx + wy) * 8 +// ----------------------------------------------------------------------------- +#include +#include + +#include "core/math.h" +#include "render/framebuffer.h" +#include "tuning.h" + +namespace iso +{ + +inline Vec2 WorldToScreen(Vec2 w) +{ + return {(w.x - w.y) * float(TILE_HALF_W), (w.x + w.y) * float(TILE_HALF_H)}; +} + +inline Vec2 ScreenToWorld(Vec2 s) +{ + const float a = s.x / float(TILE_W); // = (wx - wy) / 2 + const float b = s.y / float(TILE_H); // = (wx + wy) / 2 + return {b + a, b - a}; +} + +// Ключ сортировки по глубине: чем больше, тем «ближе к камере». +inline float Depth(Vec2 w) { return w.x + w.y; } + +// Направление в ЭКРАННЫХ осях -> направление в мире (WASD, спек 5). +inline Vec2 ScreenDirToWorld(Vec2 screenDir) +{ + return Normalized(ScreenToWorld(screenDir)); +} + +// Камера следует за якорем со сглаживанием; смещение округляется до пикселя. +struct Camera +{ + Vec2 pos{}; + bool snapped = false; + + void SnapTo(Vec2 target) { pos = target; snapped = true; } + + void Follow(Vec2 target, float dt, float smooth) + { + if (!snapped) { SnapTo(target); return; } + const float k = 1.0f - std::exp(-smooth * dt); + pos = Lerp(pos, target, k); + } + + void ScreenOffset(int& ox, int& oy) const + { + const Vec2 c = WorldToScreen(pos); + ox = int(std::lround(INTERNAL_W * 0.5f - c.x)); + oy = int(std::lround(INTERNAL_H * 0.5f - c.y)); + } +}; + +// Один элемент списка отрисовки: и стены, и сущности идут в общий список. +struct DrawItem +{ + float depth = 0.0f; + const Sprite* spr = nullptr; + int x = 0; + int y = 0; + uint32_t tint = 0; + bool hasTint = false; // явный флаг: RGBA(0,0,0,0) — легальный цвет + bool shaded = false; // рисовать через световую рампу + ShadeQuad quad{}; +}; + +inline void SortByDepth(std::vector& items) +{ + std::stable_sort(items.begin(), items.end(), + [](const DrawItem& a, const DrawItem& b) { return a.depth < b.depth; }); +} + +inline void FlushDrawList(Framebuffer& fb, const std::vector& items) +{ + for (const DrawItem& it : items) + { + if (!it.spr) continue; + if (it.hasTint) fb.BlitTinted(*it.spr, it.x, it.y, it.tint); + else if (it.shaded) fb.BlitShaded(*it.spr, it.x, it.y, it.quad); + else fb.Blit(*it.spr, it.x, it.y); + } +} + +} // namespace iso diff --git a/src/render/lighting.cpp b/src/render/lighting.cpp new file mode 100644 index 0000000..6d7bfe4 --- /dev/null +++ b/src/render/lighting.cpp @@ -0,0 +1,282 @@ +#include "render/lighting.h" + +namespace +{ + +inline float Smooth01(float t) +{ + if (t <= 0.0f) return 0.0f; + if (t >= 1.0f) return 1.0f; + return t * t * (3.0f - 2.0f * t); +} + +// Плавное падение с 1 до 0 на отрезке [lo, hi]. +inline float FadeOut(float x, float lo, float hi) +{ + if (hi <= lo) return x <= lo ? 1.0f : 0.0f; + return 1.0f - Smooth01((x - lo) / (hi - lo)); +} + +} // namespace + +void Lighting::Reset() +{ + for (int i = 0; i < MAP_W * MAP_H; ++i) + { + vis[i] = 0.0f; + mem[i] = 0.0f; + dyn[i] = 0.0f; + tile[i] = 0.0f; + } + for (int i = 0; i < (MAP_W + 1) * (MAP_H + 1); ++i) corner[i] = 0.0f; + flashCount = 0; + eventCursor = 0; +} + +void Lighting::Ingest(const CombatEventLog& log, const Agent* agents, int agentCount) +{ + // Кольцо: если за кадр событий больше ёмкости, старые честно потеряны. + uint32_t from = eventCursor; + if (log.head > from + COMBAT_EVENT_CAP) from = log.head - COMBAT_EVENT_CAP; + + for (uint32_t i = from; i < log.head; ++i) + { + const CombatEvent& e = log.buf[i % COMBAT_EVENT_CAP]; + + // Параметры вспышки берутся с оружия стрелявшего, если оно известно. + const bool ownerKnown = (e.owner >= 0 && e.owner < agentCount); + const float ownPower = ownerKnown ? agents[e.owner].gun.def.flashPower : g_tune.flashPower; + const float ownRadius = ownerKnown ? agents[e.owner].gun.def.flashRadius : g_tune.flashRadius; + + float power = 0.0f; + switch (e.kind) + { + case CombatEventKind::SHOT: power = ownPower; break; + case CombatEventKind::HIT_WALL: power = g_tune.flashPower * 0.45f; break; + case CombatEventKind::HIT_TARGET: power = g_tune.flashPower * 0.35f; break; + case CombatEventKind::HIT_KILL: power = g_tune.flashPower * 0.9f; break; + // Клинок не даёт дульной вспышки, но искры от удара в упор освещают + // не хуже — иначе весь ближний бой идёт в кромешной темноте. + case CombatEventKind::MELEE_SWING: power = g_tune.flashPower * 0.22f; break; + case CombatEventKind::MELEE_HIT: power = g_tune.flashPower * 0.75f; break; + default: break; + } + if (power <= 0.0f) continue; + + if (flashCount < LIGHT_FLASH_MAX) + flashes[flashCount++] = LightFlash{e.pos, power, g_tune.flashTime, + (e.kind == CombatEventKind::SHOT) + ? ownRadius : g_tune.flashRadius}; + } + eventCursor = log.head; +} + +void Lighting::Update(const Agent* agents, int count, const Tilemap& map, float dt) +{ + static float visRaw[MAP_W * MAP_H]; + + if (!enabled) + { + // Аварийный тумблер: всё видно, память полная, вспышек нет. + for (int i = 0; i < MAP_W * MAP_H; ++i) { vis[i] = 1.0f; mem[i] = 1.0f; dyn[i] = 0.0f; } + for (int i = 0; i < MAP_W * MAP_H; ++i) tile[i] = 1.0f; + for (int cy = 0; cy <= MAP_H; ++cy) + for (int cx = 0; cx <= MAP_W; ++cx) corner[cy * (MAP_W + 1) + cx] = 1.0f; + return; + } + + for (int i = 0; i < MAP_W * MAP_H; ++i) visRaw[i] = 0.0f; + + // --- 1. видимость пола от каждого агента --------------------------------- + const float rFull = g_tune.sightFullRadius; + const float rMax = std::max(rFull + 0.01f, g_tune.sightRadius); + const float coneHalf = g_tune.sightConeDeg * 0.5f * DEG2RAD_F; + const float coneSoft = g_tune.sightConeSoftDeg * DEG2RAD_F; + const float personal = g_tune.sightPersonalRadius; + + for (int a = 0; a < count; ++a) + { + const Agent& ag = agents[a]; + const int x0 = std::max(0, int(std::floor(ag.pos.x - rMax))); + const int x1 = std::min(MAP_W - 1, int(std::floor(ag.pos.x + rMax))); + const int y0 = std::max(0, int(std::floor(ag.pos.y - rMax))); + const int y1 = std::min(MAP_H - 1, int(std::floor(ag.pos.y + rMax))); + + for (int ty = y0; ty <= y1; ++ty) + { + for (int tx = x0; tx <= x1; ++tx) + { + if (map.IsWall(tx, ty)) continue; // стены освещаются отдельно + + const Vec2 c{tx + 0.5f, ty + 0.5f}; + const Vec2 d = c - ag.pos; + const float dist = Length(d); + if (dist > rMax) continue; + + const float fd = FadeOut(dist, rFull, rMax); + if (fd <= 0.0f) continue; + + // Конус по направлению взгляда + круговой «личный» ореол рядом. + // max, а не сумма: ореол дырявит конус вблизи, но не удваивает свет. + const float ang = std::fabs(AngleDiff(ag.facing, AngleOf(d))); + const float fc = FadeOut(ang, coneHalf, coneHalf + coneSoft); + const float fp = FadeOut(dist, personal * 0.6f, personal); + const float v = fd * std::max(fc, fp); + if (v <= 0.0f) continue; + + const int idx = ty * MAP_W + tx; + if (v <= visRaw[idx]) continue; // уже ярче — рейкаст не нужен + if (map.RaycastBlocked(ag.pos, c)) continue; // стена перекрыла обзор + visRaw[idx] = v; + } + } + } + + // --- 2. свет протекает в стены ------------------------------------------ + // Стену нельзя проверить лучом до её центра: DDA считает попадание в саму + // стену перекрытием. Поэтому стена берёт максимум от соседей. + for (int pass = 0; pass < WALL_LIGHT_PASSES; ++pass) + { + for (int ty = 0; ty < MAP_H; ++ty) + { + for (int tx = 0; tx < MAP_W; ++tx) + { + if (!map.IsWall(tx, ty)) continue; + float best = 0.0f; + for (int oy = -1; oy <= 1; ++oy) + for (int ox = -1; ox <= 1; ++ox) + { + if (ox == 0 && oy == 0) continue; + const int nx = tx + ox, ny = ty + oy; + if (!Tilemap::InBounds(nx, ny)) continue; + best = std::max(best, visRaw[ny * MAP_W + nx]); + } + const int idx = ty * MAP_W + tx; + visRaw[idx] = std::max(visRaw[idx], best * g_tune.fogWallBleed); + } + } + } + + // --- 3. временное сглаживание, чтобы свет не щёлкал ---------------------- + const float k = 1.0f - std::exp(-g_tune.fogFadeRate * dt); + for (int i = 0; i < MAP_W * MAP_H; ++i) + vis[i] += (visRaw[i] - vis[i]) * k; + + // --- 4. динамический свет от вспышек ------------------------------------- + for (int i = 0; i < MAP_W * MAP_H; ++i) dyn[i] = 0.0f; + + for (int i = 0; i < flashCount;) + { + LightFlash& f = flashes[i]; + f.life -= dt; + if (f.life <= 0.0f) + { + flashes[i] = flashes[--flashCount]; + continue; + } + + const float t = Clampf(f.life / std::max(0.001f, g_tune.flashTime), 0.0f, 1.0f); + const float amp = f.power * t * t; // резкий спад, вспышка короткая + const float rad = f.radius; + + const int x0 = std::max(0, int(std::floor(f.pos.x - rad))); + const int x1 = std::min(MAP_W - 1, int(std::floor(f.pos.x + rad))); + const int y0 = std::max(0, int(std::floor(f.pos.y - rad))); + const int y1 = std::min(MAP_H - 1, int(std::floor(f.pos.y + rad))); + + for (int ty = y0; ty <= y1; ++ty) + for (int tx = x0; tx <= x1; ++tx) + { + const Vec2 c{tx + 0.5f, ty + 0.5f}; + const float dist = Distance(f.pos, c); + if (dist > rad) continue; + const float fall = FadeOut(dist, rad * 0.15f, rad); + if (fall <= 0.0f) continue; + // Вспышка не светит сквозь стены (сама стена подсвечивается). + if (!map.IsWall(tx, ty) && map.RaycastBlocked(f.pos, c)) continue; + const int idx = ty * MAP_W + tx; + dyn[idx] = std::max(dyn[idx], amp * fall); + } + ++i; + } + + // --- 5. память карты и сборка итогового уровня --------------------------- + for (int i = 0; i < MAP_W * MAP_H; ++i) + { + const float seen = vis[i]; + if (seen > 0.02f) mem[i] = std::max(mem[i], g_tune.fogMemoryLevel); + + float lvl = std::max(mem[i], seen * g_tune.sightBrightness) + dyn[i]; + tile[i] = Clampf(lvl, 0.0f, 1.0f); + } + + // --- 6. узловая сетка: узел = среднее смежных тайлов ---------------------- + for (int cy = 0; cy <= MAP_H; ++cy) + { + for (int cx = 0; cx <= MAP_W; ++cx) + { + float sum = 0.0f; + int n = 0; + for (int oy = -1; oy <= 0; ++oy) + for (int ox = -1; ox <= 0; ++ox) + { + const int tx = cx + ox, ty = cy + oy; + if (!Tilemap::InBounds(tx, ty)) continue; + sum += tile[ty * MAP_W + tx]; + ++n; + } + corner[cy * (MAP_W + 1) + cx] = (n > 0) ? (sum / float(n)) : 0.0f; + } + } +} + +float Lighting::LightAt(Vec2 world) const +{ + const float fx = Clampf(world.x, 0.0f, float(MAP_W) - 0.001f); + const float fy = Clampf(world.y, 0.0f, float(MAP_H) - 0.001f); + const int cx = int(fx); + const int cy = int(fy); + const float u = fx - float(cx); + const float v = fy - float(cy); + + const int stride = MAP_W + 1; + const float c00 = corner[cy * stride + cx]; + const float c10 = corner[cy * stride + cx + 1]; + const float c01 = corner[(cy + 1) * stride + cx]; + const float c11 = corner[(cy + 1) * stride + cx + 1]; + + return c00 * (1 - u) * (1 - v) + c10 * u * (1 - v) + c01 * (1 - u) * v + c11 * u * v; +} + +float Lighting::MaxCornerOf(int tx, int ty) const +{ + if (!Tilemap::InBounds(tx, ty)) return 0.0f; + const int stride = MAP_W + 1; + const float c00 = corner[ty * stride + tx]; + const float c10 = corner[ty * stride + tx + 1]; + const float c01 = corner[(ty + 1) * stride + tx]; + const float c11 = corner[(ty + 1) * stride + tx + 1]; + return std::max(std::max(c00, c10), std::max(c01, c11)); +} + +ShadeQuad Lighting::QuadFor(int tx, int ty, int clampRow) const +{ + const int stride = MAP_W + 1; + const float c00 = corner[ty * stride + tx]; // верх ромба, спрайт (16,0) + const float c10 = corner[ty * stride + tx + 1]; // право, спрайт (32,8) + const float c01 = corner[(ty + 1) * stride + tx]; // лево, спрайт (0,8) + const float c11 = corner[(ty + 1) * stride + tx + 1]; // низ, спрайт (16,16) + + const float Bu = c10 - c00; + const float Bv = c01 - c00; + const float K = c00 - c10 - c01 + c11; + + ShadeQuad q; + q.a = c00 - (Bu - Bv) * 0.5f - K * 0.25f; + q.b = (Bu - Bv + K) / float(TILE_W); + q.c = (Bu + Bv) / float(TILE_H); + q.e = -K / float(TILE_W * TILE_W); + q.f = K / float(TILE_H * TILE_H); + q.clampRow = clampRow; + return q; +} diff --git a/src/render/lighting.h b/src/render/lighting.h new file mode 100644 index 0000000..be5774f --- /dev/null +++ b/src/render/lighting.h @@ -0,0 +1,81 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Свет и туман войны. Render-only: симуляция об этом модуле не знает вообще, +// ИИ и стрельба работают как работали (спек 6 не тронут). +// +// Почему свет НЕ делается пост-проходом по пикселям: +// спрайт стены имеет привязку ay = TILE_HALF_H + TILE_H = 24, то есть верхняя +// грань поднята на 16 px над ромбом своего тайла. Экранный пиксель крыши, +// прогнанный обратно через iso::ScreenToWorld, даёт ScreenToWorld(0,-16) = +// ровно (-1,-1) тайла, то есть СОСЕДНИЙ тайл на северо-запад. Пост-проход +// осветил бы крыши чужой видимостью: чёрные крыши на освещённых стенах. +// Поэтому свет вплавляется в блит спрайта: спрайт целиком светится от СВОЕГО +// тайла, и артефакт исчезает конструктивно. +// +// Три состояния области: +// никогда не видели -> ступень 0 рампы (чистый чёрный, тайл не рисуется); +// видели раньше -> тускло и холодно, сущности не показываются; +// видно сейчас -> нормальная яркость; +// вспышка выстрела -> верх рампы, тёплый пересвет. +// ----------------------------------------------------------------------------- +#include "core/math.h" +#include "render/framebuffer.h" +#include "sim/agent.h" +#include "sim/events.h" +#include "tuning.h" +#include "world/tilemap.h" + +// Свет протекает вглубь блока стен: разделитель y=13..15 толщиной 3 тайла иначе +// остаётся чёрным изнутри, и его южная грань висит в пустоте. +constexpr int WALL_LIGHT_PASSES = 3; +constexpr int LIGHT_FLASH_MAX = 24; + +struct LightFlash +{ + Vec2 pos{}; + float power = 0.0f; + float life = 0.0f; + float radius = 4.0f; // свой у каждого ствола: пистолет светит мельче +}; + +struct Lighting +{ + float vis[MAP_W * MAP_H] = {}; // сглаженная текущая видимость + float mem[MAP_W * MAP_H] = {}; // память карты + float dyn[MAP_W * MAP_H] = {}; // динамический свет (вспышки) + float tile[MAP_W * MAP_H] = {}; // итоговый уровень на тайл + float corner[(MAP_W + 1) * (MAP_H + 1)] = {}; // узловая сетка для билинейки + + LightFlash flashes[LIGHT_FLASH_MAX]; + int flashCount = 0; + uint32_t eventCursor = 0; + + bool enabled = true; // F5 — аварийно выключить туман целиком + + void Reset(); + + // Забрать вспышки из журнала боя (то, что накопилось за кадр). + // agents нужны, чтобы взять параметры вспышки с оружия стрелявшего: + // у пистолета она мельче и холоднее, чем у карабина. + void Ingest(const CombatEventLog& log, const Agent* agents, int agentCount); + + // Пересчитать поле света. agents/count — только чтение. + void Update(const Agent* agents, int count, const Tilemap& map, float dt); + + // Уровень света в мировой точке (для сущностей: они светятся от своей + // позиции, а не от того, что под ними на экране). + float LightAt(Vec2 world) const; + + // Патч света для тайла: точная билинейка по четырём углам его ромба. + ShadeQuad QuadFor(int tx, int ty, int clampRow) const; + + // Максимум по четырём углам: если он ниже ступени 1 рампы, тайл рисовать + // не нужно — результат пиксель-в-пиксель совпадёт с цветом очистки. + float MaxCornerOf(int tx, int ty) const; + + float TileLevel(int tx, int ty) const + { + if (!Tilemap::InBounds(tx, ty)) return 0.0f; + return tile[ty * MAP_W + tx]; + } +}; diff --git a/src/render/noise.h b/src/render/noise.h new file mode 100644 index 0000000..20703d0 --- /dev/null +++ b/src/render/noise.h @@ -0,0 +1,13 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Псевдослучайность рендера. +// +// Сами функции живут в core/hash.h: они понадобились и симуляции (разброс +// выстрела считается детерминированным хешем от номера выстрела, а не +// генератором). Здесь остался только вход для рендера, чтобы не расползались +// включения: зерно, дрожание, пепел и вспышки берут «случайность» отсюда. +// +// Состояния нет ни у кого: значение зависит только от аргументов (координата, +// номер кадра), общего генератора нет и синхронизировать нечего. +// ----------------------------------------------------------------------------- +#include "core/hash.h" diff --git a/src/render/post.cpp b/src/render/post.cpp new file mode 100644 index 0000000..57deae5 --- /dev/null +++ b/src/render/post.cpp @@ -0,0 +1,279 @@ +#include "render/post.h" + +#include + +#include "render/noise.h" +#include "tuning.h" + +// ----------------------------------------------------------------------------- +// Dread +// ----------------------------------------------------------------------------- + +void Dread::Reset() +{ + level = 0.0f; + heartPhase = 0.0f; + shake = 0.0f; + pulse = 0.0f; +} + +void Dread::Update(const DreadInput& in, float frameDt) +{ + // Чего боимся: близкая мишень, близкая НЕВИДИМАЯ мишень (страшнее всего), + // толпа, и отсутствие огневых линий — отряд слеп и беспомощен. + const float r = std::max(0.5f, g_tune.dreadRadius); + const float near_ = Clampf(1.0f - in.nearestTargetDist / r, 0.0f, 1.0f); + const float unseen = Clampf(1.0f - in.nearestUnseenDist / r, 0.0f, 1.0f); + const float crowd = Clampf(float(in.targetsNear) / 4.0f, 0.0f, 1.0f); + const float blind = 1.0f - Clampf(float(in.agentsWithLane) / float(NUM_AGENTS), 0.0f, 1.0f); + + float target = Clampf(0.45f * near_ + 0.75f * unseen + 0.25f * crowd + 0.30f * blind, + 0.0f, 1.0f); + if (in.friendlyDelta > 0) target = 1.0f; // попали по своему — максимум + + // Асимметрия: страх набегает быстро, отпускает медленно. + const float rate = (target > level) ? g_tune.dreadAttack : g_tune.dreadRelease; + level += (target - level) * (1.0f - std::exp(-rate * frameDt)); + level = Clampf(level, 0.0f, 1.0f); + + // Сердцебиение «туп-туп»: частота растёт с напряжением. + const float bpm = Lerpf(g_tune.heartBpmCalm, g_tune.heartBpmTense, level); + heartPhase += frameDt * (bpm / 60.0f); + if (heartPhase >= 1.0f) heartPhase -= std::floor(heartPhase); + + // Отдача от выстрелов и вспышка тона. + if (in.shotsDelta > 0) + { + // Отдача пришла посчитанной по стволам (render/fx.cpp): пистолет трясёт + // кадр слабее карабина. Если её почему-то нет — общий множитель. + const float kick = (in.shotShake > 0.0f) ? in.shotShake + : g_tune.shakePerShot * float(in.shotsDelta); + shake = std::min(g_tune.shakeMax, shake + kick); + pulse = std::min(1.0f, pulse + 0.25f * float(in.shotsDelta)); + } + if (in.killsDelta > 0) shake = std::min(g_tune.shakeMax, shake + g_tune.shakePerShot * 2.0f); + + // Удар клинком трясёт кадр сильнее выстрела: он всегда в упор, и вес + // попадания — единственное, чем ближний бой отличается от размахивания. + if (in.meleeHitsDelta > 0) + { + shake = std::min(g_tune.shakeMax, shake + g_tune.meleeShake * float(in.meleeHitsDelta)); + pulse = std::min(1.0f, pulse + 0.35f * float(in.meleeHitsDelta)); + } + + shake *= std::exp(-g_tune.shakeDecay * frameDt); + pulse *= std::exp(-6.0f * frameDt); +} + +void Dread::CameraOffset(uint32_t frame, int& dx, int& dy) const +{ + // Отдача — детерминированный хеш от номера кадра, без общего генератора. + const float amp = shake; + if (amp < 0.05f) { dx = 0; dy = 0; return; } + dx = int(std::lround(HashSigned(Hash2(frame, 11u)) * amp)); + dy = int(std::lround(HashSigned(Hash2(frame, 29u)) * amp)); +} + +// ----------------------------------------------------------------------------- +// PostFx +// ----------------------------------------------------------------------------- + +namespace +{ + +// Гладкая ступенька для интерполяции шума. +inline float SmoothStep01(float t) { return t * t * (3.0f - 2.0f * t); } + +// Значение шума в точке решётки с билинейной интерполяцией. +float LatticeValue(float x, float y) +{ + const float fx = std::floor(x); + const float fy = std::floor(y); + const int xi = int(fx); + const int yi = int(fy); + const float tx = SmoothStep01(x - fx); + const float ty = SmoothStep01(y - fy); + + const float a = Hash01(Hash2(uint32_t(xi + 8192), uint32_t(yi + 8192))); + const float b = Hash01(Hash2(uint32_t(xi + 8193), uint32_t(yi + 8192))); + const float c = Hash01(Hash2(uint32_t(xi + 8192), uint32_t(yi + 8193))); + const float d = Hash01(Hash2(uint32_t(xi + 8193), uint32_t(yi + 8193))); + + return Lerpf(Lerpf(a, b, tx), Lerpf(c, d, tx), ty); +} + +} // namespace + +void PostFx::Init(int w, int h) +{ + vigD.assign(size_t(w) * size_t(h), 0); + + hazeW = w / HAZE_CELL + 2; + hazeH = h / HAZE_CELL + 2; + hazeGrid.assign(size_t(hazeW) * size_t(hazeH), 0); + + const float cx = float(w) * 0.5f; + const float cy = float(h) * 0.5f; + const float norm = 1.0f / std::sqrt(cx * cx + cy * cy); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const float dx = (float(x) - cx); + const float dy = (float(y) - cy) * 1.15f; // экран шире, чем выше + const float d = std::sqrt(dx * dx + dy * dy) * norm; // 0 в центре, ~1 в углу + vigD[size_t(y) * w + x] = uint8_t(Clampf(d, 0.0f, 1.0f) * 255.0f); + } + } +} + +// Два октава шума по узлам сетки. Клубы сносит вбок и медленно перемешивает — +// это и есть «пыль в воздухе»: не текстура и не частицы, а неоднородность +// объёма, которую видно только там, где есть чему подсвечиваться. +void PostFx::BuildHaze(float time) +{ + const float scale = 1.0f / std::max(0.05f, g_tune.hazeScale); + const float drift = time * g_tune.hazeDrift; + + for (int gy = 0; gy < hazeH; ++gy) + { + for (int gx = 0; gx < hazeW; ++gx) + { + const float x = float(gx) * 0.34f * scale; + const float y = float(gy) * 0.34f * scale; + // Второй октав идёт против сноса — клубы не «едут доской». + const float v = 0.62f * LatticeValue(x + drift, y + drift * 0.35f) + + 0.38f * LatticeValue(x * 2.7f - drift * 1.6f, y * 2.7f + drift * 0.8f); + hazeGrid[size_t(gy) * hazeW + gx] = uint8_t(Clampf(v, 0.0f, 1.0f) * 255.0f); + } + } +} + +void PostFx::Apply(Framebuffer& fb, const Dread& dread, float time) +{ + ++frame; + if (!enabled) return; + if (vigD.size() != fb.px.size()) return; + + const bool hazeOn = (g_tune.hazeAmount > 0.001f) && + (hazeGrid.size() == size_t(hazeW) * size_t(hazeH)) && hazeW > 0; + if (hazeOn) BuildHaze(time); + // Сколько уровней яркости добавляет дымка на пике. + const int hazeAmp = int(Clampf(g_tune.hazeAmount, 0.0f, 2.0f) * 44.0f); + const int hazeGate = std::max(1, int(g_tune.hazeGate)); + + // --- таблицы кадра ------------------------------------------------------- + + // Виньетка: в напряжении темнее и «сужается». + const float vigStart = Lerpf(g_tune.vigStartCalm, g_tune.vigStartTense, dread.level); + const float vigDepth = Lerpf(g_tune.vigDepthCalm, g_tune.vigDepthTense, dread.level); + + // Сердцебиение: два коротких удара за цикл, слышно только в напряжении. + const float hp = dread.heartPhase; + float beat = 0.0f; + if (hp < 0.10f) beat = 1.0f - hp / 0.10f; + else if (hp < 0.22f) beat = 0.55f * (1.0f - (hp - 0.10f) / 0.12f); + const float beatAmp = beat * dread.level * g_tune.heartAmp; + + uint32_t vigLut[256]; + for (int i = 0; i < 256; ++i) + { + const float d = float(i) / 255.0f; + float k = 1.0f - vigDepth * Clampf((d - vigStart) / std::max(0.001f, 1.0f - vigStart), + 0.0f, 1.0f); + k *= (1.0f - beatAmp); + k *= (1.0f + dread.pulse * g_tune.shotFlash); + vigLut[i] = uint32_t(Clampf(k, 0.0f, 3.0f) * 256.0f); + } + + // Зерно сильнее в тенях: в свету плёнка чистая, в темноте шумит. + const float grainBase = Lerpf(g_tune.grainCalm, g_tune.grainTense, dread.level); + int grainAmp[256]; + for (int i = 0; i < 256; ++i) + { + // Не выше 127: индекс sat[] равен 128 + канал + шум и обязан остаться + // внутри 512, иначе в Release пойдут случайные яркие точки. + const int v = int(grainBase * (1.0f - float(i) / 320.0f)); + grainAmp[i] = v < 0 ? 0 : (v > 127 ? 127 : v); + } + + // Насыщение: индекс 128 + значение + шум, диапазон [1, 510] при шуме +-127. + static uint8_t sat[512]; + static bool satReady = false; + if (!satReady) + { + for (int i = 0; i < 512; ++i) + { + const int v = i - 128; + sat[i] = uint8_t(v < 0 ? 0 : (v > 255 ? 255 : v)); + } + satReady = true; + } + + // --- один слитый проход по пикселям -------------------------------------- + const int w = fb.w; + const int h = fb.h; + uint32_t* p = fb.px.data(); + const uint8_t* vg = vigD.data(); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const size_t i = size_t(y) * w + x; + uint32_t c = p[i]; + + const uint32_t r = c & 0xFFu; + const uint32_t g = (c >> 8) & 0xFFu; + const uint32_t b = (c >> 16) & 0xFFu; + + const uint32_t k = vigLut[vg[i]]; + uint32_t rr = (r * k) >> 8; + uint32_t gg = (g * k) >> 8; + uint32_t bb = (b * k) >> 8; + if (rr > 255u) rr = 255u; + if (gg > 255u) gg = 255u; + if (bb > 255u) bb = 255u; + + uint32_t luma = (rr * 77u + gg * 151u + bb * 28u) >> 8; + + // --- дымка --------------------------------------------------------- + // Пыль подсвечивается тем, что вокруг. В неразведанной черноте её + // быть не может: иначе туман войны превратился бы в серую простыню. + if (hazeOn && luma > 0u) + { + const int gx = x >> 3; + const int gy = y >> 3; + const int fx = (x & 7) * 32; + const int fy = (y & 7) * 32; + const uint8_t* row0 = &hazeGrid[size_t(gy) * hazeW + gx]; + const uint8_t* row1 = row0 + hazeW; + const int top = int(row0[0]) * (256 - fx) + int(row0[1]) * fx; + const int bot = int(row1[0]) * (256 - fx) + int(row1[1]) * fx; + const int v = (top * (256 - fy) + bot * fy) >> 16; // 0..255 + + int add = (hazeAmp * v) >> 8; + if (int(luma) < hazeGate) add = add * int(luma) / hazeGate; + if (add > 0) + { + rr = std::min(255u, rr + uint32_t(add * 7 / 8)); + gg = std::min(255u, gg + uint32_t(add * 15 / 16)); + bb = std::min(255u, bb + uint32_t(add)); + luma = (rr * 77u + gg * 151u + bb * 28u) >> 8; + } + } + + const int amp = grainAmp[luma & 0xFFu]; + if (amp > 0) + { + const int n = int(HashSigned(Hash3(uint32_t(x), uint32_t(y), frame)) * float(amp)); + rr = sat[128 + int(rr) + n]; + gg = sat[128 + int(gg) + n]; + bb = sat[128 + int(bb) + n]; + } + + p[i] = 0xFF000000u | rr | (gg << 8) | (bb << 16); + } + } +} diff --git a/src/render/post.h b/src/render/post.h new file mode 100644 index 0000000..4b9913f --- /dev/null +++ b/src/render/post.h @@ -0,0 +1,67 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Настроение кадра: напряжение (Dread) и один слитый пост-проход по пикселям. +// +// Пост-проход НЕ занимается светом — свет уже вплавлен на блите спрайтов +// (см. render/lighting.h, почему иначе нельзя). Здесь только виньетка, зерно +// и тон, то есть то, что честно считается в экранном пространстве. +// ----------------------------------------------------------------------------- +#include +#include + +#include "core/math.h" +#include "render/framebuffer.h" + +// Что кадр знает о происходящем — собирается из const Game& в RenderGame. +struct DreadInput +{ + float nearestTargetDist = 99.0f; // до ближайшей живой мишени + float nearestUnseenDist = 99.0f; // до ближайшей мишени, которую НЕ видно + int targetsNear = 0; // сколько мишеней рядом + int agentsWithLane = 0; // сколько агентов при линии огня + int shotsDelta = 0; // выстрелов за кадр (дельта, не флаг) + float shotShake = 0.0f; // суммарная отдача от них: у каждого ствола своя + int killsDelta = 0; + int friendlyDelta = 0; + int meleeHitsDelta = 0; // ударов клинком за кадр +}; + +// Напряжение: медленно отпускает, быстро нарастает. Кормит виньетку, зерно, +// сердцебиение и тряску камеры. +struct Dread +{ + float level = 0.0f; // 0..1 + float heartPhase = 0.0f; + float shake = 0.0f; // текущая амплитуда отдачи, в пикселях + float pulse = 0.0f; // короткий выброс тона на выстрел + + void Reset(); + void Update(const DreadInput& in, float frameDt); + + // Смещение камеры от отдачи и дыхания, в целых пикселях. + void CameraOffset(uint32_t frame, int& dx, int& dy) const; +}; + +// Ячейка сетки дымки в пикселях кадра. 8 — компромисс: клубы получаются +// достаточно крупными, чтобы читаться как объём, а сетка остаётся крошечной +// (62x35 узлов), и её пересчёт каждый кадр ничего не стоит. +constexpr int HAZE_CELL = 8; + +struct PostFx +{ + std::vector vigD; // статичное поле виньетки, строится один раз + // Дымка: поле шума по узлам сетки, между узлами — билинейка на лету. + // Полноразмерное поле считать незачем: клубы всё равно низкочастотные. + std::vector hazeGrid; + int hazeW = 0; + int hazeH = 0; + + uint32_t frame = 0; + bool enabled = true; + + void Init(int w, int h); + void Apply(Framebuffer& fb, const Dread& dread, float time); + +private: + void BuildHaze(float time); +}; diff --git a/src/render/scene.cpp b/src/render/scene.cpp new file mode 100644 index 0000000..bfa4881 --- /dev/null +++ b/src/render/scene.cpp @@ -0,0 +1,101 @@ +#include "render/scene.h" + +namespace +{ + +// Запас за краями кадра, чтобы не отсекать спрайты, торчащие внутрь. +constexpr int CULL_MARGIN_X = TILE_W; +constexpr int CULL_MARGIN_Y = WALL_H + TILE_H; + +inline bool OffScreen(int sx, int sy) +{ + return sx < -CULL_MARGIN_X || sx > INTERNAL_W + CULL_MARGIN_X || + sy < -CULL_MARGIN_Y || sy > INTERNAL_H + CULL_MARGIN_Y; +} + +} // namespace + +void Scene::Begin(const iso::Camera& cam) +{ + items.clear(); + cam.ScreenOffset(ox, oy); +} + +void Scene::Add(const Sprite* spr, Vec2 world, int pixelLift, float depthBias) +{ + const Vec2 s = iso::WorldToScreen(world); + const int sx = int(std::lround(s.x)) + ox; + const int sy = int(std::lround(s.y)) + oy - pixelLift; + if (OffScreen(sx, sy)) return; + + iso::DrawItem it; + it.depth = iso::Depth(world) + depthBias; + it.spr = spr; + it.x = sx; + it.y = sy; + items.push_back(it); +} + +void Scene::AddShaded(const Sprite* spr, Vec2 world, const ShadeQuad& quad, int pixelLift, + float depthBias) +{ + const Vec2 s = iso::WorldToScreen(world); + const int sx = int(std::lround(s.x)) + ox; + const int sy = int(std::lround(s.y)) + oy - pixelLift; + if (OffScreen(sx, sy)) return; + + iso::DrawItem it; + it.depth = iso::Depth(world) + depthBias; + it.spr = spr; + it.x = sx; + it.y = sy; + it.shaded = true; + it.quad = quad; + items.push_back(it); +} + +void Scene::Flush(Framebuffer& fb) +{ + iso::SortByDepth(items); + iso::FlushDrawList(fb, items); +} + +// Ниже этого уровня рампа даёт ступень 0, то есть чистый чёрный. +static const float DARK_CUTOFF = 0.5f / float(RAMP_LEVELS - 1); + +void DrawFloor(Framebuffer& fb, const SpriteSet& sprites, const Tilemap& map, int ox, int oy, + const Lighting& light, const BloodField* blood) +{ + for (int ty = 0; ty < MAP_H; ++ty) + { + for (int tx = 0; tx < MAP_W; ++tx) + { + if (map.IsWall(tx, ty)) continue; // под стеной пол не виден + if (light.MaxCornerOf(tx, ty) < DARK_CUTOFF) continue; + + const Vec2 c = iso::WorldToScreen({tx + 0.5f, ty + 0.5f}); + const int sx = int(std::lround(c.x)) + ox; + const int sy = int(std::lround(c.y)) + oy; + if (OffScreen(sx, sy)) continue; + + const Sprite* stained = blood ? blood->At(tx, ty) : nullptr; + const Sprite& s = stained ? *stained : sprites.FloorTile(tx, ty); + fb.BlitShaded(s, sx, sy, light.QuadFor(tx, ty, TILE_H - 1)); + } + } +} + +void CollectWalls(Scene& scene, const SpriteSet& sprites, const Tilemap& map, + const Lighting& light) +{ + for (int ty = 0; ty < MAP_H; ++ty) + for (int tx = 0; tx < MAP_W; ++tx) + { + if (!map.IsWall(tx, ty)) continue; + if (light.MaxCornerOf(tx, ty) < DARK_CUTOFF) continue; + // clampRow = TILE_H-1: вертикальные грани светятся как нижняя кромка + // крыши, а не как экстраполяция патча на 32 строки вниз. + scene.AddShaded(&sprites.wall, {tx + 0.5f, ty + 0.5f}, + light.QuadFor(tx, ty, TILE_H - 1)); + } +} diff --git a/src/render/scene.h b/src/render/scene.h new file mode 100644 index 0000000..69d5cf4 --- /dev/null +++ b/src/render/scene.h @@ -0,0 +1,46 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Сборка кадра: сплошной проход по полу, затем общий список стен и сущностей, +// отсортированный по глубине (wx + wy). +// ----------------------------------------------------------------------------- +#include + +#include "render/blood.h" +#include "render/framebuffer.h" +#include "render/iso.h" +#include "render/sprites.h" +#include "render/lighting.h" +#include "world/tilemap.h" + +struct Scene +{ + std::vector items; + int ox = 0; // смещение камеры в пикселях (целое) + int oy = 0; + + void Begin(const iso::Camera& cam); + + // world — мировая позиция «подошвы» сущности; + // pixelLift — подъём спрайта по экрану (пули летят не по земле); + // depthBias — ручная правка ключа сортировки. + void Add(const Sprite* spr, Vec2 world, int pixelLift = 0, float depthBias = 0.0f); + // Тот же элемент, но с патчем света. + void AddShaded(const Sprite* spr, Vec2 world, const ShadeQuad& quad, int pixelLift = 0, + float depthBias = 0.0f); + + void Flush(Framebuffer& fb); +}; + +// Пол — первым сплошным проходом, в список сортировки не попадает. +// Полностью тёмные тайлы пропускаются: ступень 0 рампы совпадает с цветом +// очистки, поэтому результат пиксель-в-пиксель тот же, а рисовать дешевле. +// +// blood == nullptr — крови нет. Иначе у запачканных тайлов берётся запечённая +// копия ромба. Стоимость кадра от этого не меняется: тот же один блит на тайл, +// сколько бы крови ни накопилось (render/blood.h). +void DrawFloor(Framebuffer& fb, const SpriteSet& sprites, const Tilemap& map, int ox, int oy, + const Lighting& light, const BloodField* blood); + +// Все WALL-тайлы уходят в общий список вместе с сущностями. +void CollectWalls(Scene& scene, const SpriteSet& sprites, const Tilemap& map, + const Lighting& light); diff --git a/src/render/sprites.cpp b/src/render/sprites.cpp new file mode 100644 index 0000000..aa7daab --- /dev/null +++ b/src/render/sprites.cpp @@ -0,0 +1,202 @@ +#include "render/sprites.h" + +#include "core/math.h" + +namespace +{ + +// Занятая часть строки y для ромба 32x16. +void DiamondRow(int y, int& x0, int& x1) +{ + const int k = (y < TILE_HALF_H) ? y : (TILE_H - 1 - y); + const int width = 4 * (k + 1); + x0 = TILE_HALF_W - width / 2; + x1 = x0 + width; +} + +// Обводка по силуэту: любой непрозрачный пиксель, у которого есть прозрачный +// 4-сосед (или край спрайта), перекрашивается в outline. +void OutlineSilhouette(Sprite& s, uint32_t outline) +{ + Sprite copy = s; + for (int y = 0; y < s.h; ++y) + { + for (int x = 0; x < s.w; ++x) + { + if (AlphaOf(copy.Get(x, y)) == 0) continue; + const bool border = + x == 0 || y == 0 || x == s.w - 1 || y == s.h - 1 || + AlphaOf(copy.Get(x - 1, y)) == 0 || AlphaOf(copy.Get(x + 1, y)) == 0 || + AlphaOf(copy.Get(x, y - 1)) == 0 || AlphaOf(copy.Get(x, y + 1)) == 0; + if (border) s.Set(x, y, outline); + } + } +} + +Sprite MakeFloor(uint32_t base) +{ + Sprite s; + s.Init(TILE_W, TILE_H, 0); + s.ax = TILE_HALF_W; + s.ay = TILE_HALF_H; + + const uint32_t edge = ShadeColor(base, 0.78f); + const uint32_t fleck = ShadeColor(base, 1.18f); + + for (int y = 0; y < TILE_H; ++y) + { + int x0 = 0, x1 = 0; + DiamondRow(y, x0, x1); + for (int x = x0; x < x1; ++x) + { + uint32_t c = base; + if (x < x0 + 2 || x >= x1 - 2) c = edge; // рант тайла + else if (((x * 7 + y * 13) % 23) == 0) c = fleck; // «металлическая» рябь + s.Set(x, y, c); + } + } + return s; +} + +Sprite MakeWall(uint32_t top) +{ + Sprite s; + s.Init(TILE_W, WALL_H, 0); + s.ax = TILE_HALF_W; + s.ay = TILE_HALF_H + TILE_H; // низ блока садится на ромб пола + + const uint32_t left = ShadeColor(top, 0.62f); + const uint32_t right = ShadeColor(top, 0.80f); + + // верхняя грань + for (int y = 0; y < TILE_H; ++y) + { + int x0 = 0, x1 = 0; + DiamondRow(y, x0, x1); + for (int x = x0; x < x1; ++x) s.Set(x, y, top); + } + + // вертикальные грани: от нижней кромки ромба вниз на высоту тайла + for (int x = 0; x < TILE_W; ++x) + { + int bottom = -1; + for (int y = 0; y < TILE_H; ++y) + if (AlphaOf(s.Get(x, y)) != 0) bottom = y; + if (bottom < 0) continue; + + const uint32_t side = (x < TILE_HALF_W) ? left : right; + for (int y = bottom + 1; y <= bottom + TILE_H && y < WALL_H; ++y) + s.Set(x, y, side); + } + + OutlineSilhouette(s, ShadeColor(top, 0.35f)); + return s; +} + +// Капсула с обводкой и бликом. +Sprite MakeCapsule(int w, int h, float radius, uint32_t body) +{ + Sprite s; + s.Init(w, h, 0); + s.ax = w / 2; + s.ay = h - 2; // «ноги» чуть выше нижнего края + + const uint32_t outline = ShadeColor(body, 0.35f); + const uint32_t hilite = ShadeColor(body, 1.35f); + const uint32_t shadow = ShadeColor(body, 0.72f); + + const float cx = (w - 1) * 0.5f; + const Vec2 a{cx, radius - 0.5f}; + const Vec2 b{cx, h - radius - 0.5f}; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const float d = DistancePointToSegment({float(x), float(y)}, a, b); + if (d > radius) continue; + if (d > radius - 1.0f) { s.Set(x, y, outline); continue; } + + uint32_t c = body; + if (float(x) < cx - 0.5f && y < h / 2) c = hilite; + else if (float(x) > cx + 1.0f) c = shadow; + s.Set(x, y, c); + } + } + return s; +} + +// Боец ближнего боя: та же капсула, но шире в плечах и с клинком у бедра. +// На 480x270 класс обязан читаться силуэтом — цвет уже занят номером агента. +Sprite MakeMeleeCapsule(int w, int h, float radius, uint32_t body) +{ + Sprite s = MakeCapsule(w, h, radius, body); + + const uint32_t steel = RGBA(196, 206, 222); + const uint32_t edge = RGBA(240, 246, 255); + + // Клинок: короткая вертикаль вдоль правого края силуэта, с бликом. + const int bx = w - 2; + for (int y = 2; y < h - 4; ++y) + { + s.Set(bx, y, steel); + if (y < h / 2) s.Set(bx, y, edge); + } + // Гарда, чтобы клинок не читался как случайная полоска. + s.Set(bx - 1, h - 5, steel); + s.Set(bx, h - 5, steel); + return s; +} + +// Стрелок с пистолетом: та же капсула, но уже в плечах и с коротким стволом +// у пояса. Класс оружия обязан читаться силуэтом — цвет уже занят номером. +Sprite MakePistolCapsule(int w, int h, float radius, uint32_t body) +{ + Sprite s = MakeCapsule(w, h, radius, body); + + const uint32_t steel = RGBA(150, 156, 168); + const uint32_t dark = RGBA(70, 74, 84); + + // Коротышка-ствол: две пиксельных полоски у бедра, с рукоятью вниз. + const int bx = w - 2; + const int by = h - 7; + s.Set(bx, by, steel); + s.Set(bx - 1, by, steel); + s.Set(bx, by + 1, dark); + s.Set(bx, by + 2, dark); + return s; +} + +} // namespace + +uint32_t ShadeColor(uint32_t c, float k) +{ + const float r = Clampf(float(c & 0xFF) * k, 0.0f, 255.0f); + const float g = Clampf(float((c >> 8) & 0xFF) * k, 0.0f, 255.0f); + const float b = Clampf(float((c >> 16) & 0xFF) * k, 0.0f, 255.0f); + return RGBA(uint8_t(r), uint8_t(g), uint8_t(b), AlphaOf(c)); +} + +void SpriteSet::Generate() +{ + floorA = MakeFloor(RGBA(50, 54, 62)); + floorB = MakeFloor(RGBA(42, 46, 53)); + wall = MakeWall(RGBA(78, 84, 96)); + + // 5 различимых цветов — по одному на агента + static const uint32_t agentCols[NUM_AGENTS] = { + RGBA(80, 200, 220), + RGBA(232, 176, 72), + RGBA(116, 204, 116), + RGBA(212, 116, 200), + RGBA(116, 148, 240), + }; + for (int i = 0; i < NUM_AGENTS; ++i) + { + agent[i] = MakeCapsule(10, 14, 4.0f, agentCols[i]); + melee[i] = MakeMeleeCapsule(12, 15, 4.6f, agentCols[i]); + pistol[i] = MakePistolCapsule(9, 13, 3.6f, agentCols[i]); + } + + target = MakeCapsule(12, 16, 5.0f, RGBA(120, 44, 44)); +} diff --git a/src/render/sprites.h b/src/render/sprites.h new file mode 100644 index 0000000..142ac00 --- /dev/null +++ b/src/render/sprites.h @@ -0,0 +1,31 @@ +#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); diff --git a/src/render/view.cpp b/src/render/view.cpp new file mode 100644 index 0000000..1131a49 --- /dev/null +++ b/src/render/view.cpp @@ -0,0 +1,181 @@ +#include "render/view.h" + +#include "game.h" +#include "render/noise.h" + +namespace +{ +constexpr uint32_t COL_BG = RGBA(0, 0, 0); // ступень 0 рампы == цвет очистки +} + +void View::Init() +{ + post.Init(INTERNAL_W, INTERNAL_H); + RefreshRamp(); +} + +void View::RefreshRamp() +{ + if (rampGamma == g_tune.lightGamma && rampGain == g_tune.lightMaxGain) return; + rampGamma = g_tune.lightGamma; + rampGain = g_tune.lightMaxGain; + BuildShadeRamp(rampGamma, rampGain); +} + +void View::Reset(const Game& game) +{ + lighting.Reset(); + fx.Reset(); + dread.Reset(); + // Кровь вечная, но не переживает смену уровня: пол под ней уже другой. + blood.Reset(); + atmos.Reset(); + cam.SnapTo(game.squad.anchor); + prevShots = game.metrics.shotsFired; + prevKills = game.metrics.targetsKilled; + prevFriendly = game.metrics.friendlyHits; + prevMeleeHits = game.metrics.meleeHits; +} + +void RenderGame(const Game& game, View& view, Framebuffer& fb, float alpha, float frameDt) +{ + const Squad& squad = game.squad; + + view.RefreshRamp(); // подкрутили гамму в оверлее — таблица перепечётся + + // --- камера --------------------------------------------------------------- + const Vec2 anchorView = Lerp(squad.anchorPrev, squad.anchor, alpha); + view.cam.Follow(anchorView, frameDt, g_tune.cameraSmooth); + + // --- события боя -> эффекты, вспышки света и кровь ------------------------ + view.fx.Ingest(game.events, squad.agents.data(), NUM_AGENTS); + view.lighting.Ingest(game.events, squad.agents.data(), NUM_AGENTS); + view.blood.Ingest(game.events, game.sprites, game.map); + view.fx.Update(frameDt); + view.atmos.Update(frameDt); + + // --- напряжение ------------------------------------------------------------ + DreadInput di; + di.shotsDelta = game.metrics.shotsFired - view.prevShots; + // Отдачу посчитал fx: он один знает, из чего именно стреляли. + di.shotShake = view.fx.shotShake; + view.fx.shotShake = 0.0f; + di.killsDelta = game.metrics.targetsKilled - view.prevKills; + di.friendlyDelta = game.metrics.friendlyHits - view.prevFriendly; + di.meleeHitsDelta = game.metrics.meleeHits - view.prevMeleeHits; + view.prevShots = game.metrics.shotsFired; + view.prevKills = game.metrics.targetsKilled; + view.prevFriendly = game.metrics.friendlyHits; + view.prevMeleeHits = game.metrics.meleeHits; + + // «Отряд не слеп» — это и линия огня, и клинок в зоне удара: боец, + // достающий врага, беспомощным не выглядит и напряжение снимает так же. + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + if (a.IsMelee() ? a.melee.inReach : a.hasLane) ++di.agentsWithLane; + } + + for (const Target& t : game.targets) + { + if (!t.alive) continue; + const float d = Distance(t.pos, squad.anchor); + di.nearestTargetDist = std::min(di.nearestTargetDist, d); + if (d < g_tune.dreadRadius) ++di.targetsNear; + // Страшнее всего то, что рядом и чего не видно. + if (view.lighting.LightAt(t.pos) < g_tune.fogEntityReveal) + di.nearestUnseenDist = std::min(di.nearestUnseenDist, d); + } + if (view.horrorEnabled) view.dread.Update(di, frameDt); + + // --- свет ------------------------------------------------------------------ + view.lighting.enabled = view.horrorEnabled; + view.lighting.Update(squad.agents.data(), NUM_AGENTS, game.map, frameDt); + + // --- сцена ----------------------------------------------------------------- + fb.Clear(COL_BG); + view.scene.Begin(view.cam); + + // Отдача камеры добавляется к смещению сцены сразу после Begin — только там + // она согласована и с полом, и со списком сортировки, и с оверлеем. + if (view.horrorEnabled) + { + int sx = 0, sy = 0; + view.dread.CameraOffset(view.post.frame, sx, sy); + view.scene.ox += sx; + view.scene.oy += sy; + } + + DrawFloor(fb, game.sprites, game.map, view.scene.ox, view.scene.oy, view.lighting, + &view.blood); + CollectWalls(view.scene, game.sprites, game.map, view.lighting); + + // Мишени: показываются только там, где светло, либо если по ним уже работает + // кто-то из отряда (иначе стрельба в темноту выглядит абсурдом). + for (int i = 0; i < int(game.targets.size()); ++i) + { + const Target& t = game.targets[i]; + if (!t.alive) continue; + + const float lit = view.lighting.LightAt(t.pos); + bool engaged = false; + for (int a = 0; a < NUM_AGENTS; ++a) + if (squad.agents[a].currentTargetId == i) { engaged = true; break; } + + // Тело — по реальному свету: в темноте мишени физически не видно. + if (lit >= g_tune.fogEntityReveal || engaged) + view.scene.AddShaded(&game.sprites.target, t.pos, + ShadeQuad::Flat(std::max(lit, engaged ? 0.30f : 0.0f))); + } + + for (int i = 0; i < NUM_AGENTS; ++i) + { + const Agent& a = squad.agents[i]; + const Vec2 p = Lerp(a.prevPos, a.pos, alpha); + // Свои всегда читаемы: игрок обязан различать агентов даже в темноте. + const float lit = std::max(view.lighting.LightAt(p), g_tune.agentMinLight); + // Класс и ствол читаются силуэтом, номер — цветом. + const Sprite& spr = a.IsMelee() ? game.sprites.melee[i] + : (a.gunId == FirearmId::PISTOL) ? game.sprites.pistol[i] + : game.sprites.agent[i]; + view.scene.AddShaded(&spr, p, ShadeQuad::Flat(lit)); + } + + view.scene.Flush(fb); + + // --- глаза мишеней -------------------------------------------------------- + // Тлеют при свете сильно ниже порога показа тела: в разведанной темноте + // игрок сначала видит огонёк, и только подойдя — того, кому он принадлежит. + for (const Target& t : game.targets) + { + if (!t.alive) continue; + if (view.lighting.LightAt(t.pos) < g_tune.eyeRevealLight) continue; + + // Фаза пульсации своя у каждой мишени и учащается при низком HP. + const uint32_t seed = Hash2(uint32_t(int(t.pos.x * 4.0f)), uint32_t(int(t.pos.y * 4.0f))); + const float hpFrac = Clampf(t.hp / std::max(1.0f, g_tune.targetHP), 0.0f, 1.0f); + const float rate = Lerpf(3.4f, 1.1f, hpFrac); + const float ph = Hash01(seed) + float(view.post.frame) * (rate / 60.0f); + const float pulse = 0.55f + 0.45f * std::sin(ph * TWO_PI_F); + + const Vec2 sp = iso::WorldToScreen(t.pos); + const int ex = int(std::lround(sp.x)) + view.scene.ox; + const int ey = int(std::lround(sp.y)) + view.scene.oy - int(g_tune.eyeLiftPx); + fb.AddGlowDisc(ex, ey, int(g_tune.eyeRadiusPx) + 1, + ScaleColor8(FXC(255, 40, 30), uint32_t(pulse * 256.0f))); + } + + // --- эффекты боя: аддитивно поверх геометрии, до пост-прохода ------------ + view.fx.Draw(fb, game.bullets, view.scene.ox, view.scene.oy, alpha); + DrawMeleeArcs(fb, squad.agents.data(), NUM_AGENTS, view.scene.ox, view.scene.oy, alpha); + + // --- взвесь в воздухе ------------------------------------------------------ + // Пепел висит МЕЖДУ камерой и сценой, поэтому рисуется последним из мира, + // но до пост-прохода: он такой же участник кадра, как трассеры. + if (view.horrorEnabled) + view.atmos.DrawAsh(fb, view.cam.pos, view.scene.ox, view.scene.oy, view.lighting); + + // --- один слитый пост-проход ---------------------------------------------- + view.post.enabled = view.horrorEnabled; + view.post.Apply(fb, view.dread, view.atmos.time); +} diff --git a/src/render/view.h b/src/render/view.h new file mode 100644 index 0000000..d0241d9 --- /dev/null +++ b/src/render/view.h @@ -0,0 +1,52 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Всё render-only состояние живёт здесь и только здесь. +// +// Зачем отдельная структура: правило «эффекты не текут в симуляцию» должно +// проверяться компилятором, а не вниманием. RenderGame принимает Game по +// КОНСТАНТНОЙ ссылке — значит ни свет, ни трассеры, ни тряска камеры физически +// не могут изменить состояние симуляции. Headless-прогоны (--accept, --headless) +// View не создают вообще, поэтому цифры приёмки остаются цифрами симуляции. +// ----------------------------------------------------------------------------- +#include "render/atmos.h" +#include "render/blood.h" +#include "render/framebuffer.h" +#include "render/fx.h" +#include "render/iso.h" +#include "render/lighting.h" +#include "render/post.h" +#include "render/scene.h" + +struct Game; + +struct View +{ + iso::Camera cam; + Scene scene; + Lighting lighting; + FxSystem fx; + PostFx post; + Dread dread; + BloodField blood; // вечные декали, запечённые в спрайты пола + Atmosphere atmos; // пепел в воздухе + + // Дельты считаются по накопительным счётчикам метрик: за один кадр рендера + // проходит до MAX_STEPS_PER_FRAME шагов, поэтому флаг «выстрелил» не годится. + int prevShots = 0; + int prevKills = 0; + int prevFriendly = 0; + int prevMeleeHits = 0; + + bool horrorEnabled = true; // F5 — аварийный возврат к прежнему кадру + bool showSight = false; // F6 — показать диски обзора + + // Гамма и усиление меняют САМУ таблицу рампы: без перепечатки ручки молчат. + float rampGamma = -1.0f; + float rampGain = -1.0f; + + void Init(); + void RefreshRamp(); + void Reset(const Game& game); +}; + +void RenderGame(const Game& game, View& view, Framebuffer& fb, float alpha, float frameDt); diff --git a/src/sim/agent.cpp b/src/sim/agent.cpp new file mode 100644 index 0000000..4e978dd --- /dev/null +++ b/src/sim/agent.cpp @@ -0,0 +1,173 @@ +#include "sim/agent.h" + +Vec2 SeekForce(const Agent& a, Vec2 goal, float maxSpeed) +{ + const Vec2 delta = goal - a.pos; + const float dist = Length(delta); + if (dist < 1e-4f) return {}; + + // У цели тормозим, иначе агент дрожит вокруг слота. + const float speed = maxSpeed * Clampf(dist / g_tune.arriveRadius, 0.0f, 1.0f); + return (delta / dist) * speed; +} + +Vec2 SeparationForce(const Agent& a, const Agent* all, int count, float maxSpeed) +{ + const float r = g_tune.separationRadius; + Vec2 push{}; + + for (int i = 0; i < count; ++i) + { + const Agent& other = all[i]; + if (&other == &a) continue; + + const Vec2 delta = a.pos - other.pos; + const float d = Length(delta); + if (d >= r) continue; + + if (d < 1e-4f) + { + // Идеально совпали — расталкиваем детерминированно по индексу слота. + push += FromAngle(float(a.slotIndex) * (TWO_PI_F / NUM_AGENTS)) * maxSpeed; + continue; + } + push += (delta / d) * (maxSpeed * (1.0f - d / r)); + } + return push; +} + +Vec2 TargetPushForce(const Agent& a, const std::vector& targets, float maxSpeed) +{ + Vec2 push{}; + for (const Target& t : targets) + { + if (!t.alive) continue; + + const float r = t.radius + a.bodyRadius + g_tune.targetPushGap; + const Vec2 delta = a.pos - t.pos; + const float d = Length(delta); + if (d >= r) continue; + + // Ровно в центре мишени — толкаем по своему стволу, детерминированно. + const Vec2 n = (d > 1e-4f) ? (delta / d) : FromAngle(a.facing + PI_F); + push += n * (maxSpeed * (1.0f - d / r)); + } + return push; +} + +Vec2 WallAvoidForce(const Agent& a, const Tilemap& map, Vec2 seekDir, float maxSpeed) +{ + const float reach = a.bodyRadius + g_tune.wallLookahead; + Vec2 push{}; + + const int x0 = int(std::floor(a.pos.x - reach)); + const int x1 = int(std::floor(a.pos.x + reach)); + const int y0 = int(std::floor(a.pos.y - reach)); + const int y1 = int(std::floor(a.pos.y + reach)); + + for (int ty = y0; ty <= y1; ++ty) + { + for (int tx = x0; tx <= x1; ++tx) + { + if (!map.IsWall(tx, ty)) continue; + + const Vec2 closest{Clampf(a.pos.x, float(tx), float(tx + 1)), + Clampf(a.pos.y, float(ty), float(ty + 1))}; + const Vec2 delta = a.pos - closest; + const float d = Length(delta); + if (d >= reach) continue; + if (d < 1e-4f) continue; // внутри стены — этим займётся ResolveCircle + + const Vec2 n = delta / d; // нормаль от стены к агенту + const float w = 1.0f - d / reach; // ближе к стене — сильнее + push += n * (maxSpeed * w); + + // Стена стоит между агентом и целью: добавляем касательную, + // иначе seek и отталкивание уравновешиваются и агент залипает. + if (Dot(seekDir, n) < 0.0f) + { + Vec2 t = Perp(n); + if (Dot(t, seekDir) < 0.0f) t = Vec2{-t.x, -t.y}; + push += t * (maxSpeed * w * g_tune.wallSlide); + } + } + } + return push; +} + +void IntegrateAgent(Agent& a, Vec2 desiredVel, float maxSpeed, float dt, const Tilemap& map, + float accel) +{ + desiredVel = ClampLength(desiredVel, maxSpeed); + + // Скорость подтягивается к желаемой — резкие развороты не телепортируют агента. + const Vec2 dv = desiredVel - a.vel; + const float maxStep = ((accel > 0.0f) ? accel : g_tune.steerAccel) * dt; + a.vel += ClampLength(dv, maxStep); + a.vel = ClampLength(a.vel, maxSpeed); + + a.pos += a.vel * dt; + + // Скольжение вдоль стен: выталкивание гасит только нормальную компоненту. + const Vec2 before = a.pos; + map.ResolveCircle(a.pos, a.bodyRadius); + const Vec2 correction = a.pos - before; + if (LengthSq(correction) > 1e-8f) + { + const Vec2 n = Normalized(correction); + const float vn = Dot(a.vel, n); + if (vn < 0.0f) a.vel -= n * vn; + } +} + +void AimAt(Agent& a, Vec2 point, float dt) +{ + const Vec2 d = point - a.pos; + if (LengthSq(d) < 1e-6f) return; + a.facing = RotateToward(a.facing, AngleOf(d), g_tune.turnRateDeg * DEG2RAD_F * dt); +} + +void AimAlongMotion(Agent& a, float dt) +{ + if (LengthSq(a.vel) < 0.04f) return; // почти стоит — ствол не крутим + a.facing = RotateToward(a.facing, AngleOf(a.vel), g_tune.turnRateDeg * DEG2RAD_F * dt); +} + +ecs::Entity SpawnWeapon(ecs::World& world, WeaponClass cls, FirearmId gunId) +{ + const ecs::Entity e = world.Create(); + + WeaponItem item; + item.cls = cls; + item.gunId = gunId; + item.gun = FirearmDefOf(gunId); + item.blade = DefaultBladeDef(); + world.Add(e, item); + return e; +} + +void SyncLoadout(ecs::World& world, Agent& a) +{ + a.bodyRadius = g_tune.bodyRadius; + + const WeaponItem* item = world.Get(a.weaponEntity); + if (!item) return; // оружия нет — бойцу нечем ни стрелять, ни бить + + a.cls = item->cls; + a.gunId = item->gunId; + + // Ствол: статы обновляются целиком, состояние (патроны, откат, увод) — нет. + // Магазин мог смениться вместе с оружием, поэтому патроны подрезаем. + const bool sameGun = (a.gun.def.magazine == item->gun.magazine); + a.gun.def = item->gun; + if (!sameGun) a.gun.ammo = std::min(a.gun.ammo, a.gun.def.magazine); + + a.melee.reach = item->blade.reach; + a.melee.arcDeg = item->blade.arcDeg; + a.melee.windup = item->blade.windup; + a.melee.strike = item->blade.strike; + a.melee.recover = item->blade.recover; + a.melee.interval = item->blade.interval; + a.melee.damage = item->blade.damage; + a.melee.knockback = item->blade.knockback; +} diff --git a/src/sim/agent.h b/src/sim/agent.h new file mode 100644 index 0000000..01f3d71 --- /dev/null +++ b/src/sim/agent.h @@ -0,0 +1,119 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Агент: состояние + слои движения (спек 6.1, 6.7). +// Никакой изометрии, никакого рендера. +// +// Agent — компонент ECS. Крупный: правила боя читают состояние бойца целиком +// и в одном порядке, дробить его на Position+Velocity+Body значило бы разложить +// один связный алгоритм по пяти пулам без единой строчки выигрыша +// (см. docs/12-ecs.md). А вот ОРУЖИЕ вынесено в отдельную сущность: у него +// действительно своя жизнь, свои статы и своя подменяемость. +// ----------------------------------------------------------------------------- +#include + +#include "core/math.h" +#include "ecs/ecs.h" +#include "sim/loadout.h" +#include "sim/target.h" +#include "tuning.h" +#include "world/tilemap.h" + +enum class AgentState : uint8_t +{ + ADVANCING = 0, // есть ввод движения + HOLDING = 1, // ввода нет дольше holdDelay +}; + +struct Agent +{ + Vec2 pos{}; + Vec2 vel{}; + float facing = 0.0f; // радианы, куда смотрит ствол + float bodyRadius = 0.28f; + int slotIndex = 0; + AgentState state = AgentState::HOLDING; + int currentTargetId = -1; // -1 = нет + Vec2 postPos{}; // выбранная огневая позиция + float commitTimer = 0.0f; // блокировка перерешивания + float solveTimer = 0.0f; // стаггер решателя + + // Сущности ECS: сам боец и его оружие. Статы оружия копируются отсюда + // в gun/melee каждый шаг (SyncLoadout), поэтому ai/ про ECS не знает вообще. + ecs::Entity self = ecs::NO_ENTITY; + ecs::Entity weaponEntity = ecs::NO_ENTITY; + + WeaponClass cls = WeaponClass::RANGED; + FirearmId gunId = FirearmId::RIFLE; + Firearm gun; // работает только у RANGED + MeleeWeapon melee; // работает только у MELEE + + // --- служебное (рендер/отладка/метрики), на правила не влияет --- + Vec2 prevPos{}; // для интерполяции кадра + bool hasLane = false; // есть валидная линия огня прямо сейчас + bool priorityLane = false; // линия именно к приоритетной цели (6.8) + bool laneIntent = false; // цель есть, мешает ТОЛЬКО свой -> линия резервируется + bool targetBlockedByAlly = false; // цель есть, линию перекрыл свой + bool targetBlockedByWall = false; // цель есть, линию перекрыла стена + Vec2 laneEnd{}; // куда указывает текущая линия + bool fired = false; // выстрелил на этом шаге (для оверлея) + + float Speed() const { return Length(vel); } + + // Полураствор конуса выстрела прямо сейчас. Стоя он почти нулевой, на ходу + // растёт. Ровно этот конус проверяется на своих перед спуском. + float SpreadRad() const { return gun.SpreadRad(Speed()); } + + // Точка вылета пули: muzzleOffset юнита от центра в сторону towards. + Vec2 MuzzleTowards(Vec2 towards) const + { + const Vec2 d = Normalized(towards - pos, FromAngle(facing)); + return pos + d * gun.def.muzzleOffset; + } + Vec2 MuzzleFacing() const { return pos + FromAngle(facing) * gun.def.muzzleOffset; } + + bool IsMelee() const { return cls == WeaponClass::MELEE; } + + // Множитель скорости от фазы удара: на замахе ноги вкопаны, после удара + // боец медленный. Рывок в STRIKE считается отдельно, здесь его нет. + float SpeedScale() const + { + if (cls != WeaponClass::MELEE) return 1.0f; + switch (melee.state) + { + case MeleeState::WINDUP: return g_tune.meleeWindupScale; + case MeleeState::RECOVER: return g_tune.meleeRecoverScale; + default: return 1.0f; + } + } +}; + +// --- слои движения (6.7) ----------------------------------------------------- + +// 1. seek с торможением у цели +Vec2 SeekForce(const Agent& a, Vec2 goal, float maxSpeed); +// 2. расталкивание от союзников +Vec2 SeparationForce(const Agent& a, const Agent* all, int count, float maxSpeed); +// 3'. расталкивание от мишеней: чужое тело — не пустое место. Без этого боец +// ближнего боя стоит ВНУТРИ того, кого рубит, и удар не читается. +Vec2 TargetPushForce(const Agent& a, const std::vector& targets, float maxSpeed); +// 4. отталкивание от стен + скольжение вдоль них. +// seekDir нужен, чтобы обходить препятствие, а не упираться в него лбом: +// без тангенциальной составляющей агент залипает в «тени» стены. +Vec2 WallAvoidForce(const Agent& a, const Tilemap& map, Vec2 seekDir, float maxSpeed); + +// 5. клампинг, интеграция, разрешение коллизий с тайлами. +// accel = -1 означает «взять steerAccel из tuning»; рывку клинка нужен свой. +void IntegrateAgent(Agent& a, Vec2 desiredVel, float maxSpeed, float dt, const Tilemap& map, + float accel = -1.0f); + +// Доворот ствола к точке (или по вектору движения, если цели нет). +void AimAt(Agent& a, Vec2 point, float dt); +void AimAlongMotion(Agent& a, float dt); + +// Система: скопировать статы с сущности-оружия и общие размеры из tuning. +// Рабочее состояние (патроны, фаза удара, откат, увод ствола) НЕ трогается. +void SyncLoadout(ecs::World& world, Agent& a); + +// Создать сущность оружия нужного класса и вернуть её. Стволы и клинки живут +// в одном пуле WeaponItem: подменить одно другим — это одна запись компонента. +ecs::Entity SpawnWeapon(ecs::World& world, WeaponClass cls, FirearmId gunId); diff --git a/src/sim/bullet.cpp b/src/sim/bullet.cpp new file mode 100644 index 0000000..4f746a5 --- /dev/null +++ b/src/sim/bullet.cpp @@ -0,0 +1,135 @@ +#include "sim/bullet.h" + +#include "debug/metrics.h" + +void SpawnBullet(ecs::World& world, const FirearmDef& def, Vec2 from, Vec2 dir, float travel, + int owner) +{ + std::vector& bullets = world.All(); + if (int(bullets.size()) >= MAX_BULLETS) return; + + Bullet b; + b.self = world.Create(); + b.pos = from; + b.prevPos = from; + b.origin = from; + b.vel = Normalized(dir) * def.bulletSpeed; + b.damage = def.damage; + b.knockback = def.knockback; + b.radius = def.bulletRadius; + // Живёт ровно столько, чтобы пройти проверенный отрезок (+ радиус мишени). + const float reach = std::min(travel + g_tune.targetRadius, def.range); + b.life = reach / std::max(0.001f, def.bulletSpeed); + b.owner = owner; + b.tracerLength = def.tracerLength; + b.tracerR = def.tracerR; + b.tracerG = def.tracerG; + b.tracerB = def.tracerB; + + world.Add(b.self, b); +} + +void UpdateBullets(ecs::World& world, const Tilemap& map, + Agent* agents, int agentCount, + std::vector& targets, float dt, Metrics& metrics, + CombatEventLog* events) +{ + std::vector& bullets = world.All(); + + // Убирать сущности прямо в цикле нельзя: удаление из пула переставляет + // хвост на освободившееся место. Поэтому сначала шаг, потом похороны. + ecs::Entity dead[MAX_BULLETS]; + int deadCount = 0; + + for (size_t bi = 0; bi < bullets.size(); ++bi) + { + Bullet& b = bullets[bi]; + const float br = b.radius; + + b.prevPos = b.pos; + b.pos += b.vel * dt; + b.life -= dt; + + // Ищем самое раннее попадание вдоль пройденного за шаг отрезка. + float tBest = 2.0f; + int hitAgent = -1; + int hitTarget = -1; + + float tWall = 0.0f; + if (map.RaycastBlocked(b.prevPos, b.pos, &tWall)) tBest = tWall; + + if (g_tune.friendlyFire) + { + for (int i = 0; i < agentCount; ++i) + { + if (i == b.owner) continue; // своя пуля стрелка не бьёт + float t = 0.0f; + const Vec2 cp = ClosestPointOnSegment(agents[i].pos, b.prevPos, b.pos, &t); + if (Distance(cp, agents[i].pos) > agents[i].bodyRadius + br) continue; + if (t < tBest) + { + tBest = t; + hitAgent = i; + hitTarget = -1; + } + } + } + + for (int i = 0; i < int(targets.size()); ++i) + { + if (!targets[i].alive) continue; + float t = 0.0f; + const Vec2 cp = ClosestPointOnSegment(targets[i].pos, b.prevPos, b.pos, &t); + if (Distance(cp, targets[i].pos) > targets[i].radius + br) continue; + if (t < tBest) + { + tBest = t; + hitTarget = i; + hitAgent = -1; + } + } + + // Точка события — там, где пуля реально столкнулась, а не b.pos: + // на кадре смерти b.pos уже за стеной/внутри цели. + const Vec2 impact = Lerp(b.prevPos, b.pos, Clampf(tBest, 0.0f, 1.0f)); + const Vec2 dir = Normalized(b.vel); + + if (hitAgent >= 0) + { + metrics.LogFriendlyHit(b.owner, hitAgent, agents[hitAgent].pos, + agents[hitAgent].state == AgentState::ADVANCING); + if (events) events->Push(CombatEventKind::HIT_ALLY, b.owner, impact, dir); + dead[deadCount++] = b.self; + continue; + } + if (hitTarget >= 0) + { + Target& t = targets[hitTarget]; + t.hp -= b.damage; + KnockTarget(t, dir, b.knockback); + if (events) events->Push(CombatEventKind::HIT_TARGET, b.owner, impact, dir); + if (t.hp <= 0.0f) + { + t.alive = false; + t.respawnTimer = g_tune.targetRespawn; + ++metrics.targetsKilled; + if (events) events->Push(CombatEventKind::HIT_KILL, b.owner, t.pos, dir); + } + dead[deadCount++] = b.self; + continue; + } + // Стена и «выработала дистанцию» — разные события для эффектов. + if (tBest <= 1.0f) + { + if (events) events->Push(CombatEventKind::HIT_WALL, b.owner, impact, dir); + dead[deadCount++] = b.self; + } + else if (b.life <= 0.0f) + { + if (events) events->Push(CombatEventKind::EXPIRED, b.owner, b.pos, dir); + dead[deadCount++] = b.self; + } + } + + for (int i = 0; i < deadCount; ++i) world.Destroy(dead[i]); +} diff --git a/src/sim/bullet.h b/src/sim/bullet.h new file mode 100644 index 0000000..83bf119 --- /dev/null +++ b/src/sim/bullet.h @@ -0,0 +1,54 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Пули — настоящие снаряды (спек 6.9), не хитскан. +// Коллизия с тайлами и со ВСЕМИ капсулами, включая союзников: friendlyFire +// физически возможен, иначе прототип ничего не доказывает. +// +// Bullet — компонент ECS: у каждой пули своя сущность, которая умирает вместе +// с ней. Свободный список больше не нужен — его роль играет пул. +// ----------------------------------------------------------------------------- +#include + +#include "core/math.h" +#include "ecs/ecs.h" +#include "sim/agent.h" +#include "sim/events.h" +#include "sim/target.h" +#include "world/tilemap.h" + +struct Metrics; + +struct Bullet +{ + ecs::Entity self = ecs::NO_ENTITY; + + Vec2 pos{}; + Vec2 prevPos{}; + Vec2 vel{}; + Vec2 origin{}; // откуда вылетела — только для эффектов, правила не читают + float damage = 0.0f; + float knockback = 0.0f; + float radius = 0.04f; + float life = 0.0f; // сек до самоуничтожения (дальность / скорость) + int owner = -1; + + // Визуал трассера едет вместе со снарядом: он у каждого ствола свой, + // а к моменту отрисовки стрелок мог уже сменить оружие или умереть. + float tracerLength = 1.3f; + uint8_t tracerR = 255, tracerG = 240, tracerB = 205; +}; + +// travel — длина ПРОВЕРЕННОГО отрезка (дуло -> цель). Пуля не летит дальше: +// за целью пространство никто не проверял, и если цель успела умереть, +// пуля ушла бы в непроверенную зону и могла бы найти там своего. +// +// dir — уже с учётом разброса. Конус разброса проверен на своих ДО спуска +// (см. ai/firing_solver.cpp), поэтому отклонившаяся пуля своего не найдёт. +void SpawnBullet(ecs::World& world, const FirearmDef& def, Vec2 from, Vec2 dir, float travel, + int owner); + +// events == nullptr в headless-прогонах: эффектов там нет, а правила журнал не читают. +void UpdateBullets(ecs::World& world, const Tilemap& map, + Agent* agents, int agentCount, + std::vector& targets, float dt, Metrics& metrics, + CombatEventLog* events); diff --git a/src/sim/events.h b/src/sim/events.h new file mode 100644 index 0000000..30be39b --- /dev/null +++ b/src/sim/events.h @@ -0,0 +1,55 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Единственный канал «симуляция -> визуальные эффекты». +// +// Почему кольцевой журнал, а не флаги вроде Agent::fired: за один кадр рендера +// проходит ДО MAX_STEPS_PER_FRAME шагов симуляции. Флаг, выставленный на шаге 1 +// и затёртый на шаге 2, эффект не увидит. Журнал переживает все шаги кадра. +// +// Симуляция только ПИШЕТ сюда. Ни одно правило из спека 6 журнал не читает, +// поэтому на детерминизм и на критерии приёмки он не влияет. В headless-прогонах +// указатель на журнал равен nullptr. +// ----------------------------------------------------------------------------- +#include + +#include "core/math.h" + +enum class CombatEventKind : uint8_t +{ + SHOT = 0, // выстрел: pos = дуло, dir = направление + HIT_WALL, // пуля в стену + HIT_TARGET, // пуля в мишень + HIT_KILL, // мишень уничтожена + HIT_ALLY, // попадание по своему (в норме не должно случаться никогда) + EXPIRED, // пуля выработала проверенную дистанцию + MELEE_SWING, // взмах пошёл: pos = боец, dir = ось удара + MELEE_HIT, // лезвие достало мишень + MELEE_ABORT, // взмах оборван: в дугу влез свой + RELOAD_START, // магазин пуст, боец пошёл перезаряжаться + RELOAD_DONE, // магазин снаряжён +}; + +struct CombatEvent +{ + CombatEventKind kind = CombatEventKind::SHOT; + int owner = -1; // индекс агента-стрелка + Vec2 pos{}; + Vec2 dir{}; +}; + +// Кольцо: если эффекты за кадр не успели забрать события, теряются самые старые. +constexpr int COMBAT_EVENT_CAP = 64; + +struct CombatEventLog +{ + CombatEvent buf[COMBAT_EVENT_CAP]; + uint32_t head = 0; // всего записано за всё время; индекс = head % CAP + + void Clear() { head = 0; } + + void Push(CombatEventKind kind, int owner, Vec2 pos, Vec2 dir) + { + buf[head % COMBAT_EVENT_CAP] = CombatEvent{kind, owner, pos, dir}; + ++head; + } +}; diff --git a/src/sim/loadout.h b/src/sim/loadout.h new file mode 100644 index 0000000..a401f75 --- /dev/null +++ b/src/sim/loadout.h @@ -0,0 +1,177 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Снаряжение бойца: РАБОЧЕЕ состояние оружия. +// +// Разделение простое и важное: +// * ЧТО такое ствол (дальность, урон, разброс, магазин, вид вспышки) — +// это FirearmDef на сущности-оружии, sim/weapon_defs.h; +// * В КАКОМ ОН СЕЙЧАС СОСТОЯНИИ (откат, патроны, перезарядка, увод ствола) — +// это Firearm здесь, и живёт оно на бойце. +// Подменили сущность оружия — поменялись все статы разом, состояние обнулилось, +// и ни одно правило боя об этом не узнало. +// +// Правила боя от класса НЕ зависят. И стрелок, и боец ближнего боя обязаны +// проверить своих перед ударом; меняется только геометрия проверки — +// конус «дуло -> цель» против сектора замаха (docs/11-melee.md). +// ----------------------------------------------------------------------------- +#include + +#include "core/hash.h" +#include "core/math.h" +#include "sim/weapon_defs.h" +#include "tuning.h" + +// --- дальнобойное ------------------------------------------------------------ + +struct Firearm +{ + FirearmDef def{}; // копия статов сущности-оружия, обновляется каждый шаг + + // --- состояние --- + float cooldown = 0.0f; + int ammo = 0; + float reloadTimer = 0.0f; // > 0 — идёт перезарядка + float recoilDeg = 0.0f; // увод ствола, гаснет сам + uint32_t shotSeq = 0; // номер выстрела: сеет детерминированный разброс + + bool Reloading() const { return reloadTimer > 0.0f; } + bool Empty() const { return ammo <= 0; } + + // Доля магазина — для оверлея и HUD. + float AmmoFrac() const + { + return (def.magazine > 0) ? Clampf(float(ammo) / float(def.magazine), 0.0f, 1.0f) : 0.0f; + } + + // Разброс в радианах: стоя — минимальный, на ходу растёт до spreadMoveDeg, + // сверху ложится накопленный увод ствола. + // + // Это ЕДИНСТВЕННОЕ место, где считается разброс. Его же читает проверка + // линии огня: конус, по которому реально уйдёт пуля, обязан быть тем самым + // конусом, который проверили на своих (см. ai/firing_solver.cpp). + float SpreadRad(float speed) const + { + const float m = Clampf(speed / std::max(0.01f, MaxAgentSpeed()), 0.0f, 1.0f); + const float deg = Lerpf(def.spreadStandDeg, def.spreadMoveDeg, m) + recoilDeg; + return std::max(0.0f, deg) * DEG2RAD_F * std::max(0.0f, g_tune.spreadScale); + } + + // Отклонение конкретного выстрела внутри конуса. Не генератор: чистый хеш + // от (владелец, номер выстрела), поэтому прогон воспроизводим побитово. + float ShotOffset(int ownerIndex, float spreadRad) const + { + const uint32_t h = Hash2(uint32_t(ownerIndex) * 2654435761u, shotSeq); + // Треугольное распределение: центр конуса вероятнее краёв. + const float a = HashSigned(h); + const float b = HashSigned(HashU32(h ^ 0x9E3779B9u)); + return 0.5f * (a + b) * spreadRad; + } +}; + +// --- ближний бой ------------------------------------------------------------- + +// Три фазы, как в любом ощутимом ударе: замах видно заранее, урон живёт +// в коротком окне, после удара боец открыт. Без разделения удар превращается +// в мгновенный хитскан и не читается на 480x270. +enum class MeleeState : uint8_t +{ + IDLE = 0, // подходит или ждёт перезарядку + WINDUP, // замах: ноги вкопаны, ось удара уже зафиксирована + STRIKE, // активное окно: лезвие метёт дугу, есть рывок вперёд + RECOVER, // после удара — уязвим и медленный +}; + +struct MeleeWeapon +{ + // --- параметры (копируются с сущности-оружия каждый шаг) --- + float reach = 1.15f; // от центра тела до конца замаха + float arcDeg = 100.0f; // ширина сектора + float windup = 0.18f; + float strike = 0.12f; + float recover = 0.26f; + float interval = 0.62f; // между началами замахов + float damage = 110.0f; + float knockback = 2.4f; // импульс мишени ДО её сопротивления отбросу + + // --- состояние --- + MeleeState state = MeleeState::IDLE; + float phase = 0.0f; // остаток текущей фазы, сек + float cooldown = 0.0f; + float dir = 0.0f; // ось удара, зафиксирована на замахе + float sweepSign = 1.0f; // с какой стороны заходит лезвие (чередуется) + int targetId = -1; + bool inReach = false; // цель в зоне удара прямо сейчас + bool arcBlockedByAlly = false; // в секторе свой -> бить нельзя (аналог 6.3) + uint32_t hitMask = 0; // кого уже задели ЭТИМ взмахом + + // --- связка --- + int comboStep = 0; // какой удар связки будет следующим + float comboTimer = 0.0f; // сколько ещё держится связка + + // --- запечённые параметры ТЕКУЩЕГО взмаха --- + // Связка гнёт ширину, урон и тайминги, а поля выше переписываются из + // снаряжения КАЖДЫЙ шаг (SyncLoadoutFromTuning). Поэтому значения взмаха + // фиксируются на старте замаха и живут отдельно — иначе удар менял бы + // свойства прямо в полёте. + float curHalfArc = 0.0f; + float curDamage = 0.0f; + float curKnock = 0.0f; + float curWindup = 0.0f; + float curStrike = 0.0f; + float curRecover = 0.0f; + + bool Committed() const + { + return state == MeleeState::WINDUP || state == MeleeState::STRIKE; + } + + const MeleeComboStep& NextComboStep() const + { + return MELEE_COMBO[(comboStep >= 0 && comboStep < MELEE_COMBO_STEPS) ? comboStep : 0]; + } + + // Полуширина сектора. Во время взмаха — запечённая, иначе — та, что будет + // у СЛЕДУЮЩЕГО удара связки. Все потребители (проверка сектора, дуга, + // оверлей, резерв линии) обязаны видеть одно и то же число: иначе + // нарисованное и то, что бьёт, разъедутся. + float HalfArc() const + { + if (Committed() || state == MeleeState::RECOVER) return curHalfArc; + return arcDeg * 0.5f * DEG2RAD_F * NextComboStep().arcMul; + } + + // Запечь параметры взмаха из базовых характеристик и шага связки. + void BakeSwing(const MeleeComboStep& cs) + { + curHalfArc = arcDeg * 0.5f * DEG2RAD_F * cs.arcMul; + curDamage = damage * cs.dmgMul; + curKnock = knockback * cs.knockMul; + curWindup = windup * cs.windupMul; + curStrike = strike * cs.strikeMul; + curRecover = recover * cs.recoverMul; + } + + float PhaseLen() const + { + switch (state) + { + case MeleeState::WINDUP: return curWindup; + case MeleeState::STRIKE: return curStrike; + case MeleeState::RECOVER: return curRecover; + default: return 1.0f; + } + } + + // 0 в начале фазы, 1 в конце. + float Progress() const + { + return Clampf(1.0f - phase / std::max(1e-4f, PhaseLen()), 0.0f, 1.0f); + } + + // Где лезвие при заданном прогрессе взмаха: от одного края сектора к другому. + float BladeAngleAt(float progress) const + { + const float half = curHalfArc; + return WrapPi(dir + sweepSign * (-half + 2.0f * half * progress)); + } +}; diff --git a/src/sim/squad.cpp b/src/sim/squad.cpp new file mode 100644 index 0000000..c872350 --- /dev/null +++ b/src/sim/squad.cpp @@ -0,0 +1,291 @@ +#include "sim/squad.h" + +#include "ai/lane_registry.h" + +namespace +{ + +// Локальные слоты строя: x = вперёд, y = вправо. Множатся на formationSpacing. +const float kWedge[NUM_AGENTS][2] = { + { 1.0f, 0.0f}, + { 0.0f, -0.9f}, + { 0.0f, 0.9f}, + {-1.0f, -1.8f}, + {-1.0f, 1.8f}, +}; + +const float kLine[NUM_AGENTS][2] = { + {0.0f, -2.0f}, + {0.0f, -1.0f}, + {0.0f, 0.0f}, + {0.0f, 1.0f}, + {0.0f, 2.0f}, +}; + +} // namespace + +const char* FormationName(Formation f) +{ + switch (f) + { + case Formation::WEDGE: return "WEDGE"; + case Formation::LINE: return "LINE"; + case Formation::RING: return "RING"; + default: return "?"; + } +} + +void Squad::Init(ecs::World& world, Vec2 at) +{ + anchor = at; + anchorPrev = at; + anchorVel = {}; + forward = {1.0f, 0.0f}; + state = AgentState::HOLDING; + idleTimer = g_tune.holdDelay; + holdElapsed = 0.0f; + urgency = 0.0f; + sprinting = false; + formSpacing = 1.0f; + formStretch = 1.0f; + + meleeCount = std::min(std::max(meleeCount, 0), NUM_AGENTS); + pistolCount = std::min(std::max(pistolCount, 0), NUM_AGENTS - meleeCount); + + // Сначала создаём все сущности бойцов, и только потом берём указатель на + // плотный массив пула: до конца заполнения он может переехать. + ecs::Entity ids[NUM_AGENTS]; + for (int i = 0; i < NUM_AGENTS; ++i) + { + ids[i] = world.Create(); + world.Add(ids[i], Agent{}); + } + agents.p = world.All().data(); + agents.n = NUM_AGENTS; + + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = agents[i]; + a = Agent{}; + a.self = ids[i]; + a.slotIndex = i; + + // Клинки занимают первые слоты: в клине это остриё и левое крыло, + // то есть ровно те, кто и так упирается в противника первым. + // Пистолеты — последние слоты: короткий ствол уезжает в хвост клина. + const bool isMelee = (i < meleeCount); + const bool isPistol = !isMelee && (i >= NUM_AGENTS - pistolCount); + + a.cls = isMelee ? WeaponClass::MELEE : WeaponClass::RANGED; + a.gunId = isPistol ? FirearmId::PISTOL : FirearmId::RIFLE; + a.weaponEntity = SpawnWeapon(world, a.cls, a.gunId); + + a.melee.sweepSign = (i & 1) ? -1.0f : 1.0f; + a.pos = SlotWorld(i); + a.prevPos = a.pos; + a.postPos = a.pos; + a.facing = 0.0f; + a.state = state; + a.currentTargetId = -1; + a.commitTimer = 0.0f; + // Фазы решателя разведены: за кадр решает максимум один агент (6.5). + a.solveTimer = g_tune.solveInterval * (float(i) / float(NUM_AGENTS)); + + SyncLoadout(world, a); + a.gun.ammo = a.gun.def.magazine; // выходим с полным магазином + } +} + +Vec2 Squad::SlotLocal(int i) const +{ + // Интервал и вытяжение — это ТЕКУЩЕЕ состояние строя, а не константа: + // на стоянке отряд собирается, в беге растягивается вдоль движения. + const float s = g_tune.formationSpacing * formSpacing; + const float fwd = s * formStretch; + + switch (formation) + { + case Formation::LINE: + return {kLine[i][0] * fwd, kLine[i][1] * s}; + case Formation::RING: + { + const float ang = float(i) * (TWO_PI_F / float(NUM_AGENTS)); + const Vec2 d = FromAngle(ang) * 1.5f; + return {d.x * fwd, d.y * s}; + } + case Formation::WEDGE: + default: + return {kWedge[i][0] * fwd, kWedge[i][1] * s}; + } +} + +Vec2 Squad::SlotWorld(int i) const +{ + const Vec2 local = SlotLocal(i); + const Vec2 right = Perp(forward); + return anchor + forward * local.x + right * local.y; +} + +Vec2 Squad::GoalFor(int i) const +{ + // Боец ближнего боя ведёт себя одинаково в обоих состояниях: пока цель + // внутри его круга, он идёт к ней, а не в слот. Иначе клинок оказывался бы + // полезен только на стоянке — а он нужен как раз в движении. + // Но в спринте цель отменяется: бежим, а не деремся. + if (agents[i].IsMelee() && !sprinting) return agents[i].postPos; + if (agents[i].IsMelee()) return SlotWorld(i); + + // В движении — слот строя, на месте — выбранная решателем огневая позиция. + return (state == AgentState::ADVANCING) ? SlotWorld(i) : agents[i].postPos; +} + +Vec2 Squad::Centroid() const +{ + Vec2 c{}; + for (int i = 0; i < NUM_AGENTS; ++i) c += agents[i].pos; + return c / float(NUM_AGENTS); +} + +void Squad::UpdateAnchorAndState(Vec2 moveWorldDir, bool sprint, const Tilemap& map, float dt) +{ + anchorPrev = anchor; + + const bool moving = LengthSq(moveWorldDir) > 1e-6f; + const AgentState prevState = state; + const Vec2 c = Centroid(); + + // --- натяжение поводка ---------------------------------------------------- + // Поводок УПРУГИЙ, а не жёсткий. За мягкой границей курсор продолжает + // уходить, но идёт всё тяжелее, и до жёсткого предела не доходит никогда. + // + // Жёсткий поводок здесь не годился принципиально: он мгновенно упирается, + // дистанция намертво встаёт в одно значение, и по ней уже нельзя отличить + // «подправил направление» от «тяну отряд вперёд изо всех сил». Упругий + // поводок превращает дистанцию в непрерывную величину: чем сильнее тянешь, + // тем дальше уезжает курсор и тем быстрее бегут за ним. + const float soft = std::max(0.2f, g_tune.anchorLeash); + const float hard = std::max(soft + 0.2f, g_tune.anchorLeashMax); + const float start = soft * Clampf(g_tune.urgeStartFrac, 0.0f, 0.95f); + const float dist = Distance(anchor, c); + + float pull = 0.0f; + if (moving) pull = Clampf((dist - start) / (hard - start), 0.0f, 1.0f); + if (moving && sprint) pull = 1.0f; // Shift — приказ бежать, без уговоров + + const float rate = (pull > urgency) ? g_tune.urgeAttack : g_tune.urgeRelease; + urgency += (pull - urgency) * (1.0f - std::exp(-std::max(0.01f, rate) * dt)); + urgency = Clampf(urgency, 0.0f, 1.0f); + // Бег без стрельбы — либо по прямому приказу, либо когда курсор реально + // уехал: отряд догоняет и ему не до целей. + sprinting = (moving && sprint) || (urgency >= g_tune.sprintAt); + + // --- сам курсор ----------------------------------------------------------- + // У него есть разгон и торможение: мгновенная смена скорости — это и есть + // «топорно». Отпустил клавиши — курсор доезжает, а не втыкается в грунт. + const float over = Clampf((dist - soft) / (hard - soft), 0.0f, 1.0f); + const float dragK = std::max(0.08f, 1.0f - Clampf(g_tune.leashDrag, 0.0f, 1.0f) * over); + const float speed = (sprint ? g_tune.anchorSpeedFast : g_tune.anchorSpeed) * dragK; + + const Vec2 want = moving ? Normalized(moveWorldDir, forward) * speed : Vec2{}; + const Vec2 dv = want - anchorVel; + anchorVel += ClampLength(dv, std::max(0.1f, g_tune.anchorAccel) * dt); + anchor += anchorVel * dt; + + if (moving) forward = Normalized(moveWorldDir, forward); + + // Жёсткий предел. Сопротивление обычно не даёт до него дойти, но отряд может + // и застрять в стене — тогда курсор без предела уехал бы за полкарты. + const Vec2 d = anchor - c; + const float len = Length(d); + if (len > hard && len > 1e-5f) + { + const Vec2 n = d / len; + anchor = c + n * hard; + const float vn = Dot(anchorVel, n); + if (vn > 0.0f) anchorVel -= n * vn; + } + + map.ResolveCircle(anchor, g_tune.anchorRadius); + + // --- состояние отряда ------------------------------------------------------ + if (moving) + { + idleTimer = 0.0f; + state = AgentState::ADVANCING; + holdElapsed = 0.0f; + } + else + { + idleTimer += dt; + if (idleTimer >= g_tune.holdDelay) state = AgentState::HOLDING; + if (state == AgentState::HOLDING) holdElapsed += dt; + } + + // --- дыхание строя --------------------------------------------------------- + const float wantSpacing = (state == AgentState::HOLDING) + ? g_tune.holdSpacing + : Lerpf(1.0f, g_tune.sprintSpacing, urgency); + const float wantStretch = Lerpf(1.0f, g_tune.sprintStretch, urgency); + const float k = 1.0f - std::exp(-std::max(0.01f, g_tune.formMorphRate) * dt); + formSpacing += (wantSpacing - formSpacing) * k; + formStretch += (wantStretch - formStretch) * k; + + if (state != prevState) + { + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = agents[i]; + a.commitTimer = 0.0f; + // Встали — остаёмся на месте, пока решатель не найдёт лучше (6.5). + if (state == AgentState::HOLDING) a.postPos = a.pos; + } + if (state == AgentState::HOLDING) holdElapsed = 0.0f; + } + + for (int i = 0; i < NUM_AGENTS; ++i) agents[i].state = state; +} + +void Squad::UpdateMovement(const Tilemap& map, const LaneRegistry* lanes, + const std::vector& targets, float dt) +{ + // Скорость — не тумблер «шаг/рывок», а непрерывная величина от натяжения. + const float baseSpeed = MoveSpeed(); + + for (int i = 0; i < NUM_AGENTS; ++i) + { + Agent& a = agents[i]; + a.prevPos = a.pos; + + const Vec2 goal = GoalFor(i); + const bool lunging = a.IsMelee() && a.melee.state == MeleeState::STRIKE; + + // --- рывок клинка -------------------------------------------------- + // В активном окне удара ось уже зафиксирована, и боец едет по ней. + // Seek/separation/расступание тут молчат: удар — это обязательство, + // а не предложение. Стены остаются: сквозь них не рвётся никто. + if (lunging) + { + const float speed = g_tune.meleeLungeSpeed; + const Vec2 dir = FromAngle(a.melee.dir); + Vec2 desired = dir * speed; + desired += WallAvoidForce(a, map, dir, speed) * g_tune.wWallAvoid; + IntegrateAgent(a, desired, speed, dt, map, g_tune.meleeLungeAccel); + continue; + } + + // --- обычные слои, порядок 6.7 -------------------------------------- + const float maxSpeed = baseSpeed * a.SpeedScale(); + + Vec2 desired = SeekForce(a, goal, maxSpeed) * g_tune.wSeek; + desired += SeparationForce(a, agents.data(), NUM_AGENTS, maxSpeed) * g_tune.wSeparation; + // Замах — это обязательство. Выдёргивать бойца из чужой линии огня + // посреди него бессмысленно: стрелок всё равно не выстрелит (правило + // 6.3 запрещает), а удар сорвётся. Расступаться боец будет до и после. + if (lanes && !(a.IsMelee() && a.melee.Committed())) + desired += lanes->AvoidanceForce(i, a.pos, a.bodyRadius, maxSpeed) * g_tune.wLaneAvoid; + desired += TargetPushForce(a, targets, maxSpeed) * g_tune.wTargetPush; + desired += WallAvoidForce(a, map, Normalized(goal - a.pos), maxSpeed) * g_tune.wWallAvoid; + + IntegrateAgent(a, desired, maxSpeed, dt, map); + } +} diff --git a/src/sim/squad.h b/src/sim/squad.h new file mode 100644 index 0000000..145a84c --- /dev/null +++ b/src/sim/squad.h @@ -0,0 +1,93 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Отряд: якорь, строй, состояния (спек 6.2), сборка слоёв движения агентов. +// +// Якорь («внутренний курсор») — не телепорт и не переключатель. У него своя +// скорость, свой разгон и упругий поводок до центра масс отряда. Чем сильнее +// игрок тянет курсор от отряда, тем выше НАТЯЖЕНИЕ (urgency): отряд ускоряется, +// строй растягивается вдоль движения, а на самом верху шкалы бойцы просто +// бегут и не стреляют вовсе. Подробности — docs/05-squad-ai.md. +// ----------------------------------------------------------------------------- +#include + +#include "ecs/ecs.h" +#include "sim/agent.h" +#include "sim/target.h" +#include "world/tilemap.h" + +struct LaneRegistry; // ai/lane_registry.h — расступание из чужих линий (6.6) + +enum class Formation : uint8_t +{ + WEDGE = 0, // клин + LINE = 1, // линия + RING = 2, // кольцо + COUNT = 3, +}; + +const char* FormationName(Formation f); + +// Окно в пул компонентов Agent: снаружи это по-прежнему «массив агентов». +// Пул плотный, поэтому data() — обычный сплошной Agent*, и ai/ про ECS не знает. +struct AgentSpan +{ + Agent* p = nullptr; + int n = 0; + + Agent& operator[](int i) { return p[i]; } + const Agent& operator[](int i) const { return p[i]; } + Agent* data() { return p; } + const Agent* data() const { return p; } + int size() const { return n; } +}; + +struct Squad +{ + AgentSpan agents; + + Vec2 anchor{}; + Vec2 anchorPrev{}; + Vec2 anchorVel{}; // у курсора есть инерция, а не только позиция + Vec2 forward{1.0f, 0.0f}; // ориентация строя = направление движения + AgentState state = AgentState::HOLDING; + float idleTimer = 0.0f; // сколько нет ввода + float holdElapsed = 0.0f; // сколько уже в HOLDING (для SETTLE TIME) + Formation formation = Formation::WEDGE; + + // --- натяжение поводка --------------------------------------------------- + // 0 — курсор рядом, отряд идёт шагом и работает по целям. + // 1 — курсор упёрся в поводок, отряд бежит и огня не ведёт. + float urgency = 0.0f; + bool sprinting = false; // urgency выше порога: бег без атаки + + // Текущее состояние строя. Меняется плавно: строй ДЫШИТ, а не щёлкает + // между двумя таблицами координат. + float formSpacing = 1.0f; // общий множитель интервала + float formStretch = 1.0f; // вытяжение вдоль направления движения + + // Сколько первых слотов держат клинок. Ставится ДО Init. + int meleeCount = DEFAULT_MELEE_COUNT; + // Сколько ПОСЛЕДНИХ слотов носят пистолет вместо карабина. Ставится ДО Init. + int pistolCount = DEFAULT_PISTOL_COUNT; + + void Init(ecs::World& world, Vec2 at); + + Vec2 SlotLocal(int i) const; // локальные координаты слота (x = вперёд) + Vec2 SlotWorld(int i) const; // слот в мире + Vec2 GoalFor(int i) const; // куда агент реально идёт + Vec2 Centroid() const; // центр масс отряда — к нему привязан поводок + + int RangedCount() const { return NUM_AGENTS - meleeCount; } + + // Текущая скорость пешего хода отряда с учётом натяжения. + float MoveSpeed() const { return Lerpf(g_tune.moveSpeed, g_tune.moveSpeedFast, urgency); } + + // Движение якоря (в МИРОВЫХ осях — перевод из экранных делает вызывающий), + // натяжение поводка, дыхание строя и определение ADVANCING/HOLDING. + void UpdateAnchorAndState(Vec2 moveWorldDir, bool sprint, const Tilemap& map, float dt); + + // Слои движения агентов: seek -> separation -> laneAvoidance -> targetPush + // -> wallAvoidance. Рывок клинка подменяет seek целиком. + void UpdateMovement(const Tilemap& map, const LaneRegistry* lanes, + const std::vector& targets, float dt); +}; diff --git a/src/sim/target.cpp b/src/sim/target.cpp new file mode 100644 index 0000000..0eee752 --- /dev/null +++ b/src/sim/target.cpp @@ -0,0 +1,96 @@ +#include "sim/target.h" + +namespace +{ + +// Кучки: 5 на арене (рядом со стартом), 3 в северной комнате, +// 3 в западной, 1 одиночная в восточной. Всего 12. +// +// Северная кучка стоит НАПРОТИВ прохода x=30..31: из коридора до неё есть +// чистая линия. Это тот самый тест-кейс из спека — в узком проходе правило +// «не стрелять сквозь своих» упирается в геометрию, и отряд обязан вытянуться +// в колонну: стреляет передний, задние молчат. +// +// Кучка обязана быть В ПРЕДЕЛАХ ДАЛЬНОСТИ от середины прохода (y≈14), иначе +// стрелять из коридора не по чему и тест-кейс проверяет пустоту. При weaponRange +// 7.2 ближняя мишень стоит в ~6.5 юнита: запас есть, но небольшой — если менять +// дальность, эти координаты надо пересчитывать вместе с ней. +const float kTargetSpots[NUM_TARGETS][2] = { + {30.5f, 20.5f}, {31.5f, 22.5f}, {29.5f, 23.5f}, {32.5f, 21.5f}, {30.5f, 24.5f}, + {29.5f, 8.5f}, {31.5f, 7.5f}, {27.5f, 10.5f}, + { 7.5f, 40.5f}, { 9.5f, 42.5f}, { 6.5f, 43.5f}, + {43.5f, 35.5f}, +}; + +// Сопротивление отбросу по слотам. Не случайное: в каждой кучке есть кто-то +// тяжёлый, кого клинком не сдвинуть, и кто-то лёгкий, кто улетает от первого +// же удара. Иначе «отброс» и «сопротивление» — два числа, которых не видно. +const float kTargetKnockResist[NUM_TARGETS] = { + 0.00f, 0.65f, 0.15f, 0.40f, 0.00f, + 0.55f, 0.10f, 0.30f, + 0.20f, 0.70f, 0.05f, + 0.85f, +}; + +} // namespace + +void SpawnTargets(ecs::World& world) +{ + for (int i = 0; i < NUM_TARGETS; ++i) + { + Target t; + t.self = world.Create(); + t.pos = {kTargetSpots[i][0], kTargetSpots[i][1]}; + t.home = t.pos; + t.vel = {}; + t.hp = g_tune.targetHP; + t.maxHp = g_tune.targetHP; + t.radius = g_tune.targetRadius; + t.respawnTimer = 0.0f; + t.alive = true; + t.knockResist = kTargetKnockResist[i]; + world.Add(t.self, t); + } +} + +void KnockTarget(Target& t, Vec2 dir, float speed) +{ + t.vel += dir * (speed * t.KnockScale()); +} + +void UpdateTargets(std::vector& targets, float dt) +{ + // Отдача гасится и мишень возвращается на своё место: расстановка уровня + // захардкожена, и «уползание» мишеней ломало бы все замеры разом. + const float damp = std::exp(-g_tune.targetKnockDamp * dt); + const float pull = 1.0f - std::exp(-g_tune.targetReturnRate * dt); + + for (Target& t : targets) + { + t.radius = g_tune.targetRadius; + t.maxHp = g_tune.targetHP; + + t.pos += t.vel * dt; + t.vel *= damp; + t.pos += (t.home - t.pos) * pull; + + if (t.alive) continue; + + t.respawnTimer -= dt; + if (t.respawnTimer <= 0.0f) + { + t.alive = true; + t.hp = g_tune.targetHP; + t.pos = t.home; + t.vel = {}; + } + } +} + +int CountAliveTargets(const std::vector& targets) +{ + int n = 0; + for (const Target& t : targets) + if (t.alive) ++n; + return n; +} diff --git a/src/sim/target.h b/src/sim/target.h new file mode 100644 index 0000000..7b14539 --- /dev/null +++ b/src/sim/target.h @@ -0,0 +1,52 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Мишени: статичные, не атакуют, респавнятся на том же месте. +// 12 штук кучками (5 / 3 / 3 / 1) — расстановка захардкожена. +// +// Target — компонент ECS: сущности мишеней создаются в SpawnTargets, а вектор, +// по которому ходят правила, — это плотный массив пула (см. ecs/ecs.h). +// ----------------------------------------------------------------------------- +#include + +#include "core/math.h" +#include "ecs/ecs.h" +#include "tuning.h" + +struct Target +{ + ecs::Entity self = ecs::NO_ENTITY; + + Vec2 pos{}; + // Своё место. Удар отбрасывает мишень, после чего она возвращается сюда: + // без отдачи попадание в упор ничем не отличается от промаха. + Vec2 home{}; + Vec2 vel{}; + float hp = 0.0f; + float maxHp = 0.0f; + float respawnTimer = 0.0f; + float radius = 0.34f; + bool alive = true; + + // Сопротивление отбросу, 0..1. 0 — мишень летит от удара как есть, + // 1 — не сдвигается вообще. Тяжёлая цель гасит импульс клинка, и это + // единственное, чем она отличается от лёгкой при равном HP. + float knockResist = 0.0f; + + // Во сколько раз ослабляется импульс с учётом общего множителя из tuning. + float KnockScale() const + { + const float r = Clampf(knockResist * g_tune.knockResistScale, 0.0f, 0.98f); + return 1.0f - r; + } +}; + +// Импульс от удара (dir нормализован вызывающим). speed — импульс ДО того, +// как мишень ему сопротивляется: сопротивление применяется здесь, в одном месте, +// иначе половина источников урона про него забудет. +void KnockTarget(Target& t, Vec2 dir, float speed); + +void SpawnTargets(ecs::World& world); +void UpdateTargets(std::vector& targets, float dt); + +// Число живых мишеней (знаменатель в оценке покрытия, спек 6.5). +int CountAliveTargets(const std::vector& targets); diff --git a/src/sim/weapon_defs.h b/src/sim/weapon_defs.h new file mode 100644 index 0000000..b731b09 --- /dev/null +++ b/src/sim/weapon_defs.h @@ -0,0 +1,207 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Каталог оружия: ЧТО такое ствол или клинок, в отрыве от того, кто его держит. +// +// Оружие — отдельная сущность ECS с компонентом WeaponItem. Боец хранит только +// ссылку на неё (Agent::weaponEntity) и рабочее состояние выстрела (патроны, +// откат, увод ствола). Поэтому «дать бойцу пистолет» — это подменить компонент +// на его сущности-оружии, а не править ни агента, ни правила боя. +// +// Где живут числа. Общее правило прототипа — все числа в tuning.h. Здесь оно +// соблюдено с одной оговоркой, записанной в docs/08-decisions.md: КАРАБИН +// (оружие по умолчанию, то самое, на котором меряются критерии приёмки) читает +// свои параметры из g_tune, поэтому все прежние ручки оверлея и --set работают +// как работали. Остальные стволы — записи каталога: у второго ствола не может +// быть «того же самого» weaponRange, иначе он не второй ствол. +// +// Визуальные параметры атаки лежат ЗДЕСЬ ЖЕ, но в нейтральном виде: длины, +// радиусы в пикселях и байты RGB. Ни одного типа рендера в sim/ не появилось — +// цвет собирает render/fx.cpp. Так у пистолета своя вспышка и свой трассер, +// и при этом правило «sim не знает про рендер» не нарушено. +// ----------------------------------------------------------------------------- +#include + +#include "core/math.h" +#include "tuning.h" + +enum class WeaponClass : uint8_t +{ + RANGED = 0, // ствол: линия огня, снаряд, правило 6.3 + MELEE = 1, // клинок: сектор замаха, то же правило в угловой форме +}; + +inline const char* WeaponClassName(WeaponClass c) +{ + return (c == WeaponClass::MELEE) ? "MELEE" : "RANGED"; +} + +enum class FirearmId : uint8_t +{ + RIFLE = 0, // штатный карабин отряда: числа из tuning.h + PISTOL = 1, // короткоствол: ближе, быстрее, мельче магазин + COUNT = 2, +}; + +// --- ствол ------------------------------------------------------------------- + +struct FirearmDef +{ + const char* name = "rifle"; + + // баллистика и урон + float range = 7.2f; + float fireInterval = 0.35f; + float damage = 12.0f; + float laneHalfWidth = 0.10f; + float muzzleOffset = 0.30f; + float bulletSpeed = 22.0f; + float bulletRadius = 0.04f; + float knockback = 0.35f; // импульс мишени от попадания + + // разброс: стоя, на полном ходу, и увод ствола за выстрел + float spreadStandDeg = 0.9f; + float spreadMoveDeg = 4.2f; + float spreadRecoilDeg = 0.55f; + float spreadRecoilMax = 3.0f; + float recoilDecay = 3.2f; // 1/сек + + // перезарядка + int magazine = 24; + float reloadTime = 1.9f; + + // визуал атаки (нейтральные числа: пиксели, секунды, байты RGB) + float tracerLength = 1.30f; + float muzzleRadiusPx = 5.0f; + float muzzleTime = 0.07f; + float muzzleFlamePx = 0.35f; // длина языка пламени, юнитов мира + float flashPower = 0.55f; // как источник света + float flashRadius = 4.0f; + float shakePerShot = 0.55f; + uint8_t tracerR = 255, tracerG = 240, tracerB = 205; + uint8_t muzzleR = 255, muzzleG = 225, muzzleB = 150; +}; + +// --- клинок ------------------------------------------------------------------ + +struct BladeDef +{ + const char* name = "blade"; + + float reach = 1.40f; + float arcDeg = 100.0f; + float windup = 0.17f; + float strike = 0.13f; + float recover = 0.24f; + float interval = 0.60f; + float damage = 130.0f; + float knockback = 2.4f; // импульс мишени, юнитов/сек + float lungeSpeed = 3.4f; // рывок в момент удара +}; + +// --- компонент сущности-оружия ------------------------------------------------ + +struct WeaponItem +{ + WeaponClass cls = WeaponClass::RANGED; + FirearmId gunId = FirearmId::RIFLE; + FirearmDef gun{}; + BladeDef blade{}; +}; + +// --- каталог ------------------------------------------------------------------ + +// Карабин: параметры берутся из tuning, чтобы прежние ручки и --set остались +// рабочими (см. шапку файла). +inline FirearmDef RifleDef() +{ + FirearmDef d; + d.name = "rifle"; + d.range = g_tune.weaponRange; + d.fireInterval = g_tune.fireInterval; + d.damage = g_tune.damage; + d.laneHalfWidth = g_tune.laneHalfWidth; + d.muzzleOffset = g_tune.muzzleOffset; + d.bulletSpeed = g_tune.bulletSpeed; + d.bulletRadius = g_tune.bulletRadius; + d.knockback = g_tune.bulletKnock; + + d.spreadStandDeg = g_tune.spreadStandDeg; + d.spreadMoveDeg = g_tune.spreadMoveDeg; + d.spreadRecoilDeg = g_tune.spreadRecoilDeg; + d.spreadRecoilMax = g_tune.spreadRecoilMax; + d.recoilDecay = g_tune.spreadRecoilDecay; + + d.magazine = int(g_tune.magazineRifle); + d.reloadTime = g_tune.reloadRifle; + + d.tracerLength = g_tune.tracerLength; + d.muzzleRadiusPx = g_tune.muzzleRadiusPx; + d.muzzleTime = g_tune.muzzleTime; + d.flashPower = g_tune.flashPower; + d.flashRadius = g_tune.flashRadius; + d.shakePerShot = g_tune.shakePerShot; + return d; +} + +// Пистолет: бьёт ближе и слабее, но чаще; на ходу «гуляет» заметно сильнее +// карабина, зато перезаряжается вдвое быстрее. Вспышка мельче и холоднее, +// трассер короче — ствол должен читаться по картинке, а не только по цифрам. +inline FirearmDef PistolDef() +{ + FirearmDef d; + d.name = "pistol"; + d.range = 4.6f; + d.fireInterval = 0.22f; + d.damage = 8.0f; + d.laneHalfWidth = 0.10f; + d.muzzleOffset = 0.24f; + d.bulletSpeed = 17.0f; + d.bulletRadius = 0.04f; + d.knockback = 0.22f; + + d.spreadStandDeg = 1.6f; + d.spreadMoveDeg = 6.5f; + d.spreadRecoilDeg = 0.9f; + d.spreadRecoilMax = 4.5f; + d.recoilDecay = 4.5f; + + d.magazine = 7; + d.reloadTime = 1.15f; + + d.tracerLength = 0.85f; + d.muzzleRadiusPx = 3.5f; + d.muzzleTime = 0.055f; + d.muzzleFlamePx = 0.26f; + d.flashPower = 0.42f; + d.flashRadius = 3.2f; + d.shakePerShot = 0.34f; + d.tracerR = 255; d.tracerG = 214; d.tracerB = 170; + d.muzzleR = 255; d.muzzleG = 205; d.muzzleB = 130; + return d; +} + +inline FirearmDef FirearmDefOf(FirearmId id) +{ + return (id == FirearmId::PISTOL) ? PistolDef() : RifleDef(); +} + +inline const char* FirearmName(FirearmId id) +{ + return (id == FirearmId::PISTOL) ? "PISTOL" : "RIFLE"; +} + +// Клинок пока один, и его числа целиком в tuning. +inline BladeDef DefaultBladeDef() +{ + BladeDef d; + d.reach = g_tune.meleeReach; + d.arcDeg = g_tune.meleeArcDeg; + d.windup = g_tune.meleeWindup; + d.strike = g_tune.meleeStrike; + d.recover = g_tune.meleeRecover; + d.interval = g_tune.meleeInterval; + d.damage = g_tune.meleeDamage; + d.knockback = g_tune.meleeKnockback; + d.lungeSpeed = g_tune.meleeLungeSpeed; + return d; +} diff --git a/src/tuning.h b/src/tuning.h new file mode 100644 index 0000000..f534a73 --- /dev/null +++ b/src/tuning.h @@ -0,0 +1,459 @@ +#pragma once +#include +// ----------------------------------------------------------------------------- +// Единственное место, где живут числа прототипа. +// В коде не должно быть магических констант — всё берётся отсюда. +// +// * блок COMPILE-TIME — размеры буферов/карты, менять только пересборкой; +// * struct Tuning — всё, что подкручивается в рантайме ([ ] выбор, - = шаг). +// ----------------------------------------------------------------------------- + +// --- compile-time константы -------------------------------------------------- + +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; + +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; // спрайт стены 32x32 (верхний ромб + грани) + +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; + +// Точка старта отряда (центральная арена). +constexpr float SQUAD_START_X = 26.5f; // ближе к кучке: дальность стала 7.2 +constexpr float SQUAD_START_Y = 26.5f; + +constexpr int NUM_AGENTS = 5; +constexpr int NUM_TARGETS = 12; +constexpr int MAX_BULLETS = 512; + +// Сколько слотов строя занимают бойцы ближнего боя (слоты 0..N-1). +// В клине это остриё и левое крыло — те, кто и так идёт первым. +constexpr int DEFAULT_MELEE_COUNT = 2; + +// Сколько ПОСЛЕДНИХ слотов носят пистолет вместо карабина. +// Короткий ствол уезжает в хвост клина: ему там и место. +constexpr int DEFAULT_PISTOL_COUNT = 1; + +// Сколько тайлов пола могут нести запечённую кровь. Каждый — своя копия +// спрайта 32x16 (2 КБ), то есть потолок ~2.4 МБ. Дальше новые пятна ложатся +// только на уже запачканные тайлы: декали вечные, но не бесконечные. +constexpr int BLOOD_TILE_BUDGET = 1200; + +// Решатель огневых позиций: 3 кольца x 12 направлений + текущая позиция. +constexpr int SOLVER_RINGS = 3; +constexpr int SOLVER_DIRS = 12; +constexpr int SOLVER_CANDIDATES = SOLVER_RINGS * SOLVER_DIRS + 1; + +// --- runtime-тюнинг ---------------------------------------------------------- + +struct Tuning +{ + // движение агента + float moveSpeed = 1.75f; // юнитов/сек: хоррор, а не шутер-беготня + float moveSpeedFast = 3.6f; // догоняют курсор быстро — иначе отряд отстаёт + float steerAccel = 18.0f; // тяжелее; НИЖЕ 16 нельзя — ломается критерий 11.4 + float bodyRadius = 0.28f; + float separationRadius = 0.7f; + float wSeek = 1.0f; + float wSeparation = 1.0f; + float wLaneAvoid = 2.4f; // строго выше wSeparation (спек 6.7) + float wWallAvoid = 1.2f; + float wallLookahead = 0.8f; + float wallSlide = 1.4f; // касательная составляющая обхода стен + float arriveRadius = 0.18f; + float turnRateDeg = 300.0f; // ствол тяжёлый + float wTargetPush = 1.0f; // мишень — тело, а не пустое место + float targetPushGap = 0.10f; // зазор поверх суммы радиусов + + // оружие (это ПАРАМЕТРЫ КАРАБИНА — оружия по умолчанию, на котором меряются + // критерии приёмки. Остальные стволы — записи каталога sim/weapon_defs.h) + float weaponRange = 7.2f; // -20% от исходных 9.0 + float fireInterval = 0.35f; + float laneHalfWidth = 0.10f; + float damage = 12.0f; + float safetyMargin = 0.15f; + float muzzleOffset = 0.3f; + float bulletSpeed = 22.0f; + float bulletRadius = 0.04f; + float bulletKnock = 0.35f; // импульс мишени от попадания пули + float aimToleranceDeg = 5.0f; // ствол должен быть доведён до цели + + // --- разброс ------------------------------------------------------------- + // Стоя ствол почти не гуляет, на полном ходу гуляет сильно, очередь его + // раскрывает. Тот же конус проверяется на своих перед спуском: правило 6.3 + // не ослаблено, оно просто считает по конусу вместо отрезка. + float spreadStandDeg = 0.9f; + float spreadMoveDeg = 4.2f; + float spreadRecoilDeg = 0.55f; // прибавка за выстрел + float spreadRecoilMax = 3.0f; + float spreadRecoilDecay = 3.2f; // градусов/сек оседания + float spreadScale = 1.0f; // общий множитель, ручка для замеров + + // --- перезарядка --------------------------------------------------------- + float magazineRifle = 24.0f; // патронов в магазине карабина + float reloadRifle = 1.9f; // сек + // Запас на манёвр союзника за время полёта пули (доля от moveSpeed). + // 0 = верить экстраполяции скорости буквально. + float shotPredictSlack = 0.3f; + + // --- ближний бой --------------------------------------------------------- + // Три фазы: замах видно, урон живёт в коротком окне, после удара боец открыт. + float meleeReach = 1.40f; // от центра тела до конца замаха + float meleeArcDeg = 100.0f; // ширина сектора удара + float meleeWindup = 0.17f; // замах — телеграф + float meleeStrike = 0.13f; // активное окно урона + float meleeRecover = 0.24f; // после удара + float meleeInterval = 0.60f; // между началами замахов + float meleeDamage = 130.0f; // 4 удара на мишень против 42 пуль + float meleeBladeDeg = 34.0f; // ширина полосы самого лезвия + float meleeAimToleranceDeg = 30.0f; // допуск разворота на старте замаха + float meleeAllyMargin = 0.14f; // запас к телу союзника в секторе + // На сколько взмахов вперёд смотреть на союзника при старте замаха + // (в долях windup+strike). 0 = верить только текущему положению. + float meleeStartPredict = 1.0f; + // Доля бокового размаха сектора, которую клинок резервирует в реестре линий. + // 1.0 = вся дуга; тогда своим нечем дышать. 0 = резерв шириной с отрезок. + float meleeReserveFrac = 0.55f; + float meleeGap = 0.12f; // зазор при подходе вплотную + float meleeLungeSpeed = 3.4f; // рывок в момент удара, юнитов/сек + float meleeLungeAccel = 120.0f; // рывок обязан успеть за 0.13 с + float meleeWindupScale = 0.20f; // множитель скорости на замахе + float meleeRecoverScale= 0.55f; + float meleeKnockback = 2.4f; // импульс мишени, юнитов/сек + // СВОЙ круг бойца: его отпускают от диска дальше, чем стрелка. + float meleeCohesionRadius = 5.6f; + float meleeSeekRadius = 7.0f; // дальше этого боец за целью не идёт вообще + // Штраф за уже занятую цель, в юнитах дистанции. Двое с клинками, вцепившиеся + // в одного, половину взмахов обрывают друг об друга — пусть расходятся. + float meleeClaimPenalty = 3.0f; + // Сколько держится связка после удара. Не успел продолжить — начинаешь + // серию заново с первого удара. + float meleeComboWindow = 1.10f; + + // мишени + float targetHP = 500.0f; + float targetRespawn = 3.0f; + float targetRadius = 0.34f; + float targetKnockDamp = 9.0f; // гашение импульса от удара + float targetReturnRate= 5.0f; // возврат на своё место + // Общий множитель сопротивления отбросу. Само сопротивление у каждой мишени + // своё (sim/target.cpp): тяжёлую клинком не сдвинуть, лёгкая улетает. + float knockResistScale = 1.0f; + + // отряд + float holdDelay = 0.22f; // сек без ввода -> HOLDING + float cohesionRadius = 2.1f; // стрелки держатся кучнее + float minEngageDist = 1.6f; // отмасштабировано под дальность 7.2 + float formationSpacing = 1.0f; // строй плотнее + float cameraSmooth = 9.0f; + float anchorRadius = 0.3f; // якорь тоже скользит вдоль стен + // Диск отзывчивее бойцов: команда читается мгновенно, а догоняют её ногами. + float anchorSpeed = 3.3f; + float anchorSpeedFast = 4.8f; + float anchorAccel = 20.0f; // разгон/торможение курсора, юнитов/сек^2 + // Поводок УПРУГИЙ, а не жёсткий: без него быстрый диск просто отрывается от + // отряда и теряет смысл, но жёсткий упор намертво фиксирует дистанцию, и по + // ней уже не отличить «подправил направление» от «тяну изо всех сил». + // anchorLeash — мягкая граница: до неё курсор идёт свободно; + // anchorLeashMax — жёсткий предел: страховка, до неё обычно не доходит; + // leashDrag — насколько тяжелеет курсор между границами (0..1). + float anchorLeash = 3.0f; + float anchorLeashMax = 5.0f; + float leashDrag = 0.75f; // на жёсткой границе остаётся 25% скорости + + // --- натяжение поводка (см. docs/05-squad-ai.md) -------------------------- + // Курсор упёрся в поводок, а игрок продолжает давить -> он хочет идти + // быстрее, чем отряд шагает. Это и есть команда «бегом»: отряд ускоряется, + // строй растягивается, а на верхней трети шкалы огонь прекращается вовсе. + float urgeStartFrac = 0.50f; // с какой доли поводка начинается натяжение + float urgeAttack = 2.6f; // как быстро натяжение набирается + float urgeRelease = 3.4f; // и как быстро отпускает + float sprintAt = 0.85f; // выше — спринт: бежим, не атакуем. + // Порог высокий намеренно: при удержании направления натяжение садится + // примерно на 0.54, то есть отряд идёт быстрым шагом И ПРОДОЛЖАЕТ работать + // по целям. Спринт остаётся тем, чем должен быть, — отдельным решением + // (Shift) или следствием того, что курсор реально уехал. + + // --- дыхание строя -------------------------------------------------------- + float holdSpacing = 0.90f; // на стоянке отряд собирается + float sprintSpacing = 1.30f; // в беге расходится + float sprintStretch = 1.55f; // и вытягивается вдоль движения + float formMorphRate = 4.0f; // скорость перестроения, 1/сек + + // решатель огневых позиций (6.5) + float solveInterval = 0.25f; + float commitTime = 0.6f; + float hysteresis = 15.0f; + float ring1 = 0.7f; // кольца решателя сжаты вслед за строем + float ring2 = 1.4f; + float ring3 = 2.1f; + float candMinAlly = 0.60f; // минимум до другого агента (было МЕНЬШЕ диаметра тела) + float sLaneClear = 100.0f; + float sCoverage = 25.0f; + float sBlockAlly = 35.0f; + float sDistCost = 9.0f; + float sCohesionCost = 24.0f; // отбегать от отряда дорого + float sTooClose = 60.0f; + // Жёсткая граница огневой позиции: дальше cohesionRadius + postLeash от диска + // кандидат просто отбраковывается. Одной цены мало — линия огня стоит 100 + // очков, и за неё решатель готов уйти сколько угодно далеко. А отряд, из + // которого стрелок ушёл на пять метров, отрядом быть перестаёт. + float postLeash = 1.0f; + + // расступание из чужих линий (6.6) + float laneAvoidStrength = 7.0f; + // Ширина РЕЗЕРВА линии относительно порога «тело в линии» из 6.3. + // >1 означает: агента отжимает ДО того, как он влез в чужой сектор. + // Правило стрельбы (6.3) от этого не меняется — см. docs/08-decisions.md. + float laneReserveScale = 2.0f; + + // ручное прицеливание (6.8) + float aimConeDeg = 20.0f; + float aimTurnRateDeg = 110.0f; // прицел ведётся тяжелее + + // метрики + float uptimeWindow = 10.0f; // окно FIRE UPTIME, сек + float settleQuorum = 4.0f; // сколько агентов нужно для SETTLE TIME + + // --- свет и туман войны (render-only, на симуляцию не влияет) ----------- + float sightRadius = 7.6f; // где обзор гаснет полностью + float sightFullRadius = 2.2f; // дальше сразу начинается спад: свет должен таять + float sightConeDeg = 100.0f; // конус взгляда агента + float sightConeSoftDeg = 22.0f; // мягкий край конуса + float sightPersonalRadius= 1.9f; // круговой «личный» ореол вокруг агента + float sightBrightness = 0.86f; // яркость видимого; остаток отдан вспышкам + float fogMemoryLevel = 0.13f; // как тускло помнится уже увиденное + float fogWallBleed = 0.92f; // затухание света вглубь блока стен + float fogFadeRate = 9.0f; // сглаживание во времени, чтобы не щёлкало + float fogEntityReveal = 0.30f; // ниже этого света сущность не показывается + float eyeRevealLight = 0.05f; // глаз мишени тлеет почти в полной темноте + float eyeRadiusPx = 3.0f; + float eyeLiftPx = 11.0f; // на уровне «головы» капсулы + float agentMinLight = 0.34f; // свои читаемы всегда: игрок обязан их различать + + // вспышки выстрелов как источники света + float flashPower = 0.55f; + float flashRadius = 4.0f; + float flashTime = 0.11f; + + // рампа освещения (меняет саму таблицу — требует перепечь) + float lightGamma = 1.45f; + float lightMaxGain = 1.25f; + + // --- эффекты стрельбы --------------------------------------------------- + float fxIntensity = 1.0f; + float tracerLength = 1.30f; // длина светящегося штриха, юнитов мира + float bulletLiftPx = 8.0f; // пуля летит на уровне груди, не по земле + float muzzleTime = 0.07f; + float muzzleRadiusPx = 5.0f; + float sparkTime = 0.16f; + float sparkRadiusPx = 4.0f; + float bladeLiftPx = 9.0f; // дуга метёт на уровне груди, не по земле + float bladeTrailFrac = 0.80f; // какая доля пройденной дуги ещё светится + float meleeShake = 1.4f; // отдача камеры на попадание клинком + + // --- напряжение и постобработка ----------------------------------------- + float dreadRadius = 7.0f; // с какой дистанции мишень начинает пугать + float dreadAttack = 6.0f; // страх набегает быстро + float dreadRelease = 0.5f; // отпускает медленно + float vigStartCalm = 0.42f; // где начинается виньетка + float vigStartTense = 0.20f; + float vigDepthCalm = 0.55f; // насколько темнеет край + float vigDepthTense = 0.85f; + float grainCalm = 6.0f; // амплитуда зерна (макс 127) + float grainTense = 16.0f; + float heartBpmCalm = 58.0f; + float heartBpmTense = 132.0f; + float heartAmp = 0.10f; // насколько сердцебиение давит картинку + float shotFlash = 0.12f; // подсветка кадра на выстрел + float shakePerShot = 0.55f; // отдача камеры, пикселей на выстрел + float shakeMax = 3.0f; + float shakeDecay = 9.0f; + + // --- кровь (render-only, декали запекаются в спрайты пола) --------------- + float bloodAmount = 1.0f; // общий множитель размера пятен, 0 = выключить + float bloodRadiusHit = 0.26f; // пуля + float bloodRadiusMelee = 0.50f; // клинок + float bloodRadiusKill = 0.78f; // смерть: лужа + float bloodDrops = 5.0f; // сколько брызг летит по направлению удара + float bloodOpacity = 0.92f; // насколько густо пятно перекрывает пол + + // --- дымка и пепел в воздухе (render-only) -------------------------------- + float hazeAmount = 0.34f; // сила дымки, 0 = выключить + float hazeScale = 1.0f; // крупность клубов + float hazeDrift = 0.05f; // скорость сноса, экранных ячеек/сек + float hazeGate = 24.0f; // ниже этой яркости дымки нет: тьма остаётся тьмой + float ashDensity = 0.75f; // пылинок на тайл + float ashSpeed = 0.30f; // скорость дрейфа пепла + float ashBrightness = 0.60f; + float ashLiftPx = 13.0f; // на какой высоте висит взвесь + + // флаги + bool freeFireSecondary = true; // 6.8: стрелять по вторичным целям в движении + bool friendlyFire = true; // 6.9: всегда true, тумблер только для проверки +}; + +// --- связка ударов ближнего боя ---------------------------------------------- +// +// Чередование «влево-вправо» — это не связка, а метроном: два удара, между +// которыми нет разницы ни на глаз, ни по последствиям. Связка обязана иметь +// ФОРМУ: быстрый вход, злой возврат, тяжёлое завершение. +// +// Множители, а не абсолютные числа: базовые характеристики клинка остаются +// одним набором в Tuning и продолжают крутиться на ходу, а связка их гнёт. +struct MeleeComboStep +{ + const char* name; + float arcMul; // ширина сектора + float dmgMul; + float knockMul; + float windupMul; // замах — телеграф; у тяжёлого удара он длиннее + float strikeMul; // активное окно + float recoverMul; // и расплата после + float intervalMul; // пауза до следующего удара связки + bool flipSide; // менять сторону захода лезвия +}; + +inline const MeleeComboStep MELEE_COMBO[] = { + // 1. Косой заход. Обычный удар, с него всё начинается. + {"slash", 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, 1.00f, true}, + // 2. Возврат с обратной стороны. Быстрее и почти без паузы — именно это + // читается как «связка», а не как два отдельных удара. + {"backhand",0.85f, 1.00f, 0.85f, 0.55f, 0.80f, 0.70f, 0.50f, true}, + // 3. Раскрутка. Широкая, тяжёлая, с долгим восстановлением: в тесноте её + // просто не дадут начать — сектор не будет чист, и это правильная цена. + {"spin", 1.70f, 1.75f, 2.30f, 1.50f, 1.40f, 1.70f, 1.35f, false}, +}; + +inline constexpr int MELEE_COMBO_STEPS = int(sizeof(MELEE_COMBO) / sizeof(MELEE_COMBO[0])); + +inline Tuning g_tune; + +// Максимально возможная скорость агента НА ХОДУ. Проверка спуска на время полёта +// пули обязана считать по НЕЙ, иначе рывок союзника не учитывается. +// +// Рывок бойца ближнего боя сюда намеренно не входит: он не «манёвр», а прямой +// отрезок с уже известным направлением, и AllyInterceptsShot проверяет его +// точно — отдельной экстраполяцией (см. ai/firing_solver.cpp). +inline float MaxAgentSpeed() { return std::max(g_tune.moveSpeed, g_tune.moveSpeedFast); } + +// --- таблица параметров для подкрутки в оверлее ------------------------------ + +struct TunableParam +{ + const char* name; + float Tuning::* member; + float step; + float minV; + float maxV; +}; + +inline const TunableParam TUNABLES[] = { + {"safetyMargin", &Tuning::safetyMargin, 0.01f, 0.0f, 1.0f}, + {"laneHalfWidth", &Tuning::laneHalfWidth, 0.01f, 0.0f, 0.5f}, + {"bodyRadius", &Tuning::bodyRadius, 0.01f, 0.1f, 0.8f}, + {"wLaneAvoid", &Tuning::wLaneAvoid, 0.1f, 0.0f, 10.0f}, + {"laneAvoidStr", &Tuning::laneAvoidStrength,0.25f, 0.0f, 30.0f}, + {"laneReserve", &Tuning::laneReserveScale, 0.05f, 1.0f, 4.0f}, + {"predictSlack", &Tuning::shotPredictSlack, 0.05f, 0.0f, 2.0f}, + {"wSeparation", &Tuning::wSeparation, 0.1f, 0.0f, 10.0f}, + {"steerAccel", &Tuning::steerAccel, 1.0f, 2.0f, 60.0f}, + {"moveSpeed", &Tuning::moveSpeed, 0.1f, 0.5f, 10.0f}, + {"moveSpeedFast", &Tuning::moveSpeedFast, 0.1f, 0.5f, 12.0f}, + {"weaponRange", &Tuning::weaponRange, 0.25f, 2.0f, 20.0f}, + {"fireInterval", &Tuning::fireInterval, 0.01f, 0.05f, 2.0f}, + {"bulletSpeed", &Tuning::bulletSpeed, 1.0f, 5.0f, 60.0f}, + {"solveInterval", &Tuning::solveInterval, 0.05f, 0.05f, 2.0f}, + {"commitTime", &Tuning::commitTime, 0.05f, 0.0f, 3.0f}, + {"hysteresis", &Tuning::hysteresis, 1.0f, 0.0f, 100.0f}, + {"cohesionRadius", &Tuning::cohesionRadius, 0.1f, 1.0f, 12.0f}, + {"minEngageDist", &Tuning::minEngageDist, 0.1f, 0.0f, 8.0f}, + {"sLaneClear", &Tuning::sLaneClear, 5.0f, 0.0f, 400.0f}, + {"sCoverage", &Tuning::sCoverage, 1.0f, 0.0f, 200.0f}, + {"sBlockAlly", &Tuning::sBlockAlly, 1.0f, 0.0f, 200.0f}, + {"sDistCost", &Tuning::sDistCost, 0.5f, 0.0f, 100.0f}, + {"sCohesionCost", &Tuning::sCohesionCost, 0.5f, 0.0f, 100.0f}, + {"sTooClose", &Tuning::sTooClose, 2.0f, 0.0f, 300.0f}, + {"postLeash", &Tuning::postLeash, 0.1f, 0.0f, 10.0f}, + {"formSpacing", &Tuning::formationSpacing, 0.05f, 0.4f, 4.0f}, + {"anchorSpeed", &Tuning::anchorSpeed, 0.1f, 0.5f, 12.0f}, + {"anchorSpeedFast",&Tuning::anchorSpeedFast, 0.1f, 0.5f, 16.0f}, + {"anchorLeash", &Tuning::anchorLeash, 0.1f, 0.2f, 12.0f}, + {"anchorLeashMax", &Tuning::anchorLeashMax, 0.1f, 0.4f, 16.0f}, + {"leashDrag", &Tuning::leashDrag, 0.05f, 0.0f, 1.0f}, + {"anchorAccel", &Tuning::anchorAccel, 1.0f, 2.0f, 80.0f}, + // --- натяжение и строй --- + {"urgeStart", &Tuning::urgeStartFrac, 0.05f, 0.0f, 0.95f}, + {"urgeAttack", &Tuning::urgeAttack, 0.2f, 0.1f, 20.0f}, + {"urgeRelease", &Tuning::urgeRelease, 0.2f, 0.1f, 20.0f}, + {"sprintAt", &Tuning::sprintAt, 0.02f, 0.05f, 1.0f}, + {"holdSpacing", &Tuning::holdSpacing, 0.02f, 0.4f, 2.0f}, + {"sprintSpacing", &Tuning::sprintSpacing, 0.02f, 0.4f, 3.0f}, + {"sprintStretch", &Tuning::sprintStretch, 0.05f, 0.5f, 4.0f}, + {"formMorph", &Tuning::formMorphRate, 0.25f, 0.25f, 20.0f}, + // --- разброс и перезарядка --- + {"spreadStand", &Tuning::spreadStandDeg, 0.1f, 0.0f, 20.0f}, + {"spreadMove", &Tuning::spreadMoveDeg, 0.1f, 0.0f, 30.0f}, + {"spreadRecoil", &Tuning::spreadRecoilDeg, 0.05f, 0.0f, 10.0f}, + {"spreadRecMax", &Tuning::spreadRecoilMax, 0.1f, 0.0f, 20.0f}, + {"spreadDecay", &Tuning::spreadRecoilDecay,0.2f, 0.1f, 40.0f}, + {"spreadScale", &Tuning::spreadScale, 0.05f, 0.0f, 4.0f}, + {"magazine", &Tuning::magazineRifle, 1.0f, 1.0f, 200.0f}, + {"reloadTime", &Tuning::reloadRifle, 0.05f, 0.1f, 8.0f}, + {"bulletKnock", &Tuning::bulletKnock, 0.05f, 0.0f, 6.0f}, + {"knockResist", &Tuning::knockResistScale, 0.05f, 0.0f, 2.0f}, + // --- ближний бой --- + {"meleeReach", &Tuning::meleeReach, 0.05f, 0.4f, 4.0f}, + {"meleeArc", &Tuning::meleeArcDeg, 5.0f, 20.0f, 300.0f}, + {"meleeWindup", &Tuning::meleeWindup, 0.01f, 0.02f, 1.0f}, + {"meleeStrike", &Tuning::meleeStrike, 0.01f, 0.02f, 1.0f}, + {"meleeRecover", &Tuning::meleeRecover, 0.01f, 0.0f, 1.5f}, + {"meleeInterval", &Tuning::meleeInterval, 0.02f, 0.1f, 3.0f}, + {"meleeDamage", &Tuning::meleeDamage, 5.0f, 1.0f, 999.0f}, + {"meleeLunge", &Tuning::meleeLungeSpeed, 0.1f, 0.0f, 12.0f}, + {"meleeKnock", &Tuning::meleeKnockback, 0.1f, 0.0f, 12.0f}, + {"meleeCohesion", &Tuning::meleeCohesionRadius, 0.2f, 1.0f, 20.0f}, + {"meleeAllyMargin",&Tuning::meleeAllyMargin, 0.02f, 0.0f, 1.0f}, + {"meleePredict", &Tuning::meleeStartPredict,0.1f, 0.0f, 3.0f}, + {"meleeReserve", &Tuning::meleeReserveFrac, 0.05f, 0.0f, 1.5f}, + {"meleeShake", &Tuning::meleeShake, 0.1f, 0.0f, 6.0f}, + // --- хоррор-часть --- + {"sightRadius", &Tuning::sightRadius, 0.25f, 2.0f, 24.0f}, + {"sightCone", &Tuning::sightConeDeg, 5.0f, 20.0f, 360.0f}, + {"sightPersonal", &Tuning::sightPersonalRadius, 0.1f, 0.5f, 10.0f}, + {"fogMemory", &Tuning::fogMemoryLevel, 0.02f, 0.0f, 1.0f}, + {"fogReveal", &Tuning::fogEntityReveal, 0.02f, 0.0f, 1.0f}, + {"flashPower", &Tuning::flashPower, 0.05f, 0.0f, 2.0f}, + {"lightGamma", &Tuning::lightGamma, 0.05f, 0.3f, 4.0f}, + {"lightGain", &Tuning::lightMaxGain, 0.05f, 0.2f, 3.0f}, + {"fxIntensity", &Tuning::fxIntensity, 0.1f, 0.0f, 4.0f}, + {"tracerLength", &Tuning::tracerLength, 0.1f, 0.1f, 6.0f}, + {"grainTense", &Tuning::grainTense, 1.0f, 0.0f, 100.0f}, + {"vigDepthTense", &Tuning::vigDepthTense, 0.05f, 0.0f, 1.0f}, + {"dreadRadius", &Tuning::dreadRadius, 0.5f, 1.0f, 20.0f}, + {"shakePerShot", &Tuning::shakePerShot, 0.05f, 0.0f, 4.0f}, + // --- кровь, дымка, пепел --- + {"bloodAmount", &Tuning::bloodAmount, 0.05f, 0.0f, 3.0f}, + {"bloodOpacity", &Tuning::bloodOpacity, 0.02f, 0.0f, 1.0f}, + {"bloodDrops", &Tuning::bloodDrops, 1.0f, 0.0f, 16.0f}, + {"hazeAmount", &Tuning::hazeAmount, 0.02f, 0.0f, 2.0f}, + {"hazeScale", &Tuning::hazeScale, 0.05f, 0.2f, 4.0f}, + {"hazeDrift", &Tuning::hazeDrift, 0.01f, 0.0f, 1.0f}, + {"hazeGate", &Tuning::hazeGate, 1.0f, 0.0f, 128.0f}, + {"ashDensity", &Tuning::ashDensity, 0.05f, 0.0f, 4.0f}, + {"ashSpeed", &Tuning::ashSpeed, 0.05f, 0.0f, 3.0f}, + {"ashBright", &Tuning::ashBrightness, 0.05f, 0.0f, 2.0f}, + {"ashLift", &Tuning::ashLiftPx, 1.0f, 0.0f, 40.0f}, +}; + +inline constexpr int TUNABLE_COUNT = int(sizeof(TUNABLES) / sizeof(TUNABLES[0])); diff --git a/src/world/tilemap.cpp b/src/world/tilemap.cpp new file mode 100644 index 0000000..d7c7f65 --- /dev/null +++ b/src/world/tilemap.cpp @@ -0,0 +1,205 @@ +#include "world/tilemap.h" + +#include + +namespace +{ + +constexpr float INF_F = std::numeric_limits::infinity(); + +} // namespace + +// ----------------------------------------------------------------------------- +// Уровень. Всё захардкожено, ни одного случайного числа — карта детерминирована. +// +// y 0..12 — северная комната (кучка мишеней) +// y 13..15 — стена-разделитель с двумя проходами шириной 2 тайла +// y 16..45 — центральная арена + западная и восточная комнаты за стенами +// ----------------------------------------------------------------------------- +void Tilemap::Generate() +{ + for (int i = 0; i < MAP_W * MAP_H; ++i) tiles[i] = Tile::EMPTY; + + auto fill = [&](int x0, int y0, int x1, int y1, Tile t) { + for (int y = y0; y <= y1; ++y) + for (int x = x0; x <= x1; ++x) + Set(x, y, t); + }; + auto column = [&](int x, int y) { Set(x, y, Tile::WALL); }; + + // --- сплошная стена по периметру (2 тайла) --- + fill(0, 0, MAP_W - 1, 1, Tile::WALL); + fill(0, MAP_H - 2, MAP_W - 1, MAP_H - 1, Tile::WALL); + fill(0, 0, 1, MAP_H - 1, Tile::WALL); + fill(MAP_W - 2, 0, MAP_W - 1, MAP_H - 1, Tile::WALL); + + // --- северная стена-разделитель, два прохода шириной 2 --- + fill(2, 13, 45, 15, Tile::WALL); + fill(10, 13, 11, 15, Tile::EMPTY); + fill(30, 13, 31, 15, Tile::EMPTY); + + // --- западная стена-разделитель, проход шириной 2 --- + fill(12, 20, 14, 44, Tile::WALL); + fill(12, 30, 14, 31, Tile::EMPTY); + + // --- восточная стена-разделитель, проход шириной 2 --- + fill(38, 18, 40, 40, Tile::WALL); + fill(38, 27, 40, 28, Tile::EMPTY); + + // --- колонны и огрызки стен на арене (без них не проверить LOS) --- + const int arenaCols[][2] = { + {18, 19}, {18, 27}, {18, 34}, {24, 19}, {24, 34}, + {30, 28}, {30, 34}, {26, 24}, {21, 23}, {35, 22}, {35, 36}, + }; + for (const auto& c : arenaCols) column(c[0], c[1]); + + fill(20, 30, 22, 30, Tile::WALL); // огрызок-стенка поперёк + fill(27, 38, 27, 40, Tile::WALL); // огрызок вдоль + fill(33, 30, 34, 31, Tile::WALL); // блок 2x2 + + // --- северная комната --- + const int northCols[][2] = {{8, 8}, {14, 5}, {30, 9}, {38, 6}, {42, 10}, {17, 10}, {35, 4}}; + for (const auto& c : northCols) column(c[0], c[1]); + fill(21, 9, 23, 9, Tile::WALL); + + // --- западная комната --- + const int westCols[][2] = {{5, 25}, {8, 30}, {4, 35}, {10, 38}, {6, 21}}; + for (const auto& c : westCols) column(c[0], c[1]); + fill(4, 28, 4, 30, Tile::WALL); + + // --- восточная комната --- + const int eastCols[][2] = {{43, 22}, {42, 30}, {44, 38}}; + for (const auto& c : eastCols) column(c[0], c[1]); + + // --- южная полоса --- + const int southCols[][2] = {{20, 43}, {28, 42}, {34, 44}, {16, 41}}; + for (const auto& c : southCols) column(c[0], c[1]); +} + +// ----------------------------------------------------------------------------- +// DDA Amanatides & Woo. +// ----------------------------------------------------------------------------- +bool Tilemap::RaycastBlocked(Vec2 a, Vec2 b, float* tHit) const +{ + int x = int(std::floor(a.x)); + int y = int(std::floor(a.y)); + if (IsWall(x, y)) { if (tHit) *tHit = 0.0f; return true; } + + const Vec2 d = b - a; + const float len = Length(d); + if (len < 1e-6f) return false; + + const Vec2 dir = d / len; + const int stepX = (dir.x > 0.0f) ? 1 : ((dir.x < 0.0f) ? -1 : 0); + const int stepY = (dir.y > 0.0f) ? 1 : ((dir.y < 0.0f) ? -1 : 0); + + const float tDeltaX = (stepX != 0) ? std::fabs(1.0f / dir.x) : INF_F; + const float tDeltaY = (stepY != 0) ? std::fabs(1.0f / dir.y) : INF_F; + + float tMaxX = INF_F; + float tMaxY = INF_F; + if (stepX > 0) tMaxX = (float(x + 1) - a.x) / dir.x; + else if (stepX < 0) tMaxX = (float(x) - a.x) / dir.x; + if (stepY > 0) tMaxY = (float(y + 1) - a.y) / dir.y; + else if (stepY < 0) tMaxY = (float(y) - a.y) / dir.y; + + const int endX = int(std::floor(b.x)); + const int endY = int(std::floor(b.y)); + + for (;;) + { + if (x == endX && y == endY) return false; + + float tEnter; + if (tMaxX < tMaxY) + { + if (tMaxX > len) return false; + tEnter = tMaxX; + x += stepX; + tMaxX += tDeltaX; + } + else + { + if (tMaxY > len) return false; + tEnter = tMaxY; + y += stepY; + tMaxY += tDeltaY; + } + + if (IsWall(x, y)) + { + if (tHit) *tHit = Clampf(tEnter / len, 0.0f, 1.0f); + return true; + } + } +} + +// ----------------------------------------------------------------------------- +// Circle vs AABB тайлов: выталкивание по кратчайшему направлению. +// ----------------------------------------------------------------------------- +void Tilemap::ResolveCircle(Vec2& p, float r) const +{ + for (int iter = 0; iter < 3; ++iter) + { + bool moved = false; + const int x0 = int(std::floor(p.x - r)); + const int x1 = int(std::floor(p.x + r)); + const int y0 = int(std::floor(p.y - r)); + const int y1 = int(std::floor(p.y + r)); + + for (int ty = y0; ty <= y1; ++ty) + { + for (int tx = x0; tx <= x1; ++tx) + { + if (!IsWall(tx, ty)) continue; + + const Vec2 closest{Clampf(p.x, float(tx), float(tx + 1)), + Clampf(p.y, float(ty), float(ty + 1))}; + Vec2 delta = p - closest; + const float dist = Length(delta); + + if (dist > 1e-5f) + { + if (dist >= r) continue; + p += (delta / dist) * (r - dist); + moved = true; + } + else + { + // центр внутри тайла — выталкиваем по ближайшей грани + const float dl = p.x - float(tx); + const float dr = float(tx + 1) - p.x; + const float dt = p.y - float(ty); + const float db = float(ty + 1) - p.y; + const float m = std::min(std::min(dl, dr), std::min(dt, db)); + if (m == dl) p.x = float(tx) - r; + else if (m == dr) p.x = float(tx + 1) + r; + else if (m == dt) p.y = float(ty) - r; + else p.y = float(ty + 1) + r; + moved = true; + } + } + } + if (!moved) break; + } +} + +bool Tilemap::CircleHitsWall(Vec2 p, float r) const +{ + const int x0 = int(std::floor(p.x - r)); + const int x1 = int(std::floor(p.x + r)); + const int y0 = int(std::floor(p.y - r)); + const int y1 = int(std::floor(p.y + r)); + + for (int ty = y0; ty <= y1; ++ty) + { + for (int tx = x0; tx <= x1; ++tx) + { + if (!IsWall(tx, ty)) continue; + const Vec2 closest{Clampf(p.x, float(tx), float(tx + 1)), + Clampf(p.y, float(ty), float(ty + 1))}; + if (DistanceSq(p, closest) < r * r) return true; + } + } + return false; +} diff --git a/src/world/tilemap.h b/src/world/tilemap.h new file mode 100644 index 0000000..a7fe0c9 --- /dev/null +++ b/src/world/tilemap.h @@ -0,0 +1,42 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Карта тайлов: EMPTY / WALL. Декартов мир, тайл = 1.0 юнита. +// Здесь же DDA-рейкаст (Amanatides & Woo) и circle-vs-AABB разрешение коллизий. +// Об изометрии этот модуль не знает. +// ----------------------------------------------------------------------------- +#include + +#include "core/math.h" +#include "tuning.h" + +enum class Tile : uint8_t +{ + EMPTY = 0, + WALL = 1, +}; + +struct Tilemap +{ + Tile tiles[MAP_W * MAP_H] = {}; + + void Generate(); // единственный захардкоженный уровень + + static bool InBounds(int x, int y) { return unsigned(x) < unsigned(MAP_W) && unsigned(y) < unsigned(MAP_H); } + + Tile At(int x, int y) const { return InBounds(x, y) ? tiles[y * MAP_W + x] : Tile::WALL; } + void Set(int x, int y, Tile t) { if (InBounds(x, y)) tiles[y * MAP_W + x] = t; } + + // Вне карты считаем стеной — так рейкасты и коллизии не убегают наружу. + bool IsWall(int x, int y) const { return At(x, y) == Tile::WALL; } + bool IsWallAt(Vec2 p) const { return IsWall(int(std::floor(p.x)), int(std::floor(p.y))); } + + // Amanatides & Woo. true, если отрезок a->b пересекает стену. Без аллокаций. + // tHit (если нужен) — параметр входа в стену вдоль отрезка, [0..1]. + bool RaycastBlocked(Vec2 a, Vec2 b, float* tHit = nullptr) const; + + // Выталкивание круга из стен (несколько итераций — из-за углов). + void ResolveCircle(Vec2& p, float r) const; + + // Есть ли стена в круге радиуса r вокруг p (для отбраковки кандидатов). + bool CircleHitsWall(Vec2 p, float r) const; +};

    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駎$P{$V%yUFRNIFy@ONfBO&xy0jG}eL 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�TmDs0l@+Yf^;2Xc1BZHmlRW_F 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