squad-proto/projects/descent/catalog/entities.txt

110 lines
10 KiB
Plaintext
Raw Normal View History

# Каталог размещаемых сущностей — граница между движком и игрой.
#
# Редактор комнат читает ТОЛЬКО этот файл: он не знает, что такое 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 чем редактор рисует сущность, пока для неё нет спрайта
#
# Порядок ключей не важен, лишние ключи — ошибка, а не молчаливый пропуск.
# Порядок СТРОК важен: это порядок палитры в редакторе.
# --- твари -------------------------------------------------------------------
# Кривая простая и читается сверху вниз: первые этажи — бредущие и бегуны,
# дальше подключаются плевки, громилы и хваты. Верхняя граница у мелочи есть
# намеренно: на двадцатом этаже одиночный бредущий занимал бы место, которое
# должно достаться чему-то, чего игрок ещё не видел.
Личинки, парирование и инструмент --wall (M30) --WALL. Новый прогон отвечает на вопрос, появившийся вместе с чекпоинтами через пятьдесят этажей: растёт ли достижимая глубина от вылазки к вылазке. Отряд из одного, трёх и пяти, одетый по глубине, ставится в скопление тварей и живёт полторы минуты без управления. Первая стена: одиночка D7, трое D30, пятеро D30 - петля работает. И он же нашёл настоящую ошибку: PlaceSquad воскрешал ВСЕ пять слотов, в том числе незанятые. Строка писалась, когда отряд всегда был впятером; после появления ростера одиночка выходил на этаж с четырьмя невидимыми телохранителями. Из-за них прежний замер "одиночка выжил на первом этаже, 100 -> 41" был боем впятером. ЛИЧИНКИ. С исправленным замером выяснилось, что одиночка с ножом проигрывает двум бредущим: 210 здоровья против ножа это девять секунд работы под ответным уроном. Первые этажи населены личинками (55 здоровья, 7 урона, медленные), бредущий уехал на третий этаж, бегун на четвёртый. Новый ВИД, а не ослабленный бредущий с множителем: глубина в этой игре меняет, кто выходит, а не числа у одного и того же. ПАРИРОВАНИЕ. Отдельная характеристика клинка, и чем оружие легче, тем она выше: нож 34%, сабля 20%, тесак 8%. Не выведена из веса намеренно - её двигает аффикс PARRY, и лёгкий тесак обязан быть возможен как находка. Отбить можно, только если удары СОПРИКОСНУЛИСЬ: боец сам должен быть в замахе или в ударе. Иначе клинок стал бы щитом, работающим, пока стоишь. Удавшийся отбив снимает урон, бьёт тварь ударом бойца целиком и запускает повторную атаку с начала фазы, НЕ сбрасывая откат. Последнее и есть суть размена: сбрасывай отбив откат, выгоднее было бы подставляться под удары. Плевок отбивается тоже: летит назад и несёт урон бойца, а не твари. Это его удар, просто по летящей цели. Проверка меряет размен целиком, включая обратную половину правила: "стоя столбом не отбивает". Без неё условие про соприкосновение существовало бы только в комментарии. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 09:04:35 +07:00
entity larva class=monster depth=1..4 danger=0.7 radius=0.28 color=132,120,78 sprite=shambler_walk name=LARVA
entity shambler class=monster depth=3 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
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
Семь новых тварей: акты II-VI перестали быть пустыми (M34) Каталог кончался громилой на седьмом этаже: глубже бюджет опасности выбирался теми же пятью видами, то есть спуск переставал показывать новое ровно там, где обязан был начать. CINDER (D9) горит сама - дробовик против неё бесполезен, первый повод носить второй ствол. STINGER (D21) не убивает, а не даёт стоять. SWARM (D36) толпа в одном теле, сектор 160 градусов - вбок не обойти, берётся площадью. HUSK (D36) стена: 0.70 по кинетике, вскрывается только кислотой. SLEEPER (D44) с радиусом агро 3.4 - мимо неё МОЖНО пройти, а разбуженная бьёт кругом на 62 по всем, кто шёл кучей. WAILER (D53) меняет порядок целей: пока жив, павшие рядом встают вшестеро быстрее. VOIDLING (D73) ровные 0.45 по шести стихиям - верного ствола нет, берётся срезанием сопротивлений. Аура воскрешения у плакальщика РАБОТАЕТ, а не описана: список поднимающих собирается раз в шаг, берётся наибольший множитель, а не сумма. В песочнице приёмки список всегда пуст. Ни одного множителя от глубины, ни одного иммунитета, ни одного числа вне EnemyDefOf. ИНСТРУМЕНТЫ ЗНАЛИ ПОЛОВИНУ ИГРЫ. Список KINDS в tools.cpp был захардкожен пятью видами и не содержал даже личинки: --tool enemies и --tool ttk молчали про остальных. Теперь там весь бестиарий, тринадцать видов. Личинка из коридора стихий исключена намеренно и с пометкой "учебная": она населяет первые этажи и умирает от чего угодно - в этом её работа. Требовать от неё разброса значило бы требовать знания стихий на первом этаже. Проверено: --descend 80 собирает все глубины, --tool ttk в коридоре, --accept PASS. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 23:41:49 +07:00
# Акты II-VI. До этого каталог кончался громилой на седьмом этаже, и глубже
# бюджет опасности выбирался теми же пятью видами — то есть спуск переставал
# показывать новое ровно там, где обязан был начать.
entity cinder class=monster depth=9 danger=2.8 radius=0.32 color=178,92,40 sprite=shambler_walk name=CINDER
entity stinger class=monster depth=21 danger=2.2 radius=0.26 color=104,120,132 sprite=spitter_walk name=STINGER
entity swarm class=monster depth=36 danger=1.6 radius=0.30 color=138,132,56 sprite=rusher_walk name=SWARM
entity husk class=monster depth=36 danger=7.0 radius=0.44 color=128,122,104 sprite=brute_walk name=HUSK
entity sleeper class=monster depth=44 danger=6.0 radius=0.50 color=96,88,74 sprite=brute_walk name=SLEEPER
entity wailer class=monster depth=53 danger=8.0 radius=0.33 color=158,150,176 sprite=spitter_walk name=WAILER
entity voidling class=monster depth=73 danger=11.0 radius=0.32 color=52,48,86 sprite=lurker_walk name=VOIDLING
# Мишень приёмки: не ходит и не бьёт. Опасности не несёт, поэтому и бюджета
# не тратит — ею ставят неподвижную цель, когда нужна именно цель.
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
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
Лут перестал быть мусором; 19 новых вещей (M35) ЧТО ДЕЛАЛО ЛУТ МУСОРОМ. Три вещи, и все три чинятся в броске: 1. Оружие могло выкатиться БЕЗ ЕДИНОГО боевого аффикса. Редкость обещала силу, а рулон целиком уходил в снабжение - и "реликт" оказывался хуже обычного карабина. Теперь первым всегда идёт ключевой тег вида: у оружия боевой, у брони защитный. Замер: 935 небанальных стволов, ноль без боевых аффиксов. 2. Тир брался равномерно до потолка глубины: на восьмидесятом этаже половина аффиксов была первого-второго тира, то есть глубина меняла число строк в описании, а не их силу. Теперь из двух бросков берётся больший - средний тир на дне поднялся с 5.0 до 6.5. 3. Все находки одного этажа имели один бюджет и различались только рулонами. Теперь уровень предмета гуляет -2..+3 от глубины: плюс три сверху дают находку, опережающую глубину, а это лучшая причина спускаться. КОНТЕНТ. 19 новых предметов: шесть стволов (гвоздомёт, пулемёт, плазма, рельса, огнемёт, кислота), четыре клинка (стилет с парированием 0.52, молот на 430 урона и парированием 0.02, цепной, крио), четыре брони и пять карманных. У каждой вещи свой минус, ни одна не доминирует старые; клинки уложены в одну ось "вес против парирования". ИНСТРУМЕНТЫ СЧИТАЛИ ТРЕТЬ ИГРЫ. Список стволов в tools.cpp был захардкожен шестью значениями: --tool weapons и --tool ttk молчали про новое оружие ровно так же, как про новых тварей. Теперь там весь арсенал. Каталог проекта пополнен всеми новыми вещами по тирам и глубинам (3..31), чтобы они реально падали, а не лежали в перечислении. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 23:47:13 +07:00
# --- оружие и снаряжение актов II-VI -------------------------------------------
# Тир — «с какой глубины вещь становится находкой». Роли разные, и каждая вещь
# чем-то хуже соседней: гвоздомёт дешёвый и слабый, пулемёт тяжёлый, рельса
# бьёт далеко и редко (docs/13-combat.md).
entity nailer class=loot tier=1 depth=3 radius=0.24 color=170,170,150 sprite=- name=NAILER
entity recon class=loot tier=1 depth=4 radius=0.26 color=120,140,120 sprite=- name=RECON
entity harness class=loot tier=1 depth=5 radius=0.22 color=150,140,120 sprite=- name=HARNESS
entity acid class=loot tier=2 depth=7 radius=0.26 color=120,170,90 sprite=- name=ACID
entity stiletto class=loot tier=2 depth=7 radius=0.22 color=200,200,220 sprite=- name=STILETTO
entity weave class=loot tier=2 depth=8 radius=0.26 color=110,120,140 sprite=- name=WEAVE
entity clamp class=loot tier=2 depth=8 radius=0.22 color=170,150,110 sprite=- name=CLAMP
entity plasma class=loot tier=3 depth=11 radius=0.26 color=150,190,230 sprite=- name=PLASMA
entity ripper class=loot tier=3 depth=12 radius=0.26 color=160,190,120 sprite=- name=RIPPER
entity helm class=loot tier=3 depth=12 radius=0.28 color=130,130,140 sprite=- name=HELM
entity adrenal class=loot tier=3 depth=13 radius=0.22 color=210,140,120 sprite=- name=ADRENAL
entity thermal class=loot tier=3 depth=14 radius=0.22 color=200,120,90 sprite=- name=THERMAL
entity flamer class=loot tier=4 depth=17 radius=0.28 color=230,140,60 sprite=- name=FLAMER
entity cryoedge class=loot tier=4 depth=18 radius=0.26 color=140,200,230 sprite=- name=CRYOEDGE
entity pauldron class=loot tier=4 depth=19 radius=0.24 color=140,140,150 sprite=- name=PAULDRON
entity carapace class=loot tier=4 depth=20 radius=0.30 color=120,110,90 sprite=- name=CARAPACE
entity hmg class=loot tier=5 depth=24 radius=0.30 color=90,100,110 sprite=- name=HMG
entity maul class=loot tier=5 depth=26 radius=0.30 color=150,130,110 sprite=- name=MAUL
entity rail class=loot tier=6 depth=31 radius=0.28 color=180,180,210 sprite=- name=RAIL