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

Формат файлов стастов персонажей, мобов, объектов, комнат, мира



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

Все стейты описываются в нескольких отдельных файлах. Имена файлов задаются в главном конфигурационном файле мира. Первый файл (ActorsStatesFile)- это общая часть стейтов персонажей и мобов. Второй файл (CharsStatesFile) - стейты персонажей, третий (MobsStatesFile) - стейты мобов, четвертый - стейты объектов, пятый - стейты комнат и т.д. Необходимость объединить стейты мобов и персонажей вызвана необходимостью "видеть" из скриптов и мобов и персонажей одинаково. Т.е. чтобы скрипты работали одинаково как для моба, так и персонажа. Конечно же можно создать и для моба и персонажа свои, уникальные стейты, но это делать не рекомендуется, так как в этом случае скрипты будут правильно работать только для тех сущностей, у которых есть эти стейты. Разделение же отдельных стейтов мобов и персонажей сделано, в основном, по причине экономии памяти. У персонажей свои уникальные имена, а у мобов свои одинаковые (в рамках одного моба). Чтобы не приходилось хранить одни и теже одинаковые переменные у каждого экземпляра моба, пришлось создать так называемые шаблонные типы данных (о типах данных ниже). Значения этих типов хранятся в единственном экземпляре. Пример такого стейта, где необходим шаблонный тип, как было уже сказано, имена в различных падежах. Именно поэтому сделано разделение стастов мобов и персонажей - для персонажей в основном обычные типы данных, а для мобов - шаблонные. Дабы скрипты работали одинаково в этой ситуации, как для персонажей, так и для мобов, рекомендуется давать одинаковые имена(идентификаторы) их стейтам. Следует заметить, что изменение любого шаблонного стейта моба из скриптов затронет всех мобов того же типа. Изменение шаблонного стейта у персонажей затронет всех персонажей.

Формат файлов, хранящих информацию о стейтах:

<?xml version="1.0" encoding="UTF-8"?>
<states>
 <state id="идентификатор" type="тип" name="название стейта">
   ...данные стейта...
 </state> 
 <state id="идентификатор2" ...">
 ...
</states>

Формат каждого отдельного стейта зависит от типа. Он будет представлен ниже (в разделе, посвященному типам данных).

Идентификатор стейта(id) - это очень важная часть, т.к. именно он будет учавствовать в скриптах, когда нужно будет указать на тот или иной стейт. Поэтому в качестве идентификатора можно использовать только латинские буквы и цифры. Тип cтатса(type) - определяет тип стейта (что он хранит и как). Название стейта(name) - это его описание или имя. Атрибут name является необязательным. Это имя можно выводить в мад с помощью скриптов динамического описания.

Типы данных стейтов



