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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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 игрока, но константу не обновили
4
28
4 года назад
Отредактирован PT153
4
Уже давно всё придумали. Вот ресурс. Необходимо добавить только детект для версии 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, то объекта нет, потому и уничтожать не нужно.
Этот комментарий удален
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.