XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
ZeToX2007

offline
Опыт: 7,009
Активность:
Подсчет брони у юнита.
Собственно, в данной нароботке есть функция, которая возврощает броню у юнита.(Real)
Коректно работает если у юнита >= 0 брони... ( так как формула для отрицательной и положительной брони разные !!! )
Обсуждаем, если кто знает формулу подсчёта отр. брони - пишите...
Прикрепленные файлы
Тип файла: w3x GetUnitDef.w3x (13.6 Кбайт, 87 просмотров )
Старый 02.08.2009, 00:57
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Не очень у тебя функция получилась... Я написал такую же но без косяков.
твоя функция
Код:
globals
    constant real Const = 0.06 // Константа, "прирост порчи брони при уроне"
    trigger Def = null
    real  GetUnitDef  = 0// - Бронь юнита
endglobals

function Action_def takes nothing returns nothing
    local real Damage = GetEventDamage()
    if( Damage <= 10)then
    set GetUnitDef =((10 -Damage)/10)/((1-((10-Damage)/10))*Const)
    else
    set GetUnitDef = 0
    endif
endfunction
function InitTrigDef takes unit u returns nothing
    set Def = CreateTrigger(  )
    call TriggerRegisterUnitEvent(Def,u,EVENT_UNIT_DAMAGED)
    call TriggerAddAction(Def, function Action_def )
endfunction

//Функция...
function GetUnitDet takes unit u returns real
    call InitTrigDef(u)
    call UnitAddAbility(u , 'A000' )
    call UnitDamageTarget(u, u,10, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    call DestroyTrigger(Def)
    call UnitRemoveAbility(u,'A000' )
    return GetUnitDef
endfunction


моя функция
Код:
function GetUnitDefence takes unit u returns real
    local real hp = GetUnitState(u, UNIT_STATE_LIFE)
    local real damage
    call UnitDamageTarget( u, u, 10.0, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, null)
    set damage = hp - GetUnitState(u, UNIT_STATE_LIFE)
    call SetUnitState(u, UNIT_STATE_LIFE, hp)
    if damage > 10.0 then
        set damage = 20.0 - damage
        return (damage-10.0)/(damage*0.06)
    endif
    return (10.0-damage)/(damage*0.06)
endfunction


Ты напорол лишнего, определенно.
1) Зачем тебе та абилка? Ты ее создал в РО, настроил, триггерно добавляешь/удаляешь... Нафига???
2) Зачем тебе вызывать триггер на получение урона? Зачем??? Если урон ты наносишь в ф-ии, там и определяй, сколько урона нанеслось! Иначе каждый раз когда юнита ударят, будет высчитываться его дефенс, да и вообще это глупо здесь.
3) Что ето: ((10 -Damage)/10)/((1-((10-Damage)/10))*Const) ??? Ты с математикой не дружишь? Нельзя было упростить эту неразбираемую галиматью до простого (10-Damage)/Damage/Const ?
4) Даже в этом случае думаю, можно было уйти от создания 3-х глобалок...
5) И еще один минус как наработки. Ты не указал как импортировать твою наработку. А ведь там у тебя вызывается способность 'A000' и если ты про нее не напишешь, а юзер просто копирнет код и в его карте уже есть какая-то абилка 'A000', то очень некрасиво может выйти...

Вот, посмотри на приложенную карту, можешь удостовериться, функция работает не хуже твоей =) (броня выписывается, когда кликаешь на юнита)

Кстати, возникла одна идея насчет отрицательных чисел. Если предположить, что в процентном значении уменьшение получаемого урона при +n брони == увеличению получаемого урона при -n брони, то отрицательная броня легко рассчитывается: мы находим симметричное значение полученного урона юнитом относительно наносимого урона (т.е. если мы наносим юниту 100 урона, а он получил 110, то берем вместо этого 90) и рассчитывам броню для этого случая, не забывая сделать число отрицательным =)

В приложенной карте для проверки отрицательных значений выберите паладина и возьмите ему способноть "доспехи веры". Я ее немного подкорректировал, она теперь понижает на первом уровне защиту всех дружественных войск на 3 единицы.
Прикрепленные файлы
Тип файла: w3x JB'sGetUnitDefence.w3x (18.1 Кбайт, 44 просмотров )

Отредактировано Van Damm, 02.08.2009 в 13:29.
Старый 02.08.2009, 12:27
ZeToX2007

offline
Опыт: 7,009
Активность:
Цитата:
Сообщение от JamesBlack
1) Зачем тебе та абилка? Ты ее создал в РО, настроил, триггерно добавляешь/удаляешь... Нафига???

Чтоб юнит НЕУМИРАЛ.

я сейчас поставил виспу 1% нажал на него и он здох и высветилось невенроное количество брони.(КОСЯК ! )
так уж пусть будет так:



Код:
function GetUnitDefence takes unit u returns real
local real hp = GetUnitState(u, UNIT_STATE_LIFE)
local real damage
call UnitAddAbility(u , 'A000' )
call UnitDamageTarget( u, u, 10.0, true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, null)
set damage = hp - GetUnitState(u, UNIT_STATE_LIFE)
call UnitRemoveAbility(u,'A000' )
call SetUnitState(u, UNIT_STATE_LIFE, hp)
if damage > 10.0 then
set damage = 20.0 - damage
return (damage-10.0)/(damage*0.06)
endif
return (10.0-damage)/(damage*0.06)
endfunction


пс: в коде ты забыл захилить дмг.
А вообще способность которая прибовляет хп, очень полезна, с ней более проще и как мне кажется правельней предотвращать дмг и для других похожих целей, поюзай её, будет намного легче..
Старый 02.08.2009, 13:45
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Цитата:
пс: в коде ты забыл захилить дмг.

call SetUnitState(u, UNIT_STATE_LIFE, hp)
А это что?) Возвращает жизни юнита в прежнее положение. А про смерть правда что не учел... Согласен, косяк) Просто лень было разбираться, что твоя абилка делает =)

Насчет отрицательных значений вроде верно работает?

Отредактировано ELDAR, 05.08.2009 в 11:03.
Старый 02.08.2009, 20:27
ZeToX2007

offline
Опыт: 7,009
Активность:
-4 защиты - 22%
+4 защиты + 19%

+6 защиты + 26%
-6 защиты - 31%

собственно вот....

ZeToX2007 добавил:
JamesBlack, и кстати 0.06 - лучше константой сделать, так как не у всех картостоителей она равняется 0.06
Старый 02.08.2009, 21:29
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Цитата:
-4 защиты - 22%
+4 защиты + 19%

+6 защиты + 26%
-6 защиты - 31%

Ты уверен? это пишется -4, +4... По факту +4 это может быть любое число в промежутке [3.5; 4.5), ты где эти цифры брал?

Цитата:
0.06 - лучше константой сделать

Согласен. Только надо ли свою вводить? Разве не лучше использовать DefenseArmor - эта игровая константа, ее и будут скорее всего менять...
Старый 02.08.2009, 22:20
ZeToX2007

offline
Опыт: 7,009
Активность:
Цитата:
Сообщение от JamesBlack
Ты уверен? это пишется -4, +4... По факту +4 это может быть любое число в промежутке [3.5; 4.5), ты где эти цифры брал


Сделал два юнита )) одному дал защиту - 4 другому +4.... формулы разные для положительной и отрицательной.... конечно есть идея, дать на мгновенье юниту + 100 брони и вычисть... но это будет не оч. тру... А пока что я посмотрю закономерность.

Цитата:
Сообщение от JamesBlack
DefenseArmor - эта игровая константа, ее и будут скорее всего

+1
Старый 03.08.2009, 19:12
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Кстати, я тут сам проверил кое-что...
Цитата:
-4 защиты - 22%
+4 защиты + 19%

+6 защиты + 26%
-6 защиты - 31%


У меня получилось наоборот. При полож. броне процент больше, при отриц-й - меньше, например у охотницы при -323 брони -71%, а при +323 брони +95%... Но все равно щас попробую с формулами похимичить, мож что придумаю... догадываюсь что формула есть, просто не хочу искать - во первых так не инересно, а во вторых - лень =)
Старый 04.08.2009, 01:59
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 04:24.