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)
Неактивен