Решил начать здесь ветку для парсерных игр в INSTEDe, проблем парсерных модулей. Надеюсь, модератор не удалит.
Я нашел в старом модуле парсера (не метапарсер) такую досаду: у меня в словарной базе есть два глагола:
up = "поднимись, вверх, наверх";
take = "подними, возьми, взять, поднять";
На введёную фразу "поднимись" игра находит в ней якобы два глагола, хотя ПОДНИМИСЬ отличается от ПОДНИМИ. Если убрать слово "подними" из take, то подняться можно и наоборот, если убрать "поднимись" из up, то станет возможным поднять предмет словом ПОДНИМИ. У меня вопрос к Петру: МОЖНО ЛИ УСОВЕРШЕНСТВОВАТЬ ДАННЫЙ ПАРСЕРНЫЙ МОДУЛЬ, ЧТОБЫ ПРОГРАММА ПОНИМАЛА ОБА ЭТИХ СЛОВА? Ввожу же не два глагола, а одно. И они по-разному заканчиваются. Пример игры с парсерным модулем прилагаю. Команда поднимись нужна во второй локации. Из первой во вторую - спустись или вниз. Во второй локации работает глагол вверх или наверх.
Вот ссылка на пример: http://adventuru.jimdo.com/instead/%D1% … /?logout=1
Отредактировано Vladimir (04.12.2014 01:48)
Неактивен
Владимир, скажу сразу. Если речь идет о старом эксперименте, который использовался в гремлинах, то это именно эксперимент, который выявил много проблем (архитектурных) в выбранном подходе.
В метапарсере эти проблемы были решены, да и код игр на нем проще. Документация по метапарсеру также кктуальна, поэтому я предлагаю перейти к использованию мп.
Старый концепт мне сложно доработать, я его практически не помню. Можно двигать это направление, конечно (примерно как адрифт будет) но повторюсь, метапарсер показал себя с гораздо лучшей стороны.
Вот документация: http://instead.syscall.ru/wiki/ru/gamed … метапарсер
Процитирую сам себя:
В какой-то момент я решил, что это хорошая идея и сделал свой концепт парсера, основанного на шаблонах. К счастью, даже отрицательный результат это результат. Мой концепт оказался провальным. Основные недостатки шаблонного парсера:
- игрок по прежнему думает, что парсер понимает все;
- парсер слишком широко понимает игрока, в итоге возникают казусы, когда игрок получает совсем неожиданную реакцию на свои действия;
- парсер не понимает ввод и вывод неудачных реакций не информативен;
- писать игру очень сложно, так как не так просто написать правильные, непротиворечивые шаблоны
------
Вот последний пункт, это оно.
Так что в метапарсере был учтен предыдущий опыт.
Неактивен
С одной стороны, не могу не радоваться популяризации инстеда, с другой стороны,
тот вариант парсера оказался, как не крути, ущербным. МП по коду игры оказывается даже проще,
и для него (в отличие от старой реализации) есть документация. И главное, старый вариант не развивается
(и не поддерживается) разработчиком.
Поэтому, двоякие чувства.
Понимаю, что с МП нужно разбираться, а статью по старой реализации можно написать уже сейчас.
Но я бы в данном случае порекомендовал бы не писать статью на эту тему вообще, а в будущем (если останется запал) освоить и написать про МП.
Неактивен
Картинка красивая.
Вообще стандартный способ вставки картинок в игру для МП -- это gfx - в документации он упомянут. При этом картинка встраивается прямо в текст, показываясь 1 раз при попадании на эту сцену.
Название сцены в зоне картинке -- это конкретный прием в игре Иван Царевич (которая как документация была перенесена с ZX).
Сделать как на картинке, как я понимаю, можно, сделав два шага:
- задать в теме режим графики как fixed, а не float или embedded. При этом картинка будет фиксирована над текстом, а над картинкой будет название сцены;
- задать свою функцию отображения титра игры (если не нравится стандартная), например:
instead.get_title = function(s) if parser.notitle then return end local scene = stead.dispof(stead.here()); if type(scene) ~= 'string' then scene = '' end return txtb(scene) end
Надеюсь, это поможет.
Неактивен
Да, там надо было поменять в теме режим картинки на fixed + определить свою функцию title, может я правда что то еще забыл...
На самом деле, может быть лучше gfx использовать?
Просто обычно картинка место занимает, и в парсере кажется лучше, чтоб она уезжала в историю после просмотра, но это на усмотрение автора, конечно.
Неактивен
А, понял!
В игре стояло parser.notitle = true,
его надо было убрать.
еще заметил, что словарь не создан для игры (вернее взят из игры про ивана-царевича)
А в игре прописаны все формы существительного 'кремень'.
Советую прочитать начало документации по МП, иначе так придется для всех слов писать падежи (для тех, которых не было в иване царевиче), а этого не нужно делать!!!
P.S. Если уж так не хочется читать документацию - просто нажмите во время игры f11 - и по мере написания игры нажимайте снова - это будет обновлять словарь.
Неактивен
Копирую из документации:
http://instead.syscall.ru/wiki/ru/gamed … dl-instead
win.fnt.name = путь к файлу-шрифту (строка). Здесь и далее, шрифт может содержать описание всех начертаний, например: {sans,sans-b,sans-i,sans-bi}.ttf (заданы начертания для regular, bold, italic и bold-italic). Вы можете опускать какие-то начертания, и движок сам сгенерирует их на основе обычного начертания, например: {sans,,sans-i}.ttf (заданы только regular и italic);
Так что это начертание шрифта, а как он применяется в игре - дело уже автора и движка. И, вообще говоря, предполагалось что там один шрифт с разным начертанием, а не разные шрифты.
Неактивен
Vladimir написал:
Смена фонов на лету получилась, а вот со сменой цвета текста что-то не выходит.
Написал так:
theme.win.color ( white, white, white );
Либо:
theme.win.color ( 'white', 'white', 'white' );
Либо:
theme.win.color ( '#ffffff', '#ffffff', '#ffffff' );
Неактивен
Вообще, насколько я помню все это есть.
Возможно, документацию надо доработать,
Как я помню, параметр называется:
parser.hideverbs = true
Но и без него, в глаголах если писать ~ в начале (ну и в словах это работает, не только в глаголах), будет то что нужно.
C ? тоже есть - я сейчас не помню параметр, но если нужно - посмотрю.
Причем можно и блокировать ввод неверных фраз и давать их ввести (но сообщать что именно не понял парсер).
Вообще в метапарсере масса вариантов использования, например, в игре Лидия он применяется своим способом, и т.д. Он обкатан уже неплохо.
P.S.
Вспомнил про ?:
parser.empty_warning = '?' parser.err_filter = true -- если хотим запретить ввод заведомо неверных фраз
Неактивен
А, понятно. Это можно, наверное, приделать, но правда тогда идея метапарсера теряется и вернутся недостатки, от которых я как раз уходил. А так - просто гасить вывод, наверное даже переписывать ничего не придется.
Неактивен
А вообще попробовал, прикольно!
Так как и табуляция остается и вопрос - не так уж все и страшно,
Сделаю такую настройку и приведу здесь.
Неактивен
Неактивен