28

» WarCraft 3 / Помощь в реализации формулы

А вот сейчас будет пример, где чем больше уровень предмета, тем выше шанс выпадения способности его уровня.
Пусть для каждого предмета уровня m задан шанс выпадения способности уровня m - P_m. Причём для предмета уровня n и 1 данный шанс равен 1 (100%). Пусть также задан P_2 - шанс выпадения способности уровня 2 для предмета уровня 2.
Пусть P_m = P_2 + (1 - P_2) / (n - 2) * (m - 2), m > 1. Тут может быть любая другая формула.
Также верно всё это.
Также суммарный шанс всех способностей равен 1 (100%), причём для предмета уровня m шанс для способностей уровня > m равен нулю. Соотношение шанса способности уровня i <= m и шанса способности уровня j < i одинаково для любого j и i и равно q > 1.
Итого имеем систему уравнений для предмета уровня m.
pm = P_m = P_2 + (1 - P_2) / (n - 2) * (m - 2)  // задано
pm = p1 * q ^ (m - 1)  // геометрическая прогрессия
1 = p1 + ... + pm = (p1 * q ^ m - p1) / (q - 1)  // сумма m членов прогрессии
решение
pm / q ^ (m - 1) = p1
1 = p1 * (q ^ m - 1) / (q - 1)
pm / q ^ (m - 1) = p1
p1 = (q - 1) / (q ^ m - 1)
pm / q ^ (m - 1) = (q - 1) / (q ^ m - 1)
p1 = pm / q ^ (m - 1)
pm * q ^ m - pm = (q - 1) * q ^ (m - 1)
p1 = pm / q ^ (m - 1)
pm * q ^ m - pm = q ^ m - q ^ (m - 1)
p1 = pm / q ^ (m - 1)
pm = pm * q ^ m - q ^ m + q ^ (m - 1)
p1 = pm / q ^ (m - 1)
pm = q ^ m * (pm - 1) + q ^ (m - 1)
p1 = pm / q ^ (m - 1)
q ^ m * (pm - 1) + q ^ (m - 1) - pm = 0
p1 = pm / q ^ (m - 1)
Такое считать лучше не в варе, а тут.
Решения для P_2 = 0.5 и n = 8
Предмет уровня 1
  • P_1 = 1
Предмет уровня 2
  • P_2 = 0.5
  • q = 1
Предмет уровня 3
  • P_3 = 0.58
  • q = 2.075
раскрыть
Предмет уровня 4
  • P_4 = 0.67
  • q = 2.92
раскрыть
Предмет уровня 5
  • P_5 = 0.75
  • q = 4
раскрыть
Предмет уровня 6
  • P_6 = 0.83
  • q = 6
раскрыть
Предмет уровня 7
  • P_7 = 0.97
  • q = 12
раскрыть
Предмет уровня 8
  • P_8 = 1

globals
    constant hashtable Hash = InitHashtable()
endglobals

library ItemAbility initializer init
globals
    constant hashtable Hash = InitHashtable()
endglobals

struct AbilityLevelChances
    static constant integer MaxItemLevel = 10

    private static key ParentKey

    readonly boolean edged
    readonly integer itemid
    readonly integer itemlevel
    readonly integer abilid
    readonly integer pm
    readonly real q
    
    static method create takes integer itemid, integer itemlevel, integer abilid, integer pm, real q returns thistype
        local thistype this = allocate()

        set .itemid = itemid
        set .itemlevel = itemlevel
        set .abilid = abilid
        if itemlevel == 1 or itemlevel == MaxItemLevel then
            set edged = true
            set .pm = 100
            set .q = 1.
        else
            set edged = false
            set .pm = pm
            set .q = q
        endif

        call SaveInteger(Hash, ParentKey, itemid, this)

        return this
    endmethod

    method onDestroy takes nothing returns nothing
        call RemoveSavedInteger(Hash, ParentKey, itemid)
    endmethod

    static method fromItemId takes integer id returns thistype
        return LoadInteger(Hash, ParentKey, id)
    endmethod

    method getChance takes integer abillevel returns real
        if abillevel > itemlevel or (abillevel < itemlevel and edged) then
            return 0.
        elseif abillevel == itemlevel then
            if edged then
                return 1.
            endif
            return pm
        endif

        return pm * Pow(q, abillevel - itemlevel)
    endmethod

    method getRandomLevel takes nothing returns integer
        local real rv
        local real max
        local real min
        local real p
        local integer level = itemlevel
        if edged then
            return level
        endif
        
        set rv = GetRandomReal(0, 100)
        set p = pm
        set max = 100.
        loop
            set min = max - p
            exitwhen level == 1 or (min < rv and rv <= max)
            set level = level - 1
            set p = p / q
            set max = min
        endloop
        return level
    endmethod
