Сцена
Сцена (или комната) -- это единица игры, в рамках которой игрок может изучать все объекты сцены и взаимодействовать с ними. Например, сценой может быть комната, в которой находится герой. Или участок леса, доступный для наблюдения.
В любой игре должна быть сцена с именем ''main''. Именно с неё начнётся и ваша игра!
room {
nam = 'main';
disp = "Главная комната";
dsc = [[Вы в большой комнате.]];
}Запись означает создание объекта (так как почти все сущности в INSTEAD это объекты) main типа room (комната). Атрибут объекта nam хранит имя комнаты 'main', по которому можно обращаться к комнате из кода. Каждый объект имеет своё уникальное имя. Если вы попробуете создать два объекта с одинаковыми именами, вы получите сообщение об ошибке.
Для обращения к объекту по имени, вы можете использовать следующую запись:
dprint("Объект: ", _'main')У каждого объекта игры есть атрибуты и обработчики событий. В данном примере есть два атрибута: nam и dsc. Атрибуты разделяются разделителем (в данном примере -- символом точка с запятой ';').
Обычно, атрибуты могут быть текстовыми строками, функциями-обработчиками и булевыми значениями. Однако, атрибут nam всегда должен быть текстовой строкой, если он задан.
На самом деле, вы можете не указывать имя при создании объекта:
room {
disp = "Главная комната";
dsc = [[Вы в большой комнате.]];
}В таком случае, движок сам даст имя объекту, и это имя будет неким числом. Так как вы не знаете это число, вы не можете обратиться к объекту явно. Иногда удобно создавать безымянные объекты, например, для декораций. При создании объекта, даже если он "безымянный", вы можете создать переменную - ссылку на объект, например:
myroom = room {
disp = "Чулан";
dsc = [[Вы в чулане.]];
}Переменная myroom в таком случае становится синонимом объекта (ссылкой на сам объект).
dprint("Объект: ", myroom)Вы можете придерживаться какого-то одного способа, или применять оба. Например, вы можете задать и имя, и переменную-ссылку:
main_room = room {
nam = 'main';
disp = "Главная комната";
dsc = [[Вы в большой комнате.]];
}Важно понять, что движок в любом случае работает с именами объектов, а переменные-ссылки -- это просто способ упростить доступ к часто используемым объектам. Поэтому, для нашей первой игры мы обязаны указать атрибут nam = 'main', чтобы создать комнату main с которой и начнётся наше приключение!
В нашем примере, при показе сцены, в качестве заголовка сцены будет использован атрибут 'disp'. На самом деле, если бы мы его не задали, то в заголовке мы бы увидели 'nam'. Но nam не всегда удобно делать заголовком сцены, особенно если это строка вроде 'main', или если это числовой идентификатор, который движок присвоил объекту автоматически.
Есть ещё более понятный атрибут 'title'. Если он задан, то при отображении комнаты в качестве заголовка будет указан именно он. title используется тогда, когда игрок находится внутри комнаты. Во всех остальных случаях (при показе переходов в эту комнату) используется 'disp' или 'nam'.
mroom = room {
nam = 'main';
title = 'Начало приключения';
disp = "Главная комната";
dsc = [[Вы в большой комнате.]];
}Атрибут 'dsc' -- это описание сцены, которое выводится один раз при входе в сцену или при явном осмотре сцены. В нем нет описаний объектов, присутствующих в сцене.
Вы можете использовать символ ',' вместо ';' для разделения атрибутов. Например:
room {
nam = 'main',
disp = 'Главная комната',
dsc = 'Вы в большой комнате.',
}В данном примере все атрибуты -- строковые. Строка может быть записана в одинарных или двойных кавычках:
room {
nam = 'main';
disp = 'Главная комната';
dsc = "Вы в большой комнате.";
}Для длинных описаний удобно использовать запись вида:
dsc = [[ Очень длинное описание... ]];При этом переводы строк игнорируются. Если вы хотите, чтобы в выводе описания сцены присутствовали абзацы -- используйте символ '^'.
dsc = [[ Первый абзац. ^^
Второй Абзац.^^
Третий абзац.^
На новой строке.]];Я рекомендую всегда использовать [[ и ]] для 'dsc'.
Напомню ещё раз, что имя 'nam' объекта и его отображение (в данном случае то, как сцена будет выглядеть для игрока в виде надписи сверху) можно (и, часто, нужно!) разделять. Для этого существуют атрибуты 'disp' и 'title'. 'title' бывает только у комнат и работает как описатель, когда игрок находится внутри данной комнаты. В остальных случаях используется 'disp' (если он есть).
Если 'disp' и 'title' не заданы, то считается, что отображение равняется имени.
'disp' и 'title' могут принимать значение false, в таком случае, отображения не будет.