Всем привет!
Меня зовут Михаил, я давно увлекаюсь текстовыми приключениями и в этом году наконец-то запилил на JS движок для разработки таких игр для игры в браузере. А к движку - игру на основе старой спектрумовской адвенчуры, чтобы можно было пощупать основные возможности.
Вот, собственно, игра https://eidolonzx.github.io/quazatron-adventure/, а вот сайт движка https://quazatron.ru/.
Игру уже можно пройти, но очень не хватает тестеров "в теме" такого рода игр. Буду рад конструктивной критике и предложениям, готов ответить на любые вопросы. Я новый человек в комьюнити, изначально делал движок в основном для себя, и не совсем понимаю, насколько это может быть востребовано.
P.S. Я не умею в графику, поэтому скрины из всем знакомой игры)
Отредактировано Михаил Соловьёв (23.03.2019 12:30)
Неактивен
Выглядит хорошо, продвинуто (по крайней мере, изнутри - JS модули это круто). Немного не хватает сокращений ("о", "осм" - "осмотреть"). Ещё замечу, что повелительное наклонение ("возьми", "приставь") традиционно используется для приказов NPC и управления, а не команд игрока. Да и в принципе после команд свободного вида "возьми, пожалуйста, эту приставучую лестницу" (что игра понимает) игроки могут переходить на "достань-ка вон ту монету и кинь подальше вон в то дерево".
Кода много и он хорошо разложен, но и писать игры будет сложнее. Глаголы добавить в один словарик, предметы - в другой, все возможные прилагательные для всех возможных предметов - в третий. Я бы очень сильно подумал, а стоят ли возможные новые фичи такой мороки мне как автору. Так что, по-моему, нужно больше документации и каких-нибудь предвычислений словаря.
Кстати, почему лицензия CC-BY-NC? Вы против коммерческих онлайн-парсеров?
Отредактировано Oreolek (23.03.2019 14:22)
Неактивен
Спасибо за обратную связь!
Сокращения добавлю, да. Очевидное "о" пропустил.
Глаголы - в словаре два варианта, и "возьми", и "взять", можно играть так, как привычнее.
Насчёт словарей - делал всё в одном, чтобы не усложнять и так сложную работу будущему игрописателю. Но, согласен, имеет смысл разделить, подумаю над этим.
Документация будет, это следующий шаг.
Насчёт лицензии - пока выбрал некоммерческую, возможно, в будущем поменяю. Пока не совсем понимаю, насколько такой движок был бы восстребован, какое у него могло бы быть будущее, т.к. писал под себя, чтобы а) набить руку в ES6 и вообще в JS б) закрыть гештальт и сделать несколько ремейков игр, в которые играл на спектруме (ту же Rebel Planet)))
А что вы имеете в виду под предвычислениями?
Неактивен
Привет! Интересный движок. У нас уже почти традиция: каждую весну — новый парсерных движок на JS
У нас тут, вроде как, ПАРСЕРФЕСТ намечается (хотя, до сих пор не понятно когда), не хочешь технодемку сделать? Возможно, получишь больший фидбек.
После проигрыша инвентарь не очищается и взять ничего нельзя. Будет время, поизучаю подробнее. Глянул посмотреть, что за лицензия такая, а по ссылке из гитхаба пишет "Sorry".
Если тебе интересно, можешь глянуть на мою разработку
Неактивен
johnbrown написал:
Если тебе интересно, можешь глянуть на мою разработку
Спасибо, посмотрю!
Ссылку на лицензию пофиксил, это обычная CC-лицензия "делай что хочешь в некоммерческих целях". В предыдущем ответе я написал свои мысли на этот счёт. Не думал, что такое внимание к лицензии будет Инвентарь тоже пофиксил, игру перезалил, там мелкая ошибка была. Сейчас всё работает.
Сделать демку на Парсерфест - это будет отличной мотивацией сделать новую игру, а то желание есть, инструмент вот тоже есть
Неактивен
Версия для телефонов будет?
И overflow: hidden; не надо для всей страницы делать (в игре).
Команды "взять всё" и "положить всё" - слово "всё" воспринимается, как отдельный предмет: "Вы не можете это взять." и "У меня нет этого."
Не понимает: "Осмотреться", "Ждать".
Отмена предыдущей команды не помешала бы.
Неактивен
Enola написал:
Версия для телефонов будет?
И overflow: hidden; не надо для всей страницы делать (в игре).
Команды "взять всё" и "положить всё" - слово "всё" воспринимается, как отдельный предмет: "Вы не можете это взять." и "У меня нет этого."
Не понимает: "Осмотреться", "Ждать".
Отмена предыдущей команды не помешала бы.
Версию для телефонов пока не планирую. Пока с браузерной надо разобраться.
Про"всё" - такого не сделал, возьму на заметку, хорошая идея.
"Осмотреться" - тоже не делал, т.к. описание локации и картинка постоянно на виду, не вижу в этом смысла.
"Ждать" - этого нет в демо-игре, но при желании это можно приделать в будущие игры (мои или не мои).
Отмена команды - в том смысле, что откат всего состояния игры на шаг назад? Интересная фича, но возникает вопрос, сколько ходов хранить в памяти (или все ходы?)
Вообще, спасибо за идеи, буду внедрять.
Неактивен
И overflow: hidden; не надо для всей страницы делать (в игре).
Это не мой мотоцикл Спрошу у человека, который верстал
Неактивен
Немного раздражает, что: после нажатия "ENTER" и начала игры, фокус оказывается не на поле ввода и его приходится дополнительно тыцать + даже при наличии всего одной монеты, приходится каждый раз указывать, что она не монета, а - медная монета + при наличии в игре ужасающих монстров, которые абсолютно безобидны, странно, что игра сурово карает за некоторое неверное действие, разбитием лампы + игра не понимает некоторых распространённых сокращений, например, инв(инвентарь). И отдельно замечу, что игнорирование не распознанных частей ввода лично мне представляется не очень хорошим решением. Хотя, зачастую из-за этого игра выглядит более понятливой, чем это есть реально.
спойлер…
Но, в целом, неплохо. Простенько, но не плохо. Я немножко видел оригинал, и да - это тот редкий случай, когда графику действительно ст0ило сменить. Идея со спящей красавицей, внёсшая некоторое минимальное изменение, действительно улучшила игру
Буду поковыривать исходники и ждать оригинальных игр на этом движке.
Неактивен
Спасибо за критику! Рад, что игра и движок оставили положительное впечатление.
Отвечу по пунктам:
1. С фокусом я пока проблему не решил, но знаю как, занёс к себе это в todo
2. Насчёт монеты - тут по-другому не знаю, как реализовать логику. У нас в игре две разных монеты, и если обе их идентифицировать как "монета", то возникнут казусы, например, когда обе монеты в локации, ты пишешь "возьми монету" - какую брать? я согласен, замороченно постоянно писать "серебряную монету", но пока решения не придумал. Есть идеи?
3. С монстрами вот какая штука. В оригинальной игре героя убивали за любой проступок - его и тролль убивал, и старушка, которая на самом деле оказывалась колдуньей, и в пропасть можно было свалиться, и так далее. Но в процессе написания игры я оставил на самый последний момент логику, связанную с отработкой проигрыша игрока и ВООБЩЕ убрал возможность умереть. Затем, когда эта отработка появилась, я повесил возможность умереть на ситуацию, когда игрок есть гнилую рыбу, ну, просто для демонстрации возможности движка. С тестером в итоге сошлись на том, что игра для новичков, должна быть простой и не убивать игрока.
Хотя, в принципе, более логичным было бы сделать смерти так, как это было в оригинальной игре, благо, перспектив умереть в игре много В ближайшее время, наверное, приближу чуть больше к оригиналу, и верну возможность умереть от старушки и тролля, а также убить принцессу и заполучить злую концовку.
4. Про сокращения знаю. Можете сориентировать, где вообще можно посмотреть/почитать про общепринятые сокращения? Я тут человек новый, не знаю, как принято в современных парсерных играх, так, "о" для "осмотреть" стало для меня открытием недавно))
5.
И отдельно замечу, что игнорирование не распознанных частей ввода лично мне представляется не очень хорошим решением. Хотя, зачастую из-за этого игра выглядит более понятливой, чем это есть реально.
Вот с этим не понял, можете пояснить на примере?
6. С монстром ситуацию я обыграл как в оригинальной игре. Там вроде как тоже не было ни спичек, ни факелов, короче, никакого огня. Хотя... Лампа зажигается, от неё можно было бы запариться и зажечь. Но я оставил как есть. В своих собственных играх буду следить за такими вещами. С заклятьем тоже самое - надо уточнить, что действовать надо именно на него. Тут, видимо, моя промашка, не надо было задавать вопрос "Что делать?"
спойлер…
Отредактировано Михаил Соловьёв (26.03.2019 16:32)
Неактивен
И отдельно замечу, что игнорирование не распознанных частей ввода лично мне представляется не очень хорошим решением. Хотя, зачастую из-за этого игра выглядит более понятливой, чем это есть реально.
Вот с этим не понял, можете пояснить на примере?
Вводим в игре:
> Положить ледяную лестницу на горячую печку
Получаем:
- Ок, положил
Обычно это не приводит к проблемам, но бывает такое, что пытаешься сделать что-то одно, а получается нечто неожиданное.
спойлер…
upd:
Насчёт монеты - тут по-другому не знаю, как реализовать логику. У нас в игре две разных монеты, и если обе их идентифицировать как "монета", то возникнут казусы, например, когда обе монеты в локации, ты пишешь "возьми монету" - какую брать? я согласен, замороченно постоянно писать "серебряную монету", но пока решения не придумал. Есть идеи?
Обычно движки реагируют так:
Команда "взять монету", если доступна для взятия всего одна монета, приведёт к взятию именно этой монеты. Если же есть несколько разных монет, то тогда уже задаём вопрос "Какую монету взять: серебряную или медную?"
Отредактировано qwerty (26.03.2019 16:59)
Неактивен
Вводим в игре:
> Положить ледяную лестницу на горячую печку
Получаем:
- Ок, положил
Обычно это не приводит к проблемам, но бывает такое, что пытаешься сделать что-то одно, а получается нечто неожиданное.
Да, теперь понял.
Ну это вопрос скорее к игре, чем к движку. Я решил не заморачиваться и упростить такие конструкции. На парсерфест игру сделаю поприличнее
Движок позволяет задать конструкцию типа "ПОЛОЖИТЬ ЛЕСТНИЦУ НА ПЕЧКУ", и это будет отличаться от "ПОЛОЖИТЬ ЛЕСТНИЦУ".
Собственно, в игре такая штука есть
спойлер…
Про прилагательные тоже понял. Но пока не представляю, как это в движке сделать, буду думать.
Неактивен
Модератору - может, имеет смысл эту тему в технический раздел про движки перенести? Или здесь она тоже уместна?
Неактивен
Михаил Соловьёв написал:
Вводим в игре:
> Положить ледяную лестницу на горячую печку
Получаем:
- Ок, положил
Обычно это не приводит к проблемам, но бывает такое, что пытаешься сделать что-то одно, а получается нечто неожиданное.Да, теперь понял.
Ну это вопрос скорее к игре, чем к движку. Я решил не заморачиваться и упростить такие конструкции. На парсерфест игру сделаю поприличнее
Движок позволяет задать конструкцию типа "ПОЛОЖИТЬ ЛЕСТНИЦУ НА ПЕЧКУ", и это будет отличаться от "ПОЛОЖИТЬ ЛЕСТНИЦУ".
....
А вот вы и не поняли. В этой игре [насколько мне известно] нет никакой печки. И единственная лестница, которая есть - не ледяная. Так же, сейчас в игре можно успешно "положить лестницу в духовку", и много чего ещё, что автор предусматривать и не может и не должен.
Неактивен
Ну, надеюсь, теперь понял.
В общем, мне движок ещё пилить и пилить, будет чем заняться
Неактивен
Михаил Соловьёв написал:
Можете сориентировать, где вообще можно посмотреть/почитать про общепринятые сокращения? Я тут человек новый, не знаю, как принято в современных парсерных играх, так, "о" для "осмотреть" стало для меня открытием недавно))
Перечислил на IFWiki - Стандартные сокращения парсерных команд.
Неактивен
Спасибо! Использовал в игре сокращения. Также починил фокус (теперь при нажатии любой клавиши фокус возвращается в строку ввода), а также сделал кучу мелких фиксов.
В ближайших планах:
* Прокачать логику игры в сторону более реалистичных реакций окружения на действия игрока
* Добавить команды "ПОВТОР", "ОТМЕНА", "ЖДАТЬ"
* Сделать возможность возврата к предыдущим набранным командам
* Улучшить логику работы команд "ВЗЯТЬ" и "ПОЛОЖИТЬ" (спасибо qwerty за подсказку)
* Сделать более гибкой работу с прилагательными
* Сделать возможность отключения графической части (text only mode)
* Добавить в парсер возможность определения команды по первым её буквам
Отредактировано Михаил Соловьёв (30.03.2019 13:39)
Неактивен
Сразу хочу оговориться, что всё ниже написанное - моё личное мнение, отражающее мои личные вкусы и, разумеется, никого ни к чему не обязывает.
===
Михаил Соловьёв написал:
* Улучшить логику работы команд "ВЗЯТЬ" и "ПОЛОЖИТЬ" (спасибо qwerty за подсказку)
Да боже ж мой! Причём тут логика команд? Можно "осмотреть свои ослиные уши" и получить ответ: "ничего необычного" - и так с любой командой абсолютно. А если "приставить лестницу к облаку", то получим разную реакцию, в зависимости от того, есть ли в этой локации тот самый единственный объект, к которому лестница должна быть приставлена. И если есть, то - приставит. И это может приводить к тому, что игрок скомандует что-то одно, а игра сделает другое.
А дело вот в чём:
игнорирование не распознанных частей ввода лично мне представляется не очень хорошим решением
- но, может быть, и так сойдёт?
===
* Добавить команды "ПОВТОР", "ОТМЕНА", "ЖДАТЬ"
Команда ПОВТОР мне не видится чем-то полезным. Ну, то есть - для повторения последнего действия нужно целую команду вводить? Лучше сделать, чтобы стрелками "вверх/вниз" можно было перебирать последние введённые команды, чтобы выбрать одну из них для выполнения. И такое обычно есть в парсерках.
===
Добавить в парсер возможность определения команды по первым её буквам
Ну распространённые сокращения, как я понял, уже реализованы. Зачем добавлять не распространённые сокращения - я плохо понимаю и использовать их не буду. Но вообще, распознавание команд по первым нескольким буквам было в самых первых парсерках... то есть, памяти у компов было мало и проще было хранить первые 4-5 букв, чем целый глагол. Может быть, другие игроки это оценят. Лично я бы оценил, если бы игра понимала команды, введённые на правильном русском языке.
Неактивен
Да боже ж мой! Причём тут логика команд? Можно "осмотреть свои ослиные уши" и получить ответ: "ничего необычного"
Для начала я хочу сделать так, чтобы правильно работали команды "ВЗЯТЬ" и "ПОЛОЖИТЬ". Например, я думаю, что "ПОЛОЖИТЬ" и "БРОСИТЬ" должны обрабатываться одинаково по умолчанию (когда команда представляет собой глагол+объект). В сложных ситуациях (когда нужно положить что-то куда-то или бросить что-то в кого-то) нужен свой обработчик.
--
Если же рассмотреть пример с ослиными ушами, то как на них реагировать? "Я НЕ ПОНИМАЮ, ЧТО ТАКОЕ ОСЛИНЫЕ УШИ"? Или игра должна знать, что игрок захочет изучить свои уши? Можно мне нормальный пример реакции программы или, ещё лучше, пример существующей игры, в которой всё это реализовано?
Про лестницу с облаком - я писал выше, что сделал такие упрощения, как, например "ПРИСТАВЬ ЛЕСТНИЦУ" в локации с деревом только для упрощения задачи игроку. Мне ничего не стоит запрограммировать, чтобы команда "ПРИСТАВИТЬ ЛЕСТНИЦУ К ДЕРЕВУ" срабатывала, а "ПРИСТАВИТЬ ЛЕСТНИЦУ" или "ПРИСТАВИТЬ ЛЕСТНИЦУ К **ЧЕМУ-ТО ДРУГОМУ** выдавала другой ответ.
В конце концов, это демонстрационная игра, которая, кажется, уже хорошо выполняет свою задачу. Одно из её предназначений - получить критику и сделать так, как лучше
--
Стек команд я сделаю, занёс в TODO
--
Где-то здесь на форуме встречал мнение, что это хорошая правильная фича - распознавать команду по первым буквам. Хотя, применительно к пошаговой браузерной игре может это и лишнее, я ж не MUD делаю, где важно быстро вводить команды.
Неактивен
Можно мне нормальный пример реакции программы или, ещё лучше, пример существующей игры, в которой всё это реализовано?
- для примера можно взять, практически, любую парсерную игру. Не знаю, может быть можно найти какой-то особенный парсер, в котором "всё это" не реализовано, НО, обычно, реакция бывает примерно такой:
Об этом предмете ничего не известно." или "Этого предмета здесь нет." -- см реакцию RInform-игр: https://rinform.org/#games например, Приключение. Или любую другую, ведь эта реакция формируется на уровне движка, а не игры. Хотя, автор игры может её изменить. Но, обычно, не зачем.
Про лестницу с облаком - я писал выше, что сделал такие упрощения, как, например "ПРИСТАВЬ ЛЕСТНИЦУ" в локации с деревом только для упрощения задачи игроку.
- я нигде не писал, что мне не нравится реакция на "приставь лестницу". Но меня смущает реакция на "приставь лестницу к облаку" или на "приставь лестницу к скале" или на "приставь лестницу к пещере" или на "приставь лестницу к динозавру". А теперь, на минуточку, представим, что в локации есть несколько объектов. И попытка приставить лестницу к любому из них(даже к тем, которых там нет) будет приводить к тому, что лестница будет приставлена к тому самому единственному объекту, задуманному автором. И это очень похоже на проблему, возникающую с любой командой. С любой абсолютно.
===
Положить ледяную лестницу на горячую печку.
Осмотреть свои ослиные уши.
Приставить лестницу к скале.
-- во всех этих случаях одна и та же проблема. Одна и та же. Она проявляется не на каких-то конкретных командах, а когда игрок вводит помимо осмысленной части, так же и то, чего движок не понимает. Можно попробовать, для её устранения, допилить команды "взять/положить", а потом отдельно - команду "осмотреть", а потом - каждую из остальных команд... но на мой взгляд, это было бы очень странным подходом. Потому что проблема, в данном случае, не на уровне выполнения конкретной команды, а выше.
Неактивен
qwerty написал:
Команда ПОВТОР мне не видится чем-то полезным. Ну, то есть - для повторения последнего действия нужно целую команду вводить?
А если последняя команда "Бросить дротик в мишень"? Проще набрать "повтор", а ещё лучше - просто "п". Стрелки это конечно хорошо, только не на всех устройствах они есть.
Неактивен
johnbrown написал:
qwerty написал:
Команда ПОВТОР мне не видится чем-то полезным. Ну, то есть - для повторения последнего действия нужно целую команду вводить?
А если последняя команда "Бросить дротик в мишень"? Проще набрать "повтор", а ещё лучше - просто "п". Стрелки это конечно хорошо, только не на всех устройствах они есть.
Однако, в твоём протопарсере, стрелочки - работают))
upd: впрочем, как и 'повторить' и 'п'
Отредактировано qwerty (30.03.2019 15:23)
Неактивен
Можно ещё немного заморочиться и сделать, чтобы команда ПОВТОР принимала аргумент — индекс команды в истории введенных команд. Пример:
п 1 (или просто П) — повтор последней команды,
п 2 — повтор предпоследней команды,
и т.д.
Возможно, кому-то это будет удобно в отсутствии стрелочек
Неактивен
Привет, Михаил!
Во-первых - игра выглядит симпатично! И чем-то даже напоминает мне мой движок внешне. Я очень рад, что парсерные игры вызывают интерес!
Во-вторых, здесь в основном почти все авторы игр. Да ещё и движков. И даже парсеров. Поэтому у многих есть профессиональная деформация.
В чём она заключается? У TADS и Inform есть стандартная библиотека, которая берёт на себя очень много рутины. То-есть, при программировании игры
ты фактически описываешь/моделируешь мир, а библиотка делает за тебя всю грязную работу. И эта архитектура считается своего рода эталоном.
Кончено, это не единственный способ. Можно ловить команды по паттернам (как Adrift это делал) или кодировать конкретные вещи в игре. Но это уже не так удобно и главное, это будет хуже, чем уже есть.
Поэтому, на мой взгляд, ориентироваться лучше на игроков. То-есть, надо написать хорошую историю и дальше смотреть уже по реакции конкретных людей.
Упрощённый подход тоже имеет право на жизнь, если он будет работать. Например, я не вижу криминала в том, что иногда команда сработает в более широком смысле, чем задумывал её игрок и так далее. Очень многое зависит от того, какого рода игра.
В общем, буду ждать полноценную историю.
P.S.
У меня, кстати, (как и у jhonbrown) тоже свой парсерный движок Но он сделан по образу и подобию Inform (что касается библиотеки).. Но прошлый парсер был основан на ином принципе, и критика присутствовала на постоянной основе. Что не помешало сделать несколько хороших игр.
P.P.S чуть не забыл! Нужно уже на этом этапе предусмотреть механизм сохранений.
Отредактировано gloomy (30.03.2019 19:58)
Неактивен
gloomy, спасибо за добрые слова!
---
Я тут поработал над игрой и движком и рад представить вашему вниманию бета-версию. Сейчас игру можно пройти, но глаз замыливается, и буду рад, если потестируете и покритикуете.
https://eidolonzx.github.io/quazatron-adventure/
Что нового в игре:
* Игра переделана в сторону усложнения. В частности, добавилась возможность умереть несколькими способами - а что вы хотели от места, кишащего монстрами?
* Добавлена злая альтернативная концовка
* Добавлены часы как демонстрация игрового счётчика
Что нового в движке:
* Парсер теперь сообщает игроку о том, что не понимает какого-либо введённого им слова. Чтобы парсер "понимал" (а, точнее, пропускал) предлоги и наречия, добавлен дополнительный список таких слов
* Добавлены команды "ВЗЯТЬ ВСЁ" и "ПОЛОЖИТЬ ВСЁ"
* Исправлена логика работы команд "ВЗЯТЬ", "ПОЛОЖИТЬ" и "ОСМОТРЕТЬ". Теперь движок различает, когда игрок хочет просто выбросить предмет, и когда игрок хочет положить предмет куда-то или бросить в кого-то
* Исправлена логика работы команды "ИДИ", теперь нормально работают команды типа "ИДИ НА СЕВЕР"
* Добавлено множество аббревиатур и сокращений к командам и объектам. Некоторые команды сокращены до одной буквы (и - инвентарь, б - брать(взять), п - положить, о - осмотреть, ж - ждать, г - говорить, поговорить, у - ударить, р - рубить)
* Добавлена возможность разработчику задавать команды, которые будут срабатывать в обход парсера (например, чтобы избежать ограничений движка - глагол должен быть первым в пользовательском вводе и так далее)
* Добавлена возможность разработчику задавать дефолтные описания к любым игровым объектам
* Добавлен дополнительный синтаксис, позволяющий более простым способом выделять цветом важные игровые объекты
* Оптимизированы свойства объектов в словарях, теперь ненужные разработчику свойства можно просто не прописывать
* Исправлена куча мелких багов, в частности, потеря фокуса командной строки (если потерялся, достаточно нажать любую кнопку)
Что в планах:
* Добавить стек команд с возможностью возврата к ранее введённым командам, а также команды "ПОВТОР" и "ОТМЕНА"
* Сделать более гибкой работу с прилагательными, сейчас это моя основная боль в движке, которую пока сложно решить
* Сделать возможность отключения графической части для разработки последующих чисто текстовых игр
* Написать документацию
После этого буду пилить новую игру на какой-нибудь из конкурсов.
Неактивен