О системе
LUA ToastBuilder - кастомизируемая система уведомлений для WarCraft 3, написанная на Lua. Она поддерживает личные очереди для каждого игрока, умное слияние однотипных сообщений и замену устаревших тостов по общему ключу. Также доступны прогресс-бары (в том числе сегментированные) с плавной анимацией, звуковое сопровождение и гибкая настройка стилей в отдельном модуле - всё это позволяет избавиться от спама и сделать игровой интерфейс информативным, динамичным, лаконичным.
Вводное
Для своей карты "Divine Roguelike" навайбкодил несколько новых систем. Буду постепенно их выкладывать, если кому интересно.
Я адекватно оцениваю свои скилы, и понимаю, что без вайбкода я бы такого не сделал. Поэтому если обнаружите ошибки, риски для синхронизации, неоптимальные пути - дайте об этом знать, пожалуйста. Я со своей стороны в меру своих навыков постарался свести к минимуму зависимость от синхронности, возможость утечек и т. д..
Из-за ошибок в моём проекте на XGM, я не могу обновлять карту в её родном посте. Я писал в поддержку. Но мне не ответили. Поэтому вместо ссылки на проект я выложу последнюю версию карты прямо сюда (она открытая).
Я адекватно оцениваю свои скилы, и понимаю, что без вайбкода я бы такого не сделал. Поэтому если обнаружите ошибки, риски для синхронизации, неоптимальные пути - дайте об этом знать, пожалуйста. Я со своей стороны в меру своих навыков постарался свести к минимуму зависимость от синхронности, возможость утечек и т. д..
Из-за ошибок в моём проекте на XGM, я не могу обновлять карту в её родном посте. Я писал в поддержку. Но мне не ответили. Поэтому вместо ссылки на проект я выложу последнюю версию карты прямо сюда (она открытая).
Особенности
Кастомизируемый механизм уведомлений, среди особенностей:
- Очередь ожидания. Новые уведомления не отображаются, пока очередь не освободится. У каждого игрока своя личная очередь. Допустимо смешивание личных и общих уведомлений.
- Слияние однотипных уведомлений. Например, два уведомления "+50 опыта" и "+100 опыта" полученные за короткое время сливаются в "+150 опыта".
- Замена уведомлений общего потока. Например, при быстром убийстве квестовых волков уведомление "убито 1/3 волков" заменится уведомлением "убито 2/3 волков", а затем заменится уведомлением "квест выполнен", а затем "награда за квест". Все эти тосты объединены одним общим ключём, который позволяет не держать на экране спам устаревшей информации. Достигается комбинацией тоста key=AnyQuest (строка, хэндл или объект), + replace = true
- Ожидание уведомлений общего потока. Тост с указанным ключём не отобразится пока игркоу отображаются другие уведомления с этим ключём. Например единомоментно можно создать два уведомления "вы вошли в опасную зону", "уровень противников и лута повышен", которые отобразятся друг за другом, но не одновременно. У разных игроков эти тосты могут отобразиться в разное время, если, например, у них были какие-то локальные тосты или если забита очередь. Достигается комбинацией key="extraDanger" + replace = true (тост заменит тотс с аналогичным key) + waitKey = true (но перед добавлением или заменой тост дождётся пока другой тост с тем же key не исчезнет), + (опционально) waitKeyFade = true (вместо того, чтобы ждать полного исчезновение предыдущего тоста, он будет ждать когда предыдущий тост только запустит анимацию исчезновения и в этот момент его заменит),
- Прогресс-бары на уведомлениях. Сплошные и сегментированные. Задаётся на уровне стилей. Например, к тосту "убито 3 из 7 волков" можно присобачить сегментированный прогресс-бар, которые состоит на самом деле из 7 мини-прогресс баров, 3 из которых заполнены. При желании можно заполнить нецелое количество. Например "пройдено 50% волны 2/3" можно заполнить сегментированный прогресс-бар на 2.5, в этом случае 2 бара заполнятся полностью, а 3-й бар будет заполнен наполовину.
- Плавная анимация заполнения баров при замене тостов. Если тосты друг друга заменяют, и у них отличаются значения текущего прогресс-бара - то в новом тосте бар заполнится постепенно от предыдущего значения. Хорошо работает в том числе и при многократном спаме однотипных уведомлений (например, если за раз убить 7 волков - то прогресс красиво заполнится от 1-го до 7-го).
- Прочие красивые анимации. Например, при замене тоста - его иконка всплывает.
- Звуковое сопровождение - для разных стилей можно настроить разные звуки появления. Например, "квест получен", "предупреждение" и т. д.
- Стили тостов и константы настраиваются в отдельном модуле. Можно создавать свои стили тостов и вызывать их.
- 10-го пункта нет, просто не хотелось останавливаться на цифре 9.
Пример:
Скрипты системы тостов находятся в двух обязательных файлах:
ToastsConfig.lua
Toasts.lua
(именно в таком порядке)
Затем следуют скрипты самой карты, которая использует эту систему. В частности "RoguelikeToasts.lua" содержит удобные спецефичные функции для использования в данной карте. Их можно разобрать как пример. В них переиспользуются {} чтобы свести к минимуму динамичное создание таблиц во время игры.
ToastsConfig.lua
Toasts.lua
(именно в таком порядке)
Затем следуют скрипты самой карты, которая использует эту систему. В частности "RoguelikeToasts.lua" содержит удобные спецефичные функции для использования в данной карте. Их можно разобрать как пример. В них переиспользуются {} чтобы свести к минимуму динамичное создание таблиц во время игры.
Примеры вызова тостов:
local testQuest = {} -- квест-заглушка
local toastOptions = {
style = "taskUpdated",
key = testQuest,
replace = true, -- заменит уже существующие тосты квеста TestQuest
duration = 4, -- время жизни тоста с момента его отображения или замены
icon = "ReplaceableTextures\\CommandButtons\\BTNTimberWolf.blp",
title = "Просьба одной курицы",
text = "Убито волков 1/7",
progressCurrent = 1,
progressMax = 7
}
Toasts.show(toastOptions)
... спустя пару секунд ...
local toastOptionsComplete = {
style = "taskCompleted",
key = testQuest,
replace = true, -- заменит уже существующие тосты квеста TestQuest
duration = 4, -- время жизни тоста с момента его отображения или замены
icon = "ReplaceableTextures\\CommandButtons\\BTNTimberWolf.blp",
title = "Просьба одной курицы",
text = "Все волки убиты!",
progressCurrent = 1,
progressMax = 1
}
Toasts.show(toastOptionsComplete)
(Примечание, чтобы постоянно не пересоздавать таблицы - можете их переиспользовать, меняя параметры. Это не вызовет ошибок).
Если игрок за короткое время будет убивать двух монстров из двух разных квестов - то тосты двух квестов не будут друг друга перекрывать и их уведомления будут отображаться паралельно.
WC3





Ред. Cancel
Ред. Cancel
У меня это отбило всякое желание здесь что-то размещать.
Я запрошу удаление поста.
а то я встану
ну зато годных проектов станет больше
В будущем, лет через 10, возможно, ситуация поменяется.
А то, что у некоторых не получается с их помощью делать что-то путное - это вопрос не к нейронке, а к человеку. Ты же не будешь винить молоток в том, что ты с его помощью не смог забить гвозь. Это лишь инструмент, а не волшебная палочка.
Я об этом писал в статье "Комплекс Кроноса" habr.com/ru/companies/miip/articles/1051806
Иронично, что я в этой статье выразил свой страх о том, что нас заменят нейросети, и что их работа вскоре ни чем не будет уступать нашей. А в комментариях меня заподозрили, что я эту статью написал черз нейросет, лишний раз подвердив мои опасения.
Что упомянуто с конкретными именами/датами — но это общеизвестная история науки:
Что упомянуто по существу нашей темы — и без единой ссылки: