From 3ebd1f96fc73a6c0408de7a35f5bce2566e444b7 Mon Sep 17 00:00:00 2001 From: "z.kirill" Date: Sun, 16 Aug 2026 19:24:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=20=D1=83?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=D0=BC?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=20=D1=87=D0=B5=D1=82=D1=8B=D1=80=D1=91?= =?UTF-8?q?=D1=85=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA=20(M32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Четыре строки покупок (патроны, переноска, обзор, живучесть) удалены целиком. Выбора в них не было: купить в итоге можно было всё, порядок ни на что не влиял, и через две вылазки экран превращался в кнопку "продолжить". Дерево: пять ветвей по восемь узлов, у каждого пять уровней. Ветви - это пять способов закрыть разрыв из закона масштаба: стволы, клинки, стихии, снабжение, отряд. Ветвь открывается цепочкой - узел доступен, когда взят предыдущий в этой же ветви. Свободная сетка читалась бы как список; цепочка читается как путь. Ни один узел не заводит нового канала влияния: каждый кладёт своё число туда, куда уже кладут снаряжение и аффиксы. Дерево будет расти, и первый же "особенный" узел со своей веткой в коде превратил бы SyncLoadout в свалку. ЭКОНОМИКА. --tool economy поймал, что первая версия дерева стоит 9% одного прохода 1..100: опыт растёт с глубиной квадратично, а дерево с фиксированными ценами выкупается целиком за половину глубокого прохода, и выбор кончается к сороковому этажу навсегда. Введено общее удорожание: каждая вложенная точка поднимает цену всех следующих (цена = база · 1.5^уровень · (1 + 0.15 · вложено)). Полное дерево стоит 34 млн против 41 млн, заложенных в дизайне, то есть около шести с половиной полных проходов. Старые покупки из профиля читаются, но не применяются: потраченный на них опыт возвращается в банк. Молча съесть чужие двадцать часов нельзя. Проверка меряет ПРОВОДКУ по всем пяти ветвям, а не таблицу узлов: дерево: куплено уровней 45, закрытый узел закрыт урон ствола 12.0 -> 14.4, здоровье 100 -> 150, скорость 1.06 -> 1.22 парирование 0.34 -> 0.49, свет 420 -> 620 Попутно: в проекте hollow бегуны и хваты уехали с первых этажей глубже - там одиночка с ножом гиб на первом же этаже по той же причине, по которой это было в основном проекте. Формат профиля 7: строки tree. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 5 + docs/07-milestones.md | 2 + docs/17-extraction.md | 73 ++++++++---- docs/ui-tree.png | Bin 0 -> 221987 bytes projects/hollow/catalog/entities.txt | 4 +- src/debug/harness.cpp | 126 +++++++++++++++++++-- src/debug/tools.cpp | 15 ++- src/game.cpp | 32 ++++-- src/sim/agent.cpp | 24 +++- src/sim/agent.h | 5 + src/sim/bullet.cpp | 6 +- src/sim/bullet.h | 2 +- src/sim/profile.cpp | 59 +++++----- src/sim/profile.h | 117 ++++++++++--------- src/sim/reactions.cpp | 4 +- src/sim/reactions.h | 6 +- src/sim/squad.h | 5 + src/sim/tree.cpp | 143 +++++++++++++++++++++++ src/sim/tree.h | 163 +++++++++++++++++++++++++++ src/ui/menu.cpp | 141 ++++++++++++++--------- 20 files changed, 731 insertions(+), 201 deletions(-) create mode 100644 docs/ui-tree.png create mode 100644 src/sim/tree.cpp create mode 100644 src/sim/tree.h diff --git a/CLAUDE.md b/CLAUDE.md index 6e0d2a1..432bb51 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -88,6 +88,11 @@ «симуляция → эффекты», и в headless его нет вовсе: начни от него зависеть — игра станет вести себя по-разному с окном и без. Триггеры срабатывают в месте урона, а не по журналу ([21-damage.md](docs/21-damage.md)). +- **Дерево улучшений — данные, а не код.** Сорок узлов лежат таблицей в + [sim/tree.h](src/sim/tree.h), и каждый кладёт своё число в УЖЕ существующий + канал (статы бойца, множители оружия, ресурсы вылазки). Узел, которому нужен + свой канал, в дерево не берут, пока канал не появился сам + ([17-extraction.md](docs/17-extraction.md)). - **Ни одного чистого улучшения.** Артефакт без цены становится обязательным, а обязательный предмет — это вырезанный слот ([22-loot.md](docs/22-loot.md)). - **Глубина — первичное понятие.** Вся кривая сложности живёт в одной функции diff --git a/docs/07-milestones.md b/docs/07-milestones.md index 7d75f54..abd6eac 100644 --- a/docs/07-milestones.md +++ b/docs/07-milestones.md @@ -50,6 +50,8 @@ | **M30** | личинка для первых этажей (бредущий уехал на третий), парирование клинком с ответным ударом и отбиванием плевков, инструмент `--wall` | `--wall` нашёл, что `PlaceSquad` воскрешал незанятые слоты: прежний замер «одиночка выжил на первом этаже» был боем впятером, а на самом деле одиночка с ножом проигрывал двум бредущим (210 здоровья против ножа); стена растёт с силой отряда — D7 у одиночки против D30 у пятерых; парирование проверено разменом целиком: нож 34% против тесака 8%, отбив снимает урон, ответ проходит, откат не сбрасывается, стоя столбом не отбивает; `--accept` PASS ([11-melee.md](11-melee.md)) | +| **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)) | + ## Что находилось по ходу и чинилось Прогоны без окна оказались полезнее, чем разглядывание кадра: три дефекта, diff --git a/docs/17-extraction.md b/docs/17-extraction.md index 40c098a..93f13a5 100644 --- a/docs/17-extraction.md +++ b/docs/17-extraction.md @@ -279,35 +279,66 @@ stash saber plate vest smg bow charm lantern spurs Делать `NUM_AGENTS` динамическим не стали: это сто с лишним мест ради числа, которое всё равно упирается в пять. -## Во что вкладывается опыт +## Во что вкладывается опыт: дерево -![экран улучшений](ui-upgrades.png) +![дерево улучшений](ui-tree.png) -Опыт копился с вехи M12 и до сих пор был честной заглушкой: число, которое -ни на что не влияет. Теперь он тратится — на четыре улучшения отряда. +Четыре строки покупок (патроны, переноска, обзор, живучесть) удалены целиком. +Выбора в них не было: купить в итоге можно было всё, порядок ни на что не влиял, +и через две вылазки экран превращался в кнопку «продолжить». -| | что даёт | почему это | +Дерево ([sim/tree.h](../src/sim/tree.h)) — **пять ветвей по восемь узлов**, у +каждого узла пять уровней. Разница с прежним ровно одна: **выбор есть, потому +что всё не взять**. + +| Ветвь | Про что | Примеры узлов | |---|---|---| -| AMMO RESERVE | +20 патронов на вылазку | | -| CARRY LIMIT | +1.5 до перегруза | | -| SIGHT RANGE | +6% обзора | | -| VIGOR | +12 здоровья | | +| FIREARMS | огонь: урон, пробитие, боезапас | STEADY HANDS, HARD ROUNDS, EXECUTIONER | +| BLADES | ближний бой: урон, парирование, темп | SIDESTEP, DUELLIST, CLEAVE | +| ELEMENTS | реакции и статусы | CATALYST, DEEP BURN, CHAIN THEORY | +| SUPPLY | ресурсы вылазки | LONG WICK, PACK RAT, BLACK BOX | +| SQUAD | живучесть и люди | VIGOR, PLATING, LAST STAND | -Все четыре — **ресурсные**, и ни одного силового. Игра про исчерпание, и -вкладываться в ней надо в то, что кончается: отряд, который бьёт вдвое сильнее, -перестаёт бояться, а страх тут единственная механика, которую нельзя -восстановить балансом. +Ветвь открывается **цепочкой**: узел доступен, когда предыдущий в его ветви взят +хотя бы на уровень. Свободная сетка читалась бы как список; цепочка читается как +путь — «я иду в стихии» видно по дереву, а не по таблице цифр. -Улучшения ОТРЯДНЫЕ, а не на бойца. Не из экономии: личным в этой игре остаётся -снаряжение, и второе личное измерение превратило бы сборы в бухгалтерию на -пятерых. +**Ни один узел не заводит нового канала влияния.** Каждый кладёт своё число туда, +куда уже кладут снаряжение и аффиксы: статы бойца, множители оружия, ресурсы +вылазки. Правило то же, что и у предметов, и здесь оно важнее вдвойне — дерево +растёт, и первый же «особенный» узел со своей веткой в коде превратил бы +`SyncLoadout` в свалку. -Опыт зачисляется только за **успешную эвакуацию** (`FinishRun`): вайп не -приносит ничего. Это та же ставка, что и с добычей. +### Цена растёт трижды -Приёмки это не касается вообще: улучшения живут в профиле, а `--accept` его не -подключает — там нет ни снаряжения, ни улучшений, и критерии меряются на том -же, на чём мерялись всегда. +``` +цена = база(узла) · 1.5^уровень · (1 + 0.15 · всего_вложено_точек) +``` + +Третий множитель — главный, и без него дерево умирает. Опыт растёт с глубиной +квадратично (`--tool economy`: сотый этаж даёт 190 тысяч), и дерево с +фиксированными ценами выкупается целиком за половину одного глубокого прохода. +Первая версия так и вышла: **всё дерево стоило 9% одного прохода 1..100** — то +есть к сороковому этажу выбор кончался навсегда. С удорожанием полное дерево +стоит 34 млн против 41 млн, заложенных в [20-gdd.md](20-gdd.md), то есть около +шести с половиной полных проходов. + +### Что стало со старыми покупками + +Строка `upgrades` в профиле читается, но не применяется: потраченный на неё опыт +**возвращается в банк**. Игрок вложит его заново, уже в узлы. Молча съесть чужие +покупки нельзя — это те же двадцать часов. + +Проверяется в `--descend` проводкой до боя, а не таблицей узлов: + +``` +дерево: куплено уровней 45, закрытый узел закрыт + урон ствола 12.0 -> 14.4, здоровье 100 -> 150, скорость 1.06 -> 1.22 + парирование 0.34 -> 0.49, свет 420 -> 620 +``` + +Узел, который красиво нарисован и ничего не делает, выглядит снаружи ровно как +работающий. На этом уже дважды попались вес и стихии. ## Итог забега diff --git a/docs/ui-tree.png b/docs/ui-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..d4045abb9fa41c4d46e165d10ff20619924b2d09 GIT binary patch literal 221987 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�hqV${p{>;uR6u4xVv>akv{GqXdRQKL*NyMg8 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 PC7_R&nvv3 %.1f, здоровье %.0f -> %.0f," + " скорость %.2f -> %.2f\n" + " парирование %.2f -> %.2f, свет %.0f -> %.0f\n", + bought, boughtLocked ? "КУПИЛСЯ" : "закрыт", double(dmgBare), + double(a1.gun.def.damage), double(hpBare), double(a1.maxHp), double(speedBare), + double(a1.speedMul), double(parryBare), double(a1.melee.parry), + double(lightBare), double(game.squad.lightCharge)); + + if (bought <= 0) + { + std::printf(" [FAIL] ни один узел не купился при полном банке\n"); + ++bad; + } + if (boughtLocked) + { + std::printf(" [FAIL] закрытый узел купился — цепочка ветви не держит\n"); + ++bad; + } + if (a1.gun.def.damage <= dmgBare) + { + std::printf(" [FAIL] ветвь ствола не дошла до оружия\n"); + ++bad; + } + if (a1.maxHp <= hpBare) + { + std::printf(" [FAIL] ветвь отряда не дошла до здоровья\n"); + ++bad; + } + if (a1.speedMul <= speedBare) + { + std::printf(" [FAIL] ветвь отряда не дошла до скорости\n"); + ++bad; + } + if (a1.melee.parry <= parryBare) + { + std::printf(" [FAIL] ветвь клинка не дошла до парирования\n"); + ++bad; + } + if (game.squad.lightCharge <= lightBare) + { + std::printf(" [FAIL] ветвь снабжения не дошла до фонаря\n"); + ++bad; + } + if (tb.gunDamage <= 0.0f || tb.health <= 0.0f) + { + std::printf(" [FAIL] сумма дерева пустая при купленных узлах\n"); + ++bad; + } + + pr = saved; + game.NewRun(1); + } + // ------------------------------------------------------------------------- // Опыт тратится. Проверяется цепочка целиком: купили — подействовало на // отряд — пережило запись профиля. Число в профиле, которое ни на что не @@ -2189,8 +2292,14 @@ int RunDescend(const RoomLibrary& rooms, const EntityCatalog& catalog, uint32_t const int ammoBefore = int(g_tune.startAmmo); pr.bankedXp = 10000.0f; - const bool boughtAmmo = pr.Buy(Upgrade::AMMO); - const bool boughtVigor = pr.Buy(Upgrade::VIGOR); + // Узлы: боезапас (ветвь ствола) и здоровье (ветвь отряда). + const int nodeAmmo = TreeIndex(Branch::GUN, 2); + const int nodeHealth = TreeIndex(Branch::SQUAD, 0); + // Цепочка: до «глубоких карманов» надо взять два узла над ними. + pr.BuyNode(TreeIndex(Branch::GUN, 0)); + pr.BuyNode(TreeIndex(Branch::GUN, 1)); + const bool boughtAmmo = pr.BuyNode(nodeAmmo); + const bool boughtVigor = pr.BuyNode(nodeHealth); const float leftXp = pr.bankedXp; // Улучшения раздаются вместе со снаряжением, то есть на новой вылазке. @@ -2296,9 +2405,10 @@ int RunUiCheck() // Мало открыть его: покупка обязана работать с той же кнопки. { Ui ui; - const int lvlBefore = profile.UpgradeLevel(Upgrade::AMMO); - UiActivate(ui, game, UiPart::UPGRADE_ITEM, int(Upgrade::AMMO)); - const bool bought = profile.UpgradeLevel(Upgrade::AMMO) > lvlBefore; + const int first = TreeIndex(Branch::GUN, 0); + const int lvlBefore = profile.NodeRank(first); + UiActivate(ui, game, UiPart::UPGRADE_ITEM, first); + const bool bought = profile.NodeRank(first) > lvlBefore; std::printf("\nулучшения: покупка %s\n", bought ? "работает" : "НЕ работает"); if (!bought) diff --git a/src/debug/tools.cpp b/src/debug/tools.cpp index 5eb0439..95cad2f 100644 --- a/src/debug/tools.cpp +++ b/src/debug/tools.cpp @@ -34,6 +34,7 @@ #include "sim/reactions.h" #include "sim/items.h" #include "sim/profile.h" +#include "sim/tree.h" #include "sim/target.h" #include "sim/weapon_defs.h" @@ -305,8 +306,18 @@ int CmdEconomy(int argc, char** argv) // Цена: текущее дерево — четыре узла по пять уровней. double tree = 0.0; - for (int u = 0; u < int(Upgrade::COUNT); ++u) - for (int l = 0; l < UPGRADE_MAX_LEVEL; ++l) tree += double(UpgradeCost(l)); + // Считаем ЧЕСТНО, по порядку покупки: цена зависит от того, сколько уже + // вложено, и сумма «каждый узел по своей базовой цене» была бы враньём + // в десятки раз (sim/tree.h). + { + int total = 0; + for (int i = 0; i < TREE_NODES; ++i) + for (int r = 0; r < TreeNodeAt(i).maxRank; ++r) + { + tree += double(TreeNodeCost(i, r, total)); + ++total; + } + } std::printf("\nодин проход 1..%d даёт %.0f опыта\n", maxDepth, total); std::printf("всё нынешнее дерево стоит %.0f\n", tree); diff --git a/src/game.cpp b/src/game.cpp index 77bb24b..ed5f92e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -123,7 +123,8 @@ void Game::SalvageAfterWipe() auto trySave = [&](const ItemInstance& it) { if (it.Empty()) return; - if (roll() < SalvageChance(it.rarity) && profile->StashPush(it)) ++report.itemsBrought; + if (roll() < SalvageChance(it.rarity) + squad.tree.salvage && profile->StashPush(it)) + ++report.itemsBrought; else ++report.itemsLost; }; @@ -163,7 +164,11 @@ void Game::FinishRun(RunOutcome outcome) ++profile->extractions; // Опыт здесь НЕ начисляется: он уже зачислен по убийствам (AwardKillXp). // Материалы — по-прежнему ставка: донёс или потерял. - for (int m = 0; m < MATERIAL_COUNT; ++m) profile->material[m] += runMaterials[m]; + // Ветвь снабжения умножает добытое: узел «PROSPECTOR» обязан быть + // виден в цифре на выходе, а не только в описании (sim/tree.h). + const float matMul = 1.0f + squad.tree.materials; + for (int m = 0; m < MATERIAL_COUNT; ++m) + profile->material[m] += int(float(runMaterials[m]) * matMul + 0.5f); } else { @@ -396,10 +401,14 @@ void Game::BuildFloor(const SquadCarry* carry) float ammoBonus = 0.0f; if (profile) { - squad.carryBonus = UPGRADE_CARRY_STEP * float(profile->UpgradeLevel(Upgrade::CARRY)); - squad.sightBonus = UPGRADE_SIGHT_STEP * float(profile->UpgradeLevel(Upgrade::SIGHT)); - squad.hpBonus = UPGRADE_VIGOR_STEP * float(profile->UpgradeLevel(Upgrade::VIGOR)); - ammoBonus = UPGRADE_AMMO_STEP * float(profile->UpgradeLevel(Upgrade::AMMO)); + // Дерево кладёт свои числа в те же каналы, что и снаряжение + // (sim/tree.h): своих у него нет и быть не должно. + const TreeBonus tb = profile->Tree(); + squad.carryBonus = tb.carry; + squad.sightBonus = tb.sight; + squad.hpBonus = tb.health; + ammoBonus = tb.ammo; + squad.tree = tb; } // Запас патронов выдаётся вместе со снаряжением и только в БОЮ. @@ -429,7 +438,8 @@ void Game::BuildFloor(const SquadCarry* carry) // вниз вместе с отрядом (Squad живёт дольше уровня), и в этом весь // смысл — на четвёртом этаже светить уже почти нечем. // В песочнице приёмки света бесконечно (-1), как и патронов. - squad.lightCharge = combatMode ? (LIGHT_FULL + lightBonus) : -1.0f; + squad.lightCharge = + combatMode ? (LIGHT_FULL + lightBonus + squad.tree.light) : -1.0f; } lanes.Clear(); @@ -610,6 +620,7 @@ void Game::Step(float dt) buffs.hp = squad.hpBonus; buffs.carry = squad.carryBonus; buffs.lightOut = squad.LightOut(); + buffs.tree = &squad.tree; // Ярость живёт таймером и гаснет сама. Множитель урона от неё уезжает в // SyncLoadout вместе с аффиксами: своего канала у триггера нет. squad.rageTimer = std::max(0.0f, squad.rageTimer - dt); @@ -765,7 +776,7 @@ void Game::Step(float dt) // --- 9. пули --------------------------------------------------------------- UpdateBullets(world, map, squad.agents.data(), NUM_AGENTS, targets, dt, metrics, &events, - depth); + depth, squad.tree.reaction); // --- 10. находки ----------------------------------------------------------- // После пуль и клинка: предмет, выпавший из разбитого ящика на этом же шаге, @@ -1242,7 +1253,8 @@ void Game::UpdateMelee(const SolverContext& ctx, float dt) VulnerabilityOf(tg.status); tg.hurtTimer = g_tune.targetHurtTime; KnockTarget(tg, dir, m.curKnock); - ApplyElementalHit(targets, t, a.melee.elem, depth, &events); + ApplyElementalHit(targets, t, a.melee.elem, depth, &events, false, + squad.tree.reaction); // Триггеры клинка — те же, что у ствола, и в том же месте: // сразу за уроном (sim/trigger.h). @@ -1253,7 +1265,7 @@ void Game::UpdateMelee(const SolverContext& ctx, float dt) a.trig.Chance(onHit)) { ApplyElementalHit(targets, t, ElementMix::Of(Element::INC, 1.0f), - depth, &events); + depth, &events, false, squad.tree.reaction); TriggerFired(a.trig, TriggerKind::ON_HIT); } diff --git a/src/sim/agent.cpp b/src/sim/agent.cpp index 7a9e9cc..d18687f 100644 --- a/src/sim/agent.cpp +++ b/src/sim/agent.cpp @@ -228,13 +228,16 @@ void SyncLoadout(ecs::World& world, Agent& a, float bagShare, const SquadBuffs& // Аффиксы кладутся в ТЕ ЖЕ четыре числа, что и снаряжение: у предмета // не появляется нового канала влияния оттого, что на нём есть рулоны // (sim/items.h). - a.armor = std::min(ARMOR_CAP, inv->Armor() + a.mods.armor); + const TreeBonus zero; + const TreeBonus& tb = buffs.tree ? *buffs.tree : zero; + + a.armor = std::min(ARMOR_CAP, inv->Armor() + a.mods.armor + tb.armor); // Снаряжение и НАГРУЗКА — разные вещи, но обе живут в одном множителе // скорости: движению всё равно, почему боец медленный. Разделять их // пришлось бы везде, где скорость читается, а смысла в этом ноль. a.load = inv->Load() + bagShare; a.speedMul = inv->SpeedMul() * a.mods.speedMul * a.trig.SpeedMul() * - (1.0f + a.merc.speed) * + (1.0f + a.merc.speed) * (1.0f + tb.speed) * CarryMul(a.load, buffs.carry + a.mods.carry); // Темнота режет ВСЁ, что боец наработал на обзор, — и надетое, и // купленное, и выкатанное. Улучшение «обзор» без света не спасает: сел @@ -288,10 +291,21 @@ void SyncLoadout(ecs::World& world, Agent& a, float bagShare, const SquadBuffs& // Ярость отряда множится СВЕРХ аффиксов и живёт ровно столько, сколько // держится её таймер: у триггера нет своего канала урона, он кладёт число // в тот же множитель (sim/trigger.h). + // Дерево множит урон отдельно по стволам и клинкам: ветви разные, и «взял + // ствольную — стал лучше бить ножом» было бы обманом (sim/tree.h). + const TreeBonus zeroTree; + const TreeBonus& tree = buffs.tree ? *buffs.tree : zeroTree; + const float dmg = a.mods.damageMul * (1.0f + buffs.rage); - a.gun.def.damage *= dmg; - a.melee.damage *= dmg; - a.pen = a.mods.pen; + a.gun.def.damage *= dmg * (1.0f + tree.gunDamage); + a.melee.damage *= dmg * (1.0f + tree.bladeDamage); + a.pen = a.mods.pen + tree.gunPen; + + // Перезарядка и темп ударов — время, поэтому не множитель, а ДЕЛИТЕЛЬ: + // «+20% скорости» обязано означать «на 20% быстрее», а не «на 20% дольше». + a.gun.def.reloadTime /= (1.0f + tree.reload); + a.melee.interval /= (1.0f + tree.meleeSpeed); + a.melee.parry = std::min(0.75f, a.melee.parry + tree.parry); if (a.mods.convert.share[int(Element::KIN)] < 0.999f) { diff --git a/src/sim/agent.h b/src/sim/agent.h index 477e0d4..07cc434 100644 --- a/src/sim/agent.h +++ b/src/sim/agent.h @@ -18,6 +18,7 @@ #include "sim/loadout.h" #include "sim/target.h" #include "sim/merc.h" +#include "sim/tree.h" #include "sim/trigger.h" #include "tuning.h" #include "engine/tilemap.h" @@ -199,6 +200,10 @@ struct SquadBuffs // называется «отряд получает +25% урона», и считать его на каждом бойце // отдельно значило бы, что павшего оплакивает только сосед. float rage = 0.0f; + // Итог дерева улучшений (sim/tree.h). Указателем, а не копией: структура + // большая, а меняется раз в вылазку. nullptr — приёмка и dev-прогоны, где + // дерева нет вовсе. + const TreeBonus* tree = nullptr; // Фонарь отряда сел: обзор режется до DARK_SIGHT_MUL, а сам фонарь в кармане // перестаёт что-либо давать. По умолчанию false — песочница приёмки светит // всегда (sim/squad.h). diff --git a/src/sim/bullet.cpp b/src/sim/bullet.cpp index 3018c3b..13d0057 100644 --- a/src/sim/bullet.cpp +++ b/src/sim/bullet.cpp @@ -62,7 +62,7 @@ void SpawnHostileBullet(ecs::World& world, Vec2 from, Vec2 dir, float speed, flo void UpdateBullets(ecs::World& world, const Tilemap& map, Agent* agents, int agentCount, std::vector& targets, float dt, Metrics& metrics, - CombatEventLog* events, int depth) + CombatEventLog* events, int depth, float reactionBonus) { std::vector& bullets = world.All(); @@ -189,7 +189,7 @@ void UpdateBullets(ecs::World& world, const Tilemap& map, t.hurtTimer = g_tune.targetHurtTime; KnockTarget(t, dir, b.knockback); // Стихии удара ложатся статусами и могут сложиться в реакцию. - ApplyElementalHit(targets, hitTarget, b.elem, depth, events); + ApplyElementalHit(targets, hitTarget, b.elem, depth, events, false, reactionBonus); // --- триггеры стрелка (sim/trigger.h) --------------------------- // Срабатывают ЗДЕСЬ, а не по журналу событий: журнал — канал для @@ -205,7 +205,7 @@ void UpdateBullets(ecs::World& world, const Tilemap& map, // значит может сложить реакцию. Рекурсии тут нет: сам поджиг // урона не наносит и второй раз триггер не запустит. ApplyElementalHit(targets, hitTarget, ElementMix::Of(Element::INC, 1.0f), - depth, events); + depth, events, false, reactionBonus); TriggerFired(shooter.trig, TriggerKind::ON_HIT); } } diff --git a/src/sim/bullet.h b/src/sim/bullet.h index 1325e15..11eba30 100644 --- a/src/sim/bullet.h +++ b/src/sim/bullet.h @@ -70,4 +70,4 @@ void SpawnHostileBullet(ecs::World& world, Vec2 from, Vec2 dir, float speed, flo void UpdateBullets(ecs::World& world, const Tilemap& map, Agent* agents, int agentCount, std::vector& targets, float dt, Metrics& metrics, - CombatEventLog* events, int depth); + CombatEventLog* events, int depth, float reactionBonus = 0.0f); diff --git a/src/sim/profile.cpp b/src/sim/profile.cpp index 4cf612b..a8c1c44 100644 --- a/src/sim/profile.cpp +++ b/src/sim/profile.cpp @@ -177,28 +177,6 @@ void Profile::ResetLoadouts() } } -const char* UpgradeName(Upgrade u) -{ - switch (u) - { - case Upgrade::AMMO: return "AMMO RESERVE"; - case Upgrade::CARRY: return "CARRY LIMIT"; - case Upgrade::SIGHT: return "SIGHT RANGE"; - default: return "VIGOR"; - } -} - -const char* UpgradeEffect(Upgrade u) -{ - switch (u) - { - case Upgrade::AMMO: return "+20 ROUNDS PER RAID"; - case Upgrade::CARRY: return "+1.5 BEFORE SLOWDOWN"; - case Upgrade::SIGHT: return "+6% VISION"; - default: return "+12 HEALTH"; - } -} - bool Profile::Load(const std::string& path, std::string* err) { std::ifstream in(path); @@ -278,12 +256,26 @@ bool Profile::Load(const std::string& path, std::string* err) if (t[0] == "wipes" && t.size() >= 2) { p.wipes = text::ToInt(t[1], 0); continue; } if (t[0] == "xp" && t.size() >= 2) { p.bankedXp = text::ToFloat(t[1], 0.0f); continue; } - // upgrades <патроны> <переноска> <обзор> <живучесть> + // Старые строки upgrades читаются, но НЕ применяются: система заменена + // деревом. Потраченный на них опыт возвращается в банк — игрок вложит + // его заново, уже в узлы. Молча съесть чужие покупки нельзя. if (t[0] == "upgrades") { - for (int u = 0; u < int(Upgrade::COUNT) && size_t(1 + u) < t.size(); ++u) - p.upgrade[u] = std::max(0, std::min(UPGRADE_MAX_LEVEL, - text::ToInt(t[size_t(1 + u)], 0))); + for (size_t u = 1; u < t.size(); ++u) + { + const int lvl = std::max(0, text::ToInt(t[u], 0)); + for (int k = 0; k < lvl; ++k) p.bankedXp += 150.0f * float(k + 1); + } + continue; + } + + // tree <узел> <уровень> + if (t[0] == "tree" && t.size() >= 3) + { + const int idx = text::ToInt(t[1], -1); + if (idx >= 0 && idx < TREE_NODES) + p.node[idx] = std::max(0, std::min(TreeNodeAt(idx).maxRank, + text::ToInt(t[2], 0))); continue; } @@ -365,13 +357,14 @@ bool Profile::Save(const std::string& path, std::string* err) const f << "wipes " << wipes << "\n"; f << "xp " << int(bankedXp) << "\n"; - // Улучшения не писались вовсе: купленное действовало до конца запуска и - // пропадало при следующем чтении. Проверка кругового прогона этого не - // ловила, потому что сверяла три поля из десяти — глубину, схрон и - // снаряжение. Теперь она сверяет всё. - f << "upgrades"; - for (int u = 0; u < int(Upgrade::COUNT); ++u) f << " " << upgrade[u]; - f << "\n"; + // Дерево: пишутся только взятые узлы. Сорок нулей в файле никому не нужны, + // а профиль обязан читаться глазами. + // + // Писать это ОБЯЗАТЕЛЬНО. Прежние улучшения не писались вовсе, и купленное + // молча пропадало при следующем чтении: круговой прогон сверял три поля из + // десяти и три вехи подтверждал работу того, чего в файле не было. + for (int i = 0; i < TREE_NODES; ++i) + if (node[i] > 0) f << "tree " << i << " " << node[i] << "\n"; for (int i = 0; i < NUM_AGENTS; ++i) { diff --git a/src/sim/profile.h b/src/sim/profile.h index d41c7f1..823adc2 100644 --- a/src/sim/profile.h +++ b/src/sim/profile.h @@ -25,6 +25,8 @@ #include "sim/craft.h" #include "sim/merc.h" +#include "sim/tree.h" +#include #include "sim/items.h" #include "tuning.h" @@ -48,44 +50,11 @@ struct StarterKit }; // ----------------------------------------------------------------------------- -// Во что вкладывается вынесенный опыт. -// -// Улучшения РЕСУРСНЫЕ, а не силовые: больше патронов, больше переноски, дальше -// видно, больше запаса здоровья. Игра про исчерпание, и вкладываться в неё надо -// в то, что кончается, — иначе прокачка съедает сам жанр: отряд, который бьёт -// вдвое сильнее, перестаёт бояться, а страх тут единственная механика, которую -// нельзя восстановить балансом. -// -// Улучшения ОТРЯДНЫЕ, а не на бойца. Не из экономии: личным в этой игре -// остаётся снаряжение, и второе личное измерение превратило бы сборы перед -// вылазкой в бухгалтерию на пятерых. -// ----------------------------------------------------------------------------- -enum class Upgrade : uint8_t -{ - AMMO = 0, // запас патронов на вылазку - CARRY, // норма переноски до перегруза - SIGHT, // радиус обзора - VIGOR, // запас здоровья - COUNT, -}; - -constexpr int UPGRADE_MAX_LEVEL = 5; - -// ----------------------------------------------------------------------------- -// Наёмники. НАХОДЯТСЯ, а не покупаются. -// -// Покупка за опыт была первой версией и оказалась скучной ровно в том смысле, -// в каком скучна любая кнопка «стать сильнее»: она ничего не рассказывает и -// никуда не зовёт. Найденный человек — это место, до которого надо дойти, -// и риск, который надо пережить вместе с ним. +// Наёмники. НАХОДЯТСЯ, а не покупаются: капсула на этаже — это место, до +// которого надо дойти, и риск, который надо пережить вместе с ним. // // Встречается редко: примерно раз в сто этажей и не чаще, чем раз в двадцать. -// Редко намеренно — пятый оперативник обязан быть событием забега, а не -// строкой в списке покупок. -// -// У каждого свои числа. Не «класс» и не «профессия»: три небольшие прибавки, -// которые видно на экране отряда и которые делают ЭТОГО человека отличным от -// соседа. Роль и специализация — следующая веха, тут нарочно минимум. +// Пятый оперативник обязан быть событием забега, а не строкой в списке покупок. // ----------------------------------------------------------------------------- constexpr int RESCUE_EVERY = 100; // средняя редкость встречи, в этажах constexpr int RESCUE_COOLDOWN = 20; // ближе этого две капсулы не встречаются @@ -95,19 +64,10 @@ constexpr int RESCUE_COOLDOWN = 20; // ближе этого две капс // оказываются одним и тем же человеком с другим именем. MercStats RollMerc(uint32_t& rng); -// Шаг улучшения за уровень. -constexpr float UPGRADE_AMMO_STEP = 20.0f; -constexpr float UPGRADE_CARRY_STEP = 1.5f; -constexpr float UPGRADE_SIGHT_STEP = 0.06f; -constexpr float UPGRADE_VIGOR_STEP = 12.0f; - -// Цена следующего уровня. Растёт линейно: первая покупка обязана случиться на -// второй-третьей вылазке, иначе опыт снова «просто число», а десятая — стоить -// заметно, иначе кривая кончается. -inline float UpgradeCost(int currentLevel) { return 150.0f * float(currentLevel + 1); } - -const char* UpgradeName(Upgrade u); -const char* UpgradeEffect(Upgrade u); +// Прежние четыре строки покупок (Upgrade::AMMO/CARRY/SIGHT/VIGOR) удалены +// целиком: их заменило дерево (sim/tree.h). Держать обе системы значило бы +// платить дважды за одно и то же и объяснять игроку, чем строка «+20 патронов» +// отличается от узла «DEEP POCKETS». // ----------------------------------------------------------------------------- // Версия формата профиля. @@ -122,36 +82,73 @@ const char* UpgradeEffect(Upgrade u); // 4 — экземпляры предметов: редкость и аффиксы в токене после '@' // 5 — материалы: строка mat // 6 — наёмники: строка merc и глубина последней встречи +// 7 — дерево улучшений вместо четырёх строк покупок // // Правило чтения: файл СТАРШЕ игры читается с миграцией, файл НОВЕЕ игры не // читается вовсе. Второе важнее первого: молча обнулить профиль, который // записала более новая сборка, — это стереть десятки часов, а отказ читать // всего лишь просит не запускать старую сборку. // ----------------------------------------------------------------------------- -constexpr int PROFILE_VERSION = 6; +constexpr int PROFILE_VERSION = 7; struct Profile { // Какой версией записан прочитанный файл. Новый профиль сразу текущей. int version = PROFILE_VERSION; - // Уровни улучшений, по одному на каждое. Живут в профиле, а не в игре: - // это то, что переживает вылазку. - int upgrade[int(Upgrade::COUNT)] = {}; + // Уровни узлов дерева. Живут в профиле, а не в игре: это то, что + // переживает вылазку (sim/tree.h). + int node[TREE_NODES] = {}; - int UpgradeLevel(Upgrade u) const { return upgrade[int(u)]; } - bool CanBuy(Upgrade u) const + // Сколько всего точек вложено в дерево. По ней считается общее удорожание + // (sim/tree.h): каждая взятая точка поднимает цену следующих. + int TreeRanks() const { - return upgrade[int(u)] < UPGRADE_MAX_LEVEL && bankedXp >= UpgradeCost(upgrade[int(u)]); + int n = 0; + for (int i = 0; i < TREE_NODES; ++i) n += node[i]; + return n; } - bool Buy(Upgrade u) + + int NodeRank(int index) const { - if (!CanBuy(u)) return false; - bankedXp -= UpgradeCost(upgrade[int(u)]); - ++upgrade[int(u)]; + return (index >= 0 && index < TREE_NODES) ? node[index] : 0; + } + + // Узел открыт, если предыдущий в его ветви взят хотя бы на уровень. Цепочка, + // а не свободная сетка: ветвь обязана читаться как путь. + bool NodeUnlocked(int index) const + { + const int req = TreeNodeRequires(index); + return req < 0 || NodeRank(req) > 0; + } + + bool CanBuyNode(int index) const + { + if (index < 0 || index >= TREE_NODES) return false; + if (!NodeUnlocked(index)) return false; + const int rank = NodeRank(index); + if (rank >= TreeNodeAt(index).maxRank) return false; + return bankedXp >= TreeNodeCost(index, rank, TreeRanks()); + } + + bool BuyNode(int index) + { + if (!CanBuyNode(index)) return false; + bankedXp -= TreeNodeCost(index, NodeRank(index), TreeRanks()); + ++node[index]; return true; } + // Сумма всего взятого. Считается при сборке этажа, дальше читаются готовые + // числа: правила боя про дерево не знают. + TreeBonus Tree() const + { + TreeBonus b; + for (int i = 0; i < TREE_NODES; ++i) + if (node[i] > 0) b.Add(TreeNodeAt(i).effect, TreeNodeAt(i).perRank * float(node[i])); + return b; + } + // Сколько оперативников в отряде. Игра начинается ОДНИМ (docs/20-gdd.md), // потолок — NUM_AGENTS. Живёт в профиле, потому что это накопленный // результат, а не состояние вылазки: нанятый не теряется при вайпе, он diff --git a/src/sim/reactions.cpp b/src/sim/reactions.cpp index 5b6ddb2..6254a46 100644 --- a/src/sim/reactions.cpp +++ b/src/sim/reactions.cpp @@ -20,7 +20,7 @@ void ReactionDamage(Target& t, float amount) } // namespace void ApplyElementalHit(std::vector& targets, int index, const ElementMix& mix, int depth, - CombatEventLog* events, bool fromReaction) + CombatEventLog* events, bool fromReaction, float reactionBonus) { if (index < 0 || index >= int(targets.size())) return; @@ -73,7 +73,7 @@ void ApplyElementalHit(std::vector& targets, int index, const ElementMix t.status.stacks[int(other)] = 0; t.status.reactionIcd = REACTION_ICD; - const float power = ReactionPower(depth) * ReactionScale(r); + const float power = ReactionPower(depth) * ReactionScale(r) * (1.0f + reactionBonus); if (r == Reaction::SUPERCOND) { diff --git a/src/sim/reactions.h b/src/sim/reactions.h index cc1e9fc..5820229 100644 --- a/src/sim/reactions.h +++ b/src/sim/reactions.h @@ -18,8 +18,12 @@ // реакций не запускает: это и есть запрет рекурсии, без которого цепочка // «реакция бьёт по площади -> урон кладёт стихию -> новая пара -> реакция» // уходит в самоповтор на первом же скоплении. +// reactionBonus — прибавка к силе реакций от дерева улучшений (sim/tree.h). +// Параметром, а не глобалом: реакции считаются и в инструментах, где никакого +// отряда нет вовсе. void ApplyElementalHit(std::vector& targets, int index, const ElementMix& mix, int depth, - CombatEventLog* events, bool fromReaction = false); + CombatEventLog* events, bool fromReaction = false, + float reactionBonus = 0.0f); // Тик статусов: горение и кислота, сгорание стаков, откат реакций. // Зовётся из UpdateTargets, один раз за шаг. diff --git a/src/sim/squad.h b/src/sim/squad.h index 5bd14d1..d9e3f24 100644 --- a/src/sim/squad.h +++ b/src/sim/squad.h @@ -12,6 +12,7 @@ #include "ecs/ecs.h" #include "sim/agent.h" +#include "sim/tree.h" #include "sim/target.h" #include "engine/tilemap.h" @@ -45,6 +46,10 @@ struct Squad { // Что добавили улучшения профиля. Ноль по умолчанию — в песочнице приёмки // профиля нет вовсе, и там всё считается ровно как считалось. + // Итог дерева улучшений. Живёт на отряде, а не на бойце: дерево отрядное, + // как и всё, что покупается за опыт (sim/tree.h). + TreeBonus tree; + float carryBonus = 0.0f; float sightBonus = 0.0f; float hpBonus = 0.0f; diff --git a/src/sim/tree.cpp b/src/sim/tree.cpp new file mode 100644 index 0000000..5f27082 --- /dev/null +++ b/src/sim/tree.cpp @@ -0,0 +1,143 @@ +#include "sim/tree.h" + +#include + +namespace +{ + +// ----------------------------------------------------------------------------- +// Сорок узлов. Читается сверху вниз по ветвям, и это же порядок открытия. +// +// Числа подобраны по одному правилу: ПОЛНАЯ ВЕТВЬ — это примерно полуторный +// отряд, а не двойной. Дерево обязано закрывать разрыв не само по себе, иначе +// оно и станет игрой вместо спуска (docs/20-gdd.md §2, закон масштаба). +// +// Цена нижних узлов заметно выше верхних: ветвь должна ощущаться как ВЫБОР +// пути, а не как список, который добирают по мелочи. +// ----------------------------------------------------------------------------- +const TreeNode NODES[TREE_NODES] = { + // --- СТВОЛЫ: урон, пробитие, боезапас -------------------------------------- + {"STEADY HANDS", Branch::GUN, 0, NodeEffect::GUN_DAMAGE, 0.04f, 5, 120.0f}, + {"QUICK HANDS", Branch::GUN, 1, NodeEffect::RELOAD, 0.06f, 5, 180.0f}, + {"DEEP POCKETS", Branch::GUN, 2, NodeEffect::AMMO, 14.0f, 5, 320.0f}, + {"HARD ROUNDS", Branch::GUN, 3, NodeEffect::GUN_PEN, 0.03f, 5, 780.0f}, + {"MARKSMAN", Branch::GUN, 4, NodeEffect::GUN_DAMAGE, 0.06f, 5, 1500.0f}, + {"BREACH ROUNDS", Branch::GUN, 5, NodeEffect::GUN_PEN, 0.05f, 5, 3200.0f}, + {"GUNSMITH", Branch::GUN, 6, NodeEffect::RELOAD, 0.09f, 5, 7000.0f}, + {"EXECUTIONER", Branch::GUN, 7, NodeEffect::GUN_DAMAGE, 0.10f, 5, 15000.0f}, + + // --- КЛИНКИ: урон, парирование, темп --------------------------------------- + {"HEAVY SWING", Branch::BLADE, 0, NodeEffect::BLADE_DAMAGE, 0.05f, 5, 120.0f}, + {"SIDESTEP", Branch::BLADE, 1, NodeEffect::PARRY, 0.03f, 5, 180.0f}, + {"FAST BLADE", Branch::BLADE, 2, NodeEffect::MELEE_SPEED, 0.05f, 5, 320.0f}, + {"COUNTERPOISE", Branch::BLADE, 3, NodeEffect::PARRY, 0.04f, 5, 780.0f}, + {"BUTCHER", Branch::BLADE, 4, NodeEffect::BLADE_DAMAGE, 0.08f, 5, 1500.0f}, + {"WHIRL", Branch::BLADE, 5, NodeEffect::MELEE_SPEED, 0.07f, 5, 3200.0f}, + {"DUELLIST", Branch::BLADE, 6, NodeEffect::PARRY, 0.05f, 5, 7000.0f}, + {"CLEAVE", Branch::BLADE, 7, NodeEffect::BLADE_DAMAGE, 0.12f, 5, 15000.0f}, + + // --- СТИХИИ: реакции, статусы, конверсия ----------------------------------- + {"CATALYST", Branch::ELEMENT, 0, NodeEffect::REACTION, 0.06f, 5, 140.0f}, + {"LINGERING", Branch::ELEMENT, 1, NodeEffect::STATUS, 0.08f, 5, 200.0f}, + {"PRIMER", Branch::ELEMENT, 2, NodeEffect::CONVERT, 0.04f, 5, 360.0f}, + {"RESONANCE", Branch::ELEMENT, 3, NodeEffect::REACTION, 0.09f, 5, 860.0f}, + {"DEEP BURN", Branch::ELEMENT, 4, NodeEffect::STATUS, 0.12f, 5, 1700.0f}, + {"OVERCHARGE", Branch::ELEMENT, 5, NodeEffect::CONVERT, 0.06f, 5, 3600.0f}, + {"CHAIN THEORY", Branch::ELEMENT, 6, NodeEffect::REACTION, 0.12f, 5, 7800.0f}, + {"ALCHEMIST", Branch::ELEMENT, 7, NodeEffect::CONVERT, 0.08f, 5, 16500.0f}, + + // --- СНАБЖЕНИЕ: свет, переноска, добыча ------------------------------------ + {"LONG WICK", Branch::SUPPLY, 0, NodeEffect::LIGHT, 40.0f, 5, 110.0f}, + {"MULE", Branch::SUPPLY, 1, NodeEffect::CARRY, 0.60f, 5, 170.0f}, + {"SCAVENGER", Branch::SUPPLY, 2, NodeEffect::MATERIALS, 0.10f, 5, 300.0f}, + {"INSURANCE", Branch::SUPPLY, 3, NodeEffect::SALVAGE, 0.04f, 5, 660.0f}, + {"BRIGHT CORE", Branch::SUPPLY, 4, NodeEffect::LIGHT, 70.0f, 5, 1400.0f}, + {"PACK RAT", Branch::SUPPLY, 5, NodeEffect::CARRY, 1.00f, 5, 2900.0f}, + {"PROSPECTOR", Branch::SUPPLY, 6, NodeEffect::MATERIALS, 0.18f, 5, 6500.0f}, + {"BLACK BOX", Branch::SUPPLY, 7, NodeEffect::SALVAGE, 0.06f, 5, 14000.0f}, + + // --- ОТРЯД: живучесть, броня, люди ------------------------------------------ + {"VIGOR", Branch::SQUAD, 0, NodeEffect::HEALTH, 10.0f, 5, 130.0f}, + {"PLATING", Branch::SQUAD, 1, NodeEffect::ARMOR, 0.02f, 5, 190.0f}, + {"LONG STRIDE", Branch::SQUAD, 2, NodeEffect::SPEED, 0.03f, 5, 340.0f}, + {"NIGHT EYES", Branch::SQUAD, 3, NodeEffect::SIGHT, 0.05f, 5, 740.0f}, + {"SECOND WIND", Branch::SQUAD, 4, NodeEffect::HEALTH, 18.0f, 5, 1600.0f}, + {"SPITE", Branch::SQUAD, 5, NodeEffect::RAGE, 0.06f, 5, 3400.0f}, + {"HARDENED", Branch::SQUAD, 6, NodeEffect::ARMOR, 0.03f, 5, 7200.0f}, + {"LAST STAND", Branch::SQUAD, 7, NodeEffect::RAGE, 0.10f, 5, 15500.0f}, +}; + +} // namespace + +const char* NodeEffectName(NodeEffect e) +{ + switch (e) + { + case NodeEffect::GUN_DAMAGE: return "GUN DAMAGE"; + case NodeEffect::GUN_PEN: return "ARMOUR PIERCE"; + case NodeEffect::AMMO: return "ROUNDS PER RAID"; + case NodeEffect::RELOAD: return "RELOAD SPEED"; + case NodeEffect::BLADE_DAMAGE: return "BLADE DAMAGE"; + case NodeEffect::PARRY: return "PARRY CHANCE"; + case NodeEffect::MELEE_SPEED: return "SWING SPEED"; + case NodeEffect::REACTION: return "REACTION POWER"; + case NodeEffect::STATUS: return "STATUS DURATION"; + case NodeEffect::CONVERT: return "ELEMENTAL CONVERSION"; + case NodeEffect::LIGHT: return "LANTERN CHARGE"; + case NodeEffect::CARRY: return "CARRY LIMIT"; + case NodeEffect::SALVAGE: return "SALVAGE ON WIPE"; + case NodeEffect::MATERIALS: return "MATERIALS FOUND"; + case NodeEffect::HEALTH: return "HEALTH"; + case NodeEffect::ARMOR: return "ARMOUR"; + case NodeEffect::SPEED: return "MOVE SPEED"; + case NodeEffect::SIGHT: return "SIGHT RANGE"; + default: return "SQUAD RAGE"; + } +} + +const TreeNode& TreeNodeAt(int index) +{ + static const TreeNode empty; + if (index < 0 || index >= TREE_NODES) return empty; + return NODES[index]; +} + +float TreeNodeCost(int index, int currentRank, int totalRanks) +{ + const TreeNode& n = TreeNodeAt(index); + if (currentRank >= n.maxRank) return 0.0f; + + // Каждый следующий уровень узла дороже предыдущего в полтора раза, а каждая + // вложенная в дерево точка поднимает цену ВСЕГО остального. Второе и + // держит дерево живым все двести часов: к концу одна точка стоит три + // десятка первых. + const float rank = std::pow(1.5f, float(currentRank)); + const float spent = 1.0f + TREE_ESCALATION * float(totalRanks > 0 ? totalRanks : 0); + return n.costBase * rank * spent; +} + +void TreeBonus::Add(NodeEffect e, float amount) +{ + switch (e) + { + case NodeEffect::GUN_DAMAGE: gunDamage += amount; break; + case NodeEffect::GUN_PEN: gunPen += amount; break; + case NodeEffect::AMMO: ammo += amount; break; + case NodeEffect::RELOAD: reload += amount; break; + case NodeEffect::BLADE_DAMAGE: bladeDamage += amount; break; + case NodeEffect::PARRY: parry += amount; break; + case NodeEffect::MELEE_SPEED: meleeSpeed += amount; break; + case NodeEffect::REACTION: reaction += amount; break; + case NodeEffect::STATUS: status += amount; break; + case NodeEffect::CONVERT: convert += amount; break; + case NodeEffect::LIGHT: light += amount; break; + case NodeEffect::CARRY: carry += amount; break; + case NodeEffect::SALVAGE: salvage += amount; break; + case NodeEffect::MATERIALS: materials += amount; break; + case NodeEffect::HEALTH: health += amount; break; + case NodeEffect::ARMOR: armor += amount; break; + case NodeEffect::SPEED: speed += amount; break; + case NodeEffect::SIGHT: sight += amount; break; + default: rage += amount; break; + } +} diff --git a/src/sim/tree.h b/src/sim/tree.h new file mode 100644 index 0000000..547e4a9 --- /dev/null +++ b/src/sim/tree.h @@ -0,0 +1,163 @@ +#pragma once +// ----------------------------------------------------------------------------- +// Дерево улучшений отряда. +// +// ЧТО БЫЛО И ПОЧЕМУ ЭТОГО МАЛО. До этой вехи опыт тратился на четыре строки: +// патроны, переноска, обзор, живучесть. Каждая — просто «+число за уровень». +// Выбора там не было вообще: купить в итоге можно всё, порядок ни на что не +// влияет, и через две вылазки экран улучшений превращался в кнопку «продолжить». +// +// Дерево устроено иначе, и разница ровно в одном: ВЫБОР ЕСТЬ, ПОТОМУ ЧТО ВСЁ НЕ +// ВЗЯТЬ. Узлы стоят дорого и дорожают, ветвь открывается по цепочке, и опыт — +// единственная валюта на все пять ветвей сразу. +// +// Пять ветвей — это пять способов закрыть разрыв из закона масштаба +// (docs/20-gdd.md §2): угроза растёт квадратично, сила отряда — линейно, и +// разрыв закрывается ЗНАНИЕМ. Ветви и есть виды знания: +// +// СТВОЛ — про огонь: урон, пробитие, боезапас; +// КЛИНОК — про ближний бой: урон, парирование, скорость; +// СТИХИИ — про реакции и статусы: то, чем берут защищённых; +// СНАБЖЕНИЕ — про ресурсы вылазки: свет, переноска, патроны; +// ОТРЯД — про живучесть и людей: здоровье, броня, ярость. +// +// НИ ОДИН УЗЕЛ НЕ ЗАВОДИТ НОВОГО КАНАЛА ВЛИЯНИЯ. Каждый кладёт своё число туда, +// куда уже кладут снаряжение и аффиксы (sim/affix.h): статы бойца, множители +// оружия, ресурсы вылазки. Это то же правило, что и у предметов, и оно тут +// важнее вдвойне — дерево растёт, и первый же «особенный» узел со своей веткой +// в коде превратил бы SyncLoadout в свалку. +// ----------------------------------------------------------------------------- +#include + +// Ветви. Порядок — порядок столбцов на экране. +enum class Branch : uint8_t +{ + GUN = 0, + BLADE, + ELEMENT, + SUPPLY, + SQUAD, + COUNT, +}; + +constexpr int BRANCH_COUNT = int(Branch::COUNT); +constexpr int NODES_PER_BRANCH = 8; +constexpr int TREE_NODES = BRANCH_COUNT * NODES_PER_BRANCH; + +inline const char* BranchName(Branch b) +{ + switch (b) + { + case Branch::GUN: return "FIREARMS"; + case Branch::BLADE: return "BLADES"; + case Branch::ELEMENT: return "ELEMENTS"; + case Branch::SUPPLY: return "SUPPLY"; + default: return "SQUAD"; + } +} + +// Что узел даёт. Тег — адрес числа в уже существующих каналах, не «новая +// механика». Если для эффекта пришлось бы заводить новый канал, такому узлу +// в дереве не место, пока канал не появился сам по себе. +enum class NodeEffect : uint8_t +{ + GUN_DAMAGE = 0, // множитель урона стволов + GUN_PEN, // пробитие сопротивлений + AMMO, // запас патронов на вылазку + RELOAD, // скорость перезарядки + BLADE_DAMAGE, // множитель урона клинков + PARRY, // шанс парирования + MELEE_SPEED, // темп ударов клинка + REACTION, // сила реакций стихий + STATUS, // длительность статусов + CONVERT, // доля урона в стихию оружия + LIGHT, // заряд фонаря + CARRY, // норма переноски + SALVAGE, // сколько добычи уцелевает при вайпе + MATERIALS, // сколько материалов приносит вылазка + HEALTH, // запас здоровья + ARMOR, // броня + SPEED, // скорость хода + SIGHT, // радиус обзора + RAGE, // ярость отряда за павшего + COUNT, +}; + +const char* NodeEffectName(NodeEffect e); + +// Одна запись дерева. Данные, а не код: узлы правят таблицей, глядя на неё +// целиком, и добавление узла не требует трогать ни одного алгоритма. +struct TreeNode +{ + const char* name = "-"; + Branch branch = Branch::GUN; + int row = 0; // место в ветви, оно же порядок открытия + NodeEffect effect = NodeEffect::GUN_DAMAGE; + float perRank = 0.0f; // сколько даёт один уровень + int maxRank = 5; + float costBase = 0.0f; // цена первого уровня; дальше растёт +}; + +// Таблица всех узлов. Определена в tree.cpp. +const TreeNode& TreeNodeAt(int index); + +// Индекс узла по ветви и месту в ней. Экран рисует сетку, а профиль хранит +// плоский массив — переводит одно в другое эта пара функций. +inline int TreeIndex(Branch b, int row) { return int(b) * NODES_PER_BRANCH + row; } + +// Цена СЛЕДУЮЩЕГО уровня. +// +// Растёт трижды, и каждый множитель отвечает за своё: +// * место узла в ветви — нижние узлы сильнее и дороже, иначе выгодно было бы +// докупать верхние по мелочи и никуда не спускаться; +// * уровень узла — «добить до максимума» обязано быть отдельным решением; +// * СКОЛЬКО ВСЕГО УЖЕ ВЛОЖЕНО — каждая взятая точка поднимает цену всех +// следующих. +// +// Третий множитель — главный, и без него дерево умирает. Опыт растёт с глубиной +// квадратично (`--tool economy`: этаж 100 даёт 190 тысяч), а дерево с +// фиксированными ценами выкупается целиком за половину одного глубокого +// прохода. Первая версия так и вышла: всё дерево стоило 9% одного прохода +// 1..100, то есть к сороковому этажу выбор кончался навсегда. +constexpr float TREE_ESCALATION = 0.15f; + +float TreeNodeCost(int index, int currentRank, int totalRanks); + +// Требование: узел открывается, когда предыдущий в ЕГО ВЕТВИ взят хотя бы на +// первый уровень. Цепочка, а не свободная сетка, — потому что ветвь должна +// читаться как путь: «я иду в стихии» видно по дереву, а не по таблице цифр. +inline int TreeNodeRequires(int index) +{ + const int row = index % NODES_PER_BRANCH; + return (row == 0) ? -1 : index - 1; +} + +// ----------------------------------------------------------------------------- +// Итог дерева: сумма всех взятых уровней. Считается один раз при сборке этажа, +// дальше читается как готовые числа — лазать по узлам из правил боя нельзя, там +// про дерево не знают вообще. +// ----------------------------------------------------------------------------- +struct TreeBonus +{ + float gunDamage = 0.0f; // доля, прибавка к множителю + float gunPen = 0.0f; + float ammo = 0.0f; + float reload = 0.0f; // доля, ускорение перезарядки + float bladeDamage = 0.0f; + float parry = 0.0f; + float meleeSpeed = 0.0f; + float reaction = 0.0f; + float status = 0.0f; + float convert = 0.0f; + float light = 0.0f; + float carry = 0.0f; + float salvage = 0.0f; + float materials = 0.0f; + float health = 0.0f; + float armor = 0.0f; + float speed = 0.0f; + float sight = 0.0f; + float rage = 0.0f; + + void Add(NodeEffect e, float amount); +}; diff --git a/src/ui/menu.cpp b/src/ui/menu.cpp index 87ae6f2..9b0bfe5 100644 --- a/src/ui/menu.cpp +++ b/src/ui/menu.cpp @@ -9,6 +9,7 @@ #include "game.h" #include "sim/affix.h" #include "sim/craft.h" +#include "sim/tree.h" namespace { @@ -120,17 +121,22 @@ constexpr int SQ_STAT_X = 40, SQ_STAT_Y = 158, SQ_STAT_STEP = 9; // Экран улучшений: четыре строки во всю ширину. Строкой, а не сеткой, потому // что у каждой есть длинная подпись «что это даёт», и без неё покупка была бы // покупкой кота в мешке. -// Строк на экране улучшений пять: найм и четыре характеристики. Найм ПЕРВЫЙ -// строкой — он и стоит на порядок дороже, и меняет игру сильнее всех остальных -// покупок вместе взятых (sim/profile.h). -constexpr int UP_X = 60, UP_Y = 66, UP_W = 360, UP_H = 26, UP_STEP = 30; +// Дерево улучшений: пять столбцов-ветвей по восемь узлов (sim/tree.h). +// +// Сетка, а не свободная раскладка с кривыми связями: узлы читаются столбцами, +// ветвь видна целиком, и «куда я иду» понятно без легенды. Кривые связи из +// больших деревьев красивы на скриншоте и нечитаемы на 480x270. +constexpr int TR_X = 30, TR_Y = 66; +constexpr int TR_COL_W = 86, TR_ROW_H = 23; +constexpr int TR_NODE_W = 78, TR_NODE_H = 19; -// Индекс строки найма в списке виджетов. Стоит за последним улучшением, чтобы -// не переиндексировать Upgrade ради UI. -constexpr int UP_RECRUIT = int(Upgrade::COUNT); +inline UiRect TreeNodeRect(int index) +{ + const int col = index / NODES_PER_BRANCH; + const int row = index % NODES_PER_BRANCH; + return UiRect{TR_X + col * TR_COL_W, TR_Y + row * TR_ROW_H, TR_NODE_W, TR_NODE_H}; +} -// Строка i-го улучшения. Найм занимает нулевую, характеристики идут следом. -inline UiRect UpRowRect(int row) { return UiRect{UP_X, UP_Y + row * UP_STEP, UP_W, UP_H}; } constexpr int SQ_STAT_LINES = 4; // Сумка общая, и ячеек в ней шестнадцать вместо шести на бойца. В два столбца @@ -447,9 +453,13 @@ void BuildWidgets(const Ui& ui, const Game& game, const Layout& l, Widgets& out) return; case Screen::UPGRADE: - out.Add(UiPart::UPGRADE_ITEM, UP_RECRUIT, UpRowRect(0)).enabled = false; - for (int i = 0; i < int(Upgrade::COUNT); ++i) - out.Add(UiPart::UPGRADE_ITEM, i, UpRowRect(i + 1)); + for (int i = 0; i < TREE_NODES; ++i) + { + Widget& w = out.Add(UiPart::UPGRADE_ITEM, i, TreeNodeRect(i)); + // Закрытый узел виден, но не нажимается: игрок должен видеть, + // КУДА ведёт ветвь, до того как в неё вложится. + w.enabled = game.profile && game.profile->NodeUnlocked(i); + } return; case Screen::DEPTH: @@ -738,10 +748,10 @@ void UiActivate(Ui& ui, Game& game, UiPart part, int index) case UiPart::UPGRADE_ITEM: // Покупка молча не проваливается: не хватило опыта — уровень // остался прежним, и это видно на той же строке. - if (!game.profile) return; - // Нулевая строка — состав отряда, и она НЕ кнопка: оперативники - // находятся на этажах (sim/profile.h). - if (index != UP_RECRUIT) game.profile->Buy(Upgrade(index)); + // Покупка узла дерева. Молча не проваливается: не хватило опыта + // или узел закрыт — уровень остался прежним, и это видно на самом + // узле (sim/tree.h). + if (game.profile) game.profile->BuyNode(index); return; case UiPart::MENU_ITEM: @@ -1330,60 +1340,85 @@ void Ui::Draw(const Game& game, const ScreenRect& fit) const case Screen::UPGRADE: { Shade(l, COL_DIM); - TextCentered(l, "UPGRADES", 30, 16, COL_TEXT); - Rule(l, 52, 52); + TextCentered(l, "UPGRADE TREE", 12, 14, COL_TEXT); + Rule(l, 28, 60); - char line[80]; + char line[96]; const float banked = game.profile ? game.profile->bankedXp : 0.0f; std::snprintf(line, sizeof(line), "BANKED XP %d", int(banked)); - TextCentered(l, line, 58, 8, COL_FAINT); + TextCentered(l, line, 34, 8, COL_FAINT); - // --- состав отряда: показ, а не покупка ------------------------- - // Раньше здесь стояла строка «нанять оперативника» за опыт. Убрана - // намеренно: наёмники теперь НАХОДЯТСЯ в капсулах на этажах - // (sim/profile.h), а кнопка «стать сильнее» никуда не звала и - // ничего не рассказывала. + // Заголовки ветвей. + for (int b = 0; b < BRANCH_COUNT; ++b) { - const int size = game.profile ? game.profile->squadSize : NUM_AGENTS; - const UiRect r = UpRowRect(0); - BoxLines(l, r, COL_DEAD); - Text(l, "SQUAD", r.x + 8, r.y + 4, 10, COL_FAINT); - Text(l, "OPERATIVES ARE FOUND IN CAPSULES, NOT HIRED", r.x + 8, r.y + 16, 8, - COL_FAINT); - for (int k = 0; k < NUM_AGENTS; ++k) - Box(l, UiRect{r.x + 200 + k * 8, r.y + 8, 5, 5}, - (k < size) ? Color{200, 180, 120, 255} : COL_DEAD); - std::snprintf(line, sizeof(line), "%d / %d", size, NUM_AGENTS); - Text(l, line, r.x + r.w - 8 - TextW(l, line, 10), r.y + 7, 10, COL_FAINT); + const UiRect r = TreeNodeRect(b * NODES_PER_BRANCH); + Text(l, BranchName(Branch(b)), r.x + 2, TR_Y - 10, 8, COL_PICK); } - for (int i = 0; i < int(Upgrade::COUNT); ++i) + // Связи между узлами ветви: тонкая линия сверху вниз. Она и есть + // «цепочка» — узел открывается предыдущим. + for (int i = 0; i < TREE_NODES; ++i) { - const Upgrade u = Upgrade(i); - const int lvl = game.profile ? game.profile->UpgradeLevel(u) : 0; - const bool maxed = lvl >= UPGRADE_MAX_LEVEL; - const bool afford = game.profile && game.profile->CanBuy(u); + const int row = i % NODES_PER_BRANCH; + if (row == 0) continue; + const UiRect a = TreeNodeRect(i - 1); + const bool open = game.profile && game.profile->NodeRank(i - 1) > 0; + Box(l, UiRect{a.x + TR_NODE_W / 2, a.y + TR_NODE_H, 1, TR_ROW_H - TR_NODE_H}, + open ? Color{150, 130, 90, 255} : COL_DEAD); + } - const UiRect r = UpRowRect(i + 1); - const bool hover = (hoverPart == UiPart::UPGRADE_ITEM && hoverIndex == i); - if (hover && afford) Box(l, r, COL_HOVER); - BoxLines(l, r, afford ? COL_EDGE : COL_DEAD); + for (int i = 0; i < w.count; ++i) + { + const Widget& c = w.item[i]; + if (c.part != UiPart::UPGRADE_ITEM) continue; - Text(l, UpgradeName(u), r.x + 8, r.y + 4, 10, afford ? COL_TEXT : COL_FAINT); - Text(l, UpgradeEffect(u), r.x + 8, r.y + 16, 8, COL_FAINT); + const TreeNode& n = TreeNodeAt(c.index); + const int rank = game.profile ? game.profile->NodeRank(c.index) : 0; + const bool maxed = rank >= n.maxRank; + const bool afford = game.profile && game.profile->CanBuyNode(c.index); + const bool hover = (hoverPart == c.part && hoverIndex == c.index); + + if (hover && afford) Box(l, c.rect, COL_HOVER); + // Взятый узел заливается: сетка должна читаться одним взглядом, + // без вчитывания в цифры уровней. + if (rank > 0) Box(l, c.rect, Color{58, 46, 26, 200}); + BoxLines(l, c.rect, !c.enabled ? COL_DEAD + : (afford ? Color{150, 130, 90, 255} : COL_EDGE)); + + Text(l, n.name, c.rect.x + 3, c.rect.y + 2, 7, + c.enabled ? (rank > 0 ? COL_TEXT : COL_FAINT) : COL_DEAD); // Уровни точками: пять кружков читаются быстрее, чем «3/5». - for (int k = 0; k < UPGRADE_MAX_LEVEL; ++k) - Box(l, UiRect{r.x + 200 + k * 8, r.y + 8, 5, 5}, - (k < lvl) ? Color{200, 180, 120, 255} : COL_DEAD); + for (int k = 0; k < n.maxRank; ++k) + Box(l, UiRect{c.rect.x + 3 + k * 5, c.rect.y + 12, 3, 3}, + (k < rank) ? Color{210, 180, 110, 255} : COL_DEAD); if (maxed) std::snprintf(line, sizeof(line), "MAX"); - else std::snprintf(line, sizeof(line), "%d XP", int(UpgradeCost(lvl))); - Text(l, line, r.x + r.w - 8 - TextW(l, line, 10), r.y + 7, 10, + else std::snprintf(line, sizeof(line), "%d", + int(TreeNodeCost(c.index, rank, + game.profile ? game.profile->TreeRanks() : 0))); + Text(l, line, c.rect.x + TR_NODE_W - 3 - TextW(l, line, 7), c.rect.y + 11, 7, maxed ? COL_FAINT : (afford ? COL_PICK : COL_DEAD)); } - TextCentered(l, "CLICK TO BUY ESC BACK", 232, 8, COL_FAINT); + // Подсказка по узлу под курсором: что он даёт и сколько уже дал. + if (hoverPart == UiPart::UPGRADE_ITEM && hoverIndex >= 0 && hoverIndex < TREE_NODES) + { + const TreeNode& n = TreeNodeAt(hoverIndex); + const int rank = game.profile ? game.profile->NodeRank(hoverIndex) : 0; + const bool percent = n.perRank < 1.0f; + if (percent) + std::snprintf(line, sizeof(line), "%s: %+d%% PER RANK, NOW %+d%%", + NodeEffectName(n.effect), int(n.perRank * 100.0f + 0.5f), + int(n.perRank * float(rank) * 100.0f + 0.5f)); + else + std::snprintf(line, sizeof(line), "%s: %+d PER RANK, NOW %+d", + NodeEffectName(n.effect), int(n.perRank + 0.5f), + int(n.perRank * float(rank) + 0.5f)); + TextCentered(l, line, 252, 8, COL_TEXT); + } + + TextCentered(l, "CLICK TO SPEND ESC BACK", 262, 7, COL_FAINT); break; }