Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

   #51
10.07.2008 13:11

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

GrAndrey написал:

Инструкции в комментариях библиотеки. Готов ответить, если что не ясно.

Код:

// требования к грам. свойствам слова, шаблон и схема замены
// числа -символьные множества

Больше всего непонятны как раз эти символьные множества. Что означает запись (4)ки? Или (у6)и? Или (.)ы?

Неактивен

   #52
10.07.2008 14:58

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Новая версия библиотеки?

Что означает запись (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'    'кна'  'кон']
    ...

Вероятно, потом это же правило придется расширить, если обнаружатся сходные проблемы. Расширить, потому что исключения имеют склонность появляться группами в отдельных падежах, при отдельных окончаниях и числе/роде. Уникальные исключения бывают редко.

Неактивен

   #53
10.07.2008 15:50

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

Спасибо за подробное объяснение. Буду пробовать добавлять свои правила (если что не срастется).

Неактивен

   #54
10.07.2008 17:45

Gesperid
Участник
Зарегистрирован: 25.02.2005
Сообщений: 107

Re: Новая версия библиотеки?

О великий и могучий, русский язык!  О великие и могучие, регулярные выражения! smile

GrAndrey, при всем уважении, не думаю, что такой подход может  упростить разработку.

UPD
Возможно ли реализовать надежную генерации *desc-ов в рамках этого подхода?

Отредактировано Gesperid (10.07.2008 17:46)

Неактивен

   #55
10.07.2008 19:21

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

GrAndrey, при всем уважении, не думаю, что такой подход может  упростить разработку.

Я придерживаюсь противоположного мнения. Возможно, сейчас генератор не выдает на 100% надежный результат, но это будет исправляться либо самим Андреем, либо добровольцами-программистами, которые разбираются в регулярных выражениях. И когда-нибудь генератор станет надежным на 100%.

А desc'и можно генерить, если сделать какие-нибудь флажки для нужных существительного и прилагательного...

Неактивен

   #56
11.07.2008 02:22

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Новая версия библиотеки?

КТО ЗДЕСЬ ОБИЖАЕТ RTADS?!

Регулярные выражения гибки, компактны и очень удобны для машинной обработки текста. Их использование - то, что доктор прописал.

Неактивен

   #57
11.07.2008 06:02

Korwin
Гоблин, зеленый от недосыпа (+135, -8)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 772
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

Re: Новая версия библиотеки?

Flint написал:

КТО ЗДЕСЬ ОБИЖАЕТ RTADS?!

Регулярные выражения гибки, компактны и очень удобны для машинной обработки текста. Их использование - то, что доктор прописал.

Вот примерно то же мне сказал Byte, когда я высказался в том духе, что рядовому пользователю сие не осилить. Куда деваться? Будем осваивать. Пока кто-нибудь знающий, на основе этих жутких регулярных выражений, может быть, не выпустит аналог 7 Информа на русском языке.

Неактивен

   #58
11.07.2008 08:36

Nex
Участник (+120, -130)
Зарегистрирован: 11.06.2007
Сообщений: 2056

---

Re: Новая версия библиотеки?

А регэкспы были в TADS изначально? Или это какая-то доработка?
Просто любопытно.

Отредактировано Nex (11.07.2008 08:37)

Неактивен

   #59
11.07.2008 09:53

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

Nex написал:

А регэкспы были в TADS изначально? Или это какая-то доработка?
Просто любопытно.

Всегда были, конечно.

Неактивен

   #60
14.07.2008 20:02

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Новая версия библиотеки?

Генерация кратких описаний практически заработала. Вот только нельзя во время исполнения присваивать значения в виде строки с двойными кавычками. По крайней мере, я не нашел. Приходится заносить значения в другую переменную, а потом вставлять в строку.

Было бы гораздо лучше все это делать предкомпилятором, но не настолько продвинут. Может быть, есть способ запустить игру и сохранить состояния как отдельный игровой файл?

Неактивен

   #61
14.07.2008 20:13

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

Брать по старой ссылке? Ты бы хоть на сайте дал ссылку на бету, а то приходится по форуму лазить...

И как помечать значимые существительные и прилагательные (из которых будет строиться искомые описания)?

(upd) Новой версии не нашел. sad Все, что есть по ссылкам, - от февраля...

Отредактировано fireton (14.07.2008 20:16)

Неактивен

   #62
14.07.2008 21:02

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Новая версия библиотеки?

Да, извиняюсь, не обновлял. Ещё есть что дорабатывать.

Неактивен

   #63
15.07.2008 02:42

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Новая версия библиотеки?

Андрей, не поверишь, но сегодня с утра я собрался и сел делать генерацию 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 зеленой машине

Надеюсь, мои измышления чем-то помогут.

Неактивен

   #64
15.07.2008 06:43

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Новая версия библиотеки?

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 - средний род

Неактивен

   #65
15.07.2008 09:51

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

Андрей, ну когда уже всем этим пользоваться можно будет? Прям как с производителями видеокарт - ждешь, ждешь новую модель - но на подходе всегда есть более новая... wink

Неактивен

   #66
15.07.2008 09:59

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

Выложил свою версию генератора для ознакомления и маленькое демо к ней. В демо есть полезных глагольчик «просклонять» для проверки всех падежей.

А stdrm.t что такое? Не компилируется твой пример.

Неактивен

   #67
15.07.2008 13:45

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Новая версия библиотеки?

Ну переименуй в stdr.t и будет щастье.

Неактивен

   #68
15.07.2008 13:51

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Новая версия библиотеки?

GrAndrey написал:

О твоем коде:
здорово, но описания генерировать из лексем - это... как шубу в трусы заправлять
Должно быть наоборот - пишешь sdesc="останки/2 многоцелевого/п- робота/п- U1001/пу-"

Да, ты прав. Я не подумал о том, что описания не обязательно состоят из двух слов.
Ну и в этом случае noun и adjective тоже должны работать, чтобы можно было задать дополнительные синонимы.

Неактивен

   #69
15.07.2008 14:07

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

Крик души.

Гранд! Пожалуйста! Делай релиз поскорее!

Мне игру на КРИЛ кодировать надо начинать. Твой генератор выглядит просто супер-вкусно, очень хочется его использовать (заодно и отладим). Я вплотную уже подошел к кодированию...

Неактивен

   #70
15.07.2008 14:44

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Новая версия библиотеки?

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)

