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
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
Вещь, конечно, хорошая, но думаю не многим она пригодится, мне в том числе
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.