DM Guide 18: различия между версиями

Материал из Chaotic Onyx
Перейти к навигацииПерейти к поиску
(Перенес 18 главу)
(нет различий)

Версия от 13:22, 13 августа 2013

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

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

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

Пользовательские информационные объекты

Он тронул рыб, говоря страшным голосом: "Рыбы, рыбы, вы выполняете свой долг?" - на что рыбы, подняв головы, ответили: "Да, да. Если вы рассчитываетесь, мы рассчитываемся. Если вы платите по своим долгам, мы платим по своим. Если вы летаете, мы завоевываем и довольствуемся этим." -- Визирь, который был наказан, Арабские Ночи

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

Определение типа данных

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

Quest
   var
      mob/sponsor
      quest_obj_type
      reward_obj_type
      desc

   proc
      Check()
         var/mob/M
         var/obj/O
         for(M in view(sponsor,1))
            O = locate(quest_obj_type) in M
            if(O)
               Reward(M,O)
               return 1
      Reward(mob/M,obj/O)
         var/obj/R = new reward_obj_type(M)
         O.Move(sponsor)
         M << "You have completed the quest!"
         M << "[sponsor] takes [O] and rewards you with \an [R]." 

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

Переменные объекта

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

type - содержит путь к объекту.

tag - содержит уникальный текстовый идентификатор для объекта. Если вы назначили его, то можете использовать locate(tag) для получения ссылки к этому объекту.

vars – список переменных, относящихся к объекту. Элементы списка – названия переменных. Каждое ассоциируется с собственным значением переменной. Смотрите раздел 12.7 для примера.

Операции объекта

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

New - 7.2
Del - 7.2
Topic - 7.6
Read - 12.4
Write - 12.4

Создание объекта

Команда new используется для создания объектов, а del, соответственно, для их уничтожения. Следующий пример показывает, как можно использовать описанный до этого объект quest.

mob/king
   var/quests[0]

   verb/beg()  //get a new quest
      set src in view()
      var/Quest/q = RandQuest()
      usr << q.desc
      quests += q

   verb/bow()  //finish quest
      set src in view()
      var/Quest/q
      for(q in quests)
         if(q.Check())
            quests -= q
            return
   proc/RandQuest()
      var/qtype = pick(typesof(/Quest) - /Quest)
      var/Quest/q = new qtype()
      q.sponsor = src
      return q
Quest/Goblin
   quest_obj_type = /obj/corpse/goblin
   reward_obj_type = /obj/potion/newlife
   desc = "Bring us the head of a goblin and ye shall have new life!"

Quest/Ring
   quest_obj_type = /obj/magic_ring
   reward_obj_type = /obj/wand/lightning
   desc = "Bring us a golden ring and thy reward shall be great!"

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

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

Заметьте, что мы никогда не удаляли квест, когда он заканчивался, а просто убирали его из списка. С того момента, как на этот объект больше никто нигде не ссылается, он будет автоматически удален.