Добавлен DarkDes,
опубликован
Долго делается новый билд, ой как долго.
Однако, часть задуманного реализована на уровне "на данный момент этого достаточно". И как раз об одной такой части напишу сейчас.
Однако, часть задуманного реализована на уровне "на данный момент этого достаточно". И как раз об одной такой части напишу сейчас.
В рамках скриптов и переменных называется эта штука Int-Mod от Interface Modification.
История
На самом деле, первые рабочие прототипы писал я на Си++ несколько лет назад. Они не были предназначены для редактирования пользователем (только лишь в каких-то конкретных проектах). Хотя никакой "защиты" или "шифрования" не было, а значит в теории, если пользователь знал что к чему, то он смог бы отредактировать интерфейс так, как ему удобно.
В своей оригинальной пост-конкурсной задумке Взертос должен был подключать DLL от части "движка" и загружать те самые интерфейсы, которые придуманы были какое-то время назад. И скажу я лишь то, что файл интерфейса больше походил на мутанта-CSS.
Конечно в конечном итоге я отказался от идеи с DLL, а вот сейчас пишу этот текст и понимаю насколько всё было бы сложнее так реализовать.
Как работает сейчас
От сложного к простому. Не стал я нести за собой CSS-like синтаксис и ограничился ключевым словом-именем и строкой параметров с неопределённой длинной (но с минимально необходимой).
Таким образом описание элемента состоит из двух обязательных строк, вот пример:
#medita-bar
CENTER BOTTOM 34 -24 -1 -1 0 "vz1/medita-bar.png" null 0 0 BAR MAX_RIGHT
Синтаксис и описание
Этот ресурс-статья (это статья? не помню как делать статью на самом деле) предназначен для того, чтобы открыть людям хоть часть синитаксиса этого "очень крутого" скрипта-файла.
Возможно, что эта фича кроме меня никому и не нужна, но думаю её наличие как минимум делает игру реально с фичей. Я не могу припомнить игры, которые это бы позволяли без явных модов. Вполне возможно, что игры на idTech (а следовательно на goldSource и может быть Source) могут такое.
Возможно, что эта фича кроме меня никому и не нужна, но думаю её наличие как минимум делает игру реально с фичей. Я не могу припомнить игры, которые это бы позволяли без явных модов. Вполне возможно, что игры на idTech (а следовательно на goldSource и может быть Source) могут такое.
И так. Описание одного элемента является таким:
<ключевое имя>
<выравнивание по X> <выравнивание по Y> <смещение по X> <смещение по Y> <размер по X> <размер по Y> <угол поворота> <путь к файлу> <текст> <точка пивота X> <точка пивота Y> <класс> <параметр класса>
- ключевое имя - его значение очень важно для игры и обязательно должен начинаться с символа "#"
- выравнивание по X - без учёта ширины элемента т.е. по сути устанавливает где будет точка отсчёта по Х, может иметь значение LEFT, CENTER или RIGHT.
- выравнивание по Y - без учёта высоты элемента, аналогично как и выше, но имеет значение TOP, CENTER или BOTTOM.
- смещение по X\Y - тут всё просто, по сути offset относительно выравнивания. (Не финальная позиция на экране!)
- Размер по X\Y - определяет размер в пикселях, если задано изображение, то оно будет растянуто. Может иметь значение -1 и тогда размер будет подогнан под размер указанного изображения.
- угол поворота - это думаю понятно. Стоит отметить, что на данный момент нельзя повернуть текст и некоторые другие элементы, но изображения 100% поворачиваются.
- путь к файлу - это есть путь к файлу изображения относительно текущего файла описания. Может быть либо null, либо обязательно в кавычках содержать путь к изображению, которое будет присвоено этому элементу. Так же после пути (но всё ещё в кавычках) можно указать кол-во кадров анимации (какие-то элементы это могут требовать) через спец символ "?", после которого будет число кадров.
- текст - очевидно. Может быть null, если он не нужен. Или же пустая строка. Тоже обязательно быть в кавычках. Важно отметить, что для определённых элементов текст хоть и меняется "процедурно", но важно его содержание на этапе "компиляции", например, для показателей жизни, кол-ва бутылок с ХП или других аналогичных параметров наличие в тексте символа "/" даёт текст вида "кол-во текущее / кол-во максимальное".
- точка пивота X\Y - в первую очередь нужна для вращения. Т.е. устанавливается некоторая точка (offset относительно 0 элемента) сдвига, на данный момент имеет мало смысла.
- класс - определение класса, а следовательно и поведения элемента. На данный момент работают: BAR, ICON, SKILLPOOL+GROWSEL, SKILLPOOL+FIXSEL, SURFACE, TIPROUND.
- параметры класса - значения необходимые для конкретного класса, таким пока является лишь BAR.
Обязательными являются параметры до текста включительно, начиная с пивот-пойнта не обязательны.
Пример:
Пример:
#backpack-button
CENTER BOTTOM -248 -60 -1 -1 0 "vz1/backpack-button.png?3" null 0 0
#health-potion-count
CENTER BOTTOM -61 -60 11 10 0 null "X"
#medita-potion-count
CENTER BOTTOM 49 -60 11 10 0 null "X/MX"
#weapon-ammo
CENTER BOTTOM -213 -18 -1 -1 0 "vz1/stamina-bar.png" "X/MX" 0 0 BAR MIN_CENTER_X
Организация файлов
На данный момент имеется лишь один новый интерфейс на данной системе. В планах (в релизе) думаю будет пять таких. Все будут разными, а один даже очень спорный.
В данном интерфейсе практически каждый элемент хранится отдельно (изображение в смысле), что позволит легко делать "форки". Конечно можно сделать "монолитный" интерфейс т.е. сохранить свой "задний фона интерфейса" отдельным изображением и как следствие отдельным единственным элементом, накидав лишь интерактивные вроде полоски здоровья, кол-ва патронов и т.п.
Структура или организация файлов для интерфейса очень простая:
Возле ехе с игрой есть папка interfaces внутри которой либо будут файлы типа ZIP с именами интерфейса, либо просто папки, которые опять же будут обозначать имя интерфейса. Все файлы изображений и обязательный главный файл интерфейса interface.ilf будет хранится именно там.
Таким образом "расшаривание" интерфейсов должно быть очень простым и удобным - скачали ZIP и положили в ту самую папку.
Возле ехе с игрой есть папка interfaces внутри которой либо будут файлы типа ZIP с именами интерфейса, либо просто папки, которые опять же будут обозначать имя интерфейса. Все файлы изображений и обязательный главный файл интерфейса interface.ilf будет хранится именно там.
Таким образом "расшаривание" интерфейсов должно быть очень простым и удобным - скачали ZIP и положили в ту самую папку.
Что дальше?
Так же в будущем, при работе над новыми интерфейсами функции добавятся, а то и изменяться.
А пока я Вас прошу дождаться (если ждёте) новую демку (которая уже будет чуть ли не 2.5! А не 2.3! Столько там нового в техническом плане, да и контента больше! Чуть ли не полноценная релизная версия 3.0).
И не забывайте, что с приходом этой демки мне нужны будут ваши души ... ну вы понимаете, да? :)
А пока я Вас прошу дождаться (если ждёте) новую демку (которая уже будет чуть ли не 2.5! А не 2.3! Столько там нового в техническом плане, да и контента больше! Чуть ли не полноценная релизная версия 3.0).
И не забывайте, что с приходом этой демки мне нужны будут ваши души ... ну вы понимаете, да? :)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Просто я сам уже неоднократно сталкивался с такой проблемой расширяемости.
Отредактирован DarkDes
Да, формат не очень торт. В принципе можно было бы наверно на json как-то это дело перевести потом. JSON из коробки в ГеймМейкере есть, а так бы я свой старый css-like перетащил.
Вот json кажется более удобным, скорее всего. Да и более того - можно будет просто прописывать какой-то особый флаг типа "#json-code" и парсить тот же файл как json, допустим.
Ну за менее, чем неделю разработок (на самом деле дня 2-3 может, просто я растянул это дело) хотите ещё заодно и набор тулзов? Не исключаю, что в релизе таки может быть что-то подобное и тогда "ой много учить!" не надо будет - записал в бинарик\текстовик по образу и подобию и радуешься :)
Отредактирован Doc
Если бы я мог двумя строчками "сделать круто", то я бы так и сделал.