ТОМ2 - платформа для парсерных игр

Объявление

Открыт сайт tom2-game.ru.


Последнюю версию платформы можно скачать здесь.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ТОМ2 - платформа для парсерных игр » Документация » Разбираем мышей. Часть 5: Модуль Containers


Разбираем мышей. Часть 5: Модуль Containers

Сообщений 1 страница 6 из 6

1

Модуль Containers.tml в 4 раза меньше модуля Main.tml, поэтому и разберём мы его весь сразу. К тому-же вы уже достаточно знаете об операторах языка ТОМ.
Так-что перейдём непосредственно к структуризации содержимого этого модуля без предварительного осмотра.

Классы

Модуль Containers содержит 3 класса: поверхность, контейнер и дверь.

http://savepic.org/662362.png

поверхность

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

предлог, пред_в, пред_из - идентичны свойствам классов место и персонаж из части 4.
По умолчанию определены как:
  this.предлог = "на" //находится на полу
  this.пред_в  = "на" //положил на пол
  this.пред_из = "с"  //взял с пола

Переопределяем при необходимости (очень редко).

можно_поместить(Предлог,Что) и можно_изъять(Предлог,Что) - методы, проверяющие можно ли положить/взять что-либо с поверхности. По умолчанию проверяют предлог и если он поставлен правильно, то разрешают положить/взять объект на/с поверхность(и).
Можно переопределить и добавить несколько своих проверок. Например, чтобы игрок при попытке положить на стол грязные ботинки получал отказ "я же за этим столом ем!".

st_описание - свойство, которое по умолчанию выводит обычное описание + описание содержимого (нам же видно, что лежит на поверхности). Меняем, только если сильно надо.

описание_содержимого(игнор_пустого,кратко,местоимение) - метод, используемый в других свойствах и описывающий содержимое поверхности. В большинстве случаев переопределять не требуется.

предмет_по_месту - выводит описание в описании локации. По умолчанию определён как "здесь есть {this}, {описание_содержимого(да,да,да)},". В наследниках требуется изменить первую часть на более внятную.

контейнер

Класс для создания объектов, которые могут содержать другие объекты (мешок, коробка, ящик и др.)

предлог, пред_в, пред_из - предлоги.
По умолчанию заданы так:
  this.предлог = "в"  //находится в сундуке
  this.пред_в  = "в"  //положил в сундук
  this.пред_из = "из" //взял из сундука

закрываемое - флаг, позволяющий указывать, можно ли контейнер закрывать и открывать. По умолчанию поставлено как "да". Можно изменить.

открылось(Чем) и закрылось(Чем) - два метода для принятия решения, открылся/закрылся ли контейнер предметом Чем. По умолчанию всегда выдают "да" (всегда можно закрыть/открыть контейнер). Можно запрограммировать так, что будет открываться/закрываться только определённым предметом или в определённое время.

прозрачно - определяет, видно ли содержимое контейнера в закрытом состоянии.

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

заперто - определяет, закрыт или открыт контейнер в данный момент. По умолчанию открыт (заперто = нет)

можно_поместить(Предлог,Что) и можно_изъять(Предлог,Что) - методы, идентичные методам класса поверхность.

st_описание - стандартное описание контейнера. По умолчанию содержит описание самого контейнера, его состояние (открыт/закрыт) и описание содержимого (если видно). Может составляться примерно в такое:
"Чёрный деревянный ящик со странными иероглифами по бокам (открыт), внутри чёрного ящика находится 9 круглых шаров и ржавая вилка."
Вполне нормальное описание, правда? Если не нравится, можете задать своё.

предмет_по_месту - описание контейнера в локации. Может выдавать такие фразы:
"Здесь есть чёрный деревянный ящик (открыт), внутри него 9 круглых шаров и ржавая вилка."
Начало предложения рекомендую изменить на что-то вроде "В правом углу комнаты стоит ..."

дверь

Класс, сделанный из контейнера, определяющий минимально необходимый функционал двери. Из комментариев: "дверь - это контейнер, который телепортирует своё содержание в другую локацию" (о как автор библиотеки завернул! Вот у кого фантазию-то занимать надо.)

можно_войти - определяет, можно ли входить в дверь (вдруг она у вас декоративная). По умолчанию "да".

описание - описание двери. Немного изменённая вариация отмазки на тему "обычная дверь". Всё-равно менять.

