1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

TDZ - движок для текстовых квестов

Тема в разделе "Мастерская", создана пользователем Dimouse, 9 дек 2007.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    Хм, а зачем я тогда падежи вводил? Не, я хочу чтобы нужно было писать правильно, поэтому и слова нужно до конца дописывать и т.д.

    Может тогда кто-нибудь хочет сделать эти самые синонимы и т.д., раз уж так всем они нужны? Я исходники дам.
     
  2. DAKSnake

    DAKSnake

    Регистрация:
    5 ноя 2006
    Сообщения:
    259
    Dimouse, ой, то, что в файлике scenes.dat это скритпы, да? это... невыразимо. я понимаю, что подобную схему легче организовать и делается это быстро, но модернизировать её... будет не очень просто.

    насчет холодильника: открываем, смотрим что внутри (объекты активировались), закрываем холодильник. то, что внутри, можно взять или нет?


    Low_Pressure, речь про особенности конкретной реализации. запрограммировать одно и тоже можно существенно разными способами...

    ps: Dimouse, что есть TADS?
     
    Последнее редактирование: 14 дек 2007
  3. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    DAKSnake, ага, вот я хотел именно это пообсуждать:) Вроде то о чем ты говоришь можно сделать, сейчас попробую.
    TADS - это система для написания ИФ игр с текстовым вводом, одна из самых известных. Я не понял что такое "иерархия объектов", подумал что это то как там реализовано (видел несколько кусков программ на RTADS).
     
  4. Low_Pressure Titanium Helmet of Musicianship owner

    Low_Pressure

    Legacy

    Регистрация:
    1 окт 2005
    Сообщения:
    8.667
    Я это понимаю. Естесственно это можно сделать по-разному, но я говорю не про реализацию. Я не понял логики, почему активным (подсвеченным словом) является именно кислота, а не колба с ней.
    Нет уж, я не даром отказался от участия в конкурсе :( Времени на копании в чужих скриптах у меня в ближайшее время не предвидится.
     
  5. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    DAKSnake,
    Опять сегодня не получилось попрограммить. Сделал только что за 10 минут только выход нормальный, чтобы можно было прочитать концовку и т.д., а также вышеприведенный пример с холодильником. Объекты никакие не активизируются кстати, с чего ты взял. Состояния есть у самих действий.
    Ссылка прежняя http://serv.edu.kiae.ru/~stbds/tdz.zip
    А вот сделать так, чтобы я мог открыть холодильник, взять оттуда допустим сыр, потом закрыть холодильник, открыть его заново и прочитать что там теперь не "сыр и записка", а только записка - этого пока нельзя. Но я уже вроде придумал как с этим побороться, правда количество действий если все так прописывать будет очень большое... но что поделаешь.

    Добавлено через 1 минуту
    Если бы не было подсветки, то это называлось бы Жуткое Издевательство Над Игроком. Некоторые разработчики игр очень любят:)
     
    Последнее редактирование: 15 дек 2007
  6. DAKSnake

    DAKSnake

    Регистрация:
    5 ноя 2006
    Сообщения:
    259
    насколько я понял, сейчас имеет место такая ситуация:
    простой движок и сложные скрипты. сложные в том плане, что все возможные действия указаны именно в скриптах.

    а можно сделать значительно по другому:
    сложный движок, в котором прописаны разнообразные действия, и скрипты по типу декларативных ооп языков, где описаны объекты, их свойства и связи (иерархия) между объектами (наследование - что в чем лежит как пример). что это дает - легкость добавления новых объектов, мы им прописывает некоторые свойства, на основе которых движок ограничивает возможные действия с ними. с точки зрения создания игры этот вариант проще, а с точки зрения создания движка - наоборот.

    есть и третий вариант (как например сделано в отечественных аналогах qsp и urq) - сделать простенький интерпретатор некого языка программирования с широкими возможностями.

    так что выбор стоит между сложно реализацией движка при (возможно) простоте написания скриптов либо простой движок (но модифицируемый для добавления новых фич) с невообразимо сложной реализацией скриптов (сейчас есть одна комната и менее десятка объектов. что будет если их количество увеличить вдвое?)
     
    Dimouse нравится это.
  7. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    DAKSnake,
    Так все равно варианты ответов для любых действий по-хорошему надо прописывать и желательно, чтобы ответы не повторялись и чтобы не было ответов "вы не можете этого сделать" просто потому что такое действие не предусмотрено для такого объекта. Как это сделать если не прописывать все явно?

    Можно пример свойств и связей?

    Вообще тут как мне кажется нет четкой грани между простым и сложным движком. Всегда все начинается с простого, потом что-то добавляется, усложняет, получается сложно. Вопрос только что нужно усложнить, чтобы получилось лучше.
    Вся разница как я понимаю тут заключается в том на что возложить основные функции движка - на объекты или на "действия". У меня сейчас для объектов есть только имя, описание и номер. Можно например ввести им свойство "съедобен-несъедобен", тогда на попытку его съесть будет даваться соответствующий ответ в случае несъедобности, например "Вы не можете съесть объект такой-то, так как он несъедобен". В альтернативном моем способе придется прописывать такой ответ для каждого объекта, но тут зато можно проявить креативность, "Вы погрызли ножку табуретки и она вам не понравилась", "Попытка съесть дверь провалилась, так как она не влезла вам в рот" и т.д. Лучше всего, как я понимаю сделать что-то среднее между этими двумя крайностями. В частности свойства для объектов все-таки думаю что нужны. Скрипты подобные тем что у меня сейчас реализованы и в том и в другом случае нужны! поскольку они позволяют реализовать нелинейность прохождения на хорошем уровне (то есть фактически вообще ничем не ограниченную).
     
  8. Low_Pressure Titanium Helmet of Musicianship owner

    Low_Pressure

    Legacy

    Регистрация:
    1 окт 2005
    Сообщения:
    8.667
    Но можно ведь сделать все сразу:

    Код:
    //k- съедобен/несъедобен
    //x- объект
    //x=4 - дверь
    
    if k=0 and x=4 than 
    y="Попытка съесть дверь провалилась, так как она не влезла вам в рот" 
    else y="Вы не можете съесть объект такой-то, так как он несъедобен".
     
  9. The_ShadoW

    The_ShadoW

    Регистрация:
    4 мар 2007
    Сообщения:
    187
    А вообще в чем проблема? Текстовые квесты оперируют всего лишь тремя типами объектов - локации, предметы и действия. Если добавить ввод пользователя в схему - то еще появляются команды и ответы. Удовлетворительно прописать их все (хотя идеал здесь конечно - прямая реализация в объектном виде на ООП-языке), и движок будет поддерживать как весьма простые, так и весьма сложные вещи.
     
    Последнее редактирование: 16 дек 2007
  10. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    Low_Pressure, да, это очевидно. Видимо примерно так и будет сделано, когда будет много объектов.

    The_ShadoW, проблема в том что очень много придется текста писать, а так все вполне работоспособно. Кстати у меня есть еще класс НПС, правда он еще пока не задействован и в принципе их можно обычными объектами сделать тоже. Надо будет подумать.

    Добавлено через 9 часов 10 минут
    http://serv.edu.kiae.ru/~stbds/tdz.zip
    Сделал тип интерфейса "Casual" (команды выбираются курсором, потом нужно нажать пробел, но до этого обязательно ничего не писать - т.е. если вы хотите выбрать команду из списка, то обязательно выбрать ее курсором и нажать пробел сначала, а потом уже дописать название объекта). Вариант интерфейса "Classic" по-прежнему доступен, надо всего лишь заменить "Casual" на "Classic" в конфиг-файле.

    Прошу потестировать новый интерфейс. Стало ли удобнее? Нет ли глюков?
    P.S. С интерфейсом больше наверное возиться не буду, и так все удобно как мне кажется, а развитие самого движка важнее.

    Добавлено через 2 часа 21 минуту
    Вроде победил-таки пример с холодильником до конца! Потестируйте пожалуйста кому не лень. В общем сейчас можно открыть холодильник, взять что-нибудь, закрыть, потом открыть и ответ будет другим. Потом можно опять что-нибудь взять, закрыть, открыть и ответ будет опять другим. Можно еще всякие варианты делать. Вроде все работает как надо, но может быть я чего-то не учел. Лишних скриптов при этом не делал, только необходимые (с ответами).
     
    Последнее редактирование: 17 дек 2007
  11. The_ShadoW

    The_ShadoW

    Регистрация:
    4 мар 2007
    Сообщения:
    187
    Dimouse,
    Ну я просто так понял, что сейчас проблемы вызывает как раз жесткая привязка ответа к команде. Т.е. написали команду, получили однозначный (т.е. с учетом текущего внутреннего состояния игры, которое по ходу дела может меняться) ответ.

    А когда есть отдельно действия и отдельно ответы, тут уже привязки никакой нет и в итоге особое шаманство в специфических случаях не требуется. Т.е. у нас есть действие - "открыть холодильник" и есть ответ, который просто пишет содержимое холодильника, не вдаваясь в высокие подробности, в каком контексте это понадобилось. Связываем эти две вещи, и момент решен.
     
    Последнее редактирование: 17 дек 2007
  12. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    The_ShadoW, это я понимаю, просто есть более сложные взаимосвязи между действиями, при которых не достаточно просто знать что лежит в холодильнике, чтобы ответить. Именно поэтому я абстрагируюсь от того, что в холодильнике в действительности что-то лежит и пишу ответы исключительно основываясь на совершенных до этого действиях. Просто пример с холодильником действительно неудачный, его можно решить гораздо более простыми способами. Я же хочу сделать что-то универсальное, ничем не ограниченное.
     
  13. The_ShadoW

    The_ShadoW

    Регистрация:
    4 мар 2007
    Сообщения:
    187
    Dimouse,
    Ну я даже не в состоянии придумать пример "сложных взаимосвязей", которые нельзя разрешить, если мы имеем доступ ко всем игровым локациям (с их текущими свойствами), объектам (с их текущими свойствами) и действиям (с их свойствами, опять же, в т.ч. историей). Тут всё дело разве что в ограничении реализации отдельного типа. Опять же, если на уровне автора сценария для квеста разрешить создание пользовательских свойств для объектов и локаций (а может быть и для действий), и потом дать возможность эти свойства всесторонне проверять и использовать - сложные случаи тут скорее всего отпадут абсолютно любые.
     
  14. Low_Pressure Titanium Helmet of Musicianship owner

    Low_Pressure

    Legacy

    Регистрация:
    1 окт 2005
    Сообщения:
    8.667
    Ошибок не найдено.
    Не очень удобно. Скроллинг листа команд идет как будто это одномерный массив - может его двухмерным сделать (раз уж у нас все равно два "этажа" команд) и добавить скролинг вверх-вниз, от элемента X11 к X21. И еще, в данный момент чтобы от первой команды дойти до последней приходится пролистывать весь список команд - может сделать так, что при нажатии кнопки "влево" на первом элементе, мы переходили бы к последнему? (X21)
     
    Dimouse нравится это.
  15. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    The_ShadoW, история действий понятие размытое. Вот я попытался собственно сделать наиболее как мне кажется удачный пример реализации действий в зависимости от предыдущих действий. Нужно мне это для другой моей игры, как я уже писал. Собственно я уже спрашивал, какие свойства для объектов и локаций так уж необходимы, что без них нельзя обойтись? Я подумал и решил что пример "съедобное-несъедобное" вообще не нужен, так как если ответа на действие съесть нет, то он и есть несъедобный, надо только ответ для такого заранее прописать на уровне движка и все, никаких свойств не нужно.

    Low_Pressure, сделаю вверх-вниз и чтобы переходил с первого на последний. Будет еще скроллинг, когда команд добавится.
     
    Последнее редактирование: 17 дек 2007
    Low_Pressure нравится это.
  16. DAKSnake

    DAKSnake

    Регистрация:
    5 ноя 2006
    Сообщения:
    259
    скрипт выглядит также непонятно как и раньше ) но уже получше.

    The_ShadoW и я, предлагаем универсальный вариант движка. примерно так:
    объект "холодильник" класс "коробка"
    род = м
    описание с макросами
    особые свойства (морозит)
    особые действия
    конец

    объект "сыр" класс "предмет"
    род = м
    описание
    особые свойства (отравлен)
    особые действия (обнюхать, съесть)
    трансформация по "съесть" в "ключ"
    связи = находится_в "холодильник"
    конец

    действие "открыть"
    описание = "Вы открыли %объект"
    изменить_свойства(открыт_закрыт на открыт)
    конец

    ну и т.п.
    чем это хорошо - сохранена гибкость (см. особые свойтсва и действия), есть список стандартных комманд (расширяемый!), которые дейтвуют для всех объектов с определенным свойством (т.е. не придется для них писать повторяющиееся по сути описания), объекты знаю об своих связях (сыр в холодильнике) и при выводе описания движок автоматически напишет что есть внутри [извращенная просьба: а если я захочу положить что-либо в холодильник? при малом количесвте объектов ещё можно прописать все варианты (ага, факториал их будет...), а для большого числа объектов это адский труд], можно реализовать передвижение объектов (подвинуть стол к окну например). ну и вообще все что в голову придет.
    классы определяю часть свойств и действий, которые с ними можно производить. например, коробка умеет открываться и закрываться и содержать что-либо внутри себя, стол (плоскость) может также служить "держателем" объектов как и место под столом, которое есть открытая коробка.

    главное отличие такого подхода от существующих - отсутсвие программирования. получается чисто декларативный язык (он и сейяас декларативный, но вот реализация...)

    ps: в передложенном варианте можно реализовать несколько различных описаний для одинакового действия (для разнообразия текста ;)).
    pps: всегда следует учитывать возможную сложность проекта. много объектов, много разных и однообразных действий, нестандартные ситуации (я хочу запихать кислоту в холодильник и чтобы она там замерзла!). практика показывает, что простые по началу решения перерастают в нечто невообразимое при усложнении проекта.

    совсем ps: а можно разъяснить что значать цыферки перед действиями?
     
    Последнее редактирование: 17 дек 2007
  17. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    Так он вроде не изменился.
    По поводу остального, в целом очень толково, но мне не нравится что действие будет всегда одинаковым для одинаковых типов объектов. Что если я хочу чтобы открыть действовало как-то по-особому на какой-то один объект? А если таких объектов будет большинство? Или вот например действие "морозить", как его прописать, чтобы оно на всех действовало одинаково? Насчет "положить", хороший аргумент, надо подумать (кстати вариантов будет не факториал, а "всего" 2 в степени n). Особое свойство "отравлен" - хорошая идея, при съедании убивает значит, жалко только что таких объектов будет не много, а то имело бы смысл, да. Все это хорошо без конкретики, а как реализовать такое я плохо представляю.

    Из комментов в проге:
    //actions in the scene, until zero (0) as follows:
    //command word obj scene cond_num cond_state res_num res_state inv_to_add state answer
    Т.е. команда, количество слов, объект, номер сцены, условия для выполнения (действия + их состояние), заканчивается двумя нулями, результат (действия + их состояния), заканчивается двумя нулями, добавление предметов в инвентарь (перечисляются их номера), заканчивается одним нулем, состояние в начале, ответ (заканчивается слешем).
     
  18. DAKSnake

    DAKSnake

    Регистрация:
    5 ноя 2006
    Сообщения:
    259
    пример всего

    вот, набрасал грубейшую схему хоть как-то поясняющую описанную ранее методу. разумеется самого интересного там нет ), да и скрипт выглядит ужасно.
     

    Вложения:

    • TeXtory.txt
      Размер файла:
      2,2 КБ
      Просмотров:
      535
    • TeXtory_Script.txt
      Размер файла:
      1,6 КБ
      Просмотров:
      494
    Dimouse нравится это.
  19. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.148
    Игра Simon the Sorcerer 1.5, beta-release для конкурса Иллюзия Выбора, проводимого сайтом old-games.ru. Данная игра позволяет увидеть некоторые возможности моего движка для текстовых игр TDZ. Однако из-за нехватки времени я фактически взялся доделать игру - то есть написать все скрипты и текст, коих получилось почти на 50 килобайт - за три дня. Поэтому текст не слишком разнообразный, литературный и интересный - все было сделано очень быстро, без особых изысков. Поспешность создания текста также сказалась на детальности проработки возможных команд и альтернативных действий, которые не приводят к правильному результату - обычно в таких случаях будет писаться "Непонятная команда". Тем не менее, несмотря на эти очевидные недостатки игры, я искренне надеюсь, что игра Вам понравится и возможно вы ее даже пройдете (это должно быть совсем не сложно)!



    http://text-game.old-games.ru/wp-content/u...4/simontxt1.rar



    Также предлагаю вниманию всех любителей текстовых игр другие игры с конкурса: http://text-game.old-games.ru/?page_id=26



    Победитель конкурса будет выбран путем общего голосования - любой желающий может прислать свои оценки каждой игры по десятибальной шкале на мой адрес: dimouseandzubik(at)rambler.ru. Голоса принимаются до 16 апреля. Если вы кроме оценки хотите написать отзывы об играх - это только приветствуется!



    Внимание! Оценку игры Simon the Sorcerer Textmode делать не надо, но я буду рад услышать комментарии.
     
    kirik-82 и Manif нравится это.
  20. daemolisher

    daemolisher

    Регистрация:
    2 дек 2009
    Сообщения:
    1.704
    наверное, ничего страшного, если я в этой теме прокоментирую игру Cosmic Madness ? :blush:

    никогда не играл в текстовые игры (а может и играл, просто не помню)

    некоторые вещи мне кажутся странными, например:

    1) рамка окна не зафиксирована, её можно потянут мышкой за край и там окажется пустое место, через которое виден рабочий стол

    2) видна консоль
    насколько, помню если собрать в релизе, SDL прячет консольное окошко, и вместо этого выводит все в файлы stdout.txt и stderr.txt

    3) почему бы не дополнять команды Tab'ом - то есть печатаешь 3 первых символа, жмеш Tab и слово пишется полностью

    4) внизу окна, есть команды - выровнять столбиками и без переносов, а то смотрится ужасно;
    и назначить им цифры - сооветственно при нажатии на клавиатуре, команда будет вписываться сразу

    5) еще назначить клавиши:
    открытие помощи - на F1
    инвентарь - на F2
    выход - F10 (но с предупреждением)

    6) хотелось бы видеть команды введенные ранее
    то есть, что бы они оставались в консоли выше

    7) ужасное склонение для команд:
    я не мог сразу догадаться, что вместо идти, надо писать идти на

    8) не хочу склонять слова:
    вместо поговорить с сэмом, должно быть поговорить сэм

    9) сокращенный вариант не всегда работает, хотя не уверен
    всместо осм, приходится писать полностью осмотреть

    10) нельзя удалить слово добавленное пробелом

    11) ощущение, что некоторые объекты вообще не работают
    батарейки не берутся, или их не надо брать? :shok:

    12) вывод предыдущих команд (клавишей вверх)

    и ещё, хотелось бы, чтобы прокрутка в окне работала
    при этом в нижней части оставалась бы видимой командная строка и команды

    и ещё, в .cfg файле есть параметр casual, не могу догадаться на что его можно поменять
    (такие вещи принято указывать прямо в конфиге в виде комментариев)
     
    Dimouse нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление