Стоит подумать о некоторой схеме тестирования генератора. Чтобы запустив тесты (например, батником) удостовериться, что новые правила не конфликтуют со старыми. То есть для каждого правила создавать два файлика: первый – со списком слов на это правило, второй – с ожидаемым результатом склонения генератором слов из этого списка.
Неактивен
Вообще, автоматические тесты были б очень полезны. Чтобы собрать некий исходник, подать ему на вход файл с командами и записать отчет в файл, а затем сравнить с эталоном и убедиться, что ничего не отъехало.
Неактивен
Не понял, ты говоришь о тестировании игры в целом (альфа-тесте) или о том же о чем и я (то бишь тестирование генератора)?
Первое на порядок сложнее, и нужно ли это при относительно скромных размерах создаваемых игр. Хотя и я об этом думал, было бы здорово запустить такой сценарий:
осм BegParallel 1. ю взять бумеранг с 2. з взять револьвер в 3. в взять катану з EndParallel убить злодея
И получить в ответ "OK" или "failed on 'взять револьвер' command".
Неактивен
Я имел в виду автоматическое тестирование библиотеки в целом. Конечно, написать юнит-тест для всей advr.t довольно сложно, но будучи один раз создан, он поможет избежать регрессионных ошибок при добавление нового функционала или правке старого.
Т.е. поправил что-то, прогнал тест и убедился, что никакой функционал из стандартных определений не отвалился. Можно делать потихоньку - писать юнит-тесты для каждой порции функционала (напр. модуль "Темные комнаты и источники освещения", модуль "Спрятанные объекты" и т.п.) и потом объединять их.
Все это из области пожеланий, конечно. Я вот, например, ни за что сейчас не возьмусь за написание системы, позволяющей легко провести такое тестирование...
Неактивен
В ТАДС игры можно вводить список команд из файла через опции командной строки. При этом ничего на экран выводиться не будет, зато сразу кусок игры можно будет пропустить + можно увидеть, где застрял, если что-то сломалось. Естественно, строго линейно.
Проверка генератора не так сложна - всего-то создать файл с единственным предметом, в котором прописать всевозможные слова для проверки. При изменении правил запустить, результат сохранить в файл и утилитами сравнить с эталоном.
Неактивен
www.rtads.org/libr25beta2.rar - текущее состояние библиотек
Извини, Михаил, пока не добавил addwordru.
Неактивен
http://www.rtads.org/libr25beta3.rar - ещё обновление.
- Заработало распознавание ударного окончания по прописной букве, несколько исправлений правил генератора, введены правила для слов на -ец.
- Исправил вывод сформированных sdesc...pdesc
- Включил addwordru и delwordru.
- Местный падеж практически заменил все упоминания предложного падежа.
В выложенном advr.t недоработана функция parseNounPhrase. В принципе рабочая, но путает прямой и косвенный объект.
В комплекте - тест для генератора, а также немного доработанная библиотека меню.
Неактивен
Жду комментариев и предложений по юзабилити.
Например, думал дефайнами уменьшить количество переключений раскладки, но кириллица не катит.
Как на счет того, чтобы вместо апострафов ставить двойные кавычки при gdesc, а во время компиляции превращать в обычную строку?
Ещё есть задумка вынести лексемы с метками падежей в отдельные свойства объекта. Список лексем очистится, а количество разных свойств прибавиться. Куда-то можно сослать и "затравку" для генератора после её использования (gnouns и gadjective например).
Я ранее упоминал о скрипте для отладки игры. Подробнее написано здесь:
http://teladesign.com/tads-manual/tads-b.html в параграфе "Testing Your Game".
Вкратце:
mygame.exe -o walkthru.in - записывает в файл команды по мере прохождения
htmlt2.exe -i walkthru.in -l walkthru.log mygame -запускает игру и вводит список команд, а выходящий текст записывает в файл.
Майкл Робертс предлагает сверять старые и новые результаты любой программой типа diff.
Хотел сразу на Вики, но она ещё лежит.
Неактивен
Нашел неприятный баг в генераторе:
yad: item gdesc = 'пузырёк/1му с ядом/п-' noun = 'пузырёк/1му' ldesc = "Пузырек с ядом." location = Me isHim = true ;
В слове 'пузырёк' в случае с gdesc почему-то берется одно правило, где просто 'к', а в случае с noun все берется правильно - правило 'ёк'.
---
Нашел решение проблемы. Все дело было в неправильной работе регулярных выражений в коде нарезки gdesc:
while (ret:=reSearch('([/$&@№~%_+*#a-zA-Zа-яА-Я0-9-]+)|([][<>()!{}.,;"?\ ]+)', sdescstr), ret<>nil) { sdesc_list+=ret[3]; sdescstr:=substr(sdescstr,ret[1]+ret[2],length(sdescstr)); }
Нужно просто добавить буковку 'ё' между первыми скобками. Будет что-то вроде:
while (ret:=reSearch('([/$&@№~%_ё+*#a-zA-Zа-яА-Я0-9-]+)|([][<>()!{}.,;"?\ ]+)', sdescstr), ret<>nil) { sdesc_list+=ret[3]; sdescstr:=substr(sdescstr,ret[1]+ret[2],length(sdescstr)); }
Отредактировано - VampirE - (23.07.2008 22:10)
Неактивен
http://www.rtads.org/libr25beta4.rar - налетай, торопись! Теперь генератор работает ещё лучше, ещё правильнее!
Рекомендую ставить авторам. Для публикации игр лучше подождать релиза, а для разработки можно (и нужно!) пользоваться этими библиотеками.
Неактивен
Добавлены takedesc
и dropdesc
. Теперь любому предмету можно назначить свой текст вместо банальных "Взят" и "Брошен" при взятии и бросании, соответственно.
Положил в SVN.
Неактивен
fireton написал:
Добавлены
takedesc
иdropdesc
. Теперь любому предмету можно назначить свой текст вместо банальных "Взят" и "Брошен" при взятии и бросании, соответственно.
Насчет этого не уверен. Часто прописывается схема такого вида:
doTake(actor)= { if (self.isonoriginalplace) { "Ты выдрал *что-то* с его векового места. "; incscore(5); self.isonoriginalplace:=nil; self.moveInto(Me); } else pass doTake; }
хотя правильнее вообще так:
doTake(actor)= { if (self.isonoriginalplace) { "Ты выдрал *что-то* с его векового места. "; incscore(5); self.isonoriginalplace:=nil; } pass doTake; }
В последнем случае проводятся проверки массы и объема инвентаря, а стандартное "Взято" рефлексивно вызывает параксизм довольства у любого ИЛ игрока. Без этой фразы не сразу ясно, вежливый ли это отказ, или сообщение об успехе.
Единственная польза от takedesc и dropdesc - то, что можно сменить фразу по умолчанию. Но я с трудом представляю себе ситуацию, когда нужна менее универсальная фраза. Подбирать и бросать можно в любом месте и в любой ситуации, и расширенное описание может быть весьма неуместно.
В общем, я против. Кому нужно, тот сделает или спросит на форуме.
Неактивен
Я не знаю про пароксизм довольства, но слово "взято" у меня вызывает ассоциации с "вес взят!". А "Брошено" - это ж просто жесть какая-то:
>положить хрустальную вазу на пол Брошена.
Так и хочется добавить "осколки древней вазы весело зазвененели по полу..."
Кроме того, разные предметы "берутся" по-разному. Шелковый платок - одно дело, а мешок с песком - совсем другое...
Кстати, Эмили Шорт со мной согласна:
Удивительно просто, насколько может обогатить ощущение от игры написание особых реакций на обыкновенные действия. Как ощущается платиновый слиток, когда герой берет его в руку? Что персонаж чувствует, беря его? Разве нельзя написать ничего лучше, чем «Взято»?
И еще. Мои изменения никак не заденут тех авторов, которые будут писать "по-твоему". Но сильно помогут тем, кто хочет больше детализировать взаимодействия с объектами (мне, в том числе).
Отредактировано fireton (08.08.2008 09:44)
Неактивен
Детализация, это здорово, но как ты видишь описание выкладывания вазы в случайном месте?
"Ты аккуратно поставил вазу." Куда? На пол? Посреди поля? Баллансируя на канате?
Кстати, следующему же автору понадобится передать аргументы этому методу. Чтобы стандартное сообщение менялось в зависимости от актера и локации.
Ок, я оставлю, но это только одно из сотен усовершенствований, которые можно сделать. Если все их внедрять, библиотеки распухнут и станут совсем непонятными, потому как это все не покрыто мануалом (мы не высылаем отчет о всех наших нововведениях Валентину). РТАДС уже сейчас сложен для новичков, излишние доработки только усугубят ситуацию.
Неактивен
GrAndrey написал:
Детализация, это здорово, но как ты видишь описание выкладывания вазы в случайном месте?
"Ты аккуратно поставил вазу." Куда? На пол? Посреди поля? Баллансируя на канате?
Если балансируя на канате, то нужно перекрыть у комнаты roomDrop
- все предметы должны падать вниз. Для разных типов комнат можно определить разные классы и флажок в них, чтобы определить, куда ставишь. Все решаемо. Конечно, комбинаторный взрыв. Но если автор хочет идти на это, то пусть у него будут возможности. А если не хочет - у него всегда будут "Взято" и "Брошено".
Неактивен
GrAndrey написал:
Ок, я оставлю, но это только одно из сотен усовершенствований, которые можно сделать. Если все их внедрять, библиотеки распухнут и станут совсем непонятными, потому как это все не покрыто мануалом (мы не высылаем отчет о всех наших нововведениях Валентину). РТАДС уже сейчас сложен для новичков, излишние доработки только усугубят ситуацию.
+1
fireton написал:
... Все решаемо. Конечно, комбинаторный взрыв. Но если автор хочет идти на это, то пусть у него будут возможности. А если не хочет - у него всегда будут "Взято" и "Брошено".
+1
Вам хорошо, Вы монстры в программировании и ПОНИМАЕТЕ этот код. Не знаю, как другие авторы, но я тупо беру кусок кода, который работает, изменяю описание и вставляю в игру. К сожалению, частенько оказывается, что вставка в одном месте, требует серии изменений в других местах. Я не знаю, что с этим делать. Почему-то мне кажется, что поиски ответа на вопрос КАК ЭТО ЗАПРОГРАМИРОВАТЬ достаточно далеки от интересных мне проблем КАК ВЫСТРОИТЬ СЮЖЕТ, КАК ИЗМЕНЯЕТСЯ ХАРАКТЕР ГЕРОЯ В ХОДЕ ИГРЫ И КАКИМИ СЛОВАМИ ДОЛЖНЫ ГОВОРИТЬ СИЛЬНО ЗЛЫЕ ХОББИТЫ...
Генератор порадовал, но это еще далеко от мечты о системе в которой приятно было бы творить. Но надежда греет.
Неактивен
fireton написал:
GrAndrey написал:
Детализация, это здорово, но как ты видишь описание выкладывания вазы в случайном месте?
"Ты аккуратно поставил вазу." Куда? На пол? Посреди поля? Баллансируя на канате?Если балансируя на канате, то нужно перекрыть у комнаты
roomDrop
- все предметы должны падать вниз. Для разных типов комнат можно определить разные классы и флажок в них, чтобы определить, куда ставишь. Все решаемо. Конечно, комбинаторный взрыв. Но если автор хочет идти на это, то пусть у него будут возможности. А если не хочет - у него всегда будут "Взято" и "Брошено".
Все-таки уж слишком частное решение. Почему только "взять" и "бросить"? А кинуть? А одеть-снять?
Думаю, чем завтавлять авторов искать твой takedesc или учить его использовать, так лучше научить исправлять стандартное сообщение этим способом. Выложить во все обучалки этот пример модификации.
Неактивен
Думаю, чем завтавлять авторов искать твой takedesc или учить его использовать, так лучше научить исправлять стандартное сообщение этим способом. Выложить во все обучалки этот пример модификации.
Возможно, ты и прав. Правда, заставлять я не собирался...
Пусть останется, хорошо? В следующий раз расширения библиотеки буду выносить на форум сначала.
Неактивен
Что касается реакций, то идея замечательная, но автору нужно понимать хоть немного в программировании, что бы это реализовать.
Для себя обязательно возьму на заметку, если что-то буду писать - благо мне такое добавить в игру не составит труда. Самое простое - добавлять класс, скажем, для хрупких вещей и переопределить там метод drop. Но тогда глаголы "положить" и "бросить" должны вызывать разные реакции. Это даже идея для пазла.
Вообще библиотека-"физический движок" для ТАДС игр была бы кстати. Но снова для людей, кто будет разбираться в функционале, а это опять же без базового знания синтаксиса языка проблематично.
Отредактировано - VampirE - (09.08.2008 16:51)
Неактивен
Вот что я надумал:
- extendr.t нужно прочесать и даптировать стоящее в основную библиотеку
- это, а также любые другие небольшие расширения вносить как модификации в новом extendr.t
При этом код должен сопровождаться подробным комментарием для чего, он и как используется
Неактивен