Damage Modify System

Добавлен , опубликован

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
Так же можно скачать карту пример:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
18
достаточно одной способности и нормальной математики
так же можно делать отрицательный бонус к атаке)
9
Делается это через 10 абил по степеням двойки
32
Ranger21, да да, и жуткие залаги, говорю же больше 15 уровней, УЖЕ ЗАМЕТНЫ ЗАЛАГИ!
Про 10 абил, ну еще может 20?, будет очень интересно, делать их в РО.
22
Ммм, у меня вот больше 15 уровней в способностях, но на лаги никто из тестеров не жаловался.
31
quq_CCCP, лагов нету, если заранее все способности добавить любому юниту (потом его можно удалить).
32
Hellfim, ну я сделал подгрузку, но вот как то я делал карту, Алкоголизм, там вес карты метр, импорт тока иконки и 2 модели по 30 кб, грузилась сек по 40, + тока пикаеш героя залаг секунды (тупо экран виснет), автору пришло в голову сделать по 100 уровней герою, время загрузки куча уровней, поднимает ощутимо... + даже если изначально создать героя с этими абилами (по 100 лв и выше), а потом их давтаь юниту, заметен подлаг (небольшой но есть)...
Интересно кто это минусит, узнать бы чё ему не понравилось?
Или это чувак которому больше делать нечего, он тока минусует чужие труды
38
сабстринг == бесконечные утечки, что мешало использовать деление по модулю?
32
ScorpioT1000, желание сделать быстрее
ну и понятнее, так мне кажется более наглядно для не особо продвинутых, что мы берем из 125 символ 5 и конвертируем его в число 5.
38
Конечно куча ифов и медленных сабстрингов намного быстрее одного A % B == C
32
ScorpioT1000, использовать ModuloReal как то не хотелось, но вскоре я перепишу код и добавлю новых функций...
Если есть идеи делитесь, я не откажусь от полезных советов.
28
а кто знает как сделать чтобы дамаг на 1 удар стал 0
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.