Раздел:
Основы
Всем привет, всё ещё вводите длинный код через строку чата? А вы в курсе, что можно вообще ничего не вводить? Прогресс не стоит на месте и между игровыми сессиями данные можно сохранять автоматически (вернее это можно было всегда делать), сейчас на простых примерах я покажу как это делается:
Отступление
Элементарно
Продвинуто
Защищённо
Мультиплеерно

Отступление

Сразу скажу, я не читал аналогичные старые статьи и не работал по ним (ну только с Дата менеджером ), и в целом до материала в этой статье дошёл практически сам и очень давно, а ещё я слишком мало играл в варкрафт и тем более в карты с сейвкодом, например это карты Goblin Survival со времён гарены, помнится надо было находить код в файлах игры и копипастить его в чат варкарфта. Ещё я играл в xgm.guru/p/wc3/darkworldorpg и там тоже надо вводить\копипастить код. И я понимаю, ведь героев то может быть несколько и если делать автосейв, но опять таки мы говорим вообще не об рпг, те кто делают рпг они и так знаю что делают, оставим их там, а мы поговорим про карты любого типа, прогресс можно прикрутить вообще к чему угодно и сейвить практически всё:
  • число игр
  • настройку управления
  • уровни героев
  • предметы
  • состояние фреймов
  • очки
  • можно обмениваться данными между картами для вывода глобальной статистики, как это делает LTW
  • можно делать мультиплеерные кампании на отдельных картах, где происходит авто перенос героев
И продолжать список можно бесконечно, а как же это сделать в рефе и на луа? - да элементарно

Элементарно

Наша задача даже при работе на lua, сформировать вот такой файл на джассе (да на нём родимом )
function PreloadFiles takes nothing returns nothing
	call BlzSetAbilityTooltip ('Agyv',"Тут наш код для передачи данных",0)
endfunction
На самом деле файл может получиться грязным типа вот таким, но не нас это не волнует особо
грязный файл
function PreloadFiles takes nothing returns nothing

	call PreloadStart()
	call Preload( "")
call BlzSetAbilityTooltip ('Agyv',"MTM5NTAw",0)
//" )
	call PreloadEnd( 239.9 )

endfunction
В чём тут 2 фишки: 1, мы записываем наш код в тултип способности, 2 при работе с луа у нас нет ограничений на длину строки, прям нет вообще, совсем нет, лично я проверял 10к символов, это не фишка рефа, а фишка именно луа на рефе, на хайве доводилось найти нужную инфу, если кто-то захочет пруфов - то так и быть я это докажу. На джасе не помню, 1000? Информация обновляется и проверяется.
Это я далеко зашел кажись, откатимся назад, формируем файл в "редакторе код будет выглядеть примерно вот так:
function SaveResult(SaveCode)
    Preload("\")\ncall BlzSetAbilityTooltip ('Agyv',\"" .. SaveCode .. "\",0)" .. "\n//")
    PreloadGenEnd(SavePath)
    PreloadGenClear()
end
Ещё раз, при вызове функции
SaveResult(GameStartCount+1 ) -- где GameStartCount число
Например число игр равное N+1 для каждой игры, например бы делаем соло рпг, и сделали в ней режим НОВАЯ ИГРА ПЛЮС, которая активируется автоматически, и усложняет следующий забег, добавляя реиграбельсти для соло проектов. Или наоборот игра будет упрощаться, если игрок часто проигрывает.
Я походу не могу без отступлений да?.
Ну и чтобы загрузить наш код при старте достаточно вызвать следующую функцию
function InitPreloadStartSimple()
    SavePath = "save\\TestGameStart.txt" --путь до файла что мы формировали
    Preloader(SavePath) --в этот момент данные записываются в имя способности, для каждого игрока свои данные
    GameStartCount = BlzGetAbilityTooltip(FourCC('Agyv'), 0)-- при первом запуска там описание способности
    if tonumber(GameStartCount) then
        -- код может быть числом
        print("Сыграно игр "..GameStartCount)
    else
        print("Первая игра")
        GameStartCount=0
    end
end
Ну и карта пример, каждый раз при рестарте, переменная GameStartCount увеличивается на 1 и мы видим сообщение.
Таким образом мы сделали обрезанный дата менеджер в пару строк, я решил начать с самого простого, потому что эта вещь довольно сложная для понимания, многих дата менеджер отпугивает ещё со времён 2012.
В доказательство что всё работает - смотрим видосик
Вот где смотреть сейв файл Documents\Warcraft III\CustomMapData\
Ну и карта пример, где я собрал всё до кучи
Запомнили? идём дальше
весь код целиком
do
    GameStartCount=0
    local InitGlobalsOrigin = InitGlobals
    function InitGlobals()
        InitGlobalsOrigin()

        TimerStart(CreateTimer(), 1, false, function()
            InitPreloadStartSimple()
            SaveResult(math.floor(GameStartCount + 1))
        end)
    end
end

function InitPreloadStartSimple()
    SavePath = "save\\TestGameStart.txt" --путь до файла что мы формировали
    Preloader(SavePath) --в этот момент данные записываются в имя способности, для каждого игрока свои данные
    GameStartCount = BlzGetAbilityTooltip(FourCC('Agyv'), 0)
    if tonumber(GameStartCount) then
        -- код может быть числом
        print("Сыграно игр "..GameStartCount)
    else
        print("Первая игра")
        GameStartCount=0
    end
end

function SaveResult(SaveCode)
    Preload("\")\ncall BlzSetAbilityTooltip ('Agyv',\"" .. SaveCode .. "\",0)" .. "\n//")
    PreloadGenEnd(SavePath)
    PreloadGenClear()
end

Продвинуто

Статья ещё в процессе производства...
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
32
2 года назад
1
Начало положено, все необходимые материалы для завершения статьи тоже готовы, осталось мне набраться терпения, возможно сделать подстатьями
0
14
2 года назад
0
Полезная статья.
Рекомендую к чтению.
0
37
2 года назад
0
Каким же ломаным языком всё написано, я вот половину не понял, хотя вроде тут понимать то нечего, поработай над подачей материала)
И про локал файлы не рассказал, которые у некоторых отключены и это всё фейлит
0
32
2 года назад
0
ScorpioT1000, Ломанный да, ну я по другому не могу, локал файлы включать не нужно, потому что рефордж сейвит в документы сразу, а не в дирректорию игры
2
37
2 года назад
2
Это в целом даже прикольно, современно, но надо не забывать сам смысл четко и ясно подавать
0
5
2 года назад
0
Сразу предупреждаю, сделать на 1.26a без десинков невозможно. Уже пытался реализовать без десинка и использование mh на 1.26a. Я про мультиплауер, а так в сингле common lets go главное желание.
0
17
2 года назад
0
MaximBit, для того чтобы читать и писать в файл в мультиплеере надо:
  • Делать это локально для каждого игрока;
  • После чтения - синхронизировать данные между всеми игроками.
0
32
2 года назад
0
MaximBit, а тут кто-то говорил за 1.26, зачем вы вообще трогаете этот промежуточный патч?
Я уже давно решил не дописывать статью, унесу это с собой в могилу, а вы и дальше продолжайте десинхать
Чтобы оставить комментарий, пожалуйста, войдите на сайт.