В ядре сделана поддержка нескольких типов данных. Тип данных определяет что и как хранится в стейте. Например : строка или число. Список поддерживаемых типов приведен в таблице:
Обычнный типШаблонный типНазначение, описание
stringtstringСтроковая переменная. Предназначена для хранения данных в виде текста. Например: имя, фамлия, титул.
numbertnumberЦелочисленная переменная. Может принимать как положительные, так и отрицательные значения. Предназначена для хранения единичных числовых переменных: сила, рост, вес.
grouptgroupНабор целочисленных значений (массив). Каждый элемент может быть как положительным, так и отрицательным. Предназначен для хранения групповых значений. Например: умения.
switchtswitchПеременная-переключатель. Принимает одно значение из заданного набора. Используется для переменных, таких как: раса, пол и т.д.
enumtenumПеременная-переключатель. Принимает одно значение из заданного набора. Используется для переменных, таких как: дата и т.д. Отличие от типа 'switch' в том, что из скриптов идет работа с порядковым номером значения(числом), а не строкой. Однако текстовое значение присваивать также можно.
sectimer-нет-Таймер. Значение таймера уменьшается на 1 каждую секунду. При достижении нулевого значения запускается новый цикл, см. далее
mintimer-нет-Таймер. Значение таймера уменьшается на 1 каждую минуту. При достижении нулевого значения запускается новый цикл, см. далее
secclock-нет-Обратный таймер. Значение таймера увеличивается на 1 каждую секунду. При достижении максимума запускается новый цикл, см. далее
mintimer-нет-Таймер. Значение таймера увеличивается на 1 каждую минуту. При достижении максимума запускается новый цикл, см. далее

  • Формат стейта типа string/tstring (у него нет дополнительных параметров):
  • 
       <state id="id" type="string" name="название или описание стейта"/>
    

  • Формат стейта типа number/tnumber (у него нет дополнительных параметров):
  • 
       <state id="id" type="number" name="название или описание стейта"/>
    
  • Формат стейта типа group/tgroup:
  • 
       <state id="id" type="group" name="название стейта, общее описание группы">
         <case id="id2" name="имя или описание данного значения"/>
         <case id="id3" name="имя или описание данного значения"/>
         ...
       </state>
    
    В качестве параметров данного типа стейта-массива, используется список переменных, которые входят в этот массив. В качестве идентификаторов в тегах case также можно использовать только латинские буквы, т.к. они также участвуют в скриптах. Для обращения ко значению стейта используется такой (составной) вариант : 'id.id2'. Текст имя-описание(name) используется для пояснения назначния стейта и может выводится в мад с помощью скриптов динамического описания.

  • Формат стейтов типа switch/tswitch/enum/tenum:
  • 
       <state id="id" type="switch|enum" name="название или описание стейта">
         <case id="id2" name="имя данного значения">значение данного варианта стейта</case>
         <case id="id3" name="имя данного значения">значение данного варианта стейта</case>
         ...   
       </state>
    
    Для стейта типа switch, указывается уже набор значений. Т.е. теги case описывают сами значения стейта, т.к. он может принимать только одно значение из заданного набора. Идентификаторы id2, id3 - это уже значения стейта, которые используются в программных Lua-скриптах. Текст же (между тегами case)- это такое же значение, но выраженное в виде текста, которое используется в скриптах динамического описания. Имя стейта(name) также может выводится в мад с помощью скриптов динамического описания.

    Тег (name) - имя-описание отдельных значений для типов group и switch, является необязательным.

  • Формат стейтов типа sectimer/mintimer/secclock/minclock:
  • 
       <state id="id" type="sectimer" name="название или описание стейта"/>
    
    Данные типы данных - это таймеры. Их значение автоматически увеличивается или уменьшается на единицу через определенный промежуток времени (промежуток зависит от типа таймера). По достижении порогового значения - это 0 или значения периода, у владельца стейта(таймера) запускается метод с id таймера. Эти типы данных предназначены для переодического запуска скриптов, что позволяет оживить мир.

    Работа с таймерами аналогична работе с числовыми стейтами. Но у таймеров есть небольшое дополнение - это переменные 'loop', 'delay', 'stop'.
    - 'loop' - значение периода таймера. При достижении таймером порогового значения - 0 (для sectimer, mintimer) или loop (для secclock, minclock), как было уже сказано, запускается метод хозяина таймера и таймер начинает новый цикл (если значение loop не равно 0). Работа с переменной происходит так : Если имя стейта таймера - 'timer', то работа с переменной через 'timer.loop'.

    - 'delay' - величина задержки таймера. Переменная может принимать значения от 0 до 10 включительно. Величина определяет задержку в десятых долях единиц таймера. Если таймер секундный, то значение 1 означает, что значение таймера будет уменьшаться на 1 каждую 1.1 секунды. Соответственно 2 - каждые 1.2 секунды, и т.д. до 10 - которое означает уменьшение на 1 каждые 2 секунды. Значение 0 - означает отсутствие задержки. Работа с переменной 'timer.delay'.

    - 'stop' - флаг-переключатель. Определяет состояние таймера - работает/не работает. Может принимать значения: 0 - таймер работает, и не 0 - таймер остановлен и не считает (значение таймера не изменяется). Работа с переменной 'timer.stop'.

    В любой момент, при необходимости, можно менять значение таймера и его остальные переменные.



    Пример с участием всех типов стейтов:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <states>
      
      <state id="gender" type="switch" name="Пол">
        <case id="male">мужской</case>
        <case id="female">женский</case>
      </state>
      
      <state id="age" type="number" name="Возраст"/>
      
      <state id="name" type="string" name="Имя"/>
     
      <state id="skills" type="group" name="Умения">
        <case id="locks" name="знание замков"/>
        <case id="traps" name="знание ловушек"/>
      </state>
      
      <state id="timer" type="mintimer" name="время жизни"/>
      
    </states>
    


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