1 (edited by z-Hunter 2013-11-11 15:50:15)

Topic: Переключить INSTEAD в режим use

Как известно, если кликнуть в инвентаре объект (obj), INSTEAD перейдёт в режим "use", то есть поменяет курсор, и даст возможность щёлкнуть на какой-то другой объект. Если ли какой-то способ или хак, чтобы из кода перевести его в этот режим принудительно для какого-то произвольного объекта?

  Поясню на примере. У меня все объекты это menu, при клике на них в сцене или инвентаре, с помощью xact рисуется контекстное меню, наподобие "Взять | Осмотреть | Использовать с....". Хотелось бы, чтобы при выборе пункта меню, Инстед переходил в режим use для этого объекта.
Возможно ли это?

Re: Переключить INSTEAD в режим use

Если задача стоит так, что нужно, чтобы режим use работал не только в инвентаре, но и в сцене - то см. scene_use

3 (edited by z-Hunter 2013-11-11 18:41:03)

Re: Переключить INSTEAD в режим use

Нет, задача состоит совсем не в этом. Есть что-то вроде такого:

instead_version "1.7.0"

require "xact";

cxact = xact( "cxact", 
    function(s, f, o)
        o = stead.ref(o)
        return o.Choices[f](o)
end)

function cmenu(s)
    local txt, fun
    for txt, fun in pairs(s.Choices) do
        p("^> {cxact(", txt, ",", stead.deref(s), "|", txt, "}");    
    end;
end;


book = obj {
    nam = "Книга",
    dsc = "Тут лежит {книжка}",
    act = function(s) cmenu(s) end,
    Choices = {
        ["Взять"] = function(s) p "Вы взяли книжку"; end,
        ["Читать"] = function(s) p "Вы прочитали книжку"; end,
        ["Осмотреть"] = function(s) p "Вы осмотрели книгу"; end
    }
}

main = room {
    nam = "Тест",
    dsc = "Это, так сказать, комната",
    obj = { book };
}

Я хочу сделать menu из obj (чтобы из инвентаря меню выскакивало тоже по первому клику как и в сцене) и  в него для всех объектов добавить пункт "Использовать с..." после выбора которого имитировалось бы поведение Инстеда при клике на obj в инвентаре.

Если это сделать добавив в сmenu строку  p( txtnb("> "), "{"..stead.deref(s).."|Использовать с...}" ); то это не работает. даже если в сцене есть     scene_use = true.

Re: Переключить INSTEAD в режим use

в меню то use то нет? см как сделано в особняке тогда. там режим меняется в зависимости от глагола

5 (edited by z-Hunter 2013-11-12 11:00:05)

Re: Переключить INSTEAD в режим use

В меню как правило всегда будет пункт use. Например:


book = obj {
    nam = "Книга",
    dsc = "Тут лежит {книжка}",
    act = function(s) cmenu(s) end,
    Choices = {
        ["Взять"] = function(s) p "Вы взяли книжку"; end,
        ["Читать"] = function(s) p "Вы прочитали книжку"; end,
        ["Осмотреть"] = function(s) p "Вы осмотрели книгу"; end
        ["Использовать с..."] = function(s) p "Тут INSTEAD должен перейти в режим выбора второго объекта use"; end
    }
}

Сейчас буду смотреть Особняк. Я в него ешё не играл smile

6 (edited by z-Hunter 2014-02-02 16:16:45)

Re: Переключить INSTEAD в режим use

Проблема решена с помощью Петра! Чтобы xact переключал use как объект, он (xact) должен присутствовать в текущей сцене!

instead_version "1.7.0"; require "xact";

cxact = xact( "cxact",  function(s, f, o)
        o = stead.ref(o)
        return o.Choices[f](o)
end)

function cmenu(s)
    local txt, fun
    for txt, fun in pairs(s.Choices) do
        p("^> {cxact(", txt, ",", stead.deref(s), "|", txt, "}");    
    end;
    p( txtnb("> "), "{"..stead.deref(s).."|Использовать с...}" );   
end;


book = obj {
    nam = "Книга", scene_use = true,
    dsc = "Тут лежит {книжка}",
    act = function(s) cmenu(s) end,
    Choices = {
        ["Взять"] = function(s) p "Вы взяли книжку"; end,
        ["Читать"] = function(s) p "Вы прочитали книжку"; end,
        ["Осмотреть"] = function(s) p "Вы осмотрели книгу"; end
    }
}

main = room {
    nam = "Тест", scene_use = true,
    dsc = "Это, так сказать, комната",
    obj = { cxact, book };          -- cxact тоже кладём в сцену, иначе не сработает
}