Содержимое двух проектов: DESCENT и HOLLOW
Игра стала проектом движка, и её содержимое переехало из assets/ в projects/.
projects/descent сама игра: восемь комнат, каталог из 28 сущностей,
изометрия, кривая спуска на сто этажей
projects/hollow второй проект: вид сверху, четыре комнаты, свой каталог,
короткая и злая кривая
Второй проект существует не для примера. Движок с одним проектом ничем не
отличается от игры с красиво названными каталогами, и проверить, что зашитых
знаний про DESCENT в движке не осталось, можно только вторым проектом
(docs/18-engine.md).
Он же сразу окупился: --check нашёл в комнате maw глухую камеру посередине —
ту же ошибку, что когда-то в storage. На сетке она выглядит нормально, но
точка спавна внутри недостижима, и этаж тихо становится легче.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 01:06:28 +07:00
|
|
|
|
# Каталог размещаемых сущностей — граница между движком и игрой.
|
|
|
|
|
|
#
|
|
|
|
|
|
# Редактор комнат читает ТОЛЬКО этот файл: он не знает, что такое SHAMBLER и
|
|
|
|
|
|
# чем тот бьёт, он знает id, класс, цвет, глубину и цену. Игра переводит id в
|
|
|
|
|
|
# свои EnemyKind и ItemId одной таблицей (src/sim/spawn_catalog.cpp).
|
|
|
|
|
|
#
|
|
|
|
|
|
# entity <id> ключ=значение ...
|
|
|
|
|
|
#
|
|
|
|
|
|
# class monster | prop | loot
|
|
|
|
|
|
# depth N — с этажа N и глубже
|
|
|
|
|
|
# N..M — с N по M включительно
|
|
|
|
|
|
# danger цена в бюджете опасности этажа. Не урон и не HP, а «сколько места
|
|
|
|
|
|
# в голове игрока эта тварь занимает». Бюджет — то, чем этаж
|
|
|
|
|
|
# отличается по СЛОЖНОСТИ, а не по числу тел
|
|
|
|
|
|
# tier качество предмета: этаж выдаёт свой тир и всё, что ниже
|
|
|
|
|
|
# color чем редактор рисует сущность, пока для неё нет спрайта
|
|
|
|
|
|
#
|
|
|
|
|
|
# Порядок ключей не важен, лишние ключи — ошибка, а не молчаливый пропуск.
|
|
|
|
|
|
# Порядок СТРОК важен: это порядок палитры в редакторе.
|
|
|
|
|
|
|
|
|
|
|
|
# --- твари -------------------------------------------------------------------
|
|
|
|
|
|
# Кривая простая и читается сверху вниз: первые этажи — бредущие и бегуны,
|
|
|
|
|
|
# дальше подключаются плевки, громилы и хваты. Верхняя граница у мелочи есть
|
|
|
|
|
|
# намеренно: на двадцатом этаже одиночный бредущий занимал бы место, которое
|
|
|
|
|
|
# должно достаться чему-то, чего игрок ещё не видел.
|
|
|
|
|
|
entity shambler class=monster depth=1 danger=1.0 radius=0.34 color=116,52,52 sprite=shambler_walk name=SHAMBLER
|
Правки по игре: начало, ставка, наёмники (M29)
Семь изменений по итогам игры вживую.
НАЧАЛО. Первый этаж встречал одинокого оперативника с ножом тремя тварями,
из которых одна быстрая: бюджет 3.0 и бегуны с первого этажа. Стало 2.2
(ровно два бредущих), бегуны с четвёртого. Света прибавлено: обзор
начинается с 1.30 вместо 1.0, у этажа появилась своя яркость пройденного
(0.42 наверху против 0.13 на дне). Наверху ещё работает освещение, и
хоррор первого этажа в том, что игрок один, а не в том, что не видно
стен. Темнота это инструмент глубины, и тратить её на первый этаж значит
не иметь запаса дальше.
СТАВКА. Опыт платится за убийства и сразу: выносить надо ВЕЩИ. Вайп
больше не отнимает всё - доезжает около половины добычи, и чем вещь реже,
тем охотнее теряется. Прежнее "вайп не возвращает ничего" делало
единственным разумным поведением уход наверх при первой царапине.
ВЫХОД. Аномалия возврата переехала из точки входа к спуску: развилка
"вниз или наверх" теперь там же, где этаж кончился. Обратный путь через
растревоженный этаж ничего не решал - это был ещё раз тот же этаж.
ЧЕКПОИНТЫ через 50 этажей вместо пяти: забег это долгий спуск, а не
перебежка между сохранениями.
НАЁМНИКИ. Кнопка "нанять за опыт" убрана, оперативники находятся в
капсулах на этажах: в среднем раз в сотню этажей и не чаще раза в
двадцать. У каждого свои три прибавки из одного бюджета - разница в
характере, а не в ранге. Покупка была скучной ровно в том смысле, в каком
скучна любая кнопка "стать сильнее": ничего не рассказывает и никуда не
зовёт.
ЗАМЕРЫ. Вайп на сотне повторов: доезжает 52% (обычное 69%, реликты 25%).
Первая версия проверки считала одну сумку и выдала "обычного доехало
112%" - спасение забирает ещё и надетое. Опыт: банк 558 -> 578 за
убийство без эвакуации. Капсула поднимает отряд до двух и даёт наёмнику
его числа.
Формат профиля 6: строки merc и rescued.
Не сделано и обсуждается: ростер сверх пятерых, задания для свободных,
пассивные бонусы от сидящих на базе.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 08:09:26 +07:00
|
|
|
|
entity rusher class=monster depth=4 danger=1.3 radius=0.27 color=158,74,44 sprite=rusher_walk name=RUSHER
|
Содержимое двух проектов: DESCENT и HOLLOW
Игра стала проектом движка, и её содержимое переехало из assets/ в projects/.
projects/descent сама игра: восемь комнат, каталог из 28 сущностей,
изометрия, кривая спуска на сто этажей
projects/hollow второй проект: вид сверху, четыре комнаты, свой каталог,
короткая и злая кривая
Второй проект существует не для примера. Движок с одним проектом ничем не
отличается от игры с красиво названными каталогами, и проверить, что зашитых
знаний про DESCENT в движке не осталось, можно только вторым проектом
(docs/18-engine.md).
Он же сразу окупился: --check нашёл в комнате maw глухую камеру посередине —
ту же ошибку, что когда-то в storage. На сетке она выглядит нормально, но
точка спавна внутри недостижима, и этаж тихо становится легче.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 01:06:28 +07:00
|
|
|
|
entity spitter class=monster depth=3 danger=2.0 radius=0.31 color=96,132,72 sprite=spitter_walk name=SPITTER
|
|
|
|
|
|
entity lurker class=monster depth=5 danger=2.6 radius=0.30 color=88,62,118 sprite=lurker_walk name=LURKER
|
|
|
|
|
|
entity brute class=monster depth=7 danger=4.5 radius=0.46 color=142,60,78 sprite=brute_walk name=BRUTE
|
|
|
|
|
|
|
|
|
|
|
|
# Мишень приёмки: не ходит и не бьёт. Опасности не несёт, поэтому и бюджета
|
|
|
|
|
|
# не тратит — ею ставят неподвижную цель, когда нужна именно цель.
|
|
|
|
|
|
entity dummy class=monster depth=1 danger=0.0 radius=0.34 color=120,44,44 sprite=- name=TARGET
|
|
|
|
|
|
|
|
|
|
|
|
# --- обстановка --------------------------------------------------------------
|
|
|
|
|
|
# Ломается, не отрастает обратно и не участвует в зачистке.
|
|
|
|
|
|
entity crate class=prop depth=1 radius=0.38 color=104,76,46 sprite=prop_crate name=CRATE
|
|
|
|
|
|
entity barrel class=prop depth=1 radius=0.33 color=92,84,58 sprite=prop_barrel name=BARREL
|
|
|
|
|
|
entity locker class=prop depth=2 radius=0.36 color=78,88,96 sprite=prop_locker name=LOCKER
|
|
|
|
|
|
|
|
|
|
|
|
# --- лут ---------------------------------------------------------------------
|
|
|
|
|
|
# Тир — это «с какой глубины вещь становится находкой». Нижние тиры с глубиной
|
|
|
|
|
|
# не исчезают: бинт нужен всегда, он просто перестаёт быть удачей.
|
|
|
|
|
|
entity ammo class=loot tier=0 depth=1 radius=0.22 color=200,176,96 sprite=item_icon_ammo name=AMMO
|
|
|
|
|
|
entity bandage class=loot tier=0 depth=1 radius=0.22 color=216,208,196 sprite=item_icon_bandage name=BANDAGE
|
Свет как расходник: заряд тратится за путь, а не за время (M23)
Второй ресурс вылазки после патронов. Фонарь садится, погас — обзор падает
до 35%, а твари замечают отряд в 1.35 раза дальше: отряд не слепнет, он
меняется с тварями местами. Батарея встаёт сама, как бинт.
Главное решение — расход за ПРОЙДЕННЫЙ ПУТЬ, а не за время. Первая версия
считала по секундам, то есть была таймером, которого в игре нет по прямому
требованию к жанру: садящийся сам собой фонарь торопил бы игрока ровно как
секундомер, только без циферблата, и думать над этажом стало бы дорого.
За расстояние получается тот же размен, что и с весом, но с другой стороны:
вес делает дорогим «унести всё», свет — «обшарить всё».
Заряд общий на отряд и едет вниз вместе с ним: обновляйся он на этаже, это
был бы ресурс этажа, а не вылазки, и никуда бы не гнал. Чем глубже, тем
дороже шаг, а этажи внизу длиннее — глубина жмёт на свет дважды.
Проверка в --descend меряет правило целиком, и первая её строка не про
баланс, а про жанр: заряд на стоянке обязан стоять. Сам измеритель тоже
был неправ — делил потраченное на смещение отряда, а не на пройденный
путь, и показывал 1.55 за тайл при 1.10 в каталоге.
свет: стоянка 0.2, ход 1.10 за тайл при 1.10 в каталоге
глубина 8: заряда на 383 тайла, это 4.0 прямых пути до спуска
обзор 1.00 -> 0.35 в темноте, батарея встала сама
Хватает ли заряда на этаж считается в этажах и по средней длине забега:
путь до спуска скачет вдвое от сида, и порог по одному этажу ловил бы
удачу, а не баланс.
--accept PASS без изменений: в песочнице света бесконечно, как и патронов.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 02:12:05 +07:00
|
|
|
|
# Батарея — второй расходник первой необходимости после бинта: свет садится сам
|
|
|
|
|
|
# и на всех, поэтому нижним тиром и с первого этажа. Иконки пока нет.
|
|
|
|
|
|
entity battery class=loot tier=0 depth=1 radius=0.22 color=150,210,200 sprite=- name=BATTERY
|
Содержимое двух проектов: DESCENT и HOLLOW
Игра стала проектом движка, и её содержимое переехало из assets/ в projects/.
projects/descent сама игра: восемь комнат, каталог из 28 сущностей,
изометрия, кривая спуска на сто этажей
projects/hollow второй проект: вид сверху, четыре комнаты, свой каталог,
короткая и злая кривая
Второй проект существует не для примера. Движок с одним проектом ничем не
отличается от игры с красиво названными каталогами, и проверить, что зашитых
знаний про DESCENT в движке не осталось, можно только вторым проектом
(docs/18-engine.md).
Он же сразу окупился: --check нашёл в комнате maw глухую камеру посередине —
ту же ошибку, что когда-то в storage. На сетке она выглядит нормально, но
точка спавна внутри недостижима, и этаж тихо становится легче.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 01:06:28 +07:00
|
|
|
|
entity pistol class=loot tier=0 depth=1 radius=0.24 color=190,180,168 sprite=item_icon_pistol name=PISTOL
|
|
|
|
|
|
entity knife class=loot tier=0 depth=1 radius=0.22 color=214,222,232 sprite=item_icon_knife name=KNIFE
|
|
|
|
|
|
entity jacket class=loot tier=0 depth=1 radius=0.26 color=122,112,96 sprite=item_icon_jacket name=JACKET
|
|
|
|
|
|
|
|
|
|
|
|
entity rifle class=loot tier=1 depth=2 radius=0.26 color=208,196,150 sprite=item_icon_rifle name=CARBINE
|
|
|
|
|
|
entity saber class=loot tier=1 depth=2 radius=0.26 color=200,212,228 sprite=item_icon_saber name=SABER
|
|
|
|
|
|
entity vest class=loot tier=1 depth=3 radius=0.26 color=108,118,108 sprite=item_icon_vest name=VEST
|
|
|
|
|
|
entity stimpack class=loot tier=1 depth=3 radius=0.22 color=130,220,170 sprite=item_icon_stimpack name=STIM
|
|
|
|
|
|
|
|
|
|
|
|
entity smg class=loot tier=2 depth=5 radius=0.26 color=176,200,220 sprite=item_icon_smg name=SMG
|
|
|
|
|
|
entity shotgun class=loot tier=2 depth=6 radius=0.28 color=214,158,104 sprite=item_icon_shotgun name=SHOTGUN
|
|
|
|
|
|
entity cleaver class=loot tier=2 depth=6 radius=0.28 color=196,174,160 sprite=item_icon_cleaver name=CLEAVER
|
|
|
|
|
|
entity spurs class=loot tier=2 depth=5 radius=0.22 color=198,184,120 sprite=item_icon_spurs name=SPURS
|
|
|
|
|
|
entity lantern class=loot tier=2 depth=4 radius=0.24 color=240,206,130 sprite=item_icon_lantern name=LANTERN
|
|
|
|
|
|
|
|
|
|
|
|
entity magnum class=loot tier=3 depth=9 radius=0.28 color=226,210,176 sprite=item_icon_magnum name=MAGNUM
|
|
|
|
|
|
entity bow class=loot tier=3 depth=10 radius=0.26 color=154,190,164 sprite=item_icon_bow name=BOW
|
|
|
|
|
|
entity plate class=loot tier=3 depth=9 radius=0.30 color=140,146,156 sprite=item_icon_plate name=PLATE
|
|
|
|
|
|
entity shroud class=loot tier=3 depth=11 radius=0.26 color=88,84,100 sprite=item_icon_shroud name=SHROUD
|
|
|
|
|
|
entity charm class=loot tier=3 depth=8 radius=0.22 color=196,130,190 sprite=item_icon_charm name=CHARM
|