V = Σ(Nᵢ·Vᵢ·Mᵢ)/ΣNᵢ, общий модификатор -- один раз, без промежуточного округления. MarchConfig: mixedUsesSlowest убран, добавлены typeSpeedBonusPercent и armySpeedBonusPercent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
83 lines
4.8 KiB
C#
83 lines
4.8 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;
|
|
|
|
[Header("Модификаторы скорости, % (решения 31.10, п. 4: смешанное войско -- средняя по численности)")]
|
|
[Tooltip("По типам: пехота, лучники, кавалерия, осадные. +10 -- быстрее на 10%. Позже -- бонусы героев и технологий. ТЕСТ")]
|
|
public int[] typeSpeedBonusPercent = { 0, 0, 0, 0 };
|
|
[Tooltip("Общий модификатор всего войска, применяется один раз. ТЕСТ")]
|
|
public int armySpeedBonusPercent = 0;
|
|
|
|
[Header("Слоты похода")]
|
|
[Tooltip("Сколько походов игрока могут идти одновременно. Регламент 31.10: 2 (технология «Военная логистика» -- до 7)")]
|
|
public int baseMarchSlots = 2;
|
|
|
|
[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;
|
|
|
|
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) },
|
|
TypeBonusPercent = (int[])(typeSpeedBonusPercent ?? new int[4]).Clone(),
|
|
ArmyBonusPercent = armySpeedBonusPercent
|
|
};
|
|
}
|
|
|
|
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)
|
|
};
|
|
}
|
|
|
|
static int Milli(float cellsPerHour) => Mathf.Max(1, Mathf.RoundToInt(cellsPerHour * 1000f));
|
|
}
|