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