Изменить максимальные HP юниту

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм

function SetUnitMaxLife takes unit u, real life returns nothing
  local real r = life - GetUnitState(u, UNIT_STATE_MAX_LIFE)
  if r > 0. then
    if r > 1000. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x05)
        call UnitRemoveAbility(u, 'A005')
        set r = r - 1000.
        exitwhen r < 1000.
      endloop
    endif
    if r > 100. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x04)
        call UnitRemoveAbility(u, 'A005')
        set r = r - 100.
        exitwhen r < 100.
      endloop
    endif
    if r > 10. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x03)
        call UnitRemoveAbility(u, 'A005')
        set r = r - 10.
        exitwhen r < 10.
      endloop
    endif
    if r > 1. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x02)
        call UnitRemoveAbility(u, 'A005')
        set r = r - 1.
        exitwhen r < 1.
      endloop
    endif
  else
    if r < -1000. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x09)
        call UnitRemoveAbility(u, 'A005')
        set r = r + 1000.
        exitwhen r > -1000.
      endloop
    endif
    if r < -100. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x08)
        call UnitRemoveAbility(u, 'A005')
        set r = r + 100.
        exitwhen r > -100.
      endloop
    endif
    if r < -10. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x07)
        call UnitRemoveAbility(u, 'A005')
        set r = r + 10.
        exitwhen r > -10.
      endloop
    endif
    if r < -1. then
      loop
        call UnitAddAbility(u, 'A005')
        call SetUnitAbilityLevel(u, 'A005', 0x06)
        call UnitRemoveAbility(u, 'A005')
        set r = r + 1.
        exitwhen r > -1.
      endloop
    endif
  endif
endfunction
Где 'A005' ид спела на основе "Предмет: увеличение запаса здоровья" с уровнями:
1: +0 здоровья
2: -1
3: -10
4: -100
5: -1000
6: +1
7: +10
8: +100
9: +1000
6
32
11 лет назад
6
Куда такая туча циклов и проверок, можно было покороче сделать и без циклов...
6
14
11 лет назад
6
Вот системка попроще =>
Загруженные файлы
1
1
11 лет назад
1
Давно искал эту статью, но из бошки вылетело про медецинский трактат. Спасибо за напоминание. Сделаю за 34 секунды на GUI))
0
11
10 лет назад
0
Да на это и статья не нужна.
2
2
9 лет назад
2
а можно как то без способностей обойтись ? только триггеры
0
25
9 лет назад
0
Для Героя или нет?
0
30
9 лет назад
0
Ratssor, нет
Этот комментарий удален
0
25
9 лет назад
0
Герою можно, действительно, через предметы категории "усиливающие" увеличивать хиты. Если повезёт, то с отрицательным значением книжка Вар не сломает.
А можно давать сразу способность на основе "Талисмана здоровья". Это, кстати, даже с не-Героем прокатит.
7
4
7 лет назад
Отредактирован Singularity
7
Вещь полезная, но её реализация какая-то уж слишком неоптимальная. Измеряли ли Вы вычислительную сложность этого алгоритма? Держу пари, Вы диву дадитесь, сколько Ваша реализация этого метода кушает.
Сразу скажу - я не знаю, провоцирует ли такое спамерское "добавление-удаление" способностей боевой единице утечки памяти, потому что исходный код Варкрафта, увы, это тайна за семью печатями.
Немного истории: Способ модификации максимальных параметров боевой единицы (здоровья и маны) был случайно обнаружен 15 февраля 2006 года пользователем сайта WC3C под ником Blade.dk. Он создавал способность, которая давала 50 здоровья за каждый её уровень всем боевым единицам в радиусе её действия. Для манипуляции максимальным здоровьем боевой единицы использовалась способность, сделанная на базе Life Bonus (Greater).
В процессе разработки оказалось, что при повышении уровня способности, базированной на Life Bonus (Greater), она не добавляла максимальное здоровье, которое должна была.
После тщательной серии проверок выяснилось следующее:
  • При добавлении способности боевой единице она добавляла максимальное здоровье, которое было указано в соответствующем поле для первого уровня способности.
  • При повышении уровня способности она не меняла здоровье вообще.
  • При повышении уровня и последующем удалении способности она уменьшала значение максимального здоровья не на значение, указанное в соответствующем поле для первого уровня способности, а на значение, указанное в соответствующем поле для текущего уровня способности.
В результате Blade.dk сделал систему, которая была доведена до блеска. Её можно найти в этой теме на WC3C.

Полагаю, что эти знания пригодятся Вам при доработке Вашего варианта такой системы.
С искренним пожеланием успеха,
Singularity, 24.06.2017
2
16
7 лет назад
2
не понимая самой сути определения утечек, не нужно искать их повсеместно. Нет, не создает. Ни в понимании жассера, ни в понимании программиста. Тут тысячи карт с таким колчиеством динамических абилок, что повесился бы движок давно.
1
30
7 лет назад
1
Вы диву дадитесь, сколько Ваша реализация этого метода кушает.
Полагаю, что Вами уже был написан и запущен бенчмарк для обсуждаемой системы? Мне действительно хотелось бы ознакомиться с кодом и результатами тестирования различных кейсов.

Не знаю, провоцирует ли такое спамерское "добавление-удаление" способностей боевой единице утечки памяти, потому что исходный код Варкрафта, увы, это тайна за семью печатями.
И да, и нет. Народные умельцы (и из нашего, и из зарубежных комьюнити) неоднократно дизассемблировали игру в поисках наиболее оптимальных решений при написании кода своих карт. К сожалению, все отечественные мастера уже давно отошли от дел, но Вы всегда можете поискать соответствующие треды в разделе Jass на форуме и ознакомиться со многими интересными фактами.

За историческую справку спасибо. Так вышло, что в своё время этот баг я абсолютно случайно открыл самостоятельно :D

Не считаю систему идеальной, но не вижу проблем, если кто-то её использует.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.