Мир (Bogatyri.World.Simulation): - MarchSpeedRules: скорость по типам — пехота 8, лучники 9, кавалерия 12, осадные 4 клетки за реальный час (ТЕСТ); марш идёт в реальном времени - смешанное войско — по самому медленному типу (настройка mixedUsesSlowest: средняя по числу воинов); правило для одной армии в регламенте не задано — вопрос команде - WorldSimulation.TravelTimeMs, AssignUnits: время прихода пересчитывается по составу похода; обратный путь — по составу выживших - MarchRules.GetTravelTimeMs — для похода без состава (как пехота) Армия (Bogatyri.Army): - слоты похода: IArmy.MarchSlots (база 2, ТЕСТ), ActiveMarches; TakeForMarch отказывает при занятых слотах; походы из старых сохранений сверх лимита дойдут, новых не будет Таблица MarchConfig (Assets/Resources/MarchConfig.asset): скорости, режим смешанного войска, база слотов. Карта мира: путь в окне атаки — по составу при выбранном числе воинов, «Все слоты похода заняты», верхняя строка «отрядов: 1 из 2». Тесты: скорости по типам, смешанное войско, обратный путь, слоты; старые тесты мира переведены на часовые марши. Все 49 тестов ModuleTests проходят вне Unity. Код Валдемара не менялся. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
3.1 KiB
C#
56 lines
3.1 KiB
C#
using UnityEngine;
|
|
|
|
// ТАБЛИЦА МАРШЕЙ: скорости войск по типам и слоты похода (регламент 31.10, раздел 7). Числа -- ТЕСТ.
|
|
//
|
|
// Ассет: Assets/Resources/MarchConfig.asset (выдели его в окне Project и меняй числа в Inspector;
|
|
// изменения действуют со следующего запуска игры). Создать заново: правый клик в Project ->
|
|
// Create -> Bogatyri -> March Config, имя файла -- MarchConfig, папка -- Resources.
|
|
//
|
|
// Модули таблицу не видят: App/GameModules передаёт скорости в модуль Мира, слоты -- в модуль Армии.
|
|
// Бонусы героя (+15%) и технологии (+20%) к скорости появятся вместе с героями и технологиями.
|
|
[CreateAssetMenu(fileName = "MarchConfig", menuName = "Bogatyri/March Config")]
|
|
public class MarchConfig : ScriptableObject
|
|
{
|
|
[Header("Скорость: клеток карты за 1 РЕАЛЬНЫЙ час (марш идёт в реальном времени)")]
|
|
[Tooltip("Пехота. Регламент 31.10: 8")]
|
|
public float infantry = 8f;
|
|
[Tooltip("Лучники. Регламент 31.10: 9")]
|
|
public float archers = 9f;
|
|
[Tooltip("Кавалерия. Регламент 31.10: 12")]
|
|
public float cavalry = 12f;
|
|
[Tooltip("Осадные. Регламент 31.10: 4")]
|
|
public float siege = 4f;
|
|
[Tooltip("Смешанное войско идёт со скоростью самого медленного типа. Выключено -- средняя скорость по числу воинов. Правило для одной армии регламент не задаёт -- открытый вопрос")]
|
|
public bool mixedUsesSlowest = true;
|
|
|
|
[Header("Слоты похода")]
|
|
[Tooltip("Сколько походов игрока могут идти одновременно. Регламент 31.10: 2 (технология «Военная логистика» -- до 7)")]
|
|
public int baseMarchSlots = 2;
|
|
|
|
static MarchConfig cached;
|
|
|
|
public static MarchConfig Load()
|
|
{
|
|
if (cached != null) return cached;
|
|
cached = Resources.Load<MarchConfig>("MarchConfig");
|
|
if (cached == null)
|
|
{
|
|
Debug.LogWarning("[МАРШИ] Нет Assets/Resources/MarchConfig.asset -- берутся числа по умолчанию из MarchConfig.cs.");
|
|
cached = CreateInstance<MarchConfig>();
|
|
}
|
|
return cached;
|
|
}
|
|
|
|
// Скорости для модуля Мира: милли-единиц карты (1000 = клетка) за реальный час
|
|
public Bogatyri.World.MarchSpeedRules ToSpeedRules()
|
|
{
|
|
return new Bogatyri.World.MarchSpeedRules
|
|
{
|
|
SpeedMilliPerHour = new[] { Milli(infantry), Milli(archers), Milli(cavalry), Milli(siege) },
|
|
MixedUsesSlowest = mixedUsesSlowest
|
|
};
|
|
}
|
|
|
|
static int Milli(float cellsPerHour) => Mathf.Max(1, Mathf.RoundToInt(cellsPerHour * 1000f));
|
|
}
|