Вход
Приветствую Вас Гость
 

MAGICON.FB

Объекты

База. Таблица данных

Работа с объектами построена на жёсткой базе с ограниченным количеством столбцов. Каждый новый объект создаётся путём занесения данных в эти столбцы. Таким образом каждый объект является набором записей (строкой) во всех столбцах. Столбцы:

  • $id_array[] - идентификатор объекта.
  • $object_array[] - тело объекта
  • $position_array[] - позиция, расположение объекта. В качестве расположения объекта указывается идентификатор другого объекта (родительский объект), либо не указывается ничего.
  • $include_array[] - дочерний объект. То есть объект, расположенный в позиции текущего объекта. Так реализуется «обратное наследование»
  • kolvo_array[] - количество абсолютно идентичных объектов, находящихся в одной позиции.
  • charge_array[]- заряд каждого из абсолютно идентичных объектов, находящихся в одной позиции.
  • $respawn_array[]- пороговое время, при котором произойдёт респавн объекта.
  • $run_array[] - Код в виде текста, который может быть выполнен при обработке объекта.

Как видно, столбцами являются совершенно определённые массивы. В качестве строк выступают позиции элементов этих массивов. Т.е. Каждый объект является набором записей во всех этих массивах под одним номером. Это очень удобно для создания, удаления, поиска и редактирования объектов.

Механизм наследования

Изначально в игре создаются два основных объекта: инвентарь <inventory> и респавнер <respawner>. Эти объекты записываются в первые две строки базы. Идентификаторы этих объектов INVENTORY и RESPAWNER соответственно. Эти объекты всегда выглядят одинаково и являются родительскими объектами для всех остальных объектов. Каждый новый объект, создаваемый в игре, помещается в инвентарь, респавнер, либо в другой унаследованный ими объект. Исключения составляют объекты классов «заголовки локаций» (если в теле объекта присутствует тег [respawn.stop]) и «динамическая гиперссылка».

Условно назовём объект, в который нам надо «поместить» другой объект, «родительским объектом» или «сумкой». Объект, который нам надо поместить в другой объект, назовём «дочерним объектом». Таким образом дочерний объект «помещается» в родительский. Можно сказать, что «дочерний объект наследует родительский», или «родительский объект содержит дочерний», или «дочерний присвоен родительскому». Так же можно сказать, что «один объект стал родителем другого объекта». Всё это -абстрактные представления, технически же, чтобы поместить дочерний объект в родительский, необходимо в переменную $position_array[] дочернего объекта просто вписать OID (Object ID) родительского объекта. Например:

 gosub 'add.new.obj','<inventory>','','INVENTORY'
gosub 'add.new.obj','<respawner>','','RESPAWNER'
gosub 'add.new.obj','<hero> [name::name] [color:00aaaa]','INVENTORY','HERO'

В третьей строке в обращении gosub к подпрограмме 'add.new.obj' в качестве нулевого аргумента передаётся тело объекта «герой», а в качестве первого аргумента передаётся ай-ди объекта «инвентарь», который всегда выглядит одинаково, т. е. INVENTORY. Таким образом создаются два объекта (помимо RESPAWNER) приблизительно следующего вида:

 
№ П.П.1 ID Тело объекта расположение Дочерний: кол-во заряд
[0] INVENTORY <inventory>     0 0
[1] RESPAWNER <respawner>     0 0
[2] HERO.aШoYnшiз <hero> [name::name] [color:00aaaa] INVENTORY   0 0

Так можно помещать сколько угодно дочерних объектов в объекты-родители. При этом дочерние объекты могут сами становиться объектами-родителями других объектов. Например, объект «инвентарь» может быть родительским объектом для объектов «герой», «рюкзак», «книга магии», «кошелёк», «дневник странника» и прочих. Объект «герой» может быть родительским объектом для объектов «свойства» и «части тела». Объекты «части тела» могут быть родительскими объектами для объектов «предметы». И т. д.

Обратное наследование

Объекты могут быть родителями скольки угодно объектов, однако не могут быть дочерними объектами у нескольких объектов-родителей. Это большое упущение, поскольку есть такие объекты, которые занимают положение сразу в нескольких объектах. Например двуручный меч — может быть расположен в двух руках. Таким образом в игре необходима реализация обратного наследования, когда объекту прописывается не место, где он расположен, а вложенный в него объект. Это стало возможным путём введения в базу дополнительного столбца $include_array[] - вложенные объекты.

