- Ядро (Bogatyri.Core): контракты модулей, EventBus, GameServices, SaveRegistry - Модули: Экономика, Поселение, Армия, Глобальный мир, Боевая система, Сохранения (каждый — отдельный asmdef, видит только ядро) - App/GameModules: регистрация модулей и связь с GameProgress/Казармами - Сохранения v2 по секциям модулей, перенос старого save.json и походов из progress.json - Сброс сохранений: ISaveSystem.ResetAll, ResetState у модулей, меню Tools - EditMode-тесты модулей, документы по каждому модулю с журналом изменений Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113 lines
4.2 KiB
C#
113 lines
4.2 KiB
C#
using System.Collections.Generic;
|
|
|
|
// Контракты модулей: всё, что один модуль может попросить у другого.
|
|
// Реализация живёт в своём модуле, здесь -- только "что умеет".
|
|
// Добавляя метод сюда, обнови документ модуля в Docs/Modules.
|
|
|
|
// ---------------- Экономика: ресурсы и производство ----------------
|
|
public interface IEconomy
|
|
{
|
|
float Get(ResourceType type);
|
|
bool Has(ResourceType type, float amount);
|
|
void Add(ResourceType type, float amount);
|
|
bool TrySpend(ResourceType type, float amount);
|
|
|
|
bool CanAfford(IReadOnlyList<ResourceAmount> cost);
|
|
// Списывает всё или ничего
|
|
bool TrySpend(IReadOnlyList<ResourceAmount> cost);
|
|
}
|
|
|
|
// ---------------- Поселение: здания и развитие города ----------------
|
|
public interface ISettlement
|
|
{
|
|
int TownHallLevel { get; }
|
|
int BuildingCount { get; }
|
|
bool IsCityLoaded { get; } // открыта ли сейчас сцена города
|
|
}
|
|
|
|
// Здание с уровнем (добывающие постройки и т.п.) -- Поселение сохраняет уровень, не зная, чьё это здание
|
|
public interface ILeveledBuilding
|
|
{
|
|
int Level { get; set; }
|
|
}
|
|
|
|
// ---------------- Армия: войска ----------------
|
|
public interface IArmy
|
|
{
|
|
int SoldiersAtHome { get; }
|
|
// Забрать воинов из города в поход (запоминает состав похода)
|
|
bool TakeForMarch(int marchId, int count);
|
|
// Вернуть выживших из похода по тем же типам войск
|
|
void ReturnFromMarch(int marchId, int survivors);
|
|
}
|
|
|
|
// ---------------- Глобальный мир: карта и перемещения ----------------
|
|
public interface IWorld
|
|
{
|
|
int ActiveMarches { get; }
|
|
bool TryStartMarch(string targetId, int soldiers, out string error);
|
|
}
|
|
|
|
// ---------------- Боевая система: урон, потери, исход ----------------
|
|
public struct BattleRequest
|
|
{
|
|
public int Attackers;
|
|
public int Defenders;
|
|
}
|
|
|
|
public struct BattleOutcome
|
|
{
|
|
public bool Victory; // победил атакующий
|
|
public int AttackerLosses;
|
|
public int DefenderLosses;
|
|
public int Survivors; // сколько атакующих осталось
|
|
}
|
|
|
|
public interface IBattleSystem
|
|
{
|
|
BattleOutcome Resolve(BattleRequest request);
|
|
}
|
|
|
|
// ---------------- Сохранения: игровое состояние ----------------
|
|
public interface ISaveSystem
|
|
{
|
|
bool HasSave { get; }
|
|
void SaveNow();
|
|
void DeleteSave();
|
|
// Новая игра: все модули возвращаются к стартовому состоянию, файл перезаписывается
|
|
void ResetAll();
|
|
}
|
|
|
|
// Участник сохранения: каждый модуль сам решает, что и как хранит, в своей секции файла.
|
|
public interface ISaveParticipant
|
|
{
|
|
string SaveKey { get; } // имя секции в файле: "economy", "settlement", "world"...
|
|
string Capture(); // JSON секции; null -- оставить то, что уже было в файле
|
|
void Restore(string json);
|
|
void ResetState(); // вернуться к состоянию новой игры (сброс сохранений)
|
|
}
|
|
|
|
// Список участников. Модули регистрируются сами, модуль Сохранений обходит их при записи и загрузке.
|
|
public static class SaveRegistry
|
|
{
|
|
private static readonly List<ISaveParticipant> participants = new List<ISaveParticipant>();
|
|
|
|
public static IReadOnlyList<ISaveParticipant> All => participants;
|
|
|
|
public static void Register(ISaveParticipant participant)
|
|
{
|
|
participants.RemoveAll(p => p.SaveKey == participant.SaveKey);
|
|
participants.Add(participant);
|
|
}
|
|
|
|
public static void Unregister(ISaveParticipant participant)
|
|
{
|
|
participants.Remove(participant);
|
|
}
|
|
|
|
public static void Clear()
|
|
{
|
|
participants.Clear();
|
|
}
|
|
}
|