st_описание - свойство, генерирующее стандартное описание двери. Может выдавать такие предложения:
"перед тобой необычная стеклянная дверь (закрыта), за стеклянной дверью находится комната допросов."

fn_вид_из_окна() - метод, генерирующий описание вида из двери. По сути выдаёт наименование локации, в которую ведёт дверь (если видно). В большинстве случаев не меняем.

предмет_по_месту - описание двери в локации. Специально задано пустое значение, т.к. описание двери необходимо включать непосредственно в описание локации (они ведь у нас не бегают по локациям). Не меняем.

выход - здесь можно указать место, куда ведёт дверь или обратная дверь. По умолчанию не задано. Почти всегда нужно задавать (если дверь не декоративная).

ведёт_в() - метод, возвращающий локацию, куда ведёт дверь, или строку, если дверь никуда не ведёт.

Т.к. все объекты модуля Containers так или иначе наследуются от класса предмет, они обладают всеми его свойствами и методами. Не забывайте о них!

Мыслимые

Модуль Containers содержит всего один мыслимый объект: закрыт класса... состояние! Вот оно где всплыло. Упоминалось в первых строках модуля Main и использовалось лишь здесь. Толи ещё будет.

Действия

Содержит 2 действия: открыл и закрыл, обрабатывающие открытие/закрытие контейнеров.

Функции

Из функций мы видим лишь там_тут(Sp,Prs), которая возвращает "у него", если Sp - это персонаж, "тут", если Prs находится в одном месте с Sp и "там", если Prs находится на поверхности или в контейнере.

Вот и всё. Такая коротенькая часть получилась.

Вопрос к ASBer. Как понимать этот код из метода ведёт_в() класса дверь:
      if(выход.дверь) return выход.pos
      else return выход

почему, если (выход.дверь), то это дверь? Ведь по сути выход.дверь читает свойство дверь объекта выход. Или есть ещё варианты? Если таким способом можно проверять принадлежность к классам, то что делать, если в локации будет определено свойство с именем дверь и она(локация) указана в качестве параметра выход? Ложно сработает if(выход.дверь) return выход.pos и выход.pos вернёт global. Или я что-то путаю?

2

Alexandr написал(а):

Вопрос к ASBer. Как понимать этот код из метода ведёт_в() класса дверь:
      if(выход.дверь) return выход.pos
      else return выход

Да, это проверка принадлежности к классу "дверь".
Не рекомендуется задавать имена свойств объектов пересекающиеся с именами классов.
Хотя в этом конкретном месте проверку корректнее сделать как (выход.cls==дверь)

3

ASBer написал(а):

Да, это проверка принадлежности к классу "дверь".

Опасно делать такие пересечения операторов. Было бы безопаснее сделать новый оператор. Например is/это, который бы проверял принадлежность объекта к классу во всей цепочке классов. А проверка "(выход.cls==дверь)" спасает до тех пор, пока кто-нибудь не захочет унаследовать от двери новый класс, в котором функция ведёт_в() уже будет работать некорректно.
А вариант "(выход is дверь)" или "(выход это дверь)" даже звучит красиво :)

4

Между классами и свойствами существует весьма глубокая связь.
Например item-ы объекта можно отбирать по классу используя тот же синтаксис как и для отбора по свойству.
Кроме того есть возможность для объекта, который не наследуется от класса "дверь", частично унаследовать поведение двери прописав объекту свойство this.дверь = да.
Вобщем не всё так просто...

5

Alexandr написал(а):

можно_войти - определяет, можно ли входить в дверь (вдруг она у вас декоративная). По умолчанию "да".

Еще класс дверей можно использовать для окон :)
В этом случае можно_войти будет = нет
прозрачно = да
А предметы, положенные/выкинутые в окно будут попадать в локацию, в которую это окно выходит.

6

Alexandr написал(а):

заперто - определяет, закрыт или открыт контейнер в данный момент. По умолчанию открыт (заперто = нет)

На самом деле заперто - это заперто на ключ.
Открыт или закрыт контейнер определяется его состоянием закрыт

Код:
if(Дверь.item[закрыт]) %дверь закрыта
Дверь + закрыт //закрывает дверь
Дверь - закрыт //открывает дверь

Вы здесь » ТОМ2 - платформа для парсерных игр » Документация » Разбираем мышей. Часть 5: Модуль Containers