Topic: Порядок расположения частей описания сцены

Привет всем!

Рассмотрим простую Инстед-игру:

instead_version "1.9.1"
if stead.version < "1.5.3" then
    walk = _G["goto"]
    walkin = goin
    walkout = goout
    walkback = goback
end

require "xact"
require "hideinv"
require "para"
require "dash"
require "quotes" 
game.codepage="UTF-8";

game.act = 'Ничего не происходит.';
game.inv = 'Это странная штука.';
game.use = 'Не работает...';

main = room {
    nam = "Стартовая комната",
    dsc = [[Вы в стартовой комнате]],
    obj = { 
        'thing'
    },
    way = {
        vroom('Во вторую комнату', 'room2'),
        vroom('В третью комнату', 'room3')
    }
};

thing = obj {
    nam = "Нечто",
    dsc = "В комнате лежит {нечто}",
};

room2 = room {
    nam = "Комната 2",
    dsc = [[Вы в комнате 2]],
};

room3 = room {
    nam = "Комната 3",
    dsc = [[Вы в комнате 3]],
};

Когда вы её запускаете, Инстед выводит:

Стартовая комната

Во вторую комнату | В третью комнату

Вы в стартовой комнате

В комнате лежит нечто

Возможно ли разместить текст для way-ев не сверху, а снизу, т.е.

Стартовая комната

Вы в стартовой комнате

В комнате лежит нечто

Во вторую комнату | В третью комнату

Также, возможно ли использовать в качестве разделителя между way-ями не |, а перевод строки, к примеру?

Re: Порядок расположения частей описания сцены

Возможно. Надо всего лишь переопределить функцию вывода. Только вот зачем?

Re: Порядок расположения частей описания сцены

По поводу заголовков комнаты есть тема, пользуйтесь поиском, форум для того и существует.
http://instead.syscall.ru/forum/viewtopic.php?id=628

Qui habet aures audiendi, audiat...

Re: Порядок расположения частей описания сцены

skiminok1986, вы о iface.fmt, я правильно понял? Спасибо за наводку, покопаю в этом направлении.

Покопавшись немного в исходниках Инстеда, нашёл ответ на свой второй вопрос:

game.gui.ways_delim = "\n"

Но это было не главное. Больше всего хочется, чтобы ways были внизу.

Зачем это надо? Ну, к примеру, мы хотим написать что-то типа интерактивного рассказа. Да, лучше использовать URQ и QSP, это я уже знаю smile Но мне очень понравилась идея динамического построения текста сцены: dsc сцены + dsc объектов.

ways нужны снизу, так как сначала мы сообщаем читателю некую информацию, рассказываем об объектах в комнате, возможно, он даже будет как-то применять объект на объект и т.д. Далее литературным языком мы говорим о возможных переходах в другие локации. Согласитесь, будет как-то странно читать такое:

Поразмыслив немного, я решил пойти на кухню за ножом
Поразмыслив немного, я решил пойти спать

Вы находитесь в комнате

В комнате стоит стол

На столе лежит яблоко

В iface.fmt пока не нашёл, как выцепить конкретно текст с ways. Нужно как-то использовать параметр cmd?

5 (edited by Antokolos 2013-12-18 12:51:30)

Re: Порядок расположения частей описания сцены

j-maks, спасибо, не успел прочитать ваше сообщение, пока ответ писал.

Однако, та тема о заголовке комнаты, а не о ways.

Заголовок комнаты вверху меня вполне устраивает smile

Убрать отображение ways можно, допустим, так:

iface.ways = function(self, str)
end;

или так

instead.get_ways = function()
end;

Осталось теперь понять, как поставить текст путей в самый конец

Re: Порядок расположения частей описания сцены

Раз это слишком сложно, может сделать иначе? В конце концов, есть vway для таких вещей, с помощью которого это можно сделать красивее и проще.

Re: Порядок расположения частей описания сцены

skiminok1986, я вообще делал такое на xact, не определяя way. Но это и вправду какой-то urq style.

Подумал, что раз у инстеда переходы между комнатами традиционно делаются через ways, то лучше использовать их.

Re: Порядок расположения частей описания сцены

skiminok1986, спасибо за подсказку. Так действительно проще. Жалко только, что way в этом случае всё-таки не используется.

На всякий случай приведу код, который у меня получился:

