Конструктор виртуальных миров

Не так давно вышла игра «Звезды знают всё, но молчат». В ней есть одна примечательная деталь – это интерактивный виртуальный мир, хоть и небольшой. Лично для меня, это целый поджанр интерактивной литературы, который надо развивать. Отличается от классических игр в первую очередь отсутствием игровой системы и явных целей. Он становиться больше похож на произведение искусства. Представьте себе, вы побывали в каком-то замечательном месте, но вместо фотографии или заметки решили оставить кусочек виртуального мира, чтобы потом снова в него погрузиться или кому-то передать. Текстовый мир не нуждается в сложных механиках. Автору хочется просто создавать локации, объекты и менять стандартные реакции. Передавать атмосферу мира за счёт интерактивного опыта. Для этих целей в 2016 г. был сделан конструктор текстовых виртуальных миров. Давайте попробуем создать виртуальный мир и посмотрим, что из этого получится.



Строим, строим, строим

Давайте побываем в лесу? Мы просыпаемся в летнем лагере ранним утром, пока еще все спят. Будет две локации – палатка и лес. Начнём, пожалуй с палаточки.
HTML TADS — A multimedia TADS 2.5.16 Interpreter.
Copyright © 1993, 2012 by Michael J. Roberts.

Конструктор квестов 1
Автор: Ласточкин А. П.
Версия 1.5
Если вы включили конструктор впервые, то наберите помощь.
Начальная локация
Краткая справка: Вы находитесь в первой локации, чтобы добавить новую, наберите: строить на север. Чтобы изменить название комнаты: дать имя комнате. Чтобы изменить подробное описание комнате: дать описание комнате. Добавление предмета: добавить предмет.
>дать имя комнате
Пожалуйста, введите имя комнаты:
>Палатка
Комната переименована.
>дать описание комнате
Пожалуйста, введите описание комнаты:
>Ты в небольшой брезентовой палатке, которая шуршит при каждом вашем движении. Свежий утренний воздух приятно наполняет лёгкие.
Введите следующую строку описания. Пустая строка — окончание ввода:
>
Описание комнаты обновлено.
>осм
Палатка
Ты в небольшой брезентовой палатке, которая шуршит при каждом вашем движении. Свежий утренний воздух приятно наполняет лёгкие.

Так, палатка есть, только не чувствуется турпохода, надо добавить некоторые походные предметы:
>добавить предмет
Пожалуйста, введите новое имя предмета, одно слово (пример мужского рода- кот/1мо, женского- трава/1ж, среднего- окно/1, множественного- люди/2):
>походный/1пм фонарь/1м
Предмет походный фонарь добавлен в эту комнату.
>добавить предмет
Пожалуйста, введите новое имя предмета, одно слово (пример мужского рода- кот/1мо, женского- трава/1ж, среднего- окно/1, множественного- люди/2):
>спальник/1м
Спальник добавлен в эту комнату
>осм
Палатка
Ты в небольшой брезентовой палатке, которая шуршит при каждом вашем движении. Свежий утренний воздух приятно наполняет лёгкие.
Ты видишь здесь походный фонарь и спальник.

Добавленные предметы интерактивные, попробуем поработать:
>взять фонарь
Взят.
>бросить фонарь
Брошен.
>осм фонарь
Описание предмета

Описание никуда не годиться. Добавим описания фонарю и спальнику, а затем изменим реакции на включение походного фонаря.

>дать описание фонарю
Пожалуйста, введите описание предмета:
>Металлический фонарик для кемпинга. Может светить вперед или превращаться в лампу. Заряда хватает почти на всю ночь.
Введите следующую строку описания. Пустая строка — окончание ввода:
>Его тебе подарил старший брат, когда первый раз взял с собой в поход.
Введите следующую строку описания. Пустая строка — окончание ввода:
>
Описание предмета обновлено.
>дать описание спальнику
Пожалуйста, введите описание предмета:
>Просторный спальный мешок. Хоть немного выцвел, но всё еще прочный.
Введите следующую строку описания. Пустая строка — окончание ввода:
>Ты помнишь, что как-то раз с другом Витькой смогли вдвоём спрятаться в нём от стаи комаров.
Введите следующую строку описания. Пустая строка — окончание ввода:
>
Описание предмета обновлено.
>включить фонарь
Я не знаю как включить походный фонарь.
>заменить «Зачем тебе утром включать фонарик?»
Ты заменил реакцию для походного фонаря на глагол включить на 'Зачем тебе утром включать фонарик?'.
>включить фонарь
Зачем тебе утром включать фонарик?

Кстати, лучше заменим предмет спальник на объект, на котором можно лежать.
>удалить спальник
Объект удалён
>добавить дикровать
Пожалуйста, введите новое имя кровати, одно слово (пример мужского рода- лежак/1м, женского- кровать/1ж, среднего- лежбище/1):
>спальник/1м
Кровать спальник добавлен в эту комнату.
>лечь на спальник
Хорошо, Ты теперь лежишь на спальнике.

