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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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
33
ScorpioT1000:
это переходной и не стоит задачи определять этот патч, надо лишь различать 126 и последний 132+
23
Всем спасибо за ответы. Похоже, малой кровью этого не добиться. С полной подменой common.j (и blizzard.j заодно) надо будет поэкспериментировать.
38
Bergi_Bear, там 24 игрока, но константу не обновили
28
Уже давно всё придумали. Вот ресурс. Необходимо добавить только детект для версии 1.32.
ScorpioT1000:
там 24 игрока, но константу не обновили
Всё там обновили, теперь у этой константы не hardcoded значение, а значение из нативки. Для карт, созданных в WE до 1.29, нативка возвращает 12, после - 24.
    // Game constants
    constant integer   bj_MAX_INVENTORY                 =  6
    constant integer   bj_MAX_PLAYERS                   =  GetBJMaxPlayers()
    constant integer   bj_PLAYER_NEUTRAL_VICTIM         =  GetBJPlayerNeutralVictim()
    constant integer   bj_PLAYER_NEUTRAL_EXTRA          =  GetBJPlayerNeutralExtra()
    constant integer   bj_MAX_PLAYER_SLOTS              =  GetBJMaxPlayerSlots()
    constant integer   bj_MAX_SKELETONS                 =  25
    constant integer   bj_MAX_STOCK_ITEM_SLOTS          =  11
    constant integer   bj_MAX_STOCK_UNIT_SLOTS          =  11
    constant integer   bj_MAX_ITEM_LEVEL                =  10
Ответ удалённому комментарию ниже: так как HandleId равно -1, то объекта нет, потому и уничтожать не нужно.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.