ПроектыФорумОцените

Творческие выходные. 26 сентября 26 года.

Страницы: 1 2 Следующая »
#0
(Правка: 4 окт 2026, 11:59) 9:40, 26 сен 2026

Выкладывайте сюда созданные за неделю произведения. Сценарии, код, арт, музыку, 3Д модели и т.д. то на, что может возникнуть авторское право. Пост должен иметь творческий замысел создать игру. Предыдущая тема. Полные правила.
Изображение

#1
(Правка: 9:51) 9:42, 26 сен 2026

Новая ачивка «Маленький офис» для конкурса.  «Экономический симулятор» . Для тех кто создал минимально играбельную игру.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

using UnityEngine;
using System.Collections.Generic;

/// <summary>
/// Контролёр банкротства игрока.
/// Подписан на StatisticsData.OnPlayerBankruptChanged:
///   — если playerBankrupt становится 4 → проверяются условия:
///        1) счёт игрока ниже порога банкротства;
///        2) у игрока есть клетки для продажи.
///     Если оба выполнены → playerBankrupt = 3.
///     Если не выполнены → playerBankrupt = 0 (чтобы таймер не завис).
///   — если playerBankrupt == 3 → выбирается случайная клетка игрока
///     и записывается в gameState.activeCellIndex.
/// Также подписан на GameStateBaza.OnPlayerMoneyChanged:
///   — если флаг == 3 и изменился счёт → сбрасывается в 0
///     (взыскание завершено, деньги изменились).
/// </summary>
public class SeizureController : MonoBehaviour
{
    // ============================================================
    // 1. ССЫЛКИ И НАСТРОЙКИ
    // ============================================================

    [Header("Ссылки на менеджеры")]
    [SerializeField] private GameStateBaza gameStateReference;
    [SerializeField] private StatisticsData statisticsDataReference;

    [Header("Отладка")]
    [SerializeField] private bool enableLogs = false;

    // Приватные рабочие ссылки — заполняются в Awake
    private GameStateBaza gameState;
    private StatisticsData statisticsData;

    // ============================================================
    // 2. AWAKE — ИНИЦИАЛИЗАЦИЯ
    // ============================================================

    private void Awake()
    {
        // 2.1. Получить ссылки: приоритет — инспектор, затем синглтон
        gameState = (gameStateReference != null) ? gameStateReference : GameStateBaza.Instance;
        statisticsData = (statisticsDataReference != null) ? statisticsDataReference : StatisticsData.Instance;

        // 2.2. Проверка ссылок
        if (gameState == null)
        {
            Debug.LogError("SeizureController: GameStateBaza не найден!");
            return;
        }
        if (statisticsData == null)
        {
            Debug.LogError("SeizureController: StatisticsData не найден!");
            return;
        }

        // 2.3. Подписка на событие изменения счёта игрока
        gameState.OnPlayerMoneyChanged += OnPlayerMoneyChangedHandler;

        // 2.3.1. Подписка на событие изменения флага банкротства
        statisticsData.OnPlayerBankruptChanged += OnPlayerBankruptChangedHandler;

        if (enableLogs) Debug.Log("SeizureController: инициализирован, подписка на OnPlayerMoneyChanged и OnPlayerBankruptChanged.");
    }

    // ============================================================
    // 3. ОБРАБОТЧИКИ СОБЫТИЙ
    // ============================================================

    /// <summary>
    /// Реакция на изменение счёта игрока.
    /// Если флаг банкротства == 3 и пришло событие изменения счёта —
    /// сбрасывает флаг в 0 (взыскание завершено, деньги изменились).
    /// </summary>
    private void OnPlayerMoneyChangedHandler()
    {
        // 3.0. Если флаг == 3 и изменился счёт — сбрасываем в 0
        if (statisticsData != null && statisticsData.playerBankrupt == 3)
        {
            statisticsData.playerBankrupt = 0;

            if (enableLogs)
                Debug.Log("SeizureController: playerBankrupt == 3 и изменился счёт → playerBankrupt = 0.");
        }
    }