instead_version "1.9.1"
if stead.version < "1.5.3" then
    walk = _G["goto"]
    walkin = goin
    walkout = goout
    walkback = goback
end

require "xact"
require "hideinv"
require "para"
require "dash"
require "quotes"
game.codepage="UTF-8";

game.act = 'Ничего не происходит.';
game.inv = 'Это странная штука.';
game.use = 'Не работает...';

main = room {
    nam = "Стартовая комната",
    dsc = [[Вы в стартовой комнате]],
    xdsc = [[^^{to_room2|Во вторую комнату}^{to_room3|В третью комнату}]],
    obj = {
        'thing',
        xdsc(),
        xact('to_room2', code[[walk(room2)]]),
        xact('to_room3', code[[walk(room3)]]),
        vway("дальше", "^Ещё во вторую комнату можно перейти {так}.", 'room2'),

    },
};

thing = obj {
    nam = "Нечто",
    dsc = "В комнате лежит {нечто}",
};

room2 = room {
    nam = "Комната 2",
    dsc = [[Вы в комнате 2]],
};

room3 = room {
    nam = "Комната 3",
    dsc = [[Вы в комнате 3]],
};

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

А так получилось именно то, что я хотел: описание сцены, описание предметов, затем ссылки.

Re: Порядок расположения частей описания сцены

конкретно ways поместить внизу не получится, но это можно реализовать в виде модуля, который будет выводить ссылки из way внизу (и не давать эти же ссылки рисовать инстеду), но я этого не буду делать  сейчас. smile

Причины следующие

1) для начала неплохо изучить то, что есть - и написать простую игру подчинившись правилам игры;

2) после 1 появляется понимание почему все сделано так, как сделано, и можно придумать свое (и реализовать) + на этом этапе появляется понимание как работает движок

Размещение выводв в INSTEAD выбрано не случайно - и в дефултовой схеме там все логично, даже прыжок на изменение текста заточен на это косвенно. А новую схему размещения надо еще продумать - убедиться что она логична и вписывается в переходы/лайфметоды и многое другое.

про iface.fmt написано в документации.
ways убрать можно : game.gui.hideeways = true

Если так уж хочется заниматься этими вещами - покажу не реализацию, а демонстрацию:

instead_version "1.9.1"
game.gui.hideways = true
game.forcedsc = true

main = room {
    nam = '1';
    dsc = function(s)
        p "hello1"
        p (stead.me():ways())
    end;
    way = {'main2' };
}

main2 = room {
    nam = '2';
    dsc = function(s)
        p "hello2"
        p (stead.me():ways())
    end;
    way = {'main' };
}

Но я убедительно предлагаю написать игру в стиле INSTEAD.

Re: Порядок расположения частей описания сцены

Еще добавлю.
переходы в инстеде в первую очередь означают переходы между ФИЗИЧЕСКИМИ сценами - грубо говоря как в point & click квестах. Это значит, что игрок привык перемещаться без осмотра сцены - просто я стою на острове и хочу переместиться на берег. тут нет никакой загадки. именно поэтому ways рисуюься сразу под картинкой - в этом случае при перемещениях эти строки не прыгают и не раздражают. я всегда знаю - что вот тут - это я хожу. это удобно.

желание переместить ways вниз означает скорее всего желание использовать ways для перехода в СИТУАЦИИ - это несколько другой стиль игр (ближе к книгам играм

традиционный instead - это моделирование мира как бы, а не описание литературное ситуаций

Re: Порядок расположения частей описания сцены

Еще по коду:

if stead.version < "1.5.3" then
    walk = _G["goto"]
    walkin = goin
    walkout = goout
    walkback = goback
end


можно выкинуть уже smile

Re: Порядок расположения частей описания сцены

Да - еще в догонку. Если переход неочевиден то делаем так.

1) я на кухне вижу {дверь}
2) нажал на {дверь} -- о - она ведет на кухню
3) появился переход На кухню
4) переходим стандартным способом

и в будущем мы уже можем переходить без чтения текста локации которую мы уже видели 15000 раз

Re: Порядок расположения частей описания сцены

Пётр, спасибо за советы и за пример кода тоже!

Попробую написать в стиле INSTEAD smile

