Что скажешь, ГрАнд?
Уже достаточно изменений накопилось, по-моему...
Неактивен
Такая неприятная особенность (было и раньше):
(примерно так)
>осм дубину стража
Который "дубину of стража" вы имеете в виду, "левый скипетр стража" или "правый скипетр стража"?
Диковато выглядит "of", и сочетание "Который дубину" (дубина описана как скипетр и имеет признак isHim).
И еще (вроде раньше обсуждали? не могу найти):
>ударить гоблина топором
Я не вижу здесь объект "гоблина топором".
Топор находится в инвентаре.
Неактивен
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)
Неактивен
Из 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 ;
>взять булку
Торговец булку и не даст тебе взять её.
Неактивен
Вывод генератора:
1му - стол сто$1а сто$1у(#d) сто$1 сто$1ом(#t) сто$1е стол (-)
Объект:
table: fixeditem, surface location = lightRoom isHim = true adjective = 'изящный/1м' noun = 'стол/1м' ldesc = "Описание стола. " ;
Лексемы какие-то странные. Так и надо, или я опять что-то неправильно делаю?
С прилагательным вроде порядок.
Неактивен
Генератор на прилагательном adjective = 'восточное/с' зависает.
Некорректно воспроизводятся лексемы 'землЯ/1ж' (в В.П. даже пробел посреди слова!).
И ещё: sdesc, я так понял, автоматом не генерится? Было бы удобно, если бы для объекта, у которого не задан sdesc, он автоматом составлялся из первого существительного (возможно, первое прилагательное плюс первое существительное).
P.S. Слова типа "ставень" (ставня) надо руками прописывать?
Отредактировано Gremour (09.04.2008 18:07)
Неактивен
Итак, список некорректно обрабатываемых слов (буду дополнять):
восточное
старинное
стол
земля
город
лес
Отредактировано Gremour (09.04.2008 18:08)
Неактивен
По-прежнему 'восточное/1с' и 'старинное/1с' дают слом генератора (выход за границы массива).
Очень хочется автоматической генерации *desc и флагов isHim, isHer, isThem. Делаю пока самостоятельно. Но работает как-то странно. Некоторые прилагательные для И.П. почему-то теряются
modify thing autoAdj = true // Признак автогенерации прилагательного descnoun = [ '', '', '', '', '', '' ] descadj = [ '', '', '', '', '', '' ] assembleDescription(n) = { if (autoAdj && descadj[n] != '') { say (descadj[n]); " "; } say (descnoun[n]); } sdesc = { self.assembleDescription(1); } rdesc = { self.assembleDescription(2); } ddesc = { self.assembleDescription(3); } vdesc = { self.assembleDescription(4); } tdesc = { self.assembleDescription(5); } pdesc = { self.assembleDescription(6); } printDescs = { "\n"; "sdesc={"; sdesc; "}"; "\n"; "rdesc={"; rdesc; "}"; "\n"; "ddesc={"; ddesc; "}"; "\n"; "vdesc={"; vdesc; "}"; "\n"; "tdesc={"; tdesc; "}"; "\n"; "pdesc={"; pdesc; "}"; } ;
В generator.t (метод start(...):
// перебираем склонения res:=generate(obj, nouns[i], 0, 1, true); for (sklon:=1; res<>nil && sklon<=length(res); ++sklon) { local same:=nil; local new_nouns:= getwords(obj, &noun); if (sklon >= 1 and sklon <= 6) // +++++++++++++++++++ obj.descnoun[sklon] := res[sklon][1]; // +++++++++++++++++++ // пополняем список лексем if (find(new_nouns,res[sklon][1])=nil) addword(obj, &noun, res[sklon][1]); else same:=true; <...> // СКЛОНЯЕМ ПРИЛАГАТЕЛЬНЫЕ for (i:=1; i<=al; ++i) { local res, sklon; if (find(adjs[i],'/')) { res:=generate(obj, adjs[i], 0, 2, true); for (sklon:=1; res<>nil && sklon<=length(res); ++sklon) { local same:=nil; local new_adjs:= getwords(obj, &adjective); if (sklon >= 1 and sklon <= 6) // +++++++++++++++++++++++ obj.descadj[sklon] := res[sklon][1]; // +++++++++++++++++++++++ if (find(new_adjs, res[sklon][1])=nil) addword(obj, &adjective, res[sklon][1]); else same:=true;
Неактивен
1жп - выгоревшая выгоревшой выгоревшой(-)(#d) выгоревшую выгоревшой(-)(#t) выгоревшой(-) выгоревшою(#t) выгоревшаяю
2жу - ромашки ромашек ромашок(#d) ромашк ромашкам(#t) ромашки(-) ромашками(#t) ромашках
И ещё, описания 'ложка/ж' и 'ложка/1ж' дают разные лексемы. Хотя не должны, по идее. Если число не указано, должно предполагаться единственное.
Update: (с васильками всё в порядке, не поставил род)
Отредактировано Gremour (14.04.2008 15:21)
Неактивен
Генератор -- это один из альтернативных вариантов. Если для некоторых слов он не срабатывает, можно прописать лексемы вручную. Я пользуюсь. Ибо облегчает. Заодно найдём места, где он работает неправильно, и ГрАнд их исправит (надеюсь .
Неактивен
ГрАнд, ОГРОМНАЯ просьба сделать автогенерацию sdesc, rdesc ... pdesc. Без автогенерации desc'ов от генератора проку не много. Всё равно приходится использовать внешний (чтобы не прописывать desc'и руками).
Моё решение (приведено выше) не всегда однозначно выбирает слово, если есть синонимы. Иногда берётся первое слово. Иногда последнее. А иногда прилипает к одному из синонимов и берёт только его, независимо от положения слова в списке синонимов.
Я не вникал глубоко в алгоритм. Видимо ты разбираешь слова не подряд. Можно внести дополнительный флаг, который помечает синоним, который будет использоваться в desc'ах. Например 'рог/1м=' 'рожок/1м' 'загогулина/1ж'. Если флага нет, брать первый (или последний). То же самое с прилагательными. Флаги isHim/isHer/isThem генерить согласно выбранному синониму.
Неактивен
Прилагательное 'голубое/1с' вызывает слом (выход за границы массива).
Неактивен
Korwin,
В текущей версии генератора Гранда *desc-и не создаются. Автоматическое создание *desc-ов -- моих рук дело (правку generator.t я постил выше; у тебя подправленная мной версия генератора). Но это всего лишь быстрое решение. Алгоритм у Гранда сложнее, чем мне казалось, и выдаёт лексемы в странном порядке (не в той очерёдности, в какой они прописаны в свойстве noun объекта). Будет лучше, если Гранд сделает создание *desc-ов сам, как автор генератора.
Неактивен