Damage Modify System

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

Damage Modify System

Система позволяющая повышать силу атаки юнита на некоторое кол-во единиц, система повышает только зелёную (дополнительную) атаку юнита, от 1 до 1000. Для работы системы необходимы 4 способности, это спеллбук и 3 способности на основе "Предмет: повышение силы атаки", с 11 уровнями у каждой способности...
Инфо-Способностей
Повышение силы атаки(1-10\100\1000)
1 - 0\0\0
2 - 1\10\100
3 - 2\20\200
4 - 3\30\300
5 - 4\40\400
6 - 5\50\500
7 - 6\60\600
8 - 7\70\700
9 - 8\80\800
10 -9\90\900
11 -10\100\1000
Система даёт 3 функции:
function ModifyUnitDamage takes unit WhichUnit, real Damage returns nothing

function UnitDamageIsModified takes unit WhichUnit returns boolean

function FlushDamageModify takes unit WhichUnit returns nothing
Функция ModifyUnitDamage изменяет силу атаки юнита на некоторое число от 0 до 1000.
функция UnitDamageIsModified проверяет изменяли ли мы силу атаки функцией ModifyUnitDamage.
функция FlushDamageModify убирает бонус урона, удаляя способность на основе Спеллбука.
код системы
library DamageModifySystem initializer InitSpellBook
//==================================================================================
//                 Автор quq_CCCP, сделано для XGM.RU
//Даёт функцию "ModifyUnitDamage" чтобы изменить урона юниту,
//функцию "UnitDamageIsModified" чтобы проверить добовляли ли урон юниту функцией "ModifyUnitDamage"
//а так же "FlushDamageModify" чтобы удалить бонус урона и всё что сним связяно у указанного юнита.
//                            >>>ПРЕДЕЛ +1000 ед. УРОНА ЮНИТУ!!!<<<
//Для работы библиотеки необходимы 4 способности, подробнее смотри в Редакторе обьектов...
//==================================================================================
    globals
        //Настройки библиотеки
        private integer DM_SPELLBOOK = 'A000' //Равкод спеллбука с нужными способностями.
        private integer DM_IN_DMG_A = 'A002' //Равкод спосбности на основе 'Altg', имеет 11 уровней даёт урон от 1 до 10
        private integer DM_IN_DMG_B = 'A003' //Тоже самое, только увеличивает урон от 10 до 100
        private integer DM_IN_DMG_C = 'A001' //Тоже самое, только увеличивает урон от 100 до 1000
        private integer MAX_PLAYERS_ALLOVED = 11// Максимум игроков в карте, нужно чтобы запретить им спеллбук.
        //хештаблица, не рекоммендуется изменять!
        private hashtable DM_DATA
    endglobals

    private function InitSpellBook takes nothing returns nothing
        local integer nIndex = 0
        set bj_lastCreatedUnit = CreateUnit( Player( 14 ), 'hfoo', 0.00, 0.00, 0.00 )
        call UnitAddAbility( bj_lastCreatedUnit, DM_IN_DMG_A )
        call UnitAddAbility( bj_lastCreatedUnit, DM_IN_DMG_B )
        call UnitAddAbility( bj_lastCreatedUnit, DM_IN_DMG_C )
        call UnitAddAbility( bj_lastCreatedUnit, DM_SPELLBOOK )
        call RemoveUnit( bj_lastCreatedUnit )
        loop
            exitwhen nIndex > MAX_PLAYERS_ALLOVED
            call SetPlayerAbilityAvailable( Player( nIndex ), DM_SPELLBOOK, false )
            set nIndex = nIndex + 1
        endloop
        set DM_DATA = InitHashtable( )
    endfunction
    
    private function CalcLevel takes real dmg, integer abId returns integer
        local string level = I2S( R2I( dmg ) )
        local integer nlength = StringLength( level )
    
        if abId == DM_IN_DMG_A then
            if nlength == 1 then
                return S2I( SubString( level, 0, 1 ) ) + 1
            elseif nlength == 2 then
                return S2I( SubString( level, 1, 2 ) ) + 1
            elseif nlength == 3 then
                return S2I( SubString( level, 2, 3 ) ) + 1
            elseif nlength == 4 then
                return S2I( SubString( level, 3, 4 ) ) + 1
            endif
        elseif abId == DM_IN_DMG_B then
            if nlength == 2 then
                return S2I( SubString( level, 0, 1 ) ) + 1
            elseif nlength == 3 then
                return S2I( SubString( level, 1, 2 ) ) + 1
            elseif nlength == 4 then
                return S2I( SubString( level, 2, 3 ) ) + 1
            endif
        elseif abId == DM_IN_DMG_C then
            if nlength == 3 then
                return S2I( SubString( level, 0, 1 ) ) + 1
            elseif nlength == 4 then
                return S2I( SubString( level, 0, 2 ) ) + 1
            endif
        endif
        return 1
    endfunction
    
    function UnitDamageIsModified takes unit WhichUnit returns boolean
        return LoadBoolean( DM_DATA, GetHandleId( WhichUnit ), 0 )
    endfunction

    function ModifyUnitDamage takes unit WhichUnit, real Damage returns nothing
    
        if Damage < 0 or Damage > 1000.00 then // проверка на некорректный аргумент Damage
            call BJDebugMsg( "|cffff0000ОШИБКА!|r - невозможно повысить силу атаки на " + I2S( R2I( Damage ) ) + " единиц." )
            return
        endif
        
        if not UnitDamageIsModified( WhichUnit ) then
            call UnitAddAbility( WhichUnit, DM_SPELLBOOK )
            call SaveBoolean( DM_DATA, GetHandleId( WhichUnit ), 0, true )
        endif
        
        call SetUnitAbilityLevel( WhichUnit, DM_IN_DMG_A, CalcLevel( Damage, DM_IN_DMG_A ) )
        call SetUnitAbilityLevel( WhichUnit, DM_IN_DMG_B, CalcLevel( Damage, DM_IN_DMG_B ) )
        call SetUnitAbilityLevel( WhichUnit, DM_IN_DMG_C, CalcLevel( Damage, DM_IN_DMG_C ) )

    endfunction

    function FlushDamageModify takes unit WhichUnit returns nothing
        call UnitRemoveAbility( WhichUnit, DM_SPELLBOOK )
        call FlushChildHashtable( DM_DATA, GetHandleId( WhichUnit ) )
    endfunction
    
