-
Notifications
You must be signed in to change notification settings - Fork 42
Объекты
Объекты -- это единицы сцены, с которыми взаимодействует игрок.
obj {
nam = 'стол';
dsc = 'В комнате стоит {стол}.';
act = 'Гм... Просто стол...';
};
Имя объекта ''nam'' используется при попадании его в инвентарь. Хотя, в нашем случае, стол вряд ли туда попадет. Если у объекта определен 'disp', то при попадании в инвентарь для его отображения будет использоваться именно этот атрибут. Например:
obj {
nam = 'стол';
disp = 'угол стола';
dsc = 'В комнате стоит {стол}.';
tak = 'Я взялся за угол стола';
inv = 'Я держусь за угол стола.';
};
Все-таки стол попал к нам в инвентарь.
Вы можете скрывать отображение предмета в инвентаре, если 'disp' атрибут будет равен 'false'.
'dsc' -- описание объекта. Оно будет выведено в динамической части сцены, при наличии объекта в сцене. Фигурными скобками отображается фрагмент текста, который будет являться ссылкой в окне INSTEAD. Если объектов в сцене много, то все описания выводятся одно за другим, через пробел,
'act' -- это обработчик события, который вызывается при действии пользователя (действие на объект сцены, обычно -- клик мышкой по ссылке). Его основная задача -- вывод (возвращение) строки текста, которая станет частью событий сцены, и изменение состояния игрового мира.
Для того, чтобы поместить в сцену объекты, существует несколько путей.
Во-первых, при создании комнаты можно определить список 'obj', состоящий из имен объектов:
obj { -- объект с именем, но без переменной
nam = 'ящик';
dsc = [[На полу я вижу {ящик}.]];
act = [[Тяжелый!]];
}
room {
nam = 'main';
disp = 'Большая комната';
dsc = [[Вы в большой комнате.]];
obj = { 'ящик' };
};
Теперь, при отображении сцены мы увидим объект "ящик" в динамической части.
Вместо имени объекта, вы можете использовать переменную-ссылку, если только она была определена заранее:
apple = obj { -- объект с переменной, но без имени
dsc = [[Тут есть {яблоко}.]];
act = [[Красное!!]];
}
room {
nam = 'main';
disp = 'Большая комната';
dsc = [[Вы в большой комнате.]];
obj = { apple };
};
Альтернативной формой записи является конструкция with:
room {
nam = 'main';
disp = 'Большая комната';
dsc = [[Вы в большой комнате.]];
}:with {
'ящик',
}
Конструкция with позволяет избавиться от лишнего уровня вложенности в коде игры.
Во-вторых, вы можете объявлять объекты прямо внутри obj или with, описывая их определение:
room {
nam = 'main';
disp = 'Большая комната';
dsc = [[Вы в большой комнате.]];
}:with {
obj {
nam = 'ящик';
dsc = [[На полу я вижу {ящик}.]];
act = [[Тяжелый!]];
}
};
Это удобно делать для объектов - декораций. Но в таком случае, вы не сможете создавать объекты с переменной-ссылкой. К счастью, для декораций это и не нужно.
Если в комнату помещаются несколько объектов, разделяйте их ссылки запятыми, например:
obj = { 'ящик', apple };
Вы можете вставлять переводы строк для наглядности, когда объектов много, например, так:
obj = {
'tabl',
'apple',
'knife',
};
Еще один способ размещения предметов заключается в вызове функций, которые поместят объекты в требуемые комнаты. Он будет рассмотрен в дальнейшем.
Объекты, которые могут быть перенесены из одной сцены в другую (или попадать в инвентарь), обычно имеют имя и/или переменную-ссылку. Так как таким образом вы всегда можете найти объект где угодно и работать с ним.
Но немалую часть игрового мира составляют объекты, которые занимают конкретную локацию и служат в качестве декораций.
Таких объектов может быть очень много, и более того, обычно это однотипные объекты вроде деревьев и тому подобных объектов.
Для создания декораций можно использовать различные подходы.
Вы можете создать один объект, например, 'дерево' и помещать их в разные комнаты.
obj {
nam = 'дерево';
dsc = [[Тут стоит {дерево}.]];
act = [[Все деревья выглядят похожими.]];
}
room {
nam = 'Лес';
obj = { 'дерево' };
}
room {
nam = 'Улица';
obj = { 'дерево' };
}
Если вам не нравится придумывать уникальные имена для однотипных декоративных объектов, вы можете использовать для таких объектов теги. Теги задаются атрибутом tag и всегда начинаются с символа '#':
obj {
tag = '#цветы';
dsc = [[Тут есть {цветы}.]]
}
В данном примере, имя у объекта будет сформировано автоматически, но обращаться к объекту вы сможете по тегу. При этом объект будет искаться в текущей комнате. Например:
dprint(_'#цветы') -- ищем в текущей комнате первый объект с тегом '#цветы'
Теги, это в каком то смысле, синоним локальных имен, поэтому существует альтернативная запись создания предмета с тегом:
obj {
nam = '#цветы';
dsc = [[Тут есть {цветы}.]]
}
Если имя у объекта начинается с символа '#', то такой объект получает тег и автоматически сгенерированное числовое имя.
Объекты тоже могут содержать в себе атрибут 'obj' (или конструкцию 'with'). При этом, при выводе объектов, INSTEAD будет разворачивать списки последовательно. Такая техника может использоваться для создания объектов-контейнеров или просто для связывания нескольких описаний вместе. Например, поместим на стол яблоко.
obj {
nam = 'яблоко';
dsc = [[На столе лежит {яблоко}.]];
act = 'Взять что-ли?';
};
obj {
nam = 'стол';
dsc = [[В комнате стоит {стол}.]];
act = 'Гм... Просто стол...';
obj = { 'яблоко' };
};
room {
nam = 'Дом';
obj = { 'стол' };
}
При этом, в описании сцены мы увидим описание объектов 'стол' и 'яблоко', так как 'яблоко' -- связанный со столом объект и движок при выводе объекта 'стол' вслед за его 'dsc' выведет последовательно ''dsc'' всех вложенных в него объектов.
Также, следует отметить, что оперируя объектом 'стол' (например, перемещая его из комнаты в комнату) мы автоматически будем перемещать и вложенный в него объект 'яблоко'.
Конечно, данный пример мог бы быть написан и по другому, например, так:
room {
nam = 'Дом';
}:with {
obj {
nam = 'стол';
dsc = [[В комнате стоит {стол}.]];
act = 'Гм... Просто стол...';
}: with {
obj {
nam = 'яблоко';
dsc = [[На столе лежит {яблоко}.]];
act = 'Взять что-ли?';
};
}
}
Выбирайте тот способ, который для вас понятней.