Давно участвовали в Dungeon Crawler Jam 2023 и сделали игру про шахматы (отчасти). Она вышла сыроватой, но с потенциалом и интересной концепцией. Мы ее сильно изменили, оставив основные элементы, и теперь планируем выкладываться в стиме. На итче можно поиграть в старую версию игры. Здесь буду выкладывать некоторые новости и инсайды по игре.
Уже сделано: Редактор уровней Интеллект всех фигур Техническая часть руки игрока Обновленный визуал локаций * Новые геймплейные системы, улучшающие игровой опыт
кстати, при работе над картой invasion возник баг, на который пришлось потратить несколько часов на исправление.
в чем суть: почти все в проекте работает через шину событий. карта invasion подписана на шину и имеет одну реакцию на событие входа в комнату, в которой прописано, что все непешки умирают, а на их месте спавнятся пешки (а при спавне любая фигура сразу подписывается на шину событий). в итоге получается ситуация, что во время рассылки событий появлялись новые подписчики. код проходит по списку подписчиков методом ForEach, который не допускает модификаций списка, всякий раз вызывая ошибку.
использование расходников у нас реализовано перетаскиванием карты в центр экрана (происходит проверка отпускания лкм каждый кадр, при успешной проверке активируется эффект карты и она пропадает). проблема в том, что карта invasion выдает исключение при использовании, поэтому действие использования карты не может завершиться до конца, по итогу карта висит на экране и каждое обновление кадра действие этой карты вызывается до тех пор, пока не произойдет переполнение памяти.
для решения этой проблемы я ввел переменную, которая отражает глубину вызовов событий. при обработке события, не вызванного другим событием, переменная равна 0, ее значение увеличивается на единицу при обработке следующего связанного события, и вычитается на единицу после того, как все подписчики получили событие. по сути, переменная отражает количество событий в цепочке, которое привело к обработке текущего события.
теперь проблему со спавном фигур описать проще: если глубина события во время регистрации какого-либо подписчика больше нуля, то вызывается ошибка, так как в этот момент идет раздача событий. чтобы это исправить, я добавил проверку этой переменной в начало метода регистрации подписчика: если она равна 0, то регистрация происходит прямо сейчас, а если нет, то она откладывается до момента, пока обработка всех событий на закончится.
в итоге я и карту сделал, и весь код шины переписал