Что скажешь, ГрАнд?
Уже достаточно изменений накопилось, по-моему...
Неактивен
Вот именно, что много необкатанных и недоделанных изменений.
Сообщения для первого лица адаптированы не все;
Орфография работает не так как положено (считаю, что в справочной области должны быть только видимые предметы, а также не стоит обрабатывать слишком короткие слова). Также не понял, решили ли вопрос с выскакивающим сообщением;
Вывод догадок системы как следует не протестирован;
Хочу автоматизировать определение приглагольного падежа (type).
Частые обновления пугает авторов, особенно начинающих, так что не следует торопится. Все желающие могут получить от меня "альфа версию".
Неактивен
Просьба протестировать www.rtads.org/libr25beta.rar.
Хотел сделать автоматическое спряжение глаголов, но это ещё изрядно времени займет. Попробуйте разные лица ГП!
Неактивен
"дубину of стража"
Исправил, залил новую версию.
Который "дубину of стража" вы имеете в виду, "левый скипетр стража" или "правый скипетр стража"?
Синонимы могут быть разных полов и чисел. Тут либо смириться, либо свести сообщение к абстрактному "Который из объектов "дубину стража" вы имели в виду, ... " или "Упоминая "дубину стража", вы имели в виду: ... "
>ударить гоблина топором
Я не вижу здесь объект "гоблина топором".
Код гоблина и топора, пожалуйста.
Неактивен
Обновил бету библиотеки. Прошу изучить и помучать функцию 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('хотеть'); } ;
Неактивен
Не могу воспроизвести этот баг. Видимо, уже исправлен.
Неактивен
Вуаля!
Генератор склонений подключен к РТАДС, а также ещё некоторые новые фишки.
Прошу жесточайшим образом протестировать!
Теперь можно самому на ходу настраивать правила, так что делитесь наработками.
скачать.
Неактивен
Видимо, сейчас актуальнее иные вещи. Так и быть, поддамся конъюнктуре:
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(); } ;
Неактивен
Обновил бету. Задавайте вопросы, если что не ясно.
скачать 25 релиз бета
Для использования скинуть все в папку с библиотеками (как минимум обновить advr.t, где есть новая функция для работы генератора, и скопировать библиотеку generator.t).
Внимание! Генератор запускается через функцию commonInit, причем он сразу включает ставший режимом по умолчанию HTML. Поэтому в файле игры следует убрать следующий фрагмент:
replace commonInit: function {"\H+";}
На данный момент генерируются только лексемы. Подлежащие генерации лексемы должны быть отмечены слэшем "/". Ставится он после слова, за ним могут следовать флаги обозначающие род, число и одушевленность. При отсутствии флагов используются свойства объекта. Таким образом возможно решить проблему различия свойств синонима и основного названия объекта - запоминать каким словом обратились, и потом использовать его характеристики (Проблемы из ряда: здесь ящик=> взять коробку => ты не можешь взять его)
Результат генерации выдается на экран, если не отключена соответствующая опция.
Что ещё не сделано: генерация склонений короткого названия, обезЁживание лексем, оптимизация кода (так скажем, не шустрый).
Неактивен
Да, 25. Гляжу в будущее, знаете ли...
Неактивен
Хм. Это точно была последняя версия? Уже в прошлый раз не должно было возникать.
Выкладываю ещё одно обновление. Изменился только файл генератора.
Подоптимизировал, но все равно 800 миллисекунд на 113 слов без вывода на экран...
Туду для себя - ввести ключ однократного прохода в функции замены.
у меня от твоего генератора голова ходит циркулем.
Генератор вообще можно не подключать, а подключенный, он ничего не будет делать, если для него не оставить отметки. Сложность с ним будет только в изучении отметок.
sdec, rdesc... pdesc - все будут.
Неактивен
Совершенно верно. Это альтернативный вариант, который должен стать основным. Надеюсь вы разберетесь как вносить новые правила и поможете доработать алгоритм для всех извращенных случаев.
Чтобы увидеть какое из правил было задействовано, нужно раскомментировать строку
// generator.detailed:=true;
1 - индивидуальное правило, 2 - общий блок правил. Второе число - порядковый номер правила. После каждого фрагмента в комментарии написана его длина для упрощения ориентирования. Не забывайте изменять эти значения после внесения правокю
Неактивен
Можно начинать пользоваться. Неработающие варианты публиковать здесь. Если до релиза библиотеку не исправят, то просто вручную прописать правильный вариант. Буквы-флаги вряд-ли изменятся.
Чтобы было яснее - склонения формируются при запуске игры, но внутренне они принимают тот вид, который мы всегда ранее задавали. Библиотеку обновил, исправил "восточное" и "старинное", качать там же.
Неактивен
Gremour написал:
Прилагательное 'голубое/1с' вызывает слом (выход за границы массива).
Качай свежую версию, ранее исправил.
Неактивен
Извиняюсь за задержку - потихоньку пишу.
В TADS значения noun хранятся не упорядоченно, оригинальный порядок сохранить не удастся (если я правильно понял о чем идет речь). Сам же генератор выдает список склонений в обычном порядке.
Неактивен
fireton написал:
Андрей, ну как? Будет релиз или пока перебиваться бетой? Особенно интересует рабочий генератор с инструкцией о том, как задавать собственные правила...
Столь внезапный и коварный вопрос лишил меня дара речи.
Инструкции в комментариях библиотеки. Готов ответить, если что не ясно.
Неактивен
Что означает запись (4)ки? Или (у6)и? Или (.)ы?
"(4)ки" обозначает, что сначала эта цифра будет заменена на строку из следующей таблички:
// задаем символьные множества symbols= [['0' '[бвдзлмнпрстфц]'] ['1' '[еуюа]'] ['2' '[бвдзлмпрсфц]'] ['3' '[бвгджзнрц]'] //звонкие ['4' '[чшщц]'] //шипящие ['6' '[бвгджзйклмнпрстфхцчшщ]'] //согласные ['8' '[аеёиоуыэюя]'] //гласные ]
В данном случае мы получим "([чшщц])ки". Далее к этой строке автоматически будет добавлен значок '$', обозначающий конец строки. Программа будет сверять лексему на соответствие этому шаблону (о поиске с регулярными выражениями). В замене можно использовать обратные ссылки: $1 - подставить то, что было в первой скобке, $2 - что во второй, и т.д.. По умолчанию, будет изменяться весь найденный шаблон, поэтому неизменяемые части нужно захватывать скобками и вставлять в замену.
"(у6)и" - "(у[бвгджзйклмнпрстфхцчшщ])и"
"(.)ы" - в соответствии с синтаксисом регулярных выражений, точка - это любой одиночный символ.
Рассмотрим правила:
rrules = [ ['2F' 'йки' 'ек'] ...
При множественном числе и женском роде, всё оканчивающееся на 'йки' в род. падеже будет оканчиваться на 'ек'.
Пример: рейки -> реек
commonrules1 = ... ['2' '(6)на' '$1ен' '$1нам' '$1на' '$1нами' '$1нах'], // брёвна, 6 -согл. ...
Ранее были другие условия, если не сработали, работает это.
Множественное число, окончание '(6)на' -> '([бвгджзйклмнпрстфхцчшщ])на' :
Р.П. '$1ен'
Д.П. '$1нам'
В.П. '$1на'
Т.П. '$1нами'
П.П. '$1нах'
Пример:
окна -> окен, окнам, окна, окнами, окнах
Как мы видим, что в родительном падеже есть ошибка. Такая же ошибка была бы, если бы мы ввели 'волокно'. Значит, нужно либо исправить это правило, либо прописать исключение для родительного падежа.
rrules = [ ... ['2' 'кна' 'кон'] ...
Вероятно, потом это же правило придется расширить, если обнаружатся сходные проблемы. Расширить, потому что исключения имеют склонность появляться группами в отдельных падежах, при отдельных окончаниях и числе/роде. Уникальные исключения бывают редко.
Неактивен
Генерация кратких описаний практически заработала. Вот только нельзя во время исполнения присваивать значения в виде строки с двойными кавычками. По крайней мере, я не нашел. Приходится заносить значения в другую переменную, а потом вставлять в строку.
Было бы гораздо лучше все это делать предкомпилятором, но не настолько продвинут. Может быть, есть способ запустить игру и сохранить состояния как отдельный игровой файл?
Неактивен
Да, извиняюсь, не обновлял. Ещё есть что дорабатывать.
Неактивен
Flint, спасибо, что подсказал "preinit"!
Эта функция выполняется после компиляции, но результат сохраняется в игровом файле. Если не выводить отчет об генерации, то игровой файл загружается сразу. Важен порядок загрузки библиотек. Если заменять функцию в stdr.t, то генератор нужно подключать после, если вставлять код в preinit определенный в stdr.t - перед.
Текстовый вывод в preinit работать не должен, а потому все выводится в отчет компилятора, что приводит к зависанию при большом количестве слов.
В общем, с этой функцией не все однозначно, ну буду пытаться.
О твоем коде:
здорово, но описания генерировать из лексем - это... как шубу в трусы заправлять
Должно быть наоборот - пишешь sdesc="останки/2 многоцелевого/п- робота/п- U1001/пу-", а результат:
sdesc="останки многоцелевого робота U1001" rdesc="останков многоцелевого робота U1001" ddesc="останкам многоцелевого робота U1001" vdesc="останки многоцелевого робота U1001" tdesc"останками многоцелевого робота U1001" pdesc="останках многоцелевого робота U1001" adjective='многоцелевого' 'многоцелевого#r' 'робота' 'робота#r' 'U1001' 'U1001#r' noun='останки' 'останков' 'останкам' 'останками' 'останках' 'останкам#d' 'останками#t' 'U1001'
/пу- будет обозначать, что нужно добавить и лексему прилагательного и существительного, но не склонять (-)
Ещё пример: "зеленое/пс вещество/с из носовой/п- полости/п-"
sdesc="зеленое вещество из носовой полости" rdesc="зеленого вещества из носовой полости" ... adjective='зеленое' 'зеленого' 'зеленому' 'зеленому#d' 'зеленым' 'зеленым#t' 'зеленом' 'носовой' 'носовой#r' 'полости' 'полости#r' noun='вещество' 'вещества' 'веществу' 'веществом' 'веществе' 'веществу#d' 'веществом#t'
/c - средний род
Неактивен
Flint, спасибо. Проверку _debug собирался ввести как дополнение, не думал, что окажется остро необходимым.
addwordru(obj, prop, str); - тоже отлично, не задумывался, что может понадобиться
Неактивен
Выложил доработанный генератор. В библиотеке только generator.t и stdr.t.
Работает так:
trava: item location = startroom gdesc = '"чертова/1пж" трава/1ж из Нового/п- Света/п-' noun= 'табак/1м' ldesc="Бурые скрученные листья кучкой лежат на столе." ;
#r пока не ставит, и части речи, исходя из положения в строке, не определяет.
P.S. обновил после сообщения Фаертона. Поменял строку gdesc с двойных кавычек на одиночные.
Отредактировано GrAndrey (16.07.2008 17:59)
Неактивен
Ещё "домашнее задание":
-хотя бы формально описать правила склонения сокращенных прилагательных типа "чертова"
Неактивен
В ТАДС игры можно вводить список команд из файла через опции командной строки. При этом ничего на экран выводиться не будет, зато сразу кусок игры можно будет пропустить + можно увидеть, где застрял, если что-то сломалось. Естественно, строго линейно.
Проверка генератора не так сложна - всего-то создать файл с единственным предметом, в котором прописать всевозможные слова для проверки. При изменении правил запустить, результат сохранить в файл и утилитами сравнить с эталоном.
Неактивен
www.rtads.org/libr25beta2.rar - текущее состояние библиотек
Извини, Михаил, пока не добавил addwordru.
Неактивен