RTADS - это всего лишь инструмент, со своими ограничениями. Любая свобода, в том числе и свобода творить, существует внутри каких-то рамок. Да на RTADS невозможно написать исчерпывающую модель реальности. Ну и что? В книгах, вон, вообще нет интерактивности.
Неактивен
ну ничего, ASBer вам всем ещёпокажет! я за него болею.
а насчёт запирания контейнера:
нашёл класс lockable
box : lockable, container, fixeditem, openable
isOpen = nil
isLocked = true
mykey = key
объект key тоже описан.
и вот, подхожу я к сейфу БЕЗ ключа и легко открываю командой отпереть.
что не так?
Неактивен
про исчерпывающую модель мы ещё поговорим.
насчёт ключа к сейфу: несколько неудобно, что запирающиеся контейнеры и запирающиеся двери реализованы ОЧЕНЬ по разному: для контейнеров заведён отдельный класс keyedlockable, а для дверей достаточно указать свойство mykey указывающее на объект keyItem
Неактивен
а регистр букв- вообще чудная вещь:
-keyedLockable - одна большая буква
-islocked - ни одной
по логике Си было бы KeyedLockable и IsLocked
так или иначе к регистрам привыкнуть не просто, как и к кавычкам, но я таки сделаю что-нибудь серьёзное.
p.s.
думаю, к КРИЛ-2008 буду писать три квеста: под досурку, qsp и РТАДС.
начал ещё и на Delphi(парсерный), но у него меньше всего шансов быть завершённым.
p.p.s.
РТАДС есть за что любить, но как только я в нём (и в парсере от ASBer) досконально разберусь- начну писать свой парсер.
Неактивен
Можно сделать простые "обертки" такого типа:
isLocked: islocked;
Подобное я уже сделал с функцией loweru, которую сам постоянно вызывал как lowerru.
Неактивен
в моём мини-квесте уже четыре локации, несколько объектов
и персонаж: робот.
вопрос:
- в мануале приводится пример случайного блуждания персонажа с проверкой выходов.
- МОЖНО ли с помощью какой-либо функции проверить доступность какого-либо действия, получить список доступных действий для персонажа не-игрока.
НАПРИМЕР:
массив VV содержит список глаголов для данного персонажа
массив NN содержит список объектов, присутствующих в игре + пустой объект
хочу в цикле перебрать каждую пару VV[x],NN[y] и если VV[x]+NN[y] не только клеится в корректную команду, но ещё и выполнимо при текущих обстоятельствах - заношу это действие в список LL[z]. затем случайным образом с равной вероятностью выбираю одно из действий на выполнение.
суть ВОПРОСа в том: есть ли какая-либо функция для проверки возможности действия VV[x]+NN[y] ?
(если нет, то и не надо - в таком виде она мне нужна только на промежуточном этапе подготовки квеста- потом всё равно прийдётся писать свою функцию выбора действия )
Неактивен
noname написал:
нет повести печальнее на свете...
в данном случае я просто создал пару локаций. без всякого сюжета и плана. меня устроил бы любой вариант работы команд, НО они УЖЕ работают некорректно.
p.s.
и эта ошибка присутствует и в Кащее, и, я подозреваю, во всех русских РТАДС-квестах, если автор не переписал команду "бежать" самостоятельно
Ну, и в чем проблема переопределить самому?
noname написал:
да, я обеими руками ЗА то, чтоб парсер принимал 'е' и 'ё' за одинаковые буквы во вводе пользователя, но неужели это даётся такой ценой? я хочу, чтоб яблоко было 'зелёное', его кушал 'ёж', и в результате у него возникнут определённые ощущения в 'нёбе', которое он может потрогать языком и попробовать вылечить и т п
p.s.
а ещё в детском журнале Трамвай читал необычные приключения буквы Ё. что-то в духе Кэролловской Алисы.
noname, простите, конечно, но Вы с удовольствием распространяетесь о глюках RTADS, но не хотите разбираться с глюками в собственной голове. "Поддержка" буквы Ё включается в RTADS одним движением руки, и Вам уже описывали, как. Если это для Вас так важно, что Вам мешает это сделать самостоятельно?
noname написал:
было бы удобно задавать русские названия локациям и объектам.
вот объект сейф. пусть и называется сейф, нет мне приходится выдумывать английское название, и помнить, что это слово означает сейф. в случае наличие в игре различных но похожих объектов это не очень удобно. да и вообще в больших проектах это всегда крайне не удобно- помнить, как ты назвал зеркало mirror или looking_glass, как именно ты описал объект box - ящик или коробка и т д
А что мешает обзывать их транслитом? С большими же проектами априори крайне неудобно работать по сравнению с маленькими проектами;). И возможность обзывть объекты русскими буквами - отнюдь не панацея. Варианты борьбы: IDE - пока утопия; самому вести базу данных объектов (хотя бы на бумаге).
noname написал:
и ещё:
где найти список всех классов объектов
конкретно мне нужен lockablecontainer
http://www.rtads.org/man/TADSSTD.HTM - эту ссылку я Вам тоже уже давал, кстати, когда речь шла о списке всех понимаемых системой глаголов.
Отредактировано uux (12.04.2008 07:37)
Неактивен
noname написал:
вопрос:
- в мануале приводится пример случайного блуждания персонажа с проверкой выходов.
- МОЖНО ли с помощью какой-либо функции проверить доступность какого-либо действия, получить список доступных действий для персонажа не-игрока.
НАПРИМЕР:
массив VV содержит список глаголов для данного персонажа
массив NN содержит список объектов, присутствующих в игре + пустой объект
хочу в цикле перебрать каждую пару VV[x],NN[y] и если VV[x]+NN[y] не только клеится в корректную команду, но ещё и выполнимо при текущих обстоятельствах - заношу это действие в список LL[z]. затем случайным образом с равной вероятностью выбираю одно из действий на выполнение.
суть ВОПРОСа в том: есть ли какая-либо функция для проверки возможности действия VV[x]+NN[y] ?
(если нет, то и не надо - в таком виде она мне нужна только на промежуточном этапе подготовки квеста- потом всё равно прийдётся писать свою функцию выбора действия )
Специальной функции нет. Можно поступить так: отключить вывод на экран, затем вызвать верификатор и проверить, выводит ли он что-либо на экран:
old_stat:=outhide(true); // Отключаем вывод на экран [i]Вызов верификатора[/i] new_stat:=outhide(old_stat); // Включаем вывод на экран обратно if(not new_stat) ... // Вывода на экран от верификатора не было -> действие допустимо else ... // Вывод на экран был -> действие недопустимо
Другой вариант - сделать NN не списком всех объектов в игре, а списком объектов, которыми персонаж может манипулировать, а затем написать развесистую проверку, проверяющую каждое возможное сочетание глагола и объекта.
Извините, сейчас не могу написать более подробный и конкретный пример - нет времени. Если будут непонятки - спрашивайте еще, постараюсь помочь.
Неактивен
noname, простите, конечно, но Вы с удовольствием распространяетесь о глюках RTADS, но не хотите разбираться с глюками в собственной голове. "Поддержка" буквы Ё включается в RTADS одним движением руки, и Вам уже описывали, как. Если это для Вас так важно, что Вам мешает это сделать самостоятельно?
спасибо за прямоту. глюков у меня и вправду хватает. в данном случае описанный рецепт будет иметь тот недостаток, что пользователю обязательно нужно будет вводить букву Ё. идеальный вариант: пользователь может, но не обязан использовать букву Ё где ей положено. парсер должен всегда выводить букву Ё там где ей положено быть. вроде бы это же пожелание и содержалось в посте, на который ты ответил.
p.s.
да, кстати, давай переходить на ты
впрочем, это дело десятое.
а "урезание" буквы Ё я таки уберу
Отредактировано noname (12.04.2008 08:30)
Неактивен
noname написал:
noname, простите, конечно, но Вы с удовольствием распространяетесь о глюках RTADS, но не хотите разбираться с глюками в собственной голове. "Поддержка" буквы Ё включается в RTADS одним движением руки, и Вам уже описывали, как. Если это для Вас так важно, что Вам мешает это сделать самостоятельно?
спасибо за прямоту. глюков у меня и вправду хватает. в данном случае описанный рецепт будет иметь тот недостаток, что пользователю обязательно нужно будет вводить букву Ё. идеальный вариант: пользователь может, но не обязан использовать букву Ё где ей положено. парсер должен всегда выводить букву Ё там где ей положено быть. вроде бы это же пожелание и содержалось в посте, на который ты ответил.
p.s.
да, кстати, давай переходить на ты
впрочем, это дело десятое.
а "урезание" буквы Ё я таки уберу
На самом деле, в описанном тобой выше примере даже урезание отменять не потребуется: достаточно определить для яблока лексическое свойство "зеленое" (а не "зелёное"), и что бы игрок не ввел - с Ё или без Ё - игра его поймет.
Мне сразу в голову это не пришло - видно, с глюками в мозгу и у меня все в порядке;).
Отредактировано uux (12.04.2008 08:36)
Неактивен
смысл поста ясен
упомянутый пример сейчас пишу самостоятельно
благо у меня всего 6-ть объектов и 8-мь команд (из них долько 2-а требуют более одного аргумента)
возможно, эта информация где-то содержится, но спрошу:
можно ли получить доступ к переменным, содержащим введённые игроком глагол и аргументы?
(желательно с инфой о том, в каком падеже и т п)
Неактивен
что сделать, что бы такой код заработал?:
magicVerb: deepverb
verb = 'xyzzy' 'ксиззи'
sdesc = "xyzzy"
action( actor ) =
{
if ( actor.location = b1room )
{
"Внезапно пещеру заволакивает облаком оранжевого дыма.
Когда оно рассеивается, ты внезапно обнаруживаешь,
что находишься в хижине!";
actor.moveInto(b2room);
}
else if (actor.location = b2room)
{
"Внезапно ты чувствуешь головокружение, а комната
все быстрее и быстрее начинает вращаться вокруг тебя.
Более-менее придя в себя, ты обнаруживаешь, что находишься
в пещере! ";
actor.moveInto( b1room );
}
else
"Ничего не происходит.";
}
;
пишет, что слово xyzzy не известно
>ñ
ñåâåðî-âîñòî÷íàÿ ëîêàöèÿ (b2)
Èçíà÷àëüíî ðîáîòà ïîìåùàåì ñþäà.
Çäåñü íàõîäèòñÿ ñêðèïó÷èé ðîáîò.
ðîáîò íàïåâàåò ïîïóëÿðíóþ ïåñåíêó.
>xyzzy
Ê ñîæàëåíèþ, ñëîâî "xyzzy" ìíå íåèçâåñòíî.
>
и почему перестали нормально вставляться вырезки из работающей проги?
p.s.
я нихрена не спал и поэтому не уверен теперь, что я всё/что-нибудь/кое-что делаю правильно, НО насколько я могу судить вроде бы шрифты - это какая-то проблема на форуме? в проге я их НЕ менял.
Отредактировано noname (12.04.2008 13:12)
Неактивен
uux
Специальной функции нет.
а вот и есть! надеюсь, она мне не снится. вот она:
checkreach
checkreach: function(loc, actor, v, obj): проверяет, может ли актер (персонаж) actor манипулировать объектом obj при помощи глагола v, находясь в комнате loc. Функция используется на этапе валидации (проверки корректности) команды. Эта функция разрешает дальнейшую обработку команды, если obj - это объект специального типа (numObj или strObj), если этот объект находится в инвентаре актера actor, а также в том случае, если он внесен в список reachable комнаты loc. Во всех прочих случаях возвращается выводится сообщение об ошибке, что на этапе валидации автоматически означает отказ от дальнейшей обработки.
впрочем, неуверен, что именно она проверяет: взять кровать по её мнению тоже можно?...
Неактивен
стартовая локация (a1)
Это моя первая локация.
>с
северная локация (a2)
Вот мои первые объекты.
Ты видишь здесь дубовый стол и стальной ключ. На дубовом столе ты видишь надёжный сейф.
>в
северо-восточная локация (b2)
Изначально робота помещаем сюда.
Здесь находится скрипучий робот.
робот напевает популярную песенку.
>ксиззи
К сожалению, слово "ксиззи" мне неизвестно.
>
вот! по-крайней мере со вставкой разобрались, СПАСИБО!
но как быть с ксиззи???
может я его куда-нить не туда вставляю,
или где-то чего-то ещё нужно изменить?
Неактивен
noname написал:
смысл поста ясен
упомянутый пример сейчас пишу самостоятельно
благо у меня всего 6-ть объектов и 8-мь команд (из них долько 2-а требуют более одного аргумента)
возможно, эта информация где-то содержится, но спрошу:
можно ли получить доступ к переменным, содержащим введённые игроком глагол и аргументы?
(желательно с инфой о том, в каком падеже и т п)
Информация вот здесь:
http://www.rtads.org/man/TADSADPT.HTM, далее текстовым поиском на странице по шаблону "Получение информации о текущей команде".
С информацией о падежах и т. п. хуже - системной функции для этого в TADS нет. Что навскидку приходит в голову - из функции preparse сохранить в промежуточной переменной строку в том виде, в каком ее ввел игрок, а потом разбираться с падежами. Но это муторно.
Неактивен
noname написал:
но как быть с ксиззи???
может я его куда-нить не туда вставляю,
или где-то чего-то ещё нужно изменить?
На первый взгляд, все должно компилироваться нормально. Единственное, что приходит на ум - файл, где определен ксиззи, не включен в число компилируемых, либо каким-то образом этот фрагмент оказался между комментариями. Если совсем затык - шли на мыло uux собака mail точка ru, буду разбираться.
Неактивен
noname написал:
uux написал:
Специальной функции нет.
а вот и есть! надеюсь, она мне не снится. вот она:
Молодец! Уел меня.
noname написал:
checkreach
checkreach: function(loc, actor, v, obj): проверяет, может ли актер (персонаж) actor манипулировать объектом obj при помощи глагола v, находясь в комнате loc. Функция используется на этапе валидации (проверки корректности) команды. Эта функция разрешает дальнейшую обработку команды, если obj - это объект специального типа (numObj или strObj), если этот объект находится в инвентаре актера actor, а также в том случае, если он внесен в список reachable комнаты loc. Во всех прочих случаях возвращается выводится сообщение об ошибке, что на этапе валидации автоматически означает отказ от дальнейшей обработки.впрочем, неуверен, что именно она проверяет: взять кровать по её мнению тоже можно?...
В общем случае она проверяет, что актер и объект находятся в одной и той же комнате и что при этом актер видит объект (возможны более сложные специальные случаи - например, для глагола "спросить о" невыполнение данных условий не будут мешать заимодействию с объектом, но мы их пока касаться не будем). Грубо говоря, она проверяет, надо ли выдавать ошибку типа "Я не вижу здесь этого". Таким образом, если игрок и кровать находятся в одной комнате, функция не будет возражать против "взять кровать".
Неактивен
а вот и не так уж и муторно-
это смотря для каких целей. мне эта штука вот зачем:
1. в редких, заранее известных случаях разруливать неоднозначности
(когда слишком догадливый интерпретатор исправляет итак корректную фразу так, что у неё получается другой смысл) - точно щаззз не скажу когда это надо, но у меня такое получалось уже вчера. тут суть в том, что парсер не различает формы введённых слов.
2. для хороших подсказок вместо некоторых сообщений об ошибках:
>положить ключ под стол
Я не понимаю это предложение.
от такой честности никому не легче. куда лучше будет:
-незачем ложить ключ под стол
-положи его на стол или просто выложи
p.s.
это будет для некоторых, заранее известных случаев, когда ясно какое слово и в какой форме ищем.
Неактивен
заранее извиняюсь, но так уж исторически сложилось, что я чувствую эту тему своей и могу позволить себе выложить листинг:
/* Это просто комментарий, такой же, как, например, в языке Си */
/* Эти две строчки разрешают использовать возможности HTML в нашей игре */
#define USE_HTML_STATUS
#define USE_HTML_PROMPT
#include <advr.t> /* включить файл с основными определениями объектов для текстовых квестов (русская версия)*/
#include <stdr.t> /* включить файл определений стандартных функций, вызываемых при старте (русская версия) */
#include <errorru.t> /* включить файл с русскими сообщениями об ошибках */
/************** поля *************************************************************************************************/
startroom: room /* по умолчанию, игра начинается в комнате с названием startroom */
sdesc = "<b>стартовая локация (a1)</b>" /* краткое опиание комнаты (от английского Short DESCription) */
ldesc = "Это моя первая локация."
north = a2room
east = b1room
;
a2room:room
sdesc = "<b>северная локация (a2)</b>"
ldesc = "Вот мои первые объекты."
south = startroom
east = b2room
;
b1room:room
sdesc = "<b>восточная локация (b1)</b>"
ldesc = "Ещё одна заморочка."
west = startroom
north = b2room
;
b2room:room
sdesc = "<b>северо-восточная локация (b2)</b>"
ldesc = "Изначально робота помещаем сюда."
west = a2room
south = b1room
enterRoom( actor ) =
{
if ( not self.isseen )
notify( robot, &actorDaemon, 0 );
pass enterRoom;
}
;
/************************************** качели ************************************************************************/
table: surface, fixeditem
sdesc = "дубовый стол"
rdesc = "дубового стола"
ddesc = "дубовому столу"
vdesc = "дубовый стол"
tdesc = "дубовым столом"
pdesc = "дубовом столе"
noun = 'стол' 'стола' 'столу' 'столом' 'столе' 'столу#d' 'столом#t'
adjective = 'дубовый' 'дубового' 'дубовому' 'дубовым' 'дубовом' 'дубовому#d' 'дубовым#t'
isListed = true
isHim = true
location = a2room
ldesc =
{
"Стол представляет из себя квадратную крышку на четырёх ножках. На нём стоит надёжный сейф.";
}
;
box: keyedLockable, container, fixeditem, openable
sdesc = "надёжный сейф"
rdesc = "надёжного сейфа"
ddesc = "надёжному сейфу"
vdesc = "надёжный сейф"
tdesc = "надёжным сейфом"
pdesc = "надёжном сейфе"
noun = 'сейф' 'сейфа' 'сейфу' 'сейфом' 'сейфе' 'сейфу#d' 'сейфом#t'
adjective = 'надёжный' 'надёжного' 'надёжному' 'надёжным' 'надёжном' 'надёжному#d' 'надёжным#t'
isListed = true
mykey= key
isHim = true
isopen = nil
islocked = true
location = table // !!!!!!!!!!!!!!! заремаркить убирание буквы Ё в нужной библиотеке
;
/********* вещи ****************************************************************************************************/
apple: item
sdesc = "зелёное яблоко"
rdesc = "зелёного яблока"
ddesc = "зелёному яблоку"
vdesc = "зелёное яблоко"
tdesc = "зелёным яблоком"
pdesc = "зелёном яблоке"
noun = 'яблоко' 'яблока' 'яблоку' 'яблоком' 'яблоку#d' 'яблоком#t' 'яблоке'
adjective = 'зелёное' 'зелёного' 'зелёному' 'зелёным' 'зелёном' 'зелёному#d' 'зелёным#t'
//isHim = true
location = box
;
key: keyItem
sdesc = "стальной ключ"
rdesc = "стального ключа"
ddesc = "стальному ключу"
vdesc = "стальной ключ"
tdesc = "стальным ключом"
pdesc = "стальном ключе"
noun = 'ключ' 'ключа' 'ключу' 'ключом' 'ключу#d' 'ключом#t' 'ключе'
adjective = 'стальной' 'стального' 'стальному' 'стальным' 'стальном' 'стальному#d' 'стальным#t'
isHim = true
location = a2room
;
/********************************** актёры ****************************************************************************/
robot: Actor
noun = 'робот' 'робота' 'роботу' 'роботом' 'роботе' 'роботу#d' 'роботом#t'
adjective = 'скрипучий' 'скрипучего' 'скрипучему' 'скрипучим' 'скрипучем' 'скрипучему#d' 'скрипучим#t'
sdesc = "скрипучий робот"
rdesc = "скрипучего робота"
ddesc = "скрипучему роботу"
vdesc = "скрипучего робота"
tdesc = "скрипучим роботом"
pdesc = "скрипучем роботе"
isHim = true
isawake = true
location = b2room
actorDaemon =
{
if ( self.location <> Me.location or not self.isawake ) return;//!!!!!!!!!!!!! вычислять вместо Me
"\b";
switch( rand( 5 ) )
{
case 1:
"робот ходит туда-сюда.";
break;
case 2:
"робот выстукивает какую-то мелодию.";
break;
case 3:
"робот напевает популярную песенку.";
break;
case 4:
"робот выстукивает чечётку. ";
break;
case 5:
"робот тихонько поскрипывает.";
break;
}
}
;
magicVerb: deepverb
verb = 'xyzzy' 'ксиззи'
sdesc = "xyzzy"
action( actor ) =
{
if ( actor.location = b1room )
{
"Внезапно пещеру заволакивает облаком оранжевого дыма.
Когда оно рассеивается, ты внезапно обнаруживаешь,
что находишься в хижине!";
actor.moveInto(b2room);
}
else if (actor.location = b2room)
{
"Внезапно ты чувствуешь головокружение, а комната
все быстрее и быстрее начинает вращаться вокруг тебя.
Более-менее придя в себя, ты обнаруживаешь, что находишься
в пещере! ";
actor.moveInto( b1room );
}
else
"Ничего не происходит.";
}
;
/*
switchPlayer(Me);
parserGetMe();
*/
файл у меня единственный
Неактивен
noname написал:
заранее извиняюсь, но так уж исторически сложилось, что я чувствую эту тему своей и могу позволить себе выложить листинг:
...
файл у меня единственный
Скачал. Скомпилировал. Все работает, "ксиззи" распознается.
Вопрос: может, ты добавил код для xyzzy и, не закрывая и не сохраняя файла в редакторе, сразу стал компилировать и запускать игру?
Попробуй сейчас еще раз.
Кстати, в подобных случаях можно проверить, действительно ли измененный код внесен в файл исходника, просмотрев его в окне дебаггера (в смысле, TADS Workbench).
Отредактировано uux (12.04.2008 16:44)
Неактивен