Бой (модуль Battle): - доля выбывших каждого типа — плавная функция соотношения итоговых сил (сильная / слабая) по опорным точкам регламента: 1:1 — 45% / 45%, 3:1 — 16% / 74%, 5:1 — 11% / 88% (ТЕСТ); между точками линейно, без порогов-переключателей; одинаково для PvE, PvP и Круга - заменяет «проигравший теряет 50%, победитель до 50%» - считается точной дробью, округление потерь — как прежде шансом (№13) - за 5:1 — значения последней точки (рост разгрома дальше не задан — вопрос команде) Таблица BattleConfig: точки кривой (lossRatioPermille, strongLossPermille, weakLossPermille) вместо loserLossPercent; некорректная таблица — значения по умолчанию. Версия правил 4. Раненых пока нет: все выбывшие — погибшие. Раненые (№15) — следующим шагом вместе с госпиталем, нужен контракт с Населением (Валдемар), чтобы раненые учитывались среди людей города. Тесты: опорные точки, симметрия, плавность и монотонность, кривая из таблицы и защита от ошибки; тесты округления пересчитаны под кривую. Все 47 тестов ModuleTests проходят вне Unity. Код Валдемара не менялся. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 lines
3.0 KiB
C#
36 lines
3.0 KiB
C#
// ПРАВИЛА БОЯ: все числа боевой системы в одном месте. Документ: Docs/Modules/Battle.md
|
|
// Без Unity. В игре значения приходят из таблицы App/BattleConfig (Assets/Resources/BattleConfig.asset),
|
|
// App/GameModules переводит её в BattleRules. Без таблицы (тесты, сервер) -- значения по умолчанию ниже.
|
|
//
|
|
// Числа -- стартовые для тестирования (план от 27.10.2026). Изменил правила -- подними Version:
|
|
// итог боя запоминает версию, по которой посчитан.
|
|
public sealed class BattleRules
|
|
{
|
|
public int Version = 4; // 2 -- голод и усталость; 3 -- сила без округления, потери шансом (№12, №13); 4 -- кривая потерь (№14)
|
|
|
|
// Сила одного воина каждого типа. В игре -- из GameData.Troops (там же цена и время обучения).
|
|
public int[] UnitPower = { 4, 5, 9, 16 };
|
|
|
|
public int CounterPercent = 25; // контра: пехота > кавалерия > лучники > пехота
|
|
public int WallsPercent = 20; // защитникам за стенами
|
|
public int SiegeVsWallsPercent = 50; // осадным при штурме стен
|
|
public int SiegeInFieldPercent = -25; // осадным в поле и в обороне
|
|
public int RandomPercent = 5; // случайность каждой стороны: от -5% до +5%
|
|
|
|
// Кривая потерь (решение №14, регламент 31.10, ТЕСТ): доля выбывших от каждого типа в зависимости от
|
|
// соотношения итоговых сил (сильная / слабая), в десятых долях процента. Между опорными точками -- плавно
|
|
// (линейно), без порогов-переключателей. За последней точкой -- значения последней (рост разгрома дальше 5:1 не задан).
|
|
public int[] LossRatioPermille = { 1000, 3000, 5000 }; // 1:1, 3:1, 5:1
|
|
public int[] StrongLossPermille = { 450, 160, 110 }; // сильная сторона: 45%, 16%, 11%
|
|
public int[] WeakLossPermille = { 450, 740, 880 }; // слабая сторона: 45%, 74%, 88%
|
|
|
|
// Состояния (утверждено 27.10.2026): сколько силы остаётся. Применяются последовательно: 50% x 80% = 40%
|
|
public int FamineStrengthPercent = 50; // голод: -50%
|
|
public int FatigueStrengthPercent = 80; // усталость: -20%
|
|
|
|
public static BattleRules Default => new BattleRules();
|
|
|
|
// Без случайности: для тестов, где важен точный итог
|
|
public static BattleRules NoRandom => new BattleRules { RandomPercent = 0 };
|
|
}
|