    /// <summary>
    /// Реакция на изменение флага банкротства.
    /// Если playerBankrupt == 4 — проверяются два условия:
    ///   1) счёт игрока ниже порога банкротства;
    ///   2) у игрока есть клетки для продажи (owner == 1).
    /// Если оба выполнены → playerBankrupt = 3.
    /// Если не выполнены → playerBankrupt = 0 (чтобы таймер не завис).
    /// Если playerBankrupt == 3 — запускается логика выбора случайной клетки
    /// и записи её в gameState.activeCellIndex.
    /// </summary>
    private void OnPlayerBankruptChangedHandler(int value)
    {
        if (enableLogs) Debug.Log($"SeizureController: OnPlayerBankruptChanged = {value}");

        // 3.1. Ловим 4 — определяемся с условиями
        if (value == 4)
        {
            // 3.1.1. Условие 1: счёт ниже порога банкротства
            bool isBelowThreshold = (gameState.playerMoney < statisticsData.bankruptcyCapital);

            // 3.1.2. Условие 2: есть ли у игрока клетки для продажи (owner == 1)
            bool hasSellableCells = false;
            foreach (var prop in gameState.properties)
            {
                if (prop.owner == 1)
                {
                    hasSellableCells = true;
                    break;
                }
            }

            if (enableLogs)
                Debug.Log($"SeizureController: условия — счёт ниже порога: {isBelowThreshold}, есть клетки: {hasSellableCells}.");

            // 3.1.3. Оба условия выполнены — ставим 3
            if (isBelowThreshold && hasSellableCells)
            {
                statisticsData.playerBankrupt = 3;
            }
            else
            {
                // 3.1.4. Условия не выполнены — сбрасываем в 0,
                //        чтобы цикл while (playerBankrupt != 0) в таймере завершился.
                statisticsData.playerBankrupt = 0;

                if (enableLogs)
                    Debug.Log("SeizureController: условия для взыскания не выполнены — playerBankrupt = 0.");
            }
        }

        // 3.2. Если флаг равен 3 — вызываем логику выбора случайной клетки
        if (value == 3)
        {
            SelectRandomPlayerCell();
        }
    }

    // ============================================================
    // 4. ВЫБОР СЛУЧАЙНОЙ КЛЕТКИ ИГРОКА
    // ============================================================

    /// <summary>
    /// Собирает список клеток, принадлежащих игроку (owner == 1),
    /// выбирает одну случайную клетку и записывает её номер
    /// в gameState.activeCellIndex.
    /// Перед записью делает сброс в 0, чтобы гарантированно вызвать
    /// событие OnActiveCellChanged, даже если номер совпал с текущим.
    /// </summary>
    private void SelectRandomPlayerCell()
    {
        // 4.1. Защита от отсутствия ссылок
        if (gameState == null) return;

        // 4.2. Создание перечня номеров клеток, принадлежащих игроку
        List<int> ownedCells = new List<int>();
        foreach (var prop in gameState.properties)
        {
            if (prop.owner == 1)
            {
                ownedCells.Add(prop.cellIndex);
            }
        }

        // 4.3. Если клеток нет — выходим
        if (ownedCells.Count == 0)
        {
            if (enableLogs) Debug.LogWarning("SeizureController: у игрока нет клеток для выбора.");
            return;
        }

        // 4.4. РАНДОМНЫЙ ВЫБОР ОДНОЙ КЛЕТКИ ИЗ СПИСКА
        int randomPos = Random.Range(0, ownedCells.Count);
        int randomCellIndex = ownedCells[randomPos];

        if (enableLogs)
            Debug.Log($"SeizureController: Для продажи выбрана случайная клетка №{randomCellIndex}.");

        // 4.5. Запись выбранной клетки в gameState.activeCellIndex.
        //      Через публичное свойство — сработает событие OnActiveCellChanged.
        // 4.5.1. Сначала сброс в 0, чтобы гарантированно вызвать событие,
        //        даже если randomCellIndex совпал с текущим activeCellIndex.
        gameState.activeCellIndex = 0;
        gameState.activeCellIndex = randomCellIndex;

        if (enableLogs)
            Debug.Log($"SeizureController: activeCellIndex = {randomCellIndex}.");
    }

