Это 3 глава перевода оригинального руководства по Dream Maker от разработчиков.

Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.

Оригинальная 3 глава руководства на английском языке

Глава 3: Объекты

Наше собственное сознание - единственное достойное подтверждение существования окружающего мира. Ты сам - единственная реальность во многоликой вселенной. -- Бхагават Гита.

Есть четыре основных типа объекта. У каждого из них свои особые свойства, а также общие свойства. Основные объекты это: mob, obj, turf, и area. Существуют и другие типы объектов, но игроки могут видеть только эти четыре. Мы называем их atomic объектами.

Простейшее различие между ними в том, в каком порядке они расставляются по карте. Area расположена на первом слое. Иконки area обычно выглядят, как сплошной фоновый рисунок. Turf рисуется поверх area, обычно приставленный в виде некоторой поверхности, как трава, дорога или стена. Obj рисуются следующими и представлены в виде предметов таких как меч или печенки. Поверх всего накладываются Mob. Они обычно представляют игроков или существ, под управлением компьютера.

На карте, mobs и obj содержатся в turf. В свою очередь, он содержится в area. Также возможно чтобы obj и mob содержали в себе вещи. К примеру, объект chest (сундук) может содержать кучу сокровищ; а mob может содержать в себе все вещи игрока.

Заметьте, что я использую слова «может», «обычно» и «в основном». Дело в том, что DM предоставляет вам, дизайнеру, очень много свободы. Большинство базовых объектов определены, конкретной целью. Но это не значит, что вы должны использовать их именно таким образом. Назначение объектов зависит только от вас.

Расположение объектов atomic от самого низкого слоя к верхнему. 
Area
Turf
Obj
Mob

Свойства объектов

Вначале взглянем на свойства объектов, которые являются общими. Мы уже разобрались с тем, что каждый из объектов имеет название и иконку. Это – переменные или variables (также тут могут быть и procs, но оставим это для 7 главы). Внизу представлен список всех переменных и их описание.

name - это имя объекта, по умолчанию оно такое же, как и имя объекта в коде (т.е. узел). Линия подчерка “_” определяется языком как пробел.

gender - пол объекта, грамматический род, может быть установлен с использованием этой переменной. Она может быть neuter (нейстральный), male (мужской), female (женский) и plural (общий). По умолчанию является neuter.

desc - описание объекта. Оно появляется на панели stat когда игрок обследует (examine) его. Управление содержанием этой панели будет описываться в главе 7.

suffix - текст появляющийся после имени объекта на панели stat. К примеру, он может быть для носимых предметов таким: weapon in hand, worn on body и так далее.

text - описывает символ, которым будет представлен объект на карте без графики. Если вы когда-нибудь играли в игры жанра “RogueLike” или в похожую игру, вы поймёте, что тут имеется в виду.

icon - файл, использующийся для графического отображения объекта на карте.

icon_state - файлы-иконки могут содержать в себе различные представления о состоянии объекта. К примеру, дверь может быть открыта или закрыта. Определяет отображение объекта при его активном состоянии.

dir - направление, куда направлен объект. Некоторые из иконок могут быть направленными, и отображаться по-разному, в зависимости от направления. Очень часто используется для существ (mob), изменяющих направление при передвижении.

overlays - список объектов или иконок, которые находятся поверх описываемого объекта.

underlays - список объектов или иконок, поверх которых находится описываемый объект.

visibility - значения 1 и 0 указывают, является объект видимым или нет.

luminosity - значения от 0 до 6 указывают, на сколько далеко объект излучает свет. Только объекты у area, в свойствах которых определено освещение, значение luminosity задается по умолчанию.

opacity - значения 1 и 0 указывают, является ли объект непрозрачным, или нет. Непрозрачные объекты будут закрывать от взора позади стоящие объекты и не пропускать свет.

density - значения 1 и 0 указывают, является ли объект плотным, или нет. Только mob является плотным объектом по умолчанию. Обычно, два плотных объекта не могут занять одну и ту же позицию (но в главе 7 вы узнаете, как обойти это правило).

contents - список объектов, находящихся внутри описываемого объекта. Термин часто используется в случае описания инвентаря существа (mob). Вы узнаете об этом больше в главе 10.

verbs - список команд, доступных для объекта. Об этом рассказано в главе 4.

type - описывает путь до объекта и его тип. К примеру, /turf или /turf/trap. Взглянув на значения переменной вы сразу поймёте, с каким типом объекта вы имеете дело.

Местоположение

Следующие свойства относятся ко всем объектам, исключая area, которые не описываются в других объектах. Эти переменные используются для описания только в коде proc, об этом будет рассказано в главе 6.

loc - указывает на содержание объекта. Другими словами, если объект А содержит объект Б, то loc Б будет равным А и объект Б будет описан в листе contents объекта А.

x,y,z - определяют позицию объекта на карте. Началом координат являются значения (1,1,1). Координаты x и y описывают местоположение по сторонам света: север, восток, юг, запад. Координата z описывает расположение по уровню карты.

Дополнительные свойства Mob

key - логин игрока. По умолчанию, когда создаётся новый аватар для игрока, его имя будет установлено равным логину. Каждый key уникален – даже без знаков препинания и учёта регистра. По нему очень хорошо отслеживать людей.

