ТОМ: Уроки

Материал из IFВики
Версия от 08:00, 17 октября 2009; ASBer (обсуждение | вклад) (описания)
Перейти к навигации Перейти к поиску

Для выполнения уроков Вам понадобится стандартная библиотека из Пакета библиотек ТОМ.

После распаковки библиотеки свои файлы рекомендуется размещать в каталоге \Libs4TOM , относительно которого в примерах указаны все пути.

Урок 1: Комментарии, вывод текста, запуск игры

ТОМ проигрывает обычные планарные текстовые файлы, редактировать которые можно в любом блокноте.

Для удобства запуска расширение файла можно поменять на .tom, но это не обязательно, можно оставить .txt


И так, у нас есть новый, чистый, только что созданный файл "my_game.tom", открытый в блокноте.


В любой игре обязательно встречаются комментарии, которые никак не влияют на выполнение программы, но при этом очень важны.

В ТОМе комментарии начитаются со знаков "//" и продолжаются до конца строки.

Пример:

//этот текстовый файл - моя первая игра


Для того чтобы вывести на экран любую текстовую строку используется оператор "%". Все символы, следующие после % и до конца строки будут показаны игроку.

Пример:

//выводим название игры и вводную часть
%Моя первая игра
%В этой игре вы узнаете о истории любви и ненависти, а также постигните смысл жизни.


После сохранения файла его можно открыть в плеере ТОМ. Сделать это можно несколькими способами:

1. Запустить плеер \Libs4TOM\Bin\constom.exe, в нём набрать команду >run и в открывшемся диалоге выбрать файл my_game.tom

2. Для запуска игры создать .bat - файл с командой из одной строки: Bin\constom.exe my_game.tom

3. Привязать расширение .tom к файлу \Libs4TOM\Bin\constom.exe средствами операционной системы Windows


Если после запуска игры любым способом в окне плеера вы увидите:

Моя первая игра
В этой игре вы узнаете о истории любви и ненависти, а также постигните смысл жизни.

первый урок можно считать успешно пройденным.

Урок 2: Первая локация и главный герой с волшебным тесаком

В любой игре обязательно должен быть главный герой - персонаж, управляемый игроком.

Также необходимо описание места в котором действует главный герой.

В текстовых квестах все пространство игры традиционно разбивается на локации. Нам для начала необходима хотя бы одна локация.

Так как ТОМ использует объектно-ориентированной язык программирования, всё что нам необходимо должно быть описано как объекты. Для того чтобы не писать все объекты с нуля, мы воспользуемся модулем стандартной библиотеки main.tml , который содержит необходимые нам классы объектов.

Первое что требуется - это подключить модуль main.tml к нашей игре. Это мы сделаем командой:

//подключим основной модуль стандартной библиотеки
include "std.lib\main.tml"

которую вставим в самое начало нашего файла.


Далее создаём первую локацию в нашей игре:

location пещера
{ cls = место

}

В этом тексте:

  • location - зарезервированное слово указывающее категорию создаваемого объекта;
  • пещера - программное имя нашей локации. Именно так мы будем обращаться к объекту локации из кода игры;
  • { } - текст в фигурных скобках служит описанием созданного объекта;
  • cls = место - выражение, указывающее класс созданного объекта;
    • cls - зарезервированное слово, использующееся для доступа к классу объекта;
    • = - оператор присвоения значения;
    • место - класс, определенный в модуле main.tml и описывающий самые общие свойства локаций.


Далее разберемся с главным героем.

В модуле main.tml уже создан объект с именем ГГ, подходящий на роль главного героя. Всё что нам требуется - это поместить ГГ в нашу пещеру:

пещера + ГГ

Оператор "+" примененный к двум объектам помещает объект справа в тот объект что слева от оператора.

В данном случае мы добавили ГГ в пещеру


И для полноты картины поместим в локацию наш первый предмет:

unique меч
{ cls = предмет
  пещера + this
}

В этом примере должно быть всё уже понятно.


Итого, у нас должно получиться:

//подключим основной модуль стандартной библиотеки
include "std.lib\main.tml"

//выводим название игры и вводную часть
%Моя первая игра
%В этой игре вы узнаете о истории любви и ненависти, а также постигните смысл жизни. 

//создаём основную локацию 
location пещера
{ cls = место

}

//помещаем ГГ в пещеру
пещера + ГГ

//создаем меч и помещаем его в пещеру
unique меч
{ cls = предмет
  пещера + this
}

После запуска этого файла должно получиться что-то подобное:

Моя первая игра
В этой игре вы узнаете о истории любви и ненависти, а также постигните смысл
жизни.
Пещера
Это некоторое место - пещера. Здесь есть меч. Ты находишься тут.

