Вопрос энтузиастам.
Стоит задача, определить в какой версии Warcraft III запущена карта. И если она запущена в актуальной версии (1.32+), то использовать новую функцию, появившуюся в этой версии. При этом код карты должен компилироваться и на старой (1.26) и на новой (1.32+) версиях.
Для определения версии я пока только придумал использовать следующий код, основанный на том, что раньше Siege Engine требовал 3 пищи, а сейчас 4 пищи:
//===========================================================================
//Узнаём версию игры
//===========================================================================
function IsOld126Version takes nothing returns boolean
	return GetFoodUsed('hmtt')==3 //Самоходная мортира (Siege Engine)
endfunction
Но баланс может поменяться в одной из будущих версий, это выглядит не надёжно.
Для вызова новых функций без потери успешной компиляции в старых версиях можно использовать функцию:
if not(IsOld126Version) then 
	call ExecuteFunc("BlzChangeMinimapTerrainTex")
endif
Но таким образом можно только запустить функции, которые не имеют аргументов.
Вопросы:
  1. Есть ли более надёжный способ узнать версию игры?
  2. Можно ли как-то использовать ExecuteFunc с аргументами?
  3. Можно ли включить в карту каким либо образом описание функции BlzChangeMinimapTerrainTex(string s) без полной подмены файла common.j?

Да. Вызвать новые функции можно. Вот здесь подробнее, как это сделать, на примере задачи по установке preview:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Bergi_Bear:
makkad:
Да. Работает через ExecuteFunc.
А на каком этапе внедрение кода новых патчей происходит? Просто не могу понять как в этом экзекут помогает. Но верю...
Это довольно таки круто
Вроде ничего крутого.... наверное я что-то не то написал. В файлах рефорджа эти функции всегда были, и вот они и запускаются. В 1.26 этих функций нет, и к ним просто код карты просто не обращается.
Конечно, поменять файл миникарты через BlzChangeMinimapTerrainTex в 1.26 не получится. Но если ту же карту запустить в 1.32 то там это прокатит, если придумать как передать аргументы через ExecuteFunc. Функции без аргументов срабатывают.
Думаю, исследователь работу функций типа Preload. Они же работают в 1.26 и 1.32?
29
Плохая идея так определять версии патча. Вот если варик имел бы Lua сценарий с патча 1.26a то проблем бы и таких стараний с костылинрованием на версию не было. Хотя более менее сработало, если была бы функция с самого начала для патча GetVersionPatch. А если был бы lua сценарий с патча 1.26, то ты мог просто проверять по существованию функций. Даже не пришлось бы прибегать в проверки версий. Хотя, ты можешь ещё проверять через GetObjectName(), на наличие добавленных: способностей, усовершенствований или войск; которых нет в 1.26.
32
Если не изменяет память, чтение записи близарды так и не закрыли на 1.31+ и можно все еще ломануть массив, посмотреть какие будут данные на выходе, мемхак на старшие версии где то тут валялся как собственно и на хайве полно было карт на эту тему - определение версии игры.
Ну а аргументы передаешь тупо через глобалки, но полную совместимость ты не получишь, карта будет не полноценной на одной из версий.
15
Надёжнее можно проверять цвет ID игрока 12.
Так как в новом патче больше игроков.
Загруженные файлы
38
есть же кейворд native в vjass
объяви нужные нативки 1.32 внутри карты
я так понимаю, главная проблема - это компилятор, а не сама игра. Игра работает в рантайме


хотя в 1.32 будет проблема редекларации
придется весь common.j из 1.32 тащить к себе
33
--  Game API
---@return version
function VersionGet() end    -- (native)
---@param whichVersion version
---@return boolean
function VersionCompatible(whichVersion) end    -- (native)
---@param whichVersion version
---@return boolean
function VersionSupported(whichVersion) end    -- (native)
23
Bergi_Bear:
--  Game API
---@return version
function VersionGet() end    -- (native)
---@param whichVersion version
---@return boolean
function VersionCompatible(whichVersion) end    -- (native)
---@param whichVersion version
---@return boolean
function VersionSupported(whichVersion) end    -- (native)
Это только, чтобы узнать VERSION_REIGN_OF_CHAOS или VERSION_FROZEN_THRONE
33
Да спасибо, бесполезняк какой-то.
Не вижу минусов у bj_MAX_PLAYER_SLOTS
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.