Еще немного улучшим это место, добавим синонимы для фонаря, спальника и добавим декорацию палатки, чтобы её можно было осмотреть или потрогать. Декорация отличается от предмета тем, что не добавляется в описание комнаты, её нельзя брать.
>дать синоним фонарю
Пожалуйста, введите синоним предмета, одно слово (пример мужского рода- кот/1м, женского- собака/1ж, среднего- окно/1, множественного- люди/2):
>фонарик/1м
Синоним для предмета добавлен.
>дать синоним спальнику
Пожалуйста, введите синоним предмета, одно слово (пример мужского рода- кот/1м, женского- собака/1ж, среднего- окно/1, множественного- люди/2):
>спальный/1пм мешок/1м
Синоним для предмета добавлен.
>добавить декорацию
Пожалуйста, введите новое имя декорации, одно слово (пример мужского рода- шарф/1м, женского- ваза/1ж, среднего- окно/1, множественного- люди/2):
>палатка/1ж
Предмет палатка добавлен в эту комнату.
>осм палатку
Описание предмета
>трогать палатку
На ощупь она похожа на обычную палатку.
>включить фонарик
Зачем тебе утром включать фонарик?

Отлично, теперь создадим на юге локацию лес.

>строить на юг
Ты построил комнату 2 на юг!
>юг
Комната 2
Описание 2
>дать имя комнате
Пожалуйста, введите имя комнаты:
>Лес
Комната переименована.
>дать описание комнате
Пожалуйста, введите описание комнаты:
>Палаточный городок раскинулся посреди соснового леса рядом с озером.
Введите следующую строку описания. Пустая строка — окончание ввода:
>Густая трава под деревьями постепенно редеет, подходя к песчаному пляжу.
Введите следующую строку описания. Пустая строка — окончание ввода:
>Тишину нарушает шелест листьев от внезапного порыва ветра и щебетание птиц.
Введите следующую строку описания. Пустая строка — окончание ввода:
>
Описание комнаты обновлено.
>осм
Лес
Палаточный городок раскинулся посреди соснового леса рядом с озером.
Густая трава под деревьями постепенно редеет, подходя к песчаному пляжу.
Тишину нарушает шелест листьев от внезапного порыва ветра и щебетание птиц.

Далее, всё аналогично. Обставляем предметами, добавляем описания и меняем реакции. После построения мира, можно распечать исходный код и собрать историю (с библиотеками RTADS). На данный момент получается такой код (немного причесал):

//НАЧАЛО КОДА
#define USE_HTML_STATUS
#define USE_HTML_PROMPT
#define GENERATOR_INCLUDED
#include <advr.t>
#include <stdr.t>
#include <errorru.t>
#include <extendr.t>
#include <generator.t>
#include <gameinfo.t>
modify Me
isHim = true
desc = 'ты/мо'
lico=2
fmtYou="Ты"
fmtToYou='Тебе'
fmtYour='Твой'
fmtYours='твои'
fmtYouve='тебя'
fmtWho='ты'
fmtMe='себя'
;
replace introduction:  function
{
"";
}
replace version:  object
sdesc = {
"Игра 1";
"
Автор:  Иванов И.  И.
Версия 1.0
Если вы играете впервые, то наберите помощь.
";
}
;
replace commonInit:  function
{
   "\H+";
}
startroom:  room
sdesc="Палатка"
ldesc="Ты в небольшой брезентовой палатке, спальник под тобой шуршит при любом
движении.  Свежий утренний воздух приятно наполняет лёгк"
south=room2
;
room2:  room
sdesc="Лес"
ldesc="Палаточный городок раскинулся посреди соснового леса рядом с озером.
Густая трава под деревьями постепенно редеет, подходя к песчаному пляжу.
Тишину нарушает шелест листьев от внезапного порыва ветра и щебетание птиц."
north=startroom
;
item1:  item
desc='походный/1пм фонарь/1м'
noun='фонаре' 'фонарем#t' 'фонарем' 'фонарике' 'фонариком#t' 'фонариком'
'фонарику#d' 'фонарику' 'фонарика' 'фонарик' 'фонарик/1м' 'фонарь' 'фонарь/1м'
'фонарю#d' 'фонарю' 'фонаря'
adjective='походном' 'походным#t' 'походным' 'походному#d' 'походному'
'походного' 'походный' 'походный/1пм'
ldesc="Металлический фонарик для кемпинга.  Может светить вперед или
превращаться в лампу.  Заряда хватает почти на всю ночь.
Его тебе подарил старший брат, когда первый раз взял с собой в поход."
location=startroom
verDoTurnon(actor)="зачем тебе утром включать фонарик?";
bed3:  beditem
desc='спальник/1м'
noun='мешком#t' 'мешком' 'мешка' 'спальном' 'спальным#t' 'спальным'
'спальному#d' 'спальному' 'спального' 'спальный' 'спальный/1пм мешок/1м'
'спальнике' 'спальником#t' 'спальником' 'спальнику#d' 'спальнику' 'спальника'
'спальник' 'спальник/1м' 'мешке' 'мешок' 'мешку' 'мешку#d'
ldesc="Просторный спальный мешок.  Хоть немного выцвел, но всё еще прочный.
Ты помнишь, что как-то раз с другом Витькой смогли вдвоём спрятаться в нём от
стаи комаров."
location=startroom
;
decor4:  decoration
desc='палатка/1ж'
noun='палаткою#t' 'палаткою' 'палаткой#t' 'палаткой' 'палатку' 'палатке#d'
'палатке' 'палатки' 'палатка' 'палатка/1ж'
ldesc="Описание предмета"
location=startroom
;
//КОНЕЦ КОДА

