Числа боя (ревью 27.10.2026, п. 2.5): - BattleRules (модуль Боя, без Unity) — все числа в одном месте, с версией - таблица BattleConfig (Assets/Resources/BattleConfig.asset) — меняется в Inspector, App/GameModules переводит её в BattleRules - сила воинов по-прежнему из GameData.Troops Случайность (план 27.10.2026): - каждой стороне от −5% до +5% (шаг 0,1%), из номера боя BattleRequest.Seed (SplitMix64) - тот же номер с теми же войсками — всегда тот же итог; поход получает battleSeed при выступлении и хранит его Прогноз: - IBattleSystem.Forecast: «преимущество / исход неясен / высокий риск поражения», диапазоны силы и потерь - окно атаки показывает прогноз риска вместо точного итога; окно итога боя — силы и удачу сторон Итог боя (ревью, п. 2.3): - для обеих сторон по типам: до боя, выжившие, погибшие, раненые (пока нули — доля не утверждена) - номер боя, версия правил, удача сторон Тесты: случайность воспроизводима и в пределах ±5%; прогноз не противоречит 300 боям с разными номерами; итог сходится по типам у обеих сторон; правила из таблицы; тот же поход — тот же бой. Все 37 тестов ModuleTests прогнаны вне Unity — проходят. Открыто для команды (Battle.md): показывать ли шанс победы в процентах; порядок бонусов и случайности. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
26 lines
1.8 KiB
C#
26 lines
1.8 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 = 1;
|
|
|
|
// Сила одного воина каждого типа. В игре -- из 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%
|
|
|
|
public static BattleRules Default => new BattleRules();
|
|
|
|
// Без случайности: для тестов, где важен точный итог
|
|
public static BattleRules NoRandom => new BattleRules { RandomPercent = 0 };
|
|
}
|