Тут такая штука. Возможно, я ещё в мало игр именно на Инстеде играл, но мне показалось, что во многих из них не так много альтернативных сценариев. Т.е. разные игроки проходят квесты в конечном итоге примерно одинаково. Мне именно для этого нужны эти ссылки -- чтобы некую нелинейность ввести. Так и совместно книги писать удобнее. Один автор, к примеру, хочет, чтобы ГГ спас мир, другой -- чтобы разрушил мир. Для нелинейной литературы это не проблема -- пишите один и тот же квест, но с разветвлениями. Чтобы от принятых решений зависело будущее. 28 альтернативных концовок и всё такое.

Правда, конечно, я понимаю, что это тяжело. Тут одну-то историю тяжело написать, чтобы за неё не было стыдно. А уж в случае нескольких... Но если автор не один, то, может быть, жизнь упростится?

Re: Порядок расположения частей описания сцены

по идее линейный сценарий или нет - не влияет на способ переходов. smile
monkey island - линейна - но переходы там не прыгают с места на место smile))
карантин - практически не линейна (симуляция ситуаций) - ways в нем обычный
итд итп
way - это просто инструмент.

Грубо говоря - есть местность состоящая из 60 локаций - эти локации - это ПРОСТРАНСТВО физическое - не ситуации.
А сюжет - он разворачивается в пространстве - и линеен он или нет -- это не связано с пространством.

Re: Порядок расположения частей описания сцены

Опять непонятно. Вместо использования vobj с прозрачной конечной структурой кода зачем-то лепится xact. Рекомендую всё таки сперва ознакомиться с основной документацией, а потом уже смотреть модули.

Re: Порядок расположения частей описания сцены

Antokolos wrote:

Тут такая штука. Возможно, я ещё в мало игр именно на Инстеде играл, но мне показалось, что во многих из них не так много альтернативных сценариев. Т.е. разные игроки проходят квесты в конечном итоге примерно одинаково. Мне именно для этого нужны эти ссылки -- чтобы некую нелинейность ввести. Так и совместно книги писать удобнее. Один автор, к примеру, хочет, чтобы ГГ спас мир, другой -- чтобы разрушил мир. Для нелинейной литературы это не проблема -- пишите один и тот же квест, но с разветвлениями. Чтобы от принятых решений зависело будущее. 28 альтернативных концовок и всё такое.

Если пишется игра, в которой основой основ является перемещение по параграфам, то INSTEAD, пожалуй, один из самых неудачных инструментов. А ежели всё таки переходы по локациям в основе геймплея лежат, то я не понимаю как связаны ways с линейностью.

Про совместное написание согласен. Если пишутся параграфы, то склеить проще будет, но в таких играх вся нелинейность сводится к "пройди по дереву и угадай правильную последовательность переходов".

Повторюсь, пожалуй: INSTEAD создан для моделирования мира с местностью и предметами. Никоим образом это не относится к линейности/нелинейности.

Re: Порядок расположения частей описания сцены

skiminok1986, вот пример кода, показывающий, зачем мне нужен именно xact.

instead_version "1.9.1"

require "xact"
require "hideinv"
require "para"
require "dash"
require "quotes"
game.codepage="UTF-8";

game.act = 'Ничего не происходит.';
game.inv = 'Это странная штука.';
game.use = 'Не работает...';

main = room {
    forcedsc = true,
    nam = "Стартовая комната",
    dsc = [[Вы в стартовой комнате]],
    xdsc = function() 
        p "^^";
        p (key_found and "{to_room2|Во вторую комнату}^" or "^");
        p "{to_room3|В комнату с ключом, сказав волшебное слово}";
    end,
    obj = {
        'thing',
        xdsc(),
        xact('to_room2', code[[walk(room2)]]),
        xact('to_room3', code[[stead.add_var { key_found = true }; walk(room3)]]),
        vway("дальше", "^{В комнату с ключом, не сказав волшебного слова}.", 'room3'),
    },
};

thing = obj {
    nam = "Нечто",
    dsc = "В комнате лежит {нечто}",
};

room2 = room {
    nam = "Комната 2",
    dsc = [[Вы в комнате 2. Вы победили!]],
};

room3 = room {
    nam = "Комната с ключом",
    dsc = [[
      Вы в комнате c ключом. Но переменная key_found будет истиной только если вы прошли по ссылке to_room3.
    ]],
    obj = {
        vway("назад", "^Вы можете вернуться {назад}.", 'main'),
    },
};

