Вот именно, что много необкатанных и недоделанных изменений.
Сообщения для первого лица адаптированы не все;
Орфография работает не так как положено (считаю, что в справочной области должны быть только видимые предметы, а также не стоит обрабатывать слишком короткие слова). Также не понял, решили ли вопрос с выскакивающим сообщением;
Вывод догадок системы как следует не протестирован;
Хочу автоматизировать определение приглагольного падежа (type).
Частые обновления пугает авторов, особенно начинающих, так что не следует торопится. Все желающие могут получить от меня "альфа версию".
Неактивен
Вот именно, что много необкатанных и недоделанных изменений.
Так надо, эта... обкатать и доделать. Что для этого надо?
Вообще, мне уже в голову приходят всякие еретические идеи типа юнит-тестирования. Если use-cases распишешь, можно написать автоматический (или полуавтоматический) тест библиотеки.
Неактивен
Просьба протестировать www.rtads.org/libr25beta.rar.
Хотел сделать автоматическое спряжение глаголов, но это ещё изрядно времени займет. Попробуйте разные лица ГП!
Неактивен
Такая неприятная особенность (было и раньше):
(примерно так)
>осм дубину стража
Который "дубину of стража" вы имеете в виду, "левый скипетр стража" или "правый скипетр стража"?
Диковато выглядит "of", и сочетание "Который дубину" (дубина описана как скипетр и имеет признак isHim).
И еще (вроде раньше обсуждали? не могу найти):
>ударить гоблина топором
Я не вижу здесь объект "гоблина топором".
Топор находится в инвентаре.
Неактивен
"дубину of стража"
Исправил, залил новую версию.
Который "дубину of стража" вы имеете в виду, "левый скипетр стража" или "правый скипетр стража"?
Синонимы могут быть разных полов и чисел. Тут либо смириться, либо свести сообщение к абстрактному "Который из объектов "дубину стража" вы имели в виду, ... " или "Упоминая "дубину стража", вы имели в виду: ... "
>ударить гоблина топором
Я не вижу здесь объект "гоблина топором".
Код гоблина и топора, пожалуйста.
Неактивен
Попробывал реализовать атаку гоблина топором. В итоге вообще ничего не выводит. Странно. Просто пустая строка, ни ошибки, ничего. Если определять атаку гоблина в объекте топора, то все окей. Но логичнее вроде как использовать прямой объект.
До метода doAttackWith вообще дело не доходит, хотя верефикатор переопределен.
goblin : Actor location = startroom sdesc = "гоблин" rdesc = "гоблина" ddesc = "гоблину" vdesc = "гоблина" tdesc = "гоблином" pdesc = "гоблине" noun = 'гоблин' 'гоблина' 'гоблину' 'гоблином' 'гоблине' 'гоблину#d' 'гоблином#t' ldesc = "Это маленький зеленый гоблин." isHim = true verDoAttackWith(actor,io) = {} doAttackWith(actor,io) = {"Уй-я! - кричит гоблин и убегает."; return nil;} ; topor : item location = Me sdesc = "топор" rdesc = "топора" ddesc = "топору" vdesc = "топор" tdesc = "топором" pdesc = "топоре" noun = 'топор' 'топора' 'топору' 'топором' 'топоре' 'топору#d' 'топором#t' ldesc = "Это топор." isHim = true verIoAttackWith(actor) = {} ;
Отредактировано - VampirE - (05.02.2008 22:59)
Неактивен
- VampirE - написал:
Попробывал реализовать атаку гоблина топором. В итоге вообще ничего не выводит. Странно. Просто пустая строка, ни ошибки, ничего. Если определять атаку гоблина в объекте топора, то все окей. Но логичнее вроде как использовать прямой объект.
До метода doAttackWith вообще дело не доходит, хотя верефикатор переопределен.Код:
goblin : Actor location = startroom sdesc = "гоблин" rdesc = "гоблина" ddesc = "гоблину" vdesc = "гоблина" tdesc = "гоблином" pdesc = "гоблине" noun = 'гоблин' 'гоблина' 'гоблину' 'гоблином' 'гоблине' 'гоблину#d' 'гоблином#t' ldesc = "Это маленький зеленый гоблин." isHim = true verDoAttackWith(actor,io) = {} doAttackWith(actor,io) = {"Уй-я! - кричит гоблин и убегает."; return nil;} ; topor : item location = Me sdesc = "топор" rdesc = "топора" ddesc = "топору" vdesc = "топор" tdesc = "топором" pdesc = "топоре" noun = 'топор' 'топора' 'топору' 'топором' 'топоре' 'топору#d' 'топором#t' ldesc = "Это топор." isHim = true verIoAttackWith(actor) = {} ;
Порядок вызова: прямой объект.verDoAttackWith -> косвенный объект.verIoAttackWith -> косвенный объект.ioAttackWith. doAttackWith (для команд с косвенным объектом) автоматом никогда не вызывается, его вызов надо явно прописать в игре. Т. е. для топора укажи
ioAttackWith(actor, dobj)={dobj.doAttackWith(actor, self);
Неактивен
commonAxe: item location = nil sdesc = "топор" rdesc = "топора" ddesc = "топору" vdesc = "топор" tdesc = "топором" pdesc = "топоре" noun = 'топор' 'топора' 'топору' 'топором' 'топоре' 'топору#d' 'топором#t' ldesc = "Обычный топор." isHim = true verIoAttackWith (a) = {} ioAttackWith (a, i) = { "Ты атаковал <<i.rdesc>> <<self.tdesc>>."; } ; deadGoblin: fixeditem location = citadelCorridor sdesc = "мертвый гоблин" rdesc = "мертвого гоблина" ddesc = "мертвому гоблину" vdesc = "мертвого гоблина" tdesc = "мертвым гоблином" pdesc = "мертвом гоблине" adjective = 'мертвый' 'мертвый#t' 'мертвого' 'мертвому' 'мертвому#d' 'мертвым' 'мертвым#t' 'мертвом' 'труп' 'труп#t' 'трупа' 'трупу' 'трупу#d' 'трупом' 'трупом#t' 'трупе' noun = 'гоблин' 'гоблина' 'гоблину' 'гоблином' 'гоблине' 'гоблину#d' 'гоблином#t' 'труп' 'труп#t' 'трупа' 'трупу' 'трупу#d' 'трупом' 'трупом#t' 'трупе' verDoAttackWith (a, i) = {} ldesc = "Описание гоблина" ;
По определенным причинам, гоблин уже мертв. Но это не должно влиять на команду. Топор изначально в nil -- переносится в комнату програмно. Я его подобрал, топор в инвентаре. Гоблин в комнате.
"Упоминая "дубину стража", вы имели в виду: ... "
Такой вариант лучше. Хотя и звучит вычурней, но избавит игрока от непредусмотренных несуразностей. Эх, насколько же проще английский язык... %)
Отредактировано Gremour (06.02.2008 12:58)
Неактивен
Бросил топор в комнате, подобрал. Атаковал гоблина - реакция есть.
> подобрать топор
Взят.
> атаковать мертвого гоблина топором
Ты атаковал мертвого гоблина топором.
Неактивен
Обновил бету библиотеки. Прошу изучить и помучать функцию glok. На этом принципе можно сделать встроенный генератор падежей.
http://www.rtads.org/libr25beta.rar
Полезный для проверки код:
pers: object setall(num)= { isThem:=nil; self.lico:=(num-1)/2+1; if (num%2=0) self.isThem:=true; } ; sprag: function(num1, num2, str) { local i:=1; while (i<=6) { pers.setall(i); glok(pers,num1,num2,str); " "; if (i%2=0) "| "; i++; } "\n"; } sprag1: function(str) { local i:=1; while (i<=6) { pers.setall(i); glok(pers,str); " "; if (i%2=0) "| "; i++; } "\n"; } startroom: room ldesc = { sprag(1,1,'мож'); sprag(3,1,'хот'); sprag(2,1,'вид'); sprag(2,1,'сид'); sprag(2,1,'леж'); sprag(1,2,'нес'); sprag(2,1,'нос'); sprag(2,1,'наход'); sprag(1,1,'зна'); sprag(1,1,'дума'); sprag(1,1,'име'); sprag(2,2,'выгляд'); sprag(1,1,'помога'); sprag(1,1,'представля'); sprag(1,2,'пойд'); sprag(1,1,'вылез'); sprag(2,2,'сто'); sprag(1,1,'слез'); sprag(1, 1,'пахн'); sprag(2,2,'говор'); sprag1('хотеть'); } ;
Неактивен
Из moveableActor:
verGrab(item) = { "<<ZAG(self,&sdesc)>> <<glok(self,'нести')>> <<item.vdesc>> и не да<<self.isThem?"дут":"ст">> <<parserGetMe().ddesc>> взять <<item.itobjdesc>>. "; }
Некорректно работает.
>взять бутылку
Печальный владелец бутылку вина и не даст тебе взять её.
Неактивен
В последней выложенной тобой версии (http://rtads.org/libr25beta.rar) баг есть. Вот исходник для примера:
#include <advr.t> #include <errorru.t> #include <stdr.t> startroom: room ldesc = "Стартовая комната" ; shopkeeper: Actor location = startroom sdesc = "торговец" rdesc = "торговца" ddesc = "торговцу" vdesc = "торговца" tdesc = "торговцом" pdesc = "торговце" noun = 'торговец' 'торговца' 'торговцу' 'торговцом' 'торговце' 'торговцу#d' 'торговцом#t' ldesc = " торговец" isHim = true actorDesc = "торговец с булкой в руках стоит здесь. " ; bread: item location = shopkeeper sdesc = "булка" rdesc = "булки" ddesc = "булке" vdesc = "булку" tdesc = "булкой" pdesc = "булке" noun = 'булка' 'булки' 'булке' 'булку' 'булкой' 'булкою' 'булке#d' 'булкой#t' 'булкою#t' ldesc = " булка" isHer = true ;
>взять булку
Торговец булку и не даст тебе взять её.
Неактивен
Подтверждаю, в advr.t от 7.02.08 есть такая ошибка.
Связана с тем, что не срабатывает функция glok(self, 'нести'), которая просто ничего не выводит. Т.е. должно было быть
>взять булку
Торговец несет булку и не даст тебе взять её.
Я сталкивался с этим, когда делал свои модули -- сначала использовал новую версию glok, но потом пришлось откатиться на старую из-за непредсказуемого поведения новой (например "идти", "мочь" тоже не работают).
Поэтому в бета-версиях библиотеки, наверное, лучше сделать, чтобы glok выдавала ошибку на экран, если ей не удалось подобрать спряжение.
Неактивен
Вуаля!
Генератор склонений подключен к РТАДС, а также ещё некоторые новые фишки.
Прошу жесточайшим образом протестировать!
Теперь можно самому на ходу настраивать правила, так что делитесь наработками.
скачать.
Неактивен
Видимо, сейчас актуальнее иные вещи. Так и быть, поддамся конъюнктуре:
brosok: function() { local i, maxdie=6, sides=6, total=0; "\nБросок, результат: \n"; for (i:=1; i<=maxdie; i++) { local res = _rand(sides); " <<res>>"; total+=res; } "\nИтог: <<total>>\n"; } startroom: room sdesc = "<b>Бросалка кубиков</b>" ldesc = { brosok(); "\nНажмите пробел для нового броска, либо любую иную клавишу для выхода. "; while (inputkey()=' ') brosok(); quit(); } ;
Неактивен
Flint написал:
Колоссально!
Большое спасибо.
fireton написал:
Человечище!
Спасибо!
Кто-нибудь уже работает или, может быть, хорошенько пощупал генератор склонений из последней библиотеки РТАДС? Какие впечатления?
Неактивен
Обновил бету. Задавайте вопросы, если что не ясно.
скачать 25 релиз бета
Для использования скинуть все в папку с библиотеками (как минимум обновить advr.t, где есть новая функция для работы генератора, и скопировать библиотеку generator.t).
Внимание! Генератор запускается через функцию commonInit, причем он сразу включает ставший режимом по умолчанию HTML. Поэтому в файле игры следует убрать следующий фрагмент:
replace commonInit: function {"\H+";}
На данный момент генерируются только лексемы. Подлежащие генерации лексемы должны быть отмечены слэшем "/". Ставится он после слова, за ним могут следовать флаги обозначающие род, число и одушевленность. При отсутствии флагов используются свойства объекта. Таким образом возможно решить проблему различия свойств синонима и основного названия объекта - запоминать каким словом обратились, и потом использовать его характеристики (Проблемы из ряда: здесь ящик=> взять коробку => ты не можешь взять его)
Результат генерации выдается на экран, если не отключена соответствующая опция.
Что ещё не сделано: генерация склонений короткого названия, обезЁживание лексем, оптимизация кода (так скажем, не шустрый).
Неактивен