Неактивен

   #71
15.07.2008 17:50

- VampirE -
Участник (+3)
Зарегистрирован: 22.06.2006
Сообщений: 101

Re: Новая версия библиотеки?

Маленький оффтопик.

Кто-нибудь подскажет, чем отличается debug-версия от релизной кроме размера? Мануал читать не охота что-то. smile

Отредактировано - VampirE - (15.07.2008 18:05)

Неактивен

   #72
15.07.2008 18:36

fireton
некто с бородой (+209, -52)
Откуда: Москва
Зарегистрирован: 22.08.2005
Сообщений: 1047
Вебсайт

Тон

Re: Новая версия библиотеки?

- VampirE - написал:

Маленький оффтопик.

Кто-нибудь подскажет, чем отличается debug-версия от релизной кроме размера? Мануал читать не охота что-то. smile

В debug-версию включена отладочная информация, необходимая дебаггеру.

Неактивен

   #73
16.07.2008 01:15

Flint
Участник
Зарегистрирован: 06.09.2007
Сообщений: 148

---

Re: Новая версия библиотеки?

Вместе с генератором и всеми его положительными сторонами пришло и несколько проблем. Одна из них - функции динамического добавления/удаления слов (addword и delword). Они и ведать и не ведают о том, что настал час генератора и загонять вручную каждый падеж это уже не комильфо.

Я написал две функции addwordru и delwordru, которые выглядят и делают все то же самое, но плюс к этому умеют генерировать падежи из указанной строки. Используются они так, как вам и хотелось бы:

Код:

addwordru(vobla, &noun, 'рыба/1ж');
delwordru(vobla, &adjective, 'сушеная/1ж');

Чтобы функции заработали, мне пришлось немного подчекрыжить код генератора, но ничего смертельного - я просто оформил несколько кусочков кода в отдельные функции, дабы избежать дублирования кода.

Качайте и пробуйте: http://drop.io/imva07o

P.S. Андрей, ты говори, если чего надо помочь сделать - мы всегда поддержим!

Отредактировано Flint (16.07.2008 01:16)

Неактивен

   #74
16.07.2008 10:30

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Новая версия библиотеки?

Flint, спасибо. Проверку _debug собирался ввести как дополнение, не думал, что окажется остро необходимым.
addwordru(obj, prop, str); - тоже отлично, не задумывался, что может понадобиться

Неактивен

   #75
16.07.2008 16:37

GrAndrey
папа RTADS и Бяка (+37, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1200
Вебсайт

меньше слов

Re: Новая версия библиотеки?

Выложил доработанный генератор. В библиотеке только generator.t и stdr.t.

Работает так:

Код:

trava: item
    location = startroom
    gdesc = '"чертова/1пж" трава/1ж из Нового/п- Света/п-'
    noun= 'табак/1м' 
ldesc="Бурые скрученные листья кучкой лежат на столе."
;

#r пока не ставит, и части речи, исходя из положения в строке, не определяет.

P.S. обновил после сообщения Фаертона. Поменял строку gdesc  с двойных кавычек на одиночные.

Отредактировано GrAndrey (16.07.2008 17:59)

Неактивен

Powered by PunBB
© copyright 2001–2018 iFiction.Ru