endstruct

private function init takes nothing returns nothing
    call AbilityLevelChances.create( /*
        */ 'I000', /*  item ID
        */ 5,      /*  item level
        */ 'A000', /*  ability ID
        */ 75,     /*  P_5
        */ 4.      /*  q
        */ )
endfunction

endlibrary
28

» WarCraft 3 / Помощь в реализации формулы

Пусть есть число maxmin_ratio - соотношение между максимальным и минимальным шансом.
Также суммарный шанс всех способностей равен 1 (100%), причём для предмета уровня m шанс для способностей уровня > m равен нулю. Соотношение шанса способности уровня i <= m и шанса способности уровня j < i одинаково для любого j и i и равно q > 1.
Итого имеем систему уравнений для предмета уровня m.
pm / p1 = maxmin_ratio  // задано
pm = p1 * q ^ (m - 1)  // геометрическая прогрессия
1 = p1 + ... + pm = (p1 * q ^ m - p1) / (q - 1)  // сумма m членов прогрессии
решение
pm / p1 = maxmin_ratio
pm / p1 = q ^ (m - 1)
1 = p1 * (q ^ m - 1) / (q - 1)
maxmin_ratio = q ^ (m - 1)
pm = p1 * q ^ (m - 1)
1 = p1 * (q ^ m - 1) / (q - 1)
q = maxmin_ratio ^ (1 / (m - 1))
pm = p1 * q ^ (m - 1)
1 = p1 * (q ^ m - 1) / (q - 1)
q = maxmin_ratio ^ (1 / (m - 1))
pm = p1 * q ^ (m - 1)
p1 = (q - 1) / (q ^ m - 1)
q = maxmin_ratio ^ (1 / (m - 1))
pm = p1 * q ^ (m - 1)
p1 = (q - 1) / (maxmin_ratio * q - 1)
globals
    constant hashtable Hash = InitHashtable()
endglobals

library ItemAbility initializer init
struct ItemAbilityInfo
    private static key ParentKey

    readonly integer itemid
    readonly integer abilid
    readonly real maxmin_ratio
    
    static method create takes integer itemid, integer abilid, real maxmin_ratio returns thistype
        local thistype this = allocate()
        set .itemid = itemid
        set .abilid = abilid
        set .maxmin_ratio = maxmin_ratio

        call SaveInteger(Hash, ParentKey, itemid, this)
        call SaveInteger(Hash, ParentKey, abilid, this)

        return this
    endmethod

    static method fromObjectId takes integer id returns thistype
        return LoadInteger(Hash, ParentKey, id)
    endmethod

    method getAbilityLevelChance takes integer itemlevel, integer abillevel returns real
        local real q

        if abillevel > itemlevel then
            return 0.
        endif
        if itemlevel == 1 then
            return 1.
        endif

        set q = Pow(maxmin_ratio, 1 / (itemlevel - 1))
        return (q - 1) / (maxmin_ratio * q - 1) * Pow(q, abillevel - 1)
    endmethod
endstruct

private function init takes nothing returns nothing
    call ItemAbility.create( /*
        */ 'I000', /*  item ID
        */ 'A000', /*  ability ID
        */ 1.5 /*  max_p / min_p
        */ )
endfunction

endlibrary

