Модуль Containers.tml в 4 раза меньше модуля Main.tml, поэтому и разберём мы его весь сразу. К тому-же вы уже достаточно знаете об операторах языка ТОМ.
Так-что перейдём непосредственно к структуризации содержимого этого модуля без предварительного осмотра.
Классы
Модуль Containers содержит 3 класса: поверхность, контейнер и дверь.
поверхность
Класс для создания объектов со свойствами поверхностей, на которые можно помещать другие объекты (стол, пол, тумбочка, пъедестал, полка и т.п.).
предлог, пред_в, пред_из - идентичны свойствам классов место и персонаж из части 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. Или я что-то путаю?