Слияние с feature/battle-famine (бой, голод, гарнизон, лагеря)
This commit is contained in:
@@ -86,16 +86,29 @@ public interface IArmy
|
||||
{
|
||||
int TypeCount { get; } // типов войск (пехота, лучники, кавалерия, осадные)
|
||||
int GetTroops(int type); // воинов этого типа в городе
|
||||
int SoldiersAtHome { get; } // всего воинов в городе
|
||||
int SoldiersAtHome { get; } // всего воинов в городе (вместе с гарнизоном)
|
||||
int TroopsInMarches { get; } // воинов в походах
|
||||
|
||||
// Гарнизон -- часть воинов в городе: защищает город и в походы не уходит. Всего воинов от этого не меняется.
|
||||
int GarrisonTotal { get; }
|
||||
int GetGarrison(int type);
|
||||
int AvailableForMarch { get; } // можно отправить в поход: в городе минус гарнизон
|
||||
int SetGarrison(int count); // назначить гарнизон (по составу армии); возвращает, сколько назначено
|
||||
|
||||
void AddTroops(int type, int count); // обучены / вернулись
|
||||
int LoseFraction(double fraction); // потери в бою: доля от каждого типа; возвращает, сколько погибло
|
||||
|
||||
// Забрать воинов из города в поход (запоминает состав похода)
|
||||
// Забрать свободных воинов в поход (запоминает состав похода).
|
||||
// false -- ничего не взято: не хватает воинов или поход с таким номером уже есть.
|
||||
bool TakeForMarch(int marchId, int count);
|
||||
// Вернуть выживших из похода по тем же типам войск
|
||||
void ReturnFromMarch(int marchId, int survivors);
|
||||
// Вернуть выживших из похода по тем же типам войск.
|
||||
// Зачисляет только по известному походу и только один раз; false -- такого похода нет, никто не добавлен.
|
||||
bool ReturnFromMarch(int marchId, int survivors);
|
||||
|
||||
// Состав похода по типам (копия); null -- такого похода нет
|
||||
int[] GetMarchUnits(int marchId);
|
||||
// Вернуть выживших точно по типам (бой посчитал потери каждого типа). Правила те же, что у ReturnFromMarch.
|
||||
bool ReturnUnits(int marchId, int[] survivorUnits);
|
||||
}
|
||||
|
||||
// ---------------- Глобальный мир: карта и перемещения ----------------
|
||||
@@ -106,23 +119,94 @@ public interface IWorld
|
||||
}
|
||||
|
||||
// ---------------- Боевая система: урон, потери, исход ----------------
|
||||
public struct BattleRequest
|
||||
// Типы войск в бою -- порядок как в GameData.Troops и в модуле Армии
|
||||
public static class TroopType
|
||||
{
|
||||
public int Attackers;
|
||||
public int Defenders;
|
||||
public const int Infantry = 0; // пехота
|
||||
public const int Archers = 1; // лучники
|
||||
public const int Cavalry = 2; // кавалерия
|
||||
public const int Siege = 3; // осадные
|
||||
public const int Count = 4;
|
||||
}
|
||||
|
||||
// Состояние войск стороны в бою (план от 27.10.2026). Штрафы применяются последовательно:
|
||||
// голод (-50%) и усталость (-20%) вместе оставляют 40% силы, а не 30%. Числа -- в правилах боя.
|
||||
[Flags]
|
||||
public enum BattleCondition
|
||||
{
|
||||
None = 0,
|
||||
Famine = 1, // голод в поселении на момент боя
|
||||
Fatigue = 2 // войско недавно сражалось (пока не выставляется: правила учёта усталости не утверждены)
|
||||
}
|
||||
|
||||
public struct BattleRequest
|
||||
{
|
||||
// Состав сторон по типам войск (TroopType). Если состав не задан (null) --
|
||||
// берётся число Attackers / Defenders, и все считаются пехотой.
|
||||
public int[] AttackerUnits;
|
||||
public int[] DefenderUnits;
|
||||
public int Attackers;
|
||||
public int Defenders;
|
||||
|
||||
public bool DefenderFortified; // защитники за стенами (город, замок)
|
||||
public int AttackerBonusPercent; // герой, технологии, голод (минус) -- +10 = на 10% сильнее
|
||||
public int DefenderBonusPercent;
|
||||
|
||||
// Состояния сторон: голод, усталость. Действуют последовательно (умножаются), см. BattleCondition
|
||||
public BattleCondition AttackerConditions;
|
||||
public BattleCondition DefenderConditions;
|
||||
|
||||
// Номер боя: из него считается случайность сторон (±5%). Один и тот же Seed с теми же войсками --
|
||||
// всегда тот же итог, бой можно перепроверить. В мультиплеере Seed выдаёт сервер.
|
||||
public long Seed;
|
||||
}
|
||||
|
||||
// Итог боя -- одинаково полный для обеих сторон. Все массивы -- по типам войск (TroopType).
|
||||
// По каждому типу: до боя = выжившие + погибшие + раненые.
|
||||
public struct BattleOutcome
|
||||
{
|
||||
public bool Victory; // победил атакующий
|
||||
public int AttackerLosses;
|
||||
public long BattleId; // = Seed запроса
|
||||
public int RulesVersion; // версия правил боя (баланса), по которой посчитан итог
|
||||
|
||||
public int AttackerLosses; // выбыли из строя: погибшие + раненые
|
||||
public int DefenderLosses;
|
||||
public int Survivors; // сколько атакующих осталось
|
||||
public int Survivors; // сколько атакующих осталось в строю
|
||||
|
||||
public long AttackerPower; // итоговая сила сторон x100: с контрами, стенами, бонусами и случайностью
|
||||
public long DefenderPower;
|
||||
public int AttackerLuckPermille; // случайность стороны в десятых долях процента: +23 = +2,3%
|
||||
public int DefenderLuckPermille;
|
||||
public int AttackerConditionPercent; // сколько силы оставили состояния стороны: 100 -- без штрафов, 50 -- голод
|
||||
public int DefenderConditionPercent;
|
||||
|
||||
public int[] AttackerUnitsBefore, DefenderUnitsBefore;
|
||||
public int[] AttackerSurvivorUnits, DefenderSurvivorUnits;
|
||||
public int[] AttackerDeadUnits, DefenderDeadUnits;
|
||||
public int[] AttackerWoundedUnits, DefenderWoundedUnits; // пока нули: доля раненых не утверждена командой
|
||||
public int[] DefenderLossUnits; // погибшие + раненые защитника (для старого кода)
|
||||
}
|
||||
|
||||
// Прогноз до боя: с учётом случайности, без раскрытия итога (план от 27.10.2026)
|
||||
public enum BattleChance
|
||||
{
|
||||
Advantage, // победа при любой случайности
|
||||
Uncertain, // исход зависит от случайности
|
||||
HighRisk // поражение при любой случайности
|
||||
}
|
||||
|
||||
public struct BattleForecast
|
||||
{
|
||||
public BattleChance Chance;
|
||||
public long AttackerPowerMin, AttackerPowerMax; // x100, крайние значения случайности
|
||||
public long DefenderPowerMin, DefenderPowerMax;
|
||||
public int AttackerLossesMin, AttackerLossesMax;
|
||||
}
|
||||
|
||||
public interface IBattleSystem
|
||||
{
|
||||
BattleOutcome Resolve(BattleRequest request);
|
||||
BattleForecast Forecast(BattleRequest request); // Seed не нужен: перебираются крайние значения случайности
|
||||
}
|
||||
|
||||
// ---------------- Чат: общий мир и Круг ----------------
|
||||
|
||||
Reference in New Issue
Block a user