В примере выше, чем больше уровень предмета, тем меньше шанс выпадения способности его уровня.
Предмет уровня 1
  • шанс выпадения способности уровня 1 - 100%
Предмет уровня 2
  • шанс выпадения способности уровня 1 - 40%
  • шанс выпадения способности уровня 2 - 60%
Предмет уровня 3
  • шанс выпадения способности уровня 1 - 27%
  • шанс выпадения способности уровня 2 - 33%
  • шанс выпадения способности уровня 2 - 40%
И так далее.
28

» WarCraft 3 / Помощь в реализации формулы

то есть х=0 будет 4-0=4
Откуда 4, если дан только x?

constant int min = 20
constant int max = 100
constant int iterations = 5
constant real Q = Pow(max / min, 1 / (iterations - 1))

function  some takes int x, int y returns int
	return R2I(min * Pow(Q, y - x) + 0.5)
endfunction
28

» WarCraft 3 / lua-дебаг система для варика существует? +двумерные массивы

Правильный вариант треш.
local we = 0
while we < 5 do
    print('points' .. we)
    we = we + 1
end
А вообще, тут for нужен.
for we = 0, 4 do
    print('points' .. we)
end
28

» WarCraft 3 / lua-дебаг система для варика существует? +двумерные массивы

Ну так цикл всё верно делает. Пока we > 5 делать то-то. Но так как we = 0 < 5, то цикл не выполняется.
28

» WarCraft 3 / Помощь в реализации формулы

На графике я вижу, что функция убывает.
Borodach:
x = 0 return 20
x = 1 return ~25
x = 2 return ~42
x = 3 return ~68
x = 4 return 100
А здесь возрастает

Так что я не понимаю, какую формулу хочет автор.
28

» WarCraft 3 / lua-дебаг система для варика существует? +двумерные массивы

ладно нужно
А таблицу никак не удалить. Она сама удалится, когда не будет содержать в себе нужные объекты.

а может ли таблица хранить несколько значении
Ну как бы да.
lua return можно вернуть несколько значении
Так-то возвращается таблица с возвращёнными элементами.
28

» WarCraft 3 / lua-дебаг система для варика существует? +двумерные массивы

Color = { {},{} } -- > равнозначно Color = { {}=1,{}=2 }
Равнозначный вариант имеет неверный синтаксис.
28

» WarCraft 3 / Дебаггер Lua

Bergi_Bear, так это было для фильтров групп, а не для условий. Это разные вещи. Насколько быстрее - сказать я не могу. Но TriggerEvalute точно быстрее, чем TriggerExecute, ибо второе обнуляет кол-во операций. Влияет ли это на скорость работы триггера во время срабатывания события - тоже вопрос.
28

» WarCraft 3 / Отображение модели в нужной версии WC3

Допустим есть модель, вот она работает в редакторе, а потом просто не работает - и да, именно так все происходит.
Будет работать после первой проверки карты.
Также нужно проверить правильность импорта модели.
28

» WarCraft 3 / Дебаггер Lua

+ доказано что бульехкспры ничуть не быстрее
Где и кем? Я слышал обратное.
28

» WarCraft 3 / lua-дебаг система для варика существует? +двумерные массивы

Далее. Общеизвестно, что нумерация индексов в Lua начинается с 1. А потому
Color = { {},{} }                        
Setting = { {},{} }
Color содержит таблицы в индексах 1 и 2, как и таблица Setting.
Более того, вопросы о массивах уже были. Первый и второй.
28

» WarCraft 3 / lua-дебаг система для варика существует? +двумерные массивы

Мда...
Сколько раз говорить - перед тем, как задать вопрос, посмотрите статьи...
Дебаггер Lua
А также данный вопрос уже спрашивали.
28

» WarCraft 3 / в lua не работают AI нативки

мне кажется или BJ-функции тоже не работают?
Если не работают, значит, ты что-то сделал, что они не работают.
28

» WarCraft 3 / Урон от атрибутов

Можно выдавать инвентарь, давать книги на +урон, забирать ивентарь.