Иконки и текстуры модов в Build 42
Иконки, текстуры и варианты состояния в Build 42
Руководство описывает иконки инвентаря, текстуры моделей, одежды и интерфейса, а также варианты состояния и цветовые маски. Страница адресована Build 42, но поведение и форматы нужно проверять на целевой версии игры.
Четыре типа изображений
| Тип | Расположение | Имя | Типичный формат в источнике | Что указывает на изображение |
|---|---|---|---|---|
| Иконка предмета | media/textures/ | Item_<Icon>.png | 32×32, RGBA с прозрачностью | Icon = <Icon> в скрипте предмета |
| Текстура модели | media/textures/ или подкаталоги | Любое | 512×512 или 256×256, RGB | texture = <имя> в model скрипта |
| Текстура одежды | media/textures/... | Любое | Зависит от UV тела | XML-файл предмета одежды (модуль 05) |
| Изображение интерфейса | media/ui/ | Любое | Любое | Lua: getTexture("media/ui/...png") |
В качестве примеров собственных модов автор приводит Tocomples Food: 161 текстура, иконки Item_*.png размером 32×32 RGBA и текстуры моделей 512×512 RGB; Catimbas хранит иконки в Contents/mods/Catimbas/common/media/textures/ и использует common/ для ресурсов; Emote Bubbles загружает кадры анимации из media/ui/EmoteBubbles/<id>_<n>.png через Lua. Это примеры из описания автора, а не независимый аудит.
Имена иконок и варианты состояния
При Icon = CompletoItaliano движок ищет текстуру Item_CompletoItaliano. По источнику, без префикса Item_ появится иконка со знаком вопроса.
Для еды, как утверждает автор, движок ищет варианты по суффиксу без отдельного объявления в скрипте:
| Состояние | Искомая иконка | Пример из статьи |
|---|---|---|
| Обычное | Item_X.png | Item_BarrosJarpa.png |
| Испорченное | Item_XRotten.png | Item_BarrosJarpaRotten.png |
| Приготовленное | Item_XCooked.png | Item_HamburguesaCooked.png |
| Подгоревшее | Item_XBurnt.png | Item_HamburguesaBurnt.png |
В руководстве описан похожий шаблон для моделей: файл Tocomples Food CompletoItaliano.txt задаёт model CompletoItaliano и model CompletoItalianoRotten с texture = CompletoItalianoRotten; игра, согласно статье, выбирает испорченную модель, когда нужно.
Варианты без новых текстур
| Поле предмета | Описанное действие | Пример из статьи |
|---|---|---|
| IconsForTexture = A;B;C | Отдельная иконка для каждого варианта текстуры одежды; индекс соответствует textureChoices в .xml. | Glasses_Normal: GlassesBlack;GlassesBlue;GlassesRed |
| IconColorMask = X | Окрашивает маску в цвет предмета. | Lipstick: IconColorMask = Lipstick_Mask |
| IconFluidMask = X | Окрашивает маску в цвет жидкости внутри. | Бутылки и вёдра |
| ColorRed/Green/Blue | Окрашивает предмет. | В источнике указано 131 предмет |
С IconColorMask статья предлагает использовать одну серую иконку и маску, чтобы получать разные цвета без отдельных изображений для каждого варианта.
Текстуры игры в архивах .pack
Автор утверждает, что базовые текстуры игры находятся в упакованных атласах media/texturepacks/*.pack, а не в отдельных PNG-файлах; поэтому Item_Apple.png нельзя найти в обычном каталоге.
Чтобы посмотреть текстуру без распаковки, источник указывает на TextureViewer в режиме отладки (lua/client/DebugUIs/TextureViewer.lua). В Lua-консоли можно запросить getTexture("Item_Apple"): по описанию статьи, вернётся объект, если текстура есть, иначе nil. Для отдельного файла пример такой: getTexture("media/ui/TargetPos.png").
Если использовать текстуру игры на своей модели, автор советует ссылаться на неё по имени, а не копировать. Изменённую текстуру следует включать в мод под другим именем.
Правила, помогающие избежать проблем
- Используйте PNG. Автор отмечает, что в отдельных случаях игра читает другие форматы, но его моды используют PNG.
- Для текстур моделей выбирайте степени двойки, например 256, 512 или 1024; источник объясняет это ожиданиями GPU и практикой игры.
- Для иконок нужна прозрачность в альфа-канале, а не белый фон.
- Используйте уникальные имена с префиксом мода, например Catimbas_... . По статье, игра и все моды используют общее пространство имён; при двух файлах Item_Pan.png выигрывает загруженный последним.
- У игры есть кэш текстур: после изменения PNG перезапустите игру.
Упражнения
Упражнение 4.1 · Иконки состояний
Создайте для Sopaipilla обычную и испорченную иконки. Если предмет можно готовить с помощью IsCookable = true, MinutesToCook и MinutesToBurn, добавьте варианты приготовленного и подгоревшего состояния. Ускорьте время и используйте плиту, чтобы проверить все четыре вида.
Упражнение 4.2 · Существует ли текстура?
В Lua-консоли напишите CursoLab.tex(nombre), чтобы выводить наличие текстуры и её размер через getWidth() и getHeight(). Проверьте Item_Apple, Item_Sopaipilla и несуществующее имя. В упражнении нужно различить все три случая и сохранить функцию в CursoLab_Core.lua для отладки.
Решение из статьи приведено без изменений. Оно зависит от CursoLab и не запускалось:
function CursoLab.tex(name)
local t = getTexture(name)
if not t then
CursoLab.log("NO existe:", name)
else
CursoLab.log(name, t:getWidth() .. "x" .. t:getHeight())
end
return t
end
Упражнение 4.3 · Одна иконка — много цветов
Создайте CursoLab.Pañuelo с серой иконкой, маской IconColorMask и тремя цветовыми вариантами. Критерий — три платка выглядят по-разному, используя одну пару PNG.
Упражнение 4.4 · Перекрыть текстуру и отменить изменение
- Добавьте в CursoLab собственный Item_Apple.png с синей яблоком.
- Проверьте результат в игре и объясните, почему он работает, хотя исходная текстура игры упакована в .pack.
- Удалите файл и запишите, когда мод должен намеренно поступать так.
Задача со звёздочкой 4
Напишите pzicons.py, который перебирает скрипты мода и сообщает об Icon = X без соответствующего Item_X.png, еде без иконки Rotten и PNG в textures/, который нигде не используется. Проверьте его на Tocomples Food и Catimbas.