Спасибо большое за ответ. Да, Osillian - это переменная( "Osillian = GetDefenderHero ()" ), а 'Priest' - имя вызванного скриптом AddCreature стека. Функция random присутствует. Остается только странность с отказом героя кастовать Небесный щит на существо. В приложенном ниже скриншоте показываю ошибку, которую выдает консоль, при попытке его скастовать на существо.
Еще возникла проблема с предложенным Вами скриптом. Собственно, ошибка, связанная с этим, тоже присутствует на скриншоте. Вот моя функция random:
Заголовок
local default_state = {
{1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0},
{0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0},
{1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0},
{1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1},
}
function GetPRNGSeed(state)
local col, row = 1, 4
local seed = {0, 0, 0, 0, 0, 0}
for i=1,6 do
local p2 = 1
for j=1,23 do
seed[i] = seed[i] + p2 * (%default_state[row][col] ~= state[row][col] or 0)
p2 = p2 * 2
row = row - 1
if row < 1 then row, col = 4, col + 1 end
if col > 32 then break end
end
if col > 32 then break end
end
return seed
end
function SetPRNGSeed(state, seeds)
state = state or {}
seeds = seeds or {}
for i=1,4 do
if not state[i] then
state[i] = {}
end
for j=1,32 do
state[i][j] = %default_state[i][j]
end
end
local col, row = 1, 4
local si
for i=1,6 do
si = seeds[i] or si
if not si then break end
local si = si
for j=1,23 do
local bit = mod(si, 2)
si = (si - bit) / 2
state[row][col] = state[row][col] ~= bit or 0
row = row - 1
if row < 1 then row, col = 4, col + 1 end
if col > 32 then break end
end
if col > 32 then break end
end
return state
end
function NewPRNG(seeds)
local state = SetPRNGSeed({}, seeds)
local random = function(n, m)
local state = %state
local s
local t = state[4]
for i=1,21 do -- t = t xor (t << 11)
t[i] = t[i] ~= t[i+11] or 0
end
for i=9,32 do -- t = t xor (t >> 8)
t[i] = t[i] ~= t[i-8] or 0
end
state[4] = state[3]
state[3] = state[2]
s = state[1]
state[2] = s
for i=1,32 do -- t = t xor s
t[i] = t[i] ~= s[i] or 0
end
for i=20,32 do -- t = t xor (s >> 19)
t[i] = t[i] ~= s[i-19] or 0
end
state[1] = t
local r = 0
local p = 1
for i=24,1,-1 do
r = r + p * t[i]
p = p * 2
end
r = r / 16777216
if n then
if not m then
n, m = 1, n
end
return n + floor(r * (m - n + 1))
else
return r
end
end
return random, state
end
function InitRandom()
local seed_t = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
local seed = {}
local shift = 0
for side = 0, 1 do
for j, unit in GetCreatures(side) do
local type = GetCreatureType(unit)
local num = GetCreatureNumber(unit)
local x, y = pos(unit)
local n = mod(type, 180) + 180 * (x + 14 * (y + 14 * mod(num, 200)))
shift = shift + 7
for i=1,24 do
local bit = mod(n, 2)
n = (n - bit) / 2
local index = mod(shift + i, 24) + 1
seed_t[index] = seed_t[index] ~= bit or 0
end
end
local x = 0
local p = 1
for i=1,24 do
x = x + p * seed_t[i]
p = p * 2
end
for i=1,12 do
seed_t[i], seed_t[25 - i] = seed_t[25 - i], seed_t[i]
end
seed[side+1] = x
seed[side+3] = x
seed[side+5] = x
end
print('PRNG seed = ' .. seed[1] .. ':' .. seed[2])
random = NewPRNG(seed)
end
А вот скрипт, в котором я его использую:
Заголовок
function DefenderHeroMove (unit)
Timer = Timer+1
for n, creature in GetDefenderCreatures() do
local id = GetCreatureType(creature)
if id == CREATURE_ARCHER then
local targets = GetAttackerCreatures()
chosen_target = targets[random(length(targets)+1)]
end
end
commandShot (creature, chosen_target, nil)
}{0TT@6bI4Здравствуйте
Пара вопросов по скрипту вашему: на поле боя не может быть существа с именем "Priest", равно как и Osillian (если это переменная, в которой хранится верное имя, тогда норм, а если вы забыли кавычки, то читайте дальше)
Все существа имеют составное скриптовое имя вида "координаты+айди+число", и это имя сохраняется в первый аргумент хука. В вашем случае — переменную unit. А "Priest" и "Osillian" на поле боя нет
Напишите хук хода защищающегося героя, внутри сделайте проверку:
for n, creature in GetDefenderCreatures() do
local id = GetCreatureType(creature)
if id == CREATURE_ARCHER then
local targets = GetAttackerCreatures()
chosen_target = targets[random(length(targets)+1]
-- действия со стрелком creature и целью chosen_target
end
end
Функцию random нужно написать заново, так как стандартная не работает. Рандомайзер можно взять из Эха Пустоты от RedHeavenHero, если он не против, или написать самому.