Хотя, может быть, с помощью vway так тоже можно. Тогда каюсь. Я в Инстеде действительно новичок.

Re: Порядок расположения частей описания сцены

Собственно, этот пример и показывает суть разговора. То, что написано выше - это стиль QSP/URQ и книг игр. В INSTEAD игры по другому выглядят.

Если бы игра писалась на INSTEAD, то было бы что -то вроде:

1) в комнате делаются объекты дверь (зачем вторая дверь я не понял - но если она нужна - пусть две)
2)  есть объект ключ (где то лежит)
3) при использовании ключа на дверь появляется переход - "в комнату"
4) где-то есть знание - волшебное слово - которое можно добавить в инвентарь
5) при использовании волш словом на дверь - что то происходит (что там по замыслу)

То есть мне кажется что вы собственно вообще не играли в INSTEAD игры smile

В примере выше - это не переходы - это сюжетные действия - нет смысла насиловать инстед для таких игр. Для них лучше AXMA/URQ/QSP - будет проще и понятней.

Но я понимаю, что ваша основная цель - экспорт из вашего конструктора. В этом смысле - похоже сама архитектура конструктора ориентирована на такой тип игр и это нормально -- инстед тут выступает в роли тупо интерпретатора.

Я поэтому и интересовался -- а что если сделать из вашего конструктора конструктор для КВЕСТОВ? smile

Re: Порядок расположения частей описания сцены

Ну можно и vobj, например, заюзать и в act комнаты уже воротить что угодно.

Re: Порядок расположения частей описания сцены


Peter пишет

То есть мне кажется что вы собственно вообще не играли в INSTEAD игры smile

Ну почему? Я прошёл Квантового Кота, начал Особняк, прочитал все квесты из Инстедоз 3 smile
Нет, это очень мало, конечно, но игры такого жанра я хорошо знаю и люблю. Например, мой любимый Dizzy ложится на Инстед-архитектуру на раз. Просто мне кажется, что не всегда нужно такое подробное моделирование мира.

Пример:
Спальня: хозяйка лежит на кровати и решает, какие пирожки испечь. На выбор два варианта: капуста, рыба.
Кухня: она идёт на кухню и печёт пирожки выбранного типа. Текст в dsc кухни строится динамически, к примеру. На или есть две room кухня с разным текстом, не важно. Из кухни можно пойти на улицу.
Улица: она идёт на улицу. В зависимости от того, какие пирожки испекла, сюжет ветвится.

Как это в Инстеде сделать правильно? Добавить в "инвентарь" мысль о типе пирожков? Добавить на кухню объект холодильник, в который положить объекты капуста и рыба? Можно и так, конечно. Ну или, действительно, писать на QSP. Но если я буду писать на QSP, то и плюсами Инстеда воспользоваться не смогу. А плюсов много и все они "вкусные" smile


Peter пишет

Но я понимаю, что ваша основная цель - экспорт из вашего конструктора. В этом смысле - похоже сама архитектура конструктора ориентирована на такой тип игр и это нормально -- инстед тут выступает в роли тупо интерпретатора.

Я поэтому и интересовался -- а что если сделать из вашего конструктора конструктор для КВЕСТОВ? smile

Да, с целью угадали smile Я пытаюсь скрестить ежа с ужом и прикрутить Инстед к архитектуре конструктора. В связи с этим, в конструкторе, я думаю, появятся сущности, которых изначально запланировано не было. Например, предметы, которые лежат в комнатах smile А там и в конструктор для квестов, глядишь, превратим smile

Код я пока открывать стесняюсь, ибо сыроват он ещё smile Да и просто сырую программу в свет выпускать не хочется. Как было написано в подписи у нашего тест-лида: "У вас никогда не будет второго шанса произвести первое впечатление". smile

Re: Порядок расположения частей описания сцены

Например просто дать возможность в игровом мире  испечь два вида пирожков. либо в магазине покупать эти продукты. либо в холодильнике уже лежат. smile

я и не говорю что НАДО так. просто инстед сделан именно для подобных игр. и основные его плюсы в этой области находятся.

Re: Порядок расположения частей описания сцены

Ясно smile

Большое всем спасибо за ответы. Будет над чем подумать smile