DM Guide 18
A long time ago in a galaxy far, far away... |
Данная статья помечена как устаревшая, её содержание может быть неверным или неактуальным. Если она не будет актуализирована или не появится веского повода для снятия этой плашки, то вскоре она будет перемещена в Священный архив. При желании вы можете помочь проекту Onyx и сообществу SS13 в целом — загляните на наш Портал сообщества. |
Это 18 глава перевода оригинального руководства по Dream Maker от разработчиков.
Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.
Пользовательские информационные объекты
Он тронул рыб, говоря страшным голосом: "Рыбы, рыбы, вы выполняете свой долг?" — на что рыбы, подняв головы, ответили: "Да, да. Если вы рассчитываетесь, мы рассчитываемся. Если вы платите по своим долгам, мы платим по своим. Если вы летаете, мы завоевываем и довольствуемся этим." — Визирь, который был наказан, Арабские Ночи
Большую часть времени, объекты, которые вы создаете, уже предопределены, или хотя бы принадлежат к одному из предопределенных типов. Однако, вы можете сделать свои объекты с нуля. Они могут быть полезными для ваших собственных разнообразных целей, когда вам не требуется весь тот дополнительный багаж, ассоциированный с встроенными типами.
Определение типа данных
Чтобы определить новый тип данных проще выделить из корня программы, чем из существующего типа объектов. Следующий код демонстрирует пример кода, который определяет новый тип данных - 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 использовалась здесь для получения случайного задания из всех описанных в коде.
Очевидно, что можно добавить разнообразные усовершенствования к основной системе системе. Например, вы моежете добавить новые награды и квесты. Однако, это хорошее начало и прекрасная демонстрация пользовательских объектов.
Заметьте, что мы никогда не удаляли квест, когда он заканчивался, а просто убирали его из списка. С того момента, как на этот объект больше никто нигде не ссылается, он будет автоматически удален.