Gesperid написал:
1. Все проверки объектов выполняются в объекте действия (глагол в терминах рТАДСа)
Объекты, не подходящие действию, дальше не проходят.
2. У персонажа вызывается метод, одноименный с действием.
switch по действию таким образом исключается.
Если необходимый метод у персонажа отсутствует - выводится стандартное сообщение.
3. При необходимости никто не запрещает из метода персонажа вызвать метод объекта.
switch по объекту таким образом исключается.1. Что имеется в виду?
2. Это просто другая запись switch, а стандартное сообщение – это ветка default.
3. Не понял. Если, например, берётся бомба, в результате чего она детонирует. Какой метод вызвать у объекта, если в методе взять мы ещё не узнали, что это бомба?
1. для примера возьмем действие "взять"
unique бомба.cls = предмет .Вес = 50 .lex = "бомб%;..;..;..Вп=у;" //лексема для парсера action взять //объект категории действие (отдаленный аналог verb в TADS) .pat = "взять=возьми @Obj:предмет*Вп" //шаблон команды для парсера .Obj(Obj) //проверка для объекта, вызывается парсером { if(Obj.Вес > 100) return "а не надорвешься?" //не прошла проверка по весу }
При вводе комады "взять бомбу" парсер попытается подобрать подходящий шаблон и объекты к нему. В нашем случае это будет шаблон действия "взять" и объект "бомба".
При этом для объекта парсер выполнит проверки:
- бомба находится в текущей локации (префикс @ у переменной Obj)
- бомба отноится к классу "предмет" или имеет свойство "предмет" (Obj:предмет)
- вызовет проверку взять.Obj(бомба).
и только в случае если все проверки прошли успешно, парсет будет искать метод "взять(Obj)" у персонажа и выполнит его.
Обычно далее никаких ветвлений не требуется. Все объекты, способные браться, берутся одинаково.
----
2. Давно известно что любые конструкции языка можно заменить на if() и goto.
При желании все можно представить как switch. Только зачем?
Основное отличие тут в том, что методы можно разнести по классам и при необходимости перегружать. С ветками switch-а так не получится...
----
3. Это как раз и есть исключительная реакция. Ее можно реализовать по разному. Например так:
class предмет .doTake(){} //обычно предметы берутся без последствий бомба.doTake() //перегружаем метод { %Бабах! Бомба взорвалась у тебя в руках! die() } pers.взять(Obj) { %Ты взял {Obj*Вп}. this + Obj //Obj помещаем в инвентарь Obj.doTake() //вызываем метод объекта для нестандартных реакций }
получаем:
> взять бомбу
Ты взял бомбу.
Бабах! Бомба взорвалась у тебя в руках!
Ты умер.
Отредактировано ASBer (15.12.2008 17:04)
Неактивен
noname
> пожалуй, становится психологически трудно тестировать движок на примере одной и той же игры. хотя, для демы, игра просто суперская!
Noname, как самого упорного тестировщика готов включить тебя в раздел благодарностей (когда он появится)
После запуска игры невозможно получить список команд оболочки, типа Restart или Сохранить
Мне не удалось это повторить... у меня команда помощь/help/? работает везде и всегда.
> нельзя ли автоматизировать вывод этих списков? а то команда брось понятна мышонку, а в списке хелпа её нет
Помощь просто тупо проигрывает файлик help.txt из каталога игры. Если там чего-то нехватает, значит это нужно просто добавить.
> более серьёзным для автора платформы, но не столь важным для игрока, может будет:
очки[предмет, а не баллы] не отображаются в инвентаре, вообще нигде... нет команды, позволяющей получить прямое указание на наличие/отсутствие очков у мышонка.
Очки отображаются в описании персонажа. Отображать их еще и в инвентаре совсем не проблема
> ну, и совсем маловажные замечания связаны с возможностью отдавать команды другим персонажам:
Да, эти несуразности меня тоже повеселили. Будет исправлено в следующей версии.
>тестирование идёт вяло... хочется новой, не менее забавной демы
Сейчас нагло тырю демки из рТАДСа. Золотой череп почти работает.
Неактивен
noname написал:
что ещё мне нужно знать, что бы написать для ТОМ свой интерфейс?
Скачать файлик ConTOM_s.rar (есть в Вики на страничке ТОМа). Там разобраться с constom.cpp - это весь интерфейс одним модулем, правда на С.
Все что тебе надо от ТОМа - это 3 функции:
char* RunFile(char*FileName);
char* RunText(char*Text );
char* Command(char*Input);
Отредактировано ASBer (16.12.2008 14:39)
Неактивен
Стручок гороха просто бессовестно недоделан!
Чтобы он отображался в инвентаре необходимо прописать свойство .ВКармане = "..."
для комнаты свойство .ЛежитВКомнате = "..."
для двора свойство .ВиденВоДворе = "..."
(очки кстати добавил в инвентарь)
Действие "сорвать" почти что синоним действия "взять" также как "положить" или "бросить".
Я не думаю что в хелпе должны быть описаны ВСЕ действия. Пусть автор игры сам решает что подсказывать игроку, а что нет.
Для "чайников" примеры писать нужно после того как появится стандартная библиотека.
Примеры должны использовать эту библиотеку. Иначе просто нереально.
Неактивен
noname написал:
свежий баг:
сейчас пример "Диалоги на меню.tom" не выводит сообщений, кроме сообщений об ошибках. я уж и их архива заново доставал. по-моему это случилось как раз после того, как я вместо старой версии ТОМ скачал свежайшую. а старую удалил.
Да, это моя вина. Персонажам в примере необходимо добавить метод .onChangePers()
location Комната.title="Комната" .description="в комнате Вася и Петя (для разговора с Васей введите 'говорить с Васей')" unique Вася.title="Вася" unique Петя.title="Петя" .onChangePers(OldPers) { // При смене персонажа показываем локацию if(.loc <> OldPers.loc) { %<location> %{.loc}</location> %{.loc.description} } } unique Петя_говорящий_с_Васей.title="Петя" .onChangePers(OldPers) { // При смене персонажа показываем локацию if(.loc <> OldPers.loc) { %<location> %{.loc}</location> %{.loc.description} } } pers=Петя
Этот метод - обработчик нового события, возникающего при смене персонажа.
Теперь вывод локации не производится автоматически. Это теперь нужно программировать.
Я посчитал это более гибким, например, может понадобится изменить способ показа локации при входе в темную комнату.
Неактивен
noname> 1) пока не вижу реакции на ключевые слова. допустим, ввод 'сокровища' будет непонят
ASBer: В ТОМе реализованы 2а способа реализации диалогов - менюшный и парсерный. В рассмотренном примере используется только менюшный способ, но самым интересным мне видится сочитание обоих методов. Тогда будет и реакция на ключевые слова в том числе.
noname> 2) дурацкий текст сообщения об ошибке в режиме диалога: 'Петя не может этого сделать'. собственно, Петя в этом режиме ничего не может сделать. в случае непонятой фразы( а любой ввод в этом режиме воспринимается как фраза, обращённая к собеседнику) хорошо бы выводить соответствующее сообщение.
ASBer: для объекта Петя_говорящий_с_Васей можно определить специальное свойство сan_not_execute. Например:
Петя_говорящий_с_Васей.сan_not_execute = "Вася тебя не понял."
(есть ряд подобных свойств, задокументирую их в ближайшее время)
noname> 3) игрок может искренне полагать, что ввод 'пр' бует понят как 'прощай', а это не так. т е система подбирает подходящую фразу сверху вниз до первого соответствия. впрочем, это тот момент, который лучше переложить на плечи авторов квестов: или пусть фразы тщательно подбирают, или игрока предупреждают, или надеются, что игрок поймёт принцип сам.
ASBer: Сейчас сортировка ответов по алфавиту. Скорее всего переделаю. Будет по порядку их объявления в коде игры. Т.е. фразы, которые должны быть сверху, нужно будет описывать раньше фраз, распологающихся ниже. Также в планах сделать автонумерацию пунктов меню. Вобщем есть над чем работать.
noname> 2) теоретически возможна (ASBer, подтверди) реакция и на другие, не перечисленные фразы. т е предложенные варианты не запрещают(теоретически) игроку ввести другое понятное ответчику слово, и получить соотв ответ
ASBer: да, такая возможность есть.
noname> 3) эта форма диалогов, естественно, не запрещает реализации обычных парсерных 'спросить Васю об ...', т е если кто из авторов хочет классических парсерных диалогов- наздоровье.
ASBer: парсерные диалоги базируются на специальном операторе:
Персонаж > "произносимая фраза"
где Персонаж - объект, а "произносимая фраза" - строка.
noname> надеюсь архив исправлен?
ASBer: Мне стало понятно что этот пример требует доработки.
Попробую добавить туда парсерные возможности, и выложу все примеры отдельным архивом.
Отредактировано ASBer (22.12.2008 10:30)
Неактивен
Предлагаю вниманию сообщества первую попытку портации стандартной библиотеки рТАДС на платформу ТОМ.
В архиве вы найдете библиотечные файлы (пока только 3) и демоигру - золотой череп.
Портация только начата и большинство глаголов все еще не переработано. Но все действия, необходимые для прохождения игры, работают.
Хотелось бы услышать ваши мнения и пожелания.
P.S. Разрешение у GrAndrey на эксперименты с портацией библиотеки получено.
P.S.S. Разрешения у Michael J. Roberts не запрашивал, но условия лицензии, насколько я понимаю, подобной модификацией не нарушаются.
--------------------------------------------------------------------------------
Прикрепленные файлы:
TOMrTADS.rar, Размер: 236,863 байт, Скачано: 54
Неактивен