proper70 74 Опубликовано 21 Февраля 2012 Здравствуйте! Решил и я поделиться своими экспериментами с автосейвом. Вроде удалось-таки добиться того, чтобы автосейв стал полностью безглючным. Другими словами, все сейвы рабочие и в них сохраняется ВСЯ информация (все нужные поршни, задания, переходы, спавн и прочее). [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 Поделиться этим сообщением Ссылка на сообщение