ТОМ: Уроки: различия между версиями

Материал из IFВики
Перейти к навигации Перейти к поиску
Содержимое удалено Содержимое добавлено
Строка 151: Строка 151:
Для генерации текстов это вполне подходит, но для парсера надо повторить каждое слово отдельно.
Для генерации текстов это вполне подходит, но для парсера надо повторить каждое слово отдельно.
Если предмет можно назвать несколькими словами, все синонимы также необходимо добавить:
Если предмет можно назвать несколькими словами, все синонимы также необходимо добавить:
location меч
unique меч
{ //...
{ //...
наименование = "заколдованн% тесак%; МрЕчНдСи; Ип; Ип=ый,; Рп=ого,а; Дп=ому,у; Вп=ый,; Тп=ым,ом; Пп=ом;е"
наименование = "заколдованн% тесак%; МрЕчНдСи; Ип; Ип=ый,; Рп=ого,а; Дп=ому,у; Вп=ый,; Тп=ым,ом; Пп=ом;е"

Версия от 06:36, 17 октября 2009

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

После распаковки библиотеки свои файлы рекомендуется размещать в каталоге \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 пещера
{ //...
  наименование = "пещер%; ЖрЕчНдСи; Ип; Ип=а; Рп=ы; Дп=е; Вп=у; Тп=ой; Тп=ою; Пп=е;"
  //...
}


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

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


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

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

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

флаги и отношения

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

  • можно_взять - флаг, по умолчанию "нет"
  • чей - отношение собственности
unique меч
{ //...
  можно_взять = да
  чей = ГГ //принадлежит гоблину
  //...
}

описания

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

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


для локаций:

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


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

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


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

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

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

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

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

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

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

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

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

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

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