Эта" статья" рассчитана на тех, кто уже умеет передавать данные в открытом виде из одной сессии в другую и хочет их закодировать, не знаю чем там кодировали джассеры в 2005, но сейчас я предлагаю это делать вот так вот:
b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

-- encoding

function enc(data)
    return ((data:gsub('.', function(x)
        local r, b = '', x:byte()
        for i = 8, 1, -1 do
            r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
        end
        return r;
    end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then
            return ''
        end
        local c = 0
        for i = 1, 6 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
        end
        return b:sub(c + 1, c + 1)
    end) .. ({ '', '==', '=' })[#data % 3 + 1])
end

-- decoding
function dec(data)
    data = string.gsub(data, '[^' .. b .. '=]', '')
    return (data:gsub('.', function(x)
        if (x == '=') then
            return ''
        end
        local r, f = '', (b:find(x) - 1)
        for i = 6, 1, -1 do
            r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')
        end
        return r;
    end)        :gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then
            return ''
        end
        local c = 0
        for i = 1, 8 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
        end
        return string.char(c)
    end))
end
Это я просто загугнил с интернете Base64+ lua, ближе к сути, весь наш код может представлять из себя набор произвольных данных перечисленных через запятую или другой разделитель, и например выглядеть вот так:
"12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"
Где:
12341234 - id героя
0 - число квестов
40 - число спасённых
26648 - количество опыта
10000000 - золото
111 - ид предмета в слоте 1
222 - ид предмета в слоте 2
333 - ид предмета в слоте 3
И так далее, и нам надо это всё закодировать, чтобы "умный" игрок не нарисовал сам себе золота и не выдал предметы
Таким образом, применив кодирование и выполнив вот такой код
print(enc("12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"))
Мы увидим вот такой результат
MTIzNDEyMzQsMCw0MCwyNjY0OCwxMDAwMDAwMCwxMTEsMjIyLDMzMywxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCww
Можно ещё разделителей наставить, но это уже для удобства
Делаем декодирование, чтобы проверить, что функция действительно рабочая. Как видите всё ок
Вот вам ссылка на сервис и сам код, чтобы поиграть и проверить как тут всё работает
код
b = ""..'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

-- encoding

function enc(data)
    return ((data:gsub('.', function(x)
        local r, b = '', x:byte()
        for i = 8, 1, -1 do
            r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
        end
        return r;
    end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then
            return ''
        end
        local c = 0
        for i = 1, 6 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
        end
        return b:sub(c + 1, c + 1)
    end) .. ({ '', '==', '=' })[#data % 3 + 1])
end

-- decoding
function dec(data)
    data = string.gsub(data, '[^' .. b .. '=]', '')
    return (data:gsub('.', function(x)
        if (x == '=') then
            return ''
        end
        local r, f = '', (b:find(x) - 1)
        for i = 6, 1, -1 do
            r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')
        end
        return r;
    end)        :gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then
            return ''
        end
        local c = 0
        for i = 1, 8 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
        end
        return string.char(c)
    end))
end

print(enc("12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"))
print(dec("MTIzNDEyMzQsMCw0MCwyNjY0OCwxMDAwMDAwMCwxMTEsMjIyLDMzMywxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCww"))
Но это всё полная ерунда, потому что декодирование слишком простое и + оно будет одинаковым для других игроков, добавим в алфавит заранее придуманное секретное слово или ник игрока
Чтобы у нас получилось примерно вот так:
b = "123"..'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
ну и ещё раз выполним, как видите данные те же, а конечный код другой
JQFwKABvJwNpJ3txJ3tvKgVxL3tuJA1tJA1tJ3tuJQBpJgFvIAJwJvtuIABpJPtuIABpJ3ttIA1pJ3ttIA1pJPtuIA1pJ3ttIABpJ3tt
Ну и проверяем, что в обратную сторону ничего не сломалось
print(enc("12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"))
print(dec("JQFwKABvJwNpJ3txJ3tvKgVxL3tuJA1tJA1tJ3tuJQBpJgFvIAJwJvtuIABpJPtuIABpJ3ttIA1pJ3ttIA1pJPtuIA1pJ3ttIABpJ3tt"))
Результат:
JQFwKABvJwNpJ3txJ3tvKgVxL3tuJA1tJA1tJ3tuJQBpJgFvIAJwJvtuIABpJPtuIABpJ3ttIA1pJ3ttIA1pJPtuIA1pJ3ttIABpJ3tt
12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0
Можно запутывать вообще иначе, но я как бы не копал в эту область, так же стоит не забыть сделать проверку, на то что ваш сейв код не сломан.
В любом случае, продвинутый мамкин хацкер всегда сможет зареверсить вашу карту, и наболтать себе статов и или стать лидером в любой таблице. Но среднестатистический игрок не будет заморачиваться, так что возможно хватит и простого Base64
`
ОЖИДАНИЕ РЕКЛАМЫ...
38
Можно было просто контрольную сумму от тех же данных написать
38
Bergi_Bear, любая хеш сумма от строки с чем-то, привязанным к игроку + какая-то константа в коде карты
Вот тут подробно описал: xgm.guru/p/100/Raznoobrazie-saveload-koda-5xw
6
Ранее у кодов была еще одна задача - это сжатие. В данном случае, как я вижу, эта задача не ставилась. Тогда можно было просто записать все числа через запятую и в конце добавить, как советовалось выше, контрольную сумму.
33
BaHeK, раньше да, сейчас в рефе) нет никаких ограничений на длину строки для прелоада, да и код не нужно вводить руками или копипастить, красота
27
лучше пихать не в статью, а в алгоритмы. ну короче, статей по варкрафту так много
Чтобы оставить комментарий, пожалуйста, войдите на сайт.