Re: Вопросы по программированию игр

А нет такого:txtm, есть txtem (выделение курсивом). smile Если это ошибка док-ции, то надо исправить... Лишние кавычки тоже ни к чему.

То-есть:
txtem("Из люка донеслось глухое {рычание}.")

Re: Вопросы по программированию игр

Может, txtem? :-)

Александр Яковлев, к вашим услугам.

Re: Вопросы по программированию игр

спасибо, это работает:

obj = { vway("дальше", txtem("Из люка донеслось глухое {рычание}."), 'main') },

сразу задам сопутствующий вопрос: возможно ли применение форматирования к "длинному" дескриптору сцены, с квадратными скобками который?

Re: Вопросы по программированию игр

Можно.

P.S.
Квадратные скобки это просто вариант " " для многострочных текстовых констант, их можно использовать не только в описании.

Плюс, если у функции 1 текстовой параметр, () можно опускать, например:
txtem("Hello World!") -> txtem "Hello World!" -> txtem [[ Hello World!]] -- одно и тоже. Так как обработчик м.б функцией, то форматирование делается просто:

dsc = function(s)
pn (txtc "Hello World");
pn (txtb "test!");
end

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

Re: Вопросы по программированию игр

Было желание как-то разделить монолог персонажа, и события игры. Вопрос решен, спасибо.

Re: Вопросы по программированию игр

все конечно хорошо, но как вернуть текст обратно в нормальное начертание? потому- что код

-- $Name: test$


main = room {
        replik = {
                [1] = [[Барсик мурлычит у меня за пазухой.]],
                [2] = [[Барсик дрожит у меня за пазухой.]],
                [3] = [[Я чувствую тепло Барсика у себя за пазухой.]],
                [4] = [[Барсик высовывает голову из за пазухи и осматривает местность.]],

        },
        nam = 'комната',
        dsc = function(s)
                if s.r == nil then s.r=1; else s.r=s.r+1; end
                if s.r <= 4 then
                        return s.replik[s.r];
                else
                        objs():del("дальше");
                        objs():add(vway('улица', 'Я увидел {выход}, ', 'sector08'));
                        return;
                end
        end,
        obj = { vway("дальше", "{дальше}.", 'main') },
};

sector08 = room {
        nam = 'улица',
        dsc = 'Я вышел на улицу. Было пустынно',
};

при второй и следующих итерациях неизменно  выводит дескриптор сцены курсивом sad

Re: Вопросы по программированию игр

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

Если это не желательно (хотя у меня не было пока такого замороченного случая:) можно переопределить функцию iface.fmt, которая отвечает за форматирование вывода. Если это будет сложно, я помогу -- но там по-моему 5-6 строк... И как раз логика курсива....

Почему так сделано: курсив -- сигнал что что-то изменилось, чтобы игрок понимал -- нужно прочитать новое состояние игры. Но если это новая сцена -- он и так его читает. В случае же goto на себя -- состояние игры меняется а сцена нет -- движок считает что нужно дать сигнал. Если это кажется неверным -- можно обсуждать поведение будущей версии.

Re: Вопросы по программированию игр

закомментировал строки 1598-1600 в stead.lua

--                              av = txtem(av);
--                              pv = txtem(pv);
--                              r  = txtem(r);

вопрос решен, спасибо за разъяснение.

59 (edited by Odyssey 2010-04-03 20:04:41)

Re: Вопросы по программированию игр

flank'er wrote:

закомментировал строки 1598-1600 в stead.lua

Тут нужно помнить, что stead.lua обычно не распространяется вместе с игрой, поэтому чтобы изменение почувствовали все будущие пользователи, при выпуске игры всё-таки нужно будет переопределить fmt в исходнике игры. Ну, или паковать игру вместе с модифицированной версией instead.

Re: Вопросы по программированию игр

я все понимаю, мой lua пока хромает, публикуя в начале игры

game.iface.fmt = function(параметры)
код
end,

выкидывает ошибку, потом сделаю

Re: Вопросы по программированию игр

Навскидку -- запятая после end не нужна. Она нужна только при перечислении полей таблицы, а здесь -- либо ";", либо ничего.

В любом случае, если возникнут проблемы, можно будет сбросить сюда точное сообщение об ошибке, думаю помощь не заставит себя долго ждать wink

Re: Вопросы по программированию игр

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

-- $Name: test$

iface.fmt = function(self, cmd, st, moved, r, av, objs, pv) -- st -- changed state (main win), move -- loc changed
        local l
        if st and not moved then
            if cmd ~= 'look' and cmd ~= '' then
--                av = txtem(av);
--                pv = txtem(pv);
--                r  = txtem(r);
                if isForcedsc(here()) then
                    l = me():look();
                end
            end
        end
        vv = fmt(cat(par("^^", l, r, av, objs, pv), '^'));
        return vv
end;

main = room {
    replik = {
                [1] = [[Барсик мурлычит у меня за пазухой.]],
                [2] = [[Барсик дрожит у меня за пазухой.]],
                [3] = [[Я чувствую тепло Барсика у себя за пазухой.]],
                [4] = [[Барсик высовывает голову из за пазухи и осматривает местность.]],

        },
    nam = 'спальный отсек',
    dsc = function(s)
                if s.r == nil then s.r=1; else s.r=s.r+1; end
                if s.r <= 4 then 
            return s.replik[s.r];
        else
                        objs():del("дальше");
                        objs():add(vway('улица', 'Я увидел {выход}, ', 'sector08'));
                        return;
                end
        end,
    obj = { vway("дальше", "{дальше}.", 'main') },
};

sector08 = room {
    nam = 'улица',
    dsc = 'Я вышел на улицу. Было пустынно',
};

Всем спасибо.

Re: Вопросы по программированию игр

Во-первых - спасибо за классную машинку! Очен изящно и эффективно. И мне очень нравится.
Во-вторых - и это собсно вопрос - почитал документацию по поводу меню - и ничего не понял...
Вот я хочу добавить в инвентарь предмет имеющий меню - я его должен определить уже не как obj а как menu?
<code>
apple = menu{};
---
inv():add('apple');
</code>
так?
Хорошо. А где я определяю его подменюшные команды и их обработчики?
Я себе представлял нечто следующее (смотри ниже), но как я понимаю это не то, что в документации написано.
Кстати в одном из постов видел что где-то есть примеры, но я не нашел.. Бросьте линк что-ли, добрые люди?
Или это я туториалс недосмотрел до конца?
<code>
--воображаемый интерфейс для меню
apple = menu
{
   obj =
   {
       [1] = cmd('съесть', eat),
       [2] = cmd('выкинуть',throw)
   };
   eat = function()
     -- do something
   end,
   throw = function()
-- do something
   end,
}
</code>

Re: Вопросы по программированию игр

Объект класса menu это просто средство для создания меню. Объект menu в инвентаре и в сцене срабатывает на 1 клик, и это  все. Это базис.

На основании объекта меню нужно писать то, что требуется. В качестве примера -- система меню Зеркала. Она НЕ входит в движок, а написана специально для игры, см actions.lua и menu.lua. Также сюда можно отнести реализацию кармана.

То что делаете вы -- еще один из подходов, его можно запрограммировать на INSTEAD и сделать библиотекой, но новичку это будет сложно. Кстати, в urq такое поведение меню работает из коробки. Там язык специально заточен под такого рода вещи. Плюс он очень прост и идеально подходит для книг-игр и квестов в стиле меню/ветвлений. URQ модуль для INSTEAD позволяет играть и разрабатывать URQ игры.

ИНСТЕД заточен под игры вроде кота, где манипуляции объектами происходит в комбинаторном стиле. Ну или как в ЗЕРКАЛЕ. Для остальных вариантов -- нужно писать свою прослойку/библиотечку. Я мог бы это сделать -- но сейчас занят версией 1.2.0.

Re: Вопросы по программированию игр

Снова простите за нубский вопрос.

palka = obj {
             number = true;
             nam = 'палка',
             dsc = function(s)
                   if not s._seen then
                                      return 'Слева и справа стоят деревья. Рядом с деревьями растут {кусты}.';
                   else   
                                      return 'Слева и справа стоят деревья. Рядом с деревьями растут {кусты осоки}.';
                    end
             end,
             
             act = function(s)
                   if not s._seen then
                                      return 'Скорее всего это осока.';
                   else
                                      if number == true then
                                                        tak ='В кустах вы нашли небольшую палку. Может пригодиться.';
                                                        return number = false;
                                       else                 
                                         
                                                        return 'Там нет ничего интересного';
                                                      
                                      end
                                      
                  
                   end                  
             end,                                          
             inv = 'Небольшая палка. Такой только затылок чесать.',
            
};

Вот этот код не работает. Ругается, что надо if закрыть...Я его вроде закрываю. Если упростить, тогда ругается на запятую в конце.
Вдогонку несколько вопросов smile :
1) Как собственно оформлять вложенные условия?
2) Зачем нужна запятая после некоторых end'ов?

66 (edited by vvb 2010-06-15 22:02:12)

Re: Вопросы по программированию игр

1. я бы поменял number = true; на number = true, (ну пётр может скажет что и напрасно, может можно и так)
2. лучше делать так:
if number then
               tak = 'В кустах вы нашли небольшую палку. Может пригодиться.';
               number = false;
               return number;
3. и если необходимо, чтобы значение number сохранялось, лучше называть его _number или Number.
и обращаться к нему как s._number

Re: Вопросы по программированию игр

Отлично, спасибо)
Одна проблема. Следующий код не выполняется:

act = function(s)
                   if not s._seen then
                                      return 'Скорее всего это осока.';
                   else
                                      if s.Number then
                                                        tak ='В кустах вы нашли небольшую палку. Может пригодиться.';
                                                        s.Number = false;
                                                        return s.Number;
                                                          
                                       else                 
                                         
                                                        return 'Там нет ничего интересного';
                                                      
                                      end
                                      
                  
                   end                  
             end,

Выводит только "Скорее всего это осока."

68

Re: Вопросы по программированию игр

Ну раз всегда срабатывает первое условие, надо полагать, что s._seen ВСЕГДА равно false.
isn't it?
Где-то должно быть присвоение переменной s._seen = true;
Например тут есть: (http://code.google.com/p/instead/wiki/Howto), раздел 5

Re: Вопросы по программированию игр

По моему тут все напутали и путаем все дальше. smile)) Вопрос к автору -- что НУЖНО чтобы сделал код?

70 (edited by Likantrop 2010-06-15 23:15:16)

Re: Вопросы по программированию игр

Ааа...я думал, что _seen - что-то вроде встроенной переменной...
Теперь все хорошо, но палка не берется) Срабатывает дефолтовый гейм акт, s.Number становится false, а палка в инвентарь не ложится.

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

Re: Вопросы по программированию игр

Если я правильно угадал,...

palka = obj {
    nam = 'палка',
    dsc = function(s)
         if not s._seen then
             return 'Слева и справа стоят деревья. Рядом с деревьями растут {кусты}.';
         end
         return 'Слева и справа стоят деревья. Рядом с деревьями растут {кусты осоки}.';
    end,
    act = function(s)
          if not s._seen then
              s._seen = true
              return 'Скорее всего это осока.';
          end
          if have 'palka' then
              return 'У меня уже есть палка.'
          end
          inv():add(s)
      return 'В кустах вы нашли небольшую палку. Может пригодиться.';
    end,
    inv = 'Небольшая палка. Такой только затылок чесать.',
};

но имхо лучше сделать по дргому(у нас тут объект и на сцене и в инвентаре один и тот же smile)), а если вместо inv():add(s) написать take(s) то игрок заберет все кусты)), завтра напишу... Сейчас нет времени

72

Re: Вопросы по программированию игр

Likantrop wrote:

_seen
s.Number

Чтобы самому проще было, предлагаю использовать какой-один из подходов. либо "подчёркивание", либо "большие буквы". на код не повлияет, но смотрится красивее wink
я предпочитаю "_". просто мне сразу видно, что переменная попадёт в сейв гейм. а заглавные буквы я изредка для названия комнат использовал (сейчас вообще не использую).
но это мелочи оформительские...

Re: Вопросы по программированию игр

Спасибо, получилось)
Продолжаем разговор)
Как сделать такое:
1) Есть шоколадка. При щелчке по ней в инвентаре выводится ее описание, при вторичном щелчке (то есть, когда мы  "взяли ее в руки") - удаляется и выводится сообщение, что мы ее съели...
Нашел код из кота с гамбургером (звучит-то как smile, но он немного  не то делает... Как его дополнить, чтобы выводилось описание?

hamb = obj {
    nam = 'гамбургер',
    inv = function()
        inv():del('hamb');
        return 'Я перекусил. Вредная пища...';
    end
};

2) как поместить шоколадку в инвентарь в начале игры? Куда надо писать тег? В конце main.lua написал:

--inv():add('shoko');

Что-то не получается...

Re: Вопросы по программированию игр

Поместить в инвентарь можно так:

inv():add('shoko');

или:

take 'shoko'

или:

take('shoko')

Насчет щелчков. По умолчанию в instead 1 щелчек это использование на что-то - а двойной-й это рассмотреть сам предмет.

То есть это сработает только на 2-й щелчке:

inv = function(s)
        remove(s, me()) -- можно также inv():del(s) и другие варианты
        return 'Я перекусил. Вредная пища...';
end

Если режим использования НЕ нужен, то:

hamb = menu {
    nam = 'гамбургер',
    inv = function(s)
        if s._seen then
                inv():del(s);
                return 'Я перекусил. Вредная пища...';
        end 
        s._seen = true
        return 'Выглядит аппетитно.';
    end 
}
take 'hamb'

Но стоит ли использовать нестандартное решение? smile

Re: Вопросы по программированию игр

Но стоит ли использовать нестандартное решение? smile

Подумал и решил, что действительно не стоит) Спасибо) Скоро будут еще вопросы)