1

» WarCraft 3 / Библиотека функций

[QUOTE=ADOLF]оптимизированный вариант? - база данных
начнем с того что если у юнита броня в серьезном минусе и мало хп его просто может убить
[/QUOTE]
Вот именно поэтому нужна строчка
RMaxBJ(1, life + Value*10)
Она не позволит убить юнита при любом кол-ве ХП и отрицательном показателе брони.
На счет оптимизации БД, ваша правда. Но давайте представим, что в карте более 50героев и более 100 предметов. При таком раскладе оче-е-ень трудно учесть все вариации. Так же забивать БД ради одного лишь спелла не совсем правильный подход.
Я не претендую на безупречность этого алгоритма, это далеко не так. Но все же в большинстве случаев, картостроителям будет вполне достаточно этой функции.
З.Ы. Хотелось бы узнать, уж очень стало интересно, зачем нулить входные параметры функции? ([i]set u = null !!![/i])
1

» WarCraft 3 / Библиотека функций

Очень информативный ответ.. А как на счет того чтобы указать где именно, а еще лучше предложить свой более "оптимизированный" вариант. Главное здесь то, что функция определяет код-во брони, остальное, имхо, уже не столь важно.
1

» WarCraft 3 / Библиотека функций

Функция возвращает кол-во брони юнита:
Точность ~ 97%

function UnitArmor takes unit u returns real
    local real Value = 10.00
    local real Factor = 0.0
    local real MHP = 0.0
    local real HP = 0.0
    local real Damage = 0.0
    local real life = GetUnitState(u, UNIT_STATE_LIFE)
    call SetUnitState( u, UNIT_STATE_LIFE, RMaxBJ(1, life + Value*10) )
    set MHP = GetUnitState(u, UNIT_STATE_LIFE)
    call UnitDamageTarget( u, u, Value, true, false, ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
    set HP = GetUnitState(u, UNIT_STATE_LIFE)
    call SetUnitState( u, UNIT_STATE_LIFE, life )
    set Damage = Value + HP - MHP
    set Factor = Damage / Value
    set Factor = (Factor * 0.06) / ( 1 - Factor )
    return Factor
endfunction

function UnitArmorInt takes unit u returns integer
    local real R = UnitArmor(u)
    if ( ModuloReal(R, I2R(R2I(R))) > 0.5 ) then
        return R2I(R) + 1
    endif
    return R2I(R)
endfunction
З.Ы. Была написана для использования в пассивном спелле, когда кол-во дамага наносимого аурой зависело от кол-ва брони.