2026-10-31 16:05:55 +01:00
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 ;
2026-11-01 13:05:57 +01:00
[Header("Модификаторы скорости, % (решения 31.10, п. 4: смешанное войско -- средняя по численности)")]
[Tooltip("По типам: пехота, лучники, кавалерия, осадные. +10 -- быстрее на 10%. Позже -- бонусы героев и технологий. ТЕСТ")]
public int [] typeSpeedBonusPercent = { 0 , 0 , 0 , 0 };
[Tooltip("Общий модификатор всего войска, применяется один раз. ТЕСТ")]
public int armySpeedBonusPercent = 0 ;
2026-10-31 16:05:55 +01:00
[Header("Слоты похода")]
[Tooltip("Сколько походов игрока могут идти одновременно. Регламент 31.10: 2 (технология «Военная логистика» -- до 7)")]
public int baseMarchSlots = 2 ;
2026-10-31 17:05:17 +01:00
[Header("Патрули-заглушки соседей (Разведка М1, ВРЕМЕННАЯ тестовая механика)")]
[Tooltip("Соседние города иногда отправляют отряды к другим городам и лагерям -- проверить обнаружение, численность, опознание и потерю контакта. Выключить, когда появится настоящий PvP")]
public bool patrolsEnabled = true ;
[Tooltip("Сколько патрулей одновременно на карте")]
public int patrolMaxActive = 3 ;
[Tooltip("Новый патруль -- раз в столько РЕАЛЬНЫХ минут (если не превышен предел)")]
public float patrolIntervalMinutes = 10f ;
public int patrolSoldiersMin = 10 ;
public int patrolSoldiersMax = 40 ;
2026-10-31 16:05:55 +01:00
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 ) },
2026-11-01 13:05:57 +01:00
TypeBonusPercent = ( int [])( typeSpeedBonusPercent ?? new int [ 4 ]). Clone (),
ArmyBonusPercent = armySpeedBonusPercent
2026-10-31 16:05:55 +01:00
};
}
2026-10-31 17:05:17 +01:00
public Bogatyri . World . PatrolRules ToPatrolRules ()
{
return new Bogatyri . World . PatrolRules
{
Enabled = patrolsEnabled ,
MaxActive = Mathf . Max ( 0 , patrolMaxActive ),
IntervalMs = ( long )( Mathf . Max ( 1f , patrolIntervalMinutes ) * 60_000f ),
SoldiersMin = Mathf . Max ( 1 , patrolSoldiersMin ),
SoldiersMax = Mathf . Max ( 1 , patrolSoldiersMax )
};
}
2026-10-31 16:05:55 +01:00
static int Milli ( float cellsPerHour ) => Mathf . Max ( 1 , Mathf . RoundToInt ( cellsPerHour * 1000f ));
}