Вопрос энтузиастам.
Стоит задача, определить в какой версии 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:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
15
4 года назад
1
Надёжнее можно проверять цвет ID игрока 12.
Так как в новом патче больше игроков.
Загруженные файлы
1
32
4 года назад
Отредактирован Берги
1
DarkLigthing, ТОЧНО BJ_Max_SLOT_Player
12 - 126, 24 - рефордж
0
37
4 года назад
Отредактирован ScorpioT1000
0
есть же кейворд native в vjass
объяви нужные нативки 1.32 внутри карты
я так понимаю, главная проблема - это компилятор, а не сама игра. Игра работает в рантайме


хотя в 1.32 будет проблема редекларации
придется весь common.j из 1.32 тащить к себе
0
26
4 года назад
0
А через VersionGet() он не вернёт реф?)))
0
32
4 года назад
0
--  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)
0
22
4 года назад
0
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
0
32
4 года назад
0
Да спасибо, бесполезняк какой-то.
Не вижу минусов у bj_MAX_PLAYER_SLOTS
0
37
4 года назад
0
0
32
4 года назад
Отредактирован Берги
0
ScorpioT1000:
это переходной и не стоит задачи определять этот патч, надо лишь различать 126 и последний 132+
0
22
4 года назад
0
Всем спасибо за ответы. Похоже, малой кровью этого не добиться. С полной подменой common.j (и blizzard.j заодно) надо будет поэкспериментировать.
0
37
4 года назад
Отредактирован ScorpioT1000
0
Bergi_Bear, там 24 игрока, но константу не обновили
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.