Содержание   <<< Назад   Далее >>>

Динамическое описание



В ядре существует система динамического описания. Она позволяет в обычных текстах, которые отправлются игроку в клиент, описывающих объекты, мобов, персонажей, комнаты и т.д, использовать теги(скрипты), которые могут изменять содержимое текста, в зависимости от различных параметров. Также динамическое описание может изменять цвета выводимых текстов и форматировать вывод текста.

В тегах динамического описания используются следующие основные символы : [ ] ( ) { } < > $ # % ~
Фигурные, квадратные, круглые и угловые скобки относятся к скриптам динамического описания, остальные к тегам форматирования.

В системе динамического описания существует такое понятие, как сцена. Во время работы скриптов динамического описания, ядро смотрит какие сущности в ней участвуют и использует их параметры для своей интерпретации. В сцене могут участвовать: персонаж, моб, объект, комната, мир, зона, подзона (и позднее может появится чтонибудь еще). Следует заметить, что в сцене не могут одновременно участвовать моб и объект одновременно, т.к. динамическое описание - текст конкретного объкта или моба по отношению к персонажу. Персонаж видит объект с помощью тега динамического описания, и логично предположить, что объект и моб никак не могут влиять друг от друга, на то как их видит персонаж. Остальные сущности (мир, зона, комната, и т.д.) могут сосуществовать с объектами и мобами, т.к. являются составной их частью (местоположение например).

Скрипты динамического описания : [ ] , { }

Квадратные скобки предназначены для работы со "своими" стейтами, т.е. они используются для связи значений одних стейтов сущности с другими. Пояснение: если скрипт работает относительно объекта (т.е. скрипт принадлежит объекту, например методы воздействия на него), то использование квадратных скобок - это работа с стейтами этого объекта. Соответственно, скрипт моба, работает с стейтами моба, персонажа - со стейтами персонажа.
Фигурные скобки - это стейты перcонажа, который участвует в сцене, т.е. кому придназначается текст этого динамического описания. Квадратные скобки в скриптах, принадлежащих персонажу идентичны по функционалу фигурным скобкам.

