Числа боя (ревью 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>
61 lines
3.2 KiB
C#
61 lines
3.2 KiB
C#
using UnityEngine;
|
|
|
|
// ТАБЛИЦА БАЛАНСА БОЯ. Все числа боевой системы -- здесь, а не в коде модуля (ревью от 27.10.2026, п. 2.5).
|
|
//
|
|
// Ассет: Assets/Resources/BattleConfig.asset (выдели его в окне Project и меняй числа в Inspector,
|
|
// перекомпиляция не нужна; изменения действуют со следующего запуска игры). Создать заново:
|
|
// правый клик в Project -> Create -> Bogatyri -> Battle Config, имя файла -- BattleConfig, папка -- Resources.
|
|
//
|
|
// Модуль Боя таблицу не видит: App/GameModules переводит её в BattleRules.
|
|
// Сила воинов -- в GameData.Troops (рядом с ценой и временем обучения), здесь её нет.
|
|
// Числа -- стартовые для тестирования (план от 27.10.2026), утверждает команда.
|
|
[CreateAssetMenu(fileName = "BattleConfig", menuName = "Bogatyri/Battle Config")]
|
|
public class BattleConfig : ScriptableObject
|
|
{
|
|
[Tooltip("Версия баланса боя. Поменял числа -- подними версию: итог боя запоминает, по какой версии посчитан")]
|
|
public int version = 1;
|
|
|
|
[Tooltip("Контра, %: пехота > кавалерия > лучники > пехота. Взвешивается по доле нужного типа у врага")]
|
|
public int counterPercent = 25;
|
|
[Tooltip("Стены, %: усиление защитников замка и городов")]
|
|
public int wallsPercent = 20;
|
|
[Tooltip("Осадные при штурме стен, %")]
|
|
public int siegeVsWallsPercent = 50;
|
|
[Tooltip("Осадные в поле и в обороне, % (минус)")]
|
|
public int siegeInFieldPercent = -25;
|
|
[Tooltip("Потери проигравшего, % от каждого типа. Не окончательная формула")]
|
|
public int loserLossPercent = 50;
|
|
[Tooltip("Случайность каждой стороны: от -N% до +N%. 0 -- без случайности")]
|
|
public int randomPercent = 5;
|
|
|
|
static BattleConfig cached;
|
|
|
|
public static BattleConfig Load()
|
|
{
|
|
if (cached != null) return cached;
|
|
cached = Resources.Load<BattleConfig>("BattleConfig");
|
|
if (cached == null)
|
|
{
|
|
Debug.LogWarning("[БОЙ] Нет Assets/Resources/BattleConfig.asset -- берутся числа по умолчанию из BattleConfig.cs.");
|
|
cached = CreateInstance<BattleConfig>();
|
|
}
|
|
return cached;
|
|
}
|
|
|
|
// Правила для модуля Боя
|
|
public BattleRules ToRules(int[] unitPower)
|
|
{
|
|
return new BattleRules
|
|
{
|
|
Version = version,
|
|
UnitPower = unitPower,
|
|
CounterPercent = counterPercent,
|
|
WallsPercent = wallsPercent,
|
|
SiegeVsWallsPercent = siegeVsWallsPercent,
|
|
SiegeInFieldPercent = siegeInFieldPercent,
|
|
LoserLossPercent = loserLossPercent,
|
|
RandomPercent = Mathf.Max(0, randomPercent)
|
|
};
|
|
}
|
|
}
|