// ПРАВИЛА БОЯ: все числа боевой системы в одном месте. Документ: 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 = 8; // 2 -- голод и усталость; 3 -- сила без округления, потери шансом (№12, №13); 4 -- кривая потерь (№14); // 5 -- разгром дальше 5:1 (решения по 8 вопросам Саши, 31.10, п. 5); 6 -- раненые (п. 7); // 7 -- сильная сторона 5:1 -> 10:1 с 11% до 2% (решения по отчёту Саши, 01.11, п. 1); // 8 -- пропавшие без вести (п. 5) // Сила одного воина каждого типа. В игре -- из 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, ТЕСТ): доля выбывших от каждого типа в зависимости от // соотношения итоговых сил (сильная / слабая), в десятых долях процента. Между опорными точками -- плавно // (линейно), без порогов-переключателей. // Разгром (решения 31.10, п. 5): 7:1 -- 92%, 10:1 -- 95%, дальше слабая сторона плавно стремится к WeakLossMaxPermille (99%): // v = max - (max - v_last) * R_last / R -- при 20:1 97%, при 100:1 98,6%; 100% не достигается. // Сильная сторона (решения по отчёту Саши, 01.11, п. 1): 5:1 -- 11%, плавно до 2% при 10:1, дальше 2%. public int[] LossRatioPermille = { 1000, 3000, 5000, 7000, 10000 }; // 1:1, 3:1, 5:1, 7:1, 10:1 public int[] StrongLossPermille = { 450, 160, 110, 74, 20 }; // сильная сторона: 45%, 16%, 11%, 7,4%, 2% public int[] WeakLossPermille = { 450, 740, 880, 920, 950 }; // слабая сторона: 45%, 74%, 88%, 92%, 95% public int WeakLossMaxPermille = 990; // верхний предел ожидаемых потерь слабой стороны: 99% // Погибшие и раненые (регламент 31.10, ТЕСТ; решения 31.10, п. 7): из выбывших стороны погибает доля, // зависящая от её соотношения сил (своя / чужая), остальные -- раненые. Ориентиры регламента: // разгром 1:5 -- ~70%, поражение 1:2 -- ~45%, равный бой -- ~30%, уверенная победа 3:1 -- ~20%. // Между точками -- плавно (линейно), за крайними -- значения крайних. Округление -- отдельным броском. public int[] DeadRatioPermille = { 200, 500, 1000, 3000 }; // соотношение сил стороны: 1:5, 1:2, 1:1, 3:1 public int[] DeadSharePermille = { 700, 450, 300, 200 }; // доля погибших среди выбывших: 70%, 45%, 30%, 20% // Пропавшие без вести (решения 01.11, п. 5): доля выбывших, получающих этот статус, в десятых долях процента. // НЕ УТВЕРЖДЕНА командой -- по умолчанию 0 (механика выключена). Остальные выбывшие -- погибшие и раненые, как выше. public int MissingSharePermille = 0; // Состояния (утверждено 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 }; }