Форум HeroesWorld-а - Показать сообщение отдельно - Скрипты
Тема: Скрипты
Показать сообщение отдельно
#3707
Старый 11.08.2022, 15:37
  #3707
^
Min_Carolin
 
Аватар для Min_Carolin
📖
Регистрация: 10.07.2018
Сообщения: 25
Регистрация: 10.07.2018
Сообщения: 25
По умолчанию
Re: Скрипты

Спасибо большое за ответ. Да, 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, если он не против, или написать самому.
Миниатюры
Нажмите на изображение для увеличения
Название:  nj5T1wUahwE.jpg
Просмотров: 14
Размер:	760.9 Кбайт
ID:	67818  
Min_Carolin вне форума
Ответить с цитированием