    // ============================================================
    // 5. (метод удалён)
    // Проверка флага банкротства при изменении счёта больше не выполняется здесь.
    // Расчёт запускается через playerBankrupt = 4 из DisplayTimerBankruptcy.
    // Обработка — в OnPlayerBankruptChangedHandler (значения 4 и 3).
    // ============================================================

    // ============================================================
    // 6. ONDESTROY — ОТПИСКА ОТ СОБЫТИЙ
    // ============================================================

    private void OnDestroy()
    {
        if (gameState != null)
        {
            gameState.OnPlayerMoneyChanged -= OnPlayerMoneyChangedHandler;
        }
        if (statisticsData != null)
        {
            statisticsData.OnPlayerBankruptChanged -= OnPlayerBankruptChangedHandler;
        }
    }
}
#2
14:39, 26 сен 2026

   
#3
14:59, 26 сен 2026

slava-rusi11
Лучше сделай как раньше был скриншотник, ни каждую неделю отдельная тема, а одна постоянная. Так удобнее просматривать, а не искать по разделу прошедшие недели.

#4
16:30, 26 сен 2026

Plutonium
> Лучше сделай как раньше был скриншотник, ни каждую неделю отдельная тема, а одна постоянная. Так удобнее просматривать, а не искать по разделу прошедшие недели.
Думаю можно сделать помесячно. Просто название корректировать по недельным датам.

#5
16:30, 26 сен 2026

xlat-code
Зд модель слелаешь?

#6
17:15, 26 сен 2026

slava-rusi11
> Зд модель слелаешь?
легко!
но сначала мне нужно накопить дофаминовый долг.

тут подробности:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

#7
17:37, 26 сен 2026

xlat-code
> но сначала мне нужно накопить дофаминовый долг.
Копите, есть видео не на рутубе?

#8
20:50, 26 сен 2026

xlat-code
Можете сделать на юнити три в ряд?

#9
21:01, 26 сен 2026

slava-rusi11
> Можете сделать на юнити три в ряд?
о чем вы? вы же даже не можете мне набор звуков(< 200кб(!)) для тетриса принести...

как же я вам после этого сделаю три в ряд?!

#10
21:02, 26 сен 2026

xlat-code
> о чем вы? вы же даже не можете мне набор звуков для тетриса принести...
Да для меня это удручающий факт.

#11
22:28, 26 сен 2026

slava-rusi11
> Да для меня это удручающий факт.
вот опять всё как всегда - опять я - всё время я я я))

какие звуки были нам нужны и мне пришлось их в одну морду искать:
1. влево-вправо
2. вращение
3. стук об дно, стенки
4. стук об фигуры
5. краш линии

потратил полчаса(на найти и обрезать лишнее)
+
на внедрение в игру ещё полчаса
=
я проделал свою и вашу часть геймдева и теперь
в конкурсном тетрисе теперь появились звуки...

slava-rusi11
> Можете сделать на юнити три в ряд?
ок.
на этот раз какую часть работы вы хотите взять на себя(не на меня - на вас)?

#12
7:00, 27 сен 2026

xlat-code
> ок.
> на этот раз какую часть работы вы хотите взять на себя(не на меня - на вас)?
Вы правы, с вашей точки зрения я бездельник. Моя доминанта (вид мозгового контроля и распределения энергии) напрочь отказывается от любой работы за рамками её воли.
Я буду думать как сделать игру из этой механики. Придумав игру возможно буду кодить.

#13
0:06, 1 окт 2026
Изображение

3 из 10 с натяжкой

это текстовая картинка svg от заи.

#14
11:08, 1 окт 2026

xlat-code
> 3 из 10 с натяжкой
>
> это текстовая картинка svg от заи.
Я взялся за игру три в ряд. Дипсик написал первую механику.

Страницы: 1 2 Следующая »
ПроектыФорумОцените