Решения №11–13 (документ 01 комплекта): - №11: прогноз показывает точный шанс победы (BattleForecast.WinChancePermille) — перебор всех 101×101 равновероятных сочетаний удачи; в окне атаки «шанс победы 27%» - №12: сила считается точной дробью (BigInteger), удача — после всех модификаторов, округление одно и только для показа (3 пехоты против 1 кав. и 2 пех.: 13,00 вместо 12,96) - №13: потери — целая часть гарантирована, дробная — шанс ещё одной потери из отдельного потока случайности (своя соль на сторону и тип), воспроизводимо по номеру боя; одиночка-проигравший теперь может погибнуть - версия правил боя 3 (BattleRules, BattleConfig) Голод на момент боя (№9, документ 02 — офлайн в причинно-следственном порядке): - MarchManager спрашивает IPopulation.WasStarvingAt(время прихода войска) - перед боем, прошедшим в прошлом, просит Население досчитать время (публичный Tick); модуль Населения не менялся Формула потерь (№14) и раненые (№15) не тронуты — ждут чисел от команды. Тесты: шанс победы совпадает с 20 000 настоящих боёв (±2%), сила без промежуточного округления, округление потерь (одиночка гибнет ~50%, 1,5 → 1 или 2). Все 42 теста ModuleTests проходят вне Unity. Документы Battle, World, Core, README обновлены (только наши строки). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 lines
2.3 KiB
C#
30 lines
2.3 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 = 3; // 2 -- голод и усталость; 3 -- сила без промежуточного округления, округление потерь шансом (№12, №13)
|
|
|
|
// Сила одного воина каждого типа. В игре -- из 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 LoserLossPercent = 50; // потери проигравшего (не окончательная формула)
|
|
public int RandomPercent = 5; // случайность каждой стороны: от -5% до +5%
|
|
|
|
// Состояния (утверждено 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 };
|
|
}
|