Изменения

Материал из Chaotic Onyx
Перейти к навигацииПерейти к поиску
м
clean up, removed: ''Это 18 глава перевода оригинального руководства по Dream Maker от разработчиков.'' (77)
Строка 1: Строка 1: −
''Это 18 глава перевода оригинального руководства по Dream Maker от разработчиков.''
     −
[http://wiki.ss13.ru/index.php?title=All_about_the_code Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.]
     −
[http://www.byond.com/docs/guide/chap18.html Оригинальная 18 глава руководства на английском языке]
     −
= Пользовательские информационные объекты =
+
[[Файл:LtJ6KqW6mKk.jpg|LtJ6KqW6mKk.jpg]]
 
+
[https://www.youtube.com/watch?v=wqpseZS3mD0 Конец прекрасной эпохи. Мы еще увидимся, я обещаю!]
''Он тронул рыб, говоря страшным голосом: "Рыбы, рыбы, вы выполняете свой долг?" — на что рыбы, подняв головы, ответили: "Да, да. Если вы рассчитываетесь, мы рассчитываемся. Если вы платите по своим долгам, мы платим по своим. Если вы летаете, мы завоевываем и довольствуемся этим."'' — Визирь, который был наказан, Арабские Ночи
  −
 
  −
Большую часть времени, объекты, которые вы создаете, уже предопределены, или хотя бы принадлежат к одному из предопределенных типов. Однако, вы можете сделать свои объекты с нуля. Они могут быть полезными для ваших собственных разнообразных целей, когда вам не требуется весь тот дополнительный багаж, ассоциированный с встроенными типами.
  −
 
  −
== Определение типа данных ==
  −
 
  −
Чтобы определить новый тип данных проще выделить из корня программы, чем из существующего типа объектов. Следующий код демонстрирует пример кода, который определяет новый тип данных - ''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''  - [[DM Guide 7#Создание и удаление объектов|7.2]]<br/>
  −
''Del''  - [[DM Guide 7#Создание и удаление объектов|7.2]]<br/>
  −
''Topic'' - [[DM Guide 7#Topic|7.6]]<br/>
  −
''Read''  - 12.4<br/>
  −
''Write'' - 12.4<br/>
  −
 
  −
== Создание объекта ==
  −
 
  −
Команда ''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'' использовалась здесь для получения случайного задания из всех описанных в коде.
  −
 
  −
Очевидно, что можно добавить разнообразные усовершенствования к основной системе системе. Например, вы моежете добавить новые награды и квесты. Однако, это хорошее начало и прекрасная демонстрация пользовательских объектов.
  −
 
  −
Заметьте, что мы никогда не удаляли квест, когда он заканчивался, а просто убирали его из списка. С того момента, как на этот объект больше никто нигде не ссылается, он будет автоматически удален.
 
501

правка

Навигация