Синтаксис Int-Mod-а

» опубликован
Читай на DevTribe.ru!

Долго делается новый билд, ой как долго.
Однако, часть задуманного реализована на уровне "на данный момент этого достаточно". И как раз об одной такой части напишу сейчас.
В рамках скриптов и переменных называется эта штука 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) могут такое.
И так. Описание одного элемента является таким:
<ключевое имя>
<выравнивание по 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 и положили в ту самую папку.

Что дальше?

Так же в будущем, при работе над новыми интерфейсами функции добавятся, а то и изменяться.
А пока я Вас прошу дождаться (если ждёте) новую демку (которая уже будет чуть ли не 2.5! А не 2.3! Столько там нового в техническом плане, да и контента больше! Чуть ли не полноценная релизная версия 3.0).
И не забывайте, что с приходом этой демки мне нужны будут ваши души ... ну вы понимаете, да? :)

 

Просмотров: 597

alexprey #1 - 1 год назад 2
Новый интерфейс огонь, прям Diablo Like, одобрямс. Хотя формат не очень привлекательный, потому что при расширении его могут возникнуть проблемы с обратной совместимостью. Поэтому то и было бы удобнее выбирать что-то на подобии Json или Xml за основу
Просто я сам уже неоднократно сталкивался с такой проблемой расширяемости.
Doc #2 - 1 год назад 0
Очередной велосипед. Никак не расширяется, кастомный синтаксис, который нужно учить и запоминать. Сделать что-то посложнее десяти кнопок с картинками запаришься, т.к. лэйаутов нет. Классы прописываются в коде, т.е. все жестко забито. Если эта штука только для того чтобы юзер мог как в вове потаскать интерфейс по экрану - непонятно зачем такие сложности и возможности.
Может быть я что-то не понял.
DarkDes #3 - 1 год назад (отредактировано ) 0
Новый интерфейс огонь, прям Diablo Like, одобрямс.
Спасибо :)
Да, формат не очень торт. В принципе можно было бы наверно на json как-то это дело перевести потом. JSON из коробки в ГеймМейкере есть, а так бы я свой старый css-like перетащил.
Вот json кажется более удобным, скорее всего. Да и более того - можно будет просто прописывать какой-то особый флаг типа "#json-code" и парсить тот же файл как json, допустим.
Никак не расширяется, кастомный синтаксис, который нужно учить и запоминать.
Да, синтаксис на определённую последовательность команд это ведь вам не простецкий Си, ага :D
Ну за менее, чем неделю разработок (на самом деле дня 2-3 может, просто я растянул это дело) хотите ещё заодно и набор тулзов? Не исключаю, что в релизе таки может быть что-то подобное и тогда "ой много учить!" не надо будет - записал в бинарик\текстовик по образу и подобию и радуешься :)
Классы прописываются в коде, т.е. все жестко забито.
А вот теперь я что-то не понял. Есть другие способы? Нет, я реально не понял.
Doc #4 - 1 год назад (отредактировано ) 0
Ну если это модульная/расширяемая штука видимо стоит к ней прикрутить какой-нибудь простецкий скриптовый язык?
Все же вон уже есть в браузерах, а вы придумываете, есть статический шаблон (html), стили (css), расширения и динамика (js).
Я бы даже пошел дальше и просто взял что-то вроде www.awesomium.com, хотя связку html/css я всей душой презираю.
DarkDes #5 - 1 год назад 0
Doc, а теперь всё это привяжите к GameMaker Studio так, чтобы можно было потом перетащить на свой кастомный двыжок :)
Если бы я мог двумя строчками "сделать круто", то я бы так и сделал.
И про скриптовый язык аналогично - это ой как не просто будет.
Но основную мысль я понял короче. Никому это не надо кроме меня, в чём собственно я не сомневался, но требовал доказательств :)