Обратите внимание, что "пещера" и "меч" выделяются красным цветом. Это говорит о том, что мы не задали для них наименования и вместо него используется внутреннее имя. Но тем неменее уже сейчас можно опробывать некоторые команды. Максимум что мы можем, это осмотреться, осмотреть себя, заглянуть в свой инвентарь:

> осмотрись
Это некоторое место - пещера. Здесь есть меч. Ты находишься тут.

> осмотри себя
Ты выглядишь как обычно.

> инвентарь
У тебя ничего нет.

В результате 2го урока мы получили безликую стандартную локацию и такого же безликого героя в ней. Как придать индивидуальность объектам игры читайте далее.

Урок 3: авторские описания и дополнительные возможности

наименования

Стандартная библиотека требует обязательно указывать наименования предметов, локаций и персонажей.

Наименование обязательно должно содержать все словоформы, т.к. оно участвует в построении автоматически генерируемых сообщении и используется в парсинге команд:

location пещера
{ //...
  наименование = "пещер%; ЖрЕчНдСи; Ип; Ип=а; Рп=ы; Дп=е; Вп=у; Тп=ой; Тп=ою; Пп=е;"
  //...
}


Для меча указываем наименование в виде словосочетания. Для генерации текстов это вполне подходит, но для парсера надо повторить каждое слово отдельно. Если предмет можно назвать несколькими словами, все синонимы также необходимо добавить:

location меч
{ //...
  наименование = "заколдованн% тесак%; МрЕчНдСи; Ип; Ип=ый,; Рп=ого,а; Дп=ому,у; Вп=ый,; Тп=ым,ом; Пп=ом;е"
  this.тесак = "тесак%; МрЕчНдСи; Ип; Ип=; Рп=а; Дп=у; Вп=; Тп=ом; Пп=е"
  this.заколдованный = "заколдованн%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом"
  this.меч = "меч%; МрЕчНдСи; Ип; Ип=; Рп=а; Дп=у; Вп=; Тп=ом; Пп=е"
  //...
}


Для персонажей свойство "наименование" уже определено в классе "персонаж". Перегружать его нельзя, чтобы не поломать механизм местоимений. Для указания имен персонажей используется свойство "по_имени". Также для персонажей необходимо указывать звательный падеж - Зп:

ГГ.по_имени = "гоблин%; МрЕчОдСи; Ип; Зп=; Ип=; Рп=а; Дп=у; Вп=а; Тп=ом; Пп=е"

Вместо "наименование" можно писать "title". Оба слова являются зарезервированными ключевыми словами интерпретатора и абсолютно равнозначны.

описания

Попробуем заменить стандартные скучные описания своими собственными.

Для авторских описаний объектов стандартная библиотека предназначает следующие свойства:


для локаций:

  • описание
  • полное_описание
location пещера
{ //...
  полное_описание = "Это пещера, в которой ты прожил большую часть своей жизни. Мебели нет совсем, но где-то здесь ты зарыл клад."
  описание = "волшебная пещера"
  //...
}


для предметов:

  • описание
  • полное_описание
  • предмет_по_месту
  • снаружи_персонажа
unique меч
{ //...
  полное_описание = "это старинный заколдованный тесак, умеющий танцевать джигу.
    А кто не хлопает - тому он обрубает уши."
  описание = "старинный заколдованный тесак, умеющий танцевать джигу"
  предмет_по_месту = "старинный тесак возлежит на своей не менее старинной подставке"
  снаружи_персонажа = "ты вооружён заколдованным мечом"
  //...
}


для персонажей:

  • описание
  • полное_описание
  • персонаж_по_месту
ГГ.полное_описание = "ты старый зеленый гоблин, морщины времени залегли на твоём лице глубокими складками."
ГГ.персонаж_по_месту = "здесь ты думаешь о смысле жизни"

неиспользуемые глаголы

Модуль main.tml содержит в себе шаблоны для очень ограниченного набора команд.

На каждую команду для которой не подошел ни один шаблон из модуля main.tml парсер выдаёт ошибку:

Это мне непонятно...

Чтобы сделать игру более "понятливой" необходимо подключить модуль UnusVerb.tml в котором содержатся описания ошибок для весьма широкого спектра команд. Модуль UnusVerb.tml желательно подключать самым первым до подключения всех остальных модулей. В этом случае реакцию на команду парсер будет искать в UnusVerb.tml в самую последнюю очередь.

//подключим модуль с неиспользуемыми глаголами
include "std.lib\UnusVerb.tml"

//подключим основной модуль стандартной библиотеки
include "std.lib\Main.tml"

Теперь на большинство непредусмотренных в игре команд будут выдаваться индивидуальные сообщения:

> сломай свой меч
В этой игре ты не можешь уничтожить свой меч!