Скриншот собранного мира:


Послесловие

Конечно, этот конструктор несовершенен. Многим будет удобнее в исходных текстах определить предметы и реакции, с другой стороны он позволяет делать прототипы миров за короткое время и получать код для дальнейших улучшений. Локации и предметы «Ученика мага» строились на этом конструкторе, а потом реакции дорабатывались вручную. В планах:
• Сделать замену на реакции из одного глагола (ждать, прислушаться, прыгнуть и т.п.)
• Добавить команду завершения режима редактирования. Тогда можно будет не компилировать исходный код мира, а обмениваться sav-файлами, которые меньше и проще создавать.
• Живые объекты. Для настоящего мира не хватает NPC. Нужно движущийся рандомно, за игроком или по фиксированному маршруту.

Ссылки

Скачать конструктор
Полный лог создания мира
Сгенерированный код, компилятор и бинарник

5 комментариев

Wol4ik
Судя по тому, как описан процесс создания мира, декораций и об`ектов — редактор уже является самостоятельной игрой, в которой, полагаю, уже трудно следить за временем. На подобии Майнкрафта в режиме творчество.
alastochkin
Это как посмотреть. Впринципе аналогия есть :)
Wol4ik
Аналогия с игрой не случайна. Читая последовательность команд, прихожу к выводу, что основных плюса в таком инструменте два:
* доступность создания мира для авторов без (или почти без) обязательности навыков программирования. Наглядность.
* увлекательный процесс, основанный на словесном диалоге с редактором.

Минусов тоже два (не подумайте, что я берусь судить, что существеннее из этого (+) или (-)):
* низкая скорость разработки игры, обусловленная клавиатурным вводом командного текста (описательный же текст так и так вводить).
* трудности в реализации работы не единично, а сразу со списками — например создать типовую декоративную скамейку (урну, форточку, трещину и тп) и указать список локаций, где она будет встречаться, или создать предмет при помощи копирования другого предмета с последующей корректировкой всего нескольких из множества всех его параметров /разные виды магических посохов, отличающиеся только цветом, весом, ценой и параметрами атаки доминирующей стихией/ или блокировка целого списка направлений переходов с локации, или перехват целого списка команд в данной локации (например в скафандре или гидрокостюме невозможно обнюхивать предметы и существ или говорить) и тп.

Собственный суб`ективный вывод: такой инструмент будет очень хорош, даже если я не преувеличил те минусы, когда он будет завязан на мой голосовой ввод команд и у редактора будет возможность, помимо вывода текстом, повествовать, отчитываться и реагировать на мои действия и события игры машинной речью.
Комментарий отредактирован: 14 августа 2018, 11:54
alastochkin
По поводу командного текста, могу привести такое возможное решение — аббревиатуры команд. Будет вроде: «дик», сокращение от «дать имя комнате». Также можно сделать управление через цифровое меню, тогда будет еще быстрее. Насчет копирования предметов я не подумал, но это несложно делается. Например, сделали скамейку типичным способом, затем будет специальная команда, вида «запомнить скамейку как шаблон». Появляется объект шаблон (чтобы не пересекался с текущей реализацией скамейки), потом переходим в новую локацию и вводим «вставить шаблон», далее идёт ввод имени (новая скамейка) и готово. Насчет целого списка команд локации, то это будет скорее всего вариант тёмной комнаты — там обрабатывается весь список одинаково. Придётся делать состояние для комнаты, посложнее, согласен. Ну а голосовой ввод-вывод отдельная задача, например через подключение систем распознавания и синтеза речи для консольного приложения.
Wol4ik
Как авторскую, так и задаваемую пользователем привязку команд (фраз) к цифровым клавишам — считаю хорошим решением почти для любой игры и редактора (пусть даже и не в качестве основного метода). Сама по себе скорость передачи команд игре цифровыми клавишами очень высока, что ни раз проверено на практике.

Можно еще пофантазировать и представить, что в поле ввода редактора/парсерной игры можно использовать пробелы и их отсутствие между цифрами (вводя разные и/или одну и ту же) --то получится добиться ввода фраз/команд с не менее сложным смыслом, чем и при вводе словами обыкновенными. Дальнейшая моя фантазия в сторону приближения почти к машинному коду уже будет не по теме этого топика про конструктор миров)))
Комментарий отредактирован: 14 августа 2018, 14:31