Added the index and slightly changed Makefile.

In case of trouble with compilation, give the command:
makeindex manual.idx
And you'll be enlightened.
This commit is contained in:
Alexander Yakovlev 2009-11-12 08:17:09 +00:00
parent 9adc1222ac
commit df094db760
2 changed files with 139 additions and 65 deletions

View file

@ -3,8 +3,9 @@ include ../config.make
pdf: pdf:
pdflatex manual.tex pdflatex manual.tex
makeindex manual.idx
pdflatex manual.tex pdflatex manual.tex
$(RM) manual.aux manual.log manual.toc manual.out $(RM) manual.aux manual.log manual.toc manual.out manual.idx manual.ind
clean: clean:
all: all:
install: install:

View file

@ -1,6 +1,3 @@
%На будущее даю инструкции по стилю кода.
%Использовать \verb вместо \texttt,где это возможно.
%Пробелы ДО и ПОСЛЕ таблиц. Только при помощи \medskip.
\documentclass[a4paper,12pt]{article} \documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[russian]{babel} \usepackage[russian]{babel}
@ -11,6 +8,8 @@
\usepackage{wrapfig}%обтекание текстом \usepackage{wrapfig}%обтекание текстом
\geometry{verbose,tmargin=1cm,bmargin=1cm,lmargin=1cm,rmargin=1cm,headheight=1cm,headsep=1cm,footskip=0.7cm} \geometry{verbose,tmargin=1cm,bmargin=1cm,lmargin=1cm,rmargin=1cm,headheight=1cm,headsep=1cm,footskip=0.7cm}
\usepackage{indentfirst} \usepackage{indentfirst}
\usepackage{makeidx}
\makeindex
\begin{document} \begin{document}
\title{Справочное пособие по INSTEAD} \title{Справочное пособие по INSTEAD}
\author{Александр Яковлев\\oreolek@jabber.ru \and \textit{при участии Петра Косых}\\\textit{gl00my@jabber.ru}} \author{Александр Яковлев\\oreolek@jabber.ru \and \textit{при участии Петра Косых}\\\textit{gl00my@jabber.ru}}
@ -28,12 +27,16 @@
\label{INSTEAD-running} \label{INSTEAD-running}
\end{wrapfigure} \end{wrapfigure}
\index{Главное окно}
\textbf{Главное окно} игры содержит информацию о статической и динамической части сцены, активные события и картинку сцены с возможными переходами в другие сцены (в графическом интерпретаторе). \textbf{Главное окно} игры содержит информацию о статической и динамической части сцены, активные события и картинку сцены с возможными переходами в другие сцены (в графическом интерпретаторе).
\index{Сцена!динамическая часть}
\textbf{Динамическая часть} сцены составлена из описаний объектов сцены, она отображается всегда. Она может выглядеть так: <<Стоит стол. Рядом стоит стул>>. Если динамическая часть пуста, то игроку не с чем контактировать в сцене. \textbf{Динамическая часть} сцены составлена из описаний объектов сцены, она отображается всегда. Она может выглядеть так: <<Стоит стол. Рядом стоит стул>>. Если динамическая часть пуста, то игроку не с чем контактировать в сцене.
\index{Сцена!статическая часть}
\textbf{Статическая часть} сцены описывает саму сцену, её <<декорации>>. Она отображается при показе сцены (единожды или каждый раз --- решает автор игры), или при повторении команды look (в графическом интерпретаторе при щелчке на названии сцены). \textbf{Статическая часть} сцены описывает саму сцену, её <<декорации>>. Она отображается при показе сцены (единожды или каждый раз --- решает автор игры), или при повторении команды look (в графическом интерпретаторе при щелчке на названии сцены).
\index{Инвентарь}
Игрок имеет собственный \textbf{инвентарь}. В нём лежат объекты, доступные на любой сцене. Чаще всего инвентарь рассматривают как некую <<котомку>>, в которой лежат объекты; в этом случае каждый объект считают предметом. Такая трактовка практична, обыденна и интуитивна; но не единственна. Понятие инвентаря является условным, ведь это лишь контейнер. В нём могут находиться такие объекты, как <<открыть>>, <<потрогать>>, <<лизнуть>>. Можно наполнить его объектами <<нога>>, <<рука>>, <<мозг>>. Автор игры свободен в определении этих понятий, но он также должен определить действия игрока над ними. Игрок имеет собственный \textbf{инвентарь}. В нём лежат объекты, доступные на любой сцене. Чаще всего инвентарь рассматривают как некую <<котомку>>, в которой лежат объекты; в этом случае каждый объект считают предметом. Такая трактовка практична, обыденна и интуитивна; но не единственна. Понятие инвентаря является условным, ведь это лишь контейнер. В нём могут находиться такие объекты, как <<открыть>>, <<потрогать>>, <<лизнуть>>. Можно наполнить его объектами <<нога>>, <<рука>>, <<мозг>>. Автор игры свободен в определении этих понятий, но он также должен определить действия игрока над ними.
На рисунке \ref{INSTEAD-running} очень чётко видны границы между этими областями. Главное окно имеет бежевый фон\footnote{Поправьте меня,если я неправ; в описании главного окна нет инвентаря}, инвентарь --- чёрный.Динамическая часть идёт сразу после ссылок перехода и выделена курсивом; статическая часть отпечатана обычным шрифтом. На рисунке \ref{INSTEAD-running} очень чётко видны границы между этими областями. Главное окно имеет бежевый фон\footnote{Поправьте меня,если я неправ; в описании главного окна нет инвентаря}, инвентарь --- чёрный.Динамическая часть идёт сразу после ссылок перехода и выделена курсивом; статическая часть отпечатана обычным шрифтом.
@ -50,10 +53,13 @@
Осмотр сцены --- это чаще всего неявное действие. Игрок входит в комнату, он автоматически осматривает её. Осмотр сцены --- это чаще всего неявное действие. Игрок входит в комнату, он автоматически осматривает её.
\index{Действие!на объект сцены}
Действие на объект сцены обычно понимается как изучение объекта, или использование его. Например, если в сцене существует объект <<чашка кофе>>, то действием на него может быть выпивание кофе, тщательный осмотр чашки, разбивание чашки или перемещение чашки в инвентарь. Это определяется только автором и никем другим. Действие на объект сцены обычно понимается как изучение объекта, или использование его. Например, если в сцене существует объект <<чашка кофе>>, то действием на него может быть выпивание кофе, тщательный осмотр чашки, разбивание чашки или перемещение чашки в инвентарь. Это определяется только автором и никем другим.
\index{Действие!на объект инвентаря}
Действие на объект инвентаря понимается аналогично. Например, если в инвентаре лежит объект <<яблоко>>, его можно съесть или осмотреть. С другой стороны, если в инвентаре лежит объект <<осмотреть>>, то действие над ним будет трудно описать логически. Действие на объект инвентаря понимается аналогично. Например, если в инвентаре лежит объект <<яблоко>>, его можно съесть или осмотреть. С другой стороны, если в инвентаре лежит объект <<осмотреть>>, то действие над ним будет трудно описать логически.
\index{Действие!объектом на объект}
Действие объектом инвентаря на объект сцены --- это чаще всего использование или передача объекта. Например, действие объектом <<нож>> на объект <<бармен>> может означать передачу ножа бармену, угрозу ножом бармену, убийство ножом бармена и многое другое. Действие объектом инвентаря на объект сцены --- это чаще всего использование или передача объекта. Например, действие объектом <<нож>> на объект <<бармен>> может означать передачу ножа бармену, угрозу ножом бармену, убийство ножом бармена и многое другое.
Действие объектом инвентаря на объект инвентаря понимается так же свободно. Это может быть соединение предметов (<<сарделька>> + <<кетчуп>>) в одно (<<сарделька с кетчупом>>), либо использование (<<открыть>> + <<ящик>>). Действие объектом инвентаря на объект инвентаря понимается так же свободно. Это может быть соединение предметов (<<сарделька>> + <<кетчуп>>) в одно (<<сарделька с кетчупом>>), либо использование (<<открыть>> + <<ящик>>).
@ -69,6 +75,7 @@
\end{verbatim} \end{verbatim}
Интерпретатор ищет доступные игры в следующих каталогах: Интерпретатор ищет доступные игры в следующих каталогах:
\index{Каталоги!игр}
Unix версия интерпретатора просматривает \verb;/usr/local/share/instead/games; (по умолчанию), а также \verb,~/.instead/games,. Unix версия интерпретатора просматривает \verb;/usr/local/share/instead/games; (по умолчанию), а также \verb,~/.instead/games,.
@ -76,7 +83,7 @@ Windows сборка использует каталог \verb/куда-вы-у
На данный момент активно развивается только графическая ветка интерпретатора --- INSTEAD-SDL. Поэтому справочник в б\'{о}льшей мере описывает её возможности. На данный момент активно развивается только графическая ветка интерпретатора --- INSTEAD-SDL. Поэтому справочник в б\'{о}льшей мере описывает её возможности.
\section{Сцена} \section{Сцена}\index{Сцена}
Сцена --- это единица игры, в рамках которой игрок может изучать все объекты сцены и взаимодействовать с ними. В игре должна быть хотя бы одна сцена с именем main. Сцена --- это единица игры, в рамках которой игрок может изучать все объекты сцены и взаимодействовать с ними. В игре должна быть хотя бы одна сцена с именем main.
@ -89,10 +96,14 @@ main = room {
Отмечу, что пример выше является минимальной игрой для INSTEAD. Это некий <<Hello, World>>, который я рекомендую сохранить под именем main.lua и поместить в отдельную папку в каталоге для игр. Отмечу, что пример выше является минимальной игрой для INSTEAD. Это некий <<Hello, World>>, который я рекомендую сохранить под именем main.lua и поместить в отдельную папку в каталоге для игр.
\index{Атрибуты!nam}
Атрибут \verb/nam/ (имя) является необходимым для любого объекта. Для сцены это --- то, что будет заголовком сцены при её отображении. Имя сцены также используется для её идентификации при переходах. Атрибут \verb/nam/ (имя) является необходимым для любого объекта. Для сцены это --- то, что будет заголовком сцены при её отображении. Имя сцены также используется для её идентификации при переходах.
\index{Атрибуты!dsc}
Атрибут \verb/dsc/ --- это описание статической части сцены, которое выводится при входе в сцену или выполнении команды look. Атрибут \verb/dsc/ --- это описание статической части сцены, которое выводится при входе в сцену или выполнении команды look.
\index{Атрибуты!forcedsc}
\textbf{\textcolor{red}{Внимание!!!}} Если для вашего творческого замысла необходимо, чтобы описание статической части сцены выводилось на каждом ходу (а не только при первом входе в сцену), вы можете определить для своей игры параметр forcedsc (в начале игры). \textbf{\textcolor{red}{Внимание!!!}} Если для вашего творческого замысла необходимо, чтобы описание статической части сцены выводилось на каждом ходу (а не только при первом входе в сцену), вы можете определить для своей игры параметр forcedsc (в начале игры).
\begin{verbatim} \begin{verbatim}
@ -101,6 +112,7 @@ game.forcedsc = true;
Или, аналогично, задать атрибут forcedsc для конкретных сцен. Или, аналогично, задать атрибут forcedsc для конкретных сцен.
\index{[[ ]]}
Для длинных описаний удобно использовать запись вида: Для длинных описаний удобно использовать запись вида:
\begin{verbatim} \begin{verbatim}
@ -118,8 +130,10 @@ dsc = [[ Первый абзац. ^^
\end{verbatim} \end{verbatim}
К текущей сцене можно обратиться через функцию \verb/here()/. К текущей сцене можно обратиться через функцию \verb/here()/.
\index{Функции!here}
\section{Объект} \section{Объект}
\index{Объекты!нормальные}
\subsection{Нормальные объекты} \subsection{Нормальные объекты}
Объекты --- это единицы сцены, с которыми взаимодействует игрок. Объекты --- это единицы сцены, с которыми взаимодействует игрок.
@ -133,8 +147,10 @@ table = obj {
Имя объекта \verb/nam/ используется для адресации объекта. Имя объекта \verb/nam/ используется для адресации объекта.
\index{Атрибуты!dsc}
\verb/dsc/ --- описатель объекта. Он будет выведен в динамической части сцены. Фигурными скобками отображается фрагмент текста, который будет являться ссылкой в графическом интерпретаторе. Если вы забудете сделать ссылку, то интерпретатор не выдаст ошибки, но игроки не смогут взаимодействовать с объектом. \verb/dsc/ --- описатель объекта. Он будет выведен в динамической части сцены. Фигурными скобками отображается фрагмент текста, который будет являться ссылкой в графическом интерпретаторе. Если вы забудете сделать ссылку, то интерпретатор не выдаст ошибки, но игроки не смогут взаимодействовать с объектом.
\index{Атрибуты!act}
\verb/act/ --- это обработчик, который вызывается при действии пользователя на объект сцены. Если объект находится в инвентаре, то действие с ним будет передаваться другому обработчику --- \verb/inv/. \verb/act/ --- это обработчик, который вызывается при действии пользователя на объект сцены. Если объект находится в инвентаре, то действие с ним будет передаваться другому обработчику --- \verb/inv/.
Настало время сделать небольшое отступление. До сих пор в примерах приводились примитивные обработчики, которые всего лишь возвращают определённую строку. В примере выше обращение к объекту вызовет банальную реакцию: интерпретатор напечатает строку <<Гм... Просто стол...>>. Хуже того: он будет отвечать тем же образом каждый раз при обращении к объекту. Это не совсем гибкий подход, поэтому STEAD позволяет определить любой атрибут объекта как функцию. Так, возможно построить такую конструкцию: Настало время сделать небольшое отступление. До сих пор в примерах приводились примитивные обработчики, которые всего лишь возвращают определённую строку. В примере выше обращение к объекту вызовет банальную реакцию: интерпретатор напечатает строку <<Гм... Просто стол...>>. Хуже того: он будет отвечать тем же образом каждый раз при обращении к объекту. Это не совсем гибкий подход, поэтому STEAD позволяет определить любой атрибут объекта как функцию. Так, возможно построить такую конструкцию:
@ -160,10 +176,12 @@ apple = obj {
}; };
\end{verbatim} \end{verbatim}
\index{Функции}
Если атрибут или обработчик оформлен как функция, то обычно первый аргумент функции \verb/(s)/ есть сам объект. В данном примере, при показе сцены будет в динамической части сцены будет текст: <<На столе что-то лежит>>. При взаимодействии с <<что-то>>, переменная \verb/_seen/ объекта \verb/apple/ будет установлена в \verb/true/, и мы увидим, что это было яблоко. Если атрибут или обработчик оформлен как функция, то обычно первый аргумент функции \verb/(s)/ есть сам объект. В данном примере, при показе сцены будет в динамической части сцены будет текст: <<На столе что-то лежит>>. При взаимодействии с <<что-то>>, переменная \verb/_seen/ объекта \verb/apple/ будет установлена в \verb/true/, и мы увидим, что это было яблоко.
Если аргумент у функции единственен, то скобки вокруг аргумента можно опускать. Так, например, \verb/return/ --- это функция, но здесь она написана без скобок. Дальнейшие примеры будут часто использовать эту возможность. Вы можете и не опускать скобки, если это не нравится вам по стилю. Если аргумент у функции единственен, то скобки вокруг аргумента можно опускать. Так, например, \verb/return/ --- это функция, но здесь она написана без скобок. Дальнейшие примеры будут часто использовать эту возможность. Вы можете и не опускать скобки, если это не нравится вам по стилю.
\index{Переменные}
Запись \verb/s._seen/ означает, что переменная \verb/_seen/ размещена в объекте \verb/s/ (то есть, \verb/apple/). В языке Lua переменные необязательно объявлять заранее, при первом обращении к ней переменная \verb/apple._seen/ появится сама; но хорошим тоном будет заранее \textbf{проинициализировать} переменную со значением \verb/false/. Запись \verb/s._seen/ означает, что переменная \verb/_seen/ размещена в объекте \verb/s/ (то есть, \verb/apple/). В языке Lua переменные необязательно объявлять заранее, при первом обращении к ней переменная \verb/apple._seen/ появится сама; но хорошим тоном будет заранее \textbf{проинициализировать} переменную со значением \verb/false/.
Подчёркивание в имени переменной означает, что она \textbf{попадёт} в файл сохранения игры. Сохраняются все переменные, название которых начинается с большой буквы или с подчёркивания. Вы можете переопределить функцию \verb/isForSave(k)/, если вас это не устраивает. Подчёркивание в имени переменной означает, что она \textbf{попадёт} в файл сохранения игры. Сохраняются все переменные, название которых начинается с большой буквы или с подчёркивания. Вы можете переопределить функцию \verb/isForSave(k)/, если вас это не устраивает.
@ -172,6 +190,7 @@ apple = obj {
\subsection{Облегчённые объекты} \subsection{Облегчённые объекты}
\index{Объекты!облегчённые}
Иногда, сцену нужно наполнить декорациями, которые обладают ограниченной функциональностью, но делают игру разнообразней. Для этого можно использовать облегчённый объект. Например: Иногда, сцену нужно наполнить декорациями, которые обладают ограниченной функциональностью, но делают игру разнообразней. Для этого можно использовать облегчённый объект. Например:
\begin{verbatim} \begin{verbatim}
@ -188,10 +207,12 @@ sside = room {
}; };
\end{verbatim} \end{verbatim}
\index{Объекты!облегчённые!vobj}
Как видим, \verb/vobj/ позволяет сделать лёгкую версию статического объекта, с которым тем не менее можно взаимодействовать (за счёт определения обработчика \verb/act/ в сцене и анализа ключа объекта). \verb/vobj/ также вызывает метод \verb/used/, при этом в качестве третьего параметра передаётся объект, воздействующий на виртуальный объект. Как видим, \verb/vobj/ позволяет сделать лёгкую версию статического объекта, с которым тем не менее можно взаимодействовать (за счёт определения обработчика \verb/act/ в сцене и анализа ключа объекта). \verb/vobj/ также вызывает метод \verb/used/, при этом в качестве третьего параметра передаётся объект, воздействующий на виртуальный объект.
Синтаксис \verb/vobj/ таков: \verb/vobj(ключ, имя, описатель);,/ где ключ --- это цифра, которая будет передана обработчикам \verb.act/used. сцены как второй параметр. Синтаксис \verb/vobj/ таков: \verb/vobj(ключ, имя, описатель);,/ где ключ --- это цифра, которая будет передана обработчикам \verb.act/used. сцены как второй параметр.
\index{Объекты!облегчённые!vway}
Существует модификация объекта \verb/vobj/ под именем \verb/vway/. \verb/vway/ реализует ссылку. Синтаксис и пример: Существует модификация объекта \verb/vobj/ под именем \verb/vway/. \verb/vway/ реализует ссылку. Синтаксис и пример:
\begin{verbatim} \begin{verbatim}
@ -201,6 +222,7 @@ obj = { vway("дальше", "Нажмите {здесь}.", 'nextroom') }
Вы можете динамически заполнять сцену объектами \verb/vobj/ или \verb/vway/ с помощью методов \verb/add/ и \verb/del/. Вы можете динамически заполнять сцену объектами \verb/vobj/ или \verb/vway/ с помощью методов \verb/add/ и \verb/del/.
\index{Объекты!облегчённые!vroom}
В довершение, определена также упрощённая сцена \verb/vroom/. Синтаксис: В довершение, определена также упрощённая сцена \verb/vroom/. Синтаксис:
\begin{verbatim} \begin{verbatim}
@ -222,7 +244,8 @@ objs()[1]:enable();
\end{verbatim} \end{verbatim}
\subsection{Динамическое создание объектов} \subsection{Динамическое создание объектов}
\index{Функции!new}
\index{Функции!delete}
Вы можете использовать аллокаторы \verb/new/ и \verb/delete/ для создания и удаление динамических объектов: Вы можете использовать аллокаторы \verb/new/ и \verb/delete/ для создания и удаление динамических объектов:
\begin{verbatim} \begin{verbatim}
@ -231,14 +254,16 @@ put(new [[obj {nam = 'test' } ]]);
put(new('myconstructor()'); put(new('myconstructor()');
\end{verbatim} \end{verbatim}
Созданный объект будет попадать в файл сохранения. \verb/new()/ возвращает реальный объект; чтобы получить его имя,если это нужно, используйте функцию \verb/deref()./ Созданный объект будет попадать в файл сохранения. \verb/new()/ возвращает реальный объект; чтобы получить его имя,если это нужно, используйте функцию \index{Функции!deref} \verb/deref()./
\section{Некоторые манипуляции с объектами} \section{Некоторые манипуляции с объектами}
\subsection{Объект и сцена} \subsection{Объект и сцена}
\index{Ссылки!на объект}
Ссылкой на объект называется текстовая строка, содержащая имя объекта при его создании. Например: \verb/'table'/ --- ссылка на объект \verb/table/. Ссылкой на объект называется текстовая строка, содержащая имя объекта при его создании. Например: \verb/'table'/ --- ссылка на объект \verb/table/.
\index{Атрибуты!obj}
Для того, чтобы поместить в сцену объекты, нужно определить массив \verb/obj/, состоящий из ссылок на объекты: Для того, чтобы поместить в сцену объекты, нужно определить массив \verb/obj/, состоящий из ссылок на объекты:
\begin{verbatim} \begin{verbatim}
@ -251,6 +276,9 @@ main = room {
\subsection{Объекты, связанные с объектами} \subsection{Объекты, связанные с объектами}
\index{Объекты!связанные}
\index{Атрибуты!obj}
Объекты тоже могут содержать атрибут \verb/obj./ При этом, список будет последовательно разворачиваться. Например, поместим на стол яблоко: Объекты тоже могут содержать атрибут \verb/obj./ При этом, список будет последовательно разворачиваться. Например, поместим на стол яблоко:
\begin{verbatim} \begin{verbatim}
@ -270,6 +298,7 @@ table = obj {
\subsection{Действия объектов друг на друга} \subsection{Действия объектов друг на друга}
\index{Действие!объектом на объект}
Игрок может действовать объектом инвентаря на другие объекты. При этом вызывается обработчик \verb/use/ у объекта которым действуют и \verb/used/ --- на которого действуют. Игрок может действовать объектом инвентаря на другие объекты. При этом вызывается обработчик \verb/use/ у объекта которым действуют и \verb/used/ --- на которого действуют.
Например: Например:
@ -306,6 +335,10 @@ return 'Строка реакции', false;
\subsection{Скрытие объектов} \subsection{Скрытие объектов}
\index{Объекты!скрытые}
\index{Методы!enable}
\index{Методы!disable}
При помощи методов \verb/enable/ и \verb/disable/ становится возможным управлять появлением и исчезновением объектов. При помощи методов \verb/enable/ и \verb/disable/ становится возможным управлять появлением и исчезновением объектов.
Скрытый объект --- это объект, который находится в сцене, но на данный момент словно бы <<выключен>>. Он присутствует для движка, но не существует для игрока. Его описание не выводится и с ним невозможно контактировать. Это можно использовать, например, вместо динамического создания объектов. Скрытый объект --- это объект, который находится в сцене, но на данный момент словно бы <<выключен>>. Он присутствует для движка, но не существует для игрока. Его описание не выводится и с ним невозможно контактировать. Это можно использовать, например, вместо динамического создания объектов.
@ -317,8 +350,11 @@ return 'Строка реакции', false;
\section{Смена сцен} \section{Смена сцен}
\index{Сцена!смена сцен}
Как только главный герой уходит со сцены, декорации меняются. Но чтобы игрок ушёл из нашей сцены, он должен знать, куда идти. Как только главный герой уходит со сцены, декорации меняются. Но чтобы игрок ушёл из нашей сцены, он должен знать, куда идти.
\index{Атрибуты!way}
Для перехода между сценами используется атрибут сцены --- список \verb/way/. Для перехода между сценами используется атрибут сцены --- список \verb/way/.
\begin{verbatim} \begin{verbatim}
@ -338,6 +374,8 @@ main = room {
При этом, вы сможете переходить между сценами \verb/main/ и \verb/room2/. Как вы помните, \verb/nam/ может быть функцией, и вы можете генерировать имена сцен на лету, например, если вы хотите, чтобы игрок не знал название сцены, пока не попал на неё. При этом, вы сможете переходить между сценами \verb/main/ и \verb/room2/. Как вы помните, \verb/nam/ может быть функцией, и вы можете генерировать имена сцен на лету, например, если вы хотите, чтобы игрок не знал название сцены, пока не попал на неё.
\index{Атрибуты!exit}
\index{Атрибуты!enter}
При переходе между сценами движок вызывает обработчик \verb/exit/ из текущей сцены и \verb/enter/ той сцены, куда идёт игрок. \verb/exit/ и \verb/enter/ могут быть функциями --- тогда первый параметр это сам объект, а второй --- ссылка на комнату куда игрок хочет идти (для \verb/exit/) или из которой уходит (для \verb/enter/). Например: При переходе между сценами движок вызывает обработчик \verb/exit/ из текущей сцены и \verb/enter/ той сцены, куда идёт игрок. \verb/exit/ и \verb/enter/ могут быть функциями --- тогда первый параметр это сам объект, а второй --- ссылка на комнату куда игрок хочет идти (для \verb/exit/) или из которой уходит (для \verb/enter/). Например:
\begin{verbatim} \begin{verbatim}
@ -358,10 +396,12 @@ room2 = room {
}; };
\end{verbatim} \end{verbatim}
\index{Атрибуты!tak}
Как видим, обработчики могут возвращать два значения: строку и статус. В нашем примере функция \verb/exit/ вернёт \verb/false/, если игрок попытается уйти из зала в \verb/main/. \verb/false/ блокирует переход. Такая же логика работает и для \verb/enter/. Кроме того, она работает и для обработчика \verb/tak/ (о нём чуть позже). Как видим, обработчики могут возвращать два значения: строку и статус. В нашем примере функция \verb/exit/ вернёт \verb/false/, если игрок попытается уйти из зала в \verb/main/. \verb/false/ блокирует переход. Такая же логика работает и для \verb/enter/. Кроме того, она работает и для обработчика \verb/tak/ (о нём чуть позже).
\textbf{\textcolor{red}{Важное замечание:}} обработчик enter вызывается не при входе в комнату, а чуть раньше. Когда игрок хочет уйти в комнату, движок вызывает её обработчик enter, чтобы убедиться в том, что тот не возвращает false и переход возможен. Поэтому если вы используете \verb/here()/ в \verb/enter/, она будет указывать прежде всего --- на предыдущую комнату. Если вы передаёте enter параметр сцены, то он будет указывать всегда на текущую сцену. \textbf{\textcolor{red}{Важное замечание:}} обработчик enter вызывается не при входе в комнату, а чуть раньше. Когда игрок хочет уйти в комнату, движок вызывает её обработчик enter, чтобы убедиться в том, что тот не возвращает false и переход возможен. Поэтому если вы используете \verb/here()/ в \verb/enter/, она будет указывать прежде всего --- на предыдущую комнату. Если вы передаёте enter параметр сцены, то он будет указывать всегда на текущую сцену.
\index{Функции!goto}
Если требуется перейти на другую сцену автоматически, можно использовать функцию \verb/goto/ со ссылкой на сцену как параметром: Если требуется перейти на другую сцену автоматически, можно использовать функцию \verb/goto/ со ссылкой на сцену как параметром:
\begin{verbatim} \begin{verbatim}
@ -384,8 +424,12 @@ exit = function(s, t)
\subsection{Инвентарь} \subsection{Инвентарь}
\index{Инвентарь}
\index{Функции!inv}
Инвентарь проще всего возвращается функцией inv(). Он представлен списком, поэтому для него справедливы все их трюки (см. соответствующий раздел). Инвентарь проще всего возвращается функцией inv(). Он представлен списком, поэтому для него справедливы все их трюки (см. соответствующий раздел).
\index{Функции!tak}
Простейший вариант сделать объект, который можно брать --- определить у него обработчик tak. Простейший вариант сделать объект, который можно брать --- определить у него обработчик tak.
Если предмет сцены имеет обработчик \verb/tak/ и НЕ имеет обработчика \verb/act/ \footnote{Пользуясь случаем: я считаю, что tak --- немного неудобное имя. Именно так. --- А.Я.}, то при действии на нём вызывается не \verb/act/, а \verb/tak/; после этого предмет перемещается в инвентарь. Это происходит вот так: Если предмет сцены имеет обработчик \verb/tak/ и НЕ имеет обработчика \verb/act/ \footnote{Пользуясь случаем: я считаю, что tak --- немного неудобное имя. Именно так. --- А.Я.}, то при действии на нём вызывается не \verb/act/, а \verb/tak/; после этого предмет перемещается в инвентарь. Это происходит вот так:
@ -400,8 +444,10 @@ apple = obj {
\subsection{Игрок} \subsection{Игрок}
\index{Объекты!pl}
Игрок в STEAD представлен объектом \verb/pl/. Тип объекта --- \verb/player/. Игрок в STEAD представлен объектом \verb/pl/. Тип объекта --- \verb/player/.
\index{Атрибуты!obj}
Атрибут \verb/obj/ представляет собой инвентарь игрока. Атрибут \verb/obj/ представляет собой инвентарь игрока.
Объекты игрока можно воспринимать как объекты инвентаря, в этом случае верны следующие конструкции: Объекты игрока можно воспринимать как объекты инвентаря, в этом случае верны следующие конструкции:
@ -417,12 +463,16 @@ where('knife');
\subsection{Игра} \subsection{Игра}
\index{Объекты!game}
Игра представлена объектом \verb/game/. Он хранит в себе указатель на текущего игрока (\verb/'pl'/) и некоторые параметры. Например, вы можете указать в начале своей игры кодировку текста следующим образом: Игра представлена объектом \verb/game/. Он хранит в себе указатель на текущего игрока (\verb/'pl'/) и некоторые параметры. Например, вы можете указать в начале своей игры кодировку текста следующим образом:
\begin{verbatim} \begin{verbatim}
game.codepage="UTF-8"; game.codepage="UTF-8";
\end{verbatim} \end{verbatim}
\index{Атрибуты!act}
\index{Атрибуты!inv}
\index{Атрибуты!use}
Кроме того, объект \verb/game/ может содержать обработчики по умолчанию \verb/act/, \verb/inv/, \verb/use/, которые будут вызваны, если в результате действий пользователя не будут найдены никакие другие обработчики. Например, вы можете написать в начале игры: Кроме того, объект \verb/game/ может содержать обработчики по умолчанию \verb/act/, \verb/inv/, \verb/use/, которые будут вызваны, если в результате действий пользователя не будут найдены никакие другие обработчики. Например, вы можете написать в начале игры:
\begin{verbatim} \begin{verbatim}
@ -451,6 +501,8 @@ end;
\section{Диалоги} \section{Диалоги}
\index{Диалоги}
Третьим важным типом в движке являются диалоги. Диалоги --- это особый подвид сцен, содержащий только фразы. Например, диалог может выглядеть следующим образом: Третьим важным типом в движке являются диалоги. Диалоги --- это особый подвид сцен, содержащий только фразы. Например, диалог может выглядеть следующим образом:
\begin{verbatim} \begin{verbatim}
@ -466,8 +518,10 @@ povardlg = dlg {
}; };
\end{verbatim} \end{verbatim}
\index{Функции!phr}
\verb/phr/ --- создание фразы. Фраза содержит вопрос, ответ и реакцию (реакция в данном примере отсутствует). Когда игрок выбирает одну из фраз, фраза отключается. Когда все фразы отключатся диалог заканчивается. Реакция --- это строка кода на lua который выполнится после отключения фразы. \verb/phr/ --- создание фразы. Фраза содержит вопрос, ответ и реакцию (реакция в данном примере отсутствует). Когда игрок выбирает одну из фраз, фраза отключается. Когда все фразы отключатся диалог заканчивается. Реакция --- это строка кода на lua который выполнится после отключения фразы.
\index{Функции!\_phr}
\verb/_phr/ --- создание выключенной фразы. Она не видна изначально, но её можно включить с помощью функции \verb/pon()/ (см. ниже). По смыслу это эквивалентно \verb/phr(<...>):disable()./ \verb/_phr/ --- создание выключенной фразы. Она не видна изначально, но её можно включить с помощью функции \verb/pon()/ (см. ниже). По смыслу это эквивалентно \verb/phr(<...>):disable()./
Вот как создаётся фраза: Вот как создаётся фраза:
@ -478,6 +532,9 @@ povardlg = dlg {
В реакции может быть любой lua код (простейшей реакцией является возвращение строки), но в STEAD определены наиболее часто используемые функции: В реакции может быть любой lua код (простейшей реакцией является возвращение строки), но в STEAD определены наиболее часто используемые функции:
\index{Функции!pon}
\index{Функции!poff}
\index{Функции!prem}
\begin{description} \begin{description}
\item[pon(n...)] включить фразы диалога с номерами n... (в нашем примере --- чтобы игрок мог повторно взять еду того-же вида). \item[pon(n...)] включить фразы диалога с номерами n... (в нашем примере --- чтобы игрок мог повторно взять еду того-же вида).
\item[poff(n...)] выключить фразы диалога с номерами n... \item[poff(n...)] выключить фразы диалога с номерами n...
@ -496,6 +553,8 @@ return goto('povardlg');
Также, вы можете прятать некоторые фразы при инициализации диалога и показывать их при некоторых условиях. Также, вы можете прятать некоторые фразы при инициализации диалога и показывать их при некоторых условиях.
\index{Методы!pon}
\index{Методы!poff}
Вы можете включать/выключать фразы не только текущего, но и произвольного диалога, с помощью методов объекта диалог \verb,pon/poff,. Например: Вы можете включать/выключать фразы не только текущего, но и произвольного диалога, с помощью методов объекта диалог \verb,pon/poff,. Например:
\begin{verbatim} \begin{verbatim}
@ -513,50 +572,50 @@ phr('a', 'b', [[ pon() ]]);
Каждый атрибут-список имеет методы: Каждый атрибут-список имеет методы:
\begin{description} \begin{description}
\item[add] Добавление элемента в список. Необязательным вторым параметром является позиция в списке. \item[add] \index{Методы!add} Добавление элемента в список. Необязательным вторым параметром является позиция в списке.
\item[del] Удаление элемента из списка. \item[del] \index{Методы!del} Удаление элемента из списка.
\item[look] Получение индекса элемента в списке по идентификатору \item[look] \index{Методы!look} Получение индекса элемента в списке по идентификатору
\item[srch] Проверка на наличие объекта в списке по его nam. Возвращает 2 значения: идентификатор и позицию; если объекта нет, вернёт nil. Например: \begin{verbatim}objs():srch('Ножик')\end{verbatim} \item[srch] \index{Методы!srch} Проверка на наличие объекта в списке по его nam. Возвращает 2 значения: идентификатор и позицию; если объекта нет, вернёт nil. Например: \begin{verbatim}objs():srch('Ножик')\end{verbatim}
\item[set] Изменение объекта по номеру. Например, этот пример присвоит заменит первый объект списка: \begin{verbatim}objs():set('knife',1);\end{verbatim} \item[set] \index{Методы!set} Изменение объекта по номеру. Например, этот пример присвоит заменит первый объект списка: \begin{verbatim}objs():set('knife',1);\end{verbatim}
\item[disable] Скрытие объекта в списке; отличается от удаления тем, что может быть возвращён к жизни через метод enable \item[disable] \index{Методы!disable} Скрытие объекта в списке; отличается от удаления тем, что может быть возвращён к жизни через метод enable
\item[enable] Показ скрытого объекта \item[enable] \index{Методы!enable} Показ скрытого объекта
\item[zap] Обнуление списка \item[zap] \index{Методы!zap} Обнуление списка
\item[cat(b)] Склеивает список со списком b \item[cat(b)] \index{Методы!cat} Склеивает список со списком b
\item[cat(b,pos)] Добавляет в список список b на позицию pos \item[cat(b,pos)] Добавляет в список список b на позицию pos
\item[disable\_all] Аналогично disable, но массово \item[disable\_all] \index{Методы!disable\_all} Аналогично disable, но массово
\item[enable\_all] Смысл понятен. \item[enable\_all] \index{Методы!enable\_all} Аналогично enable, но массово
\end{description} \end{description}
Параметрами методов могут быть объекты, их идентификаторы и имена. Параметрами методов могут быть объекты, их идентификаторы и имена.
\section{Функции} \section{Функции}
\begin{description} \begin{description}
\item[inv()] возвращает список инвентаря \item[inv()] \index{Функции!inv} возвращает список инвентаря
\item[objs()] возвращает список объектов указанной сцены; если сцена не указана, то возвращает список объектов текущей сцены. \item[objs()] \index{Функции!objs} возвращает список объектов указанной сцены; если сцена не указана, то возвращает список объектов текущей сцены.
\item[ways()] возвращает список возможных переходов из указанной сцены; если сцена не указана, то возвращает список возможных переходов из текущей сцены. \item[ways()] \index{Функции!ways} возвращает список возможных переходов из указанной сцены; если сцена не указана, то возвращает список возможных переходов из текущей сцены.
\item[me()] возвращает объект pl (объект игрока) \item[me()] \index{Функции!me} возвращает объект pl (объект игрока)
\item[here()] возвращает текущую сцену \item[here()] \index{Функции!here} возвращает текущую сцену
\item[where()] возвращает текущую сцену как строку-имя объекта, а не сам объект \item[where()] \index{Функции!where} возвращает текущую сцену как строку-имя объекта, а не сам объект
\item[from()] возвращает объект прошлой сцены \item[from()] \index{Функции!from} возвращает объект прошлой сцены
\item[ref(nam)] возвращает ссылку на указанный объект: \begin{verbatim}ref('home') == home\end{verbatim} \item[ref(nam)] \index{Функции!ref} возвращает ссылку на указанный объект: \begin{verbatim}ref('home') == home\end{verbatim}
\item[deref(object)] возвращает ссылку строкой для объекта: \begin{verbatim}deref(knife) == 'knife'\end{verbatim} \item[deref(object)] \index{Функции!deref} возвращает ссылку строкой для объекта: \begin{verbatim}deref(knife) == 'knife'\end{verbatim}
\item[have(object)] проверяет, есть ли объект в инвентаре по имени объекта или по его nam \item[have(object)] \index{Функции!have} проверяет, есть ли объект в инвентаре по имени объекта или по его nam
\item[move(from, where)] переносит объект из текущей сцены в другую \item[move(from, where)] \index{Функции!move} переносит объект из текущей сцены в другую
\item[movef(from, where)] действует так же, но добавляет объект в начало списка \item[movef(from, where)] \index{Функции!movef} действует так же, но добавляет объект в начало списка
\item[seen(object,scene)] проверяет, есть ли объект в указанной сцене (в текущей, если сцена не указана) \item[seen(object,scene)] \index{Функции!seen} проверяет, есть ли объект в указанной сцене (в текущей, если сцена не указана)
\item[drop(object,scene)] выбрасывает объект из инвентаря в указанную сцену (в текущую, если сцена не указана) \item[drop(object,scene)] \index{Функции!drop} выбрасывает объект из инвентаря в указанную сцену (в текущую, если сцена не указана)
\item[dropf(object,scene)] то же, что drop, но объект появляется в начале списка \item[dropf(object,scene)] \index{Функции!dropf} то же, что drop, но объект появляется в начале списка
\item[put(object,scene)] кладёт предмет в указанную сцену; в текущую, если сцена не указана \item[put(object,scene)] \index{Функции!put} кладёт предмет в указанную сцену; в текущую, если сцена не указана
\item[remove(object,scene)] удаляет предмет из указанной сцены; из текущей, если сцена не указана \item[remove(object,scene)] \index{Функции!remove} удаляет предмет из указанной сцены; из текущей, если сцена не указана
\item[take(object,scene)] перемещает объект из указанной(текущей) сцены в инвентарь \item[take(object,scene)] \index{Функции!take} перемещает объект из указанной(текущей) сцены в инвентарь
\item[taken(object)] проверяет, взят ли уже объект \item[taken(object)] \index{Функции!taken} проверяет, взят ли уже объект
\item[rnd(m)] возвращает случайное целое значение от 1 до m \item[rnd(m)] \index{Функции!rnd} возвращает случайное целое значение от 1 до m
\item[goto(destination)] переносит в сцену w; используется в конструкции вида \verb/return goto('inmycar');/ \item[goto(destination)] \index{Функции!goto} переносит в сцену w; используется в конструкции вида \verb/return goto('inmycar');/
\item[change\_pl(player)] переключает на другого игрока (со своим инвентарём и позицией), также используется в \verb/return/. Может использоваться для переключения между разными инвентарями. \item[change\_pl(player)] \index{Функции!change\_pl} переключает на другого игрока (со своим инвентарём и позицией), также используется в \verb/return/. Может использоваться для переключения между разными инвентарями.
\item[back()] переносит в предыдущую сцену (аналогично goto) \item[back()] \index{Функции!back} переносит в предыдущую сцену (аналогично goto)
\item[time()] возвращает текущее время игры в активных действиях. \item[time()] \index{Функции!time} возвращает текущее время игры в активных действиях.
\item[cat(...)] возвращает строку --- склейку строк-аргументов. Если первый аргумент nil, то функция возвращает nil.\footnote{Функция легко и просто заменяется обычным оператором склейки строк Lua: \texttt{строка1 .. строка2}. Тем не менее, этот оператор выдаст ошибку при склейке nil} \item[cat(...)] \index{Функции!cat} возвращает строку --- склейку строк-аргументов. Если первый аргумент nil, то функция возвращает nil.\footnote{Функция легко и просто заменяется обычным оператором склейки строк Lua: \texttt{строка1 .. строка2}. Тем не менее, этот оператор выдаст ошибку при склейке nil}
\item[par(...)] возвращает строку --- склейку строк-аргументов, разбитых строкой-первым параметром. \item[par(...)] \index{Функции!par} возвращает строку --- склейку строк-аргументов, разбитых строкой-первым параметром.
\end{description} \end{description}
Следующие записи эквивалентны: Следующие записи эквивалентны:
@ -588,10 +647,10 @@ end
\end{verbatim} \end{verbatim}
\begin{description} \begin{description}
\item[p] Добавляет строку и пробел в буфер \item[p] \index{Функции!p} Добавляет строку и пробел в буфер
\item[pn] Добавляет строку и перевод строки в буфер \item[pn] \index{Функции!pn} Добавляет строку и перевод строки в буфер
\item[pclr] Очистка буфера \item[pclr] \index{Функции!pclr} Очистка буфера
\item[pget] Получение содержимое буфера на текущий момент \item[pget] \index{Функции!pget} Получение содержимое буфера на текущий момент
\end{description} \end{description}
Другой пример: Другой пример:
@ -604,6 +663,7 @@ end
\end{verbatim} \end{verbatim}
\section{Добавление динамики в игру} \section{Добавление динамики в игру}
\index{Атрибуты!life}
Игра измеряет время в своих единицах --- в шагах, или активных действиях. Каждое действие игрока --- это его шаг, пусть даже он тратит его на то, чтобы ещё раз осмотреться. Что он увидит нового? Что изменится в мире игры за это время? Игра измеряет время в своих единицах --- в шагах, или активных действиях. Каждое действие игрока --- это его шаг, пусть даже он тратит его на то, чтобы ещё раз осмотреться. Что он увидит нового? Что изменится в мире игры за это время?
@ -632,6 +692,7 @@ mycat = obj {
end, end,
\end{verbatim} \end{verbatim}
\index{Функции!lifeon}
В этом примере кот по имени Барсик, сидя в инвентаре у игрока, будет на каждом шагу показывать свою активность. Но приведённый код пока что не будет работать. Для того, чтобы объявить объект <<живым>>, следует добавить его в соответствующий список с помощью функции \verb/lifeon()/. В этом примере кот по имени Барсик, сидя в инвентаре у игрока, будет на каждом шагу показывать свою активность. Но приведённый код пока что не будет работать. Для того, чтобы объявить объект <<живым>>, следует добавить его в соответствующий список с помощью функции \verb/lifeon()/.
\begin{verbatim} \begin{verbatim}
@ -639,10 +700,12 @@ mycat = obj {
lifeon('mycat'); lifeon('mycat');
\end{verbatim} \end{verbatim}
\index{Функции!lifeoff}
Любой объект или сцена могут иметь свой обработчик \verb/life/, который вызывается каждый раз при смене текущего времени игры, если объект или сцена были добавлены в список живых объектов с помощью \verb/lifeon/. Не забывайте удалять живые объекты из списка с помощью \verb/lifeoff/, когда они больше не нужны. Это можно сделать, например, в обработчике \verb/exit/, или любым другим способом. Любой объект или сцена могут иметь свой обработчик \verb/life/, который вызывается каждый раз при смене текущего времени игры, если объект или сцена были добавлены в список живых объектов с помощью \verb/lifeon/. Не забывайте удалять живые объекты из списка с помощью \verb/lifeoff/, когда они больше не нужны. Это можно сделать, например, в обработчике \verb/exit/, или любым другим способом.
Вы можете вернуть из обработчика life второй код возврата, важность. (true или false). Если он равен true, то возвращаемое значение будет выведено ДО описания объектов; по умолчанию значение равно false. Вы можете вернуть из обработчика life второй код возврата, важность. (true или false). Если он равен true, то возвращаемое значение будет выведено ДО описания объектов; по умолчанию значение равно false.
\index{Переменные!ACTION\_TEXT}
Если вы хотите <<очистить экран>>, то можно воспользоваться вот каким хаком. Из метода \verb/life/ доступна переменная \verb/ACTION_TEXT/ --- это тот текст, который содержит реакцию на действие игрока. Соответственно, сделав \verb/ACTION_TEXT = nil/,можно <<запретить>> вывод реакции. Например,для перехода на конец игры можно сделать: Если вы хотите <<очистить экран>>, то можно воспользоваться вот каким хаком. Из метода \verb/life/ доступна переменная \verb/ACTION_TEXT/ --- это тот текст, который содержит реакцию на действие игрока. Соответственно, сделав \verb/ACTION_TEXT = nil/,можно <<запретить>> вывод реакции. Например,для перехода на конец игры можно сделать:
\begin{verbatim} \begin{verbatim}
@ -654,10 +717,12 @@ return goto('theend'), true
В чём очевидное преимущество графического интерпретатора над текстовой веткой --- это то, что он может говорить и показывать. Проще говоря, вы можете добавить в игру графику и музыку. В чём очевидное преимущество графического интерпретатора над текстовой веткой --- это то, что он может говорить и показывать. Проще говоря, вы можете добавить в игру графику и музыку.
\index{Атрибуты!pic}
Графический интерпретатор анализирует атрибут сцены \verb/pic/, и воспринимает его как путь к картинке-иллюстрации для сцены. Если в текущей сцене не определён атрибут \verb/pic/, то берётся \verb/game.pic/. Если не определён и он, то картинка не отображается. Графический интерпретатор анализирует атрибут сцены \verb/pic/, и воспринимает его как путь к картинке-иллюстрации для сцены. Если в текущей сцене не определён атрибут \verb/pic/, то берётся \verb/game.pic/. Если не определён и он, то картинка не отображается.
Unix-версия движка поставляется в исходных кодах, поэтому поддержка форматов графики и музыки в основном определяется возможностями библиотеки SDL, установленной в вашей системе. В большинстве случаев обеспечивается поддержка всех основных форматов. Для графики я рекомендую использовать форматы PNG, JPG и GIF. Новые версии движка поддерживают GIF-анимацию. Те же правила действуют для музыки. Здесь строгих рамок нет, поэтому старайтесь не использовать редких форматов. Проверена поддержка WAV, MP3, OGG, FLAC, MIDI, XM, MOD, IT, S3M. Unix-версия движка поставляется в исходных кодах, поэтому поддержка форматов графики и музыки в основном определяется возможностями библиотеки SDL, установленной в вашей системе. В большинстве случаев обеспечивается поддержка всех основных форматов. Для графики я рекомендую использовать форматы PNG, JPG и GIF (также поддерживаются анимированные GIF). Новые версии движка поддерживают GIF-анимацию. Те же правила действуют для музыки. Здесь строгих рамок нет, поэтому старайтесь не использовать редких форматов. Проверена поддержка WAV, MP3, OGG, FLAC, XM, MOD, IT, S3M.
\index{Функции!img}
Вы также можете встраивать графические изображения в текст или в инвентарь с помощью функции \verb/img/. Например: Вы также можете встраивать графические изображения в текст или в инвентарь с помощью функции \verb/img/. Например:
\begin{verbatim} \begin{verbatim}
@ -666,8 +731,6 @@ knife = obj {
} }
\end{verbatim} \end{verbatim}
Изображения могут быть форматов JPG, PNG и GIF; также поддерживаются анимированные GIF.
При этом изображения можно комбинировать, накладывая друг на друга. Очень удобны в этом отношении PNG и GIF, потому что они позволяют задать прозрачность фона. При этом изображения можно комбинировать, накладывая друг на друга. Очень удобны в этом отношении PNG и GIF, потому что они позволяют задать прозрачность фона.
В случае анимированных GIF наложение происходит только с первым кадром. В случае анимированных GIF наложение происходит только с первым кадром.
Это выглядит следующим образом: Это выглядит следующим образом:
@ -680,7 +743,7 @@ pic = "gfx/mycat.png;gfx/milk.png@100,100;gfx/fish.png@c20,20"
Точка с запятой разделяет изображения; после неё идёт сначала путь к картинке, затем символ \verb/@/ и координаты точки фона, куда будет помещён левый верхний угол накладываемой картинки. Точка с запятой разделяет изображения; после неё идёт сначала путь к картинке, затем символ \verb/@/ и координаты точки фона, куда будет помещён левый верхний угол накладываемой картинки.
Координаты считаются от левого верхнего угла фонового изображения. Если после символа \verb/@/ идёт буква \verb/c/, то в эту точку будет помещён не левый верхний угол, а \textbf{центр} накладываемой картинки. Координаты считаются от левого верхнего угла фонового изображения. Если после символа \verb/@/ идёт буква \verb/c/, то в эту точку будет помещён не левый верхний угол, а \textbf{центр} накладываемой картинки.
Теперь о звуке. Фоновая музыка задаётся с помощью функции: Теперь о звуке. Фоновая музыка задаётся с помощью функции:\index{Функции!set\_music}
\begin{verbatim} \begin{verbatim}
set_music(имя музыкального файла, количество проигрываний) set_music(имя музыкального файла, количество проигрываний)
@ -688,10 +751,12 @@ set_music(имя музыкального файла, количество пр
Она проигрывается циклически бесконечно,если количество проигрываний не задано. Она проигрывается циклически бесконечно,если количество проигрываний не задано.
\verb/get_music()/ возвращает текущее имя трека. \index{Функции!get\_music} \verb/get_music()/ возвращает текущее имя трека.
Функция \verb/get_music_loop/ возвращает, на каком витке повторения находится мелодия. 0 --- означает вечный цикл. n --- количество проигрываний. -1 --- проигрывание текущего трека закончено. \index{Функции!get\_music\_loop} Функция \verb/get_music_loop/ возвращает, на каком витке повторения находится мелодия. 0 --- означает вечный цикл. n --- количество проигрываний. -1 --- проигрывание текущего трека закончено.
\index{Функции!set\_sound}
\index{Функции!get\_sound}
Помимо фонового сопровождения, \verb/set_sound()/ позволяет проиграть звуковой файл. \verb/get_sound()/ возвращает имя звукового файла, который будет проигран. Помимо фонового сопровождения, \verb/set_sound()/ позволяет проиграть звуковой файл. \verb/get_sound()/ возвращает имя звукового файла, который будет проигран.
\section{Трюки} \section{Трюки}
@ -699,12 +764,12 @@ set_music(имя музыкального файла, количество пр
SDL-INSTEAD поддерживает простое форматирование текста с помощью функций: SDL-INSTEAD поддерживает простое форматирование текста с помощью функций:
\begin{description} \begin{description}
\item[txtc(текст)] --- разместить текст по центру \item[txtc(текст)] \index{Функции!txtc} --- разместить текст по центру
\item[txtr(текст)] --- разместить текст справа \item[txtr(текст)] \index{Функции!txtr} --- разместить текст справа
\item[txtl(текст)] --- разместить слева \item[txtl(текст)] \index{Функции!txtl} --- разместить слева
\item[txtb(текст)] --- полужирное начертание \item[txtb(текст)] \index{Функции!txtb} --- полужирное начертание
\item[txtem(текст)] --- начертание курсивом \item[txtem(текст)] \index{Функции!txtem} --- начертание курсивом
\item[txtu(текст)] --- подчёркнутый текст \item[txtu(текст)] \index{Функции!txtu} --- подчёркнутый текст
\end{description} \end{description}
\subsection{Проверка правописания} \subsection{Проверка правописания}
@ -779,6 +844,7 @@ inv():add('status');
status.object_type = false status.object_type = false
\end{verbatim} \end{verbatim}
\index{Статус}
Вы можете использовать конструктор \verb/stat/ для создания статуса: Вы можете использовать конструктор \verb/stat/ для создания статуса:
\begin{verbatim} \begin{verbatim}
@ -827,6 +893,8 @@ mplayer = obj {
lifeon('mplayer'); lifeon('mplayer');
\end{verbatim} \end{verbatim}
Этот код не является лучшим выбором, потому что он позволяет случаю проиграть один и тот же файл несколько раз. Исходный код более продвинутого проигрывателя с корректировкой случайного выбора слишком велик для этих страниц. Вы можете найти его в дополнительных источниках документации.
\subsection{Отладка} \subsection{Отладка}
Для того, чтобы во время ошибки увидеть стек вызовов функций lua, вы можете запустить Для того, чтобы во время ошибки увидеть стек вызовов функций lua, вы можете запустить
@ -934,9 +1002,9 @@ iface:shell();
\caption{Цветовые константы INSTEAD} \caption{Цветовые константы INSTEAD}
\end{table} \end{table}
\subsection{Параметры окна изображений} \subsection{Параметры окна сцены}
Окно изображений --- область, в которой располагается картинка сцены. Интерпретация зависит от режима расположения. (см. таблицу~\ref{param_screen}) \index{Окно сцены} Окно сцены --- область, в которой располагается сцена. Интерпретация зависит от режима расположения. (см. таблицу~\ref{param_screen})
\newcommand{\tabParam}[3]{ \newcommand{\tabParam}[3]{
\texttt{#1} & #2 & #3 \\ \texttt{#1} & #2 & #3 \\
@ -980,7 +1048,7 @@ iface:shell();
\subsection{Параметры главного окна} \subsection{Параметры главного окна}
Главное окно --- область, в которой располагается описание сцены. (табл.~\ref{param_window}) \index{Главное окно} Главное окно --- область, в которой располагается описание сцены. (табл.~\ref{param_window})
\medskip \medskip
@ -1009,7 +1077,7 @@ iface:shell();
\subsection{Параметры области инвентаря} \subsection{Параметры области инвентаря}
См. таблицу \ref{param_inventory}. \index{Инвентарь} См. таблицу \ref{param_inventory}.
\medskip \medskip
@ -1086,6 +1154,7 @@ scr.gfx.h = 500
Интерпретатор ищет доступные темы в каталогах: Интерпретатор ищет доступные темы в каталогах:
\index{Каталоги!тем}
Unix версия интерпретатора просматривает игры в:\\ Unix версия интерпретатора просматривает игры в:\\
\verb;/usr/local/share/instead/themes; (по умолчанию),\\ \verb;/usr/local/share/instead/themes; (по умолчанию),\\
\verb,~/.instead/themes,.\\ \verb,~/.instead/themes,.\\
@ -1097,11 +1166,15 @@ WinVista: \verb;Users\USER\AppData\Local\instead\themes;\\
Игра может задавать собственную тему; для этого в каталоге с игрой должен лежать тот самый \verb/theme.ini/. Его формат никак при этом не меняется, просто он загружается в первую очередь вместе с игрой. Игра может задавать собственную тему; для этого в каталоге с игрой должен лежать тот самый \verb/theme.ini/. Его формат никак при этом не меняется, просто он загружается в первую очередь вместе с игрой.
\section{Дополнительные источники документации} \section{Дополнительные источники документации}
Вот и закончен справочник по INSTEAD. Напомним, что INSTEAD расшифровывается (и переводится) как <<Интерпретатор простых текстовых приключений>>. Официальная документация находится в каталоге doc и поставляется с instead. Дополнительную информацию вы можете получить в Интернете: Вот и закончен справочник по INSTEAD. Напомню, что INSTEAD расшифровывается (и переводится) как <<Интерпретатор простых текстовых приключений>>. Официальная документация находится в каталоге doc и поставляется с instead. Дополнительную информацию вы можете получить в Интернете:
\begin{itemize} \begin{itemize}
\item \href{http://instead.googlecode.com/}{Сайт программы} \item \href{http://instead.googlecode.com/}{Сайт программы}
\item \href{http://instead.pinebrush.com/}{Форум программы} \item \href{http://instead.pinebrush.com/}{Форум программы}
\end{itemize} \end{itemize}
Кроме того, полезно будет посмотреть Subversion-репозиторий INSTEAD, где хранится исходный код самого движка и код нескольких полезных трюков, которые не пакуются в релиз для Windows\footnote{Так как релиз для Linux выходит в исходных кодах и заведомо меньше по размеру, то дополнительные исходные коды из него не вырезаются.}. Вы также можете найти несколько полезных руководств (в том числе и это) в подкаталоге doc/ программы.
\printindex
\end{document} \end{document}