GrAndrey написал:
Инструкции в комментариях библиотеки. Готов ответить, если что не ясно.
// требования к грам. свойствам слова, шаблон и схема замены // числа -символьные множества
Больше всего непонятны как раз эти символьные множества. Что означает запись (4)ки
? Или (у6)и
? Или (.)ы
?
Неактивен
Что означает запись (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' 'кна' 'кон'] ...
Вероятно, потом это же правило придется расширить, если обнаружатся сходные проблемы. Расширить, потому что исключения имеют склонность появляться группами в отдельных падежах, при отдельных окончаниях и числе/роде. Уникальные исключения бывают редко.
Неактивен
О великий и могучий, русский язык! О великие и могучие, регулярные выражения!
GrAndrey, при всем уважении, не думаю, что такой подход может упростить разработку.
UPD
Возможно ли реализовать надежную генерации *desc-ов в рамках этого подхода?
Отредактировано Gesperid (10.07.2008 17:46)
Неактивен
GrAndrey, при всем уважении, не думаю, что такой подход может упростить разработку.
Я придерживаюсь противоположного мнения. Возможно, сейчас генератор не выдает на 100% надежный результат, но это будет исправляться либо самим Андреем, либо добровольцами-программистами, которые разбираются в регулярных выражениях. И когда-нибудь генератор станет надежным на 100%.
А desc'и можно генерить, если сделать какие-нибудь флажки для нужных существительного и прилагательного...
Неактивен
Flint написал:
КТО ЗДЕСЬ ОБИЖАЕТ RTADS?!
Регулярные выражения гибки, компактны и очень удобны для машинной обработки текста. Их использование - то, что доктор прописал.
Вот примерно то же мне сказал Byte, когда я высказался в том духе, что рядовому пользователю сие не осилить. Куда деваться? Будем осваивать. Пока кто-нибудь знающий, на основе этих жутких регулярных выражений, может быть, не выпустит аналог 7 Информа на русском языке.
Неактивен
Генерация кратких описаний практически заработала. Вот только нельзя во время исполнения присваивать значения в виде строки с двойными кавычками. По крайней мере, я не нашел. Приходится заносить значения в другую переменную, а потом вставлять в строку.
Было бы гораздо лучше все это делать предкомпилятором, но не настолько продвинут. Может быть, есть способ запустить игру и сохранить состояния как отдельный игровой файл?
Неактивен
Брать по старой ссылке? Ты бы хоть на сайте дал ссылку на бету, а то приходится по форуму лазить...
И как помечать значимые существительные и прилагательные (из которых будет строиться искомые описания)?
(upd) Новой версии не нашел. Все, что есть по ссылкам, - от февраля...
Отредактировано fireton (14.07.2008 20:16)
Неактивен
Андрей, не поверишь, но сегодня с утра я собрался и сел делать генерацию sdesc...pdesc. И даже сделал. :-)
Интересно посмотреть, как это будет выполнено у тебя. Я пошел по пути развития идеи Gremour’а. Изложу здесь некоторые полезные, на мой взгляд, мысли, которые пришли мне в голову во время разработки. Слова, служащие для генерации desc’ов, обозначаются восклицательным знаком перед ними, например:
auto : item location = startroom noun = '!машина/1ж' 'тачка/1ж' 'авто' adjective = 'зеленая/1ж' 'красивая/1ж' '!спортивная/1ж' ldesc = "Это нечто!";
Можно было добавить этот флаг и в конец, ко всем остальным флагам (например 'машина/1ж!'), но я не стал так делать по двум соображениям. Во-первых, знак в начале слова банально виднее знаков в конце. Задав род и число, автор, скорее всего, не будет их больше трогать, а вот главное слово может выбрать другое. Во-вторых, автор может не захотеть пользоваться генератором, чтобы он не склонял слова («авто» в приведенном выше примере), desc’и же должны заполняться в любом случае.
Далее, обнаружилось, что очень хорошо бы выводить предупреждения, если для объекта не задано ни одного существительного с флагом «!» или наоборот, задано сразу несколько, так как ошибки весьма часты (так же для прилагательных, только для них «!» не обязателен – тогда они просто не выводятся и используется одно существительное).
Пример моего вывода с предупреждениями:
1жу - машина машины машине(#d) машину машиной(#t) машине(-) машиною(#t) 1жу - тачка тачки тачке(#d) тачку тачкой(#t) тачке(-) тачкою(#t) ВНИМАНИЕ! Среди указанных выше существительных не установлено главное (забыли флаг "!"). 1жп - красивая красивой красивой(-)(#d) красивую красивой(-)(#t) красивой(-) красивою(#t) 1жп - зеленая зеленой зеленой(-)(#d) зеленую зеленой(-)(#t) зеленой(-) зеленою(#t) ВНИМАНИЕ! Для одного объекта указано несколько прилагательных с флагом "!": !зеленая/1ж и !спортивная/1ж. 1жп - спортивная спортивной спортивной(-)(#d) спортивную спортивной(-)(#t) спортивной(-) спортивною(#t)
Еще хотелось бы прояснить следующий вопрос. Почему бы инициализацию генератора поместить не в commonInit, а в preinit? Вроде бы preinit как раз и предназначен для вещей, которые можно сделать один раз перед компиляцией игры. Тогда все словоформы генерировались бы на этапе компиляции, и для игрока не возникало бы никакой задержки. Я пробовал переместить код инициализации туда – все вроде бы работало. Размер файла, конечно, чуть-чуть увеличился, но по мне это лучше, чем ждать при запуске игры, тем более что текстовые игры и так маленькие.
Выложил свою версию генератора для ознакомления и маленькое демо к ней. В демо есть полезных глагольчик «просклонять» для проверки всех падежей.
>просклонять авто sdesc зеленая машина rdesc зеленой машины ddesc зеленой машине vdesc зеленую машину tdesc зеленой машиной pdesc зеленой машине
Надеюсь, мои измышления чем-то помогут.
Неактивен
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 - средний род
Неактивен
Андрей, ну когда уже всем этим пользоваться можно будет? Прям как с производителями видеокарт - ждешь, ждешь новую модель - но на подходе всегда есть более новая...
Неактивен
Выложил свою версию генератора для ознакомления и маленькое демо к ней. В демо есть полезных глагольчик «просклонять» для проверки всех падежей.
А stdrm.t
что такое? Не компилируется твой пример.
Неактивен
GrAndrey написал:
О твоем коде:
здорово, но описания генерировать из лексем - это... как шубу в трусы заправлять
Должно быть наоборот - пишешь sdesc="останки/2 многоцелевого/п- робота/п- U1001/пу-"
Да, ты прав. Я не подумал о том, что описания не обязательно состоят из двух слов.
Ну и в этом случае noun и adjective тоже должны работать, чтобы можно было задать дополнительные синонимы.
Неактивен
Крик души.
Гранд! Пожалуйста! Делай релиз поскорее!
Мне игру на КРИЛ кодировать надо начинать. Твой генератор выглядит просто супер-вкусно, очень хочется его использовать (заодно и отладим). Я вплотную уже подошел к кодированию...
Неактивен
GrAndrey написал:
Flint, спасибо, что подсказал "preinit"!
Эта функция выполняется после компиляции, но результат сохраняется в игровом файле. Если не выводить отчет об генерации, то игровой файл загружается сразу. Важен порядок загрузки библиотек. Если заменять функцию в stdr.t, то генератор нужно подключать после, если вставлять код в preinit определенный в stdr.t - перед.
Текстовый вывод в preinit работать не должен, а потому все выводится в отчет компилятора, что приводит к зависанию при большом количестве слов.
В общем, с этой функцией не все однозначно, ну буду пытаться.
Все прекрасно с этой функцией, и я сейчас покажу почему.
Инклюды располагаются в обычном порядке:#include "advr.t"
#include "stdrm.t"
#include "errorru.t"
#include "extendr.t"
#include "generator.t"
Из файла generator.t удаляем полностью функцию commonInit.
Открываем stdr.t. Следим за рукой! :-)
В commonInit дописываем
#ifdef __DEBUG
generator.printout := true;
generator.start;
#endif
В preinit дописываем
#ifndef __DEBUG
generator.printout := nil;
generator.start;
#endif
Теперь, если мы компилируем игру в DEBUG режиме (ключ -ds или -ds2), то все работает как раньше - словоформы генерируются при запуске игры и выводится лог.
Если же мы собираем игру в Release режиме, то словоформы генерируются и вставляются в файл на этапе компиляции, текстовый лог отключается, чтобы не перегружать вывод компилятора, а игрок не увидит вообще ничего (ни текста "Слов: 666, генерация заняла ...", ни задержки).
В Imaginate, где по умолчанию компилируется debug версия, а release - только по спецкоманде из меню, эта схема просто сказочно удобна.
Enjoy!
Отредактировано Flint (15.07.2008 14:45)
Неактивен
Маленький оффтопик.
Кто-нибудь подскажет, чем отличается debug-версия от релизной кроме размера? Мануал читать не охота что-то.
Отредактировано - VampirE - (15.07.2008 18:05)
Неактивен
- VampirE - написал:
Маленький оффтопик.
Кто-нибудь подскажет, чем отличается debug-версия от релизной кроме размера? Мануал читать не охота что-то.
В debug-версию включена отладочная информация, необходимая дебаггеру.
Неактивен
Вместе с генератором и всеми его положительными сторонами пришло и несколько проблем. Одна из них - функции динамического добавления/удаления слов (addword и delword). Они и ведать и не ведают о том, что настал час генератора и загонять вручную каждый падеж это уже не комильфо.
Я написал две функции addwordru и delwordru, которые выглядят и делают все то же самое, но плюс к этому умеют генерировать падежи из указанной строки. Используются они так, как вам и хотелось бы:
addwordru(vobla, &noun, 'рыба/1ж'); delwordru(vobla, &adjective, 'сушеная/1ж');
Чтобы функции заработали, мне пришлось немного подчекрыжить код генератора, но ничего смертельного - я просто оформил несколько кусочков кода в отдельные функции, дабы избежать дублирования кода.
Качайте и пробуйте: http://drop.io/imva07o
P.S. Андрей, ты говори, если чего надо помочь сделать - мы всегда поддержим!
Отредактировано Flint (16.07.2008 01:16)
Неактивен
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)
Неактивен