Перейти к контенту

Autosave


utak3r

Рекомендуемые сообщения

Здравствуйте! Решил и я поделиться своими экспериментами с автосейвом. Вроде удалось-таки добиться того, чтобы автосейв стал полностью безглючным. Другими словами, все сейвы рабочие и в них сохраняется ВСЯ информация (все нужные поршни, задания, переходы, спавн и прочее).

[spoiler=Как-то так: :) ]Выкинуто сохранение при обновлении задания. Сейвов и так полно - хватит на все случаи. Сейв делается при взятии и сдаче задания. Название файла состоит из заголовка задания, не из первого подзадания, как в оригинале. news_manager.script:

    local news_text_save = game.translate_string(task_title)
    if type == "new" then
        amk.start_timer("autosave", 3, news_text_save)
    elseif type == "complete" then
        amk.start_timer("autosave", 3, news_text_save.." - завершено")
    end

Автосейв перед переходом на локу сделать пока не удается, но похоже, это и не нужно - достаточно того, что есть. Сделан автосейв при использовании ручных телепортов. spawn_level_changer.script:

в описание телепортов добавляем строку autosave с указанием локации, на которую телепортируемся (на примере телепорта Стрелка):

    ["arhara_obman"] = {
        keep = true,
        sjedobniy = true,
        pay = 20000,
        autosave = "l07_military",
        goto_func = {
            "exit_as2"
        }

далее, в функцию teleport_start:

function teleport_start(obj_sect, obj_id, sjeli)
    local sim = alife()
    local actor = db.actor

        -- autosave
        local to_level = teleports[obj_sect].autosave
        if to_level and to_level ~= level.name() then
            u3_utils.savegame_lc(to_level)
        end

........ остальной код

и спавн телепорта выносим в еще один таймер, чтобы сейв успел создаться:

        -- jumpTo(teleports[obj_sect].goto_func[math.random(#(teleports[obj_sect].goto_func))])
        amk.start_timer("teleport_jumpto", 0.2, teleports[obj_sect].goto_func[math.random(#(teleports[obj_sect].goto_func))])

в u3_utils.script пишем функцию:

function savegame_lc(to_level)
    savegame("Телепорт "..game.translate_string(level.name()).." - "..game.translate_string(to_level)..". День "..amk.game_days())
end

которая создает сейв с указанием, откуда и куда телепортировались. Например, если использовать телепорт Стрелка сразу по взятии, в Саркофаге, то будет создан сейв с именем "Телепорт Саркофаг - Армейские Склады. День 23" День - это игровой день нахождения ГГ в зоне.

 

И, наконец, в amk.script пишем наши таймеры:

    func_by_string["teleport_jumpto"] = function (params_string)
        spawn_level_changer.jumpTo(params_string)
    end
    func_by_string["autosave"] = function (params_string)
        if u3_utils.can_save() then
            u3_utils.savegame(params_string)
        else
            start_timer("autosave", 3, params_string)
        end
    end

Обратите внимание, что во второй функции таймер вызывает сам себя. Это нужно, чтобы обойти один редкий, но неприятный момент. В некоторых диалогах поршни и спавн идут после разных фраз. Достоверно известное место в НС - первый диалог с Клыком в пещере на НЗ. Там поршень на задание выдается после последней фразы клыка, когда он посылает гг в варлаб, а переходы спавнятся после ответа гг на эту фразу Клыка. и возникает рандомная пауза между выдачей задания (стартом таймера на автосейв) и спавном переходов. И если автосейв произойдет до того, как гг ответит на фразу Клыка, то, как вы понимаете, переходы еще не заспавнятся и в сейве их не будет. Чтобы обойти эту проблему - автосейв не выполнится, пока диалог не будет закончен. Для этого стоит вызов функции can_save, которая проверяет, можно ли сохраняться. Если нет - то сейв передвигается еще на 3 секунды. И так до тех пор, пока гг не закончит разговор.

В u3_utils.script функция can_save имеет следующий вид:

function can_save() -- не сохраняем во время открытых окон, когда нельзя сделать квиксейв
    return not (db.actor:is_talking() or has_alife_info("ui_car_body") or has_alife_info("ui_inventory") or has_alife_info("ui_pda"))
end

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

Вот вроде и все. По аналогии можно сделать сейв преед/после любого события, в частности, в ОП-2 я сделал сейв после выброса, перед сном и ЧУ.

 

ЗЫ: да, еще один момент: функция формирования списка сейвов в окне загрузки почему-то не любит запятую в имени файла. Она вполне допустима в виндоус, а вот в Сталкере - нет) причем сейв создается с запятой в названии, а вот в списке он обрабатывается криво, причем через раз) Я не стал с этим разбираться, просто нужно выкинуть запятую из имени сейва, и все. Поэтому команды отсева левых символов в u3_utils должны выглядеть так:

        save_param = string.gsub(save_param,"[><|?*/\\,:\"%b/n]","")
        save_param = string.gsub(save_param,"[%%][c][\[][%a%d%p%s]*[\]]","")

Вроде, ничего не забыл)

Надежных вам автосейвов!

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...