Что же необходимо написать в проекте игры на ТОМ2, чтобы она нормально запустилась? Какие разделы, объекты или секции необходимы для нормального запуска игры? Считается ли пустой текстовый файл корректным интерактивным квестом для интерпретатора ТОМ2?
На данный момент мы не имеем никакой документации. Да оно и понятно, ведь платформа на этапе альфа-разработки. На руках у нас только маленький демо-пример квеста, закрытый словарь на over 3000 слов (предположительно) и, собственно, сам интерпретатор ТОМ2 (вернее его альфа-версия 2.a.3.8). Но не отчаиваемся, включаем думалку и вперёд!
Будем проводить полевые испытания (демо игра как-раз про поляну в центре леса )
Первый вопрос, который мы проверим - считается ли пустой файл корректным для интерпретатора? Всё предельно просто: создаём пустой текстовый файл и перетаскиваем его на tom2.exe. В консоли видим:
выполняем файл - выполнен.
Ок
Наверняка это говорит о том, что для создания минимального проекта на языке ТОМ2 нужно написать ровно НИЧЕГО.
На этом можно было бы закрыть тему, но мы ведь хотели увидеть хоть что-то в игре. Ладно, попробуем сделать минимальную игру, которая будет хоть что-то показывать помимо стандартных сообщений интерпретатора.
Для начала давайте выведем до боли знакомую банальную строчку "Привет, мир!". Эмм... ладно, допишем ещё что-нибудь, чтобы было интереснее Для этого нужно в текстовом файле написать то, что мы хотим вывести в консоль, но начиная с символа % (процент):
%_Привет, мир! %_Алиса находилась в центре необычной комнаты: стены её были составлены из квадратных плит, шириной примерно пол метра. По центру комнаты стоял круглый стеклянный стол с несколькими предметами на нём. Стекло было на столько чистым и прозрачным, а освещение в комнате было таким тусклым, что сначала Алисе показалось, что предметы висят в воздухе.
Да, если мы хотим вывести многострочный текст, начинаем каждую строку с символа %.
Знак "_" (земля) в строках ТОМ2 является аналогом пробела, но в отличии от обычного пробела, он не триммируется.
Триммирование - это процесс приведения строки в порядок, перед выводом. Интерпретатор ТОМ2 перед выводом строки "причёсывает" её, выполняя вложенные куски кода, расставляя заглавные буквы, точки и убирая лишние пробелы, в том числе с конца и начала строки. Вот когда мы не хотим, чтобы пробелы были убраны, то ставим вместо них землю.
"Замечательно!" - скажете вы
"Ужасно!" - скажу я
Да-да, мы выполнили задачу вывести наш текст на экран, но посмотрите: он ведь абсолютно статичен, мы по прежнему не можем ничем управлять, да и вывелся он куда-то в общий лог, а не как основной текст, описывающий нашу локацию.
А вот что-бы чем-то удобно управлять, нужно ООП (объектно-ориентированное программирование).
Что-ж, время ещё есть, поставим третью цель на сегодя: чтобы ТОМ2 отреагировал на нашу команду так как мы хотим.
Тут уже наступает время ООП. Берёмся крепче за стул, и пытаемся вникнуть во всё это.
На самом деле, я сам совершенно не разбираюсь в новом синтаксисе ТОМ2, поэтому всё нижеописанное - результат личных экспериментов прямо в процессе написания этой статьи
Какой же главный объект в интерактивной текстовой литературе?
"Локация?" - спросите вы
"Персонаж" - скажу я
Персонаж, или протагонист - центральный объект в интерактивной литературе. Тот, кто описывает всё происходящее. Ведь он может просто так, висеть в воздухе и описывать пустоту, но не имея протагониста мы не имеем возможности что-либо обозревать или управлять чем либо.
Ладно, попробуем сделать описать нашего главного персонажа:
человек Алиса { внешнее_описание = "Маленькая девочка Алиса, которая согласилась поучавствовать в этом странном эксперименте за шоколадную конфету" } pers = Алиса
pers - это ключевое слово, в которое нужно "помещать" того персонажа, который является главным в данный момент. По сути pers - это тот объект, которым мы сейчас управляем
Итак, протагониста создали, дали ему управление. Запускаем, вбиваем элементарную команду "осмотри себя"... не работает! Что-же мы забыли? Да на самом деле много чего.
Во-первых, забыли описать саму команду "осмотри". Интерпретатор просто не понимает, что делать со словом "осмотри".
Во-вторых, слово "себя" нет в "стандартной библиотеке".
В-третьих, слово "Алиса" тоже отсутствует в стандартном словаре ТОМ2, поэтому объект то мы создали, но на него не ссылается ни одно слово, и как-либо обратиться к нему мы не сможем.
Для поиска слов в словаре используем программу dic_viewer.exe, которая прилагается к платформе ТОМ2.
Заметка автору этой программы (ASBer-у): Сделай, чтобы вместо нажатия на кнопку "Посмотреть", можно было жать Enter в поле ввода слова.
Давайте же исправим всё по пунктам!
Действия описываются ключевым словом action. Внутри него есть несколько секций (parsing, check, execute). Всё это уносит нас далеко в дебри особенностей единственного и неповторимого языка ТОМ2. Поэтому опустим сейчас подробное описание всех секций, а просто спи... своруем описание действия "осмотри видимое" из демо-примера. Вот оно:
//======================================================================================== action(осмотри act*Пф, всё:видимое Это*Вп) //это действие для видимых объектов { == parsing == fail, "fail" if :это.cls = пусто //должен быть класс fail, "это не по-русски" if :это.word.name = "ты" //"осмотри тебя" - это не по-русски Ok == check == //объект должен быть виден :это.видно == execute == if :Это is string or number then { var Str = :Это %{:Str} } else { if :Это.внешнее_описание = пусто then %<font collor=red>{:Это*Ип} не имеет внешнего описания!<font> else %{:Это.внешнее_описание}. } }
Если присмотреться, то можно понять весь этот код. Самое сложное - это секции. Такого пожалуй нет ни в одном языке программирования. Обещаю рассказать о них позже, а сейчас добъём наконец наш пример.
Слово "себя" на самом деле есть в стандартном словаре, но оно ни с чем не связано. Кто же этот "себя"? Да это же тот персонаж, которым мы сейчас управляем! Так и напишем:
var себя = pers
Почему var? Почему переменная? Я не могу дать ответ на этот вопрос. ТОМ2 во многом своеобразен.
Ну и наконец, третья проблема. Да, слова Алиса действительно нет в словаре. Ничего страшного, ведь можно описывать слова прямо в коде, примерно так:
слово Алиса { key = ЖрОд defkey = ИпЕч form ИпЕч = "Алиса" form ИпМч = "Алисы" form РпЕч = "Алисы" form РпМч = "Алис" form ДпЕч = "Алисе" form ДпМч = "Алисам" form ВпЕч = "Алису" form ВпМч = "Алис" form ТпЕч = "Алисой" form ТпЕчПс = "Алисою" form ТпМч = "Алисами" form ПпЕч = "Алисе" form ПпМч = "Алисах" }
Нужно всего-лишь описать все формы слова и добавить 2 параметра:
key - неизменяемые параметры слова (Жр - женский род, Од - одушевлённое)
defkey - параметры по умолчанию (Ип - именительный падеж, Еч - единственное число). Используются, когда к слову обращаются, не указывая параметров.
Запускаем, проверяем:
Работает!
Да, персонаж работает в пустоте, совсем без локаций. Ладно, на сегодня можно и прекратить, слишком много времени уже потрачено.
"А как же конфета!?" - скажете вы - "Алиса ведь не согласится больше участвовать в наших экспериментах"
Ладно, давайте дадим ей эту конфету!
объект конфета {is предмет внешнее_описание = "Шоколадная конфета в блестящей упаковке. Наверное, очень вкусная." } Алиса + конфета
Здесь мы создали конфету, сказали что она является предметом и дали краткое описание. Так-же мы дали конфету Алисе оператором "+". Не смотря на безупречный код, Алиса отказывается осмотреть конфету в своих карманах. Ну что-ж, видимо издержки альфа версии: все предметы "внутри" персонажа являются невидимыми
Ну и ладно, главное конфета у Алисы, а значит она будет участвовать в следующих испытаниях платформы ТОМ2! Тогда-то мы и поговорим о локациях.
Пока!
Код:%_Привет, мир! %_Алиса находилась в центре необычной комнаты: стены её были составлены из квадратных плит, шириной примерно пол метра. По центру комнаты стоял круглый стеклянный стол с несколькими предметами на нём. Стекло было на столько чистым и прозрачным, а освещение в комнате было таким тусклым, что сначала Алисе показалось, что предметы висят в воздухе. слово Алиса { key = ЖрОд defkey = ИпЕч form ИпЕч = "Алиса" form ИпМч = "Алисы" form РпЕч = "Алисы" form РпМч = "Алис" form ДпЕч = "Алисе" form ДпМч = "Алисам" form ВпЕч = "Алису" form ВпМч = "Алис" form ТпЕч = "Алисой" form ТпЕчПс = "Алисою" form ТпМч = "Алисами" form ПпЕч = "Алисе" form ПпМч = "Алисах" } человек Алиса { внешнее_описание = "Маленькая девочка Алиса, которая согласилась поучавствовать в этом странном эксперименте за шоколадную конфету" } pers = Алиса var себя = pers //======================================================================================== action(осмотри act*Пф, всё:видимое Это*Вп) //это действие для видимых объектов { == parsing == fail, "fail" if :это.cls = пусто //должен быть класс fail, "это не по-русски" if :это.word.name = "ты" //"осмотри тебя" - это не по-русски Ok == check == //объект должен быть виден :это.видно == execute == if :Это is string or number then { var Str = :Это %{:Str} } else { if :Это.внешнее_описание = пусто then %<font collor=red>{:Это*Ип} не имеет внешнего описания!<font> else %{:Это.внешнее_описание}. } } object конфета {is предмет внешнее_описание = "Шоколадная конфета в блестящей упаковке. Наверное, очень вкусная." } Алиса + конфета
Отредактировано Alexandr (2013-05-11 19:15:51)