ckey - key игрока в канонической форме (лишенный пунктуации и переведённый в нижний регистр). Полезен, для сохранения информации об игроке для дальнейшего использования. Об этом будет рассказано больше в главе 12.

client - объекты игрока, определённые в клиенте (если таковые имеются). Об этом подробнее рассказано в главе 9.

sight - определяет обзор зрения mob и его свойства. Может определяться одним или несколькими значениями: SEEINVIS, SEEMOBS, SEEOBJ, SEETURFS, BLIND.

Обычно используется оператор OR, для описания нескольких значений. Но так же вы можете использовать "+" до тех пор, пока не включите уже существующее значение ещё раз.

• group - список друзей существа (mob). Используется для решения проблем с перемещением персонажей. Когда одно существо пытается пройти через другого, дружественного ему, они просто меняются местами. В противном случае, это может стать раздражающим, постоянно врезаться друг в друга. Свойство будет использоваться в коде proc.

Объявление переменных

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

turf
   floor
      icon = 'floor.dmi'

   wall
      icon = 'wall.dmi'
      density = 1
      opacity = 1

      secret_door
         name = "wall"
         density = 0

   window
      icon = 'window.dmi'
      density = 1

Этот пример определяет четыре строительных блока: floor, wall, secret_door, window. По floor можно пройти и смотреть сквозь него, в отличие от wall. Secret_door практически такой же объект как и wall, исключая то, что через него можно пройти. А window является прозрачным, но непроходимым объектом.

Обратите внимание, что мы задали имя для Secret_door – “wall”. Сделано это для того, чтобы сохранить дверь скрытой. Вам придётся поступать так же, если вы хотите назвать объект именем, отличным от названия узла кода.

Постоянные значения

Вышеприведённый пример иллюстрирует три основных типа значение: число, текст, файл. Они называются constant values (постоянные значения).

Числа

Числовые константы могут быть положительными и отрицательными, целыми или с плавающей точкой (десятичными) и могут использовать общепринятые научные значения. К примеру, 3.15e7 или 315000000 – это примерное количество секунд в году. Максимально допустимое значение является 3.4e38, а минимальное 1.4e-45.

Текст

Текстовые константы часто называются программистами просто строками (strings), потому что представлены строкой из символов. Есть несколько специальных макросов, которые можно использовать в тексте. К примеру, имя считается именем собственным, если пишется с прописной буквы. Вы можете переопределить это, с помощью макроса \improper.

obj/CPU
   name = "\improper CPU"

Как и все текстовые макросы , \improper начинается с обратного слеша. Пробел после макроса служит как разделитель и игнорируется. Полное описание всех текстовых макросов будет в главе 11.

В этом конкретном примере \improper используется как один из способов определения имя собственного. Благодаря макросу, будет выводиться “You insert the CPU”, вместо “You insert CPU”. Вы еще увидите, как построить такое предложение немного позже.

Файлы

Файлы, такие как иконки или звуки, указываются внутри одинарных кавычек. Например, для доступа к файлу иконки, расположенному в C:\MyWorld\man.dmi, вы должны ввести значение 'man.dmi`. Для более удобной организации структуры, вы можете использовать подкаталоги в вашем проекте.

Макрос-константа

Если вы используете один и тот же кусок кода в нескольких местах, для удобства можно создать макрос, чтобы не писать каждый раз его заново. Так же это полезно, если вы захотите изменить какое-нибудь значение в будущем. Вместо того что бы искать его каждый раз в коде, вы просто изменяете макрос. Макрос очень легко внедряется в код. К примеру:

#define MASTER_KEY "Dan"  //The all-powerful super-user!

mob/DM
  key = MASTER_KEY

Этот пример определят особый тип mob, используемый DM (Dungeon master, Dream Maker, Dan Maestro, или иная транскрипция которую вы захотите подставить). В макрос не был включен код, но можно было бы дать аватару особые силы управления игрой. Определив макрокоманду MASTER_KEY, её легко заметить и изменить в краткие сроки (если кто-то другой решит заняться вашим кодом).

Когда игрок Dan входит в систему, перед созданием аватара для него, программа ищет в коде, mob, с существующим ключом. Если такой найден, то этот mob становится аватаром для игрока Dan. В противном случае, создаётся новый mob и именно он назначается игроку. Таким образом, игрок, который выходит из системы и позже возвращается, как правило, занимают один и тот же аватар.

Обобщение

Следующий пример содержит в себе все основные объекты для демонстрации:

area/dark
   luminosity = 0

obj/torch
   icon = 'torch.dmi'
   luminosity = 3

turf
   floor
      icon = 'floor.dmi'
   wall
      icon = 'wall.dmi'
      density = 1

mob/DM
   key = "Dan"
   density = 0  //I can walk through walls!


Нарисуйте необходимые иконки и создайте карту. Расставьте на карте объект area/dark, и посмотрите, что происходит, когда вы проходите сквозь него. Если вы измените значение key для DM на своё имя логина, то сможете ходить сквозь стены.

Если же вы ещё немного поиграете с кодом, то рано или поздно столкнетесь с вещами, которые пока не знаете как сделать. Например: “Как отключать специальные возможности DM по своему желанию?”, “Как на счёт команды, создания взмахом руки факела?” - для этого требуется могучее волшебство «verb». Как научиться ему, читайте дальше!