Добрый день.
Не так давно решил попробовать свои силы в автоматизации действий через кликер. Изначально понимал что будут ограничения, но такое ощущение что из за малых знаний, я сам себе ставлю еще больше ограничений.
Хотелось бы услышать от опытных программистов их "лайф хаки" при написании больших скриптов.
Сюда могут относится техники повторного использования кода, хранение глобальных переменных, не однозначное использование стандартных функций.
Пример из того, что меня сейчас смущает.
Описание задачи:
Перед выполнением скрипта, нужно инициализировать несколько переменных, при этом для их инициализации требуется активность окна.
Мое решение:
Вначале пошел в лоб, и в каждом скрипте копировал инициализацию этих переменных, что соответственно не оптимально, так и с увеличением переменных стало откровенно мешать. Сделал скрипт который после инициализации сохраняет структуру в текстовый файл, следующие скрипты проверяют наличие файла, если есть, то используют его данные, если нет, то инициализируют переменные и сами создают этот файл.
Проблема с неудобством использования решилась, но дорабатывать во всех местах при появлении новой переменной то еще удовольствие. А ведь еще есть общие функции для работы с этой структурой переменных, которые тоже приходится просто копировать.
Как итог нашел этот замечательный форум. Узнал что в UO Pilot идет активная доработка с помощью подгружаемых модулей. Возможно кто то поделится опытом написания таковых? Пока этими (LuaJit, LuaPoSh) возможностями не пользовался, но все впереди. Еще думаю попробовать через загрузку скриптов, но пока не нашел подробного описания, как между ними передаются переменные, какое окружение они видят. Так же для меня не понятно что за файл процедур можно открыть, который добавляется 99ым листом (ощущение, что оно как раз должно использоваться для написания общих функций).
Если есть какие то темы, сайты, туториалы, видео именно с разбором особенностей архитектуры UO Pilot, буду рад ссылкам.
Пример кода:
скрипт
Код
--lua
********
-- Сохраняем данные в файл
local file = io.open("uo_data.txt", "w")
if file then
for i = 1, #pers do
if pers[i][4] then
-- Сохраняем имя, хендл и hotkeys
file:write(pers[i][1] .. "|" .. (pers[i][3] or "nil") .. "|")
-- Сохраняем hotkeys в формате "Персонаж:Клавиша,Персонаж:Клавиша"
local hotkeys = {}
for name, key in pairs(pers[i][4]) do
table.insert(hotkeys, name .. ":" .. key)
end
file:write(table.concat(hotkeys, ",") .. "\n")
end
end
file:close()
log("Данные сохранены в uo_data.txt")
else
log("Ошибка: Не удалось создать файл")
end
********************
-- Загружаем данные из файла
local file = io.open("uo_data.txt", "r")
if file then
for line in file:lines() do
local name, handle, hotkeys_str = line:match("(.+)|(.+)|(.+)")
-- Находим персонажа в массиве
for i = 1, #pers do
if pers[i][1] == name then
-- Восстанавливаем хендл (если не "nil")
if handle ~= "nil" then
pers[i][3] = tonumber(handle)
end
-- Восстанавливаем hotkeys
if hotkeys_str ~= "" then
for pair in hotkeys_str:gmatch("([^,]+)") do
local char, key = pair:match("(.+):(.+)")
pers[i][4][char] = tonumber(key)
end
end
break
end
end
end
file:close()
else
--инициализируем структуру и сохраняем ее в файл
****************************************
end
*********************************
--пример общей функции для работы со структурой
-- Функция для получения горячей клавиши выбора target персонажа из current персонажа
local function getHotkeyForTarget(currentChar, targetChar)
-- Находим запись current персонажа
for i = 1, #pers do
if pers[i][1] == currentChar then
-- Проверяем, есть ли у него таблица горячих клавиш
if pers[i][4] and type(pers[i][4]) == "table" then
-- Ищем targetChar в его таблице горячих клавиш
return pers[i][4][targetChar]
end
break
end
end
return nil -- Если не найдено
end