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