Что скажешь, ГрАнд?
Уже достаточно изменений накопилось, по-моему...
Неактивен
Не торопитесь с выпуском новой версии.
Я хочу еще оформить несколько своих хаков из "Любви" в приличный вид и предложить на рассмотрение.
Неактивен
Подтверждаю, в advr.t от 7.02.08 есть такая ошибка.
Связана с тем, что не срабатывает функция glok(self, 'нести'), которая просто ничего не выводит. Т.е. должно было быть
>взять булку
Торговец несет булку и не даст тебе взять её.
Я сталкивался с этим, когда делал свои модули -- сначала использовал новую версию glok, но потом пришлось откатиться на старую из-за непредсказуемого поведения новой (например "идти", "мочь" тоже не работают).
Поэтому в бета-версиях библиотеки, наверное, лучше сделать, чтобы glok выдавала ошибку на экран, если ей не удалось подобрать спряжение.
Неактивен
Колоссально!
Большое спасибо.
Неактивен
КТО ЗДЕСЬ ОБИЖАЕТ RTADS?!
Регулярные выражения гибки, компактны и очень удобны для машинной обработки текста. Их использование - то, что доктор прописал.
Неактивен
Андрей, не поверишь, но сегодня с утра я собрался и сел делать генерацию 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 зеленой машине
Надеюсь, мои измышления чем-то помогут.
Неактивен
Ну переименуй в stdr.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)
Неактивен
Вместе с генератором и всеми его положительными сторонами пришло и несколько проблем. Одна из них - функции динамического добавления/удаления слов (addword и delword). Они и ведать и не ведают о том, что настал час генератора и загонять вручную каждый падеж это уже не комильфо.
Я написал две функции addwordru и delwordru, которые выглядят и делают все то же самое, но плюс к этому умеют генерировать падежи из указанной строки. Используются они так, как вам и хотелось бы:
addwordru(vobla, &noun, 'рыба/1ж'); delwordru(vobla, &adjective, 'сушеная/1ж');
Чтобы функции заработали, мне пришлось немного подчекрыжить код генератора, но ничего смертельного - я просто оформил несколько кусочков кода в отдельные функции, дабы избежать дублирования кода.
Качайте и пробуйте: http://drop.io/imva07o
P.S. Андрей, ты говори, если чего надо помочь сделать - мы всегда поддержим!
Отредактировано Flint (16.07.2008 01:16)
Неактивен
То что нужно!
Большое спасибо.
Неактивен