Выкладывайте сюда созданные за неделю произведения. Сценарии, код, арт, музыку, 3Д модели и т.д. то на, что может возникнуть авторское право. Пост должен иметь творческий замысел создать игру. Предыдущая тема. Полные правила.
Новая ачивка «Маленький офис» для конкурса. «Экономический симулятор» . Для тех кто создал минимально играбельную игру.
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;
}
}
}slava-rusi11
Лучше сделай как раньше был скриншотник, ни каждую неделю отдельная тема, а одна постоянная. Так удобнее просматривать, а не искать по разделу прошедшие недели.
Plutonium
> Лучше сделай как раньше был скриншотник, ни каждую неделю отдельная тема, а одна постоянная. Так удобнее просматривать, а не искать по разделу прошедшие недели.
Думаю можно сделать помесячно. Просто название корректировать по недельным датам.
xlat-code
Зд модель слелаешь?
slava-rusi11
> Зд модель слелаешь?
легко!
но сначала мне нужно накопить дофаминовый долг.
тут подробности:

xlat-code
> но сначала мне нужно накопить дофаминовый долг.
Копите, есть видео не на рутубе?
xlat-code
Можете сделать на юнити три в ряд?
slava-rusi11
> Можете сделать на юнити три в ряд?
о чем вы? вы же даже не можете мне набор звуков(< 200кб(!)) для тетриса принести...
как же я вам после этого сделаю три в ряд?!
xlat-code
> о чем вы? вы же даже не можете мне набор звуков для тетриса принести...
Да для меня это удручающий факт.
slava-rusi11
> Да для меня это удручающий факт.
вот опять всё как всегда - опять я - всё время я я я))
какие звуки были нам нужны и мне пришлось их в одну морду искать:
1. влево-вправо
2. вращение
3. стук об дно, стенки
4. стук об фигуры
5. краш линии
потратил полчаса(на найти и обрезать лишнее)
+
на внедрение в игру ещё полчаса
=
я проделал свою и вашу часть геймдева и теперь
в конкурсном тетрисе теперь появились звуки...
slava-rusi11
> Можете сделать на юнити три в ряд?
ок.
на этот раз какую часть работы вы хотите взять на себя(не на меня - на вас)?
xlat-code
> ок.
> на этот раз какую часть работы вы хотите взять на себя(не на меня - на вас)?
Вы правы, с вашей точки зрения я бездельник. Моя доминанта (вид мозгового контроля и распределения энергии) напрочь отказывается от любой работы за рамками её воли.
Я буду думать как сделать игру из этой механики. Придумав игру возможно буду кодить.
3 из 10 с натяжкой
это текстовая картинка svg от заи.
xlat-code
> 3 из 10 с натяжкой
>
> это текстовая картинка svg от заи.
Я взялся за игру три в ряд. Дипсик написал первую механику.