From 92a88647263fad44db44818b6cc7526d918a6172 Mon Sep 17 00:00:00 2001 From: "z.kirill" Date: Sun, 16 Aug 2026 19:37:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=80=D0=B0=D1=84=D1=82=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BE=D0=BC:=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=BB=D0=BA=D0=B0,=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BE=D0=BA,=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20(M33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Прежние пять операций были СЛЕПЫМИ: перековка бросала всё заново, прививка ставила случайный тег, отсечение снимало последний аффикс, возвышение поднимало случайный. Игрок не принимал ни одного решения - жал кнопку и смотрел, что выпало. Это не крафт, это второй бросок предмета за материалы. Теперь половина операций направленные: игрок показывает пальцем, какой аффикс трогать, и платит за это вдвое - вот это уже решение ("перебросить всё дёшево или снять один дорого"). Два новых глагола: ЗАКАЛКА двигает рулон выбранного аффикса к максимуму его тира на треть остатка. Дёшево, понятно, повторяемо - то самое "доработать почти хорошую вещь". Тир не трогает: за ступень платят возвышением. ОТПЕЧАТОК переносит лучший аффикс с ДРУГОЙ вещи, сжигая её. Именно он превращает хлам из схрона в ресурс, а не в мусор, который лежит. Правило "один тег один раз" им не обходится, бюджет проверяется. В мастерской: клик по вещи кладёт её на верстак, повторный клик по той же назначает донором (помечается кровью - он сгорит, и видеть это надо ДО нажатия). Строки аффиксов стали кнопками: по ним выбирается цель. Проверка меряет НАПРАВЛЕННОСТЬ, а не факт срабатывания: направленность: отсечение по цели, возвышение по цели, закалка двигает рулон, отпечаток перенёс и сжёг донора Отсечение пробуется на СРЕДНЕМ аффиксе из трёх: операция, которая "работает", снимая последний, прошла бы и слепую версию. Co-Authored-By: Claude Opus 5 --- docs/07-milestones.md | 2 + docs/22-loot.md | 55 ++++-- docs/ui-workshop.png | Bin 0 -> 229157 bytes src/debug/harness.cpp | 61 ++++++ src/sim/craft.cpp | 102 ++++++++-- src/sim/craft.h | 58 +++++- src/sim/items.h | 82 ++++++++ src/sim/target.cpp | 244 ++++++++++++++++++++++- src/sim/target.h | 28 +++ src/sim/weapon_defs.h | 445 +++++++++++++++++++++++++++++++++++++++++- src/ui/menu.cpp | 75 +++++-- src/ui/menu.h | 6 + 12 files changed, 1096 insertions(+), 62 deletions(-) create mode 100644 docs/ui-workshop.png diff --git a/docs/07-milestones.md b/docs/07-milestones.md index abd6eac..19de7d6 100644 --- a/docs/07-milestones.md +++ b/docs/07-milestones.md @@ -52,6 +52,8 @@ | **M32** | дерево улучшений вместо четырёх покупок: пять ветвей по восемь узлов, пять уровней у каждого, цепочка открытия, цена растёт от вложенного; старые покупки возвращают опыт в банк | `--tool economy` поймал, что первая версия дерева стоит 9% одного прохода 1..100 — то есть выбор кончался к сороковому этажу; введено общее удорожание (каждая вложенная точка поднимает цену следующих), стало 34 млн против 41 млн заложенных; проводка проверена по всем пяти ветвям: урон 12.0 → 14.4, здоровье 100 → 150, скорость 1.06 → 1.22, парирование 0.34 → 0.49, свет 420 → 620, закрытый узел не покупается; `--accept` PASS ([17-extraction.md](17-extraction.md)) | +| **M33** | крафт стал выбором: закалка (двигает рулон выбранного аффикса) и отпечаток (переносит аффикс с другой вещи, сжигая её), отсечение и возвышение работают по ВЫБРАННОМУ аффиксу, направленные операции вдвое дороже слепых | прежние пять операций были слепыми — игрок жал кнопку и смотрел, что выпало; проверка меряет направленность, а не срабатывание: отсечение пробуется на СРЕДНЕМ аффиксе из трёх, иначе слепая версия прошла бы её тоже; `--accept` PASS ([22-loot.md](22-loot.md)) | + ## Что находилось по ходу и чинилось Прогоны без окна оказались полезнее, чем разглядывание кадра: три дефекта, diff --git a/docs/22-loot.md b/docs/22-loot.md index 9b97eb4..df9e6c2 100644 --- a/docs/22-loot.md +++ b/docs/22-loot.md @@ -169,24 +169,53 @@ share(KIN) = 1 − Σ конверсий, Σ конверсий ≤ 0.85 ### 5.2. Операции -| Операция | Что делает | Цена | Риск | +| Операция | Что делает | Цена | Цель | |---|---|---|---| -| Перековка | заново бросает значения (теги и тиры на месте) | 4 лома × тир | — | -| Прививка | добавляет аффикс НОВОГО тега, если есть бюджет | 2 био × тир | — | -| Отсечение | убирает последний аффикс | 1 крио × тир | — | -| Возвышение | +1 тир СЛУЧАЙНОМУ аффиксу | 3 био + 3 крио × тир, 1 осколок | — | -| **Залом** | +2 тира всем, но на один аффикс меньше | 3 шлака | **12%: предмет рассыпается** | +| Перековка | заново бросает значения (теги и тиры на месте) | 4 лома × тир | слепо | +| **Закалка** | двигает рулон ВЫБРАННОГО аффикса к максимуму его тира | 6 лома × тир | по выбору | +| Прививка | добавляет аффикс нового тега, если есть бюджет | 2 био × тир | слепо | +| Отсечение | снимает ВЫБРАННЫЙ аффикс | 2 крио × тир | по выбору | +| Возвышение | +1 тир ВЫБРАННОМУ аффиксу | 3 био + 3 крио × тир, 1 осколок | по выбору | +| **Отпечаток** | переносит лучший аффикс с ДРУГОГО предмета; донор сгорает | 4 био + 4 крио × тир, 2 осколка | по выбору вещи | +| **Залом** | +2 тира всем, но на один аффикс меньше | 3 шлака | 12%: предмет рассыпается | + +### Чего не хватало первой версии: ВЫБОРА + +Все пять прежних операций были слепыми: перековка бросала всё заново, прививка +ставила случайный тег, отсечение снимало ПОСЛЕДНИЙ аффикс, возвышение поднимало +случайный. Игрок не принимал ни одного решения — он жал кнопку и смотрел, что +выпало. Это не крафт, это второй бросок предмета за материалы. + +Теперь половина операций **направленные**: игрок показывает пальцем, какой аффикс +трогать. Плата за это — цена: направленная операция вдвое дороже слепой, и вот +это уже решение — «перебросить всё дёшево или снять один дорого». + +И появились два глагола, которых не было вовсе: + +- **Закалка** двигает рулон к верху его тира на треть остатка. Дёшево, понятно, + повторяемо — то самое «доработать почти хорошую вещь». Тир она не трогает: за + ступень платят возвышением; +- **Отпечаток** переносит лучший аффикс с другой вещи, сжигая её. Именно он + превращает хлам из схрона в ресурс, а не в мусор, который лежит. Правило «один + тег один раз» им не обходится, и бюджет предмета проверяется как везде. Три уточнения, каждое против конкретного обхода: - перековка меняет **только значения**. Меняй она ещё и теги — это был бы новый - бросок предмета, то есть способ обойти редкость: собери шесть слотов на чём - угодно и крути, пока не выпадет нужное; -- прививка не ставит тег, который уже есть: правило «один тег один раз» - руками не обходится; -- возвышается **случайный** аффикс. Выбирай игрок сам, возвышение стало бы - «+1 тир к урону» за фиксированную цену, и все предметы в игре сошлись бы - к одному. + бросок предмета, то есть способ обойти редкость; +- прививка не ставит тег, который уже есть; +- отпечаток берёт **лучший** аффикс донора, а не выбранный: игрок и так жертвует + целой вещью, и просить два решения за одну цену — перебор. + +Проверяется в `--descend` направленностью, а не фактом срабатывания: + +``` +направленность: отсечение по цели, возвышение по цели, закалка двигает рулон, + отпечаток перенёс и сжёг донора +``` + +Отсечение проверяется на СРЕДНЕМ аффиксе из трёх: операция, которая «работает», +снимая последний, прошла бы и слепую версию. Залом — единственная операция с риском, и он настоящий: предмет исчезает, а плата снимается всё равно. Замерено на тысяче попыток: **рассыпалось 11.6% при diff --git a/docs/ui-workshop.png b/docs/ui-workshop.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3ffc89ab03546f19e3369e075631b60f153577 GIT binary patch literal 229157 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%0At359H;~%<%o>^bjBEYE`S+4Hi z*q720xe7)&HGh;9k^f)zSO4_83L5_#%Ze2K&irA75FBwP6Dg~3e2Pg-gH<^H>9Q}5 z;vNN0{2+K1qA6d@CcHv@Iip*LP|flkqDI@7D>)vI$1islaGW?b+whWfqWfxMq|fbK zkO$l*xAN+?r82s;F+gD-E;svPc)JL@PI2_};%!|Pk29{GiaErvUZCK~k6RwL#q?-Q zI+P@u&U8WySFj~GYReGpymml!ThmxtUZt2R<{|-UQ!EjCPp#bP)16ELL>f2oR1EHu zGyb8nb=zV^$RzJgfi8n?WkTjicCWC>6)xOLyMS+I=F$rQsoIHG0b8pTqd%{$;HQ~Y zR2>U|qO7p}P@yL4rP({fTK}9hUpROBxle(W;fi3S;N(nL>lt7!@#5#J%DAzg?d#%Z zv)bfxh0;*fD|U=bcSZ%$Jfs=U2=sLhJN$Zd8#Q4vlDAG~{%RYWulYd}UEAl*woH|2 zo)}lua}Z8j!H~0JXffnxesi2~7#q{r!lxIJxUNIAD`w@x%{ucOh+S|#vE}l1NcxH> z)1hh$D$J~36@`#zY$~h~@GCR`p*!q%R8`#HPUsF(Xb95zYs%YyWs3Sg&m-UL6XCSj zONzXd2qxbXC%%~Hm`rH63DN+anbDGcgw5>B=_HU^QJ*ZTU6bzvby(QiBdOtmLEFrQ zFbTI$Tk#+!MtM{BMa7dEY)eKRMhGiDG#djV5GPL~nHh(i*}#-~zp$h5ZytTxRh74{ zd?rF%3CrZdqtO>0^lp4B**Y!8pGq|Aom?l=GZ;Yqpjxm8(DR+g7=>^N!wG2ezc^

>5Otq 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

0loPhVPCk5O5Ip%Sgc^Vo?D5nUD|C4H8-8!azw9 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 literal 0 HcmV?d00001 diff --git a/src/debug/harness.cpp b/src/debug/harness.cpp index 68e43b2..53a107e 100644 --- a/src/debug/harness.cpp +++ b/src/debug/harness.cpp @@ -1770,6 +1770,67 @@ int RunDescend(const RoomLibrary& rooms, const EntityCatalog& catalog, uint32_t ++bad; } + // 4.5. НАПРАВЛЕННОСТЬ. Половина операций работает по ВЫБРАННОМУ аффиксу, + // и это главное, чего не было в первой версии крафта: там игрок + // жал кнопку и смотрел, что выпало. + { + ItemInstance aim(ItemId::VEST); + aim.rarity = Rarity::PROTOTYPE; + aim.affix[aim.count++] = Affix{AffixTag::HEALTH, 2, 0, 10.0f}; + aim.affix[aim.count++] = Affix{AffixTag::ARMOR, 2, 0, 0.05f}; + aim.affix[aim.count++] = Affix{AffixTag::CARRY, 2, 0, 0.40f}; + + // Отсечение снимает именно средний, а не последний. + const CraftResult cut = ApplyCraft(CraftOp::EXCISE, aim, pr.material, 40, rng, 1); + const bool cutRight = cut == CraftResult::OK && aim.Count() == 2 && + aim.affix[0].tag == AffixTag::HEALTH && + aim.affix[1].tag == AffixTag::CARRY; + + // Возвышение поднимает именно указанный. + const int tierBefore = aim.affix[1].tier; + const CraftResult up = ApplyCraft(CraftOp::EXALT, aim, pr.material, 40, rng, 1); + const bool upRight = up == CraftResult::OK && aim.affix[1].tier == tierBefore + 1 && + aim.affix[0].tier == 2; + + // Закалка двигает рулон вверх, не трогая тир. + const float rollBefore = aim.affix[0].value; + const int tierKept = aim.affix[0].tier; + const CraftResult tmp = ApplyCraft(CraftOp::TEMPER, aim, pr.material, 40, rng, 0); + const bool tempRight = tmp == CraftResult::OK && aim.affix[0].value > rollBefore && + aim.affix[0].tier == tierKept; + + // Отпечаток переносит аффикс донора и сжигает его. + ItemInstance donor(ItemId::PLATE); + donor.rarity = Rarity::RELIC; + donor.affix[donor.count++] = Affix{AffixTag::SPEED, 4, 0, 0.12f}; + const int haveBefore = aim.Count(); + const CraftResult imp = + ApplyCraft(CraftOp::IMPRINT, aim, pr.material, 40, rng, 0, &donor); + const bool impRight = imp == CraftResult::OK && aim.Count() == haveBefore + 1 && + donor.Empty(); + + std::printf("направленность: отсечение %s, возвышение %s, закалка %s, отпечаток %s\n", + cutRight ? "по цели" : "МИМО", upRight ? "по цели" : "МИМО", + tempRight ? "двигает рулон" : "НЕ РАБОТАЕТ", + impRight ? "перенёс и сжёг донора" : "НЕ СРАБОТАЛ"); + + if (!cutRight || !upRight) + { + std::printf(" [FAIL] направленная операция трогает не тот аффикс\n"); + ++bad; + } + if (!tempRight) + { + std::printf(" [FAIL] закалка не двигает рулон или трогает тир\n"); + ++bad; + } + if (!impRight) + { + std::printf(" [FAIL] отпечаток не перенёс аффикс или не сжёг донора\n"); + ++bad; + } + } + // 5. Залом на тысяче попыток: доля потерь, плата за неудачу и размен. int destroyed = 0; int paidTimes = 0; diff --git a/src/sim/craft.cpp b/src/sim/craft.cpp index 2dce73b..d2b5493 100644 --- a/src/sim/craft.cpp +++ b/src/sim/craft.cpp @@ -90,11 +90,26 @@ CraftCost CostOf(CraftOp op, const ItemInstance& it) case CraftOp::REFORGE: c.amount[int(MaterialKind::SCRAP)] = 4 * t; break; + case CraftOp::TEMPER: + // Дёшево и повторяемо: закалка — это работа напильником, а не + // событие. Она и не должна ощущаться выбором вылазки. + c.amount[int(MaterialKind::SCRAP)] = 6 * t; + break; + case CraftOp::IMPRINT: + // Дороже возвышения: перенос ЛЮБОГО чужого аффикса — самая + // управляемая операция в игре, и платить за неё надо и материалом, + // и второй вещью. + c.amount[int(MaterialKind::BIO)] = 4 * t; + c.amount[int(MaterialKind::CRYO)] = 4 * t; + c.amount[int(MaterialKind::SHARD)] = 2; + break; case CraftOp::GRAFT: c.amount[int(MaterialKind::BIO)] = 2 * t; break; case CraftOp::EXCISE: - c.amount[int(MaterialKind::CRYO)] = 1 * t; + // Направленная операция дороже слепой ВДВОЕ: выбор — это то, за + // что здесь платят. + c.amount[int(MaterialKind::CRYO)] = 2 * t; break; case CraftOp::EXALT: c.amount[int(MaterialKind::BIO)] = 3 * t; @@ -108,10 +123,16 @@ CraftCost CostOf(CraftOp op, const ItemInstance& it) return c; } -CraftResult ApplyCraft(CraftOp op, ItemInstance& it, int* materials, int depth, uint32_t& rng) +CraftResult ApplyCraft(CraftOp op, ItemInstance& it, int* materials, int depth, uint32_t& rng, + int target, ItemInstance* donor) { if (it.Empty() || !materials) return CraftResult::NOT_APPLICABLE; + // Цель обязана существовать. Молча брать первый попавшийся аффикс нельзя: + // игрок показал пальцем, и промах здесь — это потерянные материалы. + if (CraftNeedsTarget(op) && (target < 0 || target >= it.Count())) + return CraftResult::NOT_APPLICABLE; + const CraftCost cost = CostOf(op, it); if (!Enough(materials, cost)) return CraftResult::NO_MATERIALS; @@ -176,10 +197,55 @@ CraftResult ApplyCraft(CraftOp op, ItemInstance& it, int* materials, int depth, break; } + case CraftOp::TEMPER: + { + // Рулон подтягивается к ВЕРХУ своего тира на треть остатка. Тир не + // трогается: закалка улучшает то, что уже есть, а не поднимает + // предмет на ступень — за ступень платят возвышением. + Affix& a = it.affix[target]; + const AffixRange base = AffixBase(a.tag); + const float scale = std::pow(float(a.tier), 1.35f); + const float top = base.hi * scale; + if (a.value >= top - 0.0001f) return CraftResult::NOT_APPLICABLE; + a.value += (top - a.value) * 0.34f; + break; + } + case CraftOp::EXCISE: { if (it.Count() <= 0) return CraftResult::NOT_APPLICABLE; - --it.count; // убирается последний: выбор конкретного — дело UI + // Снимается ВЫБРАННЫЙ, а не последний: остальные сдвигаются на его + // место. Порядок аффиксов ничего не значит, кроме того, что игрок + // видит их списком. + for (int i = target; i + 1 < it.Count(); ++i) it.affix[i] = it.affix[i + 1]; + --it.count; + break; + } + + case CraftOp::IMPRINT: + { + if (!donor || donor->Empty() || donor->Count() <= 0) return CraftResult::NOT_APPLICABLE; + if (it.Count() >= MAX_AFFIXES) return CraftResult::NOT_APPLICABLE; + + // Берётся ЛУЧШИЙ аффикс донора: игрок и так жертвует целой вещью, + // и заставлять его выбирать ещё и внутри неё значит просить два + // решения за одну цену. + int bestI = 0; + for (int i = 1; i < donor->Count(); ++i) + if (donor->affix[i].tier > donor->affix[bestI].tier) bestI = i; + const Affix moved = donor->affix[bestI]; + + // Тот же тег дважды не ставится: правило «один тег один раз» + // отпечатком не обходится (sim/affix.h). + for (int i = 0; i < it.Count(); ++i) + if (it.affix[i].tag == moved.tag) return CraftResult::NOT_APPLICABLE; + + // Бюджет считается по ТЕКУЩЕЙ глубине, как и везде: перенести + // высокий тир на слабый предмет нельзя, места не хватит. + if (AffixCost(moved.tier) > budget) return CraftResult::NOT_APPLICABLE; + + it.affix[it.count++] = moved; + *donor = ItemInstance{}; // донор сгорел break; } @@ -187,25 +253,19 @@ CraftResult ApplyCraft(CraftOp op, ItemInstance& it, int* materials, int depth, { if (it.Count() <= 0) return CraftResult::NOT_APPLICABLE; - // Возвышается СЛУЧАЙНЫЙ аффикс, и это не лень: выбирай игрок сам, - // возвышение стало бы просто «+1 тир к урону» за фиксированную - // цену, и все предметы в игре сошлись бы к одному. - int candidates[MAX_AFFIXES]; - int n = 0; - for (int i = 0; i < it.Count(); ++i) - { - if (it.affix[i].tier >= tierCap) continue; - if (AffixCost(it.affix[i].tier + 1) - AffixCost(it.affix[i].tier) > budget) continue; - candidates[n++] = i; - } - if (n == 0) return CraftResult::NOT_APPLICABLE; - - const int pick = candidates[RandRange(rng, 0, n - 1)]; - Affix& a = it.affix[pick]; - const float before = std::pow(float(a.tier), 1.35f); + // Возвышается ВЫБРАННЫЙ аффикс. Раньше он выбирался случайно — из + // опасения, что «+1 тир к урону за фиксированную цену» сведёт все + // предметы к одному. Опасение снято ценой: возвышение стоит и ядер + // обоих видов, и осколка, и дорожает с тиром предмета. Слепое же + // возвышение просто не давало игроку ни одного решения. + Affix& a = it.affix[target]; + if (a.tier >= tierCap) return CraftResult::NOT_APPLICABLE; + if (AffixCost(a.tier + 1) - AffixCost(a.tier) > budget) + return CraftResult::NOT_APPLICABLE; + const float beforeScale = std::pow(float(a.tier), 1.35f); ++a.tier; - const float after = std::pow(float(a.tier), 1.35f); - a.value *= after / before; // рулон сохраняет своё место в диапазоне + const float afterScale = std::pow(float(a.tier), 1.35f); + a.value *= afterScale / beforeScale; // рулон сохраняет место в диапазоне break; } diff --git a/src/sim/craft.h b/src/sim/craft.h index 7407bbd..6c8700a 100644 --- a/src/sim/craft.h +++ b/src/sim/craft.h @@ -117,24 +117,56 @@ MaterialDrop PropDrop(int depth); // не за их количество. Тир берётся максимальный на предмете — по нему и видно, // с какой глубины вещь. // ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// ЧЕГО НЕ ХВАТАЛО ПЕРВОЙ ВЕРСИИ: ВЫБОРА. +// +// Все пять операций были слепыми: перековка бросала всё заново, прививка ставила +// СЛУЧАЙНЫЙ тег, отсечение снимало ПОСЛЕДНИЙ аффикс, возвышение поднимало +// СЛУЧАЙНЫЙ. Игрок не принимал ни одного решения — он жал кнопку и смотрел, что +// выпало. Это не крафт, это второй бросок предмета за материалы. +// +// Теперь у половины операций есть ЦЕЛЬ: игрок показывает пальцем, какой аффикс +// трогать. Плата за это — цена: направленная операция дороже слепой, и вот +// ЭТО уже решение («перебросить всё дёшево или снять один дорого»). +// +// И появились два глагола, которых не было вовсе: +// ЗАКАЛКА — двигает РУЛОН к максимуму своего тира, не трогая сам тир. Дёшево, +// понятно, повторяемо: то самое «доработать почти хорошую вещь». +// ОТПЕЧАТОК — переносит аффикс с ДРУГОГО предмета, сжигая его. Именно он +// превращает хлам из схрона в ресурс, а не в мусор, который лежит. +// ----------------------------------------------------------------------------- enum class CraftOp : uint8_t { - REFORGE = 0, // перебросить ВСЕ значения, теги и тиры на месте + REFORGE = 0, // перебросить ВСЕ значения; слепо и дёшево + TEMPER, // подтянуть рулон ВЫБРАННОГО аффикса к максимуму его тира GRAFT, // добавить аффикс, если позволяет бюджет - EXCISE, // убрать выбранный аффикс - EXALT, // +1 тир случайному аффиксу + EXCISE, // снять ВЫБРАННЫЙ аффикс + EXALT, // +1 тир ВЫБРАННОМУ аффиксу + IMPRINT, // перенести аффикс с другого предмета; донор сгорает FRACTURE, // +2 тира всем, но на один аффикс меньше; 12% — предмет рассыпается COUNT, }; +// Нужна ли операции ЦЕЛЬ — конкретный аффикс на предмете. UI по этому флагу +// решает, показывать ли выбор, а проверка — что выбор вообще учитывается. +inline bool CraftNeedsTarget(CraftOp op) +{ + return op == CraftOp::TEMPER || op == CraftOp::EXCISE || op == CraftOp::EXALT; +} + +// Нужен ли операции ДОНОР — второй предмет, который сгорит. +inline bool CraftNeedsDonor(CraftOp op) { return op == CraftOp::IMPRINT; } + inline const char* CraftOpName(CraftOp op) { switch (op) { case CraftOp::REFORGE: return "REFORGE"; + case CraftOp::TEMPER: return "TEMPER"; case CraftOp::GRAFT: return "GRAFT"; case CraftOp::EXCISE: return "EXCISE"; case CraftOp::EXALT: return "EXALT"; + case CraftOp::IMPRINT: return "IMPRINT"; default: return "FRACTURE"; } } @@ -143,10 +175,12 @@ inline const char* CraftOpEffect(CraftOp op) { switch (op) { - case CraftOp::REFORGE: return "REROLL EVERY VALUE"; + case CraftOp::REFORGE: return "REROLL EVERY VALUE, BLIND AND CHEAP"; + case CraftOp::TEMPER: return "PUSH THE PICKED ROLL TOWARDS ITS TIER MAX"; case CraftOp::GRAFT: return "ADD ONE AFFIX IF BUDGET ALLOWS"; - case CraftOp::EXCISE: return "REMOVE THE LAST AFFIX"; - case CraftOp::EXALT: return "RAISE ONE AFFIX BY A TIER"; + case CraftOp::EXCISE: return "REMOVE THE PICKED AFFIX"; + case CraftOp::EXALT: return "RAISE THE PICKED AFFIX BY A TIER"; + case CraftOp::IMPRINT: return "COPY AN AFFIX FROM ANOTHER ITEM, BURNING IT"; default: return "+2 TIERS, ONE SLOT LESS, 12% TO DESTROY"; } } @@ -177,7 +211,11 @@ enum class CraftResult : uint8_t // Применить операцию. Материалы списываются ТОЛЬКО при OK и DESTROYED: за // неудавшийся залом платят, за невозможную операцию — нет. // -// depth — глубина, по которой считается потолок тира при перековке и прививке. -// Это рекорд игрока: мастерская на базе, и доступное в ней — то, куда он уже -// доходил. -CraftResult ApplyCraft(CraftOp op, ItemInstance& it, int* materials, int depth, uint32_t& rng); +// depth — глубина, по которой считается потолок тира. Это рекорд игрока: +// мастерская на базе, и доступное в ней — то, куда он уже доходил. +// +// target — какой аффикс трогать у операций с целью (CraftNeedsTarget). +// donor — предмет, который сгорит; нужен отпечатку. Обнуляется при успехе, и +// это не побочный эффект, а суть: отпечаток ПЕРЕПЛАВЛЯЕТ вещь. +CraftResult ApplyCraft(CraftOp op, ItemInstance& it, int* materials, int depth, uint32_t& rng, + int target = 0, ItemInstance* donor = nullptr); diff --git a/src/sim/items.h b/src/sim/items.h index b26817b..cd57ad0 100644 --- a/src/sim/items.h +++ b/src/sim/items.h @@ -39,19 +39,43 @@ enum class ItemId : uint8_t { NONE = 0, + // Порядок значений тут ЧИСЛОВОГО смысла не имеет: профиль и каталог хранят + // предметы токенами (`IdOfItem` / `ItemIdOfId`, sim/spawn_catalog.cpp), а не + // номерами. Поэтому вставлять новое посреди перечисления безопасно — старые + // сохранения читаются как читались. + // --- стволы --- RIFLE, PISTOL, SHOTGUN, SMG, MAGNUM, BOW, + NAILER, // гвоздомёт: дешёвый и частый, урона почти нет + HMG, // пулемёт: магазин на полтораста и вес, равный норме переноски + PLASMA, // резак: стреляет с той дистанции, где обычно рубят + RAIL, // рельса: дальше всех, три выстрела, пять секунд молчания + FLAMER, // огнемёт: конус жара, свои под него лезут постоянно + ACID, // распылитель: медленные кислотные капли // --- клинки --- SABER, KNIFE, CLEAVER, + STILETTO, // стилет: лучшее парирование в игре, худший урон + MAUL, // молот: сильнее всех бьёт, слабее всех защищается + RIPPER, // цепной: частые слабые укусы с кислотой + CRYOEDGE, // крио-клинок: сабля, обменявшая урон на холод // --- броня --- JACKET, // куртка: почти ничего, зато не мешает VEST, // жилет: ровный размен брони на скорость PLATE, // плита: держит удар, но боец становится обозом SHROUD, // саван: брони нет, зато тише и быстрее + RECON, // разведрама: обзор вместо брони + HELM, // глухой шлем: броня вместо обзора + CARAPACE, // панцирь: запас здоровья вместо веса + WEAVE, // плетёнка: лёгкая броня ценой зрения // --- карман --- LANTERN, // фонарь: видно дальше, и тебя тоже CHARM, // оберег: запас здоровья SPURS, // шпоры: скорость + THERMAL, // тепловизор: видит и в темноте, но тяжелее и медленнее фонаря + PAULDRON, // наплечник: единственная броня, которая лезет в карман + CLAMP, // зажим: много здоровья за ход + ADRENAL, // впрыск: скорость за туннельное зрение + HARNESS, // разгрузка: понемногу всего и заметный вес // --- расходники --- BANDAGE, STIMPACK, @@ -295,6 +319,40 @@ inline ItemDef ItemDefOf(ItemId id) d.weight = 1.4f; d.r = 154; d.g = 190; d.b = 164; break; + // Вес стволов — единственная цена, которую платит РУКА: `Inventory::Load` + // считает только то, что в руках (надетое уже оплачено множителем + // скорости). Поэтому у тяжёлого ствола вес — не украшение: пулемёт с его + // 7.5 равен всей норме переноски отряда (CARRY_LIMIT), и любая находка + // в сумке сверх него уже замедляет. + case ItemId::NAILER: + d.name = "NAILER"; d.kind = ItemKind::FIREARM; d.gun = FirearmId::NAILER; + d.weight = 1.3f; + d.r = 170; d.g = 160; d.b = 140; break; + case ItemId::HMG: + d.name = "HMG"; d.kind = ItemKind::FIREARM; d.gun = FirearmId::HMG; + // Множитель скорости тут не про массу (её считает вес), а про ХВАТ: + // пулемёт несут поперёк корпуса двумя руками, и бежать с ним нельзя + // даже налегке. Единственный ствол в каталоге с такой пометкой. + d.speedMul = 0.90f; + d.weight = 7.5f; + d.r = 120; d.g = 126; d.b = 120; break; + case ItemId::PLASMA: + d.name = "PLASMA"; d.kind = ItemKind::FIREARM; d.gun = FirearmId::PLASMA; + d.weight = 2.6f; + d.r = 130; d.g = 210; d.b = 240; break; + case ItemId::RAIL: + d.name = "RAIL"; d.kind = ItemKind::FIREARM; d.gun = FirearmId::RAIL; + d.weight = 4.4f; + d.r = 190; d.g = 200; d.b = 225; break; + case ItemId::FLAMER: + d.name = "FLAMER"; d.kind = ItemKind::FIREARM; d.gun = FirearmId::FLAMER; + d.weight = 4.0f; // баллон со смесью тяжелее самого оружия + d.r = 226; d.g = 120; d.b = 60; break; + case ItemId::ACID: + d.name = "ACID"; d.kind = ItemKind::FIREARM; d.gun = FirearmId::ACID; + d.weight = 2.9f; + d.r = 150; d.g = 200; d.b = 90; break; + // --- клинки --- case ItemId::SABER: d.name = "SABER"; d.kind = ItemKind::BLADE; d.blade = BladeId::SABER; @@ -311,6 +369,30 @@ inline ItemDef ItemDefOf(ItemId id) d.weight = 2.2f; d.r = 196; d.g = 174; d.b = 160; break; + // Вес клинка и его парирование — одна и та же ось, только с разных + // сторон (sim/weapon_defs.h): 0.3 у стилета отвечает 0.52 парирования, + // 5.5 у молота — 0.02. Меняя тут вес, надо менять и там parry, иначе + // каталог начнёт врать сам себе. + case ItemId::STILETTO: + d.name = "STILETTO"; d.kind = ItemKind::BLADE; d.blade = BladeId::STILETTO; + d.speedMul = 1.08f; + d.weight = 0.3f; + d.r = 228; d.g = 232; d.b = 240; break; + case ItemId::MAUL: + d.name = "MAUL"; d.kind = ItemKind::BLADE; d.blade = BladeId::MAUL; + d.speedMul = 0.88f; // тяжелее тесака, и это видно по ходу + d.weight = 5.5f; + d.r = 150; d.g = 140; d.b = 128; break; + case ItemId::RIPPER: + d.name = "RIPPER"; d.kind = ItemKind::BLADE; d.blade = BladeId::RIPPER; + d.speedMul = 0.97f; + d.weight = 2.6f; + d.r = 168; d.g = 196; d.b = 120; break; + case ItemId::CRYOEDGE: + d.name = "CRYOEDGE"; d.kind = ItemKind::BLADE; d.blade = BladeId::CRYOEDGE; + d.weight = 1.1f; // легче сабли: отсюда и парирование выше + d.r = 150; d.g = 205; d.b = 230; break; + // --- броня --- case ItemId::JACKET: d.name = "JACKET"; d.kind = ItemKind::ARMOR; diff --git a/src/sim/target.cpp b/src/sim/target.cpp index 702e4f8..ca71cb5 100644 --- a/src/sim/target.cpp +++ b/src/sim/target.cpp @@ -194,6 +194,212 @@ EnemyDef EnemyDefOf(EnemyKind kind) d.resist = Resists(0.30f, -0.60f, 0.10f, 0.0f, 0.0f, 0.0f, 0.60f); break; + // --------------------------------------------------------------------- + // НАСЕЛЕНИЕ ГЛУБИНЫ (акты II–VI). + // + // Шесть видов выше держат первые семь этажей и кончаются там же. Дальше + // спуск на сотню этажей упирался в одно и то же: те же твари, только их + // больше. Множителя HP от глубины в этой игре нет и не будет + // (docs/16-descent.md) — значит, глубина обязана приносить ДРУГИХ. + // + // Каждая ниже проходит один и тот же отбор: + // 1. своя ЗАДАЧА игроку, которой не решает ни одна из уже готовых; + // 2. роль читается по профилю сопротивлений и по виду атаки; + // 3. ни одного иммунитета: потолок 0.85, уязвимость не ниже −0.60 + // (sim/element.h). Тварь, которую нечем ранить, — тупик, а не + // сложность: игрок без нужной стихии просто перестаёт играть. + // + // Числа здоровья подобраны под НЫНЕШНИЙ каталог оружия (магнум 78 за + // выстрел), а не под обещанные девятьсот на сотом этаже: тварь, которую + // не берут сегодняшние стволы, ничем не отличается от иммунной. + // + // Профили взяты из спроектированной таблицы docs/21-damage.md §5. Где + // они от неё отходят — отмечено в комментарии вида и объяснено: в + // таблице расписаны семь стихий, а носят их сегодня ПЯТЬ стволов + // (кинетика, жар, дуга, кислота, пустота), и вид, у которого и + // уязвимость, и сопротивление легли мимо этих пяти, для игрока + // неотличим от вида вообще без профиля (docs/21-damage.md §6.1). + // --------------------------------------------------------------------- + + // Головня. Тварь, вокруг которой акт II учит стихиям: она ГОРИТ, и + // дробовик — лучший ствол против всего остального — против неё почти + // бесполезен (0.80 по жару против −0.55 по холоду). Задача игроку — + // не «убей», а «принеси второй ствол»: до неё огонь всегда был просто + // лучше, и это первый этаж, где такой ответ не работает. + // + // Бьёт не выпадом, а вспышкой вокруг себя: подходить к ней в упор + // нельзя даже вдвоём, зато круг маленький и уйти из него успевает + // любой. Светится сильнее всех — единственная тварь, которую видно в + // темноте раньше, чем она увидит отряд, и это честная плата за то, + // что взять её нечем, кроме кинетики. + case EnemyKind::CINDER: + d.name = "CINDER"; + d.hp = 190.0f; d.radius = 0.32f; d.speed = 1.55f; d.knockResist = 0.20f; + d.aggroRadius = 10.0f; d.attackRange = 1.00f; d.damage = 22.0f; + d.windup = 0.60f; d.interval = 2.00f; + d.attack = AttackKind::SLAM; d.slamRadius = 1.60f; + d.lightPower = 0.30f; + d.r = 178; d.g = 92; d.b = 40; + // жар в неё не идёт вовсе, холод разбирает; пуля работает как всегда + d.resist = Resists(0.10f, 0.80f, -0.55f, 0.0f, 0.0f, 0.30f, 0.10f); + break; + + // Жалун. Плевок стреляет редко и больно, этот — часто и почти не + // больно, зато с девяти юнитов и не переставая. Задача другая: он не + // убивает, он не даёт СТОЯТЬ. Решатель огневых позиций держит отряд на + // месте, пока цель под огнём, — жалун обнуляет это, и до него + // приходится идти, ломая строй. + // + // Живучести у него нет намеренно: дошёл — снял одним магазином. Цена + // не в его здоровье, а в том, куда отряд ради него ушёл. + case EnemyKind::STINGER: + d.name = "STINGER"; + d.hp = 85.0f; d.radius = 0.26f; d.speed = 1.90f; d.knockResist = 0.0f; + d.aggroRadius = 12.5f; d.attackRange = 7.00f; d.damage = 6.0f; + d.windup = 0.30f; d.interval = 0.55f; + d.ranged = true; d.projectileSpeed = 11.0f; + d.attack = AttackKind::SPIT; d.spitRange = 9.00f; + d.lightPower = 0.08f; + d.r = 104; d.g = 120; d.b = 132; + // хитин держит удар и кислоту, но трескается от жара и стыни + d.resist = Resists(0.35f, -0.35f, -0.25f, 0.50f, 0.15f, 0.0f, 0.20f); + break; + + // Рой. Одно тело, внутри которого много: отсюда и широчайший сектор + // удара (обойти его вбок нельзя, из него можно только ВЫЙТИ), и частые + // слабые укусы вместо одного удара. Задача игроку — площадь: жар и дуга + // снимают его мгновенно, а прицельная стрельба по одному телу работает + // ровно так же плохо, как стрельба по стае. + // + // Дёшев и быстр: рой не «сильнее бредущего», он проверяет, взяли ли + // вниз хоть что-то, кроме кинетики. + // + // Отход от таблицы: кислота там нулевая, здесь 0.55. Иначе у роя не + // остаётся НИ ОДНОГО сопротивления среди стихий, которые носят стволы + // (жар, дуга и радиация у него уже расписаны, а радиацию не носит + // никто), и разброс схлопывается в 1.3 — то есть «состав удара по нему + // не значит ничего». Смысл тот же: кислота травит одно тело, а их тут + // много. + case EnemyKind::SWARM: + d.name = "SWARM"; + d.hp = 40.0f; d.radius = 0.30f; d.speed = 2.20f; d.knockResist = 0.0f; + d.aggroRadius = 13.0f; d.attackRange = 0.65f; d.damage = 5.0f; + d.windup = 0.22f; d.interval = 0.75f; + d.attack = AttackKind::SWIPE; d.swipeArcDeg = 160.0f; + d.lightPower = 0.04f; + d.r = 138; d.g = 132; d.b = 56; + // горит и проводит дугу как солома; кислоте достаётся одно тело из многих + d.resist = Resists(-0.20f, -0.60f, 0.0f, 0.55f, -0.55f, 0.40f, 0.30f); + break; + + // Скорлупа. Стена: медленная, тупая, с узким сектором удара — уйти от + // неё вбок проще, чем от бредущего. Опасна не ударом, а тем, что стоит + // и не умирает: шестьсот с лишним здоровья под сопротивлением 0.70 по + // кинетике — это семьдесят секунд работы карабином, то есть весь + // боезапас отряда за одну тварь. + // + // Ответ ровно один и написан в профиле: −0.50 по кислоте. Лук снимает + // её за пятнадцать секунд. Задача игроку — не «убей», а «пойми, что + // прежний ствол больше не ствол», и это первая тварь, ради которой + // сборку меняют целиком. + // + // Отброса нет вообще (0.90): клинком её не сдвинуть, коридор она + // перекрывает намертво. + case EnemyKind::HUSK: + d.name = "HUSK"; + d.hp = 620.0f; d.radius = 0.44f; d.speed = 0.80f; d.knockResist = 0.90f; + d.aggroRadius = 8.00f; d.attackRange = 1.00f; d.damage = 26.0f; + d.windup = 0.70f; d.interval = 1.80f; + d.attack = AttackKind::SWIPE; d.swipeArcDeg = 55.0f; + d.lightPower = 0.06f; + d.r = 128; d.g = 122; d.b = 104; + // панцирь держит всё, кроме кислоты: она его и растворяет + d.resist = Resists(0.70f, 0.30f, 0.40f, -0.50f, 0.30f, 0.20f, 0.15f); + break; + + // Спящий. Радиус агро 3.4 против 8–13 у всех остальных: он почти слеп, + // и мимо него МОЖНО пройти. Единственная тварь в игре, с которой боя + // может не быть вовсе, — и ровно поэтому она бьёт так, что бой лучше + // не начинать: круг радиусом три юнита и шестьдесят два урона снимают + // половину отряда, если тот шёл кучей. + // + // Задача игроку — маршрут, а не стрельба. Замах длинный (1.15 с), + // потому что уйти из такого круга обязано быть возможно; глаза почти + // не горят (0.02) — именно поэтому её и принимают за камень. + // + // Профиль в таблице §5 её не описывает: вид заведён здесь. Холод + // (−0.50) — потому что разбудить её должно быть дешевле, чем ломать + // панцирь; пустота (−0.30) — потому что спит она не совсем в этом мире. + case EnemyKind::SLEEPER: + d.name = "SLEEPER"; + d.hp = 780.0f; d.radius = 0.50f; d.speed = 0.85f; d.knockResist = 0.95f; + d.aggroRadius = 3.40f; d.attackRange = 1.40f; d.damage = 62.0f; + d.windup = 1.15f; d.interval = 3.00f; + d.attack = AttackKind::SLAM; d.slamRadius = 3.00f; + d.lightPower = 0.02f; + d.r = 96; d.g = 88; d.b = 74; + // камень: пуля вязнет, жар не берёт, а стынь и пустота будят и рвут + d.resist = Resists(0.55f, 0.30f, -0.50f, 0.10f, 0.10f, 0.20f, -0.30f); + break; + + // Плакальщик. Единственная тварь, которая меняет не бой, а ПОРЯДОК + // целей: пока он жив, лежащие рядом встают в шесть раз быстрее, и + // зачистка комнаты не заканчивается никогда. Сам он почти безобиден — + // одиннадцать урона плевком раз в две секунды. + // + // Задача игроку — увидеть, кто здесь главный, и добраться до него + // первым. Он держится позади (плюётся с пяти юнитов), светится ярче + // соседей (0.14) и ходит медленно: игра показывает его честно, а + // ошибается тот, кто стреляет в ближайшего. + // + // По таблице §5 ответ на него — радиация, и она здесь на −0.60. Но + // радиацию сегодня не носит ни один ствол, поэтому у него есть и + // вторая брешь — пустота (−0.35): она обрывает связь, которой он тянет + // мёртвых, и её носит магнум. Кислота (0.55) — сопротивление, без + // которого разброс стихий по нему схлопывается ниже коридора. + case EnemyKind::WAILER: + d.name = "WAILER"; + d.hp = 240.0f; d.radius = 0.33f; d.speed = 1.00f; d.knockResist = 0.20f; + d.aggroRadius = 12.0f; d.attackRange = 5.00f; d.damage = 11.0f; + d.windup = 0.70f; d.interval = 2.20f; + d.ranged = true; d.projectileSpeed = 7.0f; + d.attack = AttackKind::SPIT; d.spitRange = 7.00f; + // Аура, а не атака: он никого ею не бьёт и не целится. Радиус + // меньше дальности его же плевка — тела, которые он поднимает, + // лежат вокруг НЕГО, и подойти к ним отряду придётся. + d.reviveRadius = 4.20f; d.reviveRate = 6.00f; + d.lightPower = 0.14f; + d.r = 158; d.g = 150; d.b = 176; + // радиация выжигает то, чем он тянет мёртвых; пустота рвёт саму связь + d.resist = Resists(0.20f, 0.0f, 0.0f, 0.55f, 0.25f, -0.60f, -0.35f); + break; + + // Пустотник. Ровные 0.45 по шести стихиям: против него нет верного + // ствола, потому что все стволы одинаково плохи. Это последний урок + // акта VI и проверка на то, что игрок понял систему целиком: брешь + // одна — пустота (−0.60), и берётся он не подбором стихии, а СРЕЗАНИЕМ + // сопротивлений (магнум, схлопывание, сверхпроводник). + // + // Ходит быстро и рвёт на шесть с половиной юнитов — вдвое дальше + // бегуна: дистанции для него нет, и держать его на расстоянии + // бессмысленно. Задача игроку — сборка, а не позиция. + // + // Таблица §5 даёт ему ровные 0.30. Здесь 0.45: при 0.30 разброс стихий + // по нему выходит 1.48 — то есть «пустота почти ничего не меняет», а + // весь смысл вида в обратном. Иммунитета всё равно нет нигде: даже + // карабин его убивает, просто вчетверо дольше магнума. + case EnemyKind::VOIDLING: + d.name = "VOIDLING"; + d.hp = 300.0f; d.radius = 0.32f; d.speed = 2.00f; d.knockResist = 0.45f; + d.aggroRadius = 14.0f; d.attackRange = 0.85f; d.damage = 24.0f; + d.windup = 0.40f; d.interval = 1.50f; + d.attack = AttackKind::LUNGE; d.lungeDist = 6.40f; d.lungeTime = 0.26f; + d.lightPower = 0.16f; + d.r = 52; d.g = 48; d.b = 86; + // защищён ровно всюду и нигде не непробиваем; пустота — единственная брешь + d.resist = Resists(0.45f, 0.45f, 0.45f, 0.45f, 0.45f, 0.45f, -0.60f); + break; + // --- разрушаемая обстановка ------------------------------------------- // Всё боевое по нулям: ни скорости, ни агро, ни урона. Даже если бы // UpdateEnemies до них дошёл (он не доходит — см. IsProp), ящику нечем @@ -333,6 +539,29 @@ 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); + // --- кто тянет мёртвых обратно (плакальщик) ------------------------------ + // Живёт ЗДЕСЬ, а не в sim/enemy.cpp, потому что срок покойника считает эта + // функция и только она: поднятие павшего — это ускоренный тот же таймер, а + // не второй механизм воскрешения рядом с первым. + // + // Список собирается один раз за шаг. EnemyDefOf — это switch, и спрашивать + // его на каждую пару «труп × тварь» значило бы четыре тысячи вызовов в кадр + // на полном этаже. Почти всегда список пуст, и тогда весь механизм не стоит + // ничего: в песочнице приёмки он пуст ВСЕГДА (там одни мишени), поэтому + // --accept меряет ровно то же, что мерял. + struct Reviver { Vec2 pos; float radius2; float rate; }; + Reviver revivers[MAX_TARGETS]; + int reviverCount = 0; + for (const Target& t : targets) + { + if (!t.alive || t.IsDummy() || t.IsProp()) continue; + if (reviverCount >= MAX_TARGETS) break; + const EnemyDef def = EnemyDefOf(t.kind); + if (def.reviveRate <= 1.0f || def.reviveRadius <= 0.0f) continue; + revivers[reviverCount++] = + Reviver{t.pos, def.reviveRadius * def.reviveRadius, def.reviveRate}; + } + for (Target& t : targets) { t.hurtTimer = std::max(0.0f, t.hurtTimer - dt); @@ -356,7 +585,20 @@ void UpdateTargets(std::vector& targets, float dt) // отрицательный срок, и без этой проверки он воскресал бы в тот же кадр. if (t.IsProp()) continue; - t.respawnTimer -= dt; + // Плакальщик рядом — срок идёт быстрее. Берётся НАИБОЛЬШИЙ множитель, а + // не сумма: двое плакальщиков не поднимают вдвое быстрее, иначе комната + // с тремя такими не зачищается в принципе, сколько по ней ни стреляй. + // Мишень приёмки под ауру не попадает: её срок — ручка tuning, на + // которой меряют, и трогать его нельзя ничем. + float reviveRate = 1.0f; + if (!t.IsDummy()) + { + for (int i = 0; i < reviverCount; ++i) + if (DistanceSq(revivers[i].pos, t.pos) <= revivers[i].radius2) + reviveRate = std::max(reviveRate, revivers[i].rate); + } + + t.respawnTimer -= dt * reviveRate; if (t.respawnTimer <= 0.0f) { const EnemyDef def = EnemyDefOf(t.kind); diff --git a/src/sim/target.h b/src/sim/target.h index ca5628d..b271980 100644 --- a/src/sim/target.h +++ b/src/sim/target.h @@ -35,6 +35,22 @@ enum class EnemyKind : uint8_t BRUTE, // громила: медленный, толстый, сносит одним ударом LURKER, // хват: подбирается и держит бойца на месте + // --- население глубины (акты II–VI, docs/20-gdd.md §3) --------------------- + // Каждая ниже поставлена ради СВОЕЙ задачи игроку, а не ради строки в + // бестиарии. «Тот же бредущий, но толще» — это не новая тварь, а множитель + // от глубины, которого в этой игре нет (docs/16-descent.md): вниз выходят + // ДРУГИЕ виды, а числа у одного и того же не меняются никогда. + // + // Роль обязана читаться по профилю сопротивлений и по виду атаки — это + // единственная подсказка, которую игра даёт напрямую (docs/21-damage.md §5). + CINDER, // головня: горит сама — жаром её не взять, нужен второй ствол + STINGER, // жалун: дальнее давление, вблизи дохлый + SWARM, // рой: много слабых в одном теле, берётся площадью + HUSK, // скорлупа: стена, которую вскрывает только кислота + SLEEPER, // спящий: почти слеп, но разбуженный сносит круг + WAILER, // плакальщик: поднимает павших рядом, пока сам жив + VOIDLING, // пустотник: защищён ровно везде, брешь одна — пустота + // --- разрушаемая обстановка ----------------------------------------------- // Ниже этой черты идут НЕ противники: ящик не ходит, не бьёт и не пугает. // Живут они в том же пуле Target намеренно — пуля, клинок, стена и правило @@ -99,6 +115,18 @@ struct EnemyDef float grabTime = 0.0f; // GRAB: сколько держит float grabTick = 0.5f; // GRAB: как часто тикает урон, пока держит + // --- поднятие павших (плакальщик) ----------------------------------------- + // Не отдельный вид атаки: он никого не бьёт этим и ни в кого не целится. + // Это АУРА — пока такая тварь жива, лежащие рядом тела встают быстрее в + // reviveRate раз. Ноль у всех, кроме плакальщика, и ровно поэтому проверка + // стоит по данным, а не по имени вида. + // + // Задача игроку: зачистка перестаёт быть последовательной. Пока аура + // работает, отряд перебивает одних и тех же — цель приходится ВЫБИРАТЬ, + // а не просто стрелять в ближайшего. + float reviveRadius = 0.0f; // на каком расстоянии тянет мёртвых обратно + float reviveRate = 0.0f; // во сколько раз быстрее идёт их срок + // Профиль сопротивлений. Свойство ВИДА, а не глубины: глубже выходят другие // твари, а не те же с другими числами (docs/16-descent.md). Он же — // единственная подсказка, которую игра даёт про правильное оружие. diff --git a/src/sim/weapon_defs.h b/src/sim/weapon_defs.h index 5ab3006..d7d3346 100644 --- a/src/sim/weapon_defs.h +++ b/src/sim/weapon_defs.h @@ -44,6 +44,12 @@ enum class FirearmId : uint8_t SMG, // шквал: очередь дешёвыми патронами, ствол уводит адски MAGNUM, // один тяжёлый выстрел: медленно, больно, ошибок не прощает BOW, // тихий составной лук: редкий тяжёлый снаряд без дульной вспышки + NAILER, // гвоздомёт: дешевле некуда, бьёт часто и почти никак + HMG, // пулемёт: полтораста патронов и шесть секунд беспомощности + PLASMA, // резак: два с половиной шага дальности, зато почти чистая дуга + RAIL, // рельса: три выстрела на всю комнату, между ними целая вечность + FLAMER, // огнемёт: конус жара в упор, свои под него лезут постоянно + ACID, // распылитель: медленные кислотные капли, разъедают жирное COUNT, }; @@ -52,6 +58,10 @@ enum class BladeId : uint8_t SABER = 0, // штатный клинок: числа из tuning.h KNIFE, // нож: узкая дуга, зато почти без замаха CLEAVER, // тесак: широкий, тяжёлый, сносит с ног + STILETTO, // стилет: держит чужой клинок лучше всех, а бьёт слабее всех + MAUL, // молот: самый тяжёлый удар в игре и никакой защиты + RIPPER, // цепной: мелкие частые укусы, кислота + CRYOEDGE, // крио-клинок: сабля, отдавшая часть урона за холод COUNT, }; @@ -370,6 +380,287 @@ inline FirearmDef BowDef() return d; } +// ----------------------------------------------------------------------------- +// Вторая шестёрка стволов. Правило то же, что и у первой: НИ ОДИН не имеет права +// быть «карабином, но лучше». У каждого своя роль, и у каждой роли — своя цена, +// записанная числами, а не обещанная в комментарии. +// +// Чем платят, по каналам: +// * дальностью (`range`) — резак и огнемёт стоят там же, где клинок; +// * простоем (`reloadTime`) — пулемёт и рельса молчат секундами; +// * разбросом на ходу (`spreadMoveDeg`) — тяжёлое с рук на бегу не работает; +// * весом (`ItemDef::weight`, sim/items.h) — пулемёт съедает норму переноски +// отряда целиком, и это его главный минус, а не масса ради массы; +// * составом удара — стихия сильнее у того, у кого хуже баллистика. +// +// ЧЕГО ЗДЕСЬ НЕТ И ПОЧЕМУ. Раскрутки (ствол разгоняется и начинает бить точнее) +// и сквозного пробития (пуля идёт дальше сквозь тело) в правилах боя нет: +// у выстрела есть откат, конус и снаряд, и всё. Заводить поля, которых никто не +// читает, значило бы положить в каталог две мёртвые ветки, поэтому обе роли +// отыграны тем, что работает: у пулемёта — магазином и простоем, у рельсы — +// пустотой (VOID и означает «защита не работает») и скоростью снаряда. +// ----------------------------------------------------------------------------- + +// Гвоздомёт: строительный инструмент, которым стреляют от бедности. Самый +// дешёвый выстрел в игре — и самый бесполезный по отдельности: пять единиц +// урона броня съедает почти целиком. Берут его не за урон, а за то, что он +// перезаряжается за секунду с четвертью и не уводит ствол, то есть работает +// там, где отряд отступает и стрелять надо ВСЁ ВРЕМЯ. +inline FirearmDef NailerDef() +{ + FirearmDef d; + d.name = "nailer"; + d.range = 4.0f; // короче пистолета: гвоздь и не должен лететь + d.fireInterval = 0.12f; + d.damage = 4.5f; + d.laneHalfWidth = 0.10f; + d.muzzleOffset = 0.24f; + d.bulletSpeed = 13.0f; // медленный снаряд: по бегуну мимо + d.bulletRadius = 0.035f; + d.knockback = 0.10f; // тварь даже не качнётся + + d.spreadStandDeg = 2.6f; // гвоздь летит криво сам по себе + d.spreadMoveDeg = 6.0f; + d.spreadRecoilDeg = 0.25f; + d.spreadRecoilMax = 2.0f; + d.recoilDecay = 6.0f; // увод оседает быстрее, чем копится + + d.magazine = 60; + d.reloadTime = 1.25f; // быстрее всех: обойма гвоздей ставится одним движением + + d.tracerLength = 0.45f; + d.muzzleRadiusPx = 2.5f; + d.muzzleTime = 0.04f; + d.muzzleFlamePx = 0.10f; + d.flashPower = 0.22f; + d.flashRadius = 2.0f; + d.shakePerShot = 0.12f; + d.tracerR = 198; d.tracerG = 192; d.tracerB = 176; + d.muzzleR = 210; d.muzzleG = 198; d.muzzleB = 168; + + // Ржавчина на гвозде — доля кислоты крошечная: это не стихийное оружие, а + // кинетика, которой немного повезло с материалом. + d.elem = ElementMix::Of(Element::TOX, 0.20f); + return d; +} + +// Тяжёлый пулемёт: полтораста патронов подряд — и шесть секунд, за которые +// отряд успевает потерять бойца. Второй ствол в игре, у которого простой опаснее +// самого боя (первый — рельса). +// +// Раскрутки в правилах боя нет (см. шапку блока), и подделывать её нечем: увод +// ствола умеет только РАСТИ. Поэтому цена входа отыграна тем, что есть, — +// магазином, простоем и весом 7.5 в sim/items.h, ровно равным норме переноски +// отряда: пулемётчик один занимает всю сумку, и любая находка уже замедляет. +inline FirearmDef HmgDef() +{ + FirearmDef d; + d.name = "hmg"; + d.range = 6.4f; // КОРОЧЕ карабина: длинный ствол не даёт дальности сам по себе + d.fireInterval = 0.10f; + d.damage = 9.0f; + d.laneHalfWidth = 0.10f; + d.muzzleOffset = 0.34f; + d.bulletSpeed = 24.0f; + d.bulletRadius = 0.045f; + d.knockback = 0.30f; + + d.spreadStandDeg = 1.4f; + d.spreadMoveDeg = 15.0f; // на ходу это стрельба в белый свет + d.spreadRecoilDeg = 0.35f; + d.spreadRecoilMax = 5.5f; + d.recoilDecay = 2.4f; // увод оседает медленнее, чем у любого другого ствола + + d.magazine = 150; + d.reloadTime = 6.2f; // самое дорогое молчание в каталоге + + d.tracerLength = 1.45f; + d.muzzleRadiusPx = 6.0f; + d.muzzleTime = 0.06f; + d.muzzleFlamePx = 0.40f; + d.flashPower = 0.62f; + d.flashRadius = 4.4f; + d.shakePerShot = 0.30f; + d.tracerR = 255; d.tracerG = 226; d.tracerB = 176; + d.muzzleR = 255; d.muzzleG = 214; d.muzzleB = 140; + + // Обеднённый сердечник: доля радиации небольшая, но очередь кладёт её + // стаками — единственный ствол, который набивает статус САМ, без сборки. + d.elem = ElementMix::Of(Element::RAD, 0.30f); + return d; +} + +// Плазменный резак: горная техника, приспособленная под бой. Дальность 2.6 — +// меньше, чем у дробовика, то есть стрелок с резаком стоит ровно там же, где +// боец с клинком, и получает всё, что прилетает в первую линию. Взамен почти +// чистая дуга: против того, кто держит кинетику, это единственный ответ +// с ЭТОГО расстояния. +inline FirearmDef PlasmaDef() +{ + FirearmDef d; + d.name = "plasma"; + d.range = 2.6f; // короче всех в игре + d.fireInterval = 0.34f; + d.damage = 30.0f; + d.laneHalfWidth = 0.10f; + d.muzzleOffset = 0.28f; + d.bulletSpeed = 26.0f; + d.bulletRadius = 0.055f; + d.knockback = 0.15f; // струя не толкает: тварь дойдёт вплотную и останется + + d.spreadStandDeg = 0.5f; // луч точный — толку от этого на 2.6 немного + d.spreadMoveDeg = 5.0f; + d.spreadRecoilDeg = 0.0f; // отдачи нет вовсе + d.spreadRecoilMax = 0.0f; + d.recoilDecay = 8.0f; + + d.magazine = 14; + d.reloadTime = 2.9f; + + d.tracerLength = 0.60f; + d.muzzleRadiusPx = 5.5f; + d.muzzleTime = 0.08f; + d.muzzleFlamePx = 0.30f; + d.flashPower = 0.90f; // светит сильнее, чем стреляет: резак виден издалека + d.flashRadius = 5.0f; + d.shakePerShot = 0.25f; + d.tracerR = 150; d.tracerG = 230; d.tracerB = 255; + d.muzzleR = 190; d.muzzleG = 240; d.muzzleB = 255; + + d.elem = ElementMix::Of(Element::ARC, 0.90f); + return d; +} + +// Рельса: три выстрела и почти пять секунд на перезарядку. Бьёт дальше всего в +// игре (11.5 против 8.6 у магнума), и это её единственное безусловное +// достоинство — всё остальное отнято. +// +// «Пробивает» здесь означает НЕ сквозное попадание (такого в правилах боя нет), +// а пустоту: VOID срезает сопротивления, то есть защита цели перестаёт работать. +// Заводить сквозной снаряд ради одного ствола значило бы менять правило 6.3 — +// пуля, летящая ДАЛЬШЕ цели, перестаёт быть проверенной на своих. +inline FirearmDef RailDef() +{ + FirearmDef d; + d.name = "rail"; + d.range = 11.5f; + d.fireInterval = 1.70f; // между выстрелами тварь проходит три шага + d.damage = 170.0f; + d.laneHalfWidth = 0.08f; + d.muzzleOffset = 0.36f; + d.bulletSpeed = 48.0f; // быстрее всех: на такой дальности иначе не попасть + d.bulletRadius = 0.045f; + d.knockback = 2.20f; + + d.spreadStandDeg = 0.20f; // со станка — точнее некуда + d.spreadMoveDeg = 14.0f; // с рук на ходу — выброшенный выстрел из трёх + d.spreadRecoilDeg = 3.00f; + d.spreadRecoilMax = 7.00f; + d.recoilDecay = 2.00f; // второй выстрел подряд уже не точный + + d.magazine = 3; + d.reloadTime = 4.60f; + + d.tracerLength = 3.20f; // след через полкомнаты + d.muzzleRadiusPx = 5.0f; + d.muzzleTime = 0.11f; + d.muzzleFlamePx = 0.20f; + d.flashPower = 0.95f; + d.flashRadius = 6.0f; + d.shakePerShot = 2.20f; // трясёт сильнее магнума + d.tracerR = 214; d.tracerG = 208; d.tracerB = 255; + d.muzzleR = 200; d.muzzleG = 196; d.muzzleB = 255; + + d.elem = ElementMix::Of(Element::VOID, 0.70f); + return d; +} + +// Огнемёт: конус в упор. Конус — это `pellets` в широком разбросе, то есть тот +// же механизм, что у картечи, и та же цена, только больше: пятнадцать градусов +// проверяются правилом 6.3 на своих КАЖДЫЙ спуск, и в свалке огнемётчик молчит +// чаще, чем стреляет. Это не недоработка, а весь смысл вещи: жар требует места. +// +// Урон за язык мизерный, ставка целиком на горение, а горение считается от +// МАКСИМАЛЬНОГО здоровья цели (docs/21-damage.md) — значит по мелочи огнемёт +// перерасход, а по громиле единственный смысл. +inline FirearmDef FlamerDef() +{ + FirearmDef d; + d.name = "flamer"; + d.range = 2.4f; + d.fireInterval = 0.16f; + d.damage = 7.0f; // на язык пламени + d.laneHalfWidth = 0.10f; + d.muzzleOffset = 0.30f; + d.bulletSpeed = 9.0f; // языки ползут: по бегуну на отходе мимо + d.bulletRadius = 0.07f; + d.knockback = 0.05f; + + d.spreadStandDeg = 15.0f; // это и есть конус + d.spreadMoveDeg = 19.0f; + d.spreadRecoilDeg = 0.0f; + d.spreadRecoilMax = 0.0f; + d.recoilDecay = 8.0f; + + d.magazine = 100; + d.reloadTime = 3.6f; + d.pellets = 3; + + d.tracerLength = 0.30f; + d.muzzleRadiusPx = 8.0f; + d.muzzleTime = 0.09f; + d.muzzleFlamePx = 0.75f; // самый длинный язык в игре + d.flashPower = 0.75f; + d.flashRadius = 4.8f; + d.shakePerShot = 0.10f; + d.tracerR = 255; d.tracerG = 168; d.tracerB = 70; + d.muzzleR = 255; d.muzzleG = 150; d.muzzleB = 60; + + d.elem = ElementMix::Of(Element::INC, 0.95f); + return d; +} + +// Кислотный распылитель: две медленные капли за спуск. Урон за каплю смешной, +// зато почти всё в нём — кислота, а кислота работает по тому, по чему не +// работает ничего: по жирному и бронированному. По бегуну и по всему, что +// движется поперёк, капли просто не попадают — скорость снаряда 11. +inline FirearmDef AcidDef() +{ + FirearmDef d; + d.name = "acid"; + d.range = 5.0f; + d.fireInterval = 0.40f; + d.damage = 16.0f; // на каплю + d.laneHalfWidth = 0.10f; + d.muzzleOffset = 0.28f; + d.bulletSpeed = 11.0f; + d.bulletRadius = 0.06f; + d.knockback = 0.10f; + + d.spreadStandDeg = 6.0f; + d.spreadMoveDeg = 11.0f; + d.spreadRecoilDeg = 0.30f; + d.spreadRecoilMax = 3.5f; + d.recoilDecay = 4.0f; + + d.magazine = 18; + d.reloadTime = 2.9f; + d.pellets = 2; + + d.tracerLength = 0.35f; + d.muzzleRadiusPx = 4.0f; + d.muzzleTime = 0.05f; + d.muzzleFlamePx = 0.0f; // не порох: вспышки нет + d.flashPower = 0.20f; + d.flashRadius = 2.4f; + d.shakePerShot = 0.14f; + d.tracerR = 176; d.tracerG = 226; d.tracerB = 110; + d.muzzleR = 150; d.muzzleG = 210; d.muzzleB = 96; + + d.elem = ElementMix::Of(Element::TOX, 0.85f); + return d; +} + inline FirearmDef FirearmDefOf(FirearmId id) { switch (id) @@ -379,6 +670,12 @@ inline FirearmDef FirearmDefOf(FirearmId id) case FirearmId::SMG: return SmgDef(); case FirearmId::MAGNUM: return MagnumDef(); case FirearmId::BOW: return BowDef(); + case FirearmId::NAILER: return NailerDef(); + case FirearmId::HMG: return HmgDef(); + case FirearmId::PLASMA: return PlasmaDef(); + case FirearmId::RAIL: return RailDef(); + case FirearmId::FLAMER: return FlamerDef(); + case FirearmId::ACID: return AcidDef(); default: return RifleDef(); } } @@ -392,6 +689,12 @@ inline const char* FirearmName(FirearmId id) case FirearmId::SMG: return "SMG"; case FirearmId::MAGNUM: return "MAGNUM"; case FirearmId::BOW: return "BOW"; + case FirearmId::NAILER: return "NAILER"; + case FirearmId::HMG: return "HMG"; + case FirearmId::PLASMA: return "PLASMA"; + case FirearmId::RAIL: return "RAIL"; + case FirearmId::FLAMER: return "FLAMER"; + case FirearmId::ACID: return "ACID"; default: return "RIFLE"; } } @@ -455,13 +758,139 @@ inline BladeDef CleaverDef() return d; } +// ----------------------------------------------------------------------------- +// Вторая четвёрка клинков. Ось, вдоль которой они разложены, одна и та же: +// ВЕС ПРОТИВ ПАРИРОВАНИЯ (docs/11-melee.md). Стилет 0.3 кг держит чужой удар в +// половине случаев, молот 5.5 кг не держит его никогда — и это ровно тот размен, +// из-за которого «взять потяжелее» перестаёт быть очевидным решением. +// +// Соотношение с уже имеющимися: нож 0.4 -> 0.34, сабля 1.2 -> 0.20, +// тесак 2.2 -> 0.08. Новые садятся между ними, а не поверх. +// +// Второй общий размен — УРОН ПРОТИВ СТИХИИ: у крио-клинка и цепного урон +// заметно ниже сабельного, и разницу они отдали за состав удара. Клинок с +// полным уроном И полной стихией был бы просто лучшей саблей. +// ----------------------------------------------------------------------------- + +// Стилет: фехтовальная игла с гардой. Парирование 0.52 — потолок каталога, и +// это единственное, ради чего его берут. +// +// Цена честная и вся сразу: самый слабый удар в игре (44 против 62 у ножа), +// досягаемость 0.85 — короче не бывает, значит бить приходится ВНУТРИ круга +// твари, — и отброс почти нулевой, то есть отбитая тварь остаётся стоять +// вплотную и бьёт снова. Стилетом выживают, а не убивают. +inline BladeDef StilettoDef() +{ + BladeDef d; + d.name = "stiletto"; + d.reach = 0.85f; + d.arcDeg = 42.0f; // уже ножа: в тесноте сектор почти всегда чист + d.windup = 0.06f; + d.strike = 0.07f; + d.recover = 0.11f; + d.interval = 0.28f; + d.damage = 44.0f; + d.parry = 0.52f; + d.knockback = 0.35f; + d.lungeSpeed = 4.8f; + + // Игла ищет щель в защите — доля пустоты маленькая, но именно она делает + // стилет пригодным против того, кто равномерно защищён. + d.elem = ElementMix::Of(Element::VOID, 0.30f); + return d; +} + +// Молот: 430 за удар — больше, чем у чего угодно в игре, и отброс 7.5, который +// выносит тварь из свалки целиком. +// +// Платит всем остальным. Замах 0.46 — вдвое длиннее тесачного, и на нём боец +// вкопан; восстановление 0.62 — почти две трети секунды открытым. Парирование +// 0.02 означает, что размен «удар на удар» молот проигрывает всегда, поэтому +// бить он обязан ПЕРВЫМ. И удар у него ЧИСТО КИНЕТИЧЕСКИЙ: там, где цель режет +// кинетику бронёй или сопротивлением, четыреста тридцать превращаются в сотню, +// а стихии, чтобы обойти это, у молота нет. +inline BladeDef MaulDef() +{ + BladeDef d; + d.name = "maul"; + d.reach = 1.55f; + d.arcDeg = 105.0f; + d.windup = 0.46f; + d.strike = 0.20f; + d.recover = 0.62f; + d.interval = 1.45f; + d.damage = 430.0f; + d.parry = 0.02f; + d.knockback = 7.50f; + d.lungeSpeed = 1.90f; // рывка почти нет: с молотом не бегают + return d; +} + +// Цепной меч: зубья вместо лезвия, укус вместо удара. Бьёт чаще всех (0.24 с +// между началами замахов) и слабее почти всех — 42 за укус. +// +// Из этого следует его минус, и он не в цифрах, а в арифметике урона: сорок два +// умножаются на сопротивление ДО того, как что-нибудь наберётся, поэтому против +// защищённой цели цепь стачивается в ноль. Плюс парирование 0.10: цепь идёт +// сама по себе и подставить её под чужой клинок нельзя — она уводит удар в +// сторону вместе с рукой. +inline BladeDef RipperDef() +{ + BladeDef d; + d.name = "ripper"; + d.reach = 1.25f; + d.arcDeg = 70.0f; + d.windup = 0.09f; + d.strike = 0.10f; + d.recover = 0.15f; + d.interval = 0.24f; + d.damage = 42.0f; + d.parry = 0.10f; + d.knockback = 0.50f; + d.lungeSpeed = 3.40f; + + // Смазка на зубьях: частый удар набивает стаки кислоты быстрее всего в игре, + // и в этом весь смысл вещи — не в уроне, а в скорости накопления статуса. + d.elem = ElementMix::Of(Element::TOX, 0.70f); + return d; +} + +// Крио-клинок: та же сабля, отдавшая четверть урона за холод. 104 против 130 — +// разница и есть цена стихии, и по цели, которая холод держит, это просто +// плохая сабля, без единого преимущества. +// +// Тонкий сплав легче стали (1.1 против 1.2), поэтому парирование чуть выше +// сабельного — правило «легче значит лучше держит» одно на весь каталог. +inline BladeDef CryoedgeDef() +{ + BladeDef d; + d.name = "cryoedge"; + d.reach = 1.45f; + d.arcDeg = 92.0f; + d.windup = 0.19f; + d.strike = 0.13f; + d.recover = 0.26f; + d.interval = 0.66f; // медленнее сабли: сплав тяжело разгонять + d.damage = 104.0f; + d.parry = 0.24f; + d.knockback = 1.80f; + d.lungeSpeed = 3.20f; + + d.elem = ElementMix::Of(Element::CRY, 0.85f); + return d; +} + inline BladeDef BladeDefOf(BladeId id) { switch (id) { - case BladeId::KNIFE: return KnifeDef(); - case BladeId::CLEAVER: return CleaverDef(); - default: return DefaultBladeDef(); + case BladeId::KNIFE: return KnifeDef(); + case BladeId::CLEAVER: return CleaverDef(); + case BladeId::STILETTO: return StilettoDef(); + case BladeId::MAUL: return MaulDef(); + case BladeId::RIPPER: return RipperDef(); + case BladeId::CRYOEDGE: return CryoedgeDef(); + default: return DefaultBladeDef(); } } @@ -469,8 +898,12 @@ inline const char* BladeName(BladeId id) { switch (id) { - case BladeId::KNIFE: return "KNIFE"; - case BladeId::CLEAVER: return "CLEAVER"; - default: return "SABER"; + case BladeId::KNIFE: return "KNIFE"; + case BladeId::CLEAVER: return "CLEAVER"; + case BladeId::STILETTO: return "STILETTO"; + case BladeId::MAUL: return "MAUL"; + case BladeId::RIPPER: return "RIPPER"; + case BladeId::CRYOEDGE: return "CRYOEDGE"; + default: return "SABER"; } } diff --git a/src/ui/menu.cpp b/src/ui/menu.cpp index 9b0bfe5..5a51792 100644 --- a/src/ui/menu.cpp +++ b/src/ui/menu.cpp @@ -161,7 +161,9 @@ constexpr int WS_SLOT_X = 16, WS_SLOT_Y = 74, WS_SLOT_W = 52, WS_SLOT_H = 18; constexpr int WS_SLOT_GX = 4, WS_SLOT_GY = 3, WS_SLOT_COLS = 4, WS_SLOT_ROWS = 6; constexpr int WS_SLOT_CELLS = WS_SLOT_COLS * WS_SLOT_ROWS; -constexpr int WS_OP_X = 252, WS_OP_Y = 96, WS_OP_W = 212, WS_OP_H = 22, WS_OP_STEP = 25; +// Семь операций: строки ужаты, чтобы последняя не налезала на подсказку +// внизу экрана. Кадр 480x270, и место здесь считается по-настоящему. +constexpr int WS_OP_X = 252, WS_OP_Y = 84, WS_OP_W = 212, WS_OP_H = 20, WS_OP_STEP = 22; // Выбор чекпоинта: столбец кнопок «начать с этажа N». constexpr int DEPTH_Y0 = 92, DEPTH_STEP = 18, DEPTH_SIZE = 10; @@ -561,6 +563,16 @@ void BuildWidgets(const Ui& ui, const Game& game, const Layout& l, Widgets& out) Widget& w = out.Add(UiPart::CRAFT_ITEM, o, CraftOpRect(o)); w.text = CraftOpName(CraftOp(o)); } + + // Строки аффиксов на верстаке — тоже кнопки: по ним выбирают ЦЕЛЬ + // направленной операции (sim/craft.h). + if (ui.craftIndex >= 0 && ui.craftIndex < game.profile->StashCount()) + { + const ItemInstance& bench = game.profile->stash[size_t(ui.craftIndex)]; + for (int a = 0; a < bench.Count(); ++a) + out.Add(UiPart::CRAFT_AFFIX, a, + UiRect{WS_SLOT_X, 198 + a * 9, 210, 9}); + } return; } } @@ -793,9 +805,22 @@ void UiActivate(Ui& ui, Game& game, UiPart part, int index) return; case UiPart::CRAFT_SLOT: - // Выбор вещи на верстак. Ничего не тратит и ничего не ломает: - // операция — это отдельный клик. - ui.craftIndex = index; + // Клик по ячейке схрона: обычный — положить вещь на верстак, + // повторный по той же — назначить её ДОНОРОМ для отпечатка. + // Второй клик, а не второй список: экран и так плотный. + if (index == ui.craftIndex && ui.craftDonor != index) ui.craftDonor = index; + else + { + ui.craftIndex = index; + ui.craftAffix = 0; + if (ui.craftDonor == index) ui.craftDonor = -1; + } + ui.craftMessage = 0; + return; + + case UiPart::CRAFT_AFFIX: + // Выбор цели направленной операции. Ничего не тратит. + ui.craftAffix = index; ui.craftMessage = 0; return; @@ -811,9 +836,25 @@ void UiActivate(Ui& ui, Game& game, UiPart part, int index) uint32_t rng = uint32_t(pr.runs * 7919 + pr.StashCount() * 104729 + int(pr.bankedXp) + ui.craftIndex * 31 + index * 17); + // Донор обязан быть ДРУГОЙ вещью: переплавить предмет в самого + // себя нельзя, и молча брать «первый попавшийся» тоже. + ItemInstance* donor = nullptr; + if (CraftNeedsDonor(CraftOp(index)) && ui.craftDonor >= 0 && + ui.craftDonor < pr.StashCount() && ui.craftDonor != ui.craftIndex) + donor = &pr.stash[size_t(ui.craftDonor)]; + ItemInstance& it = pr.stash[size_t(ui.craftIndex)]; - const CraftResult r = - ApplyCraft(CraftOp(index), it, pr.material, pr.maxDepth, rng); + const CraftResult r = ApplyCraft(CraftOp(index), it, pr.material, pr.maxDepth, rng, + ui.craftAffix, donor); + + // Сгоревший донор убирается из схрона: пустая ячейка посреди + // списка читалась бы как ошибка, а не как цена операции. + if (r == CraftResult::OK && donor && donor->Empty()) + { + pr.StashRemoveAt(ui.craftDonor); + if (ui.craftIndex > ui.craftDonor) --ui.craftIndex; + ui.craftDonor = -1; + } // Рассыпавшаяся вещь убирается из схрона: пустая ячейка посреди // списка выглядела бы как ошибка, а не как последствие риска. @@ -1442,7 +1483,7 @@ void Ui::Draw(const Game& game, const ScreenRect& fit) const TextCentered(l, line, 40, 8, COL_FAINT); } - Text(l, "STASH", WS_SLOT_X, 60, 8, COL_FAINT); + Text(l, "STASH (CLICK TWICE = DONOR)", WS_SLOT_X, 60, 8, COL_FAINT); Text(l, "BENCH", WS_OP_X, 60, 8, COL_FAINT); // --- ячейки схрона --- @@ -1451,6 +1492,10 @@ void Ui::Draw(const Game& game, const ScreenRect& fit) const const Widget& c = w.item[i]; if (c.part != UiPart::CRAFT_SLOT) continue; DrawCell(l, *this, c, c.index == craftIndex); + // Донор помечается кровью: он сгорит, и увидеть это надо ДО + // нажатия, а не после. + if (c.index == craftDonor) + Box(l, UiRect{c.rect.x + c.rect.w - 5, c.rect.y + 2, 3, 3}, COL_BLOOD); } // --- что лежит на верстаке --- @@ -1475,7 +1520,15 @@ void Ui::Draw(const Game& game, const ScreenRect& fit) const { char af[64]; AffixLabel(bench->affix[a], af, int(sizeof(af))); - Text(l, af, WS_SLOT_X, 200 + a * 9, 8, COL_FAINT); + + // Выбранная строка подсвечена: направленные операции + // работают именно по ней, и промах тут стоит материалов. + const bool picked = (a == craftAffix); + const bool hot = (hoverPart == UiPart::CRAFT_AFFIX && hoverIndex == a); + if (picked) Box(l, UiRect{WS_SLOT_X - 2, 198 + a * 9, 212, 9}, COL_HOVER); + Text(l, picked ? ">" : " ", WS_SLOT_X - 6, 200 + a * 9, 8, COL_PICK); + Text(l, af, WS_SLOT_X, 200 + a * 9, 8, + (picked || hot) ? COL_TEXT : COL_FAINT); } if (bench->Count() == 0) Text(l, "NO AFFIXES", WS_SLOT_X, 200, 8, COL_DEAD); @@ -1507,7 +1560,7 @@ void Ui::Draw(const Game& game, const ScreenRect& fit) const ? COL_BLOOD : (afford ? COL_TEXT : COL_FAINT); Text(l, CraftOpName(op), r.x + 6, r.y + 3, 9, nameCol); - Text(l, CraftOpEffect(op), r.x + 6, r.y + 13, 7, COL_FAINT); + Text(l, CraftOpEffect(op), r.x + 6, r.y + 12, 7, COL_FAINT); // Цена справа: только те материалы, которые нужны. char price[64] = {0}; @@ -1556,10 +1609,10 @@ void Ui::Draw(const Game& game, const ScreenRect& fit) const } std::snprintf(line, sizeof(line), "%s: %s", CraftOpName(CraftOp(craftOpDone)), what); - TextCentered(l, line, 244, 9, col); + TextCentered(l, line, 254, 8, col); } - TextCentered(l, "CLICK ITEM THEN OPERATION Q/E SCROLL ESC BACK", 258, 7, + TextCentered(l, "CLICK ITEM THEN OPERATION Q/E SCROLL ESC BACK", 264, 7, COL_FAINT); break; } diff --git a/src/ui/menu.h b/src/ui/menu.h index c8945f9..f2fc7f6 100644 --- a/src/ui/menu.h +++ b/src/ui/menu.h @@ -53,6 +53,7 @@ enum class UiPart : uint8_t SUMMARY_ITEM, // кнопка на экране итога CRAFT_ITEM, // строка операции мастерской CRAFT_SLOT, // ячейка схрона в мастерской: что дорабатываем + CRAFT_AFFIX, // строка аффикса на верстаке: цель направленной операции }; // Прямоугольник в координатах КАДРА (480x270), а не окна: кадр лежит в окне @@ -81,6 +82,11 @@ struct Ui // --- мастерская ---------------------------------------------------------- int craftIndex = 0; // какая вещь схрона лежит на верстаке + // Какой аффикс выбран на верстаке и какая вещь назначена донором. + // Половина операций направленные (sim/craft.h), и без выбора крафт + // возвращается к «жми кнопку и смотри, что выпало». + int craftAffix = 0; + int craftDonor = -1; // -1 — донор не выбран // Чем кончилась последняя операция. Показывается строкой под верстаком: // «не хватило материалов» и «рассыпалось» — разные события, и молча // проглотить их нельзя, особенно второе.