Форматы использования:
  • Начало фразы [имя_стейта] продолжение фразы
  • Начало фразы [имя_стейта|условие1:текст1|условие2:текст2|...] продолжение фразы


  • В первом случае - вместо скрипта [имя_стейта] будет подставлено значение этого стейта.

    Во втором случае - происходит проверка цепочки условий на их выполнение. Сначала идет имя стейта, которое нужно проверять. Далее идут условия и тексты. Если какое-либо условие выполняется то вместо скрипта [имя_стета...] будет подставлена строка(текст после двоеточия) этого условия. Если ни одно условие не выполнилось, то вместо скрипта ничего не подставляется (пустая строка). Условия обрабатываются слева направо, до первого выполнившегося условия. Следует заметить, что между именем стейта, условиями и текстами нет пробелов!!! Вертикальные черточки '|' используются только для разделения элементов для наглядности.

    Пример, вариант использования 1:
    
    Вас зовут : [name], [race]. Ваш возраст : [age]. Вы достигли уровня: [level]
    
    В этом примере подставляются значения стейтов в строку, т.е. соответственно подставляются имя, возраст и уровень.

    Пример, вариант использования 2 (часть файла со стейтами):
    
    <state id="race" type="switch">
      <case id="homo">[gender=male:мужчина=female:женщина]</case>
      <case id="orc">ор[gender=male:к=female:чиха]</case>
      <case id="elf">эльф[gender=female:ия]</case>  
    </state>
    
    Данный пример работает со "своими" стейтами. В тегах анализируется пол и в зависимости от этого подставляется нужное окончание.

    В скриптах динамического описания есть следующие операции (которые можно использовать по примеру использования 2):
  • / или < - меньше
  • \ или > - больше
  • /= или <= - меньше или равно
  • \= или >= - больше или равно
  • = - равно
  • ~= - не равно


  • Примечание: Так как знаки меньше(<) и больше(>) являются знаками скобок тегов XML, то их нельзя использовать напрямую в тегах динамическог описания, если эти знаки не внутри Lua-скрипта в секции CDATA. Вместо них используются / и \. Знаки < и > при необходимости можно использовать, но только с помощью специального их написания. Специальные написания симолов меньше и больше выглядят так: &lt; и &gt;

    Скрипты динамического описания : ( )

    Круглые скобки в динамическом описании используются для вывода названий(описаний) стейта. Если посмотреть на формат файлов стейтов, то там можно увидеть атрибут name, текст-значения которого и выводится с помощью скрипта динамического описания в скобках '(', ')'.

    Механизм работы данных скриптов, лучше показать на примере:

    Пример возможного файла стейтов:
    
    <state id="name" type="string" name="имя"/>
    
    <state id="age" type="number" name="возраст"/>
    
    <state id="flags" type="group" name="флаги">
      <case id="light" name="светится"/>
      <case id="visible" name="видим(о|а|)"/>
    </state>
    
    <state id="material" type="switch" name="материал">
      <case id="wood" name="дерев(о|у)">деревянн[gender?male:ый?female:ая?neuter:ое]</case>
      <case id="mifril" name="мифрил">мифрилов[gender?male:ый?female:ая?neuter:ое]</case>
    </state>
    

    Форматы использования:

  • (имя стейта) - имя стейта в круглых скобках выводит 'главное' имя стейта - это текст в атрибуте name, тега state.

  • (имя стейта?[номер окончания][|окончание по умолчанию]) - имя стейта в круглых скобках, которое заканчивается знаком '?', отображает уже имя, учитывая значение стейта. Работает соответственно только для типов group и switch, т.к. только у них есть имена, связанные со значением. После знака '?' может идти число (оно не обязательно). Это число обозначает номер окончания, для имени стейта, которое нужно подставить в конце. Номера окончаний начинаются от 1. Сами окончания пишутся в теге name в файле стейтов в круглых скобках через вертикальную черту '|', в примере это : <case id="wood" name="дерев(о|а)"> или <case id="visible" name="видим(о|а|)"/>. Если номер окончания (после знака '?') опущен, равен 0 или он больше, чем их есть в списке окончаний, то окончание опускается и не печатается. Однако есть возможность задать окончание по умолчанию (оно также не обязательно). Окончание по умолчанию пишется в скрипте после знака '?' и числа, если оно есть, и знака вертикальной черты '|' которым окончание выделяется в скрипте. Окончание по умолчанию подставляется, если номер требуемого окончания больше, чем есть окончаний в списке.


  • Примеры использования (для заданного файла стейтов):
  • (age) - строка 'возраст'. Соответственно : (material) - строка 'материал', (name) - строка 'имя', (flags) - строка 'флаги'.
  • (material?2|а) - для стейта, со значением wood, получится строка 'дереву'. Для значения mifril - получится строка 'мифрила'.
  • Для стейтов типа group, для вывода имени состояния, следует использовать составные имена. (flags.light) - сторока 'светится', (flags.visible?2) - получится строка 'видима'.


  • При написании окончаний в атрибутах 'name', можно указывать пустые окончания. Например: <case id="visible" name="видим(о|а||и|)"/>. В этом случае третье и пятое окончания пустые.

    Скрипты динамического описания : < >

    Данные скрипты используются для упрощения работы с остальными скриптами или тегами динамического описания.
    Скрипт выводит содержимое тега активного объекта. Теги определяютя в главных файлах тегов или в файле прототипа, где они могут быть переопределены.

    Пример файла прототипа (см тут ):
    
    <mob>
      ...
      <tegs>
        <teg id="color">[color] [name] ...</teg>
        ...
      </tegs>
    </mob>
    

    Пример использования тега :
    
       ...
       actor:SendEx(mob, "... <color> ...")
       ...
    

    В заданном примере, скрипт <color> будет заменен на строчку тега color, который задан в файле прототипа актива, указанного первым параметром. Данные скрипты рассчитаны на использование в игровых командах, которые выводят информацию в специальном представлении, где представление зависит от конкретного актива.

    Теги динамического описания

    Помимо скриптов, которые работают со стейтами, в динамическом описании существуют теги динамического описания. Они влияют на внешний вид выводимых текстов.
  • '~' - (тильда)перенос строки
  • '$число' - (1 или 2 цифры от 0 до 9), например $1, $2, $15 и т. д. означает, что весь текст, который шел до знака $ укоротить до длины n- где n - число после $. Если строка больше указанного значения, то она обрезается, если меньше, то дополняется пробелами. Используется для форматированного вывода текстов (в колонку например). При этом учитывается наличие символов переноса строки '~'. Перенос строки начинает как бы новую строку, поэтому дополнение или обрезка строки будет начинаться с первого символа после переноса. Пример использования: $10[name]$25[race]$40[level]
  • '%' - операция принудительного перевода следующего символа после '%' в верхний регистр. Используется для вывода имен, названий, заголовков, и т.д. Например: %[name]
  • '#' - специальный символ, который означает что дальше идет 1 определенный символ, от которого зависит дальнейшая работа

  • Таблица цветов

    Темные оттенкиСветлые оттенки
    код цвета(буква)название цветацветкод цвета(буква)название цветацвет
    rтемно-красный Rкрасный 
    gтемно-зеленыйGзеленый 
    bтемно-синийBсиний 
    cтемно-голубойCголубой 
    yтемно-желтыйYжелтый 
    mтемно-фиолетовыйMфиолетовый 
    wсерыйWбелый 
    kугольный-черныйKчерный 

    Содержание   <<< Назад   Далее >>>