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

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

Закрытая тема
 
DaeDR

offline
Опыт: 7,979
Активность:
Hatsume_Hate, Да да, слегка запутался вот вроде норм:
» code
function PhysStrikesMechanic takes unit uCaster, unit uTarg returns nothing
    local integer Dispersion
    local integer FinalDispersion
    local integer PAtk
    local integer Accuracy
    local integer Random
    local integer EvadeChance
    local integer ParryChance
    local integer BlockChance
    local integer PDef
    local integer Critical
    local integer CritChanceRed
    local integer CritChance
    local integer FinalDmg
    local boolean Def = false
    local boolean Text1 = false
    local texttag text
    local boolean b = IsUnitType(uCaster, UNIT_TYPE_HERO)
    if b then
        // ====
        if GetSpellAbilityId() == 'A000' then
            set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *20)
        else
        if GetSpellAbilityId() == 'A002' then
            set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *12)
        else
        if GetSpellAbilityId() == 'A003' then
            set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *17)
        endif
        endif
        endif
        set FinalDispersion = GetRandomInt ((-Dispersion), (Dispersion))
        // ====
        set PAtk = (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] + FinalDispersion)
        set CritChance = udg_CritChance[GetPlayerId(GetOwningPlayer(uCaster))+1]
        set CritChanceRed = udg_CritChanceRed[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
        // ====
        if GetSpellAbilityId() == 'A000' then
            set Dispersion = (((GetUnitAbilityLevel(uCaster, 'A00E') * 80) / 100) * 20)
        else
        if GetSpellAbilityId() == 'A002' then
            set Dispersion = (((GetUnitAbilityLevel(uCaster, 'A00E') * 80) / 100) * 20)
        else
        if GetSpellAbilityId() == 'A003' then
            set Dispersion = (((GetUnitAbilityLevel(uCaster, 'A00E') * 80) / 100) * 20)
        endif
        endif
        endif
        set FinalDispersion = GetRandomInt ((-Dispersion), (Dispersion))
        // ====
        set PAtk = ((GetUnitAbilityLevel(uCaster, 'A00E') * 80) + FinalDispersion)
        set CritChance = GetUnitAbilityLevel(uCaster, 'A00H') * 8
        set CritChanceRed = GetUnitAbilityLevel(uTarg, 'A00D') * 8
    endif
    set CritChance = CritChance - CritChanceRed
    if CritChance <= 0 then
        set CritChance = 1
    endif
    set Critical = GetRandomInt (1, 100)
    if Critical <= CritChance then
        if GetSpellAbilityId() == 'A000' then
            set PAtk = R2I ( PAtk * 2.2)
        endif
        if GetSpellAbilityId() == 'A002' or GetSpellAbilityId() == 'A003' then
            set PAtk = R2I ( PAtk * 1.8)
        endif
    endif
    local boolean b2 = IsUnitType(uTarg, UNIT_TYPE_HERO)
    if b2 then
        set PDef = udg_PhysDef[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
        set PDef = GetUnitAbilityLevel(uTarg, 'A006') * 80
    endif
    set FinalDmg = PAtk - PDef
    if FinalDmg <= 0 then
        set FinalDmg = 1
    endif
    if Def ==  false then
        if b2 then
            set Accuracy = udg_Accuracy[GetPlayerId(GetOwningPlayer(uCaster))+1]
            set EvadeChance = udg_Evade[GetPlayerId(GetOwningPlayer(uTarg))+1]
        else
            set Accuracy = GetUnitAbilityLevel(uTarg, 'A00I') * 80
            set EvadeChance = GetUnitAbilityLevel(uTarg, 'A008') * 80
        endif
            set EvadeChance = R2I ((EvadeChance - Accuracy) * 0.1)
        if EvadeChance <= 5 then
            set EvadeChance = 5
        endif
        if EvadeChance >= 40 then
            set EvadeChance = 40
        endif
            set Random = GetRandomInt (1, 100)
        if Random <= EvadeChance then
            set FinalDmg = 0
            call CreateTextTagUnitBJ( "Уклон!", uTarg, 0, 10, 100.00, 100.00, 100.00, 0 )
            set text = bj_lastCreatedTextTag
            set Text1 = true
            set Def = true
        endif
    endif
    if Def ==  false then
        if b2 then
            set ParryChance = udg_Parry[GetPlayerId(GetOwningPlayer(uTarg))+1]
        else
            set ParryChance = GetUnitAbilityLevel(uTarg, 'A009') * 80
        endif
            set ParryChance = R2I ((ParryChance - Accuracy) * 0.1)
        if ParryChance <= 5 then
            set ParryChance = 5
        endif
        if ParryChance >= 45 then
            set ParryChance = 45
        endif
            set Random = GetRandomInt (1, 100)
        if Random <= ParryChance then
            set FinalDmg = (FinalDmg - ((FinalDmg / 100) * 45))
            call CreateTextTagUnitBJ( ("|c005FFFFFПарир.!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
            set text = bj_lastCreatedTextTag
            set Text1 = true
            set Def = true
        endif
    endif
    if GetUnitAbilityLevel(uTarg, 'A00G') == 2 and Def == false then
        if b2 then
            set BlockChance = udg_Block[GetPlayerId(GetOwningPlayer(uTarg))+1]
        else
            set BlockChance = GetUnitAbilityLevel(uTarg, 'A00A') * 80
        endif
            set BlockChance = R2I ((BlockChance - Accuracy) * 0.1)
        if BlockChance <= 5 then
            set BlockChance = 5
        endif
        if BlockChance >= 50 then
            set BlockChance = 50
        endif
            set Random = GetRandomInt (1, 100)
        if Random <= BlockChance then
            set FinalDmg = (FinalDmg - ((FinalDmg / 100) * 70))
            call CreateTextTagUnitBJ( ("|c0089ABFFБлок!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
            set text = bj_lastCreatedTextTag
            set Text1 = true
            set Def = true
        endif
    endif
    call UnitDamageTarget(uCaster, uTarg, I2R(FinalDmg), true, false, ATTACK_TYPE_CHAOS ,  DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    if Critical <= CritChance and Text1 == false then
        call CreateTextTagUnitBJ( ("|c00FFFF00Крит!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
        set text = bj_lastCreatedTextTag
        set Text1 = true
    endif
    if Text1 ==  false then
        call CreateTextTagUnitBJ( I2S(FinalDmg), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
        set text = bj_lastCreatedTextTag
        set Text1 = true
    endif
    call SetTextTagVelocityBJ( text, 64, ( GetUnitFacing(uCaster)) )
    call SetTextTagPermanentBJ( text, false )
    call SetTextTagLifespanBJ(text,2)
    call SetTextTagFadepointBJ(text,0.0)
    set uTarg = null
    set uCaster = null
    set text = null
endfunction
DaeDR добавил:
Делая такую систему, надо хорошо все продумать. Иначе потом сложно будет что-либо переделывать.
Старый 13.04.2012, 18:53
Hate
конь вакуумный
offline
Опыт: 43,030
Активность:
уже выглядит так
» арр
function PhysStrikesMechanic takes unit uCaster, unit uTarg returns nothing
    local integer Dispersion
    local integer FinalDispersion
    local integer PAtk
    local integer Accuracy
    local integer Random
    local integer EvadeChance
    local integer ParryChance
    local integer BlockChance
    local integer PDef
    local integer Critical
    local integer CritChanceRed
    local integer CritDmgRes
    local integer CritChance
    local integer FinalDmg
    local boolean Def = false
    local boolean Text1 = false
    local boolean A = IsUnitType(uCaster, UNIT_TYPE_HERO)
    local boolean B = IsUnitType(uTarg, UNIT_TYPE_HERO)
    local texttag text
    // Two-handed weapon dispersion (20%)
 if GetSpellAbilityId() == 'A000' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *20)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 20)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
 endif
    // One-handed weapon dispersion (12%)
 if GetSpellAbilityId() == 'A002' then
    if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *12)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 12)
    endif
        set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
 endif
    // Ranged weapon dispersion (17%)
    if GetSpellAbilityId() == 'A003' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *17)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 17)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
    endif
    if A then
    // Pure dmg + dispersion
        set PAtk = (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] + FinalDispersion)
        set CritChance = udg_CritChance[GetPlayerId(GetOwningPlayer(uCaster))+1]
        else
        set PAtk = ((GetUnitAbilityLevel(uCaster,'A00E') * 80) + FinalDispersion)
        set CritChance = GetUnitAbilityLevel(uCaster,'A00H') * 8
    endif
 if B then
 // Critical Chance Reduction and Critical Damage Reduce
    set CritChanceRed = udg_CritChanceRed[GetPlayerId(GetOwningPlayer(uTarg))+1]
    set CritDmgRes = udg_CritDmgRed[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set CritChanceRed = GetUnitAbilityLevel(uTarg,'A00D') * 8
    set CritDmgRes = GetUnitAbilityLevel(uTarg,'A00C') * 8
 endif
 // Final Critical Chance
    set CritChance = CritChance - CritChanceRed
 if CritChance <= 0 then
    set CritChance = 1
 endif
    set Critical = GetRandomInt (1, 100)
 if Critical <= CritChance then
 // Critical Hit
   if GetSpellAbilityId() == 'A000' then
   // One-handed Weapon Critical Modifier and Critical Damage Reduce
    set PAtk = R2I (( PAtk * 2.2) - CritDmgRes)
    endif
    if GetSpellAbilityId() == 'A002' or GetSpellAbilityId() == 'A003' then
    // Two-handed and Range Weapon Critical Modifier and Critical Damage Reduce
    set PAtk = R2I (( PAtk * 1.8) - CritDmgRes)
   endif
  endif
    if B then
    // Physical Defence Define
    set PDef = udg_PhysDef[GetPlayerId(GetOwningPlayer(uTarg))+1]
    // Evade Define
    set EvadeChance = udg_Evade[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set PDef = GetUnitAbilityLevel(uTarg,'A006') * 80
    set EvadeChance = GetUnitAbilityLevel(uTarg,'A008') * 80
    endif
    set FinalDmg = PAtk - PDef
    // Physical Defence Dmg Cutting
    if FinalDmg <= 0 then
    set FinalDmg = 1
    endif
    if Def ==  false then
  if A then
    // Accuracy Define
    set Accuracy = udg_Accuracy[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set Accuracy = GetUnitAbilityLevel(uCaster,'A00I') * 80
  endif
    set EvadeChance = R2I ((EvadeChance - Accuracy) * 0.1)
  if EvadeChance <= 5 then
  // Min Evade limit
    set EvadeChance = 5
  endif
  if EvadeChance >= 40 then
  // Max Evade limit
    set EvadeChance = 40
  endif
    set Random = GetRandomInt (1, 100)
  if Random <= EvadeChance then
  // Evade
    set FinalDmg = 0
    set text = CreateTextTagUnitBJ( "Уклон!", uTarg, 0, 10, 100.00, 100.00, 100.00, 0 )
    set Text1 = true
    set Def = true
 endif
endif
if Def ==  false then
   if B then
    // Parry Define
    set ParryChance = udg_Parry[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set ParryChance = GetUnitAbilityLevel(uCaster,'A009') * 80
   endif
    set ParryChance = R2I ((ParryChance - Accuracy) * 0.1)
   if ParryChance <= 5 then
    set ParryChance = 5
   endif
   if ParryChance >= 45 then
    set ParryChance = 45
   endif
    set Random = GetRandomInt (1, 100)
   if Random <= ParryChance then
    // Parry
    set FinalDmg = (FinalDmg - ((FinalDmg / 100) * 45))
    set text = CreateTextTagUnitBJ( ("|c005FFFFFПарир.!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    set Def = true
   endif
endif
    if GetUnitAbilityLevel(uTarg, 'A00G') == 2 and Def == false then
    // "If unit have shield equipped?"
    if B then
    // Block Define
    set BlockChance = udg_Block[GetPlayerId(GetOwningPlayer(uTarg))+1]
    else
    set BlockChance = GetUnitAbilityLevel(uTarg,'A00A') * 80
    endif
    set BlockChance = R2I ((BlockChance - Accuracy) * 0.1)
    if BlockChance <= 5 then
    set BlockChance = 5
    endif
    if BlockChance >= 50 then
    set BlockChance = 50
    endif
    set Random = GetRandomInt (1, 100)
    if Random <= BlockChance then
    // Block
    set FinalDmg = (FinalDmg - ((FinalDmg / 100) * 70))
    set text = CreateTextTagUnitBJ( ("|c0089ABFFБлок!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    set Def = true
    endif
    endif
    call UnitDamageTarget(uCaster, uTarg, I2R(FinalDmg), true, false, ATTACK_TYPE_CHAOS ,  DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
    // Final Damage To Unit
    if Critical <= CritChance and Text1 == false then
    // Hitnumber of Critical Strike
    set text = CreateTextTagUnitBJ( ("|c00FFFF00Крит!|r" + I2S(FinalDmg)), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    endif
    if Text1 ==  false then
    set text = CreateTextTagUnitBJ( I2S(FinalDmg), uTarg, 0, 10, 100.00, 20.00, 20.00, 0 )
    set Text1 = true
    endif
    call SetTextTagVelocityBJ( text, 64, ( GetUnitFacing(uCaster)) )
    call SetTextTagPermanentBJ( text, false )
    call SetTextTagLifespanBJ(text,2)
    call SetTextTagFadepointBJ(text,0.0)
    set text = null
    endfunction
Старый 13.04.2012, 19:52
DaeDR

offline
Опыт: 7,979
Активность:
Может тогда лучше через else сделать:
» Вот так
// Two-handed weapon dispersion (20%)
 if GetSpellAbilityId() == 'A000' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *20)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 20)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
 else
    // One-handed weapon dispersion (12%)
 if GetSpellAbilityId() == 'A002' then
    if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *12)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 12)
    endif
        set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
 else
    // Ranged weapon dispersion (17%)
    if GetSpellAbilityId() == 'A003' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *17)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 17)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
    endif
  endif
  endif
Старый 13.04.2012, 20:17
Hate
конь вакуумный
offline
Опыт: 43,030
Активность:
DaeDR:
Может тогда лучше через else сделать:
» Вот так
// Two-handed weapon dispersion (20%)
 if GetSpellAbilityId() == 'A000' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *20)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 20)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
 else
    // One-handed weapon dispersion (12%)
 if GetSpellAbilityId() == 'A002' then
    if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *12)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 12)
    endif
        set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
 else
    // Ranged weapon dispersion (17%)
    if GetSpellAbilityId() == 'A003' then
        if A then
        set Dispersion = ( (udg_PhysAttack[GetPlayerId(GetOwningPlayer(uCaster))+1] / 100) *17)
        else
        set Dispersion = (((GetUnitAbilityLevel(uCaster,'A00E') * 80) / 100) * 17)
        endif
     set FinalDispersion = GetRandomInt ((0 - Dispersion), (0 + Dispersion))
    endif
  endif
  endif
хм. думаю так наоборот можно запутаться нехило)
Старый 13.04.2012, 20:35
Suite
┌_____┐
offline
Опыт: 11,222
Активность:
Старый 13.04.2012, 20:39
Закрытая тема

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

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

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

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



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