Обратное наследование оказывается очень удобным для жёсткой связки объектов. Например двуручный меч является дочерним объектом для объектов-родителей «правая рука» «левая рука». Он связывается с правой рукой через приписываемую ему позицию ($position_array), но обе руки связываются с ним через приписанный к ним ай-ди дочернего объекта ($include_array). Таким образом двуручный меч будет жёстко связан с правой рукой. Теперь любой интерпретатор будет знать, что у родительского объекта есть дочерний, а у дочернего есть родительский. С левой рукой будет установлена «нежёсткая» связка. Интерпретатор с лёгкостью определит, что у родительского объекта есть дочерний, а вот у дочернего объекта родитель будет иным. Таким образом при удалении из игры «левой руки», предмет «двуручный меч» не потеряется как дочерний. Однако при удалении «правой руки», он тоже будет удалён. Если же из игры будет удалён сам «двуручный меч», объекты «правая рука» «левая рука» просто потеряют значения в столбце $include_array.

Пример обратного наследования (кусочек таблицы):

 
№П.П. ID Тело объекта расположение Дочерний: кол-во заряд
[6] BODY.dНO7цФyП <body> [:правая_рука:] HERO.TFn3kжSA деревянный_клеймор.вЮiчЕББy 0 0
[7] BODY.FхкМDЗыd <body> [:левая_рука:] HERO.TFn3kжSA деревянный_клеймор.вЮiчЕББy 0 0
[53] деревянный_клеймор.вЮiчЕББy <obj> [:деревянный_клеймор:] BODY.dНO7цФyП   1 0

Иерархия

Итак. Первым объектом, который создаётся в игре всегда является инвентарь. Инвентарь не имеет класса, хотя его тело и содержит тег класса. Инвентарь наследуют все объекты позднее в него помещаемые:

  • Герой — относится к классу <hero>, сверхклассу «объект в инвентаре», идентификатор начинается с HERO. Имеет несколько характеристик, признаков, свойств.

    • «Герой» является родительским объектом для объектов класса <body> - части тела. Все объекты класса «части тела» идентифицируются словами, начинающимися с BODY.

      • Объекты класса «части тела» могут быть родительскими объектами для объектов класса «предмет». Это единственный класс объектов, два и более объектов которого могут быть родительскими объектами одного объекта.
    • «Герой» может являться родительским объектом для объектов класса <property> - свойства. Все объекты класса «свойства» идентифицируются словами, начинающимися с PROPERTY.

  • Дневник — относится к классу <diary>, сверхклассу «объект в инвентаре», идентификатор начинается с DIARY. Имеет несколько характеристик, признаков, свойств.

    • Дочерними объектами для этого объекта являются объекты класса <note> - «записки».

      • «Записки» так же могут быть дочерними объектами друг друга. Например: основная записка является «заданием», в которую включены «стадии задания».

  • Кошелёк — относится к классу <money>, сверхклассу "объект в инвентаре", идентификатор начинается с MONEY. Имеет несколько характеристик, признаков, свойств.

    • Является родительским объектом для объектов сверхкласса «неисчислимые» [nocount].
  • Рюкзак - относится к классу <bag>, сверхклассу "объект в инвентаре", идентификатор начинается с BAG. Имеет несколько характеристик, признаков, свойств.

    • Рюкзак может являться родительским объектом для объектов - предметы. Идентификаторы предметов представляют собой идентификатор_вида.НаБоРсЛуЧаЙнЫхБуКвИцИфР.

  • Развитие - относится к классу <skill>, сверхклассу "объект в инвентаре", идентификатор начинается со SKILL. Имеет несколько характеристик, признаков, свойств.

  • Связка ключей - относится к классу <keys>, сверхклассу "объект в инвентаре", идентификатор начинается с KEYS. Имеет несколько характеристик, признаков, свойств.

    • «Связка ключей» является родительским объектом для объектов класса <key> — ключи. Идентификаторы объектов класса «ключи» начинаются с KEY

  • Книга магии - относится к классу <magic>, сверхклассу "объект в инвентаре", идентификатор начинается с MAGIC. Имеет несколько характеристик, признаков, свойств.

    • Является родительским объектом для объектов класса «Заклинание» - <spell>. Идентификаторы объектов класса, начинаются с SPELL.

  • Камни телепортации («ожерелье гроз» по версии МАГИКОН 1.9.9) -относится к классу <gate-stone>, сверхклассу "объект в инвентаре", идентификатор начинается с GATE-STONE Имеет несколько характеристик, признаков, свойств.

    • Является родительским объектом для объектов класса <g-s>. Идентификатор начинается с GST.

Объекты можно вкладывать друг в друга непосредственно. Объекты сверкласса «объект в инвентаре» воспроизводят лишь объекты тех классов, которые для них предназначены. Объекты класса «сумка» <bag> могут вкладываться один в другой, таким образом можно обеспечить предварительную сортировку объектов по классам, типам и пр. Объект любого класса может обладать совершенно уникальным именем, или другими уникальными характеристиками, а может быть идентичен другому объекту, но тем не менее они будут обрабатываться, как совершенно разные объекты, поскольку имеют разный OID.

Помимо объекта «Инвентарь» на высшей ступени иерархии находится объект «Респаунер Локаций», который так же создаётся изначально. В «респаунер локаций» помещаются все заголовки локаций. Это сделано для того, чтобы быстро находить все локации, которые могут быть подвержены респаунингу. Так же на высшей ступени иерархии находятся все динамические гиперссылки, в т.ч. Цели. Ибо рациональнее генерировать ссылку исходя из её ай-ди, чем генерировать текст с ай-ди ссылки.

Классификация объектов

Классификация объектов ведётся по полужёсткому принципу. Для каждого объекта должен быть жёстко определён класс, сверхкласс и вид.

  1. Сверхкласс. Деление на сверхклассы определяется по общему принципу сортировки. Всего в игре присутствует четыре сверхкласса объектов:

    • Пустой сверхкласс — объекты, не относящиеся ни к одному из трёх других сверхклассов. Как правило, это объекты, поведение которых не должно воспроизводиться движком, как поведение предметов. К таким объектам относятся «инвентарь», «респавнер», «свойства героя», «заклинания», «заголовки локаций» и прочие.

    • Объекты в инвентаре — сверхкласс объектов, тело которых содержит тег [oneself]. Это объекты, которые до подъёма ведут себя, как предметы. Т.е. Они могут находиться на локациях места, торговли или хранения, и герой может их поднять, как обычный предмет. После поднятия занимают место в инвентаре, или другом oneself-объекте и с того момента их поведение определяется уникальными алгоритмами, прописанными для каждого класса отдельно.

    • Штучные объекты — сверхкласс объектов, тело которых содержит тег [number]. Этот сверхкласс охватывает только часть объектов класса <obj> “предметы”. Штучные предметы ведут себя следующим образом: все они помещаются либо в «инвентарь», либо в одну из «сумок», либо на «часть тела». Могут подниматься и сбрасываться на любой локации. Если в один объект-родитель помещается несколько идентичных штучных объектов, то они записываются в одну строку базы, как один объект, но в столбце kolvo_array[] указывается сумма количества этих идентичных объектов.

    • Неисчислимые объекты — сверхкласс объектов, тело которых содержит тег [nocount]. Этот сверхкласс охватывает только часть объектов класса <obj> “предметы”. К неисчислимым относятся деньги и прочие предметы расчёта. До подъёма они ведут себя, как предметы, но после подъёма помещаются в объект «кошелёк». Идентичные заносятся в одну строку базы, изменяя при этом свойство «количество» (kolvo_array[]). Выбросить такие объекты нельзя.

    • Исчислимые, или меновые, объекты — сверхкласс объектов, тело которых содержит тег [count]. Этот сверхкласс охватывает только часть объектов класса <obj> “предметы”. По своему поведению сходны со штучными объектами. Остались от старых версий движка. В отличие от штучных, на часть тела переносится весь объект (независимо от значения свойства «количество»), а не часть объекта со свойством «количество», имеющем значение «1».

  2. Класс. Деление на классы даёт возможность применять специальные алгоритмы обработки для каждого класса объектов. Другими словами классы различаются тем, какой механизм с ними работает. Класс объекта определяется по тегу в угловых скобках.

    • <inventory> - единственный объект этого класса создаётся в самом начале игры. Это объект, непосредственно не воспроизводящийся ни одним из интерпретаторов. Воспроизводятся только унаследовавшие его объекты. Идентификатор (Object ID) - INVENTORY.

    • <respawner> - единственный объект этого класса создаётся в самом начале игры. Это объект, непосредственно не воспроизводящийся ни одним из интерпретаторов. Воспроизводятся только унаследовавшие его объекты. Идентификатор — RESPAWNER.

    • <заголовок> - класс объектов «заголовки локаций». Объекты этого класса воспроизводятся специальным интерпретатором и содержат общие свойства по каждой из локаций. Благодаря «заголовкам» стало возможным разрушать локации мест и вообще делать с ними много забавных штук. Идентификаторами объектов такого класса являются имена локаций. Например: [м:1]_мой_дом. Помещаются в RESPAWNER.

    • <link> - класс объектов «динамическая гиперссылка». Объекты этого класса, как правило, в своём теле имеют вложенный объект. Предназначены для создания гиперссылок в динамическом тексте локации и других текстах. Синтаксис таких объектов при должном понимании весьма прост. Так же он исключает необходимость отслеживать апострофы и двойные апострофы — гиперссылка генерируется автоматически с правильным написанием знаков. Идентификаторами таких объектов являются сочетание слова link., номера ссылки по порядку и имя локации, на которой они находятся. Например: [м:1]_моя_комната[link.2].

    • <goto> - класс объектов «обусловленный переход». Особенностью этих объектов является то, что они могут располагаться только на локациях места, или включаться в тело других объектов. Воспроизводятся в виде действия, которое передаёт на интерпретатор ай-ди объекта перехода. По этому ай-ди уже и обрабатывается информация из самого перехода. За счёт подобного рода переходов получилось создать запираемые двери, проверку на существование локации, и прочее. Идентификатор начинается с GOTO.

    • <obj> - класс объектов «предмет». Особенностью этих объектов является то, что игрок непосредственно с ними взаимодействует. Он может их поднимать, выбрасывать, читать, есть пить и прочее, что определено параметрами типа. При респаунинге локации все объекты такого класса уничтожаются, если не стоит запрет на уничтожение. Идентификатор представляет собой комбинацию из идентификатора вида и строки случайных символов. Пример: деревянный_клеймор.вЮiчЕББy.

    • <keys> - класс объектов «связка ключей». Помещается непосредственно в INVENTORY. Идентификатор начинается с KEYS.

    • <key> - класс объектов «ключ». Помещаются исключительно в объекты класса «связка ключей». Идентификатор начинается с KEY.

    • <bag> - класс объектов «сумка» (рюкзак). Помещается непосредственно в INVENTORY. Идентификатор начинается с BAG.

    • <hero> - класс объектов «герой». Помещается непосредственно в INVENTORY. Идентификатор начинается с HERO.

    • <body> - класс объектов «часть тела». Помещается в объекты класса <hero> (может быть не только этот, но как правило). Идентификатор начинается с BODY.

    • <property> - класс объектов «свойство». Помещается в объекты класса <hero> (может быть не только этот, но как правило). Идентификатор начинается с PROPERTY.

    • <counter> - класс объектов «счётчик». Помещается в объекты класса <hero>, либо другие объекты. Идентификатор начинается с COUNTER.

    • <diary> - класс объектов «ежедневник». Помещается непосредственно в INVENTORY. Идентификатор начинается с DIARY.

    • <note> - класс объектов «заметка». Помещается в объекты класса <diary> и аналогичные. Идентификатор начинается с NOTE.

    • <money> - класс объектов «кошелёк». Помещается непосредственно в INVENTORY. Идентификатор начинается с MONEY.

    • <magic> - класс объектов «книга магии». Помещается непосредственно в INVENTORY. Идентификатор начинается с MAGIC.

    • <spell> - класс объектов «заклинание». Помещается объекты класса <magic>. Идентификатор начинается с SPELL.

    • <skill> - класс объектов «развитие». Помещается непосредственно в INVENTORY. Идентификатор начинается с SKILL. Представляет собой одну из вкладок дневника по сути. Будет прорабатываться.

    • <gate-stone> - класс объектов «камни телепортации»(«ожерелье гроз» по версии МАГИКОН 1.9.9). Помещается непосредственно в INVENTORY. Идентификатор начинается с GATE-STONE.

    • <g-s> - класс объектов «камень телепортации». Помещается в объекты класса <gate-stone>. Идентификатор начинается с G-S.

  3. Вид. Объекты подразделяются на виды по свойствам и признакам. В каждом классе может быть от одного до нескольких сотен видов объектов. Наибольшее число видов объектов в классе <obj> “предметы”. Вид объекта можно определить по идентификатору вида (короткая запись, короткое слово, короткое имя, short_name). Для объектов сверкласса «объект инвентаря» в большинстве случаев идентификатором вида является идентификатор класса (т. е. слово в угловых скобках, без угловых скобок). Примеры:

    • [:short_name:] - общий вид записи идентификатора вида в теле объекта.

    • [:magic:] - идентификатор вида объекта класса «книга магии».

    • [:деревянный_клеймор:] - идентификатор вида объекта класса «предмет».

  4. Тип. Подразделение на типы производится по уникальным свойствам, признакам и моделям поведения для целой группы объектов. Все типы перечисляются внутри глобального тега [np: :np] – набор признаков. Определение типа объекта не является обязательным, оно лишь указывает на то, какими узкоспециализированными механизмами можно обработать объект. Далее при рассмотрении узкоспециализированных механизмов будет указываться, объект какого типа они обрабатывают. Наибольшее количество типов объектов среди объектов класса <obj> «предмет». Вот некоторые из них, согласно иерархии2:

    • [оружие] – тип объекта «оружие». Это означает, что любой предмет, обладающий таким признаком, будет обрабатываться алгоритмами работы с оружием. Так же, в зависимости от ситуации, алгоритмы будут обращать внимание на другие признаки «оружия»:

      • [двуручное] — по этому признаку оружие помещается в две руки

        • [топор] - «секира». По этому признаку определяется, как действует оружие в бою.

        • [молот] - «военный молот»

        • [меч] - «клеймор»

        • [лук] — «стрелковый лук»

        • [посох] - «магический посох»

        • [огнестрельное] - “ружьё” и т.п.

      • [одноручное]

        • [топор] - «боевой топор». По этому признаку определяется, как действует оружие в бою.

        • [молот] - «боевой молот»

        • [меч] - «одноручный меч»

        • [нож] - «нож»

        • [булава] - «дубина», «булава»

        • [кинжал] - «кинжал»

        • [огнестрельное] - “пистолет”, “револьвер” и т.п.

      • [арбалет] - «стрелковый арбалет». Может помещаться как в две, так и в одну руку.

    • [доспех] — тип объекта «доспех», «одежда». Это означает, что любой предмет, обладающий таким признаком, будет обрабатываться алгоритмом работы с доспехом. Так же в зависимости от ситуации, алгоритмы будут обращать внимание на другие признаки доспеха:

      • [шлем] - «головной убор» и пр.

      • [наплечни] - «наплечни», «плащ» и пр.

      • [перчатки] - «перчатки», «варежки» и пр.

      • [кираса] - «кираса», «рубаха», «куртка» и пр.

      • [поножи] - «поножи», «штаны», «юбка» и пр.

      • [обувь] - «обувь», «сапоги», «башмаки» и пр.

      • [амулет] - «амулет на шею», «ошейник», «шейный платок», «плащ» и пр.

      • [щит] - «щит», «большой щит», крышка от кастрюли и пр.

    • [снаряды] - тип объекта «снаряд». Это меновые объекты, обрабатываемые согласно алгоритмам для снарядов. Так же алгоритмы могут обращать внимание на другие признаки:

      • [болты] - “снаряды для арбалетов”

      • [стрелы] - “снаряды для луков”

      • [снаряд метательный] - «снаряды метательные»

    Некоторые типы объектов класса <obj> неиерархической структуры 3:

    • [ингредиент] - “ингредиент”.

    • [материал] - “материал”.

    • [еда] - «пища», «еда»

    • [свиток] - «свиток магии», «свиток заклинания»

    • [книга] - «книга», «заметка»

    • [шкатулка] - “шкатулки”, «кошельки», «переносные хранилища», «ларцы». Предметы этого типа могут включать в себя объекты типа <goto>.

    • [меновой] - “предметы для обмена”

1 Подобную таблицу, отображающую все созданные в игре объекты (база объектов), можно получить, набрав в строке ввода команду all objects table. Подробнее о командах, выполняемых из строки ввода, можно прочитать в специальном разделе.

2 Нельзя употреблять теги типов, находящихся на одной ступени иерархии, если у них один алгоритм обработки. Если есть необходимость сделать предмет смешанного типа, который бы обрабатывался одним и тем же алгоритмом, но один раз, как предмет одного типа, другой раз, как предмет другого типа, зашейте функцию изменения типа в описание предмета. О том, как это сделать, можно подробно узнать из «трактата о изменчивых предметах».

3 Теги этих типов можно употреблять в любых сочетаниях, поскольку для каждого типа применяется свой алгоритм обработки.

Наверх