Справка по модулю для создания сложных меню.

Модуль menu.t был создан на основе модуля menus.t, написанного Стефаном Гэрандом(Stephen Granade). В отличии от него, menu.t предназначен скорее для использования при написании так называемых "менюшных игр", диалогов на основе выбора в классических текстовых играх, и подобных сложных реализаций методов выбора. Наилучший эффект достигается при использовании интерпретаторов с поддержкой html, хотя будет рабтать и для других.

Краткая информация:

menu.t сравнительно простая и маленькая библиотека, и для её использования необходимо запомнить совсем немного. Однако, для её эффективного применения понадобится также узнать хотя бы базовые сведения о системе RTADS и её ООП. Это можно сделать прочитав руководство, а можно попробовать постепенно освоить систему, начав со сведений данных в этой справке. Также Вам может показаться полезным пример - фрагмент игры "В глубине", перенесённой в RTADS.
Как и почти всё в TADS, меню в данном модуле реализовано в качестве объекта. Этот объект уже описан, и Вам необходимо лишь заполнить некоторые его поля, которые и будут выведены на экран.

Новый объект меню создаётся следующим образом:
newobj: object
;
где слева перед двоеточием новый объект, справа существующий класс (или другой объект). Двоеточие обозначает наследование. Подробнее, опять таки, в руководстве.

Заполнению подлежат следующие свойства:

sdesc=""
Заголовок меню. Выводится сверху экрана там, где обычно видно название локации, счёт и количество сделанных ходов.

btn=[]
В эти кавычки вставляются последовательно названия объектов и текстовые строки.
Например, так: btn=[menu1 'Почесать в затылке' menu2 'Осмотреться']
В этом случае на экране появится выбор из двух пунктов меню, озаглавленных соответственно этим строкам. Если включена поддержка html, в эти строки можно включить форматирование текста или показ изображений. При выборе одного из пунктов, на очередь запуска меню будет поставлено тот объект, что указан перед ним. Так в примере выбор 'Почесать в затылке' вызовет запуск menu1.

txt={}
Текст (или исполняемый код), выводимый на главный экран при появлении текущего меню. Этот текст выводится в центральную прокручиваемую область интерпретатора. Фигурные скобки могут содержать любой исполняемый код системы. Отсюда можно проводить манипуляции с объектами, вставлять сложные условные и циклические структуры и делать прочие вещи, для которых нужно изучать систему. Нежелательно только запускать отсюда другое меню, так как функция работы данного меню не будет завершена, и злоупотребление может привести к переполнению стека текущих процессов. Для этой цели используйте метод mgoto (обычный goto используется системой по-другому).


Дополнительные свойства:

ps={}
post scriptum (второй txt, на всякий случай).

bgcolor = 'statusbg'
Цвет фона меню. Имеет смысл при использовании html. В строке должно быть текстовое описание цвета на английском, или шестнадцатеричное, принятые в html.

fgcolor = 'statustext'
Цвет текста меню. Аналогично bgcolor.

Полезные свойства и функции:

endcheck=nil
Это свойство указывает, необходимо ли прекратить показ меню. По умолчанию, равно nil (аналог false или NULL). Чтобы завершить показ цепочки меню на данном меню, назначьте свойству значение true.

go(qexit)={}
Обычно, Вам не потребуется менять этот метод. В классе объекта menu в этом методе идёт последовательный вывод меню и текста. В качестве параметра выступает вызвавшее (предыдущее) меню, чтобы знать куда вернутся, если это понадобится. Сменить этот метод Вам может потребоваться, например, при выходе из игры или переходе в текстовый режим:
go(qexit) = {
    "\nПока!"; 		// Выводим прощание
    self.del;  		// Очищаем экран от меню
    inputkey();		// Ожидаем нажатия, чтобы игрок успел прочитать прощание
    quit();		// Выход из системы
}

ifbtn (usl,btntoadd)
Пункт меню, выводимый по условию. Заметьте, что это функция, а не свойство-функция (метод) и вызывается самостоятельно. Текущее меню она узнаёт по свойству curmenu объекта mainmenu (mainmenu.curmenu). Так как txt вызывается раньше, чем перерисовываются пункты меню, то если эту функцию вставить в txt, то она пополнит меню новым пунктом при выполнении условия usl. btnatodd - массив из объекта меню и строки.
Внимание! Если элемент массива btntoadd уже присутствует в btn текущего меню, а условие usl не выполняется, то этот элемент будет стёрт! Не добавляёте таким образом указание на объект-меню, уже имеющееся в btn этого меню, а тем более, строку пункта выбора, совпадающую с существующей!
Пример(в котором всё правильно):
liftmenu: menu
    sdesc = "В лифте"
    txt = {
       "Ты стоишь в лифте. ";
       if (vasya.location=Me.location) "\nДядя Вася угрюмо глядит на указатель этажей.";
       ifbtn( (vasya.location=Me.location) , [osmVasyaMenu 'осмотреть Васю'] );
    }
    btn = [ exitmenu 'Выйти отсюда' ]
;
mgoto (newmenu)
Если есть необходимость сразу перейти к новому меню из блока txt, то можно воспользоваться этим методом. К сожалению, при этом его необходимо логически отделить от остального кода.
Например:
examplemenu: menu
   sdesc = "Образец"
   txt = {
     Me.health-=5;
     if (Me.health<0) self.mgoto(deathmessage);
     else { "Тебе стало плохо. "; ... ещё какой-то код ... }
   }
   btn=[asp 'Принять аспирин' zhgut 'наложить жгут' ... и т.д. ]
;

Использование:

Прежде всего, в файл игры необходимо включить данную библиотеку:
#include "menu.t" (или #include <menu.t>, если она лежит в папке с TADS TOOLS)
Второе: определитесь с моментом появления меню. Например, его можно выводить при начале разговора или вообще вместо осмотра стартовой комнаты, если Вы желаете написать полностью "менюшную" игру. Во втором случае лучше всего этот вызов производить следующим образом:
replace init: function
{

    "\H+";			// Активируем html
 
    "\tВступление\b";		// Выводим вступление

    mainmenu.start(firstmenu);	// Запускаем объект firstmenu
}
Затем необходимо создать и описать этот первый объект меню:
firstmenu: menu
    sdesc = "Моя игра"
    txt = "Привет! Это моя новая игра! Получайте от неё удовольстие!<br><img align=center src=\"picture.jpg\">"
    btn = [startmenu 'Начать' aboutmenu 'О игре' quitmenu 'Выход']
;
При таком описании будет показано меню с тремя пунктами меню, а в поле просмотра отобразится содержимое свойства txt: приветствие и картинка picture.jpg (если она есть). Пока это не будет компилироваться, так как тех меню, на которые ссылается список btn, ещё не существует. Однако, если их создать даже так:
startmenu: menu
;
aboutmenu: menu
;
quitmenu: menu
;
то игру уже можно будет запустить. Эти меню заполняются аналогично. Как раз в свойства объекта quitmenu и можно будет вставить приведённый выше код для нестандартного метода go(pMenu).

Когда Вы будете знать систему достаточно хорошо, советую рассмотреть сам модуль menu.t.
Если для Вас непонятен какой-либо момент работы с данным модулем, пишите: rtads@mail.ru

Гранкин Андрей
16.10.03