Files
AlexanderandClaude Opus 5.5 964cb23d9d Модульная система: игровое ядро + 6 модулей, документы Docs/Modules
- Ядро (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>
2026-10-19 18:39:28 +02:00

82 lines
3.1 KiB
C#

using UnityEngine;
// Вешается на КАЖДЫЙ пустой участок земли, который ты вручную расставляешь
// на карте вокруг Ратуши (или где угодно). На объекте обязательно должен
// быть Collider2D (Box или Circle) для определения клика/наведения.
//
// НАСТРОЙКА В UNITY:
// 1. GameObject -> Create Empty, назови "BuildSlot" (можно продублировать Ctrl+D под нужное число)
// 2. Add Component -> Box Collider 2D, подгони размер под будущее здание
// 3. Add Component -> Sprite Renderer -- поставь спрайт-заглушку "пустой участок"
// (забор/колышки с верёвкой -- когда появится арт от дизайнеров)
// 4. Add Component -> Build Slot (этот скрипт)
// 5. Слой (Layer) объекта поставь "BuildSlot" -- используется BuildManager для поиска слотов
public class BuildSlot : MonoBehaviour
{
[Tooltip("Занят ли этот участок постройкой прямо сейчас")]
public bool isOccupied = false;
[Tooltip("Ссылка на здание, которое сейчас стоит на этом участке (если занят)")]
public GameObject occupyingBuilding;
private SpriteRenderer sr;
private Color emptyColor;
void Awake()
{
sr = GetComponent<SpriteRenderer>();
if (sr != null) emptyColor = sr.color;
}
public void Occupy(GameObject building)
{
isOccupied = true;
occupyingBuilding = building;
// Прячем визуал пустого участка, раз на нём теперь стоит здание
if (sr != null) sr.enabled = false;
}
public void Free()
{
isOccupied = false;
occupyingBuilding = null;
if (sr != null)
{
sr.enabled = true;
sr.color = emptyColor;
}
}
// Подсветка при наведении -- вызывается из BuildManager во время режима строительства
public void SetHighlight(Color color)
{
if (sr != null && !isOccupied)
sr.color = color;
}
public void ClearHighlight()
{
if (sr != null && !isOccupied)
sr.color = emptyColor;
}
}
// Вешается АВТОМАТИЧЕСКИ на построенное здание (кодом, не руками).
// Когда здание уничтожается любым способом (Destroy в коде, удаление
// в редакторе Inspector/Hierarchy, снос при апгрейде и т.д.) --
// OnDestroy сработает и освободит слот обратно.
public class BuildingSlotLink : MonoBehaviour
{
public BuildSlot linkedSlot;
void OnDestroy()
{
if (linkedSlot != null)
{
linkedSlot.Free();
}
}
}