endlibrary
Так же можно скачать карту пример:
0
9
12 лет назад
0
В симпле используется такое уже года 2
1
32
12 лет назад
Отредактирован quq_CCCP
1
HeadcrabMD, ну тут нечего нового нету, только все хорошо забытое старое)
Где то на форуме, в библиотеке функций по пойму, была схожая наработка, только там дамаг минимум по 5 был, и там она давала урон на 1 удар, сейчас уже не найдёш, даже жаль что закрыли библиотеку функций. Много там нужного было
0
14
12 лет назад
0
можно было сделать 9 способностей по 1 уровню в каждой, а не 3 способности с 10 уровнями.
1
32
12 лет назад
Отредактирован quq_CCCP
1
Temak1, ну и давать, удалять способность, я от этого ушёл потому что это чревато багом, когда ты прокачиваеш скиллы или напрявляеш способность того юнит которому триггерно добавили скилл то приказ сбивается, у меня только изменяется уровень, поэтому этого нету, и спеллбук тут не случайно..., но слишком много уровней способности, вызывает залаг + увеличивает время загрузки карты...
2
18
12 лет назад
2
достаточно одной способности и нормальной математики
так же можно делать отрицательный бонус к атаке)
3
9
12 лет назад
3
Делается это через 10 абил по степеням двойки
0
32
12 лет назад
0
Ranger21, да да, и жуткие залаги, говорю же больше 15 уровней, УЖЕ ЗАМЕТНЫ ЗАЛАГИ!
Про 10 абил, ну еще может 20?, будет очень интересно, делать их в РО.
0
22
12 лет назад
0
Ммм, у меня вот больше 15 уровней в способностях, но на лаги никто из тестеров не жаловался.
0
30
12 лет назад
0
quq_CCCP, лагов нету, если заранее все способности добавить любому юниту (потом его можно удалить).
2
32
12 лет назад
Отредактирован quq_CCCP
2
Hellfim, ну я сделал подгрузку, но вот как то я делал карту, Алкоголизм, там вес карты метр, импорт тока иконки и 2 модели по 30 кб, грузилась сек по 40, + тока пикаеш героя залаг секунды (тупо экран виснет), автору пришло в голову сделать по 100 уровней герою, время загрузки куча уровней, поднимает ощутимо... + даже если изначально создать героя с этими абилами (по 100 лв и выше), а потом их давтаь юниту, заметен подлаг (небольшой но есть)...
Интересно кто это минусит, узнать бы чё ему не понравилось?
Или это чувак которому больше делать нечего, он тока минусует чужие труды
0
37
12 лет назад
0
сабстринг == бесконечные утечки, что мешало использовать деление по модулю?
0
32
12 лет назад
0
ScorpioT1000, желание сделать быстрее
ну и понятнее, так мне кажется более наглядно для не особо продвинутых, что мы берем из 125 символ 5 и конвертируем его в число 5.
3
37
12 лет назад
3
Конечно куча ифов и медленных сабстрингов намного быстрее одного A % B == C
2
32
12 лет назад
2
ScorpioT1000, использовать ModuloReal как то не хотелось, но вскоре я перепишу код и добавлю новых функций...
Если есть идеи делитесь, я не откажусь от полезных советов.
1
28
11 лет назад
1
а кто знает как сделать чтобы дамаг на 1 удар стал 0
0
14
11 лет назад
0
юзайте поиск: "обнуление урона"
1
5
11 лет назад
1
Вещь, конечно, хорошая, но думаю не многим она пригодится, мне в том числе
Чтобы оставить комментарий, пожалуйста, войдите на сайт.