1. Для общения на форуме, в чате или личной переписке наличие аватара ОБЯЗАТЕЛЬНО!

Вопрос-ответ

Тема в разделе "S.T.A.L.K.E.R.", создана пользователем Доделкин, 8 дек 2010.

  1. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Кто-нибудь в курсе: есть ли возможность по результатам вдумчивого изучения xml потом скриптово добыть какое-нибудь окно, чтобы скриптово же с ним что-нибудь сделать? Скажем, экран ПДА, окно с патронами, индикаторы видимости/слышимости?

    Чтобы, например, изменить им размер, текстуру, и т.д. ТЧ, естественно.

    Никогда этим вопросом не интересовался.
     
  2. basil

    basil Администратор

    1.098
    479
    9 дек 2010
    Мужской
    Ну я точно ничего сказать не могу.:(
     
  3. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Статья, конечно, ничего, но вот было бы интереснее если бы кто-то понимающий на примере, подробно, показал - как добавить свою ветку квестов в игру, ото была бы польза! Я уже который месяц ищу по инету - ничего конкретного, так чтобы от начала и до конца, так, обрывки какие-то. А жаль! ..
     
  4. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    А можно я лучше отвечу на вопрос: "В чем смысл жизни?" Это будет, как бы сказать, менее всеобъемлюще.

    Впрочем, кое-что придумал. Ну вот например, в файл xl_story_l01_escape.script добавляем:
    Код:
    local mushroom_time = -1
    function mushroom_quest_start()
      if mushroom_time == 0 then
        msg( "Эй, Меченый, метнулся-принес мне гриб, живо!", "Сидорович" )
        bind_stalker.task_del( "mushroom_quest_start", 5000 )
      elseif mushroom_time == -1 then
        if math.random() >= 0.99 then
          mushroom_time = math_random( 5, 10 )
          actor:give_info_portion( "mushroom_quest" )
          bind_stalker.task_add( "mushroom_quest_start", 5000, mushroom_quest_start  )
        end
      else mushroom_time = mushroom_time - 1
      end
    end
    теперь в табличку local t_info = {} добавляем:
    { mushroom_quest_start, "agroprom_military_case_done", false, "mushroom_quest" },

    И еще в файл info_l01escape.xml надо добавить собственно <info_portion id="mushroom_quest"></info_portion>

    Квест добавлен. ;)
    Осталось дописать сдачу квеста в диалоги Сидоровичу.

    Оно, конечно, квест странный получился, с другой стороны, не хуже многих. И, да, реально было в полевой ролевухе, только не по Сталкеру, а по Арканару. ;) Только гриб там дон Рэба требовал. Через что в итоге и помер.
    И, да, его вполне можно развить так, как написано в исходной статье. Например, находим гриб, прибегаем к Сидоровичу, а он весь такой удивленный-удивленный... Впрочем, в соли уже было. Только он не гриб хотел, а долг вернуть. А потом удивлялся доверчивости сталкеров ко всяким мошенникам. Или, прибегаем в бункер к Сидоровичу, а он там весь такой удивленный-удивленный... Вообще не разговаривает, а только пузыри пускает...

    upd: дописал функцию, а то меня тут кот отвлекал.
     
    Последнее редактирование модератором: 18 сен 2019
    Баба Яга, basil и yurv3 нравится это.
  5. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Однозначно - спасибо! и, забираю себе в примеры.
    И хотелось бы продолжения банкета, т.е., ещё бы пример - как дописать это всё дело в диалоги Сидоровича, ну, так чтобы пример был полностью цельный, чтоб вопросов не возникало, и чтобы весь пример в одном месте был... :oops:
     
  6. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    Вообще-то я все еще болею, так что звиняйте, ежели что не так (поправлюсь, перепишу то, что выше, избавив от лишнего), но попробую продолжить как получится.

    берем, скажем, config\gameplay\dialogs_escape.xml, и пишем туда:
    <dialog id="escape_trader_mushroom">
    <has_info>mushroom_quest</has_info>
    <dont_has_info>mushroom_quest_done</dont_has_info>
    <phrase_list>

    <phrase id="0">
    <text>А я гриб принес!</text>
    <next>1</next>
    </phrase>

    <phrase id="1">
    <text>Молодец, вот тебе бинтик в награду, и иди себе... Куда хочешь.</text>
    <action>dialogs_l01_escape.mushroom_quest_done</action>
    </phrase>

    </phrase_list>
    </dialog>
    Главное, добавить это не внутрь другого диалога, и не после завершающего тэга (</game_dialogs>)

    Теперь добавим еще одно инфо, которым говорим, что квест сдан, в файл info_l01escape.xml:
    <info_portion id="mushroom_quest_done"></info_portion>

    Выдачу награды в gamedata\scripts\dialogs_l01_escape:
    function mushroom_quest_done()
    relocate_item( false, "mushroom", "out" )
    relocate_item( false, "bandage", in" )
    actor:give_info_portion( "mushroom_quest_done" )
    end

    ну и пропишем сам диалог Сидоровичу в character_desc_escape.xml :
    находим
    <specific_character id="escape_trader" no_random = "1">
    ...
    <start_dialog>escape_trader_start_dialog</start_dialog>
    <actor_dialog>escape_trader_sidor</actor_dialog>
    ...
    дописываем:
    <actor_dialog>"escape_trader_mushroom</actor_dialog>

    Все. Осталось найти гриб, принести Сидоровичу, получить бинтик, и идти себе...

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

    Можно ли обойтись без инфо? Да. См. amk_netpk.get_npc_quest_data() и amk_netpk.set_npc_quest_data(),
    пример с развесистым использованием будет в патче.
    Можно ли обойтись без кучи xml? Тоже да. см. dialogs_bar.informator_info_*()

    2basil: да не такая уж и простыня, чтоб жертвовать читаемостью.
     
    Баба Яга и yurv3 нравится это.
  7. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Вот это дело! Теперь буду пробовать квест сделать свой! :drinks:
     
  8. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Кстати, я тут изучаю Lua на досуге, так вот, вдруг кому пригодится, интересные есть там нюансы и хитрости, помнится, кто-то мне говорил (уже не помню кто), что вот так не правильно переменные объявлять:
    Код:
    for i=1,10 do
      local x = i+1
    end
    а оказалось - что как-раз так и НАДО объявлять, вот цитата из учебника:
    "Поскольку многие языки вынуждают вас объявлять все локальные переменные в начале блока (или процедуры), некоторые считают, что объявлять переменные в середине блока является плохой практикой. В Lua всё как раз наоборот: объявляя переменную, только когда она действительно нужна, вам редко понадобится объявлять ее без инициализирующего значения (и поэтому вы вряд ли забудете ее проинициализироватъ). Более того, вы уменьшаете область видимости переменной, что облегчает чтение кода. Так-же как только блок кода кончится - сборщик мусора удалит переменную и очистит память."
    Вот вам и одна из причин переполнения и утечек памяти в сталкере, а в скриптах полным полно неправильных локальных переменных, которые объявлены по привычке ДО блока кода, и после его выполнения - висят в памяти - хотя уже не нужны. :mda:
    Итак, если вам нужна временная локальная переменная, НЕ ДЕЛАЙТЕ ТАК:

    Код:
    local a
    do
      a = 22 + 1
     -- ...
    end
    -- код кончился, а переменная "а" - осталась
    правильно будет так:
    Код:
    do
      local a = 22+1
      -- ...
    end
     -- блок кончился, память очистилась от переменной "а"
    --------------------------------------
    А вот вам задачка поразмяться, только не спешите исполнять код, подумайте сначала сами.
    Рассмотрите следующий код:
    Код:
    а = {}; а.а = а
    Что будет значением а.а.а.а?
    Какое-либо "а" в этой последовательности как-то отличается от остальных?
    Теперь добавьте следующую строку к предыдущему коду:
    Код:
    а.а.а.а = 3
    т.е. должно получиться так:
    Код:
    а = {}; а.а = а
    а.а.а.а = 3
    Что теперь будет значением а.а.а.а?

    P.S. Забавная штука этот ваш Lua :drinks:
     
    Последнее редактирование: 27 сен 2019
  9. Dennis Chikin

    Dennis Chikin Модератор

    246
    78
    3 мар 2019
    Мужской
    for i=1,10 do local x = i+1 end
    youtu.be/olcoAyW6PNE?t=64 смотреть до 1:40
    В смысле, полно модов, код в которых что-то делает, но результаты недоступны в принципе от слова совсем.
    local x: for ... do ... x = ... end

    а.а.а.а = 3 будет вылет, поскольку a.a.a не определено.
     
  10. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Поддержу традицию
    и тоже отвечу озвучкой из YouTube:
    Смотреть до конца там 5 сек
    :drinks:
    Так о чём это я, а, да,
    речь в моём посте совсем не о "доступности откуда-то", я писал не о тех значениях переменных, которые могут понадобиться в будущем, а о тех, которые нужны, например, только в циклах или функциях, т.е. о временных переменных; вот например, переменная "a" нужна нам только в цикле и больше нигде, пишут так:
    Код:
    local a
    for i=1,10 do
      a = a+1
    end
    и вот "a" висит всё время в памяти, хотя она нам больше не нужна, вообще; а правильно было бы так:
    Код:
    for i=1,10 do
      local a = a+1
    end
    после выхода из цикла "a" автоматически будет уничтожена и память освободиться, или хотя-бы так:
    Код:
    local a -- если уж тут сильно хочется одноразовую переменную объявить
    for i=1,10 do
      a = a+1
    end
    a = nil -- то тогда память освобождаем самостоятельно
    
    и так никому не нужных переменных сотни, а то и тысячи, и вот они висят все в памяти и на протяжении игры накапливаются, накапливаются, а потом - хоп, и одна из причин краха игры.
    Повторюсь, я писал именно о таких переменных, а не о тех, значения которых нужны будут в будущем. :)
     
    Последнее редактирование: 27 